Alexandre Julliard : gdi32: Add a helper to build a color table from the DIB_PAL_COLORS bitmap info.

Alexandre Julliard julliard at winehq.org
Fri Dec 9 14:41:36 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec  8 21:31:59 2011 +0100

gdi32: Add a helper to build a color table from the DIB_PAL_COLORS bitmap info.

---

 dlls/gdi32/dib.c            |   42 ++++++++++++++++++++++++++----------------
 dlls/gdi32/dibdrv/dc.c      |   14 ++------------
 dlls/gdi32/dibdrv/dibdrv.h  |    2 +-
 dlls/gdi32/dibdrv/objects.c |    3 +--
 dlls/gdi32/gdi_private.h    |    1 +
 5 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index ed5eea7..d870582 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -233,6 +233,28 @@ static int fill_color_table_from_palette( BITMAPINFO *info, HDC hdc )
     return colors;
 }
 
+int fill_color_table_from_pal_colors( HDC hdc, const BITMAPINFO *info, RGBQUAD *color_table )
+{
+    PALETTEENTRY entries[256];
+    HPALETTE palette;
+    const WORD *index = (const WORD *)info->bmiColors;
+    int i, count, colors = get_dib_num_of_colors( info );
+
+    if (!colors) return 0;
+    if (!(palette = GetCurrentObject( hdc, OBJ_PAL ))) return 0;
+    if (!(count = GetPaletteEntries( palette, 0, colors, entries ))) return 0;
+
+    for (i = 0; i < colors; i++, index++)
+    {
+        PALETTEENTRY *entry = &entries[*index % count];
+        color_table[i].rgbRed = entry->peRed;
+        color_table[i].rgbGreen = entry->peGreen;
+        color_table[i].rgbBlue = entry->peBlue;
+        color_table[i].rgbReserved = 0;
+    }
+    return colors;
+}
+
 static void *get_pixel_ptr( const BITMAPINFO *info, void *bits, int x, int y )
 {
     const int width = info->bmiHeader.biWidth, height = info->bmiHeader.biHeight;
@@ -1383,11 +1405,10 @@ HBITMAP WINAPI CreateDIBitmap( HDC hdc, const BITMAPINFOHEADER *header,
 }
 
 /* Copy/synthesize RGB palette from BITMAPINFO */
-static void DIB_CopyColorTable( DC *dc, BITMAPOBJ *bmp, WORD coloruse, const BITMAPINFO *info )
+static void DIB_CopyColorTable( HDC hdc, BITMAPOBJ *bmp, WORD coloruse, const BITMAPINFO *info )
 {
-    unsigned int colors, i;
+    unsigned int colors = get_dib_num_of_colors( info );
 
-    colors = get_dib_num_of_colors( info );
     if (!(bmp->color_table = HeapAlloc(GetProcessHeap(), 0, colors * sizeof(RGBQUAD) ))) return;
     bmp->nb_colors = colors;
 
@@ -1397,18 +1418,7 @@ static void DIB_CopyColorTable( DC *dc, BITMAPOBJ *bmp, WORD coloruse, const BIT
     }
     else
     {
-        PALETTEENTRY entries[256];
-        const WORD *index = (const WORD *)info->bmiColors;
-        UINT count = GetPaletteEntries( dc->hPalette, 0, colors, entries );
-
-        for (i = 0; i < colors; i++, index++)
-        {
-            PALETTEENTRY *entry = &entries[*index % count];
-            bmp->color_table[i].rgbRed = entry->peRed;
-            bmp->color_table[i].rgbGreen = entry->peGreen;
-            bmp->color_table[i].rgbBlue = entry->peBlue;
-            bmp->color_table[i].rgbReserved = 0;
-        }
+        fill_color_table_from_pal_colors( hdc, info, bmp->color_table );
     }
 }
 
@@ -1521,7 +1531,7 @@ HBITMAP WINAPI CreateDIBSection(HDC hdc, CONST BITMAPINFO *bmi, UINT usage,
         bmp->dib = dib;
         bmp->funcs = physdev->funcs;
         /* create local copy of DIB palette */
-        if (info->bmiHeader.biBitCount <= 8) DIB_CopyColorTable( dc, bmp, usage, info );
+        if (info->bmiHeader.biBitCount <= 8) DIB_CopyColorTable( hdc, bmp, usage, info );
         GDI_ReleaseObj( ret );
 
         if (!physdev->funcs->pCreateDIBSection( physdev, ret, info, usage ))
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index b9308bf..12d1168 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -162,7 +162,7 @@ static BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD
     return TRUE;
 }
 
-BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, UINT usage, HPALETTE palette)
+BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, UINT usage, HDC hdc)
 {
     DWORD *masks = (bi->bmiHeader.biCompression == BI_BITFIELDS) ? (DWORD *)bi->bmiColors : NULL;
     RGBQUAD *color_table = NULL, pal_table[256];
@@ -172,17 +172,7 @@ BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, U
     {
         if(usage == DIB_PAL_COLORS)
         {
-            PALETTEENTRY entries[256];
-            const WORD *index = (const WORD *)bi->bmiColors;
-            UINT i, count = GetPaletteEntries( palette, 0, num_colors, entries );
-            for (i = 0; i < num_colors; i++, index++)
-            {
-                PALETTEENTRY *entry = &entries[*index % count];
-                pal_table[i].rgbRed      = entry->peRed;
-                pal_table[i].rgbGreen    = entry->peGreen;
-                pal_table[i].rgbBlue     = entry->peBlue;
-                pal_table[i].rgbReserved = 0;
-            }
+            fill_color_table_from_pal_colors( hdc, bi, pal_table );
             color_table = pal_table;
         }
         else color_table = (RGBQUAD *)bi->bmiColors;
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index 28633e0..1bf0696 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -224,7 +224,7 @@ extern void get_rop_codes(INT rop, struct rop_codes *codes) DECLSPEC_HIDDEN;
 extern void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor) DECLSPEC_HIDDEN;
 extern void update_brush_rop( dibdrv_physdev *pdev, INT rop ) DECLSPEC_HIDDEN;
 extern void reset_dash_origin(dibdrv_physdev *pdev) DECLSPEC_HIDDEN;
-extern BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, UINT usage, HPALETTE pal) DECLSPEC_HIDDEN;
+extern BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, UINT usage, HDC hdc) DECLSPEC_HIDDEN;
 extern BOOL init_dib_info_from_bitmapinfo(dib_info *dib, const BITMAPINFO *info, void *bits,
                                           enum dib_info_flags flags) DECLSPEC_HIDDEN;
 extern BOOL init_dib_info_from_bitmapobj(dib_info *dib, BITMAPOBJ *bmp, enum dib_info_flags flags) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 0baafdb..9c85094 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -1338,9 +1338,8 @@ static BOOL pattern_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RE
             if (pdev->brush_pattern_usage == DIB_PAL_COLORS)
             {
                 dib_info pattern;
-                HPALETTE pal = GetCurrentObject( pdev->dev.hdc, OBJ_PAL );
                 if (!init_dib_info_from_brush( &pattern, pdev->brush_pattern_info,
-                                               pdev->brush_pattern_bits, DIB_PAL_COLORS, pal ))
+                                               pdev->brush_pattern_bits, DIB_PAL_COLORS, pdev->dev.hdc ))
                     return FALSE;
                 select_pattern_brush( pdev, &pattern );
                 free_dib_info( &pattern );
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 56fc96d..2bed05b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -235,6 +235,7 @@ extern void DC_UpdateXforms( DC * dc ) DECLSPEC_HIDDEN;
 
 /* dib.c */
 extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) DECLSPEC_HIDDEN;
+extern int fill_color_table_from_pal_colors( HDC hdc, const BITMAPINFO *info, RGBQUAD *color_table ) DECLSPEC_HIDDEN;
 extern void fill_default_color_table( BITMAPINFO *info ) DECLSPEC_HIDDEN;
 extern void get_ddb_bitmapinfo( BITMAPOBJ *bmp, BITMAPINFO *info ) DECLSPEC_HIDDEN;
 extern BITMAPINFO *copy_packed_dib( const BITMAPINFO *src_info, UINT usage ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list