diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 7fb76b047dc..e65182fb08b 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -447,11 +447,69 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromResource(HINSTANCE hInstance, GpStatus WINGDIPAPI GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap, HBITMAP* hbmReturn, ARGB background) { - FIXME("stub\n"); + GpStatus stat; + HBITMAP result, oldbitmap; + UINT width, height; + HDC hdc; + GpGraphics *graphics; + BITMAPINFOHEADER bih; + void *bits; + TRACE("(%p,%p,%x)\n", bitmap, hbmReturn, background); - if (hbmReturn) *hbmReturn = NULL; + if (!bitmap || !hbmReturn) return InvalidParameter; - return NotImplemented; + GdipGetImageWidth((GpImage*)bitmap, &width); + GdipGetImageHeight((GpImage*)bitmap, &height); + + bih.biSize = sizeof(bih); + bih.biWidth = width; + bih.biHeight = height; + bih.biPlanes = 1; + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biSizeImage = 0; + bih.biXPelsPerMeter = 0; + bih.biYPelsPerMeter = 0; + bih.biClrUsed = 0; + bih.biClrImportant = 0; + + hdc = CreateCompatibleDC(NULL); + if (!hdc) return GenericError; + + result = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &bits, + NULL, 0); + + if (result) + { + oldbitmap = SelectObject(hdc, result); + + stat = GdipCreateFromHDC(hdc, &graphics); + if (stat == Ok) + { + stat = GdipGraphicsClear(graphics, background); + + if (stat == Ok) + stat = GdipDrawImage(graphics, (GpImage*)bitmap, 0, 0); + + GdipDeleteGraphics(graphics); + } + + SelectObject(hdc, oldbitmap); + } + else + stat = GenericError; + + DeleteDC(hdc); + + if (stat != Ok && result) + { + DeleteObject(result); + result = NULL; + } + + *hbmReturn = result; + + return stat; } GpStatus WINGDIPAPI GdipConvertToEmfPlus(const GpGraphics* ref, diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index d566c360d7d..e624e533bc8 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -760,14 +760,14 @@ static void test_createhbitmap(void) /* test NULL values */ stat = GdipCreateHBITMAPFromBitmap(NULL, &hbitmap, 0); - todo_wine expect(InvalidParameter, stat); + expect(InvalidParameter, stat); stat = GdipCreateHBITMAPFromBitmap(bitmap, NULL, 0); - todo_wine expect(InvalidParameter, stat); + expect(InvalidParameter, stat); /* create HBITMAP */ stat = GdipCreateHBITMAPFromBitmap(bitmap, &hbitmap, 0); - todo_wine expect(Ok, stat); + expect(Ok, stat); if (stat == Ok) {