Michael Karcher : gdi32: Respect DIB_PAL_COLORS in every case.

Alexandre Julliard julliard at winehq.org
Mon Jun 9 07:13:01 CDT 2008


Module: wine
Branch: master
Commit: 5333923253819ecf8dbbf7aaeec412c300b8a4ec
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5333923253819ecf8dbbf7aaeec412c300b8a4ec

Author: Michael Karcher <wine at mkarcher.dialup.fu-berlin.de>
Date:   Sun Jun  8 01:44:10 2008 +0200

gdi32: Respect DIB_PAL_COLORS in every case.

---

 dlls/gdi32/dib.c          |   33 +++++++++++++++++----------------
 dlls/gdi32/tests/bitmap.c |   42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index ffd6f31..46be0f0 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -701,7 +701,11 @@ INT WINAPI GetDIBits(
             }
         }
         else {
-            if(bpp >= bmp->bitmap.bmBitsPixel) {
+            if (coloruse == DIB_PAL_COLORS) {
+                for (i = 0; i < (1 << bpp); i++)
+                    ((WORD *)colorPtr)[i] = (WORD)i;
+            }
+            else if(bpp >= bmp->bitmap.bmBitsPixel) {
                 /* Generate the color map from the selected palette */
                 PALETTEENTRY palEntry[256];
 
@@ -713,22 +717,19 @@ INT WINAPI GetDIBits(
                     return 0;
                 }
                 for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++) {
-                    if (coloruse == DIB_RGB_COLORS) {
-                        if (core_header)
-                        {
-                            rgbTriples[i].rgbtRed   = palEntry[i].peRed;
-                            rgbTriples[i].rgbtGreen = palEntry[i].peGreen;
-                            rgbTriples[i].rgbtBlue  = palEntry[i].peBlue;
-                        }
-                        else
-                        {
-                            rgbQuads[i].rgbRed      = palEntry[i].peRed;
-                            rgbQuads[i].rgbGreen    = palEntry[i].peGreen;
-                            rgbQuads[i].rgbBlue     = palEntry[i].peBlue;
-                            rgbQuads[i].rgbReserved = 0;
-                        }
+                    if (core_header)
+                    {
+                        rgbTriples[i].rgbtRed   = palEntry[i].peRed;
+                        rgbTriples[i].rgbtGreen = palEntry[i].peGreen;
+                        rgbTriples[i].rgbtBlue  = palEntry[i].peBlue;
+                    }
+                    else
+                    {
+                        rgbQuads[i].rgbRed      = palEntry[i].peRed;
+                        rgbQuads[i].rgbGreen    = palEntry[i].peGreen;
+                        rgbQuads[i].rgbBlue     = palEntry[i].peBlue;
+                        rgbQuads[i].rgbReserved = 0;
                     }
-                    else ((WORD *)colorPtr)[i] = (WORD)i;
                 }
             } else {
                 switch (bpp) {
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 05f57e6..79f6003 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -1315,6 +1315,28 @@ static void test_GetDIBits_selected_DDB(BOOL monochrome)
     }
     ok(equalContents, "GetDIBits with DDB selected in DC: Got different DIB bits\n");
 
+    /* Test the palette */
+    equalContents = TRUE;
+    if (info2->bmiHeader.biBitCount <= 8)
+    {
+        WORD *colors = (WORD*)info2->bmiColors;
+
+        /* Get the palette indices */
+        res = GetDIBits(dc, ddb, 0, 0, NULL, info2, DIB_PAL_COLORS);
+        ok(res, "GetDIBits failed\n");
+
+        for (i=0;i < 1 << info->bmiHeader.biSizeImage; i++)
+        {
+            if (colors[i] != i)
+            {
+                equalContents = FALSE;
+                break;
+            }
+        }
+    }
+
+    ok(equalContents, "GetDIBits with DDB selected in DC: non 1:1 palette indices\n");
+
     HeapFree(GetProcessHeap(), 0, bits2);
     HeapFree(GetProcessHeap(), 0, bits);
     DeleteDC(dc);
@@ -1496,6 +1518,16 @@ todo_wine
 todo_wine
     ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n");
 
+    /* Test the palette indices */
+    memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256);
+    SetLastError(0xdeadbeef);
+    lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS);
+
+    ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]);
+    ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]);
+    for (i = 2; i < 256; i++)
+        ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[1]);
+
     /* retrieve 24-bit DIB data */
     memset(bi, 0, sizeof(*bi));
     bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
@@ -1596,6 +1628,16 @@ todo_wine
 todo_wine
     ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n");
 
+    /* Test the palette indices */
+    memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256);
+    SetLastError(0xdeadbeef);
+    lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS);
+
+    ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]);
+    ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]);
+    for (i = 2; i < 256; i++)
+        ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[i]);
+
     /* retrieve 24-bit DIB data */
     memset(bi, 0, sizeof(*bi));
     bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);




More information about the wine-cvs mailing list