Dmitry Timoshkov : gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.

Alexandre Julliard julliard at winehq.org
Tue Jun 2 08:11:15 CDT 2020


Module: wine
Branch: stable
Commit: fb1f78d982110e267b91b050167cbcfc196791b8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fb1f78d982110e267b91b050167cbcfc196791b8

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Jan 27 12:13:48 2020 +0800

gdiplus: Reimplement GdipCreateBitmapFromGdiDib by using GdipCreateBitmapFromHBITMAP.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 506f3bf53df421e453549127c74f1af98ddfde56)
Signed-off-by: Michael Stefaniuc <mstefani at 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 */




More information about the wine-cvs mailing list