Module: wine Branch: stable Commit: fb1f78d982110e267b91b050167cbcfc196791b8 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fb1f78d982110e267b91b0501...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Mon Jan 27 12:13:48 2020 +0800
gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 506f3bf53df421e453549127c74f1af98ddfde56) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
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 354801348e..d5af5869ec 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 */