From: ellson Date: Sun, 16 Jan 2005 19:40:51 +0000 (+0000) Subject: some rearrangement of GVC_t, gvrender_job_t, and win_t structs. X-Git-Tag: LAST_LIBGRAPH~32^2~8084 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bf3dcaaa43fabca78f4843f35dbc72bbc47fc5e6;p=graphviz some rearrangement of GVC_t, gvrender_job_t, and win_t structs. --- diff --git a/lib/common/emit.c b/lib/common/emit.c index be20a3b20..be998b509 100644 --- a/lib/common/emit.c +++ b/lib/common/emit.c @@ -149,7 +149,7 @@ 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->zoom, rot, offset); + gvrender_begin_page(gvc, page, gvc->job->zoom, rot, offset); emit_background(gvc, CB.LL, CB.UR); emit_defaults(gvc); } @@ -309,8 +309,8 @@ static void setup_pagination(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 / gvc->zoom; - GP.y = GP.y / gvc->zoom; + GP.x = GP.x / gvc->job->zoom; + GP.y = GP.y / gvc->job->zoom; /* 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); @@ -319,8 +319,8 @@ static void setup_pagination(GVC_t * gvc, graph_t * g) N_pages = Pages.x * Pages.y; /* find the drawable size in device coords */ - tp.x = gvc->width; - tp.y = gvc->height; + tp.x = gvc->job->width; + tp.y = gvc->job->height; if (GD_drawing(g)->landscape) tp = exch_xy(tp); DS.x = MIN(tp.x, PFCLM.x); @@ -334,8 +334,8 @@ static void setup_pagination(GVC_t * gvc, graph_t * g) PFC.y = DEFAULT_PAGEHT; PFCLM.x = PFC.x - 2 * PB.LL.x; PFCLM.y = PFC.y - 2 * PB.LL.y; - DS.x = gvc->width; - DS.y = gvc->height; + DS.x = gvc->job->width; + DS.y = gvc->job->height; if (GD_drawing(g)->landscape) DS = exch_xy(DS); Pages.x = Pages.y = N_pages = 1; diff --git a/lib/common/gdgen.c b/lib/common/gdgen.c index 19243b382..c0c5e2aa5 100644 --- a/lib/common/gdgen.c +++ b/lib/common/gdgen.c @@ -143,11 +143,11 @@ static void init1_gd(GVC_t * gvc, graph_t * g, box bb, point pb) Dpi = DEFAULT_DPI; DevScale = Dpi / POINTS_PER_INCH; - Viewport.x = gvc->width; - Viewport.y = gvc->height; + Viewport.x = gvc->job->width; + Viewport.y = gvc->job->height; if (Viewport.x) { - Zoom = gvc->zoom; - GraphFocus = gvc->focus; + Zoom = gvc->job->zoom; + GraphFocus = gvc->job->focus; } else { Viewport.x = (bb.UR.x - bb.LL.x + 2 * GD_drawing(g)->margin.x) * DevScale + 2; diff --git a/lib/common/hpglgen.c b/lib/common/hpglgen.c index 55259a4de..d29912216 100644 --- a/lib/common/hpglgen.c +++ b/lib/common/hpglgen.c @@ -164,14 +164,14 @@ static Color black = { 0, 0, 0 }; static Color white = { 255, 255, 255 }; static Color *colorlist; -typedef struct _gc { +typedef struct GC_s { int bold; int style; Color color; FontInfo font; - struct _gc *prev; -} GC; -static GC *curGC; + struct GC_s *prev; +} GC_t; +static GC_t *curGC; static void set_color(Color * cp) { @@ -282,10 +282,10 @@ static void set_line_style(int sty) output(buffer); } -static GC *makeGC(GC * old) +static GC_t *makeGC(GC_t * old) { - GC *newGC; - newGC = GNEW(GC); + GC_t *newGC; + newGC = GNEW(GC_t); if (old) *newGC = *old; else { @@ -313,7 +313,7 @@ static void initGC(void) static void destroyGC(void) { - GC *gc, *gc1; + GC_t *gc, *gc1; for (gc = curGC; gc; gc = gc1) { gc1 = gc->prev; free(gc); @@ -327,7 +327,7 @@ static void destroyGC(void) static void saveGC(void) { - GC *newGC; + GC_t *newGC; newGC = makeGC(curGC); newGC->prev = curGC; curGC = newGC; @@ -335,7 +335,7 @@ static void saveGC(void) static void restoreGC(void) { - GC *gc, *newGC; + GC_t *gc, *newGC; gc = curGC; newGC = gc->prev; if (gc->bold != newGC->bold) diff --git a/lib/common/mapgen.c b/lib/common/mapgen.c index c82c9da1c..7ad2fc2be 100644 --- a/lib/common/mapgen.c +++ b/lib/common/mapgen.c @@ -298,11 +298,11 @@ static void map_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) Dpi = DEFAULT_DPI; DevScale = Dpi / POINTS_PER_INCH; - Viewport.x = gvc->width; - Viewport.y = gvc->height; + Viewport.x = gvc->job->width; + Viewport.y = gvc->job->height; if (Viewport.x) { - Zoom = gvc->zoom; - GraphFocus = gvc->focus; + Zoom = gvc->job->zoom; + GraphFocus = gvc->job->focus; } else { Viewport.x = (bb.UR.x - bb.LL.x + 2 * GD_drawing(g)->margin.x) * DevScale + diff --git a/lib/common/output.c b/lib/common/output.c index 10edada2d..3feee601a 100644 --- a/lib/common/output.c +++ b/lib/common/output.c @@ -508,7 +508,7 @@ void _write_plain(GVC_t * gvc, FILE * f, boolean extend) // setup_graph(gvc, g); setYInvert(g); pt = GD_bb(g).UR; - fprintf(f, "graph %.3f %.3f %.3f\n", gvc->zoom, PS2INCH(pt.x), PS2INCH(pt.y)); + fprintf(f, "graph %.3f %.3f %.3f\n", gvc->job->zoom, PS2INCH(pt.x), PS2INCH(pt.y)); for (n = agfstnode(g); n; n = agnxtnode(g, n)) { if (IS_CLUST_NODE(n)) continue; diff --git a/lib/gvc/gvcint.h b/lib/gvc/gvcint.h index bd38f0c80..8f5ba5853 100644 --- a/lib/gvc/gvcint.h +++ b/lib/gvc/gvcint.h @@ -25,13 +25,57 @@ extern "C" { typedef struct gvrender_job_s gvrender_job_t; +#if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) +#include + + typedef struct win { + Display *dpy; + int scr; + Window win; + unsigned long event_mask; + Pixmap pix; + GC gc; + Visual *visual; + Colormap cmap; + int depth; + double oldx, oldy; /* old pointer position in pixels */ + + gvrender_job_t *job; + + int needs_refresh, fit_mode, click, active; + + Atom wm_delete_window_atom; + } win_t; +#endif + struct gvrender_job_s { gvrender_job_t *next; char *output_filename; char *output_langname; FILE *output_file; - void *interim_output; int output_lang; + + void *surface; /* gd or cairo surface */ + boolean external_surface; /* surface belongs to caller */ + + GVC_t *gvc; /* parent gvc */ + graph_t *g; /* parent graph */ + int flags; /* emit_graph flags */ + + unsigned int width; /* width in pixels */ + unsigned int height; /* height in pixels */ + int dpi; /* resolution pixels-per-inch */ + int rot; /* rotation */ + double zoom; /* viewport zoom factor */ + pointf focus; /* viewport focus in graph units */ +// pointf pointer; /* pointer position in graph units */ +// boxf clip; /* clip region in graph units */ + + pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */ + +#if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) && defined(HAVE_CAIRO) + win_t *win; +#endif }; #define EMIT_SORTED (1<<0) @@ -116,8 +160,6 @@ extern "C" { /* gvrender_begin_graph() */ graph_t *g; - void *surface; /* gd or cairo surface */ - boolean external_surface; /* surface belongs to caller */ box bb; /* graph bounding box (what units???) */ point pb; /* page size - including margins (inches) */ @@ -129,15 +171,6 @@ extern "C" { /* render defaults set from graph */ color_t bgcolor; /* background color */ - unsigned int width; - unsigned int height; - int dpi; /* resolution dots-per-inch */ - int rot; /* rotation */ - - double zoom; /* viewport zoom factor */ - pointf focus; /* viewport focus in graph units */ - pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */ - box clip; /* clip region in graph units */ /* gvrender_begin_page() */ point page; diff --git a/lib/gvc/gvemit.c b/lib/gvc/gvemit.c index 4804596c6..a50e5c164 100644 --- a/lib/gvc/gvemit.c +++ b/lib/gvc/gvemit.c @@ -20,10 +20,6 @@ #include -#if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) && defined(HAVE_CAIRO) -#include -#endif - #include "const.h" #include "types.h" #include "macros.h" @@ -34,37 +30,14 @@ extern void emit_graph(GVC_t * gvc, graph_t * g, int flags); #if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) && defined(HAVE_CAIRO) +#include + #define PANFACTOR 10 #define ZOOMFACTOR 1.1 #define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0])) -typedef struct win { - Display *dpy; - int scr; - Window win; - unsigned long event_mask; - Pixmap pix; - GC gc; - Visual *visual; - Colormap cmap; - int depth; - - unsigned int width, height; - - GVC_t *gvc; - graph_t *g; - int flags; - - cairo_t *cr; - - double oldx, oldy; - int needs_refresh, fit_mode, click, active; - - Atom wm_delete_window_atom; -} win_t; - typedef int (*key_callback_t) (win_t * win); typedef struct key_binding { @@ -133,7 +106,7 @@ static Visual *find_argb_visual(Display * dpy, int scr) return visual; } -static void win_init(win_t * win, int argb, const char *geometry, +static void win_init(gvrender_job_t * job, int argb, const char *geometry, const char *base) { unsigned int i; @@ -147,6 +120,9 @@ static void win_init(win_t * win, int argb, const char *geometry, char *name; Display *dpy; int scr; + win_t *win = job->win; + + win->job = job; dpy = win->dpy; win->scr = scr = DefaultScreen(dpy); @@ -175,11 +151,11 @@ static void win_init(win_t * win, int argb, const char *geometry, if (geometry) { int x, y; - XParseGeometry(geometry, &x, &y, &win->gvc->width, &win->gvc->height); + XParseGeometry(geometry, &x, &y, &job->width, &job->height); } win->win = XCreateWindow(dpy, RootWindow(dpy, scr), - 0, 0, win->gvc->width, win->gvc->height, 0, win->depth, + 0, 0, job->width, job->height, 0, win->depth, InputOutput, win->visual, attributemask, &attributes); @@ -191,8 +167,8 @@ static void win_init(win_t * win, int argb, const char *geometry, normalhints->flags = 0; normalhints->x = 0; normalhints->y = 0; - normalhints->width = win->gvc->width; - normalhints->height = win->gvc->height; + normalhints->width = job->width; + normalhints->height = job->height; classhint = XAllocClassHint(); classhint->res_name = "graphviz"; @@ -210,13 +186,13 @@ static void win_init(win_t * win, int argb, const char *geometry, free(name); win->pix = - XCreatePixmap(dpy, win->win, win->gvc->width, win->gvc->height, win->depth); + XCreatePixmap(dpy, win->win, job->width, job->height, win->depth); if (argb) gcv.foreground = 0; else gcv.foreground = WhitePixel(dpy, scr); win->gc = XCreateGC(dpy, win->pix, GCForeground, &gcv); - XFillRectangle(dpy, win->pix, win->gc, 0, 0, win->gvc->width, win->gvc->height); + XFillRectangle(dpy, win->pix, win->gc, 0, 0, job->width, job->height); for (i = 0; i < ARRAY_SIZE(key_binding); i++) { KeySym keysym; @@ -229,15 +205,11 @@ static void win_init(win_t * win, int argb, const char *geometry, } surface = cairo_xlib_surface_create(dpy, win->pix, win->visual, CAIRO_FORMAT_ARGB32, win->cmap); - cairo_set_target_surface(win->cr, surface); - -// FIXME - messy win + gvc structs - win->gvc->surface = win->cr; - win->gvc->external_surface = TRUE; /* FIXME - who clears this? */ - + cairo_set_target_surface(job->surface, surface); cairo_surface_destroy(surface); + /* XXX: This probably doesn't need to be here (eventually) */ - cairo_set_rgb_color(win->cr, 1, 1, 1); + cairo_set_rgb_color(job->surface, 1, 1, 1); win->event_mask = ( ButtonPressMask | ButtonReleaseMask @@ -255,44 +227,51 @@ static void win_init(win_t * win, int argb, const char *geometry, win->active = 0; } -static void win_deinit(win_t * win) +static void win_deinit(gvrender_job_t * job) { + win_t *win = job->win; + XFreeGC(win->dpy, win->gc); XDestroyWindow(win->dpy, win->win); } static void win_refresh(win_t * win) { + gvrender_job_t *job = win->job; + XFillRectangle(win->dpy, win->pix, win->gc, 0, 0, - win->gvc->width, win->gvc->height); + job->width, job->height); - emit_graph(win->gvc, win->g, win->flags); + emit_graph(job->gvc, job->g, job->flags); XCopyArea(win->dpy, win->pix, win->win, win->gc, - 0, 0, win->gvc->width, win->gvc->height, 0, 0); + 0, 0, job->width, job->height, 0, 0); } static void win_grow_pixmap(win_t * win) { Pixmap new; cairo_surface_t *surface; + gvrender_job_t *job = win->job; - new = XCreatePixmap(win->dpy, win->win, win->gvc->width, win->gvc->height, + new = XCreatePixmap(win->dpy, win->win, job->width, job->height, win->depth); XFillRectangle(win->dpy, new, win->gc, 0, 0, - win->gvc->width, win->gvc->height); + job->width, job->height); XCopyArea(win->dpy, win->pix, new, win->gc, 0, 0, - win->gvc->width, win->gvc->height, 0, 0); + job->width, job->height, 0, 0); XFreePixmap(win->dpy, win->pix); win->pix = new; surface = cairo_xlib_surface_create(win->dpy, win->pix, win->visual, CAIRO_FORMAT_ARGB32, win->cmap); - cairo_set_target_surface(win->cr, surface); + cairo_set_target_surface(job->surface, surface); cairo_surface_destroy(surface); } static void win_handle_button_press(win_t *win, XButtonEvent *bev) { + gvrender_job_t *job = win->job; + switch (bev->button) { case 1: /* select / create in edit mode */ case 2: /* pan */ @@ -304,20 +283,20 @@ static void win_handle_button_press(win_t *win, XButtonEvent *bev) case 4: /* scrollwheel zoom in at current mouse x,y */ win->fit_mode = 0; - win->gvc->focus.x += (bev->x - win->gvc->width / 2.) - * (ZOOMFACTOR - 1.) / win->gvc->zoom; - win->gvc->focus.y += -(bev->y - win->gvc->height / 2.) - * (ZOOMFACTOR - 1.) / win->gvc->zoom; - win->gvc->zoom *= ZOOMFACTOR; + job->focus.x += (bev->x - job->width / 2.) + * (ZOOMFACTOR - 1.) / job->zoom; + job->focus.y += -(bev->y - job->height / 2.) + * (ZOOMFACTOR - 1.) / job->zoom; + job->zoom *= ZOOMFACTOR; win->needs_refresh = 1; break; case 5: /* scrollwheel zoom out at current mouse x,y */ win->fit_mode = 0; - win->gvc->zoom /= ZOOMFACTOR; - win->gvc->focus.x -= (bev->x - win->gvc->width / 2.) - * (ZOOMFACTOR - 1.) / win->gvc->zoom; - win->gvc->focus.y -= -(bev->y - win->gvc->height / 2.) - * (ZOOMFACTOR - 1.) / win->gvc->zoom; + job->zoom /= ZOOMFACTOR; + job->focus.x -= (bev->x - job->width / 2.) + * (ZOOMFACTOR - 1.) / job->zoom; + job->focus.y -= -(bev->y - job->height / 2.) + * (ZOOMFACTOR - 1.) / job->zoom; win->needs_refresh = 1; break; } @@ -325,13 +304,17 @@ static void win_handle_button_press(win_t *win, XButtonEvent *bev) win->oldy = bev->y; } +#define EPSILON .0001 + static void win_handle_motion(win_t *win, XMotionEvent *mev) { - int dx = mev->x - win->oldx; - int dy = mev->y - win->oldy; + gvrender_job_t *job = win->job; + double dx = mev->x - win->oldx; + double dy = mev->y - win->oldy; - if (dx == 0 && dy == 0) /* ignore motion events with no motion */ + if (abs(dx) < EPSILON && abs(dy) < EPSILON) /* ignore motion events with no motion */ return; + switch (win->active) { case 0: /* drag with no button - */ return; @@ -340,8 +323,8 @@ static void win_handle_motion(win_t *win, XMotionEvent *mev) /* FIXME - to be implemented */ break; case 2: /* drag with button 2 - pan graph */ - win->gvc->focus.x -= dx / win->gvc->zoom; - win->gvc->focus.y -= -dy / win->gvc->zoom; + job->focus.x -= dx / job->zoom; + job->focus.y -= -dy / job->zoom; win->needs_refresh = 1; break; case 3: /* drag with button 3 - unused */ @@ -371,17 +354,16 @@ static void win_reconfigure_normal(win_t * win, unsigned int width, unsigned int height) { int has_grown = 0; + gvrender_job_t *job = win->job; - if (width > win->gvc->width || height > win->gvc->height) + if (width > job->width || height > job->height) has_grown = 1; /* Adjust focus to keep image fixed during window resizing */ /* FIXME - causes FP error on size reduction */ -// win->gvc->focus.x += ((double)(width - win->gvc->width)) -// / (2. * win->gvc->zoom); -// win->gvc->focus.y += -((double)(height - win->gvc->height)) -// / (2. * win->gvc->zoom); - win->gvc->width = width; - win->gvc->height = height; +// job->focus.x += ((double)(width - job->width)) / (2. * job->zoom); +// job->focus.y += -((double)(height - job->height)) / (2. * job->zoom); + job->width = width; + job->height = height; if (has_grown) win_grow_pixmap(win); win->needs_refresh = 1; @@ -392,10 +374,11 @@ win_reconfigure_fit_mode(win_t * win, unsigned int width, unsigned int height) { int dflt_width, dflt_height; + gvrender_job_t *job = win->job; - dflt_width = win->gvc->width; - dflt_height = win->gvc->height; - win->gvc->zoom = + dflt_width = job->width; + dflt_height = job->height; + job->zoom = MIN((double) width / (double) dflt_width, (double) height / (double) dflt_height); @@ -471,64 +454,78 @@ static int quit_cb(win_t * win) static int left_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->focus.x += PANFACTOR / win->gvc->zoom; + job->focus.x += PANFACTOR / job->zoom; win->needs_refresh = 1; return 0; } static int right_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->focus.x -= PANFACTOR / win->gvc->zoom; + job->focus.x -= PANFACTOR / job->zoom; win->needs_refresh = 1; return 0; } static int up_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->focus.y += -(PANFACTOR / win->gvc->zoom); + job->focus.y += -(PANFACTOR / job->zoom); win->needs_refresh = 1; return 0; } static int down_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->focus.y -= -(PANFACTOR / win->gvc->zoom); + job->focus.y -= -(PANFACTOR / job->zoom); win->needs_refresh = 1; return 0; } static int zoom_in_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->zoom *= ZOOMFACTOR; + job->zoom *= ZOOMFACTOR; win->needs_refresh = 1; return 0; } static int zoom_out_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = 0; - win->gvc->zoom /= ZOOMFACTOR; + job->zoom /= ZOOMFACTOR; win->needs_refresh = 1; return 0; } static int toggle_fit_cb(win_t * win) { + gvrender_job_t *job = win->job; + win->fit_mode = !win->fit_mode; if (win->fit_mode) { int dflt_width, dflt_height; - dflt_width = win->gvc->width; - dflt_height = win->gvc->height; - win->gvc->zoom = - MIN((double) win->gvc->width / (double) dflt_width, - (double) win->gvc->height / (double) dflt_height); - win->gvc->focus.x = 0.0; - win->gvc->focus.y = 0.0; + dflt_width = job->width; + dflt_height = job->height; + job->zoom = + MIN((double) job->width / (double) dflt_width, + (double) job->height / (double) dflt_height); + job->focus.x = 0.0; + job->focus.y = 0.0; win->needs_refresh = 1; } return 0; @@ -537,41 +534,47 @@ static int toggle_fit_cb(win_t * win) void gvemit_graph(GVC_t * gvc, graph_t * g, int flags) { + gvrender_job_t *job = gvc->job; + + job->gvc = gvc; + job->g = g; + job->flags = flags; + if (flags & GVRENDER_X11_EVENTS) { #if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) && defined(HAVE_CAIRO) - win_t win; const char *display=NULL; int argb=0; const char *geometry=NULL; - win.gvc = gvc; - win.g = g; - win.flags = flags; + job->win = malloc(sizeof(win_t)); - gvc->surface = win.cr = cairo_create();; - gvc->external_surface = TRUE; + job->surface = cairo_create();; + job->external_surface = TRUE; - win.dpy = XOpenDisplay(display); - if (win.dpy == NULL) { + job->win->dpy = XOpenDisplay(display); + if (job->win->dpy == NULL) { fprintf(stderr, "Failed to open display: %s\n", XDisplayName(display)); return; } - win_init(&win, argb, geometry, gvc->layout_type); + win_init(job, argb, geometry, gvc->layout_type); + + win_handle_events(job->win); - win_handle_events(&win); + cairo_destroy(job->surface); + win_deinit(job); - cairo_destroy(win.cr); - win_deinit(&win); + XCloseDisplay(job->win->dpy); - XCloseDisplay(win.dpy); + free(job->win); + job->external_surface = FALSE; #else fprintf(stderr,"No X11 support available\n"); #endif } else { - emit_graph(gvc, g, flags); + emit_graph(job->gvc, job->g, job->flags); } } diff --git a/lib/gvc/gvrender.c b/lib/gvc/gvrender.c index 6417a271c..268c39d92 100644 --- a/lib/gvc/gvrender.c +++ b/lib/gvc/gvrender.c @@ -124,6 +124,7 @@ void gvrender_reset(GVC_t * gvc) void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, double X, double Y, double Z, double x, double y, int dpi) { gvrender_engine_t *gvre = gvc->render_engine; + gvrender_job_t *job = gvc->job; gvc->lib = lib; gvc->pages = pages; @@ -134,12 +135,12 @@ void gvrender_begin_job(GVC_t * gvc, char **lib, point pages, double X, double Y else dpi = DEFAULT_DPI; } - gvc->dpi = dpi; - gvc->width = ROUND(X * dpi / POINTS_PER_INCH); - gvc->height = ROUND(Y * dpi / POINTS_PER_INCH); - gvc->zoom = Z; /* scaling factor */ - gvc->focus.x = x; /* graph coord of focus - points */ - gvc->focus.y = y; + job->dpi = dpi; + job->width = ROUND(X * dpi / POINTS_PER_INCH); + job->height = ROUND(Y * dpi / POINTS_PER_INCH); + job->zoom = Z; /* scaling factor */ + job->focus.x = x; /* graph coord of focus - points */ + job->focus.y = y; if (gvre) { if (gvre->begin_job) gvre->begin_job(gvc); @@ -180,28 +181,30 @@ void gvrender_end_job(GVC_t * gvc) static pointf gvrender_ptf(GVC_t * gvc, pointf p) { + gvrender_job_t *job = gvc->job; pointf rv; - if (gvc->rot == 0) { - rv.x = (p.x - gvc->focus.x) * gvc->compscale.x + gvc->width / 2.; - rv.y = (p.y - gvc->focus.y) * gvc->compscale.y + gvc->height / 2.; + if (job->rot == 0) { + rv.x = (p.x - job->focus.x) * job->compscale.x + job->width / 2.; + rv.y = (p.y - job->focus.y) * job->compscale.y + job->height / 2.; } else { - rv.x = -(p.y - gvc->focus.y) * gvc->compscale.x + gvc->width / 2.; - rv.y = (p.x - gvc->focus.x) * gvc->compscale.y + gvc->height / 2.; + rv.x = -(p.y - job->focus.y) * job->compscale.x + job->width / 2.; + rv.y = (p.x - job->focus.x) * job->compscale.y + job->height / 2.; } return rv; } static pointf gvrender_pt(GVC_t * gvc, point p) { + gvrender_job_t *job = gvc->job; pointf rv; - if (gvc->rot == 0) { - rv.x = ((double) p.x - gvc->focus.x) * gvc->compscale.x + gvc->width / 2.; - rv.y = ((double) p.y - gvc->focus.y) * gvc->compscale.y + gvc->height / 2.; + if (job->rot == 0) { + rv.x = ((double) p.x - job->focus.x) * job->compscale.x + job->width / 2.; + rv.y = ((double) p.y - job->focus.y) * job->compscale.y + job->height / 2.; } else { - rv.x = -((double) p.y - gvc->focus.y) * gvc->compscale.x + gvc->width / 2.; - rv.y = ((double) p.x - gvc->focus.x) * gvc->compscale.y + gvc->height / 2.; + rv.x = -((double) p.y - job->focus.y) * job->compscale.x + job->width / 2.; + rv.y = ((double) p.x - job->focus.x) * job->compscale.y + job->height / 2.; } return rv; } @@ -229,6 +232,7 @@ static void gvrender_resolve_color(gvrender_features_t * features, void gvrender_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) { gvrender_engine_t *gvre = gvc->render_engine; + gvrender_job_t *job = gvc->job; char *str; gvc->g = g; @@ -236,9 +240,9 @@ void gvrender_begin_graph(GVC_t * gvc, graph_t * g, box bb, point pb) gvc->pb = pb; if (gvre) { - gvc->compscale.x = gvc->zoom * gvc->dpi / POINTS_PER_INCH; - gvc->compscale.y = - gvc->compscale.x * + job->compscale.x = job->zoom * job->dpi / POINTS_PER_INCH; + job->compscale.y = + job->compscale.x * ((gvc->render_features->flags & GVRENDER_Y_GOES_DOWN) ? -1.0 : 1.0); /* render specific init */ @@ -297,10 +301,11 @@ void gvrender_begin_page(GVC_t * gvc, point page, double scale, int rot, point offset) { gvrender_engine_t *gvre = gvc->render_engine; + gvrender_job_t *job = gvc->job; gvc->page = page; // gvc->scale = scale; - gvc->rot = rot; + job->rot = rot; // gvc->offset = offset; gvc->page_number = page.x + page.y * gvc->pages.x + 1; if (gvre && gvre->begin_page)