]> granicus.if.org Git - graphviz/commitdiff
change job->dpi from int to pointf to allow for values obtained from display devices...
authorellson <devnull@localhost>
Fri, 20 Jan 2006 19:11:55 +0000 (19:11 +0000)
committerellson <devnull@localhost>
Fri, 20 Jan 2006 19:11:55 +0000 (19:11 +0000)
lib/common/emit.c
lib/common/svggen.c
lib/gvc/gvcjob.h
lib/gvc/gvrender.c

index c817591a6117b8af5028ab705c0b3dc7e2e7b1a4..2109d18ba3d4774f71e6a9a5105899951bf27e80 100644 (file)
@@ -202,8 +202,8 @@ static void init_job_pagination(GVJ_t * job, graph_t *g)
     /* determine pagination */
     if (gvc->graph_sets_pageSize) {
        /* page was set by user */
-       pageSize.x = ROUND(gvc->pageSize.x * job->dpi / POINTS_PER_INCH);
-       pageSize.y = ROUND(gvc->pageSize.y * job->dpi / POINTS_PER_INCH);
+       pageSize.x = ROUND(gvc->pageSize.x * job->dpi.x / POINTS_PER_INCH);
+       pageSize.y = ROUND(gvc->pageSize.y * job->dpi.y / POINTS_PER_INCH);
 
        /* we don't want graph page to exceed its bounding box */
        pageSize.x = MIN(pageSize.x, imageSize.x);
@@ -237,11 +237,11 @@ static void init_job_pagination(GVJ_t * job, graph_t *g)
     }
 
     /* size of one page in graph units */
-    job->pageSize.x = (double)imageSize.x * POINTS_PER_INCH / (job->dpi * job->zoom);
-    job->pageSize.y = (double)imageSize.y * POINTS_PER_INCH / (job->dpi * job->zoom);
+    job->pageSize.x = (double)imageSize.x * POINTS_PER_INCH / (job->dpi.x * job->zoom);
+    job->pageSize.y = (double)imageSize.y * POINTS_PER_INCH / (job->dpi.y * job->zoom);
 
-    margin.x = ROUND(job->margin.x * job->dpi / POINTS_PER_INCH);
-    margin.y = ROUND(job->margin.y * job->dpi / POINTS_PER_INCH);
+    margin.x = ROUND(job->margin.x * job->dpi.x / POINTS_PER_INCH);
+    margin.y = ROUND(job->margin.y * job->dpi.y / POINTS_PER_INCH);
 
     /* determine page box including centering */
     if (GD_drawing(g)->centered) {
@@ -298,8 +298,8 @@ fprintf(stderr,"margin = %d,%d imageSize = %d,%d pageSize = %d,%d (device units)
        pageSize.x, pageSize.y);
 fprintf(stderr,"job->pageSize= %g,%g (graph units)\n",
        job->pageSize.x, job->pageSize.y);
-fprintf(stderr,"dpi = %d zoom = %g rotation = %d\n",
-        job->dpi, job->zoom, job->rotation);
+fprintf(stderr,"dpi = %g,%g zoom = %g rotation = %d\n",
+        job->dpi.x, job->dpi.y, job->zoom, job->rotation);
 fprintf(stderr,"boundingBox = %d,%d %d,%d (device units)\n",
         job->boundingBox.LL.x,
         job->boundingBox.LL.y,
@@ -381,14 +381,17 @@ void emit_background(GVJ_t * job, graph_t *g)
     point A[4];
     int i;
     /* fudge to compensate for rounding errors */
-    double fudge = 2 * POINTS_PER_INCH / (job->zoom * job->dpi);
+    pointf fudge;
+
+    fudge.x = 2 * POINTS_PER_INCH / (job->zoom * job->dpi.x);
+    fudge.y = 2 * POINTS_PER_INCH / (job->zoom * job->dpi.y);
 
     if (! ((str = agget(g, "bgcolor")) && str[0]))
        str = "white";
-    AF[0].x = AF[1].x = job->pageBox.LL.x - fudge;
-    AF[2].x = AF[3].x = job->pageBox.UR.x + fudge;
-    AF[3].y = AF[0].y = job->pageBox.LL.y - fudge;
-    AF[1].y = AF[2].y = job->pageBox.UR.y + fudge;
+    AF[0].x = AF[1].x = job->pageBox.LL.x - fudge.x;
+    AF[2].x = AF[3].x = job->pageBox.UR.x + fudge.x;
+    AF[3].y = AF[0].y = job->pageBox.LL.y - fudge.y;
+    AF[1].y = AF[2].y = job->pageBox.UR.y + fudge.y;
     for (i = 0; i < 4; i++) {
        PF2P(AF[i],A[i]);
     }
@@ -409,22 +412,25 @@ static void emit_defaults(GVJ_t * job)
 static void setup_page(GVJ_t * job, graph_t * g)
 {
     /* prescaled pad so that its size is constant under scaling */
-    double pad = Pad * POINTS_PER_INCH / (job->zoom * job->dpi);
+    pointf pad;
+
+    pad.x = Pad * POINTS_PER_INCH / (job->zoom * job->dpi.x);
+    pad.y = Pad * POINTS_PER_INCH / (job->zoom * job->dpi.y);
 
     /* establish current box in graph coordinates */
-    job->pageBox.LL.x = job->pagesArrayElem.x * job->pageSize.x - pad;
-    job->pageBox.LL.y = job->pagesArrayElem.y * job->pageSize.y - pad;
+    job->pageBox.LL.x = job->pagesArrayElem.x * job->pageSize.x - pad.x;
+    job->pageBox.LL.y = job->pagesArrayElem.y * job->pageSize.y - pad.y;
     job->pageBox.UR.x = job->pageBox.LL.x + job->pageSize.x;
     job->pageBox.UR.y = job->pageBox.LL.y + job->pageSize.y;
 
     /* establish pageOffset to be applied, in graph coordinates */
     if (job->rotation == 0) {
-       job->pageOffset.x =  pad - job->pageSize.x * job->pagesArrayElem.x;
-       job->pageOffset.y =  pad - job->pageSize.y * job->pagesArrayElem.y;
+       job->pageOffset.x =  pad.x - job->pageSize.x * job->pagesArrayElem.x;
+       job->pageOffset.y =  pad.y - job->pageSize.y * job->pagesArrayElem.y;
     }
     else {
-       job->pageOffset.x = -pad + job->pageSize.y * (job->pagesArrayElem.y +1);
-       job->pageOffset.y =  pad - job->pageSize.x * job->pagesArrayElem.x;
+       job->pageOffset.x = -pad.x + job->pageSize.y * (job->pagesArrayElem.y +1);
+       job->pageOffset.y =  pad.y - job->pageSize.x * job->pagesArrayElem.x;
     }
 
     job->pageBoxClip.UR.x = MIN(job->clip.UR.x, job->pageBox.UR.x);
@@ -1134,20 +1140,22 @@ static void init_job_margin(GVJ_t *job)
 
 static void init_job_dpi(GVJ_t *job, graph_t *g)
 {
-    job->dpi = GD_drawing(g)->dpi;
-    if (job->dpi == 0) {
+    if (GD_drawing(g)->dpi != 0) {
+        job->dpi.x = job->dpi.y = GD_drawing(g)->dpi;
+    }
+    else {
         /* set default margins depending on format */
         switch (job->output_lang) {
         case GVRENDER_PLUGIN:
-            job->dpi = job->render.features->default_dpi;
+            job->dpi.x = job->dpi.y = job->render.features->default_dpi;
             break;
         case POSTSCRIPT:
         case PDF:
         case SVG:
-           job->dpi = POINTS_PER_INCH;
+           job->dpi.x = job->dpi.y = POINTS_PER_INCH;
             break;
         default:
-            job->dpi = DEFAULT_DPI;
+            job->dpi.x = job->dpi.y = DEFAULT_DPI;
             break;
         }
     }
@@ -1189,8 +1197,8 @@ static void init_job_viewport(GVJ_t * job, graph_t * g)
        UR = exch_xyf(UR);
 
     /* calculate default viewport size in device units */
-    X = (Z * UR.x + 2 * Pad) * job->dpi / POINTS_PER_INCH;
-    Y = (Z * UR.y + 2 * Pad) * job->dpi / POINTS_PER_INCH;
+    X = (Z * UR.x + 2 * Pad) * job->dpi.x / POINTS_PER_INCH;
+    Y = (Z * UR.y + 2 * Pad) * job->dpi.y / POINTS_PER_INCH;
 
     /* user can override */
     if ((str = agget(g, "viewport")))
index e656df38bde8e3e6d63c9e0c4f1a28c1222a22aa..6862b8cece5bdc41f058f4e5f7704d2a69709270 100644 (file)
@@ -486,8 +486,6 @@ svg_begin_job(FILE * ofp, graph_t * g, char **lib, char *user,
 
 static void svg_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb)
 {
-    int dpi = gvc->job->dpi;
-
     Viewport.x = gvc->job->width;
     Viewport.y = gvc->job->height;
     Zoom = gvc->job->zoom;
@@ -503,13 +501,13 @@ static void svg_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb)
     svg_fputs("<!-- Title: ");
     svg_fputs(xml_namestring(g->name));
     svg_printf(" Pages: %d -->\n", N_pages);
-    if (dpi == POINTS_PER_INCH) 
+    if (ROUND(gvc->job->dpi.x) == POINTS_PER_INCH && ROUND(gvc->job->dpi.y) == POINTS_PER_INCH) 
        svg_printf("<svg width=\"%dpt\" height=\"%dpt\"\n",
                   Viewport.x, Viewport.y);
     else
        svg_printf("<svg width=\"%dpx\" height=\"%dpx\"\n",
-                  dpi * Viewport.x / POINTS_PER_INCH,
-                  dpi * Viewport.y / POINTS_PER_INCH);
+                  ROUND(gvc->job->dpi.x * Viewport.x / POINTS_PER_INCH),
+                  ROUND(gvc->job->dpi.y * Viewport.y / POINTS_PER_INCH));
     /* establish absolute units in points */
     svg_printf(" viewBox = \"%d %d %d %d\"\n", 0, 0, Viewport.x, Viewport.y);
     /* namespace of svg */
index 00bab6c4bfc364e93144290999fc527bce8e55c4..af627bb72f0bcbf2c9ef64a24517a73246f3189f 100644 (file)
@@ -175,7 +175,7 @@ extern "C" {
         unsigned int width;     /* device width in device units */
         unsigned int height;    /* device height in device units */
        box     boundingBox;    /* drawable region in device units */
-       int dpi;                /* device resolution device-units-per-inch */
+       pointf  dpi;            /* device resolution device-units-per-inch */
 
        boxf bb;                /* bb in graph units */
        double zoom;            /* viewport zoom factor */
index 970b9abdbc0735e7970707331d06c88fc89d22ca..4bf7a7155d9ea26920efa479eaa59829a85de296 100644 (file)
@@ -236,7 +236,8 @@ void gvrender_begin_graph(GVJ_t * job, graph_t * g)
     sy = job->height / (job->zoom * 2.);
 
     gvc->sg = g;  /* current subgraph/cluster */
-    job->compscale.y = job->compscale.x = job->zoom * job->dpi / POINTS_PER_INCH;
+    job->compscale.x = job->zoom * job->dpi.x / POINTS_PER_INCH;
+    job->compscale.y = job->zoom * job->dpi.y / POINTS_PER_INCH;
     job->compscale.y *= (job->flags & GVRENDER_Y_GOES_DOWN) ? -1. : 1.;
     if (job->rotation) {
         job->clip.UR.x = job->focus.x + sy + EPSILON;