]> granicus.if.org Git - graphviz/commitdiff
some rearrangement of GVC_t, gvrender_job_t, and win_t structs.
authorellson <devnull@localhost>
Sun, 16 Jan 2005 19:40:51 +0000 (19:40 +0000)
committerellson <devnull@localhost>
Sun, 16 Jan 2005 19:40:51 +0000 (19:40 +0000)
lib/common/emit.c
lib/common/gdgen.c
lib/common/hpglgen.c
lib/common/mapgen.c
lib/common/output.c
lib/gvc/gvcint.h
lib/gvc/gvemit.c
lib/gvc/gvrender.c

index be20a3b207e455c99b04e930fdb3ea31f8675696..be998b50990c8903f3fabfdc4fe4947f65dde027 100644 (file)
@@ -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;
index 19243b382c279405bbbe85e0961bc7ba8cb82d2b..c0c5e2aa55ad7510c45bb80f8a9ae21680f36b08 100644 (file)
@@ -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;
index 55259a4de06dd235a00f3dbd4d160523e0de6b50..d29912216d784351df1db6d1d10f491bf9995b98 100644 (file)
@@ -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)
index c82c9da1cfc8d8ae13696631871551689db82c57..7ad2fc2be6c646ace4c2b8984867e2a100385953 100644 (file)
@@ -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 +
index 10edada2dde2a1f73f6c2f84d4627bfe7921d446..3feee601aeabd8a3013019533aa78a9b8a566b3f 100644 (file)
@@ -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;
index bd38f0c803a4e0e0b9ee54b8ae487b200fb670dc..8f5ba5853092f63398520c694547303dea7b3e13 100644 (file)
@@ -25,13 +25,57 @@ extern "C" {
 
     typedef struct gvrender_job_s gvrender_job_t;
 
+#if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER)
+#include <X11/Xlib.h>
+
+    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;
index 4804596c6ecf7e45795223d18ea5e3b663ef6d2b..a50e5c164891ff1be67dad88f405fa9bbfbc1c61 100644 (file)
 
 #include <stdio.h>
 
-#if !defined(X_DISPLAY_MISSING) && !defined(DISABLE_GVRENDER) && defined(HAVE_CAIRO)
-#include <cairo.h>
-#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 <cairo.h>
+
 
 #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);
    }
 }
index 6417a271c1aca753fae9c28d9f9f13a892cac418..268c39d920295eac32c732f0c24197968eebf9a6 100644 (file)
@@ -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)