[dia] Implement ShapeRenderer::draw_rounded_rect()



commit ffa5cde22786141bc18a7c95dffd4424c3e04c89
Author: Hans Breuer <hans breuer org>
Date:   Sun Aug 24 15:51:15 2014 +0200

    Implement ShapeRenderer::draw_rounded_rect()
    
    The custom shape module can handle rect with radius for some time. Still
    the shape exporter was creating stepwise arc/line shapes with a lot of
    superfluous connection points. Now it's just doing the same number of
    connection points as the original object (if it was Standard - Box)

 lib/diasvgrenderer.c          |   34 +++++++++++++++
 plug-ins/shape/shape-export.c |   91 +++++++++++++++++++++++++++-------------
 plug-ins/svg/render_svg.c     |   35 ----------------
 3 files changed, 95 insertions(+), 65 deletions(-)
---
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 034c12c..d148775 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -820,6 +820,37 @@ draw_image(DiaRenderer *self,
   g_free (uri);
 }
 
+/*!
+ * \brief creation of rectangles with corner radius
+ * \memberof SvgRenderer
+ */
+static void
+draw_rounded_rect (DiaRenderer *self, 
+                  Point *ul_corner, Point *lr_corner,
+                  Color *fill, Color *stroke, real rounding)
+{
+  DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
+  xmlNodePtr node;
+  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+
+  node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"rect", NULL);
+
+  xmlSetProp(node, (const xmlChar *)"style",
+            (const xmlChar *)DIA_SVG_RENDERER_GET_CLASS(self)->get_draw_style (renderer, fill, stroke));
+
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->x * renderer->scale);
+  xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) buf);
+  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->y * renderer->scale);
+  xmlSetProp(node, (const xmlChar *)"y", (xmlChar *) buf);
+  g_ascii_formatd(buf, sizeof(buf), "%g", (lr_corner->x - ul_corner->x) * renderer->scale);
+  xmlSetProp(node, (const xmlChar *)"width", (xmlChar *) buf);
+  g_ascii_formatd(buf, sizeof(buf), "%g", (lr_corner->y - ul_corner->y) * renderer->scale);
+  xmlSetProp(node, (const xmlChar *)"height", (xmlChar *) buf);
+  g_ascii_formatd(buf, sizeof(buf),"%g", (rounding * renderer->scale));
+  xmlSetProp(node, (const xmlChar *)"rx", (xmlChar *) buf);
+  xmlSetProp(node, (const xmlChar *)"ry", (xmlChar *) buf);
+}
+
 /* constructor */
 static void
 dia_svg_renderer_init (GTypeInstance *self, gpointer g_class)
@@ -911,6 +942,9 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
   renderer_class->draw_beziergon = draw_beziergon;
   renderer_class->draw_text_line  = draw_text_line;
 
+  /* high level */
+  renderer_class->draw_rounded_rect = draw_rounded_rect;
+
   /* SVG specific */
   svg_renderer_class->get_draw_style = get_draw_style;
 }
diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index c1ca0a0..d3ae9a4 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -24,7 +24,7 @@
  */
 /*
  * TODO:
- *   - While porting to use DiaSvgRenderer I removved all connection point
+ *   - While porting to use DiaSvgRenderer I removed all connection point
        adding to fill_* methods with the assumption that they always have
        a corresponding draw_* method call where the connection points are 
        already added. Correct me if I'm wrong ...                    --hb 
@@ -115,6 +115,9 @@ static void draw_polygon(DiaRenderer *self,
 static void draw_rect(DiaRenderer *self, 
                      Point *ul_corner, Point *lr_corner,
                      Color *fill, Color *stroke);
+static void draw_rounded_rect (DiaRenderer *self, 
+                              Point *ul_corner, Point *lr_corner,
+                              Color *fill, Color *stroke, real rounding);
 static void draw_ellipse(DiaRenderer *self, 
                         Point *center,
                         real width, real height,
@@ -125,7 +128,7 @@ static void add_connection_point(ShapeRenderer *renderer,
                                  Point *point, gboolean design_connection, 
                                  gboolean main_point);
 static void add_rectangle_connection_points(ShapeRenderer *renderer,
-                                            Point *ul_corner, Point *lr_corner);
+                                            Point *ul_corner, Point *lr_corner, real r);
 static void add_ellipse_connection_points(ShapeRenderer *renderer,
                                           Point *center,
                                           real width, real height);      
@@ -252,6 +255,7 @@ shape_renderer_class_init (ShapeRendererClass *klass)
   renderer_class->draw_polyline = draw_polyline;
   renderer_class->draw_polygon = draw_polygon;
   renderer_class->draw_rect = draw_rect;
+  renderer_class->draw_rounded_rect = draw_rounded_rect;
   renderer_class->draw_ellipse = draw_ellipse;
 }
 
@@ -436,34 +440,47 @@ draw_polygon(DiaRenderer *self,
 
 static void
 add_rectangle_connection_points (ShapeRenderer *renderer,
-                                 Point *ul_corner, Point *lr_corner) 
+                                 Point *ul_corner, Point *lr_corner, real r) 
 {
-  Point connection;
-  coord center_x, center_y;
- 
-  center_x = (ul_corner->x + lr_corner->x)/2;
-  center_y = (ul_corner->y + lr_corner->y)/2;
-    
-  add_connection_point(renderer, ul_corner, FALSE, FALSE);
-  add_connection_point(renderer, lr_corner, FALSE, FALSE);
-  connection.x = ul_corner->x;
-  connection.y = lr_corner->y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-  connection.y = center_y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-  
-  connection.x = lr_corner->x;
-  connection.y = ul_corner->y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-  connection.y = center_y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-  
-  connection.x = center_x;
-  connection.y = lr_corner->y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-  connection.y = ul_corner->y;
-  add_connection_point(renderer, &connection, FALSE, FALSE);
-}   
+  Point pos;
+  Point center;
+  real width, height;
+
+  width = lr_corner->x - ul_corner->x;
+  height = lr_corner->y - ul_corner->y;
+  r = MIN(width/2, r);
+  r = MIN(height/2, r);
+  r *= (1-M_SQRT1_2);
+
+  /* connection points in the same order as the handles are */
+  pos.x = ul_corner->x + r; /* NW */
+  pos.y = ul_corner->y + r;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + width/2; /* N */
+  pos.y = ul_corner->y;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + width - r; /* NE */
+  pos.y = ul_corner->y + r;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + width; /* E */
+  pos.y = ul_corner->y + height/2;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + width - r; /* SE */
+  pos.y = ul_corner->y + height - r;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + width/2; /* S */
+  pos.y = ul_corner->y + height;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x + r; /* SW */
+  pos.y = ul_corner->y + height - r;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = ul_corner->x; /* W */
+  pos.y = ul_corner->y + height/2;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+  pos.x = (ul_corner->x + lr_corner->x)/2; /* center */
+  pos.y = (ul_corner->y + lr_corner->y)/2;
+  add_connection_point(renderer, &pos, FALSE, FALSE);
+}
     
 
 static void
@@ -477,7 +494,21 @@ draw_rect (DiaRenderer *self,
   DIA_RENDERER_CLASS(parent_class)->draw_rect (self, ul_corner, lr_corner, fill, stroke);
   /* do our own stuff */
   if (stroke)
-    add_rectangle_connection_points(renderer, ul_corner, lr_corner);
+    add_rectangle_connection_points(renderer, ul_corner, lr_corner, 0.0);
+}
+
+static void
+draw_rounded_rect (DiaRenderer *self, 
+                  Point *ul_corner, Point *lr_corner,
+                  Color *fill, Color *stroke, real rounding)
+{
+  ShapeRenderer *renderer = SHAPE_RENDERER(self);
+
+  /* use base class implementation */
+  DIA_RENDERER_CLASS(parent_class)->draw_rounded_rect (self, ul_corner, lr_corner, fill, stroke, rounding);
+  /* do our own stuff */
+  if (stroke)
+    add_rectangle_connection_points(renderer, ul_corner, lr_corner, rounding);
 }
 
 static void 
diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c
index 67bc975..1606cdb 100644
--- a/plug-ins/svg/render_svg.c
+++ b/plug-ins/svg/render_svg.c
@@ -101,9 +101,6 @@ static void draw_layer (DiaRenderer *self,
 static void draw_object       (DiaRenderer *renderer,
                                DiaObject   *object,
                               DiaMatrix   *matrix);
-static void draw_rounded_rect (DiaRenderer *renderer, 
-                               Point *ul_corner, Point *lr_corner,
-                               Color *fill, Color *stroke, real rounding);
 static void draw_string       (DiaRenderer *self,
                               const char *text,
                               Point *pos, Alignment alignment,
@@ -217,7 +214,6 @@ svg_renderer_class_init (SvgRendererClass *klass)
   renderer_class->end_render = end_render;
   renderer_class->draw_layer = draw_layer;
   renderer_class->draw_object = draw_object;
-  renderer_class->draw_rounded_rect = draw_rounded_rect;
   renderer_class->draw_string  = draw_string;
   renderer_class->draw_text  = draw_text;
   renderer_class->draw_text_line  = draw_text_line;
@@ -357,37 +353,6 @@ draw_object(DiaRenderer *self,
   }
 }
 
-/*!
- * \brief creation of rectangles with corner radius
- * \memberof SvgRenderer
- */
-static void
-draw_rounded_rect (DiaRenderer *self, 
-                  Point *ul_corner, Point *lr_corner,
-                  Color *fill, Color *stroke, real rounding)
-{
-  DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
-  xmlNodePtr node;
-  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-
-  node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"rect", NULL);
-
-  xmlSetProp(node, (const xmlChar *)"style",
-            (const xmlChar *)DIA_SVG_RENDERER_GET_CLASS(self)->get_draw_style (renderer, fill, stroke));
-
-  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->x * renderer->scale);
-  xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) buf);
-  g_ascii_formatd(buf, sizeof(buf), "%g", ul_corner->y * renderer->scale);
-  xmlSetProp(node, (const xmlChar *)"y", (xmlChar *) buf);
-  g_ascii_formatd(buf, sizeof(buf), "%g", (lr_corner->x - ul_corner->x) * renderer->scale);
-  xmlSetProp(node, (const xmlChar *)"width", (xmlChar *) buf);
-  g_ascii_formatd(buf, sizeof(buf), "%g", (lr_corner->y - ul_corner->y) * renderer->scale);
-  xmlSetProp(node, (const xmlChar *)"height", (xmlChar *) buf);
-  g_ascii_formatd(buf, sizeof(buf),"%g", (rounding * renderer->scale));
-  xmlSetProp(node, (const xmlChar *)"rx", (xmlChar *) buf);
-  xmlSetProp(node, (const xmlChar *)"ry", (xmlChar *) buf);
-}
-
 #define dia_svg_dtostr(buf,d) \
   g_ascii_formatd(buf,sizeof(buf),"%g",(d)*renderer->scale)
 


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