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
24typedef 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
42extern "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
276typedef 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