annotate toolboxes/graph_visualisation/include/graphviz/types.h @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
rev   line source
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