[dia] [restructuring] move render with holes function to lib



commit 9a6edfa20def0e44d95b91edb18e5f3c49e5c4f8
Author: Hans Breuer <hans breuer org>
Date:   Tue Oct 2 20:52:07 2012 +0200

    [restructuring] move render with holes function to lib

 lib/diarenderer.c          |   64 ++++++++++++++++++++++++++++++++++++++++++-
 lib/diarenderer.h          |    4 +++
 lib/libdia.def             |    2 +
 objects/standard/outline.c |   55 +++++---------------------------------
 4 files changed, 75 insertions(+), 50 deletions(-)
---
diff --git a/lib/diarenderer.c b/lib/diarenderer.c
index da3f5ee..2e418ab 100644
--- a/lib/diarenderer.c
+++ b/lib/diarenderer.c
@@ -489,7 +489,7 @@ draw_text (DiaRenderer *renderer,
   int i;
 
   pos = text->position;
-  
+
   for (i=0;i<text->numlines;i++) {
     TextLine *text_line = text->lines[i];
 
@@ -538,7 +538,7 @@ draw_image (DiaRenderer *renderer,
  * [ 1  0  0  0]
  * (At least that's what Hearn and Baker says for beziers.)
  */
-#define BEZIER_SUBDIVIDE_LIMIT 0.01
+#define BEZIER_SUBDIVIDE_LIMIT 0.001
 #define BEZIER_SUBDIVIDE_LIMIT_SQ (BEZIER_SUBDIVIDE_LIMIT*BEZIER_SUBDIVIDE_LIMIT)
 
 static void
@@ -1541,3 +1541,63 @@ dia_renderer_get_height_pixels (DiaRenderer *renderer)
   return DIA_RENDERER_GET_CLASS(renderer)->get_height_pixels (renderer);
 }
 
+/*!
+ * \brief Helper function to fill bezier with multiple BEZ_MOVE_TO
+ * \memberof DiaRenderer
+ */
+void
+bezier_render_fill (DiaRenderer *renderer, BezPoint *pts, int total, Color *color)
+{
+  int i, n = 0;
+  /* first draw the fills */
+  int s1 = 0, n1 = 0;
+  int s2 = 0;
+  for (i = 1; i < total; ++i) {
+    if (BEZ_MOVE_TO == pts[i].type) {
+      /* check whether the start point of the second outline is within the first outline. 
+       * If so it need to be subtracted - currently blanked. */
+      real dist = distance_bez_shape_point (&pts[s1],  n1 > 0 ? n1 : i - s1, 0, &pts[i].p1);
+      if (s2 > s1) { /* blanking the previous one */
+	n = i - s2 - 1;
+	DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s2], n, &color_white);
+      } else { /* fill the outer shape */
+	n1 = n = i - s1;
+	DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s1], n, color);
+      }
+      if (dist > 0) { /* remember as new outer outline */
+	s1 = i;
+	n1 = 0;
+	s2 = 0;
+      } else {
+	s2 = i;
+      }
+    }
+  }
+  /* the last one is not drawn yet */
+  if (s2 > s1) { /* blanking the previous one */
+    if (s2 - i - 1 > 1) /* depending on the above we may be ready */
+      DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s2], s2 - i - 1, &color_white);
+  } else {
+    if (s1 - i - 1 > 1)
+      DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s1], s1 - i - 1, color);
+  }
+}
+
+/*!
+ * \brief Helper function to stroke a bezier with multiple BEZ_MOVE_TO
+ * \memberof DiaRenderer
+ */
+void
+bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color)
+{
+  int i, n = 0;
+  for (i = 1; i < total; ++i) {
+    if (BEZ_MOVE_TO == pts[i].type) {
+      DIA_RENDERER_GET_CLASS (renderer)->draw_bezier (renderer, &pts[n], i - n, color);
+      n = i;
+    }
+  }
+  /* the last one, if there is one */
+  if (i - n - 1 > 0)
+    DIA_RENDERER_GET_CLASS (renderer)->draw_bezier (renderer, &pts[n], i - n - 1, color);
+}
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index e20390e..7ba9588 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -341,6 +341,10 @@ int  dia_renderer_get_width_pixels  (DiaRenderer*);
  */
 int  dia_renderer_get_height_pixels (DiaRenderer*);
 
+/* Some standalone render helper functiions */
+void bezier_render_fill   (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
+void bezier_render_stroke (DiaRenderer *renderer, BezPoint *pts, int total, Color *color);
+
 G_END_DECLS
 
 #endif /* DIA_RENDERER_H */
diff --git a/lib/libdia.def b/lib/libdia.def
index d2d0b4b..979e74a 100644
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -38,6 +38,8 @@ EXPORTS
  new_attribute
 
  bezier_draw_control_lines
+ bezier_render_stroke
+ bezier_render_fill
  beziercommon_set_points
 
  bezierconn_add_segment
diff --git a/objects/standard/outline.c b/objects/standard/outline.c
index b40794e..a01a0f7 100644
--- a/objects/standard/outline.c
+++ b/objects/standard/outline.c
@@ -33,6 +33,7 @@
 #include "attributes.h"
 #include "properties.h"
 #include "boundingbox.h"
+#include "standard-path.h"
 
 #include "tool-icons.h"
 
@@ -243,7 +244,7 @@ write_nul (void                *closure,
 }
 /*! Not in the object interface but still required */
 static void
-outine_update_handles(Outline *outline)
+outline_update_handles(Outline *outline)
 {
   DiaObject *obj = &outline->object;
 
@@ -317,7 +318,7 @@ outline_update_data (Outline *outline)
     polyline_bbox (&outline->ink_rect[0], 4, &bbex, TRUE, &obj->bounding_box);
   }
 
-  outine_update_handles (outline),
+  outline_update_handles (outline),
 
   cairo_move_to (cr, -extents.x_bearing, -extents.y_bearing);
 
@@ -405,51 +406,9 @@ outline_draw(Outline *outline, DiaRenderer *renderer)
     return; /* that was easy ;) */
   }
   /* otherwise split the path data into piece which can be handled by Dia's standard bezier rendering */
-  if (outline->show_background) {
-    /* first draw the fills */
-    int s1 = 0, n1 = 0;
-    int s2 = 0;
-    for (i = 1; i < total; ++i) {
-      if (BEZ_MOVE_TO == pts[i].type) {
-        /* check whether the start point of the second outline is within the first outline. 
-	 * If so it need to be subtracted - currently blanked. */
-	real dist = distance_bez_shape_point (&pts[s1], 
-	  n1 > 0 ? n1 : i - s1, 0, &pts[i].p1);
-	if (s2 > s1) { /* blanking the previous one */
-	  n = i - s2 - 1;
-          DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s2], n, &color_white);
-	} else { /* fill the outer shape */
-	  n1 = n = i - s1;
-          DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s1], n, &outline->fill_color);
-	}
-	if (dist > 0) { /* remember as new outer outline */
-	  s1 = i;
-	  n1 = 0;
-	  s2 = 0;
-	} else {
-	  s2 = i;
-	}
-      }
-    }
-    /* the last one is not drawn yet */
-    if (s2 > s1) { /* blanking the previous one */
-      if (s2 - i - 1 > 1) /* depending on the above we may be ready */
-        DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s2], s2 - i - 1, &color_white);
-    } else {
-      if (s1 - i - 1 > 1)
-        DIA_RENDERER_GET_CLASS (renderer)->fill_bezier (renderer, &pts[s1], s1 - i - 1, &outline->fill_color);
-    }
-  } /* show_background */
-  n = 0;
-  for (i = 1; i < total; ++i) {
-    if (BEZ_MOVE_TO == pts[i].type) {
-      DIA_RENDERER_GET_CLASS (renderer)->draw_bezier (renderer, &pts[n], i - n, &outline->line_color);
-      n = i;
-    }
-  }
-  /* the last one, if there is one */
-  if (i - n - 1 > 0)
-    DIA_RENDERER_GET_CLASS (renderer)->draw_bezier (renderer, &pts[n], i - n - 1, &outline->line_color);
+  if (outline->show_background)
+    bezier_render_fill (renderer, pts, total, &outline->fill_color);
+  bezier_render_stroke (renderer, pts, total, &outline->line_color);
 }
 /*!
  * \brief Optionally deliver an object specific menu
@@ -586,7 +545,7 @@ static void
 outline_select (Outline *outline, Point *clicked_point,
 		DiaRenderer *interactive_renderer)
 {
-  outine_update_handles (outline);
+  outline_update_handles (outline);
 }
 
 #endif /* HAVE_CAIRO */



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