]> granicus.if.org Git - graphviz/commitdiff
rework postscript alias mapping to better support svg and xfig
authorellson <devnull@localhost>
Wed, 26 Jul 2006 15:30:54 +0000 (15:30 +0000)
committerellson <devnull@localhost>
Wed, 26 Jul 2006 15:30:54 +0000 (15:30 +0000)
   update pango and svg renderers to use new postscript aliases

lib/common/fontmetrics.c
lib/common/ps_font_equiv.txt
lib/common/textpara.h
plugin/core/gvrender_core_svg.c
plugin/pango/gvtextlayout_pango.c

index 1361cb03522b22b22f2df912386accec919b52af..e6115b7464c9b5857343310fe44869e02ba3eb09 100644 (file)
@@ -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);
index 52c22bb70e5fdd321a0c58a743fb43416946965f..1ecbbbbc5788bc438d12e199900c4c7c733800e0 100644 (file)
@@ -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},
index cfb6c09475baf3f02cced5c939e9c20a05c89d96..f86c9933b673381a4e9e5165444907cb0b29df27 100644 (file)
 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 */
index 8819dcff412959b8ce22453795f4a8672f29d82f..a3b138a9f06df976d96236f32d292afbe32f3488 100644 (file)
@@ -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, "<text");
     switch (para->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, "<text text-anchor=\"%s\"", anchor);
     svggen_printf(job, " x=\"%g\" y=\"%g\"", p.x, -p.y);
-    svggen_font(job, para->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, "</text>\n");
 }
index f2651d40af7cf0243c44fd0412fab26e208df5de..229d77d5db1ec2cc308fe5e22505545795152c77 100644 (file)
@@ -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);