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;
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;
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 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;
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);
}
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);
sfont_t* next;
for (s = HTMLstate.fontstack; (next = s->pfont); s = next) {
- free_html_font (s->cfont);
+ unref_textfont (s->cfont);
free(s);
}
}
sfont_t* curfont = HTMLstate.fontstack;
sfont_t* prevfont = curfont->pfont;
- free_html_font (curfont->cfont);
+ unref_textfont (curfont->cfont);
free (curfont);
HTMLstate.fontstack = prevfont;
}
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);
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++;
free(tbl->u.n.cells);
}
if (tbl->font)
- free_html_font(tbl->font);
+ unref_textfont(tbl->font);
free_html_data(&tbl->data);
free(tbl);
}
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) {
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;
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);
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 {
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);
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);
*/
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 */