From: ellson Date: Wed, 29 Dec 2004 18:29:31 +0000 (+0000) Subject: clean up scale/offset ==> zoom/focus into common emit routine X-Git-Tag: LAST_LIBGRAPH~32^2~8184 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7023108edc8cccc7d684d62074f95cc0b16cda3;p=graphviz clean up scale/offset ==> zoom/focus into common emit routine --- diff --git a/lib/common/emit.c b/lib/common/emit.c index 2db7b5841..2fb10c151 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -268,32 +268,13 @@ static void set_pagedir(graph_t * g) } } -static double setScale(graph_t * g) +static void setup_layers(GVC_t * gvc, graph_t * g) { - double xscale, yscale, scale; - - xscale = ((double) GD_drawing(g)->size.x) / GD_bb(g).UR.x; - yscale = ((double) GD_drawing(g)->size.y) / GD_bb(g).UR.y; - scale = MIN(xscale, yscale); - GD_drawing(g)->scale = scale; - GD_drawing(g)->size.x = scale * GD_bb(g).UR.x; - GD_drawing(g)->size.y = scale * GD_bb(g).UR.y; - return scale; -} - -/* this isn't a pretty sight... */ -void setup_graph(GVC_t * gvc, graph_t * g) -{ - double scale; - char *p; - point PFCLM; /* page for centering less margins */ - point DS; /* device drawable region for a page of the graph */ - - assert((GD_bb(g).LL.x == 0) && (GD_bb(g).LL.y == 0)); + char *str; - if ((p = agget(g, "layers")) != 0) { + if ((str = agget(g, "layers")) != 0) { if (gvrender_features(gvc) & GVRENDER_DOES_LAYERS) { - Nlayers = parse_layers(g, p); + Nlayers = parse_layers(g, str); } #ifndef DISABLE_CODEGENS else { @@ -306,24 +287,12 @@ void setup_graph(GVC_t * gvc, graph_t * g) LayerID = NULL; Nlayers = 0; } +} - /* determine final drawing size and scale to apply. */ - /* N.B. size given by user is not rotated by landscape mode */ - /* start with "natural" size of layout */ - scale = GD_drawing(g)->scale = 1.0; - if (GD_drawing(g)->size.x > 0) { /* was given by user... */ - if ((GD_drawing(g)->size.x < GD_bb(g).UR.x) /* drawing is too big... */ - ||(GD_drawing(g)->size.y < GD_bb(g).UR.y)) { - scale = setScale(g); - } else if (GD_drawing(g)->filled) { - if ((GD_drawing(g)->size.x > GD_bb(g).UR.x) /* drawing is too small... */ - &&(GD_drawing(g)->size.y > GD_bb(g).UR.y)) { - scale = setScale(g); - } - } else - GD_drawing(g)->size = GD_bb(g).UR; - } else - GD_drawing(g)->size = GD_bb(g).UR; +static void setup_pagination(GVC_t * gvc, graph_t * g) +{ + point PFCLM; /* page for centering less margins */ + point DS; /* device drawable region for a page of the graph */ /* determine pagination */ PB.LL = GD_drawing(g)->margin; @@ -337,8 +306,8 @@ void setup_graph(GVC_t * gvc, graph_t * g) GP.y = PFCLM.y; /* convert to double */ if (GD_drawing(g)->landscape) GP = exch_xyf(GP); - GP.x = GP.x / scale; - GP.y = GP.y / scale; + GP.x = GP.x / GD_drawing(g)->scale; + GP.y = GP.y / GD_drawing(g)->scale; /* 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); @@ -368,6 +337,7 @@ void setup_graph(GVC_t * gvc, graph_t * g) } set_pagedir(g); + /* determine page box including centering */ if (GD_drawing(g)->centered) { point extra; @@ -379,6 +349,15 @@ void setup_graph(GVC_t * gvc, graph_t * g) PB.LL.y += extra.y / 2; } PB.UR = add_points(PB.LL, DS); +} + +/* this isn't a pretty sight... */ +void setup_graph(GVC_t * gvc, graph_t * g) +{ + setup_layers(gvc, g); + + setup_pagination(gvc, g); + Deffontname = late_nnstring(g->proto->n, N_fontname, DEFAULT_FONTNAME); Deffontsize = late_double(g->proto->n, N_fontsize, DEFAULT_FONTSIZE, @@ -652,18 +631,54 @@ void emit_edge(GVC_t * gvc, edge_t * e) gvrender_end_edge(gvc); } +static void setup_size_scale(graph_t * g) +{ + double xscale, yscale, scale = 1.0; + + assert((GD_bb(g).LL.x == 0) && (GD_bb(g).LL.y == 0)); + + /* determine final drawing size and scale to apply. */ + /* N.B. size given by user is not rotated by landscape mode */ + /* start with "natural" size of layout */ + if (GD_drawing(g)->size.x > 0) { /* was given by user... */ + if ((GD_drawing(g)->size.x < GD_bb(g).UR.x) /* drawing is too big... */ + ||(GD_drawing(g)->size.y < GD_bb(g).UR.y)) { + xscale = ((double) GD_drawing(g)->size.x) / GD_bb(g).UR.x; + yscale = ((double) GD_drawing(g)->size.y) / GD_bb(g).UR.y; + scale = MIN(xscale, yscale); + } + else if (GD_drawing(g)->filled) { + if ((GD_drawing(g)->size.x > GD_bb(g).UR.x) /* drawing is too small... */ + &&(GD_drawing(g)->size.y > GD_bb(g).UR.y)) { + xscale = ((double) GD_drawing(g)->size.x) / GD_bb(g).UR.x; + yscale = ((double) GD_drawing(g)->size.y) / GD_bb(g).UR.y; + scale = MIN(xscale, yscale); + } + } + } + GD_drawing(g)->scale = scale; + GD_drawing(g)->size.x = scale * GD_bb(g).UR.x; + GD_drawing(g)->size.y = scale * GD_bb(g).UR.y; +} + void emit_init(GVC_t * gvc, graph_t * g) { char *str; - double X = 400.0, Y = 400.0, Z = 0.0, x = 0.0, y = 0.0; + double X, Y, Z, x, y; -/* FIXME - init viewport to graph dimensions */ + setup_size_scale(g); + X = (double)(GD_drawing(g)->size.x); + Y = (double)(GD_drawing(g)->size.y); + Z = GD_drawing(g)->scale; + x = (double)(GD_bb(g).UR.x) / 2.; + y = (double)(GD_bb(g).UR.y) / 2.; if ((str = agget(g, "viewport"))) sscanf(str, "%lf,%lf,%lf,%lf,%lf", &X, &Y, &Z, &x, &y); gvc->size.x = ROUND(X); gvc->size.y = ROUND(Y); gvc->zoom = Z; /* scaling factor */ + gvc->zoom = Z; /* scaling factor */ gvc->focus.x = x; /* graph coord of focus - points */ gvc->focus.y = y; diff --git a/lib/fdpgen/layout.c b/lib/fdpgen/layout.c index 621783e38..528b9f19d 100644 --- a/lib/fdpgen/layout.c +++ b/lib/fdpgen/layout.c @@ -939,7 +939,7 @@ void fdp_init_graph(Agraph_t * g) UseRankdir = FALSE; graph_init(g); - GD_drawing(g)->engine = FDP; +// GD_drawing(g)->engine = FDP; g->u.ndim = late_int(g, agfindattr(g, "dim"), 2, 2); Ndim = g->u.ndim = MIN(g->u.ndim, MAXDIM); diff --git a/lib/gvc/gvrender.c b/lib/gvc/gvrender.c index 9dcaf6685..2d06fd253 100644 --- a/lib/gvc/gvrender.c +++ b/lib/gvc/gvrender.c @@ -230,13 +230,13 @@ void gvrender_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) gvc->bb = bb; gvc->pb = pb; dpi = gvc->dpi = GD_drawing(g)->dpi; - gvc->scale = GD_drawing(g)->scale; gvc->margin = GD_drawing(g)->margin; if (gvre) { /* establish viewport and scaling */ if (dpi < 1.0) dpi = gvc->render_features->default_dpi; +#if 0 if (gvc->size.x == 0) { gvc->size.x = (gvc->bb.UR.x - gvc->bb.LL.x + @@ -248,7 +248,8 @@ void gvrender_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) gvc->focus.y = (GD_bb(gvc->g).UR.y - GD_bb(gvc->g).LL.y) / 2.; gvc->zoom = 1.0; } - gvc->compscale.x = gvc->zoom * gvc->scale * dpi / POINTS_PER_INCH; +#endif + gvc->compscale.x = gvc->zoom * dpi / POINTS_PER_INCH; gvc->compscale.y = gvc->compscale.x * ((gvc->render_features->flags & GVRENDER_Y_GOES_DOWN) ? -1.0 : 1.0); @@ -311,7 +312,7 @@ void gvrender_begin_page(GVC_t * gvc, point page, double scale, int rot, gvrender_engine_t *gvre = gvc->render_engine; gvc->page = page; - gvc->scale = scale; +// gvc->scale = scale; gvc->rot = rot; // gvc->offset = offset; gvc->page_number = page.x + page.y * gvc->pages.x + 1; diff --git a/lib/gvc/gvrenderint.h b/lib/gvc/gvrenderint.h index 730b4e8a8..71d3f0fb2 100644 --- a/lib/gvc/gvrenderint.h +++ b/lib/gvc/gvrenderint.h @@ -133,7 +133,6 @@ extern "C" { point size; /* viewport size (pixels) */ double zoom; /* viewport zoom factor */ pointf focus; /* viewport focus in graph units */ - double scale; /* graph scale */ pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */ int rot; /* rotation */