[dia] [restructuring] move render with holes function to lib
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] [restructuring] move render with holes function to lib
- Date: Wed, 3 Oct 2012 20:03:11 +0000 (UTC)
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]