From: ellson Date: Wed, 26 Jan 2005 18:36:16 +0000 (+0000) Subject: start rearranging pagination code X-Git-Tag: LAST_LIBGRAPH~32^2~7992 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ec5ba9d1cb80ca65c865bf5350d4e5c6eb0c5ae;p=graphviz start rearranging pagination code --- diff --git a/lib/common/emit.c b/lib/common/emit.c index 32766f48e..7f8464528 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -33,12 +33,9 @@ char *BaseLineStyle[3] = { "solid\0", "setlinewidth\0001\0", 0 }; int Obj; -static int N_pages = 1; /* w.r.t. unrotated coords */ static int Page; /* w.r.t. unrotated coords */ static int Layer, Nlayers; static char **LayerID; -static point First, Major, Minor; -static point Pages; static box PB; /* drawable region in device coords */ static pointf GP; /* graph page size, in graph coords */ static box CB; /* current page box, in graph coords */ @@ -134,13 +131,13 @@ static void reset_layering(GVC_t * gvc, graph_t * g) LayerID = NULL; /* FIXME - poss leak of array of layer names? */ } -static point pagecode(char c) +static point pagecode(GVC_t *gvc, char c) { point rv; rv.x = rv.y = 0; switch (c) { case 'T': - First.y = Pages.y - 1; + gvc->pagesArrayFirst.y = gvc->pagesArraySize.y - 1; rv.y = -1; break; case 'B': @@ -150,29 +147,31 @@ static point pagecode(char c) rv.x = 1; break; case 'R': - First.x = Pages.x - 1; + gvc->pagesArrayFirst.x = gvc->pagesArraySize.x - 1; rv.x = -1; break; } return rv; } -static void set_pagedir(graph_t * g) +static void set_pagedir(GVC_t *gvc, graph_t * g) { char *str; - Major.x = Major.y = Minor.x = Minor.y = 0; + gvc->pagesArrayMajor.x = gvc->pagesArrayMajor.y + = gvc->pagesArrayMinor.x = gvc->pagesArrayMinor.y = 0; str = agget(g, "pagedir"); if (str && str[0]) { - Major = pagecode(str[0]); - Minor = pagecode(str[1]); + gvc->pagesArrayMajor = pagecode(gvc, str[0]); + gvc->pagesArrayMinor = pagecode(gvc, str[1]); } - if ((abs(Major.x + Minor.x) != 1) || (abs(Major.y + Minor.y) != 1)) { - Major.x = 0; - Major.y = 1; - Minor.x = 1; - Minor.y = 0; - First.x = First.y = 0; + if ((abs(gvc->pagesArrayMajor.x + gvc->pagesArrayMinor.x) != 1) + || (abs(gvc->pagesArrayMajor.y + gvc->pagesArrayMinor.y) != 1)) { + gvc->pagesArrayMajor.x = 0; + gvc->pagesArrayMajor.y = 1; + gvc->pagesArrayMinor.x = 1; + gvc->pagesArrayMinor.y = 0; + gvc->pagesArrayFirst.x = gvc->pagesArrayFirst.y = 0; if (str) agerr(AGWARN, "pagedir=%s ignored\n", str); } @@ -200,9 +199,9 @@ static void setup_pagination(GVC_t * gvc, graph_t * g) /* we don't want graph page to exceed its bounding box */ GP.x = MIN(GP.x, GD_bb(g).UR.x); GP.y = MIN(GP.y, GD_bb(g).UR.y); - Pages.x = (GP.x > 0) ? ceil(((double) GD_bb(g).UR.x) / GP.x) : 1; - Pages.y = (GP.y > 0) ? ceil(((double) GD_bb(g).UR.y) / GP.y) : 1; - N_pages = Pages.x * Pages.y; + gvc->pagesArraySize.x = (GP.x > 0) ? ceil(((double) GD_bb(g).UR.x) / GP.x) : 1; + gvc->pagesArraySize.y = (GP.y > 0) ? ceil(((double) GD_bb(g).UR.y) / GP.y) : 1; + gvc->pagesSize = gvc->pagesArraySize.x * gvc->pagesArraySize.y; /* find the drawable size in device coords */ #if 1 @@ -232,10 +231,10 @@ static void setup_pagination(GVC_t * gvc, graph_t * g) #endif if (GD_drawing(g)->landscape) DS = exch_xy(DS); - Pages.x = Pages.y = N_pages = 1; + gvc->pagesArraySize.x = gvc->pagesArraySize.y = gvc->pagesSize = 1; } - set_pagedir(g); + set_pagedir(gvc, g); /* determine page box including centering */ if (GD_drawing(g)->centered) { @@ -252,12 +251,11 @@ static void setup_pagination(GVC_t * gvc, graph_t * g) static void reset_pagination(GVC_t * gvc, graph_t * g) { - N_pages = 1; Page = 0; - First.x = First.y = 0; - Major.x = Major.y = 0; - Minor.x = Minor.y = 0; - Pages.x = Pages.y = 0; + gvc->pagesArrayFirst.x = gvc->pagesArrayFirst.y = 0; + gvc->pagesArrayMajor.x = gvc->pagesArrayMajor.y = 0; + gvc->pagesArrayMinor.x = gvc->pagesArrayMinor.y = 0; + gvc->pagesArraySize.x = gvc->pagesArraySize.y = gvc->pagesSize = 1; PB.LL.x = PB.LL.y = PB.UR.x = PB.UR.y = 0; GP.x = GP.y = 0; CB.LL.x = CB.LL.y = CB.UR.x = CB.UR.y = 0; @@ -357,18 +355,32 @@ static void setup_page(GVC_t * gvc, point page) offset.y = -page.x * GP.x; } rot = GD_drawing(g)->landscape ? 90 : 0; + gvrender_begin_page(gvc, page, gvc->job->zoom, rot, offset); emit_background(gvc, CB.LL, CB.UR); emit_defaults(gvc); } +static int node_in_CB(GVC_t *gvc, node_t * n) +{ + box nb; + + if (gvc->pagesSize == 1) + return TRUE; + nb.LL.x = ND_coord_i(n).x - ND_lw_i(n); + nb.LL.y = ND_coord_i(n).y - ND_ht_i(n) / 2; + nb.UR.x = ND_coord_i(n).x + ND_rw_i(n); + nb.UR.y = ND_coord_i(n).y + ND_ht_i(n) / 2; + return rect_overlap(CB, nb); +} + static void emit_node(GVC_t * gvc, node_t * n) { char *s, *url = NULL, *tooltip = NULL, *target = NULL; if (ND_shape(n) == NULL) return; - if (node_in_layer(n->graph, n) && node_in_CB(n) && (ND_state(n) != Page)) { + if (node_in_layer(n->graph, n) && node_in_CB(gvc, n) && (ND_state(n) != Page)) { gvrender_begin_node(gvc, n); if (((s = agget(n, "href")) && s[0]) || ((s = agget(n, "URL")) && s[0])) { @@ -460,6 +472,39 @@ void emit_attachment(GVC_t * gvc, textlabel_t * lp, splines * spl) gvrender_polyline(gvc, A, 3); } +static int edge_in_CB(GVC_t *gvc, edge_t * e) +{ + int i, j, np; + bezier bz; + point *p, pp, sz; + box b; + textlabel_t *lp; + + if (gvc->pagesSize == 1) + return TRUE; + if (ED_spl(e) == NULL) + return FALSE; + for (i = 0; i < ED_spl(e)->size; i++) { + bz = ED_spl(e)->list[i]; + np = bz.size; + p = bz.list; + pp = p[0]; + for (j = 0; j < np; j++) { + if (rect_overlap(CB, mkbox(pp, p[j]))) + return TRUE; + pp = p[j]; + } + } + if ((lp = ED_label(e)) == NULL) + return FALSE; + PF2P(lp->dimen, sz); + b.LL.x = lp->p.x - sz.x / 2; + b.UR.x = lp->p.x + sz.x / 2; + b.LL.y = lp->p.y - sz.y / 2; + b.UR.y = lp->p.y + sz.y / 2; + return rect_overlap(CB, b); +} + static void emit_edge(GVC_t * gvc, edge_t * e) { int i, j, cnum, numc = 0; @@ -479,7 +524,7 @@ static void emit_edge(GVC_t * gvc, edge_t * e) #define SEP 2.0 - if ((edge_in_CB(e) == FALSE) + if ((edge_in_CB(gvc, e) == FALSE) || (edge_in_layer(e->head->graph, e) == FALSE)) return; @@ -731,7 +776,7 @@ void emit_init(GVC_t * gvc, graph_t * g) setup_pagination(gvc, g); - gvrender_begin_job(gvc, Lib, Pages, X, Y, Z, x, y, GD_drawing(g)->dpi); + gvrender_begin_job(gvc, Lib, X, Y, Z, x, y, GD_drawing(g)->dpi); } void emit_deinit(GVC_t * gvc) @@ -739,6 +784,25 @@ void emit_deinit(GVC_t * gvc) gvrender_end_job(gvc); } +static int validpage(GVC_t *gvc, point page) +{ + return ((page.x >= 0) && (page.x < gvc->pagesArraySize.x) + && (page.y >= 0) && (page.y < gvc->pagesArraySize.y)); +} + +static point pageincr(GVC_t *gvc, point page) +{ + page = add_points(page, gvc->pagesArrayMinor); + if (validpage(gvc, page) == FALSE) { + if (gvc->pagesArrayMajor.y) + page.x = gvc->pagesArrayFirst.x; + else + page.y = gvc->pagesArrayFirst.y; + page = add_points(page, gvc->pagesArrayMajor); + } + return page; +} + void emit_graph(GVC_t * gvc, graph_t * g, int flags) { point curpage; @@ -806,8 +870,8 @@ void emit_graph(GVC_t * gvc, graph_t * g, int flags) do { if (Nlayers > 0) gvrender_begin_layer(gvc, LayerID[Layer], Layer, Nlayers); - for (curpage = First; validpage(curpage); - curpage = pageincr(curpage)) { + for (curpage = gvc->pagesArrayFirst; validpage(gvc, curpage); + curpage = pageincr(gvc, curpage)) { Obj = NONE; setup_page(gvc, curpage); if (((s = agget(g, "href")) && s[0]) @@ -1034,19 +1098,6 @@ void emit_clusters(GVC_t * gvc, Agraph_t * g, int flags) } } -int node_in_CB(node_t * n) -{ - box nb; - - if (N_pages == 1) - return TRUE; - nb.LL.x = ND_coord_i(n).x - ND_lw_i(n); - nb.LL.y = ND_coord_i(n).y - ND_ht_i(n) / 2; - nb.UR.x = ND_coord_i(n).x + ND_rw_i(n); - nb.UR.y = ND_coord_i(n).y + ND_ht_i(n) / 2; - return rect_overlap(CB, nb); -} - int node_in_layer(graph_t * g, node_t * n) { char *pn, *pe; @@ -1107,45 +1158,6 @@ int clust_in_layer(graph_t * sg) return FALSE; } -int edge_in_CB(edge_t * e) -{ - int i, j, np; - bezier bz; - point *p, pp, sz; - box b; - textlabel_t *lp; - - if (N_pages == 1) - return TRUE; - if (ED_spl(e) == NULL) - return FALSE; - for (i = 0; i < ED_spl(e)->size; i++) { - bz = ED_spl(e)->list[i]; - np = bz.size; - p = bz.list; - pp = p[0]; - for (j = 0; j < np; j++) { - if (rect_overlap(CB, mkbox(pp, p[j]))) - return TRUE; - pp = p[j]; - } - } - if ((lp = ED_label(e)) == NULL) - return FALSE; - PF2P(lp->dimen, sz); - b.LL.x = lp->p.x - sz.x / 2; - b.UR.x = lp->p.x + sz.x / 2; - b.LL.y = lp->p.y - sz.y / 2; - b.UR.y = lp->p.y + sz.y / 2; - return rect_overlap(CB, b); -} - -int validpage(point page) -{ - return ((page.x >= 0) && (page.x < Pages.x) - && (page.y >= 0) && (page.y < Pages.y)); -} - int is_natural_number(char *sstr) { unsigned char *str = (unsigned char *) sstr; @@ -1208,19 +1220,6 @@ int selectedlayer(char *spec) return rval; } -point pageincr(point page) -{ - page = add_points(page, Minor); - if (validpage(page) == FALSE) { - if (Major.y) - page.x = First.x; - else - page.y = First.y; - page = add_points(page, Major); - } - return page; -} - static int style_delim(int c) { switch (c) { diff --git a/lib/common/renderprocs.h b/lib/common/renderprocs.h index 6bc948b0d..49c0ff9c7 100644 --- a/lib/common/renderprocs.h +++ b/lib/common/renderprocs.h @@ -69,7 +69,6 @@ extern "C" { extern void dotneato_terminate(GVC_t * gvc); extern void dotneato_write(GVC_t * gvc, graph_t *g); extern void dotneato_write_one(GVC_t * gvc, graph_t *g); - extern int edge_in_CB(Agedge_t *); extern int edge_in_layer(Agraph_t *, Agedge_t *); extern double elapsed_sec(void); extern void enqueue(queue *, Agnode_t *); @@ -142,10 +141,8 @@ extern "C" { extern bezier *new_spline(edge_t * e, int sz); extern queue *new_queue(int); extern Agraph_t *next_input_graph(void); - extern int node_in_CB(node_t *); extern int node_in_layer(Agraph_t *, node_t *); extern void osize_label(textlabel_t *, int *, int *, int *, int *); - extern point pageincr(point); extern char **parse_style(char *s); extern void place_graph_label(Agraph_t *); extern void place_portlabel(edge_t * e, boolean head_p); @@ -180,7 +177,6 @@ extern "C" { extern void use_library(char *); extern char *username(); extern point user_shape_size(node_t * n, char *shapefile); - extern int validpage(point); extern void write_plain(GVC_t * gvc, FILE *); extern void write_plain_ext(GVC_t * gvc, FILE *); extern void *zmalloc(size_t); diff --git a/lib/gvc/gvc.h b/lib/gvc/gvc.h index 45a75558e..96467ac9f 100644 --- a/lib/gvc/gvc.h +++ b/lib/gvc/gvc.h @@ -75,8 +75,7 @@ extern "C" { extern int gvrender_select(GVC_t * gvc, char *lang); extern int gvrender_features(GVC_t * gvc); extern void gvrender_reset(GVC_t * gvc); - extern void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, - double X, double Y, double Z, + extern void gvrender_begin_job(GVC_t * gvc, char **lib, double X, double Y, double Z, double x, double y, int dpi); extern void gvrender_end_job(GVC_t * gvc); extern void gvrender_begin_graph(GVC_t * gvc, graph_t * g, box bb, diff --git a/lib/gvc/gvcint.h b/lib/gvc/gvcint.h index 0c73f079c..6c487b7e1 100644 --- a/lib/gvc/gvcint.h +++ b/lib/gvc/gvcint.h @@ -97,9 +97,9 @@ extern "C" { pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */ - /* gvrender_begin_page() */ - point page; - int page_number; + /* gvrender_begin_page */ + point pagesArrayElem; /* 2D coord of current page - 0,0 based */ + int pagesElem; /* 1D index of current page - 0 based */ point offset; /* gvrender_begin_layer() */ @@ -152,8 +152,13 @@ extern "C" { int layout_id; /* internal id of current layout */ char **lib; - point pages; - int nPages; + + /* pagination */ + point pagesArraySize; /* 2D size of page array */ + point pagesArrayFirst; /* 2D starting corner in */ + point pagesArrayMajor; /* 2D major increment */ + point pagesArrayMinor; /* 2D minor increment */ + int pagesSize; /* 1D size of page array */ /* gvrender_begin_graph() */ graph_t *g; diff --git a/lib/gvc/gvrender.c b/lib/gvc/gvrender.c index c8a4bc758..44f1bc798 100644 --- a/lib/gvc/gvrender.c +++ b/lib/gvc/gvrender.c @@ -124,7 +124,7 @@ void gvrender_reset(GVC_t * gvc) #endif } -void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, double X, double Y, double Z, double x, double y, int dpi) +void gvrender_begin_job(GVC_t * gvc, char **lib, double X, double Y, double Z, double x, double y, int dpi) { gvrender_job_t *job = gvc->job; gvrender_engine_t *gvre = job->render_engine; @@ -132,7 +132,6 @@ void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, double X, double Y job->gvc = gvc; gvc->lib = lib; - gvc->pages = pages; /* establish viewport and scaling */ if (dpi == 0) { if (gvre) @@ -154,9 +153,9 @@ void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, double X, double Y else { codegen_t *cg = job->codegen; - if (cg && cg->begin_job && job->page_number == 0) + if (cg && cg->begin_job && job->pagesElem == 0) cg->begin_job(gvc->job->output_file, gvc->g, lib, gvc->user, - gvc->info, pages); + gvc->info, gvc->pagesArraySize); } #endif } @@ -177,7 +176,6 @@ void gvrender_end_job(GVC_t * gvc) } #endif gvc->lib = NULL; - gvc->pages = p0; } /* font modifiers */ @@ -310,11 +308,12 @@ void gvrender_begin_page(GVC_t * gvc, point page, double scale, int rot, gvrender_job_t *job = gvc->job; gvrender_engine_t *gvre = job->render_engine; - job->page = page; + job->pagesArrayElem = page; + job->pagesElem = page.x + page.y * gvc->pagesArraySize.x + 1; + // gvc->scale = scale; job->rot = rot; // gvc->offset = offset; - job->page_number = page.x + page.y * gvc->pages.x + 1; if (gvre && gvre->begin_page) gvre->begin_page(job, gvc->g->name); #ifndef DISABLE_CODEGENS