/* 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);
}
/* 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) {
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,
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]);
}
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);
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;
}
}
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")))
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;
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 */