From 7c3ed7b5f7e8ce9b266631dc479c02e795acb180 Mon Sep 17 00:00:00 2001 From: oetiker Date: Mon, 9 May 2005 14:01:21 +0000 Subject: [PATCH] EPS/SVG/PDF code ... more comments and better font finder including removal of hardcoded SVG font. -- Peter Speck speck from vitality.dk git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.2/program@526 a5681a0c-68f1-0310-ab6d-d61299d08faa --- src/rrd_afm.c | 13 +++++++++++-- src/rrd_afm.h | 13 +++++++++++++ src/rrd_gfx.c | 23 ++++++++++++++++------- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/rrd_afm.c b/src/rrd_afm.c index a7cb295..0bb0ac4 100644 --- a/src/rrd_afm.c +++ b/src/rrd_afm.c @@ -35,6 +35,7 @@ #define ENABLE_LIGATURES 0 static const afm_fontinfo *afm_last_used_font = NULL; +static const char *last_unknown_font = NULL; #define is_font(p, name) \ (!strcmp(p->postscript_name, name) || !strcmp(p->fullname, name)) @@ -55,8 +56,10 @@ static const afm_fontinfo *afm_searchfont(const char *name) return NULL; } -static const char *last_unknown_font = NULL; +/* returns always a font, never NULL. + The rest of the code depends on the result never being NULL. + See rrd_afm.h */ static const afm_fontinfo *afm_findfont(const char *name) { const afm_fontinfo *p = afm_searchfont(name); @@ -66,7 +69,7 @@ static const afm_fontinfo *afm_findfont(const char *name) fprintf(stderr, "Can't find font '%s'\n", name); last_unknown_font = name; } - p = afm_searchfont("Courier"); + p = afm_searchfont(RRD_AFM_DEFAULT_FONT); if (p) return p; return afm_fontinfolist; // anything, just anything. @@ -78,6 +81,12 @@ const char *afm_get_font_postscript_name(const char* font) return p->postscript_name; } +const char *afm_get_font_name(const char* font) +{ + const afm_fontinfo *p = afm_findfont(font); + return p->fullname; +} + double afm_get_ascender(const char* font, double size) { const afm_fontinfo *p = afm_findfont(font); diff --git a/src/rrd_afm.h b/src/rrd_afm.h index 6a59318..655a873 100644 --- a/src/rrd_afm.h +++ b/src/rrd_afm.h @@ -7,6 +7,18 @@ #ifndef RRD_AFM_H #define RRD_AFM_H +/* + If the font specified by the name parameter in the routes below + is not found + (because it is not compiled into rrd_afm_data.c by compile_afm.pl) + the font specified by RRD_AFM_DEFAULT_FONT will be used. + If it is not installed, it uses the first font compiled + into rrd_afm_data.c + So they will always use some font. +*/ + +#define RRD_AFM_DEFAULT_FONT "Courier" + /* measure width of a text string */ /* fontname can be full name or postscript name */ double afm_get_text_width ( double start, const char* font, double size, @@ -17,6 +29,7 @@ double afm_get_descender(const char* font, double size); /* get postscript name from fullname or postscript name */ const char *afm_get_font_postscript_name ( const char* font); +const char *afm_get_font_name(const char* font); /* cc -E -dM /dev/null */ #ifdef __APPLE__ diff --git a/src/rrd_gfx.c b/src/rrd_gfx.c index 6f83bc5..e288f03 100644 --- a/src/rrd_gfx.c +++ b/src/rrd_gfx.c @@ -963,7 +963,7 @@ static void pdf_calc(int page_height, gfx_node_t *node, pdf_coords *g) */ static int svg_indent = 0; static int svg_single_line = 0; -static const char *svg_default_font = "Helvetica"; +static const char *svg_default_font = "-dummy-"; typedef struct svg_dash { int dash_enable; @@ -1341,6 +1341,7 @@ static void svg_area(FILE *fp, gfx_node_t *node) static void svg_text(FILE *fp, gfx_node_t *node) { pdf_coords g; + const char *fontname; /* as svg has 0,0 in top-left corner (like most screens) instead of bottom-left corner like pdf and eps, we have to fake the coords using offset and inverse sin(r) value */ @@ -1362,12 +1363,10 @@ static void svg_text(FILE *fp, gfx_node_t *node) svg_write_number(fp, page_height - g.tmy); fputs("\"", fp); } - -/* if (strcmp(node->filename, svg_default_font)) - fprintf(fp, " font-family=\"%s\"", node->filename); - */ - fputs(" font-family=\"Helvetica", fp); - fputs("\" font-size=\"", fp); + fontname = afm_get_font_name(node->filename); + if (strcmp(fontname, svg_default_font)) + fprintf(fp, " font-family=\"%s\"", fontname); + fputs(" font-size=\"", fp); svg_write_number(fp, node->size); fputs("\"", fp); if (!svg_color_is_black(node->color)) @@ -1384,6 +1383,15 @@ int gfx_render_svg (gfx_canvas_t *canvas, art_u32 width, art_u32 height, gfx_color_t background, FILE *fp){ gfx_node_t *node = canvas->firstnode; + /* Find the first font used, and assume it is the mostly used + 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); + break; + } + node = node->next; + } fputs( "\n" "firstnode; while (node) { switch (node->type) { case GFX_LINE: -- 2.11.0