[dia] svg: remove superfluous "fill:none" from style attribute



commit bf88c55f980aeea4982ba5866c51faef5a06e7d9
Author: Hans Breuer <hans breuer org>
Date:   Fri May 9 23:22:20 2014 +0200

    svg: remove superfluous "fill:none" from style attribute
    
    with draw/fill functions being merged it is only consequent to also merge
    towards DiaSvgRenderer::get_draw_style()

 lib/diasvgrenderer.c          |  155 ++++++++++++++++-------------------------
 lib/diasvgrenderer.h          |    3 +-
 plug-ins/shape/shape-export.c |    9 +--
 plug-ins/svg/render_svg.c     |   42 ++++-------
 4 files changed, 80 insertions(+), 129 deletions(-)
---
diff --git a/lib/diasvgrenderer.c b/lib/diasvgrenderer.c
index 819f228..229efb2 100644
--- a/lib/diasvgrenderer.c
+++ b/lib/diasvgrenderer.c
@@ -365,7 +365,8 @@ set_pattern(DiaRenderer *self, DiaPattern *pattern)
 /* the return value of this function should not be saved anywhere */
 static const gchar *
 get_draw_style(DiaSvgRenderer *renderer,
-              Color *colour)
+              Color *fill,
+              Color *stroke)
 {
   static GString *str = NULL;
   gchar linewidth_buf[DTOSTR_BUF_SIZE];
@@ -375,48 +376,45 @@ get_draw_style(DiaSvgRenderer *renderer,
     str = g_string_new(NULL);
   g_string_truncate(str, 0);
 
-  g_string_printf(str, "fill: none; stroke-opacity: %s; stroke-width: %s", 
-                 g_ascii_formatd (alpha_buf, sizeof(alpha_buf), "%g", colour->alpha), 
-                 dia_svg_dtostr(linewidth_buf, renderer->linewidth) );
-  if (strcmp(renderer->linecap, "butt"))
-    g_string_append_printf(str, "; stroke-linecap: %s", renderer->linecap);
-  if (strcmp(renderer->linejoin, "miter"))
-    g_string_append_printf(str, "; stroke-linejoin: %s", renderer->linejoin);
-  if (renderer->linestyle)
-    g_string_append_printf(str, "; stroke-dasharray: %s", renderer->linestyle);
-
-  if (colour)
-    g_string_append_printf(str, "; stroke: #%02x%02x%02x",
-                     (int)(255*colour->red), 
-                     (int)(255*colour->green),
-                     (int)(255*colour->blue));
-
-  return str->str;
-}
-
-/* the return value of this function should not be saved anywhere */
-static const gchar *
-get_fill_style(DiaSvgRenderer *renderer,
-              Color *colour)
-{
-  static GString *str = NULL;
-  gchar alpha_buf[DTOSTR_BUF_SIZE];
+  /* we only append a semicolon with the second attribute */
+  if (fill) {
+    if (renderer->active_pattern) {
+      gchar *key = _make_pattern_key (renderer->active_pattern);
+      g_string_printf(str, "fill:url(#%s)", key);
+      g_free (key);
+    } else {
+      g_string_printf(str, "fill: #%02x%02x%02x; fill-opacity: %s",
+                     (int)(255*fill->red), (int)(255*fill->green),
+                     (int)(255*fill->blue), 
+                     g_ascii_formatd(alpha_buf, sizeof(alpha_buf), "%g", fill->alpha));
+    }
+  } else {
+    g_string_printf(str, "fill: none");
+  }
 
-  if (!str) str = g_string_new(NULL);
+  if (stroke) {
+    g_string_append_printf(str, "; stroke-opacity: %s; stroke-width: %s",
+                          g_ascii_formatd (alpha_buf, sizeof(alpha_buf), "%g", stroke->alpha), 
+                          dia_svg_dtostr(linewidth_buf, renderer->linewidth) );
+    if (strcmp(renderer->linecap, "butt"))
+      g_string_append_printf(str, "; stroke-linecap: %s", renderer->linecap);
+    if (strcmp(renderer->linejoin, "miter"))
+      g_string_append_printf(str, "; stroke-linejoin: %s", renderer->linejoin);
+    if (renderer->linestyle)
+      g_string_append_printf(str, "; stroke-dasharray: %s", renderer->linestyle);
 
-  if (renderer->active_pattern) {
-    gchar *key = _make_pattern_key (renderer->active_pattern);
-    g_string_printf(str, "fill:url(#%s)", key);
-    g_free (key);
+    g_string_append_printf(str, "; stroke: #%02x%02x%02x",
+                          (int)(255*stroke->red), 
+                          (int)(255*stroke->green),
+                          (int)(255*stroke->blue));
   } else {
-    g_string_printf(str, "fill: #%02x%02x%02x; fill-opacity: %s",
-                    (int)(255*colour->red), (int)(255*colour->green),
-                    (int)(255*colour->blue), 
-                    g_ascii_formatd(alpha_buf, sizeof(alpha_buf), "%g", colour->alpha));
+    g_string_append_printf(str, "; stroke: none");
   }
   return str->str;
 }
 
+/* the return value of this function should not be saved anywhere */
+
 static void
 draw_line(DiaRenderer *self, 
          Point *start, Point *end, 
@@ -428,7 +426,7 @@ draw_line(DiaRenderer *self,
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"line", NULL);
 
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, line_colour));
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, NULL, line_colour));
 
   dia_svg_dtostr(d_buf, start->x);
   xmlSetProp(node, (const xmlChar *)"x1", (xmlChar *) d_buf);
@@ -453,8 +451,8 @@ draw_polyline(DiaRenderer *self,
   gchar py_buf[DTOSTR_BUF_SIZE];
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polyline", NULL);
-  
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, line_colour));
+
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, NULL, line_colour));
 
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++)
@@ -476,15 +474,10 @@ draw_polygon (DiaRenderer *self,
   GString *str;
   gchar px_buf[DTOSTR_BUF_SIZE];
   gchar py_buf[DTOSTR_BUF_SIZE];
-  gchar *style;
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL);
 
-  style = g_strdup_printf ("%s;%s",
-                          stroke ? get_draw_style (renderer, stroke) : "stroke:none",
-                          fill ? get_fill_style (renderer, fill) : "fill:none");
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
-  g_free (style);
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style (renderer, fill, stroke));
 
   if (fill)
     xmlSetProp(node, (const xmlChar *)"fill-rule", (const xmlChar *) "evenodd");
@@ -506,15 +499,10 @@ draw_rect(DiaRenderer *self,
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
   gchar d_buf[DTOSTR_BUF_SIZE];
-  gchar *style;
 
   node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"rect", NULL);
 
-  style = g_strdup_printf ("%s;%s",
-                          stroke ? get_draw_style (renderer, stroke) : "stroke:none",
-                          fill ? get_fill_style (renderer, fill) : "fill:none");
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
-  g_free (style);
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style (renderer, fill, stroke));
 
   dia_svg_dtostr(d_buf, ul_corner->x);
   xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) d_buf);
@@ -556,7 +544,7 @@ draw_arc(DiaRenderer *self,
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"path", NULL);
   
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, colour));
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style(renderer, NULL, colour));
 
   g_snprintf(buf, sizeof(buf), "M %s,%s A %s,%s 0 %d %d %s,%s",
             dia_svg_dtostr(sx_buf, sx), dia_svg_dtostr(sy_buf, sy),
@@ -595,7 +583,7 @@ fill_arc(DiaRenderer *self,
 
   node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"path", NULL);
   
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *)get_fill_style(renderer, colour));
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *)get_draw_style(renderer, colour, NULL));
 
   g_snprintf(buf, sizeof(buf), "M %s,%s A %s,%s 0 %d %d %s,%s L %s,%s z",
             dia_svg_dtostr(sx_buf, sx), dia_svg_dtostr(sy_buf, sy),
@@ -617,15 +605,10 @@ draw_ellipse(DiaRenderer *self,
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
   gchar d_buf[DTOSTR_BUF_SIZE];
-  gchar *style;
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"ellipse", NULL);
 
-  style = g_strdup_printf ("%s;%s",
-                          stroke ? get_draw_style (renderer, stroke) : "stroke:none",
-                          fill ? get_fill_style (renderer, fill) : "fill:none");
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
-  g_free (style);
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) get_draw_style (renderer, fill, stroke));
 
   dia_svg_dtostr(d_buf, center->x);
   xmlSetProp(node, (const xmlChar *)"cx", (xmlChar *) d_buf);
@@ -658,17 +641,8 @@ _bezier(DiaRenderer *self,
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"path", NULL);
 
-  if (fill || stroke) {
-    GString *style = str = g_string_new("");
-
-    if (stroke) /* XXX: sets also fill:none - so it must be first to get overwritten;) */
-      g_string_append_printf (str, "%s;", get_draw_style(renderer, stroke));
-    if (fill)
-      g_string_append_printf (str, "%s;", get_fill_style(renderer, fill));
-    xmlSetProp(node, (const xmlChar *)"style", (xmlChar *)style->str);
-
-    g_string_free(style, TRUE);
-  }
+  if (fill || stroke)
+    xmlSetProp(node, (const xmlChar *)"style", (xmlChar *)get_draw_style(renderer, fill, stroke));
 
   str = g_string_new(NULL);
 
@@ -758,58 +732,50 @@ draw_text_line(DiaRenderer *self, TextLine *text_line,
 {    
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
-  char *style, *tmp;
   real saved_width;
   gchar d_buf[DTOSTR_BUF_SIZE];
   DiaFont *font;
+  GString *style;
 
   node = xmlNewTextChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"text", 
                         (xmlChar *) text_line_get_string(text_line));
- 
+
   saved_width = renderer->linewidth;
   renderer->linewidth = 0.001;
   /* return value must not be freed */
   renderer->linewidth = saved_width;
 #if 0 /* would need a unit: https://bugzilla.mozilla.org/show_bug.cgi?id=707071#c4 */
-  style = g_strdup_printf("%s; font-size: %s", get_fill_style(renderer, colour),
+  style = g_strdup_printf("%s; font-size: %s", get_draw_style(renderer, colour, NULL),
                        dia_svg_dtostr(d_buf, text_line_get_height(text_line)));
 #else
-  /* get_fill_style: the return value of this function must not be saved 
+  /* get_draw_style: the return value of this function must not be saved 
    * anywhere. And of course it must not be free'd */
-  style = g_strdup (get_fill_style(renderer, colour));
+  style = g_string_new (get_draw_style(renderer, colour, NULL));
 #endif
   /* This is going to break for non-LTR texts, as SVG thinks 'start' is
    * 'right' for those. */
   switch (alignment) {
   case ALIGN_LEFT:
-    tmp = g_strconcat(style, "; text-anchor:start", NULL);
+    g_string_append (style, "; text-anchor:start");
     break;
   case ALIGN_CENTER:
-    tmp = g_strconcat(style, "; text-anchor:middle", NULL);
+    g_string_append (style, "; text-anchor:middle");
     break;
   case ALIGN_RIGHT:
-    tmp = g_strconcat(style, "; text-anchor:end", NULL);
+    g_string_append (style, "; text-anchor:end");
     break;
   default:
-    tmp = g_strdup("");
     break;
   }
-  g_free (style);
-  style = tmp;
 
   font = text_line_get_font(text_line);
-  tmp = g_strdup_printf("%s; font-family: %s; font-style: %s; "
-                       "font-weight: %s",style,
-                       dia_font_get_family(font),
-                       dia_font_get_slant_string(font),
-                       dia_font_get_weight_string(font));
-  g_free(style);
-  style = tmp;
+  g_string_append_printf (style, "font-family: %s; font-style: %s; font-weight: %s",
+                         dia_font_get_family(font),
+                         dia_font_get_slant_string(font),
+                         dia_font_get_weight_string(font));
 
-  /* have to do something about fonts here ... */
-
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
-  g_free(style);
+  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style->str);
+  g_string_free (style, TRUE);
 
   dia_svg_dtostr(d_buf, pos->x);
   xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) d_buf);
@@ -819,7 +785,7 @@ draw_text_line(DiaRenderer *self, TextLine *text_line,
   /* font-size as single attribute can work like the other length w/o unit */
   dia_svg_dtostr(d_buf, text_line_get_height(text_line));
   xmlSetProp(node, (const xmlChar *)"font-size", (xmlChar *) d_buf);
-  
+
   dia_svg_dtostr(d_buf, text_line_get_width(text_line));
   xmlSetProp(node, (const xmlChar*)"textLength", (xmlChar *) d_buf);
 }
@@ -862,7 +828,7 @@ draw_image(DiaRenderer *self,
     xmlSetProp(node, (const xmlChar *)"xlink:href", (xmlChar *) uri);
   else if ((uri = g_filename_to_uri(dia_image_filename(image), NULL, NULL)) != NULL)
     xmlSetProp(node, (const xmlChar *)"xlink:href", (xmlChar *) uri);
-  else /* not sure if this fallbach is better than nothing */
+  else /* not sure if this fallback is better than nothing */
     xmlSetProp(node, (const xmlChar *)"xlink:href", (xmlChar *) dia_image_filename(image));
   g_free (uri);
 }
@@ -961,5 +927,4 @@ dia_svg_renderer_class_init (DiaSvgRendererClass *klass)
 
   /* SVG specific */
   svg_renderer_class->get_draw_style = get_draw_style;
-  svg_renderer_class->get_fill_style = get_fill_style;
 }
diff --git a/lib/diasvgrenderer.h b/lib/diasvgrenderer.h
index 12ba7cd..174f161 100644
--- a/lib/diasvgrenderer.h
+++ b/lib/diasvgrenderer.h
@@ -52,8 +52,7 @@ struct _DiaSvgRendererClass
 {
   DiaRendererClass parent_class;
 
-  const gchar* (*get_draw_style) (DiaSvgRenderer*, Color*);
-  const gchar* (*get_fill_style) (DiaSvgRenderer*, Color*);
+  const gchar* (*get_draw_style) (DiaSvgRenderer*, Color* fill, Color *stroke);
 };
 
 G_END_DECLS
diff --git a/plug-ins/shape/shape-export.c b/plug-ins/shape/shape-export.c
index 5656029..4239a34 100644
--- a/plug-ins/shape/shape-export.c
+++ b/plug-ins/shape/shape-export.c
@@ -382,7 +382,7 @@ draw_polyline(DiaRenderer *self,
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polyline", NULL);
   
   xmlSetProp(node, (const xmlChar *)"style", 
-             (xmlChar *) DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, line_colour));
+             (xmlChar *) DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, NULL, line_colour));
 
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++) {
@@ -418,11 +418,8 @@ draw_polygon(DiaRenderer *self,
 
   node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL);
 
-  style = g_strdup_printf ("%s;%s",
-                          fill ? DIA_SVG_RENDERER_GET_CLASS(renderer)->get_fill_style(renderer, fill) : 
"fill:none",
-                          stroke ? DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, stroke) : 
"stroke:none");
-  xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style);
-  g_free (style);
+  xmlSetProp(node, (const xmlChar *)"style",
+            (xmlChar *) DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, fill, stroke));
 
   str = g_string_new(NULL);
   for (i = 0; i < num_points; i++) {
diff --git a/plug-ins/svg/render_svg.c b/plug-ins/svg/render_svg.c
index 3e29f2b..d3bd618 100644
--- a/plug-ins/svg/render_svg.c
+++ b/plug-ins/svg/render_svg.c
@@ -372,15 +372,11 @@ draw_rounded_rect (DiaRenderer *self,
   DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self);
   xmlNodePtr node;
   gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-  gchar *style;
 
   node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"rect", NULL);
 
-  style = g_strdup_printf ("%s;%s",
-                          stroke ? DIA_SVG_RENDERER_GET_CLASS(self)->get_draw_style (renderer, stroke) : 
"stroke:none",
-                          fill ? DIA_SVG_RENDERER_GET_CLASS(self)->get_fill_style (renderer, fill) : 
"fill:none");
-  xmlSetProp(node, (const xmlChar *)"style", (const xmlChar *)style);
-  g_free (style);
+  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);
@@ -400,16 +396,16 @@ draw_rounded_rect (DiaRenderer *self,
 
 static void
 node_set_text_style (xmlNodePtr      node,
-                     DiaSvgRenderer *renderer,
+                    DiaSvgRenderer *renderer,
                     const DiaFont  *font,
                     real            font_height,
-                     Alignment       alignment,
+                    Alignment       alignment,
                     Color          *colour)
 {
-  char *style, *tmp;
   real saved_width;
   gchar d_buf[G_ASCII_DTOSTR_BUF_SIZE];
   DiaSvgRendererClass *svg_renderer_class = DIA_SVG_RENDERER_GET_CLASS (renderer);
+  GString *style;
   /* SVG font-size is the (line-) height, from SVG Spec:
    * ... property refers to the size of the font from baseline to baseline when multiple lines of text are 
set ...
   so we should be able to use font_height directly instead of:
@@ -420,21 +416,21 @@ node_set_text_style (xmlNodePtr      node,
 
   saved_width = renderer->linewidth;
   renderer->linewidth = 0.001;
-  style = (char*)svg_renderer_class->get_fill_style(renderer, colour);
-  /* return value must not be freed */
+  /* return value of get_draw_style must not be freed */
+  style = g_string_new (svg_renderer_class->get_draw_style(renderer, colour, NULL));
   renderer->linewidth = saved_width;
   /* This is going to break for non-LTR texts, as SVG thinks 'start' is
    * 'right' for those.
    */
   switch (alignment) {
   case ALIGN_LEFT:
-    style = g_strconcat(style, ";text-anchor:start", NULL);
+    g_string_append (style, ";text-anchor:start");
     break;
   case ALIGN_CENTER:
-    style = g_strconcat(style, ";text-anchor:middle", NULL);
+    g_string_append (style, ";text-anchor:middle");
     break;
   case ALIGN_RIGHT:
-    style = g_strconcat(style, ";text-anchor:end", NULL);
+    g_string_append (style, ";text-anchor:end");
     break;
   }
 #if 0 /* would need a unit according to https://bugzilla.mozilla.org/show_bug.cgi?id=707071#c4 */
@@ -449,19 +445,13 @@ node_set_text_style (xmlNodePtr      node,
 #endif
 
   if (font) {
-     tmp = g_strdup_printf("%s;font-family:%s;font-style:%s;"
-                           "font-weight:%s",style,
-                           strcmp(family, "sans") == 0 ? "sans-serif" : family,
-                           dia_font_get_slant_string(font),
-                           dia_font_get_weight_string(font));
-     g_free(style);
-     style = tmp;
+     g_string_append_printf (style, ";font-family:%s;font-style:%s;font-weight:%s",
+                            strcmp(family, "sans") == 0 ? "sans-serif" : family,
+                            dia_font_get_slant_string(font),
+                            dia_font_get_weight_string(font));
   }
-
-  /* have to do something about fonts here ... */
-
-  xmlSetProp(node, (xmlChar *)"style", (xmlChar *)style);
-  g_free(style);
+  xmlSetProp(node, (xmlChar *)"style", (xmlChar *)style->str);
+  g_string_free (style, TRUE);
 }
 
 /*!


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