]> granicus.if.org Git - graphviz/commitdiff
completed conversion to cdt dict of fonts
authorJohn Ellson <ellson@research.att.com>
Thu, 7 Nov 2013 22:42:19 +0000 (17:42 -0500)
committerJohn Ellson <ellson@research.att.com>
Thu, 7 Nov 2013 22:42:19 +0000 (17:42 -0500)
lib/common/emit.c
lib/common/htmllex.c
lib/common/htmlparse.y
lib/common/htmltable.c
lib/common/labels.c
lib/common/render.h
lib/common/textfont.c

index 55d8bdb73cc87e30d7dfe4c4781f1b15becc0f1f..40722c1c00e13edec5be1b1cfbd723777c36774a 100644 (file)
@@ -26,6 +26,7 @@
 #include "agxbuf.h"
 #include "htmltable.h"
 #include "gvc.h"
+#include "cdt.h"
 #include "xdot.h"
 
 #ifdef WIN32
@@ -2912,6 +2913,7 @@ freePara (exdot_op* op)
 
 boxf xdotBB (Agraph_t* g)
 {
+    GVC_t *gvc = GD_gvc(g);
     exdot_op* op;
     int i;
     double fontsize = 0.0;
@@ -2921,6 +2923,7 @@ boxf xdotBB (Agraph_t* g)
     boxf bb0;
     boxf bb = GD_bb(g);
     xdot* xd = (xdot*)GD_drawing(g)->xdots;
+    textfont_t tf, null_tf = {NULL,NULL,NULL,0.0,0,0};
 
     if (!xd) return bb;
 
@@ -2931,6 +2934,7 @@ boxf xdotBB (Agraph_t* g)
 
     op = (exdot_op*)(xd->ops);
     for (i = 0; i < xd->cnt; i++) {
+       tf = null_tf;
        switch (op->op.kind) {
        case xd_filled_ellipse :
        case xd_unfilled_ellipse :
@@ -2958,12 +2962,10 @@ boxf xdotBB (Agraph_t* g)
            op->span = NEW(textspan_t);
            op->span->str = strdup (op->op.u.text.text);
            op->span->just = adjust [op->op.u.text.align];
-
-           op->span->font = new_textfont();
-           op->span->font->name = strdup(fontname);
-           op->span->font->size = fontsize;
-
-           sz = textspan_size (GD_gvc(g), op->span);
+           tf.name = fontname;
+           tf.size = fontsize;
+            op->span->font = dtinsert(gvc->textfont_dt, &tf);
+           sz = textspan_size (gvc, op->span);
            bb0 = textBB (op->op.u.text.x, op->op.u.text.y, op->span);
            op->bb = bb0;
            expandBB (&bb, bb0.LL);
index b81924a08c2ad002c164ad838269e8625cc486ba..e21c93740f39d14a4d35a8fd245545665fcac42f 100644 (file)
@@ -16,6 +16,7 @@
 #include "htmltable.h"
 #include "htmlparse.h"
 #include "htmllex.h"
+#include "cdt.h"
 #include <ctype.h>
 
 #ifdef HAVE_EXPAT
@@ -565,14 +566,14 @@ static htmlimg_t *mkImg(char **atts)
 
 static textfont_t *mkFont(GVC_t *gvc, char **atts, int flags, int ul)
 {
-    textfont_t *font = new_textfont();
+    textfont_t tf = {NULL,NULL,NULL,0.0,0,0};
 
-    font->size = -1.0;         /* unassigned */
-    font->flags = flags;
+    tf.size = -1.0;            /* unassigned */
+    tf.flags = flags;
     if (atts)
-       doAttrs(font, font_items, sizeof(font_items) / ISIZE, atts, "<FONT>");
+       doAttrs(&tf, font_items, sizeof(font_items) / ISIZE, atts, "<FONT>");
 
-    return font;
+    return dtinsert(gvc->textfont_dt, &tf);
 }
 
 static htmlcell_t *mkCell(char **atts)
index ca6bcbbddc24c09d01a40d55b18ac561ee456c5c..723dc376282aa6397c9e9f6d6f20788b53995d05 100644 (file)
@@ -125,8 +125,6 @@ free_fitem(Dt_t* d, fitem* p, Dtdisc_t* ds)
 {
     if (p->ti.str)
        free (p->ti.str);
-    if (p->ti.font)
-        unref_textfont (p->ti.font);
     free (p);
 }
 
@@ -140,7 +138,6 @@ free_fspan(Dt_t* d, fspan* p, Dtdisc_t* ds)
        ti = p->lp.items;
        for (i = 0; i < p->lp.nitems; i++) {
            if (ti->str) free (ti->str);
-           if (ti->font) unref_textfont (ti->font);
            ti++;
        }
        free (p->lp.items);
@@ -332,7 +329,6 @@ freeFontstack(void)
     sfont_t* next;
 
     for (s = HTMLstate.fontstack; (next = s->pfont); s = next) {
-       unref_textfont (s->cfont);
        free(s);
     }
 }
@@ -417,7 +413,6 @@ popFont (void)
     sfont_t* curfont = HTMLstate.fontstack;
     sfont_t* prevfont = curfont->pfont;
 
-    unref_textfont (curfont->cfont);
     free (curfont);
     HTMLstate.fontstack = prevfont;
 }
index 56e11bcf6834d2cc30bd3f8185814ec568ab1d8c..f5dffa1abd6f7b40d97be41d2114844259aa6ac1 100644 (file)
@@ -37,6 +37,7 @@
 #include "agxbuf.h"
 #include "pointset.h"
 #include "intset.h"
+#include "cdt.h"
 
 #define DEFAULT_BORDER    1
 #define DEFAULT_CELLPADDING  2
@@ -759,8 +760,6 @@ void free_html_text(htmltxt_t * t)
        for (j = 0; j < tl->nitems; j++) {
            if (ti->str)
                free(ti->str);
-           if (ti->font)
-               unref_textfont(ti->font);
            if (ti->layout && ti->free_layout)
                ti->free_layout(ti->layout);
            ti++;
@@ -807,8 +806,6 @@ static void free_html_tbl(htmltbl_t * tbl)
        }
        free(tbl->u.n.cells);
     }
-    if (tbl->font)
-       unref_textfont(tbl->font);
     free_html_data(&tbl->data);
     free(tbl);
 }
@@ -959,15 +956,14 @@ static int size_html_txt(GVC_t *gvc, htmltxt_t * ftxt, htmlenv_t * env)
     int i, j;
     double width;
     char *fname;
+    int fflags;
     textspan_t lp;
+    textfont_t tf = {NULL,NULL,NULL,0.0,0,0};
     double maxoffset, mxysize;
     int simple = 1;              /* one item per span, same font size/face, no flags */
     double prev_fsize = -1;
     char* prev_fname = NULL;
 
-    lp.font = new_textfont();   /* FIXME allocated - but where unref'ed ? */
-                                /* FIXME use by ref if not going to modify */
-
     for (i = 0; i < ftxt->nspans; i++) {
        if (ftxt->spans[i].nitems > 1) {
            simple = 0;
@@ -1015,11 +1011,11 @@ static int size_html_txt(GVC_t *gvc, htmltxt_t * ftxt, htmlenv_t * env)
                                     env->obj);
            if (ftxt->spans[i].items[j].font) {
                if (ftxt->spans[i].items[j].font->flags)
-                   lp.font->flags = ftxt->spans[i].items[j].font->flags;
+                   fflags = ftxt->spans[i].items[j].font->flags;
                else if (env->finfo.flags > 0)
-                   lp.font->flags = env->finfo.flags;
+                   fflags = env->finfo.flags;
                else
-                   lp.font->flags = 0;
+                   fflags = 0;
                if (ftxt->spans[i].items[j].font->size > 0)
                    fsize = ftxt->spans[i].items[j].font->size;
                else
@@ -1031,24 +1027,19 @@ static int size_html_txt(GVC_t *gvc, htmltxt_t * ftxt, htmlenv_t * env)
            } else {
                fsize = env->finfo.size;
                fname = env->finfo.name;
-               lp.font->flags = 0;
+               fflags = 0;
            }
-           lp.font->name = fname;
-           lp.font->size = fsize;
+           tf.name=fname;
+           tf.size=fsize;
+           tf.flags=fflags;
+           lp.font = dtinsert(gvc->textfont_dt, &tf);
            sz = textspan_size(gvc, &lp);
            free(ftxt->spans[i].items[j].str);
            ftxt->spans[i].items[j].str = lp.str;
            ftxt->spans[i].items[j].size.x = sz.x;
            ftxt->spans[i].items[j].yoffset_layout = lp.yoffset_layout;
            ftxt->spans[i].items[j].yoffset_centerline = lp.yoffset_centerline;
-
-/* FIXME !! */
-           ftxt->spans[i].items[j].font = new_textfont();
-           ftxt->spans[i].items[j].font->postscript_alias = lp.font->postscript_alias;
-           ftxt->spans[i].items[j].font->name = strdup(fname);
-           ftxt->spans[i].items[j].font->size = fsize;
-           ftxt->spans[i].items[j].font->flags = lp.font->flags;
-/**/
+            ftxt->spans[i].items[j].font = lp.font;
            ftxt->spans[i].items[j].layout = lp.layout;
            ftxt->spans[i].items[j].free_layout = lp.free_layout;
            width += sz.x;
index 46f80584c871cc591e86c930bd8c0be5c38b8eb0..157ec2dbd9f2228fc8dad4462ba527c6448995cc 100644 (file)
@@ -22,6 +22,7 @@ static void storeline(GVC_t *gvc, textlabel_t *lp, char *line, char terminator)
 {
     pointf size;
     textspan_t *span;
+    static textfont_t tf;
     int oldsz = lp->u.txt.nspans + 1;
 
     lp->u.txt.span = ZALLOC(oldsz + 1, lp->u.txt.span, textspan_t, oldsz);
@@ -29,9 +30,9 @@ static void storeline(GVC_t *gvc, textlabel_t *lp, char *line, char terminator)
     span->str = line;
     span->just = terminator;
     if (line && line[0]) {
-       span->font = new_textfont();
-        span->font->name = strdup(lp->fontname);
-        span->font->size = lp->fontsize;
+       tf.name = lp->fontname;
+       tf.size = lp->fontsize;
+       span->font = dtinsert(gvc->textfont_dt, &tf);
         size = textspan_size(gvc, span);
     }
     else {
@@ -200,8 +201,6 @@ void free_textspan(textspan_t * tl, int cnt)
            free(tlp->str);
        if (tlp->layout && tlp->free_layout)
            tlp->free_layout (tlp->layout);
-       if (tlp->font)
-           unref_textfont(tlp->font);
        tlp++;
     }
     free(tl);
index 1b9f8ca79dca4be31e7d912f8685c1899d1c8891..656672f92e6997d50b16ae8ed1ae23b29bfd0a63 100644 (file)
@@ -158,7 +158,6 @@ extern "C" {
     extern stroke_t* taper (bezier*, double (*radfunc_t)(double,double,double), double initwid, int linejoin, int linecap);
     extern stroke_t* taper0 (bezier* bez, double initwid);
     extern pointf textspan_size(GVC_t * gvc, textspan_t * span);
-    extern textfont_t * new_textfont(void);
     extern Dt_t * textfont_dict_open(GVC_t *gvc);
     extern void textfont_dict_close(GVC_t *gvc);
     extern void ref_textfont(textfont_t *tf);
index cbb06ce5d8aec0eea22621613968aecc8195c878..9abbbb3a58ce37d03a5006ebd4fbf6d6adcf179f 100644 (file)
@@ -203,7 +203,10 @@ pointf textspan_size(GVC_t *gvc, textspan_t * span)
     font = span->font;
 
     assert(font->name);
-    font->postscript_alias = translate_postscript_fontname(font->name);
+
+    /* only need to find alias once per font, since they are unique in dict */
+    if (! font->postscript_alias) 
+        font->postscript_alias = translate_postscript_fontname(font->name);
 
     if (Verbose && emit_once(font->name))
        fpp = &fontpath;
@@ -222,119 +225,64 @@ pointf textspan_size(GVC_t *gvc, textspan_t * span)
     return span->size;
 }
 
-textfont_t * new_textfont(void)
-{
-    textfont_t *tf = calloc(1, sizeof(textfont_t));
-    assert(tf);
-    return tf;
-}
-
-void ref_textfont(textfont_t * tf)
-{
-    tf->cnt++;
-}
-
-void unref_textfont(textfont_t * tf)
-{
-    assert(tf);
-    if (tf->cnt) {
-       tf->cnt--;
-    }
-    else {
-       if (tf->name)
-           free(tf->name);
-       if (tf->color)
-           free(tf->color);
-       free(tf);
-    }
-}
-
 static Void_t* textfont_makef(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)
 {
-       textfont_t *f1 = (textfont_t*)obj;
-       textfont_t *f2 = calloc(1,sizeof(textfont_t));
-       
-       /* key */
-       if (f1->name) f2->name = strdup(f1->name);
-       if (f1->color) f2->color = strdup(f1->color);
-       f2->flags = f1->flags;
-       f2->size = f1->size;
-
-       /* non key */
-       f2->postscript_alias = f1->postscript_alias;
-
-       return f2;
+    textfont_t *f1 = (textfont_t*)obj;
+    textfont_t *f2 = calloc(1,sizeof(textfont_t));
+    
+    /* key */
+    if (f1->name) f2->name = strdup(f1->name);
+    if (f1->color) f2->color = strdup(f1->color);
+    f2->flags = f1->flags;
+    f2->size = f1->size;
+
+    /* non key */
+    f2->postscript_alias = f1->postscript_alias;
+
+    return f2;
 }
 
 static void textfont_freef(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)
 {
-       textfont_t *f = (textfont_t*)obj;
+    textfont_t *f = (textfont_t*)obj;
 
-       if (f->name) free(f->name);
-       if (f->color) free(f->color);
-       free(f);
+    if (f->name) free(f->name);
+    if (f->color) free(f->color);
+    free(f);
 }
 
 static int textfont_comparf (Dt_t* dt, Void_t* key1, Void_t* key2, Dtdisc_t* disc)
 {
-       int rc;
-       textfont_t *f1 = (textfont_t*)key1, *f2 = (textfont_t*)key2;
-
-       rc = strcmp(f1->name, f2->name);
-       if (rc) return rc;
-       rc = strcmp(f1->color, f2->color);
-       if (rc) return rc;
-       rc = (f1->flags - f2->flags);
-       if (rc) return rc;
-       if (f1->size > f2->size) return 1;
-       if (f1->size < f2->size) return -1;
-       return 0;
+    int rc;
+    textfont_t *f1 = (textfont_t*)key1, *f2 = (textfont_t*)key2;
+
+    if (f1->name || f2->name) {
+        if (! f1->name) return -1;
+        if (! f2->name) return 1;
+        rc = strcmp(f1->name, f2->name);
+        if (rc) return rc;
+    }
+    if (f1->color || f2->color) {
+        if (! f1->color) return -1;
+        if (! f2->color) return 1;
+        rc = strcmp(f1->color, f2->color);
+        if (rc) return rc;
+    }
+    rc = (f1->flags - f2->flags);
+    if (rc) return rc;
+    if (f1->size < f2->size) return -1;
+    if (f1->size > f2->size) return 1;
+    return 0;
 }
 
 Dt_t * textfont_dict_open(GVC_t *gvc)
 {
-       DTDISC(&(gvc->textfont_disc),0,sizeof(textfont_t),-1,textfont_makef,textfont_freef,textfont_comparf,NULL,NULL,NULL);
-       gvc->textfont_dt = dtopen(&(gvc->textfont_disc), Dtoset);
-       return gvc->textfont_dt;
+    DTDISC(&(gvc->textfont_disc),0,sizeof(textfont_t),-1,textfont_makef,textfont_freef,textfont_comparf,NULL,NULL,NULL);
+    gvc->textfont_dt = dtopen(&(gvc->textfont_disc), Dtoset);
+    return gvc->textfont_dt;
 }
 
 void textfont_dict_close(GVC_t *gvc)
 {
-       dtclose(gvc->textfont_dt);
-}
-       
-
-#if 0
-
-textfont_t font1 = { "Times", "black", 0 };
-textfont_t font2 = { "Arial", "black", 0 };
-textfont_t font3 = { "Arial", "black", 4 };
-textfont_t font4 = { "Arial", "black", 0 };  /* dup of 2 */
-textfont_t font5 = { "Arial", "red", 0 };
-textfont_t font6 = { "Times", "black", 0 };  /* dup of 1 */
-       
-int main (void) 
-{
-       Dt_t *textfont_dt;
-       font_t *f1 = &font1, *f2 = &font2, *f3 = &font3, *f4 = &font4, *f5 = &font5, *f6 = &font6;
-
-       fprintf(stderr,"%p %p %p %p %p %p\n", f1, f2, f3, f4, f5, f6);
-       fprintf(stderr,"%s %s %s %s %s %s\n", f1->name, f2->name, f3->name, f4->name, f5->name, f6->name);
-
-       textfont_dt = dtopen( &textfont_disc, Dtoset);
-
-       f1 = dtinsert(textfont_dt, f1);
-       f2 = dtinsert(textfont_dt, f2);
-       f3 = dtinsert(textfont_dt, f3);
-       f4 = dtinsert(textfont_dt, f4);
-       f5 = dtinsert(textfont_dt, f5);
-       f6 = dtinsert(textfont_dt, f6);
-
-       fprintf(stderr,"%p %p %p %p %p %p\n", f1, f2, f3, f4, f5, f6);
-       fprintf(stderr,"%s %s %s %s %s %s\n", f1->name, f2->name, f3->name, f4->name, f5->name, f6->name);
-
-       dtclose(textfont_dt);
-
-       return 0;
+    dtclose(gvc->textfont_dt);
 }
-#endif