[gtk+/rendering-cleanup] Invalidate cairo surface if resizing is not supported for target



commit 9bf477961a6b9a9109c7ea33a473618c73258a46
Author: Kristian Rietveld <kris gtk org>
Date:   Sun Aug 8 18:17:29 2010 +0200

    Invalidate cairo surface if resizing is not supported for target
    
    While X11 surfaces can be resized, this is not the case for Quartz
    surfaces.  Instead of resizing we will invalidate the surface instead.
    By giving _gdk_windowing_set_cairo_surface_size() a boolean return
    value, we can signal back whether or not resizing was possible.  If not
    possible, we invalidate the surface.

 gdk/gdkinternals.h              |    6 +++---
 gdk/gdkwindow.c                 |   17 ++++++++++++-----
 gdk/quartz/gdkdrawable-quartz.c |    3 ++-
 gdk/win32/gdkdrawable-win32.c   |    3 ++-
 gdk/x11/gdkdrawable-x11.c       |    3 ++-
 5 files changed, 21 insertions(+), 11 deletions(-)
---
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 9ff1d92..694391d 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -511,9 +511,9 @@ void _gdk_display_pointer_info_foreach (GdkDisplay                   *display,
 void _gdk_window_invalidate_for_expose (GdkWindow       *window,
 					cairo_region_t       *region);
 
-void _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-					    int width,
-					    int height);
+gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
+					        int width,
+					        int height);
 
 cairo_surface_t * _gdk_windowing_create_cairo_surface (GdkDrawable *drawable,
 						       int width,
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 5797591..89f8bd7 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -1054,11 +1054,18 @@ recompute_visible_regions_internal (GdkWindowObject *private,
       width = private->abs_x + private->width;
       height = private->abs_y + private->height;
 
-      _gdk_windowing_set_cairo_surface_size (private->cairo_surface,
-					     width, height);
-      cairo_surface_set_device_offset (private->cairo_surface,
-				       private->abs_x,
-				       private->abs_y);
+      if (_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
+                                                 width, height))
+        {
+          cairo_surface_set_device_offset (private->cairo_surface,
+                                           private->abs_x,
+                                           private->abs_y);
+        }
+      else
+        {
+          cairo_surface_destroy (private->cairo_surface);
+          private->cairo_surface = NULL;
+        }
     }
 }
 
diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c
index ddb481a..849d186 100644
--- a/gdk/quartz/gdkdrawable-quartz.c
+++ b/gdk/quartz/gdkdrawable-quartz.c
@@ -32,12 +32,13 @@ typedef struct {
   CGContextRef  cg_context;
 } GdkQuartzCairoSurfaceData;
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
 				       int              width,
 				       int              height)
 {
   /* This is not supported with quartz surfaces. */
+  return FALSE;
 }
 
 static void
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c
index 17ccd61..403ffad 100644
--- a/gdk/win32/gdkdrawable-win32.c
+++ b/gdk/win32/gdkdrawable-win32.c
@@ -670,12 +670,13 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable)
   return impl->cairo_surface;
 }
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
 				       gint width,
 				       gint height)
 {
   // Do nothing.  The surface size is determined by the DC
+  return FALSE;
 }
 
 static gint
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c
index 02efc0d..961dad0 100644
--- a/gdk/x11/gdkdrawable-x11.c
+++ b/gdk/x11/gdkdrawable-x11.c
@@ -461,12 +461,13 @@ gdk_x11_cairo_surface_destroy (void *data)
   impl->cairo_surface = NULL;
 }
 
-void
+gboolean
 _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
 				       int width,
 				       int height)
 {
   cairo_xlib_surface_set_size (surface, width, height);
+  return TRUE;
 }
 
 cairo_surface_t *



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