]> granicus.if.org Git - graphviz/commitdiff
put textfont_t new.. ref.. unref..() in one place
authorJohn Ellson <ellson@research.att.com>
Wed, 6 Nov 2013 21:02:36 +0000 (16:02 -0500)
committerJohn Ellson <ellson@research.att.com>
Wed, 6 Nov 2013 21:02:36 +0000 (16:02 -0500)
lib/common/emit.c
lib/common/fontmetrics.c
lib/common/htmllex.c
lib/common/htmlparse.y
lib/common/htmltable.c
lib/common/htmltable.h
lib/common/labels.c
lib/common/render.h
lib/common/textspan.h

index e693c09e0d08b11d624e46825e6724d601b1057d..55d8bdb73cc87e30d7dfe4c4781f1b15becc0f1f 100644 (file)
@@ -2958,13 +2958,11 @@ 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];
-/* FIXME - use mkFont() */
-           op->span->font = NEW(textfont_t);
-           op->span->font->name=fontname;
-           op->span->font->size=fontsize;
-           op->span->font->flags=0;
-           op->span->font->cnt=1;
-/**/
+
+           op->span->font = new_textfont();
+           op->span->font->name = strdup(fontname);
+           op->span->font->size = fontsize;
+
            sz = textspan_size (GD_gvc(g), op->span);
            bb0 = textBB (op->op.u.text.x, op->op.u.text.y, op->span);
            op->bb = bb0;
index 013c4e486121431e282d93916953e38224f23c1a..9dc00200b09d98ae3645fdaf88e8a2ea0cc0e09d 100644 (file)
@@ -196,11 +196,10 @@ pointf textspan_size(GVC_t *gvc, textspan_t * span)
     textfont_t *font;
 
     assert(span->font);
-
-/* FIXME -- move into font creation function */
     font = span->font;
+
+    assert(font->name);
     font->postscript_alias = translate_postscript_fontname(font->name);
-/**/
 
     if (Verbose && emit_once(font->name))
        fpp = &fontpath;
@@ -218,3 +217,30 @@ 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);
+    }
+}
index 76cf54a1858414a5b6edd217d0008bcd4b30e528..c9c09defe9770d1ad90bcaa4eb9dff4f3086fab1 100644 (file)
@@ -565,7 +565,7 @@ static htmlimg_t *mkImg(char **atts)
 
 static textfont_t *mkFont(char **atts, int flags, int ul)
 {
-    textfont_t *font = NEW(textfont_t);
+    textfont_t *font = new_textfont();
 
     font->size = -1.0;         /* unassigned */
     font->flags = flags;
index 7b1c8cf90b5f0d4ee95e20a5cd401de80fc1c3cb..e7bfa51852b1b765c59ce9a283680622d393ec8f 100644 (file)
@@ -126,7 +126,7 @@ free_fitem(Dt_t* d, fitem* p, Dtdisc_t* ds)
     if (p->ti.str)
        free (p->ti.str);
     if (p->ti.font)
-        free_html_font (p->ti.font);
+        unref_textfont (p->ti.font);
     free (p);
 }
 
@@ -140,7 +140,7 @@ 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) free_html_font (ti->font);
+           if (ti->font) unref_textfont (ti->font);
            ti++;
        }
        free (p->lp.items);
@@ -332,7 +332,7 @@ freeFontstack(void)
     sfont_t* next;
 
     for (s = HTMLstate.fontstack; (next = s->pfont); s = next) {
-       free_html_font (s->cfont);
+       unref_textfont (s->cfont);
        free(s);
     }
 }
@@ -417,7 +417,7 @@ popFont (void)
     sfont_t* curfont = HTMLstate.fontstack;
     sfont_t* prevfont = curfont->pfont;
 
-    free_html_font (curfont->cfont);
+    unref_textfont (curfont->cfont);
     free (curfont);
     HTMLstate.fontstack = prevfont;
 }
index c6b70a7410aa63822d592d7a4906ded8b8794484..665928998ea2c1fb9b521dc2a136825018fb52ac 100644 (file)
@@ -743,18 +743,6 @@ void emit_html_label(GVJ_t * job, htmllabel_t * lp, textlabel_t * tp)
     freeObj(job);
 }
 
-void free_html_font(textfont_t * fp)
-{
-    fp->cnt--;
-    if (fp->cnt == 0) {
-       if (fp->name)
-           free(fp->name);
-       if (fp->color)
-           free(fp->color);
-       free(fp);
-    }
-}
-
 void free_html_data(htmldata_t * dp)
 {
     free(dp->href);
@@ -782,7 +770,7 @@ void free_html_text(htmltxt_t * t)
            if (ti->str)
                free(ti->str);
            if (ti->font)
-               free_html_font(ti->font);
+               unref_textfont(ti->font);
            if (ti->layout && ti->free_layout)
                ti->free_layout(ti->layout);
            ti++;
@@ -830,7 +818,7 @@ static void free_html_tbl(htmltbl_t * tbl)
        free(tbl->u.n.cells);
     }
     if (tbl->font)
-       free_html_font(tbl->font);
+       unref_textfont(tbl->font);
     free_html_data(&tbl->data);
     free(tbl);
 }
@@ -982,13 +970,13 @@ static int size_html_txt(graph_t * g, htmltxt_t * ftxt, htmlenv_t * env)
     double width;
     char *fname;
     textspan_t lp;
-    textfont_t lhf;
     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 = &lhf;
+    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) {
@@ -1063,7 +1051,14 @@ static int size_html_txt(graph_t * g, htmltxt_t * ftxt, htmlenv_t * env)
            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].layout = lp.layout;
            ftxt->spans[i].items[j].free_layout = lp.free_layout;
            width += sz.x;
index d34c0bd064c441d19b4302a660890a1de5dfd19d..5b4601f6db967bb1a56565353e7e506b7db82d85 100644 (file)
@@ -156,7 +156,6 @@ extern "C" {
     extern void free_html_label(htmllabel_t *, int);
     extern void free_html_data(htmldata_t *);
     extern void free_html_text(htmltxt_t *);
-    extern void free_html_font(textfont_t*);
 
     extern boxf *html_port(node_t * n, char *pname, int* sides);
     extern int html_path(node_t * n, port* p, int side, boxf * rv, int *k);
index a3dc51c79f964287eec7bd81c3d83a15e9835524..46f80584c871cc591e86c930bd8c0be5c38b8eb0 100644 (file)
@@ -29,14 +29,9 @@ static void storeline(GVC_t *gvc, textlabel_t *lp, char *line, char terminator)
     span->str = line;
     span->just = terminator;
     if (line && line[0]) {
-/* FIXME -- use mkFont() */
-       span->font = NEW(textfont_t);
+       span->font = new_textfont();
         span->font->name = strdup(lp->fontname);
         span->font->size = lp->fontsize;
-        span->font->color = NULL;
-        span->font->flags = 0;
-        span->font->cnt = 1;
-/* */
         size = textspan_size(gvc, span);
     }
     else {
@@ -206,7 +201,7 @@ void free_textspan(textspan_t * tl, int cnt)
        if (tlp->layout && tlp->free_layout)
            tlp->free_layout (tlp->layout);
        if (tlp->font)
-           free_html_font(tlp->font);
+           unref_textfont(tlp->font);
        tlp++;
     }
     free(tl);
index 1d1ba17b26e795a5c5c2ba86ef6377ee282d85da..467f75edbd110bfa775c44c10010185411eb69ca 100644 (file)
@@ -158,6 +158,9 @@ 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 void ref_textfont(textfont_t *tf);
+    extern void unref_textfont(textfont_t *tf);
     extern void translate_bb(Agraph_t *, int);
     extern int wedgedEllipse (GVJ_t* job, pointf * pf, char* clrs);
     extern void update_bb_bz(boxf *bb, pointf *cp);
index 7fdb7771d62e70377bf202b0e5dcdb556d1cccb6..4682e20c489ed97a8e59c93d2d53048fdd4da858 100644 (file)
@@ -44,11 +44,11 @@ extern "C" {
      */
     typedef struct {
        char*  name;
-       double size;
        char*  color;
-        int    flags:7;  /* HTML_UL, HTML_IF, HTML_BF, etc. */
        PostscriptAlias *postscript_alias;
-       int    cnt:(sizeof(int) * 8 - 7);   /* reference count */
+       double size;
+       int    flags:7;  /* HTML_UL, HTML_IF, HTML_BF, etc. */
+       unsigned int cnt:(sizeof(unsigned int) * 8 - 7);   /* reference count */
     } textfont_t;
 
     /* atomic unit of text emitted using a single htmlfont_t */