Hello!

        As specified in SVG 1.1 specification
(http://www.w3.org/TR/SVG11/text.html#FontFamilyProperty), the only
fonts you can rely upon are 5 CSS2 font families:

'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'

(As specified at 
http://www.w3.org/TR/REC-CSS2/fonts.html#value-def-generic-family ).

        But RRD 1.2.15 considers all of them unknown. I've made a small
patch (attached), which allows usage of those fonts for SVG output
format. (Font metrics are taken from RRD_AFM_DEFAULT_FONT).

        This patch doesn't solve the general problem, that all font
calculation should depend on output format. But this is just my first patch
to rrd. ;-))

        Bye. Alex.

--- rrdtool-1.2.15/src/rrd_gfx.c.orig   Mon May 21 20:29:39 2007
+++ rrdtool-1.2.15/src/rrd_gfx.c        Tue May 22 18:12:18 2007
@@ -282,7 +282,24 @@
   switch (canvas->imgformat) {
   case IF_PNG: 
     return gfx_get_text_width_libart (canvas, start, font, size, tabwidth, 
text, rotation);
-  case IF_SVG: /* fall through */ 
+  case IF_SVG:
+   /* There are 5 predefined fonts in SVG:
+    * 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'. 
+    * http://www.w3.org/TR/SVG11/text.html#FontFamilyProperty
+    * http://www.w3.org/TR/REC-CSS2/fonts.html#value-def-generic-family
+    *
+    * If any of them found, calculate metrics based on default font.
+    */
+   
+   if( strcasecmp(font,"serif") ||
+       strcasecmp(font,"sans-serif") ||
+       strcasecmp(font,"cursive") ||
+       strcasecmp(font,"fantasy") ||
+       strcasecmp(font,"monospace")
+     ){
+       font=RRD_AFM_DEFAULT_FONT;
+   }
+   /* fall through */ 
   case IF_EPS:
   case IF_PDF:
     return afm_get_text_width(start, font, size, tabwidth, text);
@@ -916,9 +933,10 @@
 }
 
 
-static void pdf_calc(int page_height, gfx_node_t *node, pdf_coords *g)
+static void pdf_calc(int page_height, gfx_node_t *node, pdf_coords *g, enum 
gfx_if_en format)
 {
        pdf_point a, b, c;
+       char *font;
 #if PDF_CALC_DEBUG
        /* g->debug = !!strstr(node->text, "RevProxy-1") || 
!!strstr(node->text, "08:00"); */
        g->debug = !!strstr(node->text, "sekunder") || !!strstr(node->text, 
"Web");
@@ -934,9 +952,32 @@
                g->cos_r = 1;
                g->sin_r = 0;
        }
-       g->ascender = afm_get_ascender(node->filename, node->size);
-       g->descender = afm_get_descender(node->filename, node->size);
-       g->sizep.x = afm_get_text_width(0, node->filename, node->size, 
node->tabwidth, node->text);
+       if( format == IF_SVG ){
+               /* There are 5 predefined fonts in SVG:
+                * 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'. 
+                * http://www.w3.org/TR/SVG11/text.html#FontFamilyProperty
+                * 
http://www.w3.org/TR/REC-CSS2/fonts.html#value-def-generic-family
+                *
+                * Substitute default font in theese cases.
+                *
+                */
+
+               if( strcasecmp(node->filename,"serif") &&
+                               strcasecmp(node->filename,"sans-serif") &&
+                               strcasecmp(node->filename,"cursive") &&
+                               strcasecmp(node->filename,"fantasy") &&
+                               strcasecmp(node->filename,"monospace")
+                 ){
+                       font = node->filename;
+               } else {
+                       font = RRD_AFM_DEFAULT_FONT;
+               }
+       }else{
+               font = node->filename;
+       }
+       g->ascender = afm_get_ascender(font, node->size);
+       g->descender = afm_get_descender(font, node->size);
+       g->sizep.x = afm_get_text_width(0, font, node->size, node->tabwidth, 
node->text);
        /* seems like libart ignores the descender when doing vertial-align = 
bottom,
           so we do that too, to get labels v-aligning properly */
        g->sizep.y = -g->ascender; /* + afm_get_descender(font->ps_font, 
node->size); */
@@ -1382,7 +1423,7 @@
          bottom-left corner like pdf and eps, we have to fake the coords
          using offset and inverse sin(r) value */
    int page_height = 1000;
-   pdf_calc(page_height, node, &g);
+   pdf_calc(page_height, node, &g,IF_SVG);
    if (node->angle != 0) {
      svg_start_tag(fp, "g");
         /* can't use svg_write_number as 2 decimals is far from enough to avoid
@@ -1399,7 +1440,22 @@
      svg_write_number(fp, page_height - g.tmy);
      fputs("\"", fp);
    }
-   fontname = afm_get_font_name(node->filename);
+   /* There are 5 predefined fonts in SVG:
+    * 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'. 
+    * http://www.w3.org/TR/SVG11/text.html#FontFamilyProperty
+    * http://www.w3.org/TR/REC-CSS2/fonts.html#value-def-generic-family
+    */
+   
+   if( strcasecmp(node->filename,"serif") &&
+       strcasecmp(node->filename,"sans-serif") &&
+       strcasecmp(node->filename,"cursive") &&
+       strcasecmp(node->filename,"fantasy") &&
+       strcasecmp(node->filename,"monospace")
+     ){
+          fontname = afm_get_font_name(node->filename);
+   } else {
+          fontname = node->filename;
+   }
    if (strcmp(fontname, svg_default_font))
      fprintf(fp, " font-family=\"%s\"", fontname);
    fputs(" font-size=\"", fp);
@@ -1423,7 +1479,22 @@
          one. It reduces the number of font-familty attributes. */
    while (node) {
           if (node->type == GFX_TEXT && node->filename) {
-                  svg_default_font = afm_get_font_name(node->filename);
+                  /* There are 5 predefined fonts in SVG:
+                   * 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'. 
+                   * http://www.w3.org/TR/SVG11/text.html#FontFamilyProperty
+                   * 
http://www.w3.org/TR/REC-CSS2/fonts.html#value-def-generic-family
+                   */
+
+                  if( strcasecmp(node->filename,"serif") &&
+                          strcasecmp(node->filename,"sans-serif") &&
+                          strcasecmp(node->filename,"cursive") &&
+                          strcasecmp(node->filename,"fantasy") &&
+                          strcasecmp(node->filename,"monospace")
+                    ){
+                          svg_default_font = afm_get_font_name(node->filename);
+                  }else{
+                          svg_default_font = node->filename;
+                  }
                   break;
           }
           node = node->next;
@@ -1754,7 +1825,7 @@
     if (!p)
        return;
 #endif
-  pdf_calc(state->page_height, node, &g);
+  pdf_calc(state->page_height, node, &g,IF_EPS);
   eps_set_color(state, node->color);
   if (strcmp(ps_font, state->font) || node->size != state->font_size) {
     state->font = ps_font;
@@ -2287,7 +2358,7 @@
     state->has_failed = 1;
     return;
   }
-  pdf_calc(state->page_height, node, &g);
+  pdf_calc(state->page_height, node, &g,IF_PDF);
 #if PDF_CALC_DEBUG
   pdf_puts(s, "q % debug green box\n");
   pdf_write_matrix(state, node, &g, 0);
_______________________________________________
rrd-developers mailing list
rrd-developers@lists.oetiker.ch
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers

Reply via email to