[dia] [transform] interface changes to do transformations on the rendering level



commit cd3b2398704b7c08b9c3e42cd32bac2c78dc7370
Author: Hans Breuer <hans breuer org>
Date:   Sun Sep 12 14:06:47 2010 +0200

    [transform] interface changes to do transformations on the rendering level
    
     - remove superfluous Renderer::draw_object() implementations
     - adapt remaining renderers interface and use

 app/display.c                             |    2 +-
 bindings/dia-renderer.cpp                 |    2 +-
 lib/diagdkrenderer.c                      |   10 ----------
 lib/diarenderer.c                         |    3 ++-
 lib/diarenderer.h                         |   10 ++++++----
 lib/diatypes.h                            |    1 +
 lib/geometry.h                            |   10 ++++++++++
 lib/group.c                               |    2 +-
 lib/layer.c                               |    2 +-
 lib/plug-ins.h                            |    2 +-
 plug-ins/drs/dia-render-script-renderer.c |    5 ++++-
 plug-ins/drs/dia-render-script.c          |    2 +-
 plug-ins/svg/render_svg.c                 |    6 ++++--
 plug-ins/vdx/vdx-export.c                 |    7 +++++--
 plug-ins/xfig/xfig-export.c               |    8 ++++++--
 15 files changed, 44 insertions(+), 28 deletions(-)
---
diff --git a/app/display.c b/app/display.c
index c9e27e5..4b7d76a 100644
--- a/app/display.c
+++ b/app/display.c
@@ -626,7 +626,7 @@ ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer,
   if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL)
     irenderer->draw_object_highlighted(renderer, obj, hltype);
   else /* maybe the renderer does not support highlighting */
-    DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
+    DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj, NULL);
 
   if (ddisp->show_cx_pts && 
       obj->parent_layer != NULL && obj->parent_layer->connectable) {
diff --git a/bindings/dia-renderer.cpp b/bindings/dia-renderer.cpp
index 46d65c3..a6c9645 100644
--- a/bindings/dia-renderer.cpp
+++ b/bindings/dia-renderer.cpp
@@ -45,7 +45,7 @@ void
 dia::Renderer::draw_object (Object* o)
 {
     assert (self);
-    DIA_RENDERER_GET_CLASS(self)->draw_object (self, o->Self());
+    DIA_RENDERER_GET_CLASS(self)->draw_object (self, o->Self(), NULL);
 }
 // Returns the EXACT width of text in cm, using the current font.
 double 
diff --git a/lib/diagdkrenderer.c b/lib/diagdkrenderer.c
index b74bc79..d2069dc 100644
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -36,7 +36,6 @@
 #include "color.h"
 #include "font.h"
 #include "text.h"
-#include "object.h"
 #include "textline.h"
 
 #include "time.h"
@@ -120,7 +119,6 @@ static void draw_rounded_rect (DiaRenderer *renderer,
 static void fill_rounded_rect (DiaRenderer *renderer,
                                Point *ul_corner, Point *lr_corner,
                                Color *color, real radius);
-static void draw_object (DiaRenderer *renderer, DiaObject *object);
 
 static real get_text_width (DiaRenderer *renderer,
                             const gchar *text, int length);
@@ -249,7 +247,6 @@ dia_gdk_renderer_class_init(DiaGdkRendererClass *klass)
   renderer_class->draw_rect = draw_rect;
   renderer_class->draw_polyline  = draw_polyline;
   renderer_class->draw_polygon   = draw_polygon;
-  renderer_class->draw_object    = draw_object;
 
   /* highest level functions */
   renderer_class->draw_rounded_rect = draw_rounded_rect;
@@ -1051,13 +1048,6 @@ fill_rounded_rect (DiaRenderer *self,
     fill_rect (self, ul_corner, lr_corner, color);
 }
 
-
-static void
-draw_object (DiaRenderer *renderer, DiaObject *object)
-{
-  object->ops->draw(object, renderer);
-}
-
 static int
 get_width_pixels (DiaRenderer *object)
 { 
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index 9ce063a..2081b0c 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -204,7 +204,8 @@ dia_renderer_get_type (void)
 
 static void
 draw_object (DiaRenderer *renderer,
-	   DiaObject *object) 
+	     DiaObject   *object,
+	     DiaMatrix   *matrix) 
 {
   object->ops->draw(object, renderer);
 }
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 0e5f706..0d78319 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -32,8 +32,9 @@
 G_BEGIN_DECLS
 
 typedef enum {
-  RENDER_HOLES = (1<<0),
-  RENDER_ALPHA = (1<<1)
+  RENDER_HOLES  = (1<<0),
+  RENDER_ALPHA  = (1<<1),
+  RENDER_AFFINE = (1<<2)
 } RenderCapability;
 
 /*! GObject boiler plate, create runtime information */
@@ -79,8 +80,9 @@ struct _DiaRendererClass
   int (*get_width_pixels) (DiaRenderer*);
   /*! return width in pixels, only for interactive renderers */
   int (*get_height_pixels) (DiaRenderer*);
-  /*! simply calls the objects draw function, which calls this again */
-  void (*draw_object) (DiaRenderer*, DiaObject*);
+  /*! Calls the objects draw function, which calls this again 
+   *  Affine transforamtion 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.
      There has been some confusion as to the definition of this.
      It used to say the width was in pixels, but actual width returned
diff --git a/lib/diatypes.h b/lib/diatypes.h
index 458facb..93c16e8 100644
--- a/lib/diatypes.h
+++ b/lib/diatypes.h
@@ -108,6 +108,7 @@ typedef struct _Point Point;
 typedef struct _Rectangle Rectangle;
 typedef struct _IntRectangle IntRectangle;
 typedef struct _BezPoint BezPoint;
+typedef struct _DiaMatrix DiaMatrix;
 
 /* In group.h: */
 typedef struct _Group Group;
diff --git a/lib/geometry.h b/lib/geometry.h
index 9ca1631..6d7eb8f 100644
--- a/lib/geometry.h
+++ b/lib/geometry.h
@@ -114,6 +114,16 @@ struct _BezPoint {
   Point p3; /*!< main point for 'true' bezier point */
 };
 
+/*!
+ * \brief DiaMatrix used for affine transformation
+ *
+ * The struct is intentionally binary compatible with cairo_matrix_t.
+ */
+struct _DiaMatrix {
+  real xx; real yx;
+  real xy; real yy;
+  real x0; real y0;
+};
 
 #define ROUND(x) ((int) floor((x)+0.5))
 
diff --git a/lib/group.c b/lib/group.c
index 838173b..93408c4 100644
--- a/lib/group.c
+++ b/lib/group.c
@@ -187,7 +187,7 @@ group_draw(Group *group, DiaRenderer *renderer)
   while (list != NULL) {
     obj = (DiaObject *) list->data;
     
-    DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
+    DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj, NULL);
 
     list = g_list_next(list);
   }
diff --git a/lib/layer.c b/lib/layer.c
index de30a8b..8cecf6e 100644
--- a/lib/layer.c
+++ b/lib/layer.c
@@ -39,7 +39,7 @@ normal_render(DiaObject *obj, DiaRenderer *renderer,
 	      int active_layer,
 	      gpointer data)
 {
-  DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
+  DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj, NULL);
 }
 
 
diff --git a/lib/plug-ins.h b/lib/plug-ins.h
index 902901f..33c2ecf 100644
--- a/lib/plug-ins.h
+++ b/lib/plug-ins.h
@@ -48,7 +48,7 @@ G_BEGIN_DECLS
  * The list is by no means complete. If in doubt about your change
  * please ask on dia-list or alternative increment ;-)      --hb
  */
-#define DIA_PLUGIN_API_VERSION 14
+#define DIA_PLUGIN_API_VERSION 15
 
 typedef enum {
   DIA_PLUGIN_INIT_OK,
diff --git a/plug-ins/drs/dia-render-script-renderer.c b/plug-ins/drs/dia-render-script-renderer.c
index c349153..2ac7bfa 100644
--- a/plug-ins/drs/dia-render-script-renderer.c
+++ b/plug-ins/drs/dia-render-script-renderer.c
@@ -95,7 +95,8 @@ drs_renderer_get_type (void)
  */ 
 static void 
 draw_object(DiaRenderer *self,
-            DiaObject *object) 
+            DiaObject   *object,
+	    DiaMatrix   *matrix)
 {
   DrsRenderer *renderer = DRS_RENDERER (self);
   xmlNodePtr node;
@@ -115,6 +116,8 @@ draw_object(DiaRenderer *self,
     props_node = xmlNewChild(node, NULL, (const xmlChar *)"properties", NULL);
     object_save_props (object, props_node);
   }
+  if (matrix)
+    g_warning ("DrsRender::draw_object ignored matrix!");
   /* TODO: special handling for group object? */
   {
     g_queue_push_tail (renderer->parents, renderer->root);
diff --git a/plug-ins/drs/dia-render-script.c b/plug-ins/drs/dia-render-script.c
index 28a772f..da079b6 100644
--- a/plug-ins/drs/dia-render-script.c
+++ b/plug-ins/drs/dia-render-script.c
@@ -86,7 +86,7 @@ drs_render_layer (DiaRenderer *self, Layer *layer, gboolean active)
   list = layer->objects;
   while (list!=NULL) {
     obj = (DiaObject *) list->data;
-    renderer_class->draw_object(self, obj);
+    renderer_class->draw_object(self, obj, NULL);
     list = g_list_next(list);
   }
 
diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c
index f7c69cb..be7e6ec 100644
--- a/plug-ins/svg/render_svg.c
+++ b/plug-ins/svg/render_svg.c
@@ -77,7 +77,8 @@ G_END_DECLS
 static DiaSvgRenderer *new_svg_renderer(DiagramData *data, const char *filename);
 
 static void draw_object       (DiaRenderer *renderer,
-                               DiaObject *object);
+                               DiaObject   *object,
+			       DiaMatrix   *matrix);
 static void draw_rounded_rect (DiaRenderer *renderer, 
                                Point *ul_corner, Point *lr_corner,
                                Color *colour, real rounding);
@@ -243,7 +244,8 @@ new_svg_renderer(DiagramData *data, const char *filename)
 
 static void 
 draw_object(DiaRenderer *self,
-            DiaObject *object) 
+            DiaObject   *object,
+	    DiaMatrix   *matrix)
 {
   /* wrap in  <g></g> 
    * We could try to be smart and count the objects we using for the object.
diff --git a/plug-ins/vdx/vdx-export.c b/plug-ins/vdx/vdx-export.c
index fa21ee7..8158943 100644
--- a/plug-ins/vdx/vdx-export.c
+++ b/plug-ins/vdx/vdx-export.c
@@ -2154,11 +2154,14 @@ static void fill_bezier(DiaRenderer *self,
 /** Render a Dia object
  * @param self a renderer
  * @param object an object
+ * @param matrix NULL for identity
  * @note No work done here - perhaps should push/pop renderer state
  */
 
-static void draw_object(DiaRenderer *self,
-			DiaObject *object)
+static void 
+draw_object (DiaRenderer *self,
+	     DiaObject   *object,
+	     DiaMatrix   *matrix)
 {
     VDXRenderer *renderer = VDX_RENDERER(self);
 
diff --git a/plug-ins/xfig/xfig-export.c b/plug-ins/xfig/xfig-export.c
index 4ae2e08..77af74c 100644
--- a/plug-ins/xfig/xfig-export.c
+++ b/plug-ins/xfig/xfig-export.c
@@ -171,7 +171,8 @@ static void draw_image(DiaRenderer *self,
 		       real width, real height,
 		       DiaImage *image);
 static void draw_object(DiaRenderer *self,
-			DiaObject *object);
+			DiaObject *object,
+			DiaMatrix *matrix);
 
 static void xfig_renderer_class_init (XfigRendererClass *klass);
 
@@ -1124,12 +1125,15 @@ draw_image(DiaRenderer *self,
 
 static void 
 draw_object(DiaRenderer *self,
-            DiaObject *object) 
+            DiaObject   *object,
+	    DiaMatrix   *matrix)
 {
   XfigRenderer *renderer = XFIG_RENDERER(self);
 
   if (!renderer->color_pass)
     fprintf(renderer->file, "6 0 0 0 0\n");
+  if (matrix)
+    g_warning ("XFigRenderer no transformations");
   object->ops->draw(object, DIA_RENDERER(renderer));
   if (!renderer->color_pass)
     fprintf(renderer->file, "-6\n");



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