Alexandre Julliard : gdi32: Add support for pattern brushes in the DIB driver.

Alexandre Julliard julliard at winehq.org
Thu Nov 3 13:10:14 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov  3 11:24:07 2011 +0100

gdi32: Add support for pattern brushes in the DIB driver.

---

 dlls/gdi32/dibdrv/dc.c      |   25 +++----------
 dlls/gdi32/dibdrv/dibdrv.h  |    2 +-
 dlls/gdi32/dibdrv/objects.c |   85 ++++++++++++++++++++++++-------------------
 3 files changed, 55 insertions(+), 57 deletions(-)

diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 41e996c..5a7d011 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -161,25 +161,18 @@ BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_f
     return TRUE;
 }
 
-BOOL init_dib_info_from_packed(dib_info *dib, const BITMAPINFOHEADER *bi, WORD usage, HPALETTE palette)
+BOOL init_dib_info_from_brush(dib_info *dib, const BITMAPINFO *bi, void *bits, UINT usage, HPALETTE palette)
 {
-    DWORD *masks = NULL;
+    DWORD *masks = (bi->bmiHeader.biCompression == BI_BITFIELDS) ? (DWORD *)bi->bmiColors : NULL;
     RGBQUAD *color_table = NULL, pal_table[256];
-    BYTE *ptr = (BYTE*)bi + bi->biSize;
-    int num_colors = get_dib_num_of_colors( (const BITMAPINFO *)bi );
-
-    if(bi->biCompression == BI_BITFIELDS)
-    {
-        masks = (DWORD *)ptr;
-        ptr += 3 * sizeof(DWORD);
-    }
+    int num_colors = get_dib_num_of_colors( bi );
 
     if(num_colors)
     {
         if(usage == DIB_PAL_COLORS)
         {
             PALETTEENTRY entries[256];
-            const WORD *index = (const WORD*) ptr;
+            const WORD *index = (const WORD *)bi->bmiColors;
             UINT i, count = GetPaletteEntries( palette, 0, num_colors, entries );
             for (i = 0; i < num_colors; i++, index++)
             {
@@ -190,16 +183,10 @@ BOOL init_dib_info_from_packed(dib_info *dib, const BITMAPINFOHEADER *bi, WORD u
                 pal_table[i].rgbReserved = 0;
             }
             color_table = pal_table;
-            ptr += num_colors * sizeof(WORD);
-        }
-        else
-        {
-            color_table = (RGBQUAD*)ptr;
-            ptr += num_colors * sizeof(*color_table);
         }
+        else color_table = (RGBQUAD *)bi->bmiColors;
     }
-
-    return init_dib_info(dib, bi, masks, color_table, num_colors, ptr, private_color_table);
+    return init_dib_info(dib, &bi->bmiHeader, masks, color_table, num_colors, bits, private_color_table);
 }
 
 BOOL init_dib_info_from_bitmapinfo(dib_info *dib, const BITMAPINFO *info, void *bits, enum dib_info_flags flags)
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index b810e75..0650e08 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -195,7 +195,7 @@ extern void reset_dash_origin(dibdrv_physdev *pdev) DECLSPEC_HIDDEN;
 extern BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields,
                           RGBQUAD *color_table, int color_table_size, void *bits,
                           enum dib_info_flags flags) DECLSPEC_HIDDEN;
-extern BOOL init_dib_info_from_packed(dib_info *dib, const BITMAPINFOHEADER *bi, WORD usage, HPALETTE pal) 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_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 233fa8e..3418dc8 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -1345,6 +1345,53 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
 
     TRACE("(%p, %p)\n", dev, hbrush);
 
+    if (bitmap || info)  /* pattern brush */
+    {
+        dib_info orig_dib;
+        HPALETTE pal = (usage == DIB_PAL_COLORS) ? GetCurrentObject(dev->hdc, OBJ_PAL) : NULL;
+        RECT rect;
+        BOOL ret;
+
+        if (!info)
+        {
+            BITMAPOBJ *bmp = GDI_GetObjPtr( bitmap, OBJ_BITMAP );
+
+            if (!bmp) return 0;
+            ret = init_dib_info_from_bitmapobj( &orig_dib, bmp, 0 );
+            GDI_ReleaseObj( bitmap );
+        }
+        else ret = init_dib_info_from_brush( &orig_dib, info, bits, usage, pal );
+
+        if (!ret) return 0;
+
+        if (usage == DIB_PAL_COLORS) FIXME( "DIB_PAL_COLORS brush not handled correctly\n");
+
+        free_pattern_brush( pdev );
+        copy_dib_color_info(&pdev->brush_dib, &pdev->dib);
+
+        pdev->brush_dib.height = orig_dib.height;
+        pdev->brush_dib.width  = orig_dib.width;
+        pdev->brush_dib.stride = get_dib_stride( pdev->brush_dib.width, pdev->brush_dib.bit_count );
+
+        pdev->brush_dib.bits.param   = NULL;
+        pdev->brush_dib.bits.ptr     = HeapAlloc( GetProcessHeap(), 0,
+                                                  pdev->brush_dib.height * pdev->brush_dib.stride );
+        pdev->brush_dib.bits.is_copy = TRUE;
+        pdev->brush_dib.bits.free    = free_heap_bits;
+
+        rect.left = rect.top = 0;
+        rect.right = orig_dib.width;
+        rect.bottom = orig_dib.height;
+
+        pdev->brush_dib.funcs->convert_to(&pdev->brush_dib, &orig_dib, &rect);
+        pdev->brush_rects = pattern_brush;
+        pdev->brush_style = BS_DIBPATTERN;
+        pdev->defer &= ~DEFER_BRUSH;
+        free_dib_info(&orig_dib);
+
+        return next->funcs->pSelectBrush( next, hbrush, bitmap, info, bits, usage );
+    }
+
     if (!GetObjectW( hbrush, sizeof(logbrush), &logbrush )) return 0;
 
     if (hbrush == GetStockObject( DC_BRUSH ))
@@ -1371,42 +1418,7 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
         pdev->defer &= ~DEFER_BRUSH;
         break;
 
-    case BS_DIBPATTERN:
-    {
-        BITMAPINFOHEADER *bi = (BITMAPINFOHEADER *)logbrush.lbHatch;
-        dib_info orig_dib;
-        WORD usage = LOWORD(logbrush.lbColor);
-        HPALETTE pal = (usage == DIB_PAL_COLORS) ? GetCurrentObject(dev->hdc, OBJ_PAL) : NULL;
-        RECT rect;
-
-        if(init_dib_info_from_packed(&orig_dib, bi, usage, pal))
-        {
-            copy_dib_color_info(&pdev->brush_dib, &pdev->dib);
-
-            pdev->brush_dib.height = orig_dib.height;
-            pdev->brush_dib.width  = orig_dib.width;
-            pdev->brush_dib.stride = get_dib_stride( pdev->brush_dib.width, pdev->brush_dib.bit_count );
-
-            pdev->brush_dib.bits.param   = NULL;
-            pdev->brush_dib.bits.ptr     = HeapAlloc( GetProcessHeap(), 0,
-                                                      pdev->brush_dib.height * pdev->brush_dib.stride );
-            pdev->brush_dib.bits.is_copy = TRUE;
-            pdev->brush_dib.bits.free    = free_heap_bits;
-
-            rect.left = rect.top = 0;
-            rect.right = orig_dib.width;
-            rect.bottom = orig_dib.height;
-
-            pdev->brush_dib.funcs->convert_to(&pdev->brush_dib, &orig_dib, &rect);
-            pdev->brush_rects = pattern_brush;
-            pdev->defer &= ~DEFER_BRUSH;
-            free_dib_info(&orig_dib);
-        }
-        break;
-    }
-
     case BS_HATCHED:
-    {
         if(logbrush.lbHatch > HS_DIAGCROSS) return 0;
         pdev->brush_hatch = logbrush.lbHatch;
         pdev->brush_colorref = logbrush.lbColor;
@@ -1415,10 +1427,9 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, HBITMAP bitmap,
         pdev->brush_rects = pattern_brush;
         pdev->defer &= ~DEFER_BRUSH;
         break;
-    }
 
     default:
-        break;
+        return 0;
     }
 
     return next->funcs->pSelectBrush( next, hbrush, bitmap, info, bits, usage );




More information about the wine-cvs mailing list