| 1 | /* $Id$ $Revision$ */ |
| 2 | /* vim:set shiftwidth=4 ts=8: */ |
| 3 | |
| 4 | /************************************************************************* |
| 5 | * Copyright (c) 2011 AT&T Intellectual Property |
| 6 | * All rights reserved. This program and the accompanying materials |
| 7 | * are made available under the terms of the Eclipse Public License v1.0 |
| 8 | * which accompanies this distribution, and is available at |
| 9 | * http://www.eclipse.org/legal/epl-v10.html |
| 10 | * |
| 11 | * Contributors: See CVS logs. Details at http://www.graphviz.org/ |
| 12 | *************************************************************************/ |
| 13 | |
| 14 | /* Common header used by both clients and plugins */ |
| 15 | |
| 16 | #ifndef GVCJOB_H |
| 17 | #define GVCJOB_H |
| 18 | |
| 19 | #ifdef __cplusplus |
| 20 | extern "C" { |
| 21 | #endif |
| 22 | |
| 23 | #include "gvcommon.h" |
| 24 | #include "color.h" |
| 25 | |
| 26 | #define ARRAY_SIZE(A) (sizeof(A)/sizeof(A[0])) |
| 27 | |
| 28 | typedef struct gvdevice_engine_s gvdevice_engine_t; |
| 29 | typedef struct gvformatter_engine_s gvformatter_engine_t; |
| 30 | typedef struct gvrender_engine_s gvrender_engine_t; |
| 31 | typedef struct gvlayout_engine_s gvlayout_engine_t; |
| 32 | typedef struct gvtextlayout_engine_s gvtextlayout_engine_t; |
| 33 | typedef struct gvloadimage_engine_s gvloadimage_engine_t; |
| 34 | |
| 35 | typedef enum { PEN_NONE, PEN_DASHED, PEN_DOTTED, PEN_SOLID } pen_type; |
| 36 | typedef enum { FILL_NONE, FILL_SOLID, FILL_LINEAR, FILL_RADIAL } fill_type; |
| 37 | typedef enum { FONT_REGULAR, FONT_BOLD, FONT_ITALIC } font_type; |
| 38 | typedef enum { LABEL_PLAIN, LABEL_HTML } label_type; |
| 39 | |
| 40 | #define PENWIDTH_NORMAL 1. |
| 41 | #define PENWIDTH_BOLD 2. |
| 42 | typedef enum { GVATTR_STRING, GVATTR_BOOL, GVATTR_COLOR } gvattr_t; |
| 43 | |
| 44 | /* The -T output formats listed below are examples only, they are not definitive or inclusive, |
| 45 | other outputs may use the flags now, or in the future |
| 46 | |
| 47 | Default emit order is breadth first graph walk order |
| 48 | EMIT_SORTED emits nodes before edges |
| 49 | EMIT_COLORS emits colors before nodes or edge -Tfig |
| 50 | EMIT_CLUSTERS_LAST emits cluster after nodes and edges |
| 51 | EMIT_PREORDER emit in preorder traversal ??? |
| 52 | EMIT_EDGE_SORTED emits edges before nodes |
| 53 | |
| 54 | GVDEVICE_DOES_PAGES provides pagination support -Tps |
| 55 | GVDEVICE_DOES_LAYERS provides support for layers -Tps |
| 56 | GVDEVICE_EVENTS supports mouse events -Tgtk, -Txlib |
| 57 | GVDEVICE_DOES_TRUECOLOR supports alpha channel -Tpng, -Tgtk, -Txlib |
| 58 | GVDEVICE_BINARY_FORMAT Suppresses \r\n substitution for linends |
| 59 | GVDEVICE_COMPRESSED_FORMAT controls libz compression |
| 60 | GVDEVICE_NO_WRITER used when gvdevice is not used because device uses its own writer, -Tming, devil outputs (FIXME seems to overlap OUTPUT_NOT_REQUIRED) |
| 61 | |
| 62 | GVRENDER_Y_GOES_DOWN device origin top left, y goes down, otherwise |
| 63 | device origin lower left, y goes up |
| 64 | GVRENDER_DOES_TRANSFORM device uses scale, translate, rotate to do its own |
| 65 | coordinate transformations, otherwise coordinates |
| 66 | are pre-transformed |
| 67 | GVRENDER_DOES_ARROWS renderer has its own idea of arrow shapes (deprecated) |
| 68 | GVRENDER_DOES_LABELS basically, maps don't need labels |
| 69 | GVRENDER_DOES_MAPS renderer encodes mapping information for mouse events -Tcmapx -Tsvg |
| 70 | GVRENDER_DOES_MAP_RECTANGLE supports a 2 coord rectngle optimization |
| 71 | GVRENDER_DOES_MAP_CIRCLE supports a 1 coord + radius circle optimization |
| 72 | GVRENDER_DOES_MAP_POLYGON supports polygons (basically, -Tsvg uses anchors, so doesn't need to support any map shapes) |
| 73 | GVRENDER_DOES_MAP_ELLIPSE supports a 2 coord ellipse optimization |
| 74 | GVRENDER_DOES_MAP_BSPLINE supports mapping of splines |
| 75 | GVRENDER_DOES_TOOLTIPS can represent tooltip info -Tcmapx, -Tsvg |
| 76 | GVRENDER_DOES_TARGETS can represent target info (open link in a new tab or window) |
| 77 | GVRENDER_DOES_Z render support 2.5D representation -Tvrml |
| 78 | GVRENDER_NO_WHITE_BG don't paint white background, assumes white paper -Tps |
| 79 | LAYOUT_NOT_REQUIRED don't perform layout -Tcanon |
| 80 | OUTPUT_NOT_REQUIRED don't use gvdevice for output (basically when agwrite() used instead) -Tcanon, -Txdot |
| 81 | */ |
| 82 | |
| 83 | |
| 84 | #define EMIT_SORTED (1<<0) |
| 85 | #define EMIT_COLORS (1<<1) |
| 86 | #define EMIT_CLUSTERS_LAST (1<<2) |
| 87 | #define EMIT_PREORDER (1<<3) |
| 88 | #define EMIT_EDGE_SORTED (1<<4) |
| 89 | #define GVDEVICE_DOES_PAGES (1<<5) |
| 90 | #define GVDEVICE_DOES_LAYERS (1<<6) |
| 91 | #define GVDEVICE_EVENTS (1<<7) |
| 92 | #define GVDEVICE_DOES_TRUECOLOR (1<<8) |
| 93 | #define GVDEVICE_BINARY_FORMAT (1<<9) |
| 94 | #define GVDEVICE_COMPRESSED_FORMAT (1<<10) |
| 95 | #define GVDEVICE_NO_WRITER (1<<11) |
| 96 | #define GVRENDER_Y_GOES_DOWN (1<<12) |
| 97 | #define GVRENDER_DOES_TRANSFORM (1<<13) |
| 98 | #define GVRENDER_DOES_ARROWS (1<<14) |
| 99 | #define GVRENDER_DOES_LABELS (1<<15) |
| 100 | #define GVRENDER_DOES_MAPS (1<<16) |
| 101 | #define GVRENDER_DOES_MAP_RECTANGLE (1<<17) |
| 102 | #define GVRENDER_DOES_MAP_CIRCLE (1<<18) |
| 103 | #define GVRENDER_DOES_MAP_POLYGON (1<<19) |
| 104 | #define GVRENDER_DOES_MAP_ELLIPSE (1<<20) |
| 105 | #define GVRENDER_DOES_MAP_BSPLINE (1<<21) |
| 106 | #define GVRENDER_DOES_TOOLTIPS (1<<22) |
| 107 | #define GVRENDER_DOES_TARGETS (1<<23) |
| 108 | #define GVRENDER_DOES_Z (1<<24) |
| 109 | #define GVRENDER_NO_WHITE_BG (1<<25) |
| 110 | #define LAYOUT_NOT_REQUIRED (1<<26) |
| 111 | #define OUTPUT_NOT_REQUIRED (1<<27) |
| 112 | |
| 113 | typedef struct { |
| 114 | int flags; |
| 115 | double default_pad; /* graph units */ |
| 116 | char **knowncolors; |
| 117 | int sz_knowncolors; |
| 118 | color_type_t color_type; |
| 119 | } gvrender_features_t; |
| 120 | |
| 121 | typedef struct { |
| 122 | int flags; |
| 123 | pointf default_margin; /* left/right, top/bottom - points */ |
| 124 | pointf default_pagesize;/* default page width, height - points */ |
| 125 | pointf default_dpi; |
| 126 | } gvdevice_features_t; |
| 127 | |
| 128 | #define LAYOUT_USES_RANKDIR (1<<0) |
| 129 | |
| 130 | typedef struct gvplugin_active_device_s { |
| 131 | gvdevice_engine_t *engine; |
| 132 | int id; |
| 133 | gvdevice_features_t *features; |
| 134 | const char *type; |
| 135 | } gvplugin_active_device_t; |
| 136 | |
| 137 | typedef struct gvplugin_active_render_s { |
| 138 | gvrender_engine_t *engine; |
| 139 | int id; |
| 140 | gvrender_features_t *features; |
| 141 | const char *type; |
| 142 | } gvplugin_active_render_t; |
| 143 | |
| 144 | typedef struct gvplugin_active_loadimage_t { |
| 145 | gvloadimage_engine_t *engine; |
| 146 | int id; |
| 147 | const char *type; |
| 148 | } gvplugin_active_loadimage_t; |
| 149 | |
| 150 | typedef struct gv_argvlist_s { |
| 151 | char **argv; |
| 152 | int argc; |
| 153 | int alloc; |
| 154 | } gv_argvlist_t; |
| 155 | |
| 156 | typedef struct gvdevice_callbacks_s { |
| 157 | void (*refresh) (GVJ_t * job); |
| 158 | void (*button_press) (GVJ_t * job, int button, pointf pointer); |
| 159 | void (*button_release) (GVJ_t * job, int button, pointf pointer); |
| 160 | void (*motion) (GVJ_t * job, pointf pointer); |
| 161 | void (*modify) (GVJ_t * job, const char *name, const char *value); |
| 162 | void (*del) (GVJ_t * job); /* can't use "delete" 'cos C++ stole it */ |
| 163 | void (*read) (GVJ_t * job, const char *filename, const char *layout); |
| 164 | void (*layout) (GVJ_t * job, const char *layout); |
| 165 | void (*render) (GVJ_t * job, const char *format, const char *filename); |
| 166 | } gvdevice_callbacks_t; |
| 167 | |
| 168 | typedef int (*gvevent_key_callback_t) (GVJ_t * job); |
| 169 | |
| 170 | typedef struct gvevent_key_binding_s { |
| 171 | char *keystring; |
| 172 | gvevent_key_callback_t callback; |
| 173 | } gvevent_key_binding_t; |
| 174 | |
| 175 | typedef enum {MAP_RECTANGLE, MAP_CIRCLE, MAP_POLYGON, } map_shape_t; |
| 176 | |
| 177 | typedef enum {ROOTGRAPH_OBJTYPE, CLUSTER_OBJTYPE, NODE_OBJTYPE, EDGE_OBJTYPE} obj_type; |
| 178 | |
| 179 | /* If this enum is changed, the implementation of xbuf and xbufs in |
| 180 | * gvrender_core_dot.c will probably need to be changed. |
| 181 | */ |
| 182 | typedef enum { |
| 183 | EMIT_GDRAW, EMIT_CDRAW, EMIT_TDRAW, EMIT_HDRAW, |
| 184 | EMIT_GLABEL, EMIT_CLABEL, EMIT_TLABEL, EMIT_HLABEL, |
| 185 | EMIT_NDRAW, EMIT_EDRAW, EMIT_NLABEL, EMIT_ELABEL, |
| 186 | } emit_state_t; |
| 187 | |
| 188 | typedef struct obj_state_s obj_state_t; |
| 189 | |
| 190 | struct obj_state_s { |
| 191 | obj_state_t *parent; |
| 192 | |
| 193 | obj_type type; |
| 194 | union { |
| 195 | graph_t *g; |
| 196 | graph_t *sg; |
| 197 | node_t *n; |
| 198 | edge_t *e; |
| 199 | } u; |
| 200 | |
| 201 | emit_state_t emit_state; |
| 202 | |
| 203 | gvcolor_t pencolor, fillcolor, stopcolor; |
| 204 | int gradient_angle; |
| 205 | float gradient_frac; |
| 206 | pen_type pen; |
| 207 | fill_type fill; |
| 208 | double penwidth; |
| 209 | char **rawstyle; |
| 210 | |
| 211 | double z, tail_z, head_z; /* z depths for 2.5D renderers such as vrml */ |
| 212 | |
| 213 | /* fully substituted text strings */ |
| 214 | char *label; |
| 215 | char *xlabel; |
| 216 | char *taillabel; |
| 217 | char *headlabel; |
| 218 | |
| 219 | char *url; /* if GVRENDER_DOES_MAPS */ |
| 220 | char *id; |
| 221 | char *labelurl; |
| 222 | char *tailurl; |
| 223 | char *headurl; |
| 224 | |
| 225 | char *tooltip; /* if GVRENDER_DOES_TOOLTIPS */ |
| 226 | char *labeltooltip; |
| 227 | char *tailtooltip; |
| 228 | char *headtooltip; |
| 229 | |
| 230 | char *target; /* if GVRENDER_DOES_TARGETS */ |
| 231 | char *labeltarget; |
| 232 | char *tailtarget; |
| 233 | char *headtarget; |
| 234 | |
| 235 | int explicit_tooltip:1; |
| 236 | int explicit_tailtooltip:1; |
| 237 | int explicit_headtooltip:1; |
| 238 | int explicit_labeltooltip:1; |
| 239 | int explicit_tailtarget:1; |
| 240 | int explicit_headtarget:1; |
| 241 | int explicit_edgetarget:1; |
| 242 | int explicit_tailurl:1; |
| 243 | int explicit_headurl:1; |
| 244 | int labeledgealigned:1; |
| 245 | |
| 246 | /* primary mapped region - node shape, edge labels */ |
| 247 | map_shape_t url_map_shape; |
| 248 | int url_map_n; /* number of points for url map if GVRENDER_DOES_MAPS */ |
| 249 | pointf *url_map_p; |
| 250 | |
| 251 | /* additional mapped regions for edges */ |
| 252 | int url_bsplinemap_poly_n; /* number of polygons in url bspline map |
| 253 | if GVRENDER_DOES_MAPS && GVRENDER_DOES_MAP_BSPLINES */ |
| 254 | int *url_bsplinemap_n; /* array of url_bsplinemap_poly_n ints |
| 255 | of number of points in each polygon */ |
| 256 | pointf *url_bsplinemap_p; /* all the polygon points */ |
| 257 | |
| 258 | int tailendurl_map_n; /* tail end intersection with node */ |
| 259 | pointf *tailendurl_map_p; |
| 260 | |
| 261 | int headendurl_map_n; /* head end intersection with node */ |
| 262 | pointf *headendurl_map_p; |
| 263 | }; |
| 264 | |
| 265 | /* Note on units: |
| 266 | * points - a physical distance (1/72 inch) unaffected by zoom or dpi. |
| 267 | * graph units - related to physical distance by zoom. Equals points at zoom=1 |
| 268 | * device units - related to physical distance in points by dpi/72 |
| 269 | */ |
| 270 | |
| 271 | struct GVJ_s { |
| 272 | GVC_t *gvc; /* parent gvc */ |
| 273 | GVJ_t *next; /* linked list of jobs */ |
| 274 | GVJ_t *next_active; /* linked list of active jobs (e.g. multiple windows) */ |
| 275 | |
| 276 | GVCOMMON_t *common; |
| 277 | |
| 278 | obj_state_t *obj; /* objects can be nested (at least clusters can) |
| 279 | so keep object state on a stack */ |
| 280 | char *input_filename; |
| 281 | int graph_index; |
| 282 | |
| 283 | const char *layout_type; |
| 284 | |
| 285 | const char *output_filename; |
| 286 | FILE *output_file; |
| 287 | char *output_data; |
| 288 | unsigned int output_data_allocated; |
| 289 | unsigned int output_data_position; |
| 290 | |
| 291 | const char *output_langname; |
| 292 | int output_lang; |
| 293 | |
| 294 | gvplugin_active_render_t render; |
| 295 | gvplugin_active_device_t device; |
| 296 | gvplugin_active_loadimage_t loadimage; |
| 297 | gvdevice_callbacks_t *callbacks; |
| 298 | pointf device_dpi; |
| 299 | boolean device_sets_dpi; |
| 300 | |
| 301 | void *display; |
| 302 | int screen; |
| 303 | |
| 304 | void *context; /* gd or cairo surface */ |
| 305 | boolean external_context; /* context belongs to caller */ |
| 306 | char *imagedata; /* location of imagedata */ |
| 307 | |
| 308 | int flags; /* emit_graph flags */ |
| 309 | |
| 310 | int numLayers; /* number of layers */ |
| 311 | int layerNum; /* current layer - 1 based*/ |
| 312 | |
| 313 | point pagesArraySize; /* 2D size of page array */ |
| 314 | point pagesArrayFirst;/* 2D starting corner in */ |
| 315 | point pagesArrayMajor;/* 2D major increment */ |
| 316 | point pagesArrayMinor;/* 2D minor increment */ |
| 317 | point pagesArrayElem; /* 2D coord of current page - 0,0 based */ |
| 318 | int numPages; /* number of pages */ |
| 319 | |
| 320 | boxf bb; /* graph bb with padding - graph units */ |
| 321 | pointf pad; /* padding around bb - graph units */ |
| 322 | boxf clip; /* clip region in graph units */ |
| 323 | boxf pageBox; /* current page in graph units */ |
| 324 | pointf pageSize; /* page size in graph units */ |
| 325 | pointf focus; /* viewport focus - graph units */ |
| 326 | |
| 327 | double zoom; /* viewport zoom factor (points per graph unit) */ |
| 328 | int rotation; /* viewport rotation (degrees) 0=portrait, 90=landscape */ |
| 329 | |
| 330 | pointf view; /* viewport size - points */ |
| 331 | boxf canvasBox; /* viewport area - points */ |
| 332 | pointf margin; /* job-specific margin - points */ |
| 333 | |
| 334 | pointf dpi; /* device resolution device-units-per-inch */ |
| 335 | |
| 336 | unsigned int width; /* device width - device units */ |
| 337 | unsigned int height; /* device height - device units */ |
| 338 | box pageBoundingBox;/* rotated boundingBox - device units */ |
| 339 | box boundingBox; /* cumulative boundingBox over all pages - device units */ |
| 340 | |
| 341 | pointf scale; /* composite device to graph units (zoom and dpi) */ |
| 342 | pointf translation; /* composite translation */ |
| 343 | pointf devscale; /* composite device to points: dpi, y_goes_down */ |
| 344 | |
| 345 | boolean fit_mode, |
| 346 | needs_refresh, |
| 347 | click, |
| 348 | has_grown, |
| 349 | has_been_rendered; |
| 350 | |
| 351 | unsigned char button; /* active button */ |
| 352 | pointf pointer; /* pointer position in device units */ |
| 353 | pointf oldpointer; /* old pointer position in device units */ |
| 354 | |
| 355 | void *current_obj; /* graph object that pointer is in currently */ |
| 356 | |
| 357 | void *selected_obj; /* graph object that has been selected */ |
| 358 | /* (e.g. button 1 clicked on current obj) */ |
| 359 | char *active_tooltip; /* tooltip of active object - or NULL */ |
| 360 | char *selected_href; /* href of selected object - or NULL */ |
| 361 | gv_argvlist_t selected_obj_type_name; /* (e.g. "edge" "node3" "e" "->" "node5" "") */ |
| 362 | gv_argvlist_t selected_obj_attributes; /* attribute triplets: name, value, type */ |
| 363 | /* e.g. "color", "red", GVATTR_COLOR, |
| 364 | "style", "filled", GVATTR_BOOL, */ |
| 365 | |
| 366 | void *window; /* display-specific data for gvrender plugin */ |
| 367 | |
| 368 | /* keybindings for keyboard events */ |
| 369 | gvevent_key_binding_t *keybindings; |
| 370 | int numkeys; |
| 371 | void *keycodes; |
| 372 | }; |
| 373 | |
| 374 | #ifdef __cplusplus |
| 375 | } |
| 376 | #endif |
| 377 | #endif /* GVCJOB_H */ |
| 378 | |