static void draw_text_line(DiaRenderer *self, TextLine *text_line, Point *pos, Alignment alignment, Color *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; char *style, *tmp; real saved_width; gchar d_buf[DTOSTR_BUF_SIZE]; DiaFont *font; 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; style = (char*)get_fill_style(renderer, colour); /* return value must not be freed */ renderer->linewidth = saved_width; tmp = g_strdup_printf("%s; font-size: %s", style, dia_svg_dtostr(d_buf, text_line_get_height(text_line))); style = tmp; /* 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); break; case ALIGN_CENTER: tmp = g_strconcat(style, "; text-anchor:middle", NULL); break; case ALIGN_RIGHT: tmp = g_strconcat(style, "; text-anchor:end", NULL); 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; /* have to do something about fonts here ... */ xmlSetProp(node, (const xmlChar *)"style", (xmlChar *) style); g_free(style); dia_svg_dtostr(d_buf, pos->x); xmlSetProp(node, (const xmlChar *)"x", (xmlChar *) d_buf); dia_svg_dtostr(d_buf, pos->y); xmlSetProp(node, (const xmlChar *)"y", (xmlChar *) d_buf); dia_svg_dtostr(d_buf, text_line_get_width(text_line)); xmlSetProp(node, (const xmlChar*)"textLength", (xmlChar *) d_buf); }
static void set_font(DiaRenderer *self, DiaFont *font, real height) { DrsRenderer *renderer = DRS_RENDERER (self); xmlNodePtr node; const PangoFontDescription *pfd = dia_font_get_description (font); char *desc = pango_font_description_to_string (pfd); node = xmlNewChild(renderer->root, NULL, (const xmlChar *)"set-font", NULL); xmlSetProp(node, (const xmlChar *)"description", (xmlChar *)desc); xmlSetProp(node, (const xmlChar *)"family", (xmlChar *)dia_font_get_family (font)); xmlSetProp(node, (const xmlChar *)"weight", (xmlChar *)dia_font_get_weight_string (font)); xmlSetProp(node, (const xmlChar *)"slant", (xmlChar *)dia_font_get_slant_string (font)); _node_set_real (node, "size", dia_font_get_size (font)); _node_set_real (node, "height", height); g_free(desc); }
static void draw_text_line(DiaRenderer *self, TextLine *text_line, Point *pos, Alignment alignment, Color *colour) { DiaSvgRenderer *renderer = DIA_SVG_RENDERER (self); xmlNodePtr node; 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_draw_style(renderer, colour, NULL), dia_svg_dtostr(d_buf, text_line_get_height(text_line))); #else /* 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_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: g_string_append (style, "; text-anchor:start"); break; case ALIGN_CENTER: g_string_append (style, "; text-anchor:middle"); break; case ALIGN_RIGHT: g_string_append (style, "; text-anchor:end"); break; default: break; } font = text_line_get_font(text_line); 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)); 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); dia_svg_dtostr(d_buf, pos->y); xmlSetProp(node, (const xmlChar *)"y", (xmlChar *) d_buf); /* 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); }
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); }