From b58276af4dad993bdac52b979da2d8d9baa1ea8b Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 14 Feb 2017 10:24:47 +0100 Subject: [PATCH] gdiplus: Reimplement GdipCreateHBITMAPFromBitmap so it can work on locked bitmaps. Signed-off-by: Piotr Caban Signed-off-by: Vincent Povirk Signed-off-by: Alexandre Julliard --- dlls/gdiplus/image.c | 53 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index dd01f7755b8..07609ac15c0 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1477,10 +1477,12 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, UINT width, height; BITMAPINFOHEADER bih; LPBYTE bits; - BitmapData lockeddata; + BOOL unlock; + TRACE("(%p,%p,%x)\n", bitmap, hbmReturn, background); if (!bitmap || !hbmReturn) return InvalidParameter; + if (!image_lock(&bitmap->image, &unlock)) return ObjectBusy; GdipGetImageWidth(&bitmap->image, &width); GdipGetImageHeight(&bitmap->image, &height); @@ -1498,41 +1500,36 @@ GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, bih.biClrImportant = 0; result = CreateDIBSection(0, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&bits, NULL, 0); - - if (result) + if (!result) { - lockeddata.Stride = -width * 4; - lockeddata.Scan0 = bits + (width * 4 * (height - 1)); - - 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); - } - } + image_unlock(&bitmap->image, unlock); + return GenericError; } - 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); - 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, -- 2.11.4.GIT