Alexandre Julliard : gdi32: Use the get_clipped_rects helper in the text functions.

Alexandre Julliard julliard at winehq.org
Tue Dec 27 11:27:55 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Dec 27 14:32:12 2011 +0100

gdi32: Use the get_clipped_rects helper in the text functions.

---

 dlls/gdi32/dibdrv/graphics.c |   37 ++++++++++++++++++++++---------------
 1 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c
index d9b305d..2e95d66 100644
--- a/dlls/gdi32/dibdrv/graphics.c
+++ b/dlls/gdi32/dibdrv/graphics.c
@@ -126,9 +126,8 @@ static inline void get_text_bkgnd_masks( dibdrv_physdev *pdev, rop_mask *mask )
 
 static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHMETRICS *metrics,
                         const struct gdi_image_bits *image, DWORD text_color,
-                        const struct intensity_range *ranges )
+                        const struct intensity_range *ranges, const struct clipped_rects *clipped_rects )
 {
-    const WINEREGION *clip = get_wine_region( pdev->clip );
     int i;
     RECT rect, clipped_rect;
     POINT src_origin;
@@ -145,9 +144,9 @@ static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHME
     rect.right  = rect.left  + metrics->gmBlackBoxX;
     rect.bottom = rect.top   + metrics->gmBlackBoxY;
 
-    for (i = 0; i < clip->numRects; i++)
+    for (i = 0; i < clipped_rects->count; i++)
     {
-        if (intersect_rect( &clipped_rect, &rect, clip->rects + i ))
+        if (intersect_rect( &clipped_rect, &rect, clipped_rects->rects + i ))
         {
             src_origin.x = clipped_rect.left - rect.left;
             src_origin.y = clipped_rect.top  - rect.top;
@@ -156,8 +155,6 @@ static void draw_glyph( dibdrv_physdev *pdev, const POINT *origin, const GLYPHME
                                          text_color, ranges );
         }
     }
-
-    release_wine_region( pdev->clip );
 }
 
 static const BYTE masks[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
@@ -267,7 +264,7 @@ BOOL render_aa_text_bitmapinfo( HDC hdc, BITMAPINFO *info, struct gdi_image_bits
 
         bkgnd_color.and = 0;
         bkgnd_color.xor = bg_pixel;
-        solid_rects( &dib, 1, &src->visrect, &bkgnd_color, 0 );
+        dib.funcs->solid_rects( &dib, 1, &src->visrect, bkgnd_color.and, bkgnd_color.xor );
     }
 
     for (i = 0; i < count; i++)
@@ -332,27 +329,36 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
                         const RECT *rect, LPCWSTR str, UINT count, const INT *dx )
 {
     dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
+    struct clipped_rects clipped_rects;
     UINT aa_flags, i;
     POINT origin;
     DWORD text_color, err;
-    HRGN saved_clip = NULL;
     struct intensity_range ranges[17];
 
+    init_clipped_rects( &clipped_rects );
+
     if (flags & ETO_OPAQUE)
     {
         rop_mask bkgnd_color;
         get_text_bkgnd_masks( pdev, &bkgnd_color );
-        solid_rects( &pdev->dib, 1, rect, &bkgnd_color, pdev->clip );
+        get_clipped_rects( &pdev->dib, rect, pdev->clip, &clipped_rects );
+        pdev->dib.funcs->solid_rects( &pdev->dib, clipped_rects.count, clipped_rects.rects,
+                                      bkgnd_color.and, bkgnd_color.xor );
     }
 
-    if (count == 0) return TRUE;
+    if (count == 0) goto done;
 
     if (flags & ETO_CLIPPED)
     {
-        HRGN clip = CreateRectRgnIndirect( rect );
-        saved_clip = add_extra_clipping_region( pdev, clip );
-        DeleteObject( clip );
+        if (!(flags & ETO_OPAQUE))  /* otherwise we have done it already */
+            get_clipped_rects( &pdev->dib, rect, pdev->clip, &clipped_rects );
     }
+    else
+    {
+        free_clipped_rects( &clipped_rects );
+        get_clipped_rects( &pdev->dib, NULL, pdev->clip, &clipped_rects );
+    }
+    if (!clipped_rects.count) return TRUE;
 
     text_color = get_pixel_color( pdev, GetTextColor( pdev->dev.hdc ), TRUE );
     get_aa_ranges( pdev->dib.funcs->pixel_to_colorref( &pdev->dib, text_color ), ranges );
@@ -368,7 +374,7 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
         err = get_glyph_bitmap( dev->hdc, (UINT)str[i], aa_flags, &metrics, &image );
         if (err) continue;
 
-        if (image.ptr) draw_glyph( pdev, &origin, &metrics, &image, text_color, ranges );
+        if (image.ptr) draw_glyph( pdev, &origin, &metrics, &image, text_color, ranges, &clipped_rects );
         if (image.free) image.free( &image );
 
         if (dx)
@@ -388,7 +394,8 @@ BOOL dibdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
         }
     }
 
-    restore_clipping_region( pdev, saved_clip );
+done:
+    free_clipped_rects( &clipped_rects );
     return TRUE;
 }
 




More information about the wine-cvs mailing list