]> granicus.if.org Git - graphviz/commitdiff
clean up scale/offset ==> zoom/focus into common emit routine
authorellson <devnull@localhost>
Wed, 29 Dec 2004 18:29:31 +0000 (18:29 +0000)
committerellson <devnull@localhost>
Wed, 29 Dec 2004 18:29:31 +0000 (18:29 +0000)
lib/common/emit.c
lib/fdpgen/layout.c
lib/gvc/gvrender.c
lib/gvc/gvrenderint.h

index 2db7b5841e7ab8a7e37a3beb7ac0d1e09f0be385..2fb10c15145cdd7cb9a4ff7837027a68430d2053 100644 (file)
@@ -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;
 
index 621783e3880ab0d4efd0e1d1cd13e02cab526a67..528b9f19d339dcf0ddd2d2cdca2d3669d86994d3 100644 (file)
@@ -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);
 
index 9dcaf668561909db7af8d32f9af8849b8b3fd05c..2d06fd253ccd0254e65e388fccc889617ec9fccb 100644 (file)
@@ -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;
index 730b4e8a8b09433c8bd1acbf357d084c93d77643..71d3f0fb2f02684f6c98b2ae89bcc2a83ddf58cc 100644 (file)
@@ -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 */