/* doBorder: * Draw rectangle of width border inside rectangle given * by box. If border is 1, we call use a single call to gvrender_polygon. * (We have set linewidth to 1 below.) Otherwise, we use four separate * filled rectangles. We could use a richer graphics model, as things * can go wrong when cell spacing and borders are small. * We decrement the border value by 1, as typically a filled rectangle * from x to x+border will all pixels from x to x+border, and thus have * width border+1. */ static void doBorder(GVJ_t * job, char *color, int border, box B) { pointf pt; boxf BF; double wd, ht; gvrender_begin_context(job); if (!color) color = "black"; gvrender_set_fillcolor(job, color); gvrender_set_pencolor(job, color); B2BF(B, BF); if (border == 1) { gvrender_box(job, BF, 0); } else { border--; ht = BF.UR.y - BF.LL.y; wd = BF.UR.x - BF.LL.x; doSide(job, BF.LL, border, ht); pt.x = BF.LL.x; pt.y = BF.UR.y; doSide(job, pt, wd, -border); doSide(job, BF.UR, -border, -ht); pt.x = BF.UR.x; pt.y = BF.LL.y; doSide(job, pt, -wd, border); } gvrender_end_context(job); }
static void doFill(GVJ_t * job, char *color, box B) { boxf BF; gvrender_set_fillcolor(job, color); gvrender_set_pencolor(job, color); B2BF(B, BF); gvrender_box(job, BF, 1); }
/* size_html_img: */ static int size_html_img(htmlimg_t * img, htmlenv_t * env) { box b; int rv; b.LL.x = b.LL.y = 0; b.UR = gvusershape_size(env->g, img->src); if ((b.UR.x == -1) && (b.UR.y == -1)) { rv = 1; b.UR.x = b.UR.y = 0; agerr(AGERR, "No or improper image file=\"%s\"\n", img->src); } else { rv = 0; GD_has_images(env->g) = TRUE; } B2BF(b, img->box); return rv; }
/* compute_bb: * Compute bounding box of g using nodes, splines, and clusters. * Assumes bb of clusters already computed. * store in GD_bb. */ void compute_bb(graph_t * g) { node_t *n; edge_t *e; boxf b, bb; boxf BF; pointf ptf, s2; int i, j; if ((agnnodes(g) == 0) && (GD_n_cluster(g) ==0)) { bb.LL = pointfof(0, 0); bb.UR = pointfof(0, 0); return; } bb.LL = pointfof(INT_MAX, INT_MAX); bb.UR = pointfof(-INT_MAX, -INT_MAX); for (n = agfstnode(g); n; n = agnxtnode(g, n)) { ptf = coord(n); s2.x = ND_xsize(n) / 2.0; s2.y = ND_ysize(n) / 2.0; b.LL = sub_pointf(ptf, s2); b.UR = add_pointf(ptf, s2); EXPANDBB(bb,b); if (ND_xlabel(n) && ND_xlabel(n)->set) { bb = addLabelBB(bb, ND_xlabel(n), GD_flip(g)); } for (e = agfstout(g, n); e; e = agnxtout(g, e)) { if (ED_spl(e) == 0) continue; for (i = 0; i < ED_spl(e)->size; i++) { for (j = 0; j < (((Agedgeinfo_t*)AGDATA(e))->spl)->list[i].size; j++) { ptf = ED_spl(e)->list[i].list[j]; EXPANDBP(bb,ptf); } } if (ED_label(e) && ED_label(e)->set) { bb = addLabelBB(bb, ED_label(e), GD_flip(g)); } if (ED_head_label(e) && ED_head_label(e)->set) { bb = addLabelBB(bb, ED_head_label(e), GD_flip(g)); } if (ED_tail_label(e) && ED_tail_label(e)->set) { bb = addLabelBB(bb, ED_tail_label(e), GD_flip(g)); } if (ED_xlabel(e) && ED_xlabel(e)->set) { bb = addLabelBB(bb, ED_xlabel(e), GD_flip(g)); } } } for (i = 1; i <= GD_n_cluster(g); i++) { B2BF(GD_bb(GD_clust(g)[i]), BF); EXPANDBB(bb,BF); } if (GD_label(g) && GD_label(g)->set) { bb = addLabelBB(bb, GD_label(g), GD_flip(g)); } GD_bb(g) = bb; }