[dia/cairo-port: 49/53] Working rendering of the canvas



commit f1de9111d1dc5bc175de229d4aebe1a32cb79198
Author: Zander Brown <zbrown gnome org>
Date:   Tue Dec 25 12:25:09 2018 +0000

    Working rendering of the canvas

 app/display.c                       | 165 +-----------------------------------
 app/display.h                       |   5 --
 app/interface.c                     |  59 +++++++++++--
 lib/diainteractiverenderer.c        |  16 +++-
 lib/diarenderer.h                   |  39 +++++----
 lib/renderer/diacairo-interactive.c |  74 ++++++++--------
 6 files changed, 128 insertions(+), 230 deletions(-)
---
diff --git a/app/display.c b/app/display.c
index 5586ee89..0439bf5d 100644
--- a/app/display.c
+++ b/app/display.c
@@ -199,8 +199,6 @@ copy_display(DDisplay *orig_ddisp)
   ddisp->aa_renderer = orig_ddisp->aa_renderer;
 
   ddisp->update_areas = orig_ddisp->update_areas;
-  ddisp->display_areas = orig_ddisp->display_areas;
-  ddisp->update_id = 0;
 
   ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0;
 
@@ -258,8 +256,6 @@ new_display(Diagram *dia)
     ddisp->aa_renderer = (preset > 0 ? TRUE : FALSE);
 
   ddisp->update_areas = NULL;
-  ddisp->display_areas = NULL;
-  ddisp->update_id = 0;
 
   ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0;
 
@@ -362,20 +358,6 @@ ddisplay_add_update_pixels(DDisplay *ddisp, Point *point,
   ddisplay_add_update(ddisp, &rect);
 }
 
-/** Free display_areas list */
-static void
-ddisplay_free_display_areas(DDisplay *ddisp)
-{
-  GSList *l;
-  l = ddisp->display_areas;
-  while(l!=NULL) {
-    g_free(l->data);
-    l = g_slist_next(l);
-  }
-  g_slist_free(ddisp->display_areas);
-  ddisp->display_areas = NULL;
-}
-
 /** Free update_areas list */
 static void
 ddisplay_free_update_areas(DDisplay *ddisp)
@@ -399,9 +381,6 @@ ddisplay_add_update_all(DDisplay *ddisp)
   if (ddisp->update_areas != NULL) {
     ddisplay_free_update_areas(ddisp);
   }
-  if (ddisp->display_areas != NULL) {
-    ddisplay_free_display_areas(ddisp);
-  }
   ddisplay_add_update(ddisp, &ddisp->visible);
 }
 
@@ -426,8 +405,6 @@ void
 ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect)
 {
   Rectangle *r;
-  int top,bottom,left,right;
-  Rectangle *visible;
   int width, height;
 
   if (!ddisp->renderer)
@@ -450,122 +427,7 @@ ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect)
     rectangle_intersection(r, &ddisp->visible);
   }
 
-  visible = &ddisp->visible;
-  left = floor( (r->left - visible->left)  * (real)width /
-               (visible->right - visible->left) ) - 1;
-  top = floor( (r->top - visible->top)  * (real)height /
-              (visible->bottom - visible->top) ) - 1;
-  right = ceil( (r->right - visible->left)  * (real)width /
-               (visible->right - visible->left) ) + 1;
-  bottom = ceil( (r->bottom - visible->top)  * (real)height /
-                (visible->bottom - visible->top) ) + 1;
-
-  ddisplay_add_display_area(ddisp,
-                           left, top,
-                           right, bottom);
-}
-
-void
-ddisplay_add_display_area(DDisplay *ddisp,
-                         int left, int top,
-                         int right, int bottom)
-{
-  IRectangle *r;
-
-  if (!ddisp->renderer)
-    return; /* if we don't have a renderer yet prefer ignoring over crashing */
-  if (left < 0)
-    left = 0;
-  if (top < 0)
-    top = 0;
-  if (right > dia_renderer_get_width_pixels (ddisp->renderer))
-    right = dia_renderer_get_width_pixels (ddisp->renderer);
-  if (bottom > dia_renderer_get_height_pixels (ddisp->renderer))
-    bottom = dia_renderer_get_height_pixels (ddisp->renderer);
-
-  /* draw some rectangles to show where updates are...*/
-  /*
-  gdk_draw_rectangle(gtk_widget_get_window(ddisp->canvas),
-                    gtk_widget_get_style(ddisp->canvas)->black_gc, TRUE,
-                    left, top, right-left,bottom-top);
-   */
-  /* Temporarily just do a union of all Irectangles: */
-  if (ddisp->display_areas==NULL) {
-    r = g_new(IRectangle,1);
-    r->top = top; r->bottom = bottom;
-    r->left = left; r->right = right;
-    ddisp->display_areas = g_slist_prepend(ddisp->display_areas, r);
-  } else {
-    r = (IRectangle *) ddisp->display_areas->data;
-
-    r->top = MIN( r->top, top );
-    r->bottom = MAX( r->bottom, bottom );
-    r->left = MIN( r->left, left );
-    r->right = MAX( r->right, right );
-  }
-}
-
-static gboolean
-ddisplay_update_handler(DDisplay *ddisp)
-{
-  GSList *l;
-  IRectangle *ir;
-  Rectangle *r, totrect;
-  DiaInteractiveRendererInterface *renderer;
-
-  g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
-
-  /* Renders updates to pixmap + copies display_areas to canvas(screen) */
-  renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
-
-  /* Only update if update_areas exist */
-  l = ddisp->update_areas;
-  if (l != NULL)
-  {
-    totrect = *(Rectangle *) l->data;
-
-    g_return_val_if_fail (   renderer->clip_region_clear != NULL
-                          && renderer->clip_region_add_rect != NULL, FALSE);
-
-    renderer->clip_region_clear (ddisp->renderer);
-
-    while(l!=NULL) {
-      r = (Rectangle *) l->data;
-
-      rectangle_union(&totrect, r);
-      renderer->clip_region_add_rect (ddisp->renderer, r);
-
-      l = g_slist_next(l);
-    }
-    /* Free update_areas list: */
-    ddisplay_free_update_areas(ddisp);
-
-    totrect.left -= 0.1;
-    totrect.right += 0.1;
-    totrect.top -= 0.1;
-    totrect.bottom += 0.1;
-
-    ddisplay_render_pixmap(ddisp, &totrect);
-  }
-
-  l = ddisp->display_areas;
-  while(l!=NULL) {
-    ir = (IRectangle *) l->data;
-
-    g_return_val_if_fail (renderer->copy_to_window, FALSE);
-    renderer->copy_to_window(ddisp->renderer,
-                             gtk_widget_get_window(ddisp->canvas),
-                             ir->left, ir->top,
-                             ir->right - ir->left, ir->bottom - ir->top);
-
-    l = g_slist_next(l);
-  }
-
-  ddisplay_free_display_areas(ddisp);
-
-  ddisp->update_id = 0;
-
-  return FALSE;
+  gtk_widget_queue_draw (ddisp->canvas);
 }
 
 void
@@ -579,12 +441,7 @@ ddisplay_flush(DDisplay *ddisp)
    * GTK_PRIORITY_RESIZE = (G_PRIORITY_HIGH_IDLE + 10)
    * Dia's canvas rendering is in between
    */
-  if (!ddisp->update_id)
-    ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler, 
ddisp, NULL);
-  if (ddisp->display_areas) {
-    IRectangle *r = (IRectangle *)ddisp->display_areas->data;
-    dia_log_message ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom);
-  }
+  gtk_widget_queue_draw (ddisp->canvas);
 }
 
 static void
@@ -1097,12 +954,6 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer)
   int width, height;
   GdkWindow *window = gtk_widget_get_window(ddisp->canvas);
 
-  /* dont mix new renderer with old updates */
-  if (ddisp->update_id) {
-    g_source_remove (ddisp->update_id);
-    ddisp->update_id = 0;
-  }
-
   if (ddisp->renderer)
     g_object_unref (ddisp->renderer);
 
@@ -1213,10 +1064,6 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */
     if (close_ddisp) /* saving succeeded */
       recent_file_history_add(ddisp->diagram->filename);
 
-    if (ddisp->update_id && close_ddisp) {
-      g_source_remove (ddisp->update_id);
-      ddisp->update_id = 0;
-    }
     /* fall through */
   case GTK_RESPONSE_NO :
     if (close_ddisp)
@@ -1351,12 +1198,6 @@ ddisplay_really_destroy(DDisplay *ddisp)
   if (active_display == ddisp)
     display_set_active(NULL);
 
-  /* last chance to avoid crashing in the idle update */
-  if (ddisp->update_id) {
-    g_source_remove (ddisp->update_id);
-    ddisp->update_id = 0;
-  }
-
   if (ddisp->diagram) {
     diagram_remove_ddisplay(ddisp->diagram, ddisp);
     /* if we are the last user of the diagram it will be unref'ed */
@@ -1369,8 +1210,6 @@ ddisplay_really_destroy(DDisplay *ddisp)
 
   /* Free update_areas list: */
   ddisplay_free_update_areas(ddisp);
-  /* Free display_areas list */
-  ddisplay_free_display_areas(ddisp);
 
   g_free(ddisp);
 }
diff --git a/app/display.h b/app/display.h
index 6ec1a7f6..06242df1 100644
--- a/app/display.h
+++ b/app/display.h
@@ -83,8 +83,6 @@ struct _DDisplay {
   DiaRenderer *renderer;
   
   GSList *update_areas;           /* Update areas list                 */
-  GSList *display_areas;          /* Display areas list                */
-  guint update_id;                /* idle handler ID for redraws       */
 
   GtkIMContext *im_context;
 
@@ -135,9 +133,6 @@ void ddisplay_add_update_all(DDisplay *ddisp);
 void ddisplay_add_update_with_border(DDisplay *ddisp, const Rectangle *rect,
                                     int pixel_border);
 void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect);
-void ddisplay_add_display_area(DDisplay *ddisp,
-                              int left, int top,
-                              int right, int bottom);
 void ddisplay_flush(DDisplay *ddisp);
 void ddisplay_update_scrollbars(DDisplay *ddisp);
 void ddisplay_set_origo(DDisplay *ddisp,
diff --git a/app/interface.c b/app/interface.c
index fd32e492..8111f896 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -385,20 +385,61 @@ canvas_configure_event (GtkWidget         *widget,
   return new_size;
 }
 
-/* Got when an area previously obscured need to be redrawn.
- * Needs GDK_EXPOSURE_MASK.
- * Gone with gtk+-3.0 or better replaced by "draw".
- */
 static gboolean
 canvas_expose_event (GtkWidget      *widget,
                     GdkEventExpose *event,
                     DDisplay       *ddisp)
 {
-  ddisplay_add_display_area (ddisp,
-                            event->area.x, event->area.y,
-                            event->area.x + event->area.width,
-                            event->area.y + event->area.height);
-  ddisplay_flush(ddisp);
+  GSList *l;
+  Rectangle *r, totrect;
+  DiaInteractiveRendererInterface *renderer;
+
+  g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
+
+  /* Renders updates to pixmap + copies display_areas to canvas(screen) */
+  renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+
+  /* Only update if update_areas exist */
+  l = ddisp->update_areas;
+  if (l != NULL)
+  {
+    totrect = *(Rectangle *) l->data;
+
+    g_return_val_if_fail (   renderer->clip_region_clear != NULL
+                          && renderer->clip_region_add_rect != NULL, FALSE);
+
+    renderer->clip_region_clear (ddisp->renderer);
+
+    while(l!=NULL) {
+      r = (Rectangle *) l->data;
+
+      rectangle_union(&totrect, r);
+      renderer->clip_region_add_rect (ddisp->renderer, r);
+
+      l = g_slist_next(l);
+    }
+    /* Free update_areas list: */
+    l = ddisp->update_areas;
+    while(l!=NULL) {
+      g_free(l->data);
+      l = g_slist_next(l);
+    }
+    g_slist_free(ddisp->update_areas);
+    ddisp->update_areas = NULL;
+
+    totrect.left -= 0.1;
+    totrect.right += 0.1;
+    totrect.top -= 0.1;
+    totrect.bottom += 0.1;
+
+    ddisplay_render_pixmap(ddisp, &totrect);
+  }
+
+  dia_interactive_renderer_paint (ddisp->renderer,
+                                  ctx,
+                                  gtk_widget_get_allocated_width (widget),
+                                  gtk_widget_get_allocated_height (widget));
+
   return FALSE;
 }
 
diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c
index 04197970..6d0976de 100644
--- a/lib/diainteractiverenderer.c
+++ b/lib/diainteractiverenderer.c
@@ -31,7 +31,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
   iface->draw_pixel_line = NULL;
   iface->draw_pixel_rect = NULL;
   iface->fill_pixel_rect = NULL;
-  iface->copy_to_window = NULL;
+  iface->paint = NULL;
   iface->set_size = NULL;
   iface->draw_object_highlighted = NULL;
 }
@@ -78,3 +78,17 @@ dia_renderer_set_size (DiaRenderer* renderer, gpointer window,
   irenderer->set_size (renderer, window, width, height);
 }
 
+void
+dia_interactive_renderer_paint (DiaRenderer *renderer,
+                                cairo_t     *ctx, 
+                                int          width,
+                                int          height)
+{
+  DiaInteractiveRendererInterface *irenderer =
+    DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+  
+  g_return_if_fail (irenderer != NULL);
+  g_return_if_fail (irenderer->paint != NULL);
+
+  irenderer->paint (renderer, ctx, width, height);
+}
\ No newline at end of file
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 368becac..eb9849d9 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -90,7 +90,7 @@ struct _DiaRendererClass
   int (*get_height_pixels) (DiaRenderer*);
   /*! \brief Render all the visible object in the layer */
   void (*draw_layer) (DiaRenderer*, Layer *, gboolean, Rectangle *);
-  /*! Calls the objects draw function, which calls the renderer again 
+  /*! Calls the objects draw function, which calls the renderer again
    *  Affine transformation is mostly done on the renderer side for matrix!=NULL */
   void (*draw_object) (DiaRenderer*, DiaObject*, DiaMatrix*);
   /*! Returns the EXACT width of text in cm, using the current font.
@@ -102,8 +102,8 @@ struct _DiaRendererClass
                           const gchar *text, int length);
 
 
-  /* 
-   * Function which MUST be implemented by any DiaRenderer 
+  /*
+   * Function which MUST be implemented by any DiaRenderer
    */
   /*! Called before rendering begins.
      Can be used to do various pre-rendering setup. */
@@ -165,9 +165,9 @@ struct _DiaRendererClass
                       real width, real height,
                       DiaImage *image);
 
-  /* 
+  /*
    * Functions which SHOULD be implemented by specific renderer, but
-   * have a default implementation based on the above functions 
+   * have a default implementation based on the above functions
    */
   /*! Draw a bezier curve, given it's control points. */
   void (*draw_bezier) (DiaRenderer *renderer,
@@ -197,7 +197,7 @@ struct _DiaRendererClass
                      Color *fill, Color *stroke);
 
   /*
-   * Highest level functions, probably only to be implemented by 
+   * Highest level functions, probably only to be implemented by
    * special 'high level' renderers
    */
   /*! Draw a rounded rectangle, given its upper-left and lower-right corners */
@@ -211,14 +211,14 @@ struct _DiaRendererClass
                          Color *color, real radius );
 
   /*! Highest level function doing specific arrow positioning */
-  void (*draw_line_with_arrows)  (DiaRenderer *renderer, 
-                                  Point *start, Point *end, 
+  void (*draw_line_with_arrows)  (DiaRenderer *renderer,
+                                  Point *start, Point *end,
                                   real line_width,
                                   Color *line_color,
                                   Arrow *start_arrow,
                                   Arrow *end_arrow);
   /*! Highest level function doing specific arrow positioning */
-  void (*draw_arc_with_arrows)  (DiaRenderer *renderer, 
+  void (*draw_arc_with_arrows)  (DiaRenderer *renderer,
                                  Point *start, Point *end,
                                  Point *midpoint,
                                  real line_width,
@@ -226,13 +226,13 @@ struct _DiaRendererClass
                                  Arrow *start_arrow,
                                  Arrow *end_arrow);
   /*! Highest level function doing specific arrow positioning */
-  void (*draw_polyline_with_arrows) (DiaRenderer *renderer, 
+  void (*draw_polyline_with_arrows) (DiaRenderer *renderer,
                                      Point *points, int num_points,
                                      real line_width,
                                      Color *color,
                                      Arrow *start_arrow,
                                      Arrow *end_arrow);
-  void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer, 
+  void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer,
                                      Point *points, int num_points,
                                      real line_width,
                                      Color *color,
@@ -240,7 +240,7 @@ struct _DiaRendererClass
                                      Arrow *end_arrow,
                                      real radius);
 
-  void (*draw_bezier_with_arrows) (DiaRenderer *renderer, 
+  void (*draw_bezier_with_arrows) (DiaRenderer *renderer,
                                    BezPoint *points,
                                    int num_points,
                                    real line_width,
@@ -303,10 +303,11 @@ struct _DiaInteractiveRendererInterface
   void (*fill_pixel_rect)      (DiaRenderer *renderer,
                                 int x, int y, int width, int height,
                                 Color *color);
-  /*! Copy already rendered content to the given window */
-  void (*copy_to_window)      (DiaRenderer *renderer,
-                               gpointer     window, 
-                               int x, int y, int width, int height);
+  /*! Copy already rendered content to the given context */
+  void (*paint)               (DiaRenderer *renderer,
+                               cairo_t     *ctx,
+                               int          width,
+                               int          height);
   /*! Support for drawing selected objects highlighted */
   void (*draw_object_highlighted) (DiaRenderer *renderer,
                                   DiaObject *object,
@@ -314,6 +315,12 @@ struct _DiaInteractiveRendererInterface
 };
 
 GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST;
+
+void dia_interactive_renderer_paint (DiaRenderer *renderer,
+                                     cairo_t     *ctx,
+                                     int          width,
+                                     int          height);
+
 /*!
  * \brief Size adjustment to the given window
  * \memberof DiaInteractiveRendererInterface
diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c
index d4132263..c92c62b0 100644
--- a/lib/renderer/diacairo-interactive.c
+++ b/lib/renderer/diacairo-interactive.c
@@ -80,12 +80,13 @@ static void fill_pixel_rect(DiaRenderer *renderer,
                             int x, int y,
                             int width, int height,
                             Color *color);
-static void set_size (DiaRenderer *renderer, 
+static void set_size (DiaRenderer *renderer,
                       gpointer window,
                       int width, int height);
-static void copy_to_window (DiaRenderer *renderer, 
-                gpointer window,
-                int x, int y, int width, int height);
+static void paint        (DiaRenderer *renderer,
+                          cairo_t     *ctx,
+                          int          width,
+                          int          height);
 
 static void cairo_interactive_renderer_get_property (GObject         *object,
                         guint            prop_id,
@@ -105,14 +106,14 @@ enum {
 
 static int
 get_width_pixels (DiaRenderer *object)
-{ 
+{
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   return renderer->width;
 }
 
 static int
 get_height_pixels (DiaRenderer *object)
-{ 
+{
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   return renderer->height;
 }
@@ -128,9 +129,9 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
   DiaRenderer *dia_renderer = DIA_RENDERER(object);
-  
+
   dia_renderer->is_interactive = 1;
-  
+
   renderer->pixmap = NULL;
 
   renderer->highlight_color = NULL;
@@ -189,7 +190,7 @@ calculate_relative_luminance (const Color *c)
 
   return 0.2126 * R + 0.7152 * G + 0.0722 * B;
 }
-static void 
+static void
 draw_text_line (DiaRenderer *self, TextLine *text_line,
                Point *pos, Alignment alignment, Color *color)
 {
@@ -209,7 +210,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
     real x = pos->x;
     real y = pos->y;
 
-    y -= text_line_get_ascent(text_line);    
+    y -= text_line_get_ascent(text_line);
     x -= text_line_get_alignment_adjustment (text_line, alignment);
 
     rl = calculate_relative_luminance (color) + 0.05;
@@ -218,17 +219,17 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
     cr2 = calculate_relative_luminance (&alternate_color) + 0.05;
     cr2 = (cr2 > rl) ? cr2 / rl : rl / cr2;
 
-    /* use color giving the better contrast ratio, if necessary 
+    /* use color giving the better contrast ratio, if necessary
      * http://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast
      */
     if (cr1 > cr2)
-      cairo_set_source_rgba (renderer->cr, 
+      cairo_set_source_rgba (renderer->cr,
                           interactive->highlight_color->red,
                           interactive->highlight_color->green,
                           interactive->highlight_color->blue,
                           1.0);
     else
-      cairo_set_source_rgba (renderer->cr, 
+      cairo_set_source_rgba (renderer->cr,
                           alternate_color.red,
                           alternate_color.green,
                           alternate_color.blue,
@@ -240,7 +241,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
   DIA_RENDERER_CLASS (parent_class)->draw_text_line (self, text_line, pos, alignment, color);
 }
 static void
-draw_object_highlighted (DiaRenderer     *self, 
+draw_object_highlighted (DiaRenderer     *self,
                         DiaObject       *object,
                         DiaHighlightType type)
 {
@@ -263,7 +264,7 @@ draw_object_highlighted (DiaRenderer     *self,
   /* always reset when done with this object */
   interactive->highlight_color = NULL;
 }
-static void 
+static void
 dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface)
 {
   iface->clip_region_clear = clip_region_clear;
@@ -271,7 +272,7 @@ dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* ifac
   iface->draw_pixel_line = draw_pixel_line;
   iface->draw_pixel_rect = draw_pixel_rect;
   iface->fill_pixel_rect = fill_pixel_rect;
-  iface->copy_to_window = copy_to_window;
+  iface->paint = paint;
   iface->set_size = set_size;
   iface->draw_object_highlighted = draw_object_highlighted;
 }
@@ -296,7 +297,7 @@ dia_cairo_interactive_renderer_get_type (void)
        (GInstanceInitFunc) cairo_interactive_renderer_init /* init */
       };
 
-      static const GInterfaceInfo irenderer_iface_info = 
+      static const GInterfaceInfo irenderer_iface_info =
       {
        (GInterfaceInitFunc) dia_cairo_interactive_renderer_iface_init,
        NULL,           /* iface_finalize */
@@ -313,7 +314,7 @@ dia_cairo_interactive_renderer_get_type (void)
                                    &irenderer_iface_info);
 
     }
-  
+
   return object_type;
 }
 
@@ -329,7 +330,7 @@ begin_render(DiaRenderer *self, const Rectangle *update)
   /* 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);
-  cairo_clip(base_renderer->cr); 
+  cairo_clip(base_renderer->cr);
 
   cairo_scale (base_renderer->cr, *renderer->zoom_factor, *renderer->zoom_factor);
   cairo_translate (base_renderer->cr, -renderer->visible->left, -renderer->visible->top);
@@ -389,7 +390,7 @@ cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass)
                                                        _("Visible rect pointer"),
                                                        _("Visible rect pointer"),
                                                        G_PARAM_READWRITE));
-                                                       
+
   /* renderer members */
   renderer_class->get_width_pixels  = get_width_pixels;
   renderer_class->get_height_pixels = get_height_pixels;
@@ -430,7 +431,7 @@ cairo_interactive_renderer_get_property (GObject         *object,
                         GParamSpec      *pspec)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
-  
+
   switch (prop_id) {
     case PROP_ZOOM:
       g_value_set_pointer (value, renderer->zoom_factor);
@@ -462,18 +463,19 @@ set_size(DiaRenderer *object, gpointer window,
 }
 
 static void
-copy_to_window (DiaRenderer *object, gpointer window,
-                int x, int y, int width, int height)
+paint (DiaRenderer *object,
+       cairo_t     *ctx,
+       int          width,
+       int          height)
 {
   DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
-  cairo_t *cr;
-
-  cr = gdk_cairo_create (GDK_WINDOW(window));
-  cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0);
-  cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height);
-  cairo_clip (cr);
-  cairo_paint (cr);
-  cairo_destroy (cr);
+
+  cairo_save (ctx);
+  cairo_set_source_surface (ctx, renderer->pixmap, 0.0, 0.0);
+  cairo_rectangle (ctx, 0, 0, width > 0 ? width : -width, height > 0 ? height : -height);
+  cairo_clip (ctx);
+  cairo_paint (ctx);
+  cairo_restore (ctx);
 }
 
 static void
@@ -502,7 +504,7 @@ clip_region_add_rect(DiaRenderer *object,
   dia_transform_coords(transform, rect->left, rect->top,  &x1, &y1);
   dia_transform_coords(transform, rect->right, rect->bottom,  &x2, &y2);
   g_object_unref(transform);
-  
+
   clip_rect.x = x1;
   clip_rect.y = y1;
   clip_rect.width = x2 - x1 + 1;
@@ -521,7 +523,7 @@ draw_pixel_line(DiaRenderer *object,
   double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5;
   double lw[2];
   lw[0] = 1; lw[1] = 0;
-  
+
   cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
   cairo_set_line_width (renderer->cr, lw[0]);
 
@@ -544,7 +546,7 @@ draw_pixel_rect(DiaRenderer *object,
   double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
   double lw[2];
   lw[0] = 1; lw[1] = 0;
-  
+
   cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
   cairo_set_line_width (renderer->cr, lw[0]);
 
@@ -566,7 +568,7 @@ fill_pixel_rect(DiaRenderer *object,
   double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
   double lw[2];
   lw[0] = 1; lw[1] = 0;
-  
+
   cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
   cairo_set_line_width (renderer->cr, lw[0]);
 
@@ -582,4 +584,4 @@ DiaRenderer *
 dia_cairo_interactive_renderer_new ()
 {
   return g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL);
-}
\ No newline at end of file
+}


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