Commit b58276af authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

gdiplus: Reimplement GdipCreateHBITMAPFromBitmap so it can work on locked bitmaps.

parent 5673d82b
...@@ -1477,10 +1477,12 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, ...@@ -1477,10 +1477,12 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
UINT width, height; UINT width, height;
BITMAPINFOHEADER bih; BITMAPINFOHEADER bih;
LPBYTE bits; LPBYTE bits;
BitmapData lockeddata; BOOL unlock;
TRACE("(%p,%p,%x)\n", bitmap, hbmReturn, background); TRACE("(%p,%p,%x)\n", bitmap, hbmReturn, background);
if (!bitmap || !hbmReturn) return InvalidParameter; if (!bitmap || !hbmReturn) return InvalidParameter;
if (!image_lock(&bitmap->image, &unlock)) return ObjectBusy;
GdipGetImageWidth(&bitmap->image, &width); GdipGetImageWidth(&bitmap->image, &width);
GdipGetImageHeight(&bitmap->image, &height); GdipGetImageHeight(&bitmap->image, &height);
...@@ -1498,41 +1500,36 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, ...@@ -1498,41 +1500,36 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
bih.biClrImportant = 0; bih.biClrImportant = 0;
result = CreateDIBSection(0, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&bits, NULL, 0); result = CreateDIBSection(0, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
if (!result)
if (result)
{ {
lockeddata.Stride = -width * 4; image_unlock(&bitmap->image, unlock);
lockeddata.Scan0 = bits + (width * 4 * (height - 1)); return GenericError;
stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead|ImageLockModeUserInputBuf,
PixelFormat32bppPARGB, &lockeddata);
if (stat == Ok)
stat = GdipBitmapUnlockBits(bitmap, &lockeddata);
if (stat == Ok && (background & 0xffffff))
{
DWORD *ptr;
UINT i;
for (ptr = (DWORD*)bits, i = 0; i < width * height; ptr++, i++)
{
if ((*ptr & 0xff000000) == 0xff000000) continue;
*ptr = blend_argb_no_bkgnd_alpha(*ptr, background);
}
}
} }
else
stat = GenericError;
if (stat != Ok && result) stat = convert_pixels(width, height, -width*4,
bits + (width * 4 * (height - 1)), PixelFormat32bppPARGB,
bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette);
if (stat != Ok)
{ {
DeleteObject(result); DeleteObject(result);
result = NULL; image_unlock(&bitmap->image, unlock);
return stat;
} }
*hbmReturn = result; if (background & 0xffffff)
{
DWORD *ptr;
UINT i;
for (ptr = (DWORD*)bits, i = 0; i < width * height; ptr++, i++)
{
if ((*ptr & 0xff000000) == 0xff000000) continue;
*ptr = blend_argb_no_bkgnd_alpha(*ptr, background);
}
}
return stat; *hbmReturn = result;
image_unlock(&bitmap->image, unlock);
return Ok;
} }
GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT width, INT height, GpStatus WINGDIPAPI GdipCreateBitmapFromGraphics(INT width, INT height,
......
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