From: ellson Date: Wed, 26 Jul 2006 15:30:54 +0000 (+0000) Subject: rework postscript alias mapping to better support svg and xfig X-Git-Tag: LAST_LIBGRAPH~32^2~6053 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3405bcbbce97d30c87c6a1fcb4c752f018be8fbe;p=graphviz rework postscript alias mapping to better support svg and xfig update pango and svg renderers to use new postscript aliases --- diff --git a/lib/common/fontmetrics.c b/lib/common/fontmetrics.c index 1361cb035..e6115b746 100644 --- a/lib/common/fontmetrics.c +++ b/lib/common/fontmetrics.c @@ -160,11 +160,6 @@ estimate_textlayout(graph_t *g, textpara_t * para, char **fontpath) } } -typedef struct _PostscriptAlias { - char* name; - char* translated_name; -} PostscriptAlias; - /* * This table maps standard Postscript font names to URW Type 1 fonts. * @@ -181,7 +176,7 @@ static int fontcmpf(const void *a, const void *b) return (strcasecmp(((PostscriptAlias*)a)->name, ((PostscriptAlias*)b)->name)); } -static char* translate_postscript_fontname(char* fontname) +static PostscriptAlias* translate_postscript_fontname(char* fontname) { static PostscriptAlias key; static PostscriptAlias *result; @@ -194,9 +189,7 @@ static char* translate_postscript_fontname(char* fontname) sizeof(PostscriptAlias), fontcmpf); } - if (result == NULL) - return NULL; - return result->translated_name; + return result; } pointf textsize(graph_t *g, textpara_t * para, char *fontname, double fontsize) @@ -207,7 +200,7 @@ pointf textsize(graph_t *g, textpara_t * para, char *fontname, double fontsize) para->fontname = fontname; para->fontsize = fontsize; - para->translated_fontname = translate_postscript_fontname(fontname); + para->postscript_alias = translate_postscript_fontname(fontname); if (! gvtextlayout(GD_gvc(g), para, &fontpath) || !fontpath) estimate_textlayout(g, para, &fontpath); diff --git a/lib/common/ps_font_equiv.txt b/lib/common/ps_font_equiv.txt index 52c22bb70..1ecbbbbc5 100644 --- a/lib/common/ps_font_equiv.txt +++ b/lib/common/ps_font_equiv.txt @@ -1,35 +1,35 @@ - { "AvantGarde-Book", "URW Gothic L, Book" }, - { "AvantGarde-BookOblique", "URW Gothic L, Book, Oblique" }, - { "AvantGarde-Demi", "URW Gothic L, Demi" }, - { "AvantGarde-DemiOblique", "URW Gothic L, Demi, Oblique" }, - { "Bookman-Demi", "URW Bookman L, Demi, Bold" }, - { "Bookman-DemiItalic", "URW Bookman L, Demi, Bold, Italic" }, - { "Bookman-Light", "URW Bookman L, Light" }, - { "Bookman-LightItalic", "URW Bookman L, Light, Italic" }, - { "Courier", "Nimbus Mono L, Regular" }, - { "Courier-Bold", "Nimbus Mono L, Bold" }, - { "Courier-BoldOblique", "Nimbus Mono L, Bold, Oblique" }, - { "Courier-Oblique", "Nimbus Mono L, Regular, Oblique" }, - { "Helvetica", "Nimbus Sans L, Regular" }, - { "Helvetica-Bold", "Nimbus Sans L, Bold" }, - { "Helvetica-BoldOblique", "Nimbus Sans L, Bold, Italic" }, - { "Helvetica-Narrow", "Nimbus Sans L, Regular, Condensed" }, - { "Helvetica-Narrow-Bold", "Nimbus Sans L, Bold, Condensed" }, - { "Helvetica-Narrow-BoldOblique", "Nimbus Sans L, Bold, Condensed, Italic" }, - { "Helvetica-Narrow-Oblique", "Nimbus Sans L, Regular, Condensed, Italic" }, - { "Helvetica-Oblique", "Nimbus Sans L, Regular, Italic" }, - { "NewCenturySchlbk-Bold", "Century Schoolbook L, Bold" }, - { "NewCenturySchlbk-BoldItalic", "Century Schoolbook L, Bold, Italic" }, - { "NewCenturySchlbk-Italic", "Century Schoolbook L, Italic" }, - { "NewCenturySchlbk-Roman", "Century Schoolbook L, Roman" }, - { "Palatino-Bold", "URW Palladio L, Bold" }, - { "Palatino-BoldItalic", "URW Palladio L, Bold, Italic" }, - { "Palatino-Italic", "URW Palladio L, Italic" }, - { "Palatino-Roman", "URW Palladio L, Roman" }, - { "Symbol", "Standard Symbols L, Regular" }, - { "Times-Bold", "Nimbus Roman No9 L, Medium" }, - { "Times-BoldItalic", "Nimbus Roman No9 L, Medium, Italic" }, - { "Times-Italic", "Nimbus Roman No9 L, Regular, Italic" }, - { "Times-Roman", "Nimbus Roman No9 L, Regular" }, - { "ZapfChancery-MediumItalic", "URW Chancery L, Medium, Italic" }, - { "ZapfDingbats", "Dingbats" }, +{"AvantGarde-Book", "URW Gothic L", "book", 0, 0, 4 }, +{"AvantGarde-BookOblique", "URW Gothic L", "book", 0, "oblique", 5 }, +{"AvantGarde-Demi", "URW Gothic L", "demi", 0, 0, 6 }, +{"AvantGarde-DemiOblique", "URW Gothic L", "demi", 0, "oblique", 7 }, +{"Bookman-Demi", "URW Bookman L", "demi", 0, 0, 10}, +{"Bookman-DemiItalic", "URW Bookman L", "demi", 0, "italic", 11}, +{"Bookman-Light", "URW Bookman L", "light", 0, 0, 8 }, +{"Bookman-LightItalic", "URW Bookman L", "light", 0, "italic", 9 }, +{"Courier", "Nimbus Mono L", "regular", 0, 0, 12}, +{"Courier-Bold", "Nimbus Mono L", "bold", 0, 0, 14}, +{"Courier-BoldOblique", "Nimbus Mono L", "bold", 0, "oblique", 15}, +{"Courier-Oblique", "Nimbus Mono L", "regular", 0, "oblique", 13}, +{"Helvetica", "Nimbus Sans L", "regular", 0, 0, 16}, +{"Helvetica-Bold", "Nimbus Sans L", "bold", 0, 0, 18}, +{"Helvetica-BoldOblique", "Nimbus Sans L", "bold", 0, "oblique", 19}, +{"Helvetica-Narrow", "Nimbus Sans L", "regular", "condensed", 0, 20}, +{"Helvetica-Narrow-Bold", "Nimbus Sans L", "bold", "condensed", 0, 22}, +{"Helvetica-Narrow-BoldOblique","Nimbus Sans L", "bold", "condensed", "oblique", 23}, +{"Helvetica-Narrow-Oblique", "Nimbus Sans L", "regular", "condensed", "oblique", 21}, +{"Helvetica-Oblique", "Nimbus Sans L", "regular", 0, "oblique", 17}, +{"NewCenturySchlbk-Bold", "Century Schoolbook L", "bold", 0, 0, 26}, +{"NewCenturySchlbk-BoldItalic", "Century Schoolbook L", "bold", 0, "italic", 27}, +{"NewCenturySchlbk-Italic", "Century Schoolbook L", 0, 0, "italic", 25}, +{"NewCenturySchlbk-Roman", "Century Schoolbook L", "roman", 0, 0, 24}, +{"Palatino-Bold", "URW Palladio L", "bold", 0, 0, 30}, +{"Palatino-BoldItalic", "URW Palladio L", "bold", 0, "italic", 31}, +{"Palatino-Italic", "URW Palladio L", 0, 0, "italic", 29}, +{"Palatino-Roman", "URW Palladio L", "roman", 0, 0, 28}, +{"Symbol", "Standard Symbols L", "regular", 0, 0, 32}, +{"Times-Bold", "Nimbus Roman No9 L", "medium", 0, 0, 2 }, +{"Times-BoldItalic", "Nimbus Roman No9 L", "medium", 0, "italic", 3 }, +{"Times-Italic", "Nimbus Roman No9 L", "regular", 0, "italic", 1 }, +{"Times-Roman", "Nimbus Roman No9 L", "regular", 0, 0, 0 }, +{"ZapfChancery-MediumItalic", "URW Chancery L", "medium", 0, "italic", 33}, +{"ZapfDingbats", "Dingbats", 0, 0, 0, 34}, diff --git a/lib/common/textpara.h b/lib/common/textpara.h index cfb6c0947..f86c9933b 100644 --- a/lib/common/textpara.h +++ b/lib/common/textpara.h @@ -21,10 +21,19 @@ extern "C" { #endif + typedef struct _PostscriptAlias { + char* name; + char* family; + char* weight; + char* stretch; + char* style; + int xfig_code; + } PostscriptAlias; + typedef struct textpara_t { char *str; /* stored in utf-8 */ char *fontname; - char *translated_fontname; + PostscriptAlias *postscript_alias; char *xshow; void *layout; void (*free_layout) (void *layout); /* FIXME - this is ugly */ diff --git a/plugin/core/gvrender_core_svg.c b/plugin/core/gvrender_core_svg.c index 8819dcff4..a3b138a9f 100644 --- a/plugin/core/gvrender_core_svg.c +++ b/plugin/core/gvrender_core_svg.c @@ -117,34 +117,6 @@ static void svggen_print_color(GVJ_t * job, gvcolor_t color) } } -static void svggen_font(GVJ_t * job, char *fontname, double fontsize) -{ - gvstyle_t *style = job->style; - char buf[BUFSIZ]; - - strcpy(buf, " style=\""); - sprintf(buf + strlen(buf), "font-family:%s;", fontname); - sprintf(buf + strlen(buf), "font-size:%.2f;", fontsize); - switch (style->pencolor.type) { - case COLOR_STRING: - if (strcasecmp(style->pencolor.u.string, "black")) { - sprintf(buf + strlen(buf), "fill:%s;", - style->pencolor.u.string); - } - break; - case RGBA_BYTE: - sprintf(buf + strlen(buf), "fill:#%02x%02x%02x;", - style->pencolor.u.rgba[0], - style->pencolor.u.rgba[1], style->pencolor.u.rgba[2]); - break; - default: - assert(0); /* internal error */ - } - strcat(buf, "\""); - svggen_fputs(job, buf); -} - - static void svggen_grstyle(GVJ_t * job, int filled) { gvstyle_t *style = job->style; @@ -387,25 +359,50 @@ static void svggen_end_anchor(GVJ_t * job) static void svggen_textpara(GVJ_t * job, pointf p, textpara_t * para) { - char *anchor; + gvstyle_t *penstyle = job->style; + svggen_fputs(job, "just) { case 'l': - anchor = "start"; + svggen_fputs(job, " text-anchor=\"start\""); break; case 'r': - anchor = "end"; + svggen_fputs(job, " text-anchor=\"end\""); break; default: case 'n': - anchor = "middle"; + svggen_fputs(job, " text-anchor=\"middle\""); break; } - - svggen_printf(job, "translated_fontname, para->fontsize); - svggen_fputs(job, ">"); + svggen_fputs(job, " style=\""); + if (para->postscript_alias) { + svggen_printf(job, "font-family:%s;", para->postscript_alias->family); + if (para->postscript_alias->weight) + svggen_printf(job, "font-weight:%s;", para->postscript_alias->weight); + if (para->postscript_alias->stretch) + svggen_printf(job, "font-stretch:%s;", para->postscript_alias->stretch); + if (para->postscript_alias->style) + svggen_printf(job, "font-style:%s;", para->postscript_alias->style); + } + else { + svggen_printf(job, "font:%s;", para->fontname); + } + svggen_printf(job, "font-size:%.2f;", para->fontsize); + switch (penstyle->pencolor.type) { + case COLOR_STRING: + if (strcasecmp(penstyle->pencolor.u.string, "black")) + svggen_printf(job, "fill:%s;", penstyle->pencolor.u.string); + break; + case RGBA_BYTE: + svggen_printf(job, "fill:#%02x%02x%02x;", + penstyle->pencolor.u.rgba[0], + penstyle->pencolor.u.rgba[1], penstyle->pencolor.u.rgba[2]); + break; + default: + assert(0); /* internal error */ + } + svggen_fputs(job, "\">"); svggen_fputs(job, xml_string(para->str)); svggen_fputs(job, "\n"); } diff --git a/plugin/pango/gvtextlayout_pango.c b/plugin/pango/gvtextlayout_pango.c index f2651d40a..229d77d5d 100644 --- a/plugin/pango/gvtextlayout_pango.c +++ b/plugin/pango/gvtextlayout_pango.c @@ -59,11 +59,28 @@ static void pango_textlayout(GVCOMMON_t *common, textpara_t * para, char **fontp if (!context) context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP(fontmap)); - if (!fontname || strcmp(fontname, para->translated_fontname)) { - fontname = para->translated_fontname; + if (!fontname || strcmp(fontname, para->fontname)) { + fontname = para->fontname; pango_font_description_free (desc); - desc = pango_font_description_from_string(fontname); + if (para->postscript_alias) { + strcpy(buf, para->postscript_alias->family); + if (para->postscript_alias->weight) { + strcat(buf, ", "); + strcat(buf, para->postscript_alias->weight); + } + if (para->postscript_alias->stretch) { + strcat(buf, ", "); + strcat(buf, para->postscript_alias->stretch); + } + if (para->postscript_alias->style) { + strcat(buf, ", "); + strcat(buf, para->postscript_alias->style); + } + desc = pango_font_description_from_string(buf); + } + else + desc = pango_font_description_from_string(fontname); } family = pango_font_description_get_family (desc); style = pango_font_description_get_style (desc);