00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef GV_TYPES_H
00018 #define GV_TYPES_H
00019
00020 #include "pathplan.h"
00021
00022 #ifdef __cplusplus
00023 extern "C" {
00024 #endif
00025
00026 typedef unsigned char boolean;
00027
00028 typedef int (*qsort_cmpf) (const void *, const void *);
00029 typedef int (*bsearch_cmpf) (const void *, const void *);
00030
00031 typedef struct Agraph_t graph_t;
00032 typedef struct Agnode_t node_t;
00033 typedef struct Agedge_t edge_t;
00034 typedef struct Agsym_t attrsym_t;
00035
00036 typedef struct GVC_s GVC_t;
00037 typedef struct gvrender_engine_s gvrender_engine_t;
00038
00039 typedef struct htmllabel_t htmllabel_t;
00040
00041 typedef struct pointf {
00042 double x, y;
00043 } pointf;
00044
00045 typedef struct inside_t {
00046 pointf *p;
00047 double *r;
00048 node_t *n;
00049 edge_t *e;
00050 } inside_t;
00051
00052 typedef struct point {
00053 int x, y;
00054 } point;
00055
00056 typedef struct box {
00057 point LL, UR;
00058 } box;
00059
00060 typedef struct port {
00061 point p;
00062 double theta;
00063 box *bp;
00064
00065
00066 boolean constrained, defined;
00067 unsigned char order;
00068 } port;
00069
00070 typedef struct {
00071 boolean(*swapEnds) (edge_t * e);
00072 boolean(*splineMerge) (node_t * n);
00073 } splineInfo;
00074
00075 typedef struct pathend_t {
00076 box nb;
00077 point np;
00078 int sidemask;
00079 int boxn;
00080 box boxes[20];
00081 } pathend_t;
00082
00083 typedef struct path {
00084 port start, end;
00085 point *ulpp, *urpp, *llpp, *lrpp;
00086 int nbox;
00087 box *boxes;
00088 void *data;
00089 } path;
00090
00091 typedef struct bezier {
00092 point *list;
00093 int size;
00094 int sflag, eflag;
00095 point sp, ep;
00096 } bezier;
00097
00098 typedef struct splines {
00099 bezier *list;
00100 int size;
00101 } splines;
00102
00103
00104 typedef struct bezierf {
00105 pointf *list;
00106 int size;
00107 int sflag, eflag;
00108 pointf sp, ep;
00109 } bezierf;
00110
00111 typedef struct splinesf {
00112 bezierf *list;
00113 int size;
00114 } splinesf;
00115
00116 typedef struct textline_t {
00117 char *str;
00118 char *xshow;
00119 double width;
00120 char just;
00121 } textline_t;
00122
00123 typedef struct textlabel_t {
00124 char *text, *fontname, *fontcolor;
00125 double fontsize;
00126 pointf dimen;
00127 point p;
00128 pointf d;
00129 union {
00130 struct {
00131 textline_t *line;
00132 short nlines;
00133 } txt;
00134 htmllabel_t *html;
00135 } u;
00136 boolean set;
00137 boolean html;
00138 } textlabel_t;
00139
00140 typedef struct polygon_t {
00141 int regular;
00142 int peripheries;
00143 int sides;
00144 double orientation;
00145 double distortion;
00146 double skew;
00147 int option;
00148 pointf *vertices;
00149 } polygon_t;
00150
00151 typedef struct stroke_t {
00152
00153 int nvertices;
00154 int flags;
00155 pointf *vertices;
00156 } stroke_t;
00157
00158
00159 #define STROKE_CLOSED (1 << 0)
00160 #define STROKE_FILLED (1 << 1)
00161 #define STROKE_PENDOWN (1 << 2)
00162 #define STROKE_VERTICES_ALLOCATED (1 << 3)
00163
00164 typedef struct shape_t {
00165 int nstrokes;
00166 stroke_t *strokes;
00167
00168
00169 } shape_t;
00170
00171 typedef struct shape_functions {
00172 void (*initfn) (node_t *);
00173 void (*freefn) (node_t *);
00174 port(*portfn) (node_t *, char *, char *);
00175 boolean(*insidefn) (inside_t * inside_context, pointf);
00176 int (*pboxfn) (node_t * n, edge_t * e, int, box *, int *);
00177 void (*codefn) (GVC_t * gvc, node_t * n);
00178 } shape_functions;
00179
00180 typedef enum { SH_UNSET, SH_POLY, SH_RECORD, SH_POINT, SH_EPSF,
00181 SH_USER } shape_kind;
00182
00183 typedef struct shape_desc {
00184 char *name;
00185 shape_functions *fns;
00186 polygon_t *polygon;
00187 boolean usershape;
00188 } shape_desc;
00189
00190 #if ENABLE_CODEGENS
00191
00192 typedef struct codegen_t {
00193 void (*reset) (void);
00194 void (*begin_job) (FILE * ofp, graph_t * g, char **lib, char *user,
00195 char *info[], point pages);
00196 void (*end_job) (void);
00197 void (*begin_graph) (GVC_t * gvc, graph_t * g, box bb, point pb);
00198 void (*end_graph) (void);
00199 void (*begin_page) (graph_t * g, point page, double scale, int rot,
00200 point offset);
00201 void (*end_page) (void);
00202 void (*begin_layer) (char *layerName, int n, int nLayers);
00203 void (*end_layer) (void);
00204 void (*begin_cluster) (graph_t * g);
00205 void (*end_cluster) (void);
00206 void (*begin_nodes) (void);
00207 void (*end_nodes) (void);
00208 void (*begin_edges) (void);
00209 void (*end_edges) (void);
00210 void (*begin_node) (node_t * n);
00211 void (*end_node) (void);
00212 void (*begin_edge) (edge_t * e);
00213 void (*end_edge) (void);
00214 void (*begin_context) (void);
00215 void (*end_context) (void);
00216 void (*begin_anchor) (char *href, char *tooltip, char *target);
00217 void (*end_anchor) (void);
00218 void (*set_font) (char *fontname, double fontsize);
00219 void (*textline) (point p, textline_t * str);
00220 void (*set_pencolor) (char *name);
00221 void (*set_fillcolor) (char *name);
00222 void (*set_style) (char **s);
00223 void (*ellipse) (point p, int rx, int ry, int filled);
00224 void (*polygon) (point * A, int n, int filled);
00225 void (*beziercurve) (point * A, int n, int arrow_at_start,
00226 int arrow_at_end);
00227 void (*polyline) (point * A, int n);
00228 boolean bezier_has_arrows;
00229 void (*comment) (void *obj, attrsym_t * sym);
00230 void (*textsize) (void);
00231 void (*user_shape) (char *name, point * A, int sides, int filled);
00232 void (*usershapesize) (void);
00233 } codegen_t;
00234
00235 typedef struct codegen_info_t {
00236 codegen_t *cg;
00237 char *name;
00238 int id;
00239 void *info;
00240
00241 } codegen_info_t;
00242
00243 #endif
00244
00245 typedef struct queue {
00246 node_t **store, **limit, **head, **tail;
00247 } queue;
00248
00249 typedef struct adjmatrix_t {
00250 int nrows, ncols;
00251 char *data;
00252 } adjmatrix_t;
00253
00254 typedef struct rank_t {
00255 int n;
00256 node_t **v;
00257 int an;
00258 node_t **av;
00259 int ht1, ht2;
00260 int pht1, pht2;
00261 boolean candidate;
00262 boolean valid;
00263 int cache_nc;
00264 adjmatrix_t *flat;
00265 } rank_t;
00266
00267 typedef enum engine_e { DOT, NEATO, TWOPI, FDP, CIRCULAR } engine_t;
00268 typedef enum { R_NONE =
00269 0, R_VALUE, R_FILL, R_COMPRESS, R_AUTO, R_EXPAND } ratio_t;
00270
00271 typedef struct layout_t {
00272 double quantum, scale;
00273 double ratio;
00274 double dpi;
00275 point margin, page, size;
00276 boolean filled, landscape, centered;
00277 ratio_t ratio_kind;
00278 engine_t engine;
00279 } layout_t;
00280
00281
00282 typedef struct field_t {
00283 point size;
00284 box b;
00285 int n_flds;
00286 textlabel_t *lp;
00287 struct field_t **fld;
00288 int LR;
00289 char *id;
00290 } field_t;
00291
00292 typedef struct hsbcolor_t {
00293 char *name;
00294 unsigned char h, s, b;
00295 } hsbcolor_t;
00296
00297
00298 typedef enum color_type_e { HSV_DOUBLE, RGBA_BYTE, RGBA_WORD,
00299 CMYK_BYTE } color_type;
00300
00301
00302 typedef struct color_s {
00303 union {
00304 double HSV[3];
00305 unsigned char rgba[4];
00306 unsigned char cmyk[4];
00307 int rrggbbaa[4];
00308 } u;
00309 color_type type;
00310 } color_t;
00311
00312 typedef struct nlist_t {
00313 node_t **list;
00314 int size;
00315 } nlist_t;
00316
00317 typedef struct elist {
00318 edge_t **list;
00319 int size;
00320 } elist;
00321
00322 #define elist_fastapp(item,L) do {L.list[L.size++] = item; L.list[L.size] = NULL;} while(0)
00323 #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)
00324 #define alloc_elist(n,L) do {L.size = 0; L.list = N_NEW(n + 1,edge_t*); } while (0)
00325 #define free_list(L) do {if (L.list) free(L.list);} while (0)
00326
00327 typedef struct Agraphinfo_t {
00328
00329 layout_t *drawing;
00330 textlabel_t *label;
00331 box bb;
00332 point border[4];
00333 boolean has_labels, has_images, has_Latin1char;
00334 int rankdir;
00335 int ht1, ht2;
00336 unsigned short flags;
00337 void *alg;
00338
00339 #ifndef DOT_ONLY
00340
00341 node_t **neato_nlist;
00342 int move;
00343 double **dist, **spring, **sum_t, ***t;
00344 int ndim;
00345 #endif
00346 #ifndef NEATO_ONLY
00347
00348 int n_cluster;
00349 graph_t **clust;
00350 node_t *nlist;
00351 rank_t *rank;
00352
00353 nlist_t comp;
00354
00355 node_t *minset, *maxset;
00356 long n_nodes;
00357
00358 short minrank, maxrank;
00359
00360
00361 boolean has_flat_edges;
00362 boolean showboxes;
00363 boolean cluster_was_collapsed;
00364
00365 int nodesep, ranksep;
00366 node_t *ln, *rn;
00367
00368
00369
00370 node_t *leader, **rankleader;
00371 boolean expanded;
00372 char installed;
00373 char set_type;
00374 char label_pos;
00375 boolean exact_ranksep;
00376 #endif
00377
00378 } Agraphinfo_t;
00379
00380 #define GD_alg(g) (g)->u.alg
00381 #define GD_bb(g) (g)->u.bb
00382 #define GD_border(g) (g)->u.border
00383 #define GD_cl_cnt(g) (g)->u.cl_cnt
00384 #define GD_clust(g) (g)->u.clust
00385 #define GD_cluster_was_collapsed(g) (g)->u.cluster_was_collapsed
00386 #define GD_comp(g) (g)->u.comp
00387 #define GD_dist(g) (g)->u.dist
00388 #define GD_drawing(g) (g)->u.drawing
00389 #define GD_exact_ranksep(g) (g)->u.exact_ranksep
00390 #define GD_expanded(g) (g)->u.expanded
00391 #define GD_flags(g) (g)->u.flags
00392 #define GD_has_Latin1char(g) (g)->u.has_Latin1char
00393 #define GD_has_labels(g) (g)->u.has_labels
00394 #define GD_has_images(g) (g)->u.has_images
00395 #define GD_has_flat_edges(g) (g)->u.has_flat_edges
00396 #define GD_ht1(g) (g)->u.ht1
00397 #define GD_ht2(g) (g)->u.ht2
00398 #define GD_inleaf(g) (g)->u.inleaf
00399 #define GD_installed(g) (g)->u.installed
00400 #define GD_label(g) (g)->u.label
00401 #define GD_leader(g) (g)->u.leader
00402 #define GD_rankdir(g) (g)->u.rankdir
00403 #define GD_flip(g) (GD_rankdir(g) & 1)
00404 #define GD_ln(g) (g)->u.ln
00405 #define GD_maxrank(g) (g)->u.maxrank
00406 #define GD_maxset(g) (g)->u.maxset
00407 #define GD_minrank(g) (g)->u.minrank
00408 #define GD_minset(g) (g)->u.minset
00409 #define GD_move(g) (g)->u.move
00410 #define GD_n_cluster(g) (g)->u.n_cluster
00411 #define GD_n_nodes(g) (g)->u.n_nodes
00412 #define GD_ndim(g) (g)->u.ndim
00413 #define GD_neato_nlist(g) (g)->u.neato_nlist
00414 #define GD_nlist(g) (g)->u.nlist
00415 #define GD_nodesep(g) (g)->u.nodesep
00416 #define GD_outleaf(g) (g)->u.outleaf
00417 #define GD_rank(g) (g)->u.rank
00418 #define GD_rankleader(g) (g)->u.rankleader
00419 #define GD_ranksep(g) (g)->u.ranksep
00420 #define GD_rn(g) (g)->u.rn
00421 #define GD_set_type(g) (g)->u.set_type
00422 #define GD_label_pos(g) (g)->u.label_pos
00423 #define GD_showboxes(g) (g)->u.showboxes
00424 #define GD_spring(g) (g)->u.spring
00425 #define GD_sum_t(g) (g)->u.sum_t
00426 #define GD_t(g) (g)->u.t
00427
00428 typedef struct Agnodeinfo_t {
00429 shape_desc *shape;
00430 void *shape_info;
00431 point coord;
00432 double width, height;
00433 int ht, lw, rw;
00434 textlabel_t *label;
00435 void *alg;
00436 char state;
00437 boolean clustnode;
00438
00439 #ifndef DOT_ONLY
00440 short xsize, ysize;
00441 int id, heapindex, hops;
00442 double *pos, dist;
00443 boolean pinned;
00444 #endif
00445 #ifndef NEATO_ONLY
00446 boolean showboxes, has_port;
00447
00448
00449 char node_type, mark, onstack;
00450 char ranktype, weight_class;
00451 node_t *next, *prev;
00452 elist in, out, flat_out, flat_in, other;
00453 graph_t *clust;
00454
00455
00456 int UF_size;
00457 node_t *UF_parent;
00458 node_t *inleaf, *outleaf;
00459
00460
00461 int rank, order;
00462 int mval;
00463 elist save_in, save_out;
00464
00465
00466 elist tree_in, tree_out;
00467 edge_t *par;
00468 int low, lim;
00469 int priority;
00470
00471 double pad[1];
00472 #endif
00473
00474 } Agnodeinfo_t;
00475
00476 #define ND_UF_parent(n) (n)->u.UF_parent
00477 #define ND_UF_size(n) (n)->u.UF_size
00478 #define ND_alg(n) (n)->u.alg
00479 #define ND_clust(n) (n)->u.clust
00480 #define ND_coord_i(n) (n)->u.coord
00481 #define ND_dist(n) (n)->u.dist
00482 #define ND_flat_in(n) (n)->u.flat_in
00483 #define ND_flat_out(n) (n)->u.flat_out
00484 #define ND_has_port(n) (n)->u.has_port
00485 #define ND_heapindex(n) (n)->u.heapindex
00486 #define ND_height(n) (n)->u.height
00487 #define ND_hops(n) (n)->u.hops
00488 #define ND_ht_i(n) (n)->u.ht
00489 #define ND_id(n) (n)->u.id
00490 #define ND_in(n) (n)->u.in
00491 #define ND_inleaf(n) (n)->u.inleaf
00492 #define ND_label(n) (n)->u.label
00493 #define ND_lim(n) (n)->u.lim
00494 #define ND_low(n) (n)->u.low
00495 #define ND_lw_i(n) (n)->u.lw
00496 #define ND_mark(n) (n)->u.mark
00497 #define ND_mval(n) (n)->u.mval
00498 #define ND_n_cluster(n) (n)->u.n_cluster
00499 #define ND_next(n) (n)->u.next
00500 #define ND_node_type(n) (n)->u.node_type
00501 #define ND_onstack(n) (n)->u.onstack
00502 #define ND_order(n) (n)->u.order
00503 #define ND_other(n) (n)->u.other
00504 #define ND_out(n) (n)->u.out
00505 #define ND_outleaf(n) (n)->u.outleaf
00506 #define ND_par(n) (n)->u.par
00507 #define ND_pinned(n) (n)->u.pinned
00508 #define ND_pos(n) (n)->u.pos
00509 #define ND_prev(n) (n)->u.prev
00510 #define ND_priority(n) (n)->u.priority
00511 #define ND_rank(n) (n)->u.rank
00512 #define ND_ranktype(n) (n)->u.ranktype
00513 #define ND_rw_i(n) (n)->u.rw
00514 #define ND_save_in(n) (n)->u.save_in
00515 #define ND_save_out(n) (n)->u.save_out
00516 #define ND_shape(n) (n)->u.shape
00517 #define ND_shape_info(n) (n)->u.shape_info
00518 #define ND_showboxes(n) (n)->u.showboxes
00519 #define ND_state(n) (n)->u.state
00520 #define ND_clustnode(n) (n)->u.clustnode
00521 #define ND_tree_in(n) (n)->u.tree_in
00522 #define ND_tree_out(n) (n)->u.tree_out
00523 #define ND_weight_class(n) (n)->u.weight_class
00524 #define ND_width(n) (n)->u.width
00525 #define ND_xsize(n) (n)->u.xsize
00526 #define ND_ysize(n) (n)->u.ysize
00527
00528 typedef struct Agedgeinfo_t {
00529 splines *spl;
00530 port tail_port, head_port;
00531 textlabel_t *label, *head_label, *tail_label;
00532 char edge_type;
00533 char label_ontop;
00534 edge_t *to_orig;
00535 void *alg;
00536
00537 #ifndef DOT_ONLY
00538 double factor;
00539 double dist;
00540 Ppolyline_t path;
00541 #endif
00542 #ifndef NEATO_ONLY
00543 boolean showboxes;
00544 boolean conc_opp_flag;
00545 short xpenalty;
00546 int weight;
00547 int cutvalue, tree_index;
00548 short count, minlen;
00549 edge_t *to_virt;
00550 #endif
00551
00552 } Agedgeinfo_t;
00553
00554 #define ED_alg(e) (e)->u.alg
00555 #define ED_conc_opp_flag(e) (e)->u.conc_opp_flag
00556 #define ED_count(e) (e)->u.count
00557 #define ED_cutvalue(e) (e)->u.cutvalue
00558 #define ED_dist(e) (e)->u.dist
00559 #define ED_edge_type(e) (e)->u.edge_type
00560 #define ED_factor(e) (e)->u.factor
00561 #define ED_head_label(e) (e)->u.head_label
00562 #define ED_head_port(e) (e)->u.head_port
00563 #define ED_label(e) (e)->u.label
00564 #define ED_label_ontop(e) (e)->u.label_ontop
00565 #define ED_minlen(e) (e)->u.minlen
00566 #define ED_path(e) (e)->u.path
00567 #define ED_showboxes(e) (e)->u.showboxes
00568 #define ED_spl(e) (e)->u.spl
00569 #define ED_tail_label(e) (e)->u.tail_label
00570 #define ED_tail_port(e) (e)->u.tail_port
00571 #define ED_to_orig(e) (e)->u.to_orig
00572 #define ED_to_virt(e) (e)->u.to_virt
00573 #define ED_tree_index(e) (e)->u.tree_index
00574 #define ED_weight(e) (e)->u.weight
00575 #define ED_xpenalty(e) (e)->u.xpenalty
00576
00577 #ifdef __cplusplus
00578 }
00579 #endif
00580 #endif