From 506f3bf53df421e453549127c74f1af98ddfde56 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 27 Jan 2020 12:13:48 +0800 Subject: [PATCH] gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP. Signed-off-by: Dmitry Timoshkov Signed-off-by: Vincent Povirk Signed-off-by: Alexandre Julliard --- dlls/gdiplus/image.c | 47 ++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index bfa0c8afa76..9fa2aaee955 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1381,50 +1381,29 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* info, VOID *bits, GpBitmap **bitmap) { DWORD height, stride; - PixelFormat format; + HBITMAP hbm; + void *bmbits; + GpStatus status; - FIXME("(%p, %p, %p) - partially implemented\n", info, bits, bitmap); + TRACE("(%p, %p, %p)\n", info, bits, bitmap); if (!info || !bits || !bitmap) return InvalidParameter; + hbm = CreateDIBSection(0, info, DIB_RGB_COLORS, &bmbits, NULL, 0); + if (!hbm) + return InvalidParameter; + height = abs(info->bmiHeader.biHeight); stride = ((info->bmiHeader.biWidth * info->bmiHeader.biBitCount + 31) >> 3) & ~3; + TRACE("height %u, stride %u, image size %u\n", height, stride, height * stride); - if(info->bmiHeader.biHeight > 0) /* bottom-up */ - { - bits = (BYTE*)bits + (height - 1) * stride; - stride = -stride; - } + memcpy(bmbits, bits, height * stride); - switch(info->bmiHeader.biBitCount) { - case 1: - format = PixelFormat1bppIndexed; - break; - case 4: - format = PixelFormat4bppIndexed; - break; - case 8: - format = PixelFormat8bppIndexed; - break; - case 16: - format = PixelFormat16bppRGB555; - break; - case 24: - format = PixelFormat24bppRGB; - break; - case 32: - format = PixelFormat32bppRGB; - break; - default: - FIXME("don't know how to handle %d bpp\n", info->bmiHeader.biBitCount); - *bitmap = NULL; - return InvalidParameter; - } - - return GdipCreateBitmapFromScan0(info->bmiHeader.biWidth, height, stride, format, - bits, bitmap); + status = GdipCreateBitmapFromHBITMAP(hbm, NULL, bitmap); + DeleteObject(hbm); + return status; } /* FIXME: no icm */