| 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 | #ifndef GV_TYPES_H |
| 15 | #define GV_TYPES_H |
| 16 | |
| 17 | /* Define if you want CGRAPH */ |
| 18 | #define WITH_CGRAPH 1 |
| 19 | |
| 20 | #include <stdio.h> |
| 21 | #include <assert.h> |
| 22 | #include <signal.h> |
| 23 | |
| 24 | typedef unsigned char boolean; |
| 25 | #ifndef NOT |
| 26 | #define NOT(v) (!(v)) |
| 27 | #endif |
| 28 | #ifndef FALSE |
| 29 | #define FALSE 0 |
| 30 | #endif |
| 31 | #ifndef TRUE |
| 32 | #define TRUE NOT(FALSE) |
| 33 | #endif |
| 34 | |
| 35 | #include "geom.h" |
| 36 | #include "gvcext.h" |
| 37 | #include "pathgeom.h" |
| 38 | #include "textspan.h" |
| 39 | #include "cgraph.h" |
| 40 | |
| 41 | #ifdef __cplusplus |
| 42 | extern "C" { |
| 43 | #endif |
| 44 | |
| 45 | typedef int (*qsort_cmpf) (const void *, const void *); |
| 46 | typedef int (*bsearch_cmpf) (const void *, const void *); |
| 47 | typedef struct Agraph_s graph_t; |
| 48 | typedef struct Agnode_s node_t; |
| 49 | typedef struct Agedge_s edge_t; |
| 50 | typedef struct Agsym_s attrsym_t; |
| 51 | #define TAIL_ID "tailport" |
| 52 | #define HEAD_ID "headport" |
| 53 | |
| 54 | typedef struct htmllabel_t htmllabel_t; |
| 55 | |
| 56 | typedef union inside_t { |
| 57 | struct { |
| 58 | pointf* p; |
| 59 | double* r; |
| 60 | } a; |
| 61 | struct { |
| 62 | node_t* n; |
| 63 | boxf* bp; |
| 64 | } s; |
| 65 | } inside_t; |
| 66 | |
| 67 | typedef struct port { /* internal edge endpoint specification */ |
| 68 | pointf p; /* aiming point relative to node center */ |
| 69 | double theta; /* slope in radians */ |
| 70 | boxf *bp; /* if not null, points to bbox of |
| 71 | * rectangular area that is port target |
| 72 | */ |
| 73 | boolean defined; /* if true, edge has port info at this end */ |
| 74 | boolean constrained; /* if true, constraints such as theta are set */ |
| 75 | boolean clip; /* if true, clip end to node/port shape */ |
| 76 | boolean dyna; /* if true, assign compass point dynamically */ |
| 77 | unsigned char order; /* for mincross */ |
| 78 | unsigned char side; /* if port is on perimeter of node, this |
| 79 | * contains the bitwise OR of the sides (TOP, |
| 80 | * BOTTOM, etc.) it is on. |
| 81 | */ |
| 82 | char *name; /* port name, if it was explicitly given, otherwise NULL */ |
| 83 | } port; |
| 84 | |
| 85 | typedef struct { |
| 86 | boolean(*swapEnds) (edge_t * e); /* Should head and tail be swapped? */ |
| 87 | boolean(*splineMerge) (node_t * n); /* Is n a node in the middle of an edge? */ |
| 88 | boolean ignoreSwap; /* Test for swapped edges if false */ |
| 89 | boolean isOrtho; /* Orthogonal routing used */ |
| 90 | } splineInfo; |
| 91 | |
| 92 | typedef struct pathend_t { |
| 93 | boxf nb; /* the node box */ |
| 94 | pointf np; /* node port */ |
| 95 | int sidemask; |
| 96 | int boxn; |
| 97 | boxf boxes[20]; |
| 98 | } pathend_t; |
| 99 | |
| 100 | typedef struct path { /* internal specification for an edge spline */ |
| 101 | port start; |
| 102 | port end; |
| 103 | int nbox; /* number of subdivisions */ |
| 104 | boxf *boxes; /* rectangular regions of subdivision */ |
| 105 | void *data; |
| 106 | } path; |
| 107 | |
| 108 | typedef struct bezier { |
| 109 | pointf *list; |
| 110 | int size; |
| 111 | int sflag; |
| 112 | int eflag; |
| 113 | pointf sp; |
| 114 | pointf ep; |
| 115 | } bezier; |
| 116 | |
| 117 | typedef struct splines { |
| 118 | bezier *list; |
| 119 | int size; |
| 120 | boxf bb; |
| 121 | } splines; |
| 122 | |
| 123 | typedef struct textlabel_t { |
| 124 | char *text; |
| 125 | char *fontname; |
| 126 | char *fontcolor; |
| 127 | int charset; |
| 128 | double fontsize; |
| 129 | pointf dimen; /* the diagonal size of the label (estimated by layout) */ |
| 130 | pointf space; /* the diagonal size of the space for the label */ |
| 131 | /* the rendered label is aligned in this box */ |
| 132 | /* space does not include pad or margin */ |
| 133 | pointf pos; /* the center of the space for the label */ |
| 134 | union { |
| 135 | struct { |
| 136 | textspan_t *span; |
| 137 | short nspans; |
| 138 | } txt; |
| 139 | htmllabel_t *html; |
| 140 | } u; |
| 141 | char valign; /* 't' 'c' 'b' */ |
| 142 | boolean set; /* true if position is set */ |
| 143 | boolean html; /* true if html label */ |
| 144 | } textlabel_t; |
| 145 | |
| 146 | typedef struct polygon_t { /* mutable shape information for a node */ |
| 147 | int regular; /* true for symmetric shapes */ |
| 148 | int peripheries; /* number of periphery lines */ |
| 149 | int sides; /* number of sides */ |
| 150 | double orientation; /* orientation of shape (+ve degrees) */ |
| 151 | double distortion; /* distortion factor - as in trapezium */ |
| 152 | double skew; /* skew factor - as in parallelogram */ |
| 153 | int option; /* ROUNDED, DIAGONAL corners, etc. */ |
| 154 | pointf *vertices; /* array of vertex points */ |
| 155 | } polygon_t; |
| 156 | |
| 157 | typedef struct stroke_t { /* information about a single stroke */ |
| 158 | /* we would have called it a path if that term wasn't already used */ |
| 159 | int nvertices; /* number of points in the stroke */ |
| 160 | int flags; /* stroke style flags */ |
| 161 | pointf *vertices; /* array of vertex points */ |
| 162 | } stroke_t; |
| 163 | |
| 164 | /* flag definitions for stroke_t */ |
| 165 | #define STROKE_CLOSED (1 << 0) |
| 166 | #define STROKE_FILLED (1 << 1) |
| 167 | #define STROKE_PENDOWN (1 << 2) |
| 168 | #define STROKE_VERTICES_ALLOCATED (1 << 3) |
| 169 | |
| 170 | typedef struct shape_t { /* mutable shape information for a node */ |
| 171 | int nstrokes; /* number of strokes in array */ |
| 172 | stroke_t *strokes; /* array of strokes */ |
| 173 | /* The last stroke must always be closed, but can be pen_up. |
| 174 | * It is used as the clipping path */ |
| 175 | } shape_t; |
| 176 | |
| 177 | typedef struct shape_functions { /* read-only shape functions */ |
| 178 | void (*initfn) (node_t *); /* initializes shape from node u.shape_info structure */ |
| 179 | void (*freefn) (node_t *); /* frees shape from node u.shape_info structure */ |
| 180 | port(*portfn) (node_t *, char *, char *); /* finds aiming point and slope of port */ |
| 181 | boolean(*insidefn) (inside_t * inside_context, pointf); /* clips incident gvc->e spline on shape of gvc->n */ |
| 182 | int (*pboxfn)(node_t* n, port* p, int side, boxf rv[], int *kptr); /* finds box path to reach port */ |
| 183 | void (*codefn) (GVJ_t * job, node_t * n); /* emits graphics code for node */ |
| 184 | } shape_functions; |
| 185 | |
| 186 | typedef enum { SH_UNSET, SH_POLY, SH_RECORD, SH_POINT, SH_EPSF} shape_kind; |
| 187 | |
| 188 | typedef struct shape_desc { /* read-only shape descriptor */ |
| 189 | char *name; /* as read from graph file */ |
| 190 | shape_functions *fns; |
| 191 | polygon_t *polygon; /* base polygon info */ |
| 192 | boolean usershape; |
| 193 | } shape_desc; |
| 194 | |
| 195 | #include "usershape.h" /* usershapes needed by gvc */ |
| 196 | |
| 197 | typedef struct nodequeue { |
| 198 | node_t **store; |
| 199 | node_t **limit; |
| 200 | node_t **head; |
| 201 | node_t **tail; |
| 202 | } nodequeue; |
| 203 | |
| 204 | typedef struct adjmatrix_t { |
| 205 | int nrows; |
| 206 | int ncols; |
| 207 | char *data; |
| 208 | } adjmatrix_t; |
| 209 | |
| 210 | typedef struct rank_t { |
| 211 | int n; /* number of nodes in this rank */ |
| 212 | node_t **v; /* ordered list of nodes in rank */ |
| 213 | int an; /* globally allocated number of nodes */ |
| 214 | node_t **av; /* allocated list of nodes in rank */ |
| 215 | double ht1; /* height below/above centerline */ |
| 216 | double ht2; /* height below/above centerline */ |
| 217 | double pht1; /* as above, but only primitive nodes */ |
| 218 | double pht2; /* as above, but only primitive nodes */ |
| 219 | boolean candidate; /* for transpose () */ |
| 220 | boolean valid; |
| 221 | int cache_nc; /* caches number of crossings */ |
| 222 | adjmatrix_t *flat; |
| 223 | } rank_t; |
| 224 | |
| 225 | typedef enum { R_NONE = |
| 226 | 0, R_VALUE, R_FILL, R_COMPRESS, R_AUTO, R_EXPAND } ratio_t; |
| 227 | |
| 228 | typedef struct layout_t { |
| 229 | double quantum; |
| 230 | double scale; |
| 231 | double ratio; /* set only if ratio_kind == R_VALUE */ |
| 232 | double dpi; |
| 233 | pointf margin; |
| 234 | pointf page; |
| 235 | pointf size; |
| 236 | boolean filled; |
| 237 | boolean landscape; |
| 238 | boolean centered; |
| 239 | ratio_t ratio_kind; |
| 240 | void* xdots; |
| 241 | char* id; |
| 242 | } layout_t; |
| 243 | |
| 244 | /* for "record" shapes */ |
| 245 | typedef struct field_t { |
| 246 | pointf size; /* its dimension */ |
| 247 | boxf b; /* its placement in node's coordinates */ |
| 248 | int n_flds; |
| 249 | textlabel_t *lp; /* n_flds == 0 */ |
| 250 | struct field_t **fld; /* n_flds > 0 */ |
| 251 | char *id; /* user's identifier */ |
| 252 | unsigned char LR; /* if box list is horizontal (left to right) */ |
| 253 | unsigned char sides; /* sides of node exposed to field */ |
| 254 | } field_t; |
| 255 | |
| 256 | typedef struct nlist_t { |
| 257 | node_t **list; |
| 258 | int size; |
| 259 | } nlist_t; |
| 260 | |
| 261 | typedef struct elist { |
| 262 | edge_t **list; |
| 263 | int size; |
| 264 | } elist; |
| 265 | |
| 266 | #define GUI_STATE_ACTIVE (1<<0) |
| 267 | #define GUI_STATE_SELECTED (1<<1) |
| 268 | #define GUI_STATE_VISITED (1<<2) |
| 269 | #define GUI_STATE_DELETED (1<<3) |
| 270 | |
| 271 | #define elist_fastapp(item,L) do {L.list[L.size++] = item; L.list[L.size] = NULL;} while(0) |
| 272 | #define elist_append(item,L) do {L.list = ALLOC(L.size + 2,L.list,edge_t*); L.list[L.size++] = item; L.list[L.size] = NULL;} while(0) |
| 273 | #define alloc_elist(n,L) do {L.size = 0; L.list = N_NEW(n + 1,edge_t*); } while (0) |
| 274 | #define free_list(L) do {if (L.list) free(L.list);} while (0) |
| 275 | |
| 276 | typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind; |
| 277 | |
| 278 | typedef struct Agraphinfo_t { |
| 279 | Agrec_t hdr; |
| 280 | /* to generate code */ |
| 281 | layout_t *drawing; |
| 282 | textlabel_t *label; /* if the cluster has a title */ |
| 283 | boxf bb; /* bounding box */ |
| 284 | pointf border[4]; /* sizes of margins for graph labels */ |
| 285 | unsigned char gui_state; /* Graph state for GUI ops */ |
| 286 | unsigned char has_labels; |
| 287 | boolean has_images; |
| 288 | unsigned char charset; /* input character set */ |
| 289 | int rankdir; |
| 290 | double ht1; /* below and above extremal ranks */ |
| 291 | double ht2; /* below and above extremal ranks */ |
| 292 | unsigned short flags; |
| 293 | void *alg; |
| 294 | GVC_t *gvc; /* context for "globals" over multiple graphs */ |
| 295 | void (*cleanup) (graph_t * g); /* function to deallocate layout-specific data */ |
| 296 | |
| 297 | #ifndef DOT_ONLY |
| 298 | /* to place nodes */ |
| 299 | node_t **neato_nlist; |
| 300 | int move; |
| 301 | double **dist; |
| 302 | double **spring; |
| 303 | double **sum_t; |
| 304 | double ***t; |
| 305 | unsigned short ndim; |
| 306 | unsigned short odim; |
| 307 | #endif |
| 308 | #ifndef NEATO_ONLY |
| 309 | /* to have subgraphs */ |
| 310 | int n_cluster; |
| 311 | graph_t **clust; /* clusters are in clust[1..n_cluster] !!! */ |
| 312 | graph_t *dotroot; |
| 313 | node_t *nlist; |
| 314 | rank_t *rank; |
| 315 | graph_t *parent; /* containing cluster (not parent subgraph) */ |
| 316 | int level; /* cluster nesting level (not node level!) */ |
| 317 | node_t *minrep; /* set leaders for min and max rank */ |
| 318 | node_t *maxrep; /* set leaders for min and max rank */ |
| 319 | |
| 320 | /* fast graph node list */ |
| 321 | nlist_t comp; |
| 322 | /* connected components */ |
| 323 | node_t *minset; /* set leaders */ |
| 324 | node_t *maxset; /* set leaders */ |
| 325 | long n_nodes; |
| 326 | /* includes virtual */ |
| 327 | short minrank; |
| 328 | short maxrank; |
| 329 | |
| 330 | /* various flags */ |
| 331 | boolean has_flat_edges; |
| 332 | boolean has_sourcerank; |
| 333 | boolean has_sinkrank; |
| 334 | unsigned char showboxes; |
| 335 | fontname_kind fontnames; /* to override mangling in SVG */ |
| 336 | |
| 337 | int nodesep; |
| 338 | int ranksep; |
| 339 | node_t *ln; /* left nodes of bounding box */ |
| 340 | node_t *rn; /* right nodes of bounding box */ |
| 341 | |
| 342 | /* for clusters */ |
| 343 | node_t *leader; |
| 344 | node_t **rankleader; |
| 345 | boolean expanded; |
| 346 | char installed; |
| 347 | char set_type; |
| 348 | char label_pos; |
| 349 | boolean exact_ranksep; |
| 350 | #endif |
| 351 | |
| 352 | } Agraphinfo_t; |
| 353 | |
| 354 | #define GD_parent(g) (((Agraphinfo_t*)AGDATA(g))->parent) |
| 355 | #define GD_level(g) (((Agraphinfo_t*)AGDATA(g))->level) |
| 356 | #define GD_drawing(g) (((Agraphinfo_t*)AGDATA(g))->drawing) |
| 357 | #define GD_bb(g) (((Agraphinfo_t*)AGDATA(g))->bb) |
| 358 | #define GD_gvc(g) (((Agraphinfo_t*)AGDATA(g))->gvc) |
| 359 | #define GD_cleanup(g) (((Agraphinfo_t*)AGDATA(g))->cleanup) |
| 360 | #define GD_dist(g) (((Agraphinfo_t*)AGDATA(g))->dist) |
| 361 | #define GD_alg(g) (((Agraphinfo_t*)AGDATA(g))->alg) |
| 362 | #define GD_border(g) (((Agraphinfo_t*)AGDATA(g))->border) |
| 363 | #define GD_cl_cnt(g) (((Agraphinfo_t*)AGDATA(g))->cl_nt) |
| 364 | #define GD_clust(g) (((Agraphinfo_t*)AGDATA(g))->clust) |
| 365 | #define GD_dotroot(g) (((Agraphinfo_t*)AGDATA(g))->dotroot) |
| 366 | #define GD_comp(g) (((Agraphinfo_t*)AGDATA(g))->comp) |
| 367 | #define GD_exact_ranksep(g) (((Agraphinfo_t*)AGDATA(g))->exact_ranksep) |
| 368 | #define GD_expanded(g) (((Agraphinfo_t*)AGDATA(g))->expanded) |
| 369 | #define GD_flags(g) (((Agraphinfo_t*)AGDATA(g))->flags) |
| 370 | #define GD_gui_state(g) (((Agraphinfo_t*)AGDATA(g))->gui_state) |
| 371 | #define GD_charset(g) (((Agraphinfo_t*)AGDATA(g))->charset) |
| 372 | #define GD_has_labels(g) (((Agraphinfo_t*)AGDATA(g))->has_labels) |
| 373 | #define GD_has_images(g) (((Agraphinfo_t*)AGDATA(g))->has_images) |
| 374 | #define GD_has_flat_edges(g) (((Agraphinfo_t*)AGDATA(g))->has_flat_edges) |
| 375 | #define GD_has_sourcerank(g) (((Agraphinfo_t*)AGDATA(g))->has_sourcerank) |
| 376 | #define GD_has_sinkrank(g) (((Agraphinfo_t*)AGDATA(g))->has_sinkrank) |
| 377 | #define GD_ht1(g) (((Agraphinfo_t*)AGDATA(g))->ht1) |
| 378 | #define GD_ht2(g) (((Agraphinfo_t*)AGDATA(g))->ht2) |
| 379 | #define GD_inleaf(g) (((Agraphinfo_t*)AGDATA(g))->inleaf) |
| 380 | #define GD_installed(g) (((Agraphinfo_t*)AGDATA(g))->installed) |
| 381 | #define GD_label(g) (((Agraphinfo_t*)AGDATA(g))->label) |
| 382 | #define GD_leader(g) (((Agraphinfo_t*)AGDATA(g))->leader) |
| 383 | #define GD_rankdir2(g) (((Agraphinfo_t*)AGDATA(g))->rankdir) |
| 384 | #define GD_rankdir(g) (((Agraphinfo_t*)AGDATA(g))->rankdir & 0x3) |
| 385 | #define GD_flip(g) (GD_rankdir(g) & 1) |
| 386 | #define GD_realrankdir(g) ((((Agraphinfo_t*)AGDATA(g))->rankdir) >> 2) |
| 387 | #define GD_realflip(g) (GD_realrankdir(g) & 1) |
| 388 | #define GD_ln(g) (((Agraphinfo_t*)AGDATA(g))->ln) |
| 389 | #define GD_maxrank(g) (((Agraphinfo_t*)AGDATA(g))->maxrank) |
| 390 | #define GD_maxset(g) (((Agraphinfo_t*)AGDATA(g))->maxset) |
| 391 | #define GD_minrank(g) (((Agraphinfo_t*)AGDATA(g))->minrank) |
| 392 | #define GD_minset(g) (((Agraphinfo_t*)AGDATA(g))->minset) |
| 393 | #define GD_minrep(g) (((Agraphinfo_t*)AGDATA(g))->minrep) |
| 394 | #define GD_maxrep(g) (((Agraphinfo_t*)AGDATA(g))->maxrep) |
| 395 | #define GD_move(g) (((Agraphinfo_t*)AGDATA(g))->move) |
| 396 | #define GD_n_cluster(g) (((Agraphinfo_t*)AGDATA(g))->n_cluster) |
| 397 | #define GD_n_nodes(g) (((Agraphinfo_t*)AGDATA(g))->n_nodes) |
| 398 | #define GD_ndim(g) (((Agraphinfo_t*)AGDATA(g))->ndim) |
| 399 | #define GD_odim(g) (((Agraphinfo_t*)AGDATA(g))->odim) |
| 400 | #define GD_neato_nlist(g) (((Agraphinfo_t*)AGDATA(g))->neato_nlist) |
| 401 | #define GD_nlist(g) (((Agraphinfo_t*)AGDATA(g))->nlist) |
| 402 | #define GD_nodesep(g) (((Agraphinfo_t*)AGDATA(g))->nodesep) |
| 403 | #define GD_outleaf(g) (((Agraphinfo_t*)AGDATA(g))->outleaf) |
| 404 | #define GD_rank(g) (((Agraphinfo_t*)AGDATA(g))->rank) |
| 405 | #define GD_rankleader(g) (((Agraphinfo_t*)AGDATA(g))->rankleader) |
| 406 | #define GD_ranksep(g) (((Agraphinfo_t*)AGDATA(g))->ranksep) |
| 407 | #define GD_rn(g) (((Agraphinfo_t*)AGDATA(g))->rn) |
| 408 | #define GD_set_type(g) (((Agraphinfo_t*)AGDATA(g))->set_type) |
| 409 | #define GD_label_pos(g) (((Agraphinfo_t*)AGDATA(g))->label_pos) |
| 410 | #define GD_showboxes(g) (((Agraphinfo_t*)AGDATA(g))->showboxes) |
| 411 | #define GD_fontnames(g) (((Agraphinfo_t*)AGDATA(g))->fontnames) |
| 412 | #define GD_spring(g) (((Agraphinfo_t*)AGDATA(g))->spring) |
| 413 | #define GD_sum_t(g) (((Agraphinfo_t*)AGDATA(g))->sum_t) |
| 414 | #define GD_t(g) (((Agraphinfo_t*)AGDATA(g))->t) |
| 415 | |
| 416 | typedef struct Agnodeinfo_t { |
| 417 | Agrec_t hdr; |
| 418 | shape_desc *shape; |
| 419 | void *shape_info; |
| 420 | pointf coord; |
| 421 | double width; /* inches */ |
| 422 | double height; /* inches */ |
| 423 | boxf bb; |
| 424 | double ht; |
| 425 | double lw; |
| 426 | double rw; |
| 427 | textlabel_t *label; |
| 428 | textlabel_t *xlabel; |
| 429 | void *alg; |
| 430 | char state; |
| 431 | unsigned char gui_state; /* Node state for GUI ops */ |
| 432 | boolean clustnode; |
| 433 | |
| 434 | #ifndef DOT_ONLY |
| 435 | unsigned char pinned; |
| 436 | int id; |
| 437 | int heapindex; |
| 438 | int hops; |
| 439 | double *pos; |
| 440 | double dist; |
| 441 | #endif |
| 442 | #ifndef NEATO_ONLY |
| 443 | unsigned char showboxes; |
| 444 | boolean has_port; |
| 445 | node_t* rep; |
| 446 | node_t *set; |
| 447 | |
| 448 | /* fast graph */ |
| 449 | char node_type; |
| 450 | char mark; |
| 451 | char onstack; |
| 452 | char ranktype; |
| 453 | char weight_class; |
| 454 | node_t *next; |
| 455 | node_t *prev; |
| 456 | elist in; |
| 457 | elist out; |
| 458 | elist flat_out; |
| 459 | elist flat_in; |
| 460 | elist other; |
| 461 | graph_t *clust; |
| 462 | |
| 463 | /* for union-find and collapsing nodes */ |
| 464 | int UF_size; |
| 465 | node_t *UF_parent; |
| 466 | node_t *inleaf; |
| 467 | node_t *outleaf; |
| 468 | |
| 469 | /* for placing nodes */ |
| 470 | int rank; |
| 471 | int order; /* initially, order = 1 for ordered edges */ |
| 472 | double mval; |
| 473 | elist save_in; |
| 474 | elist save_out; |
| 475 | |
| 476 | /* for network-simplex */ |
| 477 | elist tree_in; |
| 478 | elist tree_out; |
| 479 | edge_t *par; |
| 480 | int low; |
| 481 | int lim; |
| 482 | int priority; |
| 483 | |
| 484 | double pad[1]; |
| 485 | #endif |
| 486 | |
| 487 | } Agnodeinfo_t; |
| 488 | |
| 489 | #define ND_id(n) (((Agnodeinfo_t*)AGDATA(n))->id) |
| 490 | #define ND_alg(n) (((Agnodeinfo_t*)AGDATA(n))->alg) |
| 491 | #define ND_UF_parent(n) (((Agnodeinfo_t*)AGDATA(n))->UF_parent) |
| 492 | #define ND_set(n) (((Agnodeinfo_t*)AGDATA(n))->set) |
| 493 | #define ND_UF_size(n) (((Agnodeinfo_t*)AGDATA(n))->UF_size) |
| 494 | #define ND_bb(n) (((Agnodeinfo_t*)AGDATA(n))->bb) |
| 495 | #define ND_clust(n) (((Agnodeinfo_t*)AGDATA(n))->clust) |
| 496 | #define ND_coord(n) (((Agnodeinfo_t*)AGDATA(n))->coord) |
| 497 | #define ND_dist(n) (((Agnodeinfo_t*)AGDATA(n))->dist) |
| 498 | #define ND_flat_in(n) (((Agnodeinfo_t*)AGDATA(n))->flat_in) |
| 499 | #define ND_flat_out(n) (((Agnodeinfo_t*)AGDATA(n))->flat_out) |
| 500 | #define ND_gui_state(n) (((Agnodeinfo_t*)AGDATA(n))->gui_state) |
| 501 | #define ND_has_port(n) (((Agnodeinfo_t*)AGDATA(n))->has_port) |
| 502 | #define ND_rep(n) (((Agnodeinfo_t*)AGDATA(n))->rep) |
| 503 | #define ND_heapindex(n) (((Agnodeinfo_t*)AGDATA(n))->heapindex) |
| 504 | #define ND_height(n) (((Agnodeinfo_t*)AGDATA(n))->height) |
| 505 | #define ND_hops(n) (((Agnodeinfo_t*)AGDATA(n))->hops) |
| 506 | #define ND_ht(n) (((Agnodeinfo_t*)AGDATA(n))->ht) |
| 507 | #define ND_in(n) (((Agnodeinfo_t*)AGDATA(n))->in) |
| 508 | #define ND_inleaf(n) (((Agnodeinfo_t*)AGDATA(n))->inleaf) |
| 509 | #define ND_label(n) (((Agnodeinfo_t*)AGDATA(n))->label) |
| 510 | #define ND_xlabel(n) (((Agnodeinfo_t*)AGDATA(n))->xlabel) |
| 511 | #define ND_lim(n) (((Agnodeinfo_t*)AGDATA(n))->lim) |
| 512 | #define ND_low(n) (((Agnodeinfo_t*)AGDATA(n))->low) |
| 513 | #define ND_lw(n) (((Agnodeinfo_t*)AGDATA(n))->lw) |
| 514 | #define ND_mark(n) (((Agnodeinfo_t*)AGDATA(n))->mark) |
| 515 | #define ND_mval(n) (((Agnodeinfo_t*)AGDATA(n))->mval) |
| 516 | #define ND_n_cluster(n) (((Agnodeinfo_t*)AGDATA(n))->n_cluster) |
| 517 | #define ND_next(n) (((Agnodeinfo_t*)AGDATA(n))->next) |
| 518 | #define ND_node_type(n) (((Agnodeinfo_t*)AGDATA(n))->node_type) |
| 519 | #define ND_onstack(n) (((Agnodeinfo_t*)AGDATA(n))->onstack) |
| 520 | #define ND_order(n) (((Agnodeinfo_t*)AGDATA(n))->order) |
| 521 | #define ND_other(n) (((Agnodeinfo_t*)AGDATA(n))->other) |
| 522 | #define ND_out(n) (((Agnodeinfo_t*)AGDATA(n))->out) |
| 523 | #define ND_outleaf(n) (((Agnodeinfo_t*)AGDATA(n))->outleaf) |
| 524 | #define ND_par(n) (((Agnodeinfo_t*)AGDATA(n))->par) |
| 525 | #define ND_pinned(n) (((Agnodeinfo_t*)AGDATA(n))->pinned) |
| 526 | #define ND_pos(n) (((Agnodeinfo_t*)AGDATA(n))->pos) |
| 527 | #define ND_prev(n) (((Agnodeinfo_t*)AGDATA(n))->prev) |
| 528 | #define ND_priority(n) (((Agnodeinfo_t*)AGDATA(n))->priority) |
| 529 | #define ND_rank(n) (((Agnodeinfo_t*)AGDATA(n))->rank) |
| 530 | #define ND_ranktype(n) (((Agnodeinfo_t*)AGDATA(n))->ranktype) |
| 531 | #define ND_rw(n) (((Agnodeinfo_t*)AGDATA(n))->rw) |
| 532 | #define ND_save_in(n) (((Agnodeinfo_t*)AGDATA(n))->save_in) |
| 533 | #define ND_save_out(n) (((Agnodeinfo_t*)AGDATA(n))->save_out) |
| 534 | #define ND_shape(n) (((Agnodeinfo_t*)AGDATA(n))->shape) |
| 535 | #define ND_shape_info(n) (((Agnodeinfo_t*)AGDATA(n))->shape_info) |
| 536 | #define ND_showboxes(n) (((Agnodeinfo_t*)AGDATA(n))->showboxes) |
| 537 | #define ND_state(n) (((Agnodeinfo_t*)AGDATA(n))->state) |
| 538 | #define ND_clustnode(n) (((Agnodeinfo_t*)AGDATA(n))->clustnode) |
| 539 | #define ND_tree_in(n) (((Agnodeinfo_t*)AGDATA(n))->tree_in) |
| 540 | #define ND_tree_out(n) (((Agnodeinfo_t*)AGDATA(n))->tree_out) |
| 541 | #define ND_weight_class(n) (((Agnodeinfo_t*)AGDATA(n))->weight_class) |
| 542 | #define ND_width(n) (((Agnodeinfo_t*)AGDATA(n))->width) |
| 543 | #define ND_xsize(n) (ND_lw(n)+ND_rw(n)) |
| 544 | #define ND_ysize(n) (ND_ht(n)) |
| 545 | |
| 546 | typedef struct Agedgeinfo_t { |
| 547 | Agrec_t hdr; |
| 548 | splines *spl; |
| 549 | port tail_port; |
| 550 | port head_port; |
| 551 | textlabel_t *label; |
| 552 | textlabel_t *head_label; |
| 553 | textlabel_t *tail_label; |
| 554 | textlabel_t *xlabel; |
| 555 | char edge_type; |
| 556 | char compound; |
| 557 | char adjacent; /* true for flat edge with adjacent nodes */ |
| 558 | char label_ontop; |
| 559 | unsigned char gui_state; /* Edge state for GUI ops */ |
| 560 | edge_t *to_orig; /* for dot's shapes.c */ |
| 561 | void *alg; |
| 562 | |
| 563 | #ifndef DOT_ONLY |
| 564 | double factor; |
| 565 | double dist; |
| 566 | Ppolyline_t path; |
| 567 | #endif |
| 568 | #ifndef NEATO_ONLY |
| 569 | unsigned char showboxes; |
| 570 | boolean conc_opp_flag; |
| 571 | short xpenalty; |
| 572 | int weight; |
| 573 | int cutvalue; |
| 574 | int tree_index; |
| 575 | short count; |
| 576 | unsigned short minlen; |
| 577 | edge_t *to_virt; |
| 578 | #endif |
| 579 | } Agedgeinfo_t; |
| 580 | |
| 581 | #define ED_alg(e) (((Agedgeinfo_t*)AGDATA(e))->alg) |
| 582 | #define ED_conc_opp_flag(e) (((Agedgeinfo_t*)AGDATA(e))->conc_opp_flag) |
| 583 | #define ED_count(e) (((Agedgeinfo_t*)AGDATA(e))->count) |
| 584 | #define ED_cutvalue(e) (((Agedgeinfo_t*)AGDATA(e))->cutvalue) |
| 585 | #define ED_edge_type(e) (((Agedgeinfo_t*)AGDATA(e))->edge_type) |
| 586 | #define ED_compound(e) (((Agedgeinfo_t*)AGDATA(e))->compound) |
| 587 | #define ED_adjacent(e) (((Agedgeinfo_t*)AGDATA(e))->adjacent) |
| 588 | #define ED_factor(e) (((Agedgeinfo_t*)AGDATA(e))->factor) |
| 589 | #define ED_gui_state(e) (((Agedgeinfo_t*)AGDATA(e))->gui_state) |
| 590 | #define ED_head_label(e) (((Agedgeinfo_t*)AGDATA(e))->head_label) |
| 591 | #define ED_head_port(e) (((Agedgeinfo_t*)AGDATA(e))->head_port) |
| 592 | #define ED_label(e) (((Agedgeinfo_t*)AGDATA(e))->label) |
| 593 | #define ED_xlabel(e) (((Agedgeinfo_t*)AGDATA(e))->xlabel) |
| 594 | #define ED_label_ontop(e) (((Agedgeinfo_t*)AGDATA(e))->label_ontop) |
| 595 | #define ED_minlen(e) (((Agedgeinfo_t*)AGDATA(e))->minlen) |
| 596 | #define ED_path(e) (((Agedgeinfo_t*)AGDATA(e))->path) |
| 597 | #define ED_showboxes(e) (((Agedgeinfo_t*)AGDATA(e))->showboxes) |
| 598 | #define ED_spl(e) (((Agedgeinfo_t*)AGDATA(e))->spl) |
| 599 | #define ED_tail_label(e) (((Agedgeinfo_t*)AGDATA(e))->tail_label) |
| 600 | #define ED_tail_port(e) (((Agedgeinfo_t*)AGDATA(e))->tail_port) |
| 601 | #define ED_to_orig(e) (((Agedgeinfo_t*)AGDATA(e))->to_orig) |
| 602 | #define ED_to_virt(e) (((Agedgeinfo_t*)AGDATA(e))->to_virt) |
| 603 | #define ED_tree_index(e) (((Agedgeinfo_t*)AGDATA(e))->tree_index) |
| 604 | #define ED_xpenalty(e) (((Agedgeinfo_t*)AGDATA(e))->xpenalty) |
| 605 | #define ED_dist(e) (((Agedgeinfo_t*)AGDATA(e))->dist) |
| 606 | #define ED_weight(e) (((Agedgeinfo_t*)AGDATA(e))->weight) |
| 607 | |
| 608 | #define ag_xget(x,a) agxget(x,a) |
| 609 | #define SET_RANKDIR(g,rd) (GD_rankdir2(g) = rd) |
| 610 | #define agfindedge(g,t,h) (agedge(g,t,h,NULL,0)) |
| 611 | #define agfindnode(g,n) (agnode(g,n,0)) |
| 612 | #define agfindgraphattr(g,a) (agattr(g,AGRAPH,a,NULL)) |
| 613 | #define agfindnodeattr(g,a) (agattr(g,AGNODE,a,NULL)) |
| 614 | #define agfindedgeattr(g,a) (agattr(g,AGEDGE,a,NULL)) |
| 615 | |
| 616 | typedef struct { |
| 617 | int flags; |
| 618 | } gvlayout_features_t; |
| 619 | |
| 620 | #ifdef __cplusplus |
| 621 | } |
| 622 | #endif |
| 623 | #endif |
| 624 | |