#include "agxbuf.h"
#include "pointset.h"
#include "intset.h"
+#include "cdt.h"
#define DEFAULT_BORDER 1
#define DEFAULT_CELLPADDING 2
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++;
}
free(tbl->u.n.cells);
}
- if (tbl->font)
- unref_textfont(tbl->font);
free_html_data(&tbl->data);
free(tbl);
}
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;
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
} 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;
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;
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