Anton Baskanov : gdi32: Return default palette entries from GetSystemPaletteEntries for non-palette-based devices.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Oct 21 10:39:58 CDT 2015


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

Author: Anton Baskanov <baskanov at gmail.com>
Date:   Tue Oct 20 22:16:29 2015 +0600

gdi32: Return default palette entries from GetSystemPaletteEntries for non-palette-based devices.

Signed-off-by: Anton Baskanov <baskanov at gmail.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/driver.c        |   5 --
 dlls/gdi32/gdi_private.h   |   1 +
 dlls/gdi32/palette.c       |  31 +++++++++++
 dlls/gdi32/tests/palette.c | 126 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/palette.c |   5 ++
 5 files changed, 163 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index a6b138c..d052e04 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -371,11 +371,6 @@ static UINT nulldrv_GetOutlineTextMetrics( PHYSDEV dev, UINT size, LPOUTLINETEXT
     return 0;
 }
 
-static UINT nulldrv_GetSystemPaletteEntries( PHYSDEV dev, UINT start, UINT count, PALETTEENTRY *entries )
-{
-    return 0;
-}
-
 static UINT nulldrv_GetTextCharsetInfo( PHYSDEV dev, LPFONTSIGNATURE fs, DWORD flags )
 {
     return DEFAULT_CHARSET;
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 337fe27..cde9867 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -370,6 +370,7 @@ extern BOOL nulldrv_FrameRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush, INT width, IN
 extern LONG nulldrv_GetBitmapBits( HBITMAP bitmap, void *bits, LONG size ) DECLSPEC_HIDDEN;
 extern COLORREF nulldrv_GetNearestColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
 extern COLORREF nulldrv_GetPixel( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
+extern UINT nulldrv_GetSystemPaletteEntries( PHYSDEV dev, UINT start, UINT count, PALETTEENTRY *entries ) DECLSPEC_HIDDEN;
 extern BOOL nulldrv_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert,
                                   void * grad_array, ULONG ngrad, ULONG mode ) DECLSPEC_HIDDEN;
 extern INT  nulldrv_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index d850d0f..be84b71 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -426,6 +426,37 @@ UINT WINAPI GetSystemPaletteEntries(
 }
 
 
+/* null driver fallback implementation for GetSystemPaletteEntries */
+UINT nulldrv_GetSystemPaletteEntries( PHYSDEV dev, UINT start, UINT count, PALETTEENTRY *entries )
+{
+    if (entries && start < 256)
+    {
+        UINT i;
+        const RGBQUAD *default_entries;
+
+        if (start + count > 256) count = 256 - start;
+
+        default_entries = get_default_color_table( 8 );
+        for (i = 0; i < count; ++i)
+        {
+            if (start + i < 10 || start + i >= 246)
+            {
+                entries[i].peRed = default_entries[start + i].rgbRed;
+                entries[i].peGreen = default_entries[start + i].rgbGreen;
+                entries[i].peBlue = default_entries[start + i].rgbBlue;
+            }
+            else
+            {
+                entries[i].peRed = 0;
+                entries[i].peGreen = 0;
+                entries[i].peBlue = 0;
+            }
+            entries[i].peFlags = 0;
+        }
+    }
+    return 0;
+}
+
 /***********************************************************************
  * GetNearestPaletteIndex [GDI32.@]
  *
diff --git a/dlls/gdi32/tests/palette.c b/dlls/gdi32/tests/palette.c
index f95c0d3..045f530 100644
--- a/dlls/gdi32/tests/palette.c
+++ b/dlls/gdi32/tests/palette.c
@@ -191,9 +191,135 @@ static void test_halftone_palette(void)
     ReleaseDC( 0, hdc );
 }
 
+static void check_system_palette_entries(HDC hdc)
+{
+    PALETTEENTRY entries[256];
+    PALETTEENTRY defpal[20];
+    int i, count;
+
+    memset( defpal, 0xaa, sizeof(defpal) );
+    count = GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, defpal );
+    ok( count == 20, "wrong size %u\n", count );
+
+    memset( entries, 0x55, sizeof(entries) );
+    count = GetSystemPaletteEntries( hdc, 0, 256, entries );
+    ok( count == 0, "wrong size %u\n", count);
+    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 instead of %02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags,
+            defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue );
+    }
+    for (i = 10; i < 246; ++i)
+    {
+        ok( !entries[i].peRed   &&
+            !entries[i].peGreen &&
+            !entries[i].peBlue  &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags);
+    }
+    for (i = 246; i < 256; i++)
+    {
+        int idx = i - 246 + 10;
+        ok( entries[i].peRed   == defpal[idx].peRed &&
+            entries[i].peGreen == defpal[idx].peGreen &&
+            entries[i].peBlue  == defpal[idx].peBlue &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags,
+            defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue );
+    }
+
+    memset( entries, 0x55, sizeof(entries) );
+    count = GetSystemPaletteEntries( hdc, 0, 10, entries );
+    ok( count == 0, "wrong size %u\n", count);
+    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 instead of %02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags,
+            defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue );
+    }
+
+    memset( entries, 0x55, sizeof(entries) );
+    count = GetSystemPaletteEntries( hdc, 10, 246, entries );
+    ok( count == 0, "wrong size %u\n", count);
+    for (i = 0; i < 236; ++i)
+    {
+        ok( !entries[i].peRed   &&
+            !entries[i].peGreen &&
+            !entries[i].peBlue  &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags);
+    }
+    for (i = 236; i < 246; i++)
+    {
+        int idx = i - 236 + 10;
+        ok( entries[i].peRed   == defpal[idx].peRed &&
+            entries[i].peGreen == defpal[idx].peGreen &&
+            entries[i].peBlue  == defpal[idx].peBlue &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags,
+            defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue );
+    }
+
+    memset( entries, 0x55, sizeof(entries) );
+    count = GetSystemPaletteEntries( hdc, 246, 10, entries );
+    ok( count == 0, "wrong size %u\n", count);
+    for (i = 0; i < 10; i++)
+    {
+        int idx = i + 10;
+        ok( entries[i].peRed   == defpal[idx].peRed &&
+            entries[i].peGreen == defpal[idx].peGreen &&
+            entries[i].peBlue  == defpal[idx].peBlue &&
+            !entries[i].peFlags,
+            "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i,
+            entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags,
+            defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue );
+    }
+}
+
+static void test_system_palette_entries(void)
+{
+    HDC hdc;
+    HDC metafile_dc;
+    HMETAFILE metafile;
+
+    hdc = GetDC(0);
+
+    if (!(GetDeviceCaps( hdc, RASTERCAPS ) & RC_PALETTE))
+    {
+        check_system_palette_entries(hdc);
+    }
+    else
+    {
+        skip( "device is palette-based, skipping test\n" );
+    }
+
+    ReleaseDC( 0, hdc );
+
+    metafile_dc = CreateMetaFileA(NULL);
+
+    check_system_palette_entries(metafile_dc);
+
+    metafile = CloseMetaFile(metafile_dc);
+    DeleteMetaFile(metafile);
+}
+
 START_TEST(palette)
 {
     test_DIB_PAL_COLORS();
     test_palette_entries();
     test_halftone_palette();
+    test_system_palette_entries();
 }
diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c
index a399ec9..460615c 100644
--- a/dlls/winex11.drv/palette.c
+++ b/dlls/winex11.drv/palette.c
@@ -1215,6 +1215,11 @@ UINT X11DRV_GetSystemPaletteEntries( PHYSDEV dev, UINT start, UINT count, LPPALE
 {
     UINT i;
 
+    if (!palette_size)
+    {
+        dev = GET_NEXT_PHYSDEV(dev, pGetSystemPaletteEntries);
+        return dev->funcs->pGetSystemPaletteEntries(dev, start, count, entries);
+    }
     if (!entries) return palette_size;
     if (start >= palette_size) return 0;
     if (start + count >= palette_size) count = palette_size - start;




More information about the wine-cvs mailing list