Dmitry Timoshkov : gdiplus: GdipCreateBitmapFromHBITMAP should use palette from the GDI bitmap.

Alexandre Julliard julliard at winehq.org
Mon Jan 27 15:00:26 CST 2020


Module: wine
Branch: master
Commit: 619ef41f3365b90cb14abd9e02f3ffffb157601f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=619ef41f3365b90cb14abd9e02f3ffffb157601f

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

gdiplus: GdipCreateBitmapFromHBITMAP should use palette from the GDI bitmap.

This patch fixes painting bitmaps with bpp <= 8.

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>

---

 dlls/gdiplus/image.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 354801348e..bfa0c8afa7 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -5106,6 +5106,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
     GpStatus retval;
     PixelFormat format;
     BitmapData lockeddata;
+    char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
+    BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf;
 
     TRACE("%p %p %p\n", hbm, hpal, bitmap);
 
@@ -5155,8 +5157,6 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
         if (retval == Ok)
         {
             HDC hdc;
-            char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
-            BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf;
             INT src_height;
 
             hdc = CreateCompatibleDC(NULL);
@@ -5176,29 +5176,28 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
             GdipBitmapUnlockBits(*bitmap, &lockeddata);
         }
 
-        if (retval == Ok && hpal)
+        /* According to the tests hpal is ignored */
+        if (retval == Ok && pbmi->bmiHeader.biBitCount <= 8)
         {
-            PALETTEENTRY entry[256];
-            ColorPalette *palette=NULL;
+            ColorPalette *palette;
             int i, num_palette_entries;
 
-            num_palette_entries = GetPaletteEntries(hpal, 0, 256, entry);
+            num_palette_entries = pbmi->bmiHeader.biClrUsed;
             if (!num_palette_entries)
-                retval = GenericError;
+                num_palette_entries = 1 << pbmi->bmiHeader.biBitCount;
 
             palette = heap_alloc_zero(sizeof(ColorPalette) + sizeof(ARGB) * (num_palette_entries-1));
             if (!palette)
                 retval = OutOfMemory;
-
-            if (retval == Ok)
+            else
             {
                 palette->Flags = 0;
                 palette->Count = num_palette_entries;
 
                 for (i=0; i<num_palette_entries; i++)
                 {
-                    palette->Entries[i] = 0xff000000 | entry[i].peRed << 16 |
-                                          entry[i].peGreen << 8 | entry[i].peBlue;
+                    palette->Entries[i] = 0xff000000 | pbmi->bmiColors[i].rgbRed << 16 |
+                                          pbmi->bmiColors[i].rgbGreen << 8 | pbmi->bmiColors[i].rgbBlue;
                 }
 
                 retval = GdipSetImagePalette(&(*bitmap)->image, palette);




More information about the wine-cvs mailing list