/* pos_html_cell: */ static void pos_html_cell(htmlcell_t * cp, box pos, int sides) { int delx, dely; point oldsz; box cbox; if (!cp->data.pencolor) cp->data.pencolor = cp->parent->data.pencolor; /* If fixed, align cell */ if (cp->data.flags & FIXED_FLAG) { oldsz = cp->data.box.UR; delx = (pos.UR.x - pos.LL.x) - oldsz.x; if (delx > 0) { switch (cp->data.flags & HALIGN_MASK) { case HALIGN_LEFT: pos.UR.x = pos.LL.x + oldsz.x; break; case HALIGN_RIGHT: pos.UR.x += delx; pos.LL.x += delx; break; default: pos.LL.x += delx / 2; pos.UR.x -= delx / 2; break; } } dely = (pos.UR.y - pos.LL.y) - oldsz.y; if (dely > 0) { switch (cp->data.flags & VALIGN_MASK) { case VALIGN_BOTTOM: pos.UR.y = pos.LL.y + oldsz.y; break; case VALIGN_TOP: pos.UR.y += dely; pos.LL.y += dely; break; default: pos.LL.y += dely / 2; pos.UR.y -= dely / 2; break; } } } cp->data.box = pos; cp->data.sides = sides; /* set up child's position */ cbox.LL.x = pos.LL.x + cp->data.border + cp->data.pad; cbox.LL.y = pos.LL.y + cp->data.border + cp->data.pad; cbox.UR.x = pos.UR.x - cp->data.border - cp->data.pad; cbox.UR.y = pos.UR.y - cp->data.border - cp->data.pad; if (cp->child.kind == HTML_TBL) { pos_html_tbl(cp->child.u.tbl, cbox, sides); } else if (cp->child.kind == HTML_IMAGE) { pos_html_img(cp->child.u.img, cbox); } else { char dfltalign; int af; oldsz = cp->child.u.txt->box.UR; delx = (cbox.UR.x - cbox.LL.x) - oldsz.x; /* If the cell is larger than the text block and alignment is * done at textblock level, the text box is shrunk accordingly. */ if ((delx > 0)&&((af=(cp->data.flags & HALIGN_MASK)) != HALIGN_TEXT)) { switch (af) { case HALIGN_LEFT: cbox.UR.x -= delx; break; case HALIGN_RIGHT: cbox.LL.x += delx; break; default: cbox.LL.x += delx / 2; cbox.UR.x -= delx / 2; break; } } dely = (cbox.UR.y - cbox.LL.y) - oldsz.y; if (dely > 0) { switch (cp->data.flags & VALIGN_MASK) { case VALIGN_BOTTOM: cbox.UR.y -= dely; break; case VALIGN_TOP: cbox.LL.y += dely; break; default: cbox.LL.y += dely / 2; cbox.UR.y -= dely / 2; break; } } cp->child.u.txt->box = cbox; /* Set default text alignment */ switch (cp->data.flags & BALIGN_MASK) { case BALIGN_LEFT: dfltalign = 'l'; break; case BALIGN_RIGHT: dfltalign = 'r'; break; default: dfltalign = 'n'; break; } pos_html_txt (cp->child.u.txt, dfltalign); } }
/* make_html_label: * Return non-zero if problem parsing HTML. In this case, use object name. */ int make_html_label(graph_t *g, textlabel_t * lp, void *obj) { int rv; int wd2, ht2; box box; htmllabel_t *lbl; htmlenv_t env; env.obj = obj; switch (agobjkind(obj)) { case AGGRAPH: env.g = ((Agraph_t *) obj)->root; break; case AGNODE: env.g = ((Agnode_t *) obj)->graph; break; case AGEDGE: env.g = ((Agedge_t *) obj)->head->graph; break; } env.finfo.size = lp->fontsize; env.finfo.name = lp->fontname; env.finfo.color = lp->fontcolor; lbl = parseHTML(lp->text, &rv, GD_charset(env.g)); if (!lbl) { /* Parse of label failed; revert to simple text label */ agxbuf xb; unsigned char buf[SMALLBUF]; agxbinit(&xb, SMALLBUF, buf); lp->html = FALSE; lp->text = strdup(nameOf(obj, &xb)); size_label(env.g, lp); agxbfree(&xb); return rv; } if (lbl->kind == HTML_TBL) { lbl->u.tbl->data.pencolor = getPenColor(obj); rv |= size_html_tbl(g, lbl->u.tbl, NULL, &env); wd2 = (lbl->u.tbl->data.box.UR.x + 1) / 2; ht2 = (lbl->u.tbl->data.box.UR.y + 1) / 2; box = boxof(-wd2, -ht2, wd2, ht2); pos_html_tbl(lbl->u.tbl, box, BOTTOM | RIGHT | TOP | LEFT); lp->dimen.x = box.UR.x - box.LL.x; lp->dimen.y = box.UR.y - box.LL.y; } else { rv |= size_html_txt(g, lbl->u.txt, &env); wd2 = (lbl->u.txt->box.UR.x + 1) / 2; ht2 = (lbl->u.txt->box.UR.y + 1) / 2; box = boxof(-wd2, -ht2, wd2, ht2); lbl->u.txt->box = box; lp->dimen.x = box.UR.x - box.LL.x; lp->dimen.y = box.UR.y - box.LL.y; } lp->u.html = lbl; /* If the label is a table, replace label text because this may * be used for the title and alt fields in image maps. */ if (lbl->kind == HTML_TBL) { free (lp->text); lp->text = strdup ("<TABLE>"); } return rv; }
/* make_html_label: * Return non-zero if problem parsing HTML. In this case, use object name. */ int make_html_label(void *obj, textlabel_t * lp) { int rv; double wd2, ht2; boxf box; graph_t *g; htmllabel_t *lbl; htmlenv_t env; char *s; env.obj = obj; switch (agobjkind(obj)) { #ifdef WITH_CGRAPH case AGRAPH: #else case AGGRAPH: #endif env.g = ((Agraph_t *) obj)->root; break; case AGNODE: env.g = agraphof(((Agnode_t *) obj)); break; case AGEDGE: env.g = agraphof(aghead (((Agedge_t *) obj))); break; } g = env.g->root; env.finfo.size = lp->fontsize; env.finfo.name = lp->fontname; env.finfo.color = lp->fontcolor; lbl = parseHTML(lp->text, &rv, GD_charset(env.g)); if (!lbl) { /* Parse of label failed; revert to simple text label */ agxbuf xb; unsigned char buf[SMALLBUF]; agxbinit(&xb, SMALLBUF, buf); lp->html = FALSE; lp->text = strdup(nameOf(obj, &xb)); switch (lp->charset) { case CHAR_LATIN1: s = latin1ToUTF8(lp->text); break; default: /* UTF8 */ s = htmlEntityUTF8(lp->text, env.g); break; } free(lp->text); lp->text = s; make_simple_label(g, lp); agxbfree(&xb); return rv; } if (lbl->kind == HTML_TBL) { if (! lbl->u.tbl->data.pencolor && getPenColor(obj)) lbl->u.tbl->data.pencolor = strdup(getPenColor(obj)); rv |= size_html_tbl(g, lbl->u.tbl, NULL, &env); wd2 = (lbl->u.tbl->data.box.UR.x + 1) / 2; ht2 = (lbl->u.tbl->data.box.UR.y + 1) / 2; box = boxfof(-wd2, -ht2, wd2, ht2); pos_html_tbl(lbl->u.tbl, box, BOTTOM | RIGHT | TOP | LEFT); lp->dimen.x = box.UR.x - box.LL.x; lp->dimen.y = box.UR.y - box.LL.y; } else { rv |= size_html_txt(g, lbl->u.txt, &env); wd2 = (lbl->u.txt->box.UR.x + 1) / 2; ht2 = (lbl->u.txt->box.UR.y + 1) / 2; box = boxfof(-wd2, -ht2, wd2, ht2); lbl->u.txt->box = box; lp->dimen.x = box.UR.x - box.LL.x; lp->dimen.y = box.UR.y - box.LL.y; } lp->u.html = lbl; /* If the label is a table, replace label text because this may * be used for the title and alt fields in image maps. */ if (lbl->kind == HTML_TBL) { free (lp->text); lp->text = strdup ("<TABLE>"); } return rv; }