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