point coord(node_t * n) { pointf pf; pf.x = ND_pos(n)[0]; pf.y = ND_pos(n)[1]; return cvt2pt(pf); }
void do_graph_label(graph_t* g) { char *p, *pos; int pos_ix; /* it would be nice to allow multiple graph labels in the future */ if ((p = agget(g,"label"))) { g->u.label = make_label(p, late_float(g,agfindattr(g,"fontsize"),DEFAULT_FONTSIZE,MIN_FONTSIZE), late_nnstring(g,agfindattr(g,"fontname"),DEFAULT_FONTNAME), late_nnstring(g,agfindattr(g,"fontcolor"),DEFAULT_COLOR),g); pos = agget(g,"labelloc"); if (!g->u.left_to_right) { if (!pos || (pos[0] != 'b')) pos_ix = TOP_IX; else pos_ix = BOTTOM_IX; g->u.border[pos_ix] = cvt2pt(g->u.label->dimen); } else { /* when rotated, the labels will be restored to TOP or BOTTOM */ if (!pos || (pos[0] != 'b')) pos_ix = RIGHT_IX; else pos_ix = LEFT_IX; g->u.border[pos_ix].x = g->u.label->dimen.y; g->u.border[pos_ix].y = g->u.label->dimen.x; } } }
point coord(node_t *n) { pointf pf; pf.x = n->u.pos[0]; pf.y = n->u.pos[1]; return cvt2pt(pf); }
void osize_label(textlabel_t * label, int *b, int *t, int *l, int *r) { point pt, sz2; pointf dimen; dimen = label->dimen; PAD(dimen); sz2 = cvt2pt(label->dimen); sz2.x /= 2; sz2.y /= 2; pt = add_points(label->p, sz2); if (*r < pt.x) *r = pt.x; if (*t < pt.y) *t = pt.y; pt = sub_points(label->p, sz2); if (*l > pt.x) *l = pt.x; if (*b > pt.y) *b = pt.y; }
/* do_graph_label: * If the ifdef'ed parts are added, clusters are guaranteed not * to overlap and have sufficient room for the label. The problem * is this approach does not use the actual size of the cluster, so * the resulting cluster tends to be far too large. */ void do_graph_label(graph_t* sg) { char *p, *pos, *just; int pos_ix; GVC_t *gvc = GD_gvc(sg->root); /* it would be nice to allow multiple graph labels in the future */ if ((p = agget(sg,"label"))) { char pos_flag; int html = aghtmlstr(p); GD_has_labels(sg->root) |= GRAPH_LABEL; GD_label(sg) = make_label(gvc, html,strdup_and_subst_graph(p,sg), late_double(sg,agfindattr(sg,"fontsize"),DEFAULT_FONTSIZE,MIN_FONTSIZE), late_nnstring(sg,agfindattr(sg,"fontname"),DEFAULT_FONTNAME), late_nnstring(sg,agfindattr(sg,"fontcolor"),DEFAULT_COLOR),sg); if (html) { if (make_html_label(gvc, GD_label(sg), sg)) agerr (AGPREV, "in label of graph %s\n", sg->name); } /* set label position */ pos = agget(sg,"labelloc"); if (sg != sg->root) { if (pos && (pos[0] == 'b')) pos_flag = LABEL_AT_BOTTOM; else pos_flag = LABEL_AT_TOP; } else { if (pos && (pos[0] == 't')) pos_flag = LABEL_AT_TOP; else pos_flag = LABEL_AT_BOTTOM; } just = agget(sg,"labeljust"); if (just) { if (just[0] == 'l') pos_flag |= LABEL_AT_LEFT; else if (just[0] == 'r') pos_flag |= LABEL_AT_RIGHT; } GD_label_pos(sg) = pos_flag; if(!GD_left_to_right(sg->root)) { point dpt; dpt = cvt2pt(GD_label(sg)->dimen); if (GD_label_pos(sg) & LABEL_AT_TOP) pos_ix = TOP_IX; else pos_ix = BOTTOM_IX; GD_border(sg)[pos_ix] = dpt; #if 0 if(g != g->root) { GD_border(g)[LEFT_IX].x = dpt.x/2; GD_border(g)[RIGHT_IX].x = dpt.x/2; GD_border(g)[LEFT_IX].y = 0; GD_border(g)[RIGHT_IX].y = 0; } #endif } else { point dpt; dpt = cvt2pt(GD_label(sg)->dimen); /* when rotated, the labels will be restored to TOP or BOTTOM */ if (GD_label_pos(sg) & LABEL_AT_TOP) pos_ix = RIGHT_IX; else pos_ix = LEFT_IX; GD_border(sg)[pos_ix].x = dpt.y; GD_border(sg)[pos_ix].y = dpt.x; #if 0 if(g != g->root) { GD_border(g)[TOP_IX].y = dpt.x/2; GD_border(g)[BOTTOM_IX].y = dpt.x/2; GD_border(g)[TOP_IX].x = 0; GD_border(g)[BOTTOM_IX].x = 0; } #endif } } }