[dia/cairo-port: 52/53] Resolve an annoying gtk2 vs 3 ABI issue that was causing a blank canvas



commit 6830485cee2f3194cc62aa7678e38b7ceb130000
Author: Zander Brown <zbrown gnome org>
Date:   Sat May 11 16:25:56 2019 +0100

    Resolve an annoying gtk2 vs 3 ABI issue that was causing a blank canvas

 app/interface.c                     | 16 ++++++++++------
 lib/renderer/diacairo-interactive.c | 30 +++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 7 deletions(-)
---
diff --git a/app/interface.c b/app/interface.c
index 8111f896..381448d1 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -387,12 +387,16 @@ canvas_configure_event (GtkWidget         *widget,
 
 static gboolean
 canvas_expose_event (GtkWidget      *widget,
-                    GdkEventExpose *event,
-                    DDisplay       *ddisp)
+                     GdkEventExpose *event,
+                     DDisplay       *ddisp)
 {
   GSList *l;
   Rectangle *r, totrect;
   DiaInteractiveRendererInterface *renderer;
+  GtkAllocation alloc;
+  cairo_t *ctx;
+
+  ctx = gdk_cairo_create (gtk_widget_get_window (widget));
 
   g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
 
@@ -435,10 +439,10 @@ canvas_expose_event (GtkWidget      *widget,
     ddisplay_render_pixmap(ddisp, &totrect);
   }
 
-  dia_interactive_renderer_paint (ddisp->renderer,
-                                  ctx,
-                                  gtk_widget_get_allocated_width (widget),
-                                  gtk_widget_get_allocated_height (widget));
+  gtk_widget_get_allocation (widget, &alloc);
+
+  dia_interactive_renderer_paint (ddisp->renderer, ctx,
+                                  alloc.width, alloc.height);
 
   return FALSE;
 }
diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c
index 0c77f751..1ae3ffd4 100644
--- a/lib/renderer/diacairo-interactive.c
+++ b/lib/renderer/diacairo-interactive.c
@@ -344,6 +344,30 @@ dia_cairo_interactive_renderer_get_type (void)
   return object_type;
 }
 
+/*
+ * Taken from gtk-3-24 as gtk2 gdk_cairo_region uses GdkRegion
+ *
+ * TODO: Use gtk3 implementation
+ */
+static void
+_gdk_cairo_region (cairo_t              *cr,
+                   const cairo_region_t *region)
+{
+  cairo_rectangle_int_t box;
+  gint n_boxes, i;
+
+  g_return_if_fail (cr != NULL);
+  g_return_if_fail (region != NULL);
+
+  n_boxes = cairo_region_num_rectangles (region);
+
+  for (i = 0; i < n_boxes; i++)
+    {
+      cairo_region_get_rectangle (region, i, &box);
+      cairo_rectangle (cr, box.x, box.y, box.width, box.height);
+    }
+}
+
 static void
 begin_render(DiaRenderer *self, const Rectangle *update)
 {
@@ -351,11 +375,15 @@ begin_render(DiaRenderer *self, const Rectangle *update)
   DiaCairoRenderer *base_renderer = DIA_CAIRO_RENDERER (self);
 
   g_return_if_fail (base_renderer->cr == NULL);
+  if (base_renderer->surface) {
+    cairo_surface_destroy (base_renderer->surface);
+    base_renderer->surface = NULL;
+  }
   base_renderer->cr = cairo_create (renderer->surface);
 
   /* Setup clipping for this sequence of render operations */
   /* Must be done before the scaling because the clip is in pixel coords */
-  gdk_cairo_region (base_renderer->cr, renderer->clip_region);
+  _gdk_cairo_region (base_renderer->cr, renderer->clip_region);
   cairo_clip(base_renderer->cr);
 
   cairo_scale (base_renderer->cr, *renderer->zoom_factor, *renderer->zoom_factor);


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