[gtk+] Fix clipping issue with clip masks



commit c0084e21422c28e1b1039e509622e2b354b857f4
Author: Alexander Larsson <alexl redhat com>
Date:   Tue Aug 25 10:16:39 2009 +0200

    Fix clipping issue with clip masks
    
    When the clip mask is completely inside the drawable clip region we
    don't change the clip at all. However, we did set region_tag_applied,
    so when the drawable clip was removed we removed the original clip mask.
    This is no good, so we fix that by returning early in this case.
    
    Fixes issue reported in bug #592752.

 gdk/gdkgc.c |   22 ++++++++++++++++++----
 1 files changed, 18 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkgc.c b/gdk/gdkgc.c
index 699cebf..13d9c8d 100644
--- a/gdk/gdkgc.c
+++ b/gdk/gdkgc.c
@@ -648,7 +648,7 @@ _gdk_gc_add_drawable_clip (GdkGC     *gc,
       GdkColor black = {0, 0, 0, 0};
       GdkRectangle r;
       GdkOverlapType overlap;
-      
+
       gdk_drawable_get_size (priv->clip_mask, &w, &h);
 
       r.x = 0;
@@ -659,7 +659,7 @@ _gdk_gc_add_drawable_clip (GdkGC     *gc,
       /* Its quite common to expose areas that are completely in or outside
        * the region, so we try to avoid allocating bitmaps that are just fully
        * set or completely unset.
-       */ 
+       */
       overlap = gdk_region_rect_in (region, &r);
       if (overlap == GDK_OVERLAP_RECTANGLE_PART)
 	{
@@ -683,11 +683,19 @@ _gdk_gc_add_drawable_clip (GdkGC     *gc,
 	}
       else if (overlap == GDK_OVERLAP_RECTANGLE_OUT)
 	{
+	  /* No intersection, set empty clip region */
 	  GdkRegion *empty = gdk_region_new ();
 
+	  gdk_region_destroy (region);
 	  priv->old_clip_mask = g_object_ref (priv->clip_mask);
+	  priv->clip_region = empty;
 	  _gdk_windowing_gc_set_clip_region (gc, empty, FALSE);
-	  gdk_region_destroy (empty);
+	}
+      else
+	{
+	  /* Completely inside region, don't set unnecessary clip */
+	  gdk_region_destroy (region);
+	  return;
 	}
     }
   else
@@ -696,7 +704,7 @@ _gdk_gc_add_drawable_clip (GdkGC     *gc,
       priv->clip_region = region;
       if (priv->old_clip_region)
 	gdk_region_intersect (region, priv->old_clip_region);
-      
+
       _gdk_windowing_gc_set_clip_region (gc, priv->clip_region, FALSE);
     }
 
@@ -718,6 +726,12 @@ _gdk_gc_remove_drawable_clip (GdkGC *gc)
 	  gdk_gc_set_clip_mask (gc, priv->old_clip_mask);
 	  g_object_unref (priv->old_clip_mask);
 	  priv->old_clip_mask = NULL;
+
+	  if (priv->clip_region)
+	    {
+	      g_object_unref (priv->clip_region);
+	      priv->clip_region = NULL;
+	    }
 	}
       else
 	{



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]