Today, the image_unlock() helper function has a data race due to
non-atomic write to GpImage's 'busy' flag which is accessible by other
threads. Also, it lacks a release fence, which means that other threads
can observe the unlocked (busy = 0) state too early when the current
thread unlocks the image; specifically, the write to the 'busy' field of
the GpImage can be reordered before the last read/write to any other
fields of the same GpImage.
Fix this by replacing the 'busy' field of GpImage with SRWLOCK.
The 'busy' field in GpImage is used as an atomic variable. The C11
standard (§5.1.2.4, paragraph 25) states that two conflicting actions to
a memory location shall be both atomic operations, or otherwise properly
synchronized; otherwise, it constitutes a data race.
However, select_frame_wic() performs a non-atomic access to the 'busy'
field on a GpImage that is potentially accessible by other threads.
This happens when select_frame_wic() copies new_image to the old image
object. Although it does attempt to preserve the value of the 'busy'
field by setting new_image->busy = image->busy first, thereby
effectively assigning an identical value to the field, it is unclear
that this does not actually constitute a theoretical, if not practical,
data race. This also prevents replacing the busy flag with a mutex or
other synchronization primitives.
Therefore, skip the 'busy' field when copying fields from the new image
to the original image object.
GdipImageRotateFlip() calls GdipBitmapLockBits() while holding the image
lock, resulting in a recursive lock.
Since GdipImageRotateFlip() uses GdipBitmapLockBits() only to obtain
Scan0 and Stride, replace them with equivalent fields from GpBitmap
itself.
don't pretend using a BITMAPINFO when only a BITMAPINFOHEADER is used
Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This speeds up the encoding process, sometimes at the cost of increased
PNG file sizes. PNGs created using gdiplus on Windows 10 have filters
disabled, too, according to pngcheck.
The application "ZusiDisplay" encodes finished frames in PNG format and
sends them through a named pipe for "Zusi 3" to use as an in-game
texture, so performance matters for that use case to improve "embedded
display" FPS.
Signed-off-by: Florian Will <florian.will@gmail.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Make it possible to define a destination colour palette when
using convert_pixels(), so converting a bitmap from a non
indexed format to an indexed format does not produce an empty image.
Signed-off-by: Bernhard Kölbl <besentv@gmail.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This is done even if the emf contains a previous EMR_SETSTRETCHBLTMODE
record.
Thanks to Sebastián Aedo for some of the testing.
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
When "MS Shell Dlg" is missing GdipCreateFontFamilyFromName() leaves
the GpFontFamily* pointer uninitialised. So initialize it to NULL in
order to get clean failures instead of a crash.
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
It used to crash on Windows XP and Vista but does not since Windows 7.
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
Symbols such as ← should also be displayed.
Signed-off-by: Haoyang Chen <chenhaoyang@uniontech.com>
Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>