[dia] Implement ShapeRenderer::draw_rounded_rect()
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] Implement ShapeRenderer::draw_rounded_rect()
- Date: Sun, 24 Aug 2014 15:27:18 +0000 (UTC)
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]