color = late_nnstring(e, E_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
gvrender_set_fillcolor(job, color);
}
- else if (ED_deleted(e)) {
- color = late_nnstring(e, E_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(e, E_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
- }
- else if (ED_visited(e)) {
- color = late_nnstring(e, E_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(e, E_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
- }
/* if more than one color - then generate parallel beziers, one per color */
if (numc) {
/* calculate and save offset vector spline and initialize first offset spline */
color = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
gvrender_set_fillcolor(job, color);
}
- else if (GD_deleted(sg)) {
- color = late_nnstring(e, G_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(e, G_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
- }
- else if (GD_visited(sg)) {
- color = late_nnstring(e, G_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(e, G_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
- }
else {
if (((color = agget(sg, "pencolor")) != 0) && color[0])
gvrender_set_pencolor(job, color);
--- /dev/null
+/* $Id$ $Revision$ */
+/* vim:set shiftwidth=4 ts=8: */
+
+/**********************************************************
+* This software is part of the graphviz package *
+* http://www.graphviz.org/ *
+* *
+* Copyright (c) 1994-2004 AT&T Corp. *
+* and is licensed under the *
+* Common Public License, Version 1.0 *
+* by AT&T Corp. *
+* *
+* Information and Software Systems Research *
+* AT&T Research, Florham Park NJ *
+**********************************************************/
+
+/* Common header used by both clients and plugins */
+
+#ifndef GVCJOB_H
+#define GVCJOB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0]))
+
+ typedef enum { PEN_NONE, PEN_DASHED, PEN_DOTTED, PEN_SOLID } pen_type;
+ typedef enum { FILL_NONE, FILL_SOLID } fill_type;
+ typedef enum { FONT_REGULAR, FONT_BOLD, FONT_ITALIC } font_type;
+#define PENWIDTH_NORMAL 1.
+#define PENWIDTH_BOLD 2.
+
+ typedef struct {
+ char *fontfam, fontopt;
+ color_t pencolor, fillcolor;
+ pen_type pen;
+ fill_type fill;
+ double penwidth;
+ double fontsz;
+ } gvstyle_t;
+
+#define EMIT_SORTED (1<<0)
+#define EMIT_COLORS (1<<1)
+#define EMIT_CLUSTERS_LAST (1<<2)
+#define EMIT_PREORDER (1<<3)
+#define EMIT_EDGE_SORTED (1<<4)
+#define GVRENDER_DOES_ARROWS (1<<5)
+#define GVRENDER_DOES_LAYERS (1<<6)
+#define GVRENDER_DOES_MULTIGRAPH_OUTPUT_FILES (1<<7)
+#define GVRENDER_DOES_TRUECOLOR (1<<8)
+#define GVRENDER_Y_GOES_DOWN (1<<9)
+#define GVRENDER_X11_EVENTS (1<<10)
+#define GVRENDER_DOES_TRANSFORM (1<<11)
+
+ typedef struct {
+ int flags;
+ double default_margin; /* graph units */
+ int default_dpi;
+ char **knowncolors;
+ int sz_knowncolors;
+ color_type_t color_type;
+ char *device;
+ } gvrender_features_t;
+
+ typedef struct {
+ int flags;
+ } gvdevice_features_t;
+
+#define LAYOUT_USES_RANKDIR (1<<0)
+
+ /* active plugin headers */
+ typedef struct gvplugin_active_device_s {
+ gvdevice_engine_t *engine;
+ int id;
+ gvdevice_features_t *features;
+ } gvplugin_active_device_t;
+
+ typedef struct gvplugin_active_render_s {
+ gvrender_engine_t *engine;
+ int id;
+ gvrender_features_t *features;
+ char *type;
+ } gvplugin_active_render_t;
+
+ /*
+ * gv_matrix_t: (compat with cairo_matrix_t)
+ *
+ * A #gv_matrix_t holds an affine transformation, such as a scale,
+ * rotation, or shear, or a combination of those.
+ */
+ typedef struct gv_matrix_s {
+ double xx; double yx;
+ double xy; double yy;
+ double x0; double y0;
+ } gv_matrix_t;
+
+ typedef struct gv_argvlist_s {
+ char **argv;
+ int argc;
+ int alloc;
+ } gv_argvlist_t;
+
+ typedef struct gvdevice_callbacks_s {
+ void (*refresh) (GVJ_t * job);
+ void (*button_press) (GVJ_t * job, int button, pointf pointer);
+ void (*button_release) (GVJ_t * job, int button, pointf pointer);
+ void (*motion) (GVJ_t * job, pointf pointer);
+ void (*modify) (GVJ_t * job, char *name, char *value);
+ } gvdevice_callbacks_t;
+
+ struct GVJ_s {
+ GVC_t *gvc; /* parent gvc */
+ GVJ_t *next; /* linked list of jobs */
+ GVJ_t *next_active; /* linked list of active jobs (e.g. multiple windows) */
+ char *output_filename;
+ char *output_langname;
+ FILE *output_file;
+ int output_lang;
+
+ gvplugin_active_render_t render;
+ gvplugin_active_device_t device;
+ gvdevice_callbacks_t *callbacks;
+
+#ifndef DISABLE_CODEGENS
+ codegen_t *codegen; /* current codegen */
+#endif
+
+ void *surface; /* gd or cairo surface */
+ bool external_surface; /* surface belongs to caller */
+
+ gvstyle_t *style; /* active style from gvc->styles[] */
+
+ int flags; /* emit_graph flags */
+
+ pointf margin; /* job-specific margin - graph units */
+
+ int numLayers; /* number of layers */
+ int layerNum; /* current layer - 1 based*/
+
+ boxf pageBox; /* current page in graph coords */
+ pointf pageOffset; /* offset for current page in graph coords */
+ pointf pageSize; /* page size in graph units */
+ point pagesArraySize; /* 2D size of page array */
+ point pagesArrayFirst; /* 2D starting corner in */
+ point pagesArrayMajor; /* 2D major increment */
+ point pagesArrayMinor; /* 2D minor increment */
+ point pagesArrayElem; /* 2D coord of current page - 0,0 based */
+ int numPages; /* number of pages */
+
+ unsigned int width; /* device width in device units */
+ unsigned int height; /* device height in device units */
+ int dpi; /* device resolution device-units-per-inch */
+ double zoom; /* viewport zoom factor */
+ int rotation; /* viewport rotation 0=portrait, 1=landscape */
+ pointf focus; /* viewport focus in graph units */
+ box boundingBox; /* drawable region in device units */
+
+ boxf clip; /* clip region in graph units */
+ boxf pageBoxClip; /* intersection of clip and pageBox */
+
+ gv_matrix_t transform; /* transformation matrix for renderers that can use it */
+ pointf compscale; /* composite device scale incl: scale, zoom, dpi, y_goes_down */
+ pointf offset; /* composite translation */
+
+ bool fit_mode,
+ needs_refresh,
+ click,
+ active,
+ has_grown;
+
+ pointf pointer; /* pointer position in device units */
+ pointf oldpointer; /* old pointer position in device units */
+
+ void *current_obj; /* graph object that pointer is in currently */
+
+ void *selected_obj; /* graph object that has been selected */
+ /* (e.g. button 1 clicked on current obj) */
+ char *active_tooltip; /* tooltip of active object - or NULL */
+ char *selected_href; /* href of selected object - or NULL */
+ gv_argvlist_t selected_obj_type_name; /* (e.g. "edge" "node3" "e" "->" "node5" "") */
+ gv_argvlist_t selected_obj_attributes; /* even args are names, odd are values */
+ /* e.g. "color" "red" "style" "filled" */
+
+ void *window; /* display-specific data for gvrender plugin */
+ };
+
+ typedef int (*gvevent_key_callback_t) (GVJ_t * job);
+
+ typedef struct gvevent_key_binding_s {
+ char *keystring;
+ gvevent_key_callback_t callback;
+ } gvevent_key_binding_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* GVCJOB_H */
void gvrender_begin_job(GVJ_t * job)
{
+ GVC_t *gvc = job->gvc;
gvrender_engine_t *gvre = job->render.engine;
if (gvre) {
codegen_t *cg = job->codegen;
if (cg && cg->begin_job)
- cg->begin_job(job->output_file, job->g, job->gvc->lib, job->gvc->user,
- job->gvc->info, job->pagesArraySize);
+ cg->begin_job(job->output_file, gvc->g, gvc->lib, gvc->user,
+ gvc->info, job->pagesArraySize);
}
#endif
}
sx = job->width / (job->zoom * 2.);
sy = job->height / (job->zoom * 2.);
- job->sg = g; /* current subgraph/cluster */
+ gvc->sg = g; /* current subgraph/cluster */
job->compscale.y = job->compscale.x = job->zoom * job->dpi / POINTS_PER_INCH;
job->compscale.y *= (job->flags & GVRENDER_Y_GOES_DOWN) ? -1. : 1.;
if (job->rotation) {
cg->end_graph();
}
#endif
- job->sg = NULL;
+ job->gvc->sg = NULL;
}
void gvrender_begin_page(GVJ_t * job)
PF2P(job->pageOffset, offset);
if (cg && cg->begin_page)
- cg->begin_page(job->g, job->pagesArrayElem,
+ cg->begin_page(job->gvc->g, job->pagesArrayElem,
job->zoom, job->rotation, offset);
}
#endif
{
gvrender_engine_t *gvre = job->render.engine;
- job->sg = sg; /* set current cluster graph object */
+ job->gvc->sg = sg; /* set current cluster graph object */
#ifndef DISABLE_CODEGENS
Obj = CLST;
#endif
}
Obj = NONE;
#endif
- job->sg = g; /* reset current cluster to parent graph or cluster */
+ job->gvc->sg = g; /* reset current cluster to parent graph or cluster */
}
void gvrender_begin_nodes(GVJ_t * job)
#ifndef DISABLE_CODEGENS
Obj = NODE;
#endif
- job->n = n; /* set current node */
+ job->gvc->n = n; /* set current node */
if (gvre && gvre->begin_node)
gvre->begin_node(job, n->name, n->id);
#ifndef DISABLE_CODEGENS
}
Obj = NONE;
#endif
- job->n = NULL; /* clear current node */
+ job->gvc->n = NULL; /* clear current node */
}
void gvrender_begin_edge(GVJ_t * job, edge_t * e)
#ifndef DISABLE_CODEGENS
Obj = EDGE;
#endif
- job->e = e; /* set current edge */
+ job->gvc->e = e; /* set current edge */
if (gvre && gvre->begin_edge)
gvre->begin_edge(job, e->tail->name,
e->tail->graph->root->kind & AGFLAG_DIRECTED,
}
Obj = NONE;
#endif
- job->e = NULL; /* clear current edge */
+ job->gvc->e = NULL; /* clear current edge */
}
void gvrender_begin_context(GVJ_t * job)