Huw Davies : gdi32: Construct the EGA palette from the default palette.

Alexandre Julliard julliard at winehq.org
Tue Jun 28 17:25:14 CDT 2011


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Jun 28 13:16:55 2011 +0100

gdi32: Construct the EGA palette from the default palette.

---

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

diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 962a1aa..3268086 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -415,32 +415,6 @@ UINT WINAPI GetDIBColorTable( HDC hdc, UINT startpos, UINT entries, RGBQUAD *col
     return result;
 }
 
-/* FIXME the following two structs should be combined with __sysPalTemplate in
-   objects/color.c - this should happen after de-X11-ing both of these
-   files.
-   NB. RGBQUAD and PALETTEENTRY have different orderings of red, green
-   and blue - sigh */
-
-static const RGBQUAD EGAColorsQuads[16] = {
-/* rgbBlue, rgbGreen, rgbRed, rgbReserved */
-    { 0x00, 0x00, 0x00, 0x00 },
-    { 0x00, 0x00, 0x80, 0x00 },
-    { 0x00, 0x80, 0x00, 0x00 },
-    { 0x00, 0x80, 0x80, 0x00 },
-    { 0x80, 0x00, 0x00, 0x00 },
-    { 0x80, 0x00, 0x80, 0x00 },
-    { 0x80, 0x80, 0x00, 0x00 },
-    { 0x80, 0x80, 0x80, 0x00 },
-    { 0xc0, 0xc0, 0xc0, 0x00 },
-    { 0x00, 0x00, 0xff, 0x00 },
-    { 0x00, 0xff, 0x00, 0x00 },
-    { 0x00, 0xff, 0xff, 0x00 },
-    { 0xff, 0x00, 0x00, 0x00 },
-    { 0xff, 0x00, 0xff, 0x00 },
-    { 0xff, 0xff, 0x00, 0x00 },
-    { 0xff, 0xff, 0xff, 0x00 }
-};
-
 static const RGBQUAD DefLogPaletteQuads[20] = { /* Copy of Default Logical Palette */
 /* rgbBlue, rgbGreen, rgbRed, rgbReserved */
     { 0x00, 0x00, 0x00, 0x00 },
@@ -635,7 +609,12 @@ INT WINAPI GetDIBits(
                 break;
 
             case 4:
-                memcpy(rgbQuads, EGAColorsQuads, sizeof(EGAColorsQuads));
+                /* The EGA palette is the first and last 8 colours of the default palette
+                   with the innermost pair swapped */
+                memcpy(rgbQuads,     DefLogPaletteQuads,      7 * sizeof(RGBQUAD));
+                memcpy(rgbQuads + 7, DefLogPaletteQuads + 12, 1 * sizeof(RGBQUAD));
+                memcpy(rgbQuads + 8, DefLogPaletteQuads +  7, 1 * sizeof(RGBQUAD));
+                memcpy(rgbQuads + 9, DefLogPaletteQuads + 13, 7 * sizeof(RGBQUAD));
                 break;
 
             case 8:
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index e107d7b..241ce89 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -1534,7 +1534,7 @@ static void test_GetDIBits(void)
     BYTE buf[1024];
     char bi_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256];
     BITMAPINFO *bi = (BITMAPINFO *)bi_buf;
-    PALETTEENTRY pal_ents[32];
+    PALETTEENTRY pal_ents[20];
 
     hdc = GetDC(0);
 
@@ -1723,6 +1723,44 @@ todo_wine
     for (i = 2; i < 256; i++)
         ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[i]);
 
+    /* retrieve 4-bit DIB data */
+    memset(bi, 0, sizeof(*bi));
+    bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    bi->bmiHeader.biWidth = bm.bmWidth;
+    bi->bmiHeader.biHeight = bm.bmHeight;
+    bi->bmiHeader.biPlanes = 1;
+    bi->bmiHeader.biBitCount = 4;
+    bi->bmiHeader.biCompression = BI_RGB;
+    bi->bmiHeader.biSizeImage = 0;
+    memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256);
+    memset(buf, 0xAA, sizeof(buf));
+    SetLastError(0xdeadbeef);
+    lines = GetDIBits(hdc, hbmp, 0, bm.bmHeight, buf, bi, DIB_RGB_COLORS);
+    ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n",
+       lines, bm.bmHeight, GetLastError());
+
+    GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, pal_ents );
+
+    for (i = 0; i < 16; i++)
+    {
+        RGBQUAD expect;
+        int entry = i < 8 ? i : i + 4;
+
+        if(entry == 7) entry = 12;
+        else if(entry == 12) entry = 7;
+
+        expect.rgbRed   = pal_ents[entry].peRed;
+        expect.rgbGreen = pal_ents[entry].peGreen;
+        expect.rgbBlue  = pal_ents[entry].peBlue;
+        expect.rgbReserved = 0;
+
+        ok(!memcmp(bi->bmiColors + i, &expect, sizeof(expect)),
+           "expected bmiColors[%d] %x %x %x %x - got %x %x %x %x\n", i,
+           expect.rgbRed, expect.rgbGreen, expect.rgbBlue, expect.rgbReserved,
+           bi->bmiColors[i].rgbRed, bi->bmiColors[i].rgbGreen,
+           bi->bmiColors[i].rgbBlue, bi->bmiColors[i].rgbReserved);
+    }
+
     /* retrieve 8-bit DIB data */
     memset(bi, 0, sizeof(*bi));
     bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
@@ -1739,7 +1777,7 @@ todo_wine
     ok(lines == bm.bmHeight, "GetDIBits copied %d lines of %d, error %u\n",
        lines, bm.bmHeight, GetLastError());
 
-    GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 32, pal_ents );
+    GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, pal_ents );
 
     for (i = 0; i < 256; i++)
     {




More information about the wine-cvs mailing list