Commit 08c1e6cd authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

gdiplus: Do not access Bitmap bits when drawing transparent pixels.

parent b22102df
...@@ -365,8 +365,12 @@ static GpStatus alpha_blend_bmp_pixels(GpGraphics *graphics, INT dst_x, INT dst_ ...@@ -365,8 +365,12 @@ static GpStatus alpha_blend_bmp_pixels(GpGraphics *graphics, INT dst_x, INT dst_
for (y=0; y<src_height; y++) for (y=0; y<src_height; y++)
{ {
ARGB dst_color, src_color; ARGB dst_color, src_color;
GdipBitmapGetPixel(dst_bitmap, x+dst_x, y+dst_y, &dst_color);
src_color = ((ARGB*)(src + src_stride * y))[x]; src_color = ((ARGB*)(src + src_stride * y))[x];
if (!(src_color & 0xff000000))
continue;
GdipBitmapGetPixel(dst_bitmap, x+dst_x, y+dst_y, &dst_color);
GdipBitmapSetPixel(dst_bitmap, x+dst_x, y+dst_y, color_over(dst_color, src_color)); GdipBitmapSetPixel(dst_bitmap, x+dst_x, y+dst_y, color_over(dst_color, src_color));
} }
} }
......
...@@ -2417,6 +2417,27 @@ static void test_fromMemoryBitmap(void) ...@@ -2417,6 +2417,27 @@ static void test_fromMemoryBitmap(void)
GdipDeleteGraphics(graphics); GdipDeleteGraphics(graphics);
GdipDisposeImage((GpImage*)bitmap); GdipDisposeImage((GpImage*)bitmap);
/* If we don't draw to the HDC, the bits are never accessed */
status = GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB, (BYTE*)1, &bitmap);
expect(Ok, status);
status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
expect(Ok, status);
status = GdipGetDC(graphics, &hdc);
expect(Ok, status);
ok(hdc != NULL, "got NULL hdc\n");
color = GetPixel(hdc, 0, 0);
todo_wine expect(0x0c0b0d, color);
status = GdipReleaseDC(graphics, hdc);
expect(Ok, status);
GdipDeleteGraphics(graphics);
GdipDisposeImage((GpImage*)bitmap);
} }
static void test_GdipIsVisiblePoint(void) static void test_GdipIsVisiblePoint(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment