Alexandre Julliard : gdi32: Avoid copying the brush pattern if the format matches the DC.

Alexandre Julliard julliard at winehq.org
Tue Nov 8 12:23:10 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov  8 13:32:36 2011 +0100

gdi32: Avoid copying the brush pattern if the format matches the DC.

---

 dlls/gdi32/dibdrv/objects.c |   30 +++++++++++++++++++++++++++++-
 1 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index cf714b5..ddd3563 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -1246,6 +1246,27 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
     return ret;
 }
 
+static BOOL matching_pattern_format( dib_info *dib, dib_info *pattern )
+{
+    if (dib->bit_count != pattern->bit_count) return FALSE;
+    if (dib->stride != pattern->stride) return FALSE;
+
+    switch (dib->bit_count)
+    {
+    case 1:
+    case 4:
+    case 8:
+        if (dib->color_table_size != pattern->color_table_size) return FALSE;
+        return !memcmp( dib->color_table, pattern->color_table, dib->color_table_size * sizeof(RGBQUAD) );
+    case 16:
+    case 32:
+        return (dib->red_mask == pattern->red_mask &&
+                dib->green_mask == pattern->green_mask &&
+                dib->blue_mask == pattern->blue_mask);
+    }
+    return TRUE;
+}
+
 static void select_pattern_brush( dibdrv_physdev *pdev, dib_info *pattern )
 {
     RECT rect;
@@ -1257,7 +1278,14 @@ static void select_pattern_brush( dibdrv_physdev *pdev, dib_info *pattern )
     pdev->brush_dib.width  = pattern->width;
     pdev->brush_dib.stride = get_dib_stride( pdev->brush_dib.width, pdev->brush_dib.bit_count );
 
-    pdev->brush_dib.bits.param   = NULL;
+    if (matching_pattern_format( &pdev->brush_dib, pattern ))
+    {
+        pdev->brush_dib.bits.ptr     = pattern->bits.ptr;
+        pdev->brush_dib.bits.is_copy = FALSE;
+        pdev->brush_dib.bits.free    = NULL;
+        return;
+    }
+
     pdev->brush_dib.bits.ptr     = HeapAlloc( GetProcessHeap(), 0,
                                               pdev->brush_dib.height * pdev->brush_dib.stride );
     pdev->brush_dib.bits.is_copy = TRUE;




More information about the wine-cvs mailing list