Alexandre Julliard : gdi32: Use the default DIB color table to create system and halftone palettes.

Alexandre Julliard julliard at winehq.org
Mon Dec 12 12:25:54 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Dec 12 11:16:59 2011 +0100

gdi32: Use the default DIB color table to create system and halftone palettes.

---

 dlls/gdi32/palette.c       |  151 +++++++++-----------------------------------
 dlls/gdi32/tests/palette.c |   39 +++++++++++
 2 files changed, 70 insertions(+), 120 deletions(-)

diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index f172897..338d860 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -72,40 +72,6 @@ static UINT SystemPaletteUse = SYSPAL_STATIC;  /* currently not considered */
 static HPALETTE hPrimaryPalette = 0; /* used for WM_PALETTECHANGED */
 static HPALETTE hLastRealizedPalette = 0; /* UnrealizeObject() needs it */
 
-#define NB_RESERVED_COLORS  20   /* number of fixed colors in system palette */
-
-static const PALETTEENTRY sys_pal_template[NB_RESERVED_COLORS] =
-{
-    /* first 10 entries in the system palette */
-    /* red  green blue  flags */
-    { 0x00, 0x00, 0x00, 0 },
-    { 0x80, 0x00, 0x00, 0 },
-    { 0x00, 0x80, 0x00, 0 },
-    { 0x80, 0x80, 0x00, 0 },
-    { 0x00, 0x00, 0x80, 0 },
-    { 0x80, 0x00, 0x80, 0 },
-    { 0x00, 0x80, 0x80, 0 },
-    { 0xc0, 0xc0, 0xc0, 0 },
-    { 0xc0, 0xdc, 0xc0, 0 },
-    { 0xa6, 0xca, 0xf0, 0 },
-
-    /* ... c_min/2 dynamic colorcells */
-
-    /* ... gap (for sparse palettes) */
-
-    /* ... c_min/2 dynamic colorcells */
-
-    { 0xff, 0xfb, 0xf0, 0 },
-    { 0xa0, 0xa0, 0xa4, 0 },
-    { 0x80, 0x80, 0x80, 0 },
-    { 0xff, 0x00, 0x00, 0 },
-    { 0x00, 0xff, 0x00, 0 },
-    { 0xff, 0xff, 0x00, 0 },
-    { 0x00, 0x00, 0xff, 0 },
-    { 0xff, 0x00, 0xff, 0 },
-    { 0x00, 0xff, 0xff, 0 },
-    { 0xff, 0xff, 0xff, 0 }     /* last 10 */
-};
 
 /***********************************************************************
  *           PALETTE_Init
@@ -114,21 +80,30 @@ static const PALETTEENTRY sys_pal_template[NB_RESERVED_COLORS] =
  */
 HPALETTE PALETTE_Init(void)
 {
-    HPALETTE          hpalette;
-    LOGPALETTE *        palPtr;
+    const RGBQUAD *entries = get_default_color_table( 8 );
+    char buffer[FIELD_OFFSET( LOGPALETTE, palPalEntry[20] )];
+    LOGPALETTE *palPtr = (LOGPALETTE *)buffer;
+    int i;
 
     /* create default palette (20 system colors) */
 
-    palPtr = HeapAlloc( GetProcessHeap(), 0,
-             sizeof(LOGPALETTE) + (NB_RESERVED_COLORS-1)*sizeof(PALETTEENTRY));
-    if (!palPtr) return FALSE;
-
     palPtr->palVersion = 0x300;
-    palPtr->palNumEntries = NB_RESERVED_COLORS;
-    memcpy( palPtr->palPalEntry, sys_pal_template, sizeof(sys_pal_template) );
-    hpalette = CreatePalette( palPtr );
-    HeapFree( GetProcessHeap(), 0, palPtr );
-    return hpalette;
+    palPtr->palNumEntries = 20;
+    for (i = 0; i < 10; i++)
+    {
+        palPtr->palPalEntry[i].peRed   = entries[i].rgbRed;
+        palPtr->palPalEntry[i].peGreen = entries[i].rgbGreen;
+        palPtr->palPalEntry[i].peBlue  = entries[i].rgbBlue;
+        palPtr->palPalEntry[i].peFlags = 0;
+    }
+    for (i = 10; i < 20; i++)
+    {
+        palPtr->palPalEntry[i].peRed   = entries[236 + i].rgbRed;
+        palPtr->palPalEntry[i].peGreen = entries[236 + i].rgbGreen;
+        palPtr->palPalEntry[i].peBlue  = entries[236 + i].rgbBlue;
+        palPtr->palPalEntry[i].peFlags = 0;
+    }
+    return CreatePalette( palPtr );
 }
 
 
@@ -151,8 +126,6 @@ HPALETTE WINAPI CreatePalette(
     if (!palette) return 0;
     TRACE("entries=%i\n", palette->palNumEntries);
 
-    size = sizeof(LOGPALETTE) + (palette->palNumEntries - 1) * sizeof(PALETTEENTRY);
-
     if (!(palettePtr = HeapAlloc( GetProcessHeap(), 0, sizeof(*palettePtr) ))) return 0;
     palettePtr->unrealize = NULL;
     palettePtr->version = palette->palVersion;
@@ -191,83 +164,21 @@ HPALETTE WINAPI CreatePalette(
 HPALETTE WINAPI CreateHalftonePalette(
     HDC hdc) /* [in] Handle to device context */
 {
+    const RGBQUAD *entries = get_default_color_table( 8 );
+    char buffer[FIELD_OFFSET( LOGPALETTE, palPalEntry[256] )];
+    LOGPALETTE *pal = (LOGPALETTE *)buffer;
     int i;
-    struct {
-	WORD Version;
-	WORD NumberOfEntries;
-	PALETTEENTRY aEntries[256];
-    } Palette;
-
-    Palette.Version = 0x300;
-    Palette.NumberOfEntries = 256;
-    GetSystemPaletteEntries(hdc, 0, 256, Palette.aEntries);
-
-    Palette.NumberOfEntries = 20;
 
-    for (i = 0; i < Palette.NumberOfEntries; i++)
+    pal->palVersion = 0x300;
+    pal->palNumEntries = 256;
+    for (i = 0; i < 256; i++)
     {
-        Palette.aEntries[i].peRed=0xff;
-        Palette.aEntries[i].peGreen=0xff;
-        Palette.aEntries[i].peBlue=0xff;
-        Palette.aEntries[i].peFlags=0x00;
+        pal->palPalEntry[i].peRed   = entries[i].rgbRed;
+        pal->palPalEntry[i].peGreen = entries[i].rgbGreen;
+        pal->palPalEntry[i].peBlue  = entries[i].rgbBlue;
+        pal->palPalEntry[i].peFlags = 0;
     }
-
-    Palette.aEntries[0].peRed=0x00;
-    Palette.aEntries[0].peBlue=0x00;
-    Palette.aEntries[0].peGreen=0x00;
-
-    /* the first 6 */
-    for (i=1; i <= 6; i++)
-    {
-        Palette.aEntries[i].peRed=(i%2)?0x80:0;
-        Palette.aEntries[i].peGreen=(i==2)?0x80:(i==3)?0x80:(i==6)?0x80:0;
-        Palette.aEntries[i].peBlue=(i>3)?0x80:0;
-    }
-
-    for (i=7;  i <= 12; i++)
-    {
-        switch(i)
-        {
-            case 7:
-                Palette.aEntries[i].peRed=0xc0;
-                Palette.aEntries[i].peBlue=0xc0;
-                Palette.aEntries[i].peGreen=0xc0;
-                break;
-            case 8:
-                Palette.aEntries[i].peRed=0xc0;
-                Palette.aEntries[i].peGreen=0xdc;
-                Palette.aEntries[i].peBlue=0xc0;
-                break;
-            case 9:
-                Palette.aEntries[i].peRed=0xa6;
-                Palette.aEntries[i].peGreen=0xca;
-                Palette.aEntries[i].peBlue=0xf0;
-                break;
-            case 10:
-                Palette.aEntries[i].peRed=0xff;
-                Palette.aEntries[i].peGreen=0xfb;
-                Palette.aEntries[i].peBlue=0xf0;
-                break;
-            case 11:
-                Palette.aEntries[i].peRed=0xa0;
-                Palette.aEntries[i].peGreen=0xa0;
-                Palette.aEntries[i].peBlue=0xa4;
-                break;
-            case 12:
-                Palette.aEntries[i].peRed=0x80;
-                Palette.aEntries[i].peGreen=0x80;
-                Palette.aEntries[i].peBlue=0x80;
-        }
-    }
-
-   for (i=13; i <= 18; i++)
-    {
-        Palette.aEntries[i].peRed=(i%2)?0xff:0;
-        Palette.aEntries[i].peGreen=(i==14)?0xff:(i==15)?0xff:(i==18)?0xff:0;
-        Palette.aEntries[i].peBlue=(i>15)?0xff:0x00;
-    }
-
-    return CreatePalette((LOGPALETTE *)&Palette);
+    return CreatePalette( pal );
 }
 
 
diff --git a/dlls/gdi32/tests/palette.c b/dlls/gdi32/tests/palette.c
index 039be59..4f14d7a 100644
--- a/dlls/gdi32/tests/palette.c
+++ b/dlls/gdi32/tests/palette.c
@@ -144,8 +144,47 @@ static void test_palette_entries(void)
     ok( palEntry.peFlags == getEntryResult.peFlags, "palEntry.peFlags (%#x) != getEntryResult.peFlags (%#x)\n", palEntry.peFlags, getEntryResult.peFlags );
 }
 
+static void test_halftone_palette(void)
+{
+    HDC hdc;
+    HPALETTE pal;
+    PALETTEENTRY entries[256];
+    PALETTEENTRY defpal[20];
+    int i, count;
+
+    hdc = GetDC(0);
+
+    count = GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, defpal );
+    ok( count == 20, "wrong size %u\n", count );
+
+    pal = CreateHalftonePalette( hdc );
+    count = GetPaletteEntries( pal, 0, 256, entries );
+    ok( count == 256 || broken(count == 20), /* nt 4 */
+        "wrong size %u\n", count );
+
+    /* first and last 10 match the default palette */
+    for (i = 0; i < 10; i++)
+        ok( entries[i].peRed   == defpal[i].peRed &&
+            entries[i].peGreen == defpal[i].peGreen &&
+            entries[i].peBlue  == defpal[i].peBlue &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags );
+    for (i = count - 10; i < count; i++)
+        ok( entries[i].peRed   == defpal[i - count + 20].peRed &&
+            entries[i].peGreen == defpal[i - count + 20].peGreen &&
+            entries[i].peBlue  == defpal[i - count + 20].peBlue &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags );
+
+    DeleteObject( pal );
+    ReleaseDC( 0, hdc );
+}
+
 START_TEST(palette)
 {
     test_DIB_PAL_COLORS();
     test_palette_entries();
+    test_halftone_palette();
 }




More information about the wine-cvs mailing list