Commit c8171e02 authored by Jeff Smith's avatar Jeff Smith Committed by Alexandre Julliard

gdiplus: Fix GdipCreateBitmapFromHICON bitmap data.

parent 9341798c
...@@ -1626,12 +1626,13 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap) ...@@ -1626,12 +1626,13 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap)
GpRect rect; GpRect rect;
BitmapData lockeddata; BitmapData lockeddata;
HDC screendc; HDC screendc;
BOOL has_alpha;
int x, y; int x, y;
BITMAPINFOHEADER bih; BITMAPINFOHEADER bih;
DWORD *src; DWORD *src;
BYTE *dst_row; BYTE *dst_row;
DWORD *dst; DWORD *dst;
BYTE *bits;
int mask_scanlines = 0, color_scanlines = 0;
TRACE("%p, %p\n", hicon, bitmap); TRACE("%p, %p\n", hicon, bitmap);
...@@ -1682,52 +1683,55 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap) ...@@ -1682,52 +1683,55 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHICON(HICON hicon, GpBitmap** bitmap)
bih.biClrUsed = 0; bih.biClrUsed = 0;
bih.biClrImportant = 0; bih.biClrImportant = 0;
screendc = CreateCompatibleDC(0); bits = heap_alloc(height * stride);
GetDIBits(screendc, iinfo.hbmColor, 0, height, lockeddata.Scan0, (BITMAPINFO*)&bih, DIB_RGB_COLORS); if (!bits)
if (bm.bmBitsPixel == 32)
{ {
has_alpha = FALSE; DeleteObject(iinfo.hbmColor);
DeleteObject(iinfo.hbmMask);
/* If any pixel has a non-zero alpha, ignore hbmMask */ GdipBitmapUnlockBits(*bitmap, &lockeddata);
src = (DWORD*)lockeddata.Scan0; GdipDisposeImage(&(*bitmap)->image);
for (y=0; y<height && !has_alpha; y++) return OutOfMemory;
for (x=0; x<width && !has_alpha; x++)
if ((*src++ & 0xff000000) != 0)
has_alpha = TRUE;
} }
else has_alpha = FALSE;
if (!has_alpha) screendc = CreateCompatibleDC(0);
if (screendc)
{ {
BYTE *bits = heap_alloc(height * stride); color_scanlines = GetDIBits(screendc, iinfo.hbmColor, 0, height, lockeddata.Scan0,
(BITMAPINFO*)&bih, DIB_RGB_COLORS);
/* read alpha data from the mask - the mask can safely be assumed to exist */ mask_scanlines = GetDIBits(screendc, iinfo.hbmMask, 0, height, bits,
GetDIBits(screendc, iinfo.hbmMask, 0, height, bits, (BITMAPINFO*)&bih, DIB_RGB_COLORS); (BITMAPINFO*)&bih, DIB_RGB_COLORS);
DeleteDC(screendc);
}
src = (DWORD*)bits; DeleteObject(iinfo.hbmColor);
dst_row = lockeddata.Scan0; DeleteObject(iinfo.hbmMask);
for (y=0; y<height; y++)
{
dst = (DWORD*)dst_row;
for (x=0; x<width; x++)
{
DWORD src_value = *src++;
if (src_value)
*dst++ = 0;
else
*dst++ |= 0xff000000;
}
dst_row += lockeddata.Stride;
}
if (!screendc || ((color_scanlines == 0 || mask_scanlines == 0) &&
GetLastError() == ERROR_INVALID_PARAMETER))
{
heap_free(bits); heap_free(bits);
GdipBitmapUnlockBits(*bitmap, &lockeddata);
GdipDisposeImage(&(*bitmap)->image);
return GenericError;
} }
DeleteDC(screendc); src = (DWORD*)bits;
dst_row = lockeddata.Scan0;
for (y=0; y<height; y++)
{
dst = (DWORD*)dst_row;
for (x=0; x<width; x++)
{
DWORD src_value = *src++;
if (src_value)
*dst++ = 0;
else
*dst++ |= 0xff000000;
}
dst_row += lockeddata.Stride;
}
DeleteObject(iinfo.hbmColor); heap_free(bits);
DeleteObject(iinfo.hbmMask);
GdipBitmapUnlockBits(*bitmap, &lockeddata); GdipBitmapUnlockBits(*bitmap, &lockeddata);
......
...@@ -120,7 +120,6 @@ static void expect_bitmap_locked_data(GpBitmap *bitmap, const BYTE *expect_bits, ...@@ -120,7 +120,6 @@ static void expect_bitmap_locked_data(GpBitmap *bitmap, const BYTE *expect_bits,
ok_(__FILE__, line)(lockeddata.Stride == stride, "Expected %d, got %d\n", stride, lockeddata.Stride); ok_(__FILE__, line)(lockeddata.Stride == stride, "Expected %d, got %d\n", stride, lockeddata.Stride);
ok_(__FILE__, line)(lockeddata.PixelFormat == PixelFormat32bppARGB, ok_(__FILE__, line)(lockeddata.PixelFormat == PixelFormat32bppARGB,
"Expected %d, got %d\n", PixelFormat32bppARGB, lockeddata.PixelFormat); "Expected %d, got %d\n", PixelFormat32bppARGB, lockeddata.PixelFormat);
todo_wine
ok_(__FILE__, line)(!memcmp(expect_bits, lockeddata.Scan0, lockeddata.Height * lockeddata.Stride), ok_(__FILE__, line)(!memcmp(expect_bits, lockeddata.Scan0, lockeddata.Height * lockeddata.Stride),
"data mismatch\n"); "data mismatch\n");
GdipBitmapUnlockBits(bitmap, &lockeddata); GdipBitmapUnlockBits(bitmap, &lockeddata);
......
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