op->bb = ptsBB (op->op.u.polygon.pts, op->op.u.polygon.cnt, &bb);
break;
case xd_text :
+#if 1
op->span = NEW(textspan_t);
op->span->str = strdup (op->op.u.text.text);
op->span->just = adjust [op->op.u.text.align];
tf.size = fontsize;
op->span->font = dtinsert(gvc->textfont_dt, &tf);
sz = textspan_size (gvc, op->span);
+#else
+// thinking about it ....
+ op->span = new_textspan(gvc, op->op.u.text.text, adjust [op->op.u.text.align], NULL, fontname, fontsize, 0);
+#endif
bb0 = textBB (op->op.u.text.x, op->op.u.text.y, op->span);
op->bb = bb0;
expandBB (&bb, bb0.LL);
return rv;
}
-/* free_textspan:
- * Free resources related to textspan_t.
- * tl is an array of cnt textspan_t's.
- * It is also assumed that the text stored in the str field
- * is all stored in one large buffer shared by all of the textspan_t,
- * so only the first one needs to free its tlp->str.
- */
-void free_textspan(textspan_t * tl, int cnt)
-{
- int i;
- textspan_t* tlp = tl;
-
- if (!tl) return;
- for (i = 0; i < cnt; i++) {
- if ((i == 0) && tlp->str)
- free(tlp->str);
- if (tlp->layout && tlp->free_layout)
- tlp->free_layout (tlp->layout);
- tlp++;
- }
- free(tl);
-}
-
void free_label(textlabel_t * p)
{
if (p) {
angle = -0.25 * M_PI;
else if (angle == M_PI * 0.5)
angle = 0;
+/* clang complains about self assignemnt:
else if (angle == M_PI * 0.25)
angle = angle;
+ */
else if (angle == 0)
angle = M_PI * 0.5;
else if (angle == M_PI * -0.25)
angle = M_PI * 0.75;
else if (angle == M_PI * -0.5)
angle = M_PI;
+/* clang complains about self assignemnt:
else if (angle == M_PI * -0.75)
angle = angle;
+ */
break;
}
return angle;
assert(span->font);
font = span->font;
+ span->color = span->font->color;
+
assert(font->name);
/* only need to find alias once per font, since they are unique in dict */
return span->size;
}
+#if 0
+textspan_t * new_textspan(GVC_t *gvc, const char* str, const char *affinity, const char *color, const textfont_t *font)
+{
+ textspan_t *ts;
+
+ ts = calloc(1, sizeof(textspan_t));
+ assert(ts);
+
+ ts->str = strdup(str);
+ assert(ts->str);
+
+// ts->affinity = strdup(affinity);
+// assert(ts->affinity);
+
+// ts->color = strdup(color);
+// assert(ts->color)
+
+ ts->font = dtinsert(gvc->textfont_dt, font);
+ assert(ts->font);
+
+ textspan_size(gvc, ts);
+
+ return ts;
+}
+#endif
+
+/* free_textspan:
+ * Free resources related to textspan_t.
+ * ts is an array of cnt textspan_t's.
+ * It is also assumed that the text stored in the str field
+ * is all stored in one large buffer shared by all of the textspan_t,
+ * so only the first one needs to free its tsp->str.
+ */
+void free_textspan(textspan_t * ts, int cnt)
+{
+ int i;
+ textspan_t* tsp = ts;
+
+ if (!ts) return;
+ for (i = 0; i < cnt; i++) {
+ if ((i == 0) && tsp->str)
+ free(tsp->str);
+ if (tsp->layout && tsp->free_layout)
+ tsp->free_layout (tsp->layout);
+ tsp++;
+ }
+ free(ts);
+}
+
static Void_t* textfont_makef(Dt_t* dt, Void_t* obj, Dtdisc_t* disc)
{
textfont_t *f1 = (textfont_t*)obj;
int rc;
textfont_t *f1 = (textfont_t*)key1, *f2 = (textfont_t*)key2;
+ // C-locale sorted comparison of name, incl. dealing with null
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 0
+ // FIXME - color is not a useful differentiator of font from a layout pov - move to textspan
+ // C-locale sorted comparison of name, incl. dealing with null
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;
}
+#endif
+ // integer comparison of flags
rc = (f1->flags - f2->flags);
if (rc) return rc;
+ // comparison of size doubles - FIXME does this need some tolerance?
if (f1->size < f2->size) return -1;
if (f1->size > f2->size) return 1;
return 0;
/* atomic unit of text emitted using a single htmlfont_t */
typedef struct {
char *str; /* stored in utf-8 */
+ char *color;
textfont_t *font;
void *layout;
void (*free_layout) (void *layout); /* FIXME - this is ugly */
{
gvrender_engine_t *gvre = job->render.engine;
pointf PF;
+ gvcolor_t *color = &(job->obj->pencolor);
if (span->str && span->str[0]
&& (!job->obj /* because of xdgen non-conformity */
else
PF = gvrender_ptf(job, p);
if (gvre) {
+#if 1
+ if (span->font->color) {
+ gvrender_resolve_color(job->render.features, span->font->color, color);
+ if (gvre->resolve_color)
+ gvre->resolve_color(job, color);
+ }
+#endif
if (gvre->textspan)
gvre->textspan(job, PF, span);
}