/* complete overwrite, necessary code duplication */ static void draw_polygon(DiaRenderer *self, Point *points, int num_points, Color *line_colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); int i; xmlNodePtr node; GString *str; Point center; gchar px_buf[G_ASCII_DTOSTR_BUF_SIZE]; gchar py_buf[G_ASCII_DTOSTR_BUF_SIZE]; node = xmlNewChild(renderer->root, renderer->svg_name_space, (const xmlChar *)"polygon", NULL); xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) DIA_SVG_RENDERER_GET_CLASS(renderer)->get_draw_style(renderer, line_colour)); str = g_string_new(NULL); for (i = 0; i < num_points; i++) { g_string_append_printf(str, "%s,%s ", g_ascii_formatd(px_buf, sizeof(px_buf), "%g", points[i].x), g_ascii_formatd(py_buf, sizeof(py_buf), "%g", points[i].y) ); add_connection_point(SHAPE_RENDERER(self), &points[i], FALSE, FALSE); } for(i = 1; i < num_points; i++) { center.x = (points[i].x + points[i-1].x)/2; center.y = (points[i].y + points[i-1].y)/2; add_connection_point(SHAPE_RENDERER(self), ¢er, FALSE, FALSE); } xmlSetProp(node, (const xmlChar *)"points", (xmlChar *) str->str); g_string_free(str, TRUE); }
/*! * \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); }
static void node_set_text_style (xmlNodePtr node, DiaSvgRenderer *renderer, const DiaFont *font, real font_height, 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); /* 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: */ real font_size = dia_font_get_size (font) * (font_height / dia_font_get_height (font)); /* ... but at least Inkscape and Firefox would produce the wrong font-size */ const gchar *family = dia_font_get_family(font); saved_width = renderer->linewidth; renderer->linewidth = 0.001; style = (char*)svg_renderer_class->get_fill_style(renderer, colour); /* return value must not be freed */ 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); break; case ALIGN_CENTER: style = g_strconcat(style, ";text-anchor:middle", NULL); break; case ALIGN_RIGHT: style = g_strconcat(style, ";text-anchor:end", NULL); break; } #if 0 /* would need a unit according to https://bugzilla.mozilla.org/show_bug.cgi?id=707071#c4 */ tmp = g_strdup_printf("%s;font-size:%s", style, dia_svg_dtostr(d_buf, font_size) ); g_free (style); style = tmp; #else /* font-size as attribute can work like the other length w/o unit */ dia_svg_dtostr(d_buf, font_size); xmlSetProp(node, (const xmlChar *)"font-size", (xmlChar *) d_buf); #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; } /* have to do something about fonts here ... */ xmlSetProp(node, (xmlChar *)"style", (xmlChar *)style); g_free(style); }