Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

types.h

Go to the documentation of this file.
00001 /* $Id: types.h,v 1.1 2005/04/09 03:38:19 roxo Exp $ $Revision: 1.1 $ */
00002 /* vim:set shiftwidth=4 ts=8: */
00003 
00004 /**********************************************************
00005 *      This software is part of the graphviz package      *
00006 *                http://www.graphviz.org/                 *
00007 *                                                         *
00008 *            Copyright (c) 1994-2004 AT&T Corp.           *
00009 *                and is licensed under the                *
00010 *            Common Public License, Version 1.0           *
00011 *                      by AT&T Corp.                      *
00012 *                                                         *
00013 *        Information and Software Systems Research        *
00014 *              AT&T Research, Florham Park NJ             *
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 {       /* internal edge endpoint specification */
00061         point p;                /* aiming point */
00062         double theta;           /* slope in radians */
00063         box *bp;                /* if not null, points to bbox of 
00064                                  * rectangular area that is port target
00065                                  */
00066         boolean constrained, defined;
00067         unsigned char order;    /* for mincross */
00068     } port;
00069 
00070     typedef struct {
00071         boolean(*swapEnds) (edge_t * e);        /* Should head and tail be swapped? */
00072         boolean(*splineMerge) (node_t * n);     /* Is n a node in the middle of an edge? */
00073     } splineInfo;
00074 
00075     typedef struct pathend_t {
00076         box nb;                 /* the node box */
00077         point np;               /* node port */
00078         int sidemask;
00079         int boxn;
00080         box boxes[20];
00081     } pathend_t;
00082 
00083     typedef struct path {       /* internal specification for an edge spline */
00084         port start, end;
00085         point *ulpp, *urpp, *llpp, *lrpp;       /* tangents of near splines */
00086         int nbox;               /* number of subdivisions */
00087         box *boxes;             /* rectangular regions of subdivision */
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 /* fp variants */
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;               /* delta from resizing */
00129         union {
00130             struct {
00131                 textline_t *line;
00132                 short nlines;
00133             } txt;
00134             htmllabel_t *html;
00135         } u;
00136         boolean set;            /* true if position is set */
00137         boolean html;           /* true if html label */
00138     } textlabel_t;
00139 
00140     typedef struct polygon_t {  /* mutable shape information for a node */
00141         int regular;            /* true for symmetric shapes */
00142         int peripheries;        /* number of periphery lines */
00143         int sides;              /* number of sides */
00144         double orientation;     /* orientation of shape (+ve degrees) */
00145         double distortion;      /* distortion factor - as in trapezium */
00146         double skew;            /* skew factor - as in parallelogram */
00147         int option;             /* ROUNDED, DIAGONAL corners, etc. */
00148         pointf *vertices;       /* array of vertex points */
00149     } polygon_t;
00150 
00151     typedef struct stroke_t {   /* information about a single stroke */
00152         /* we would have called it a path if that term wasn't already used */
00153         int nvertices;          /* number of points in the stroke */
00154         int flags;              /* stroke style flags */
00155         pointf *vertices;       /* array of vertex points */
00156     } stroke_t;
00157 
00158 /* flag definitions for stroke_t */
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 {    /* mutable shape information for a node */
00165         int nstrokes;           /* number of strokes in array */
00166         stroke_t *strokes;      /* array of strokes */
00167         /* The last stroke must always be closed, but can be pen_up.
00168          * It is used as the clipping path */
00169     } shape_t;
00170 
00171     typedef struct shape_functions {    /* read-only shape functions */
00172         void (*initfn) (node_t *);      /* initializes shape from node u.shape_info structure */
00173         void (*freefn) (node_t *);      /* frees  shape from node u.shape_info structure */
00174          port(*portfn) (node_t *, char *, char *);      /* finds aiming point and slope of port */
00175          boolean(*insidefn) (inside_t * inside_context, pointf);        /* clips incident gvc->e spline on shape of gvc->n */
00176         int (*pboxfn) (node_t * n, edge_t * e, int, box *, int *);      /* finds box path to reach port */
00177         void (*codefn) (GVC_t * gvc, node_t * n);       /* emits graphics code for node */
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 { /* read-only shape descriptor */
00184         char *name;             /* as read from graph file */
00185         shape_functions *fns;
00186         polygon_t *polygon;     /* base polygon info */
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);        /* not used */
00231         void (*user_shape) (char *name, point * A, int sides, int filled);
00232         void (*usershapesize) (void);   /* not used */
00233     } codegen_t;
00234 
00235     typedef struct codegen_info_t {
00236         codegen_t *cg;          /* discovered codegen */
00237         char *name;             /* output format, null for sentinel */
00238         int id;                 /* id of output format */
00239         void *info;             /* additional info provided by discovery routine */
00240         /* Quartz uses this to store the Quicktime Component */
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;                  /* number of nodes in this rank                 */
00256         node_t **v;             /* ordered list of nodes in rank                */
00257         int an;                 /* globally allocated number of nodes   */
00258         node_t **av;            /* allocated list of nodes in rank              */
00259         int ht1, ht2;           /* height below/above centerline                */
00260         int pht1, pht2;         /* as above, but only primitive nodes   */
00261         boolean candidate;      /* for transpose ()                                             */
00262         boolean valid;
00263         int cache_nc;           /* caches number of crossings                   */
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;           /* set only if ratio_kind == R_VALUE */
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 /* for "record" shapes */
00282     typedef struct field_t {
00283         point size;             /* its dimension */
00284         box b;                  /* its placement in node's coordinates */
00285         int n_flds;
00286         textlabel_t *lp;        /* n_flds == 0 */
00287         struct field_t **fld;   /* n_flds > 0 */
00288         int LR;                 /* if box list is horizontal (left to right) */
00289         char *id;               /* user's identifier */
00290     } field_t;
00291 
00292     typedef struct hsbcolor_t {
00293         char *name;
00294         unsigned char h, s, b;
00295     } hsbcolor_t;
00296 
00297 /* possible representations of color in color_t */
00298     typedef enum color_type_e { HSV_DOUBLE, RGBA_BYTE, RGBA_WORD,
00299             CMYK_BYTE } color_type;
00300 
00301 /* color_t can hold a color spec in a choice or representations */
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         /* to generate code */
00329         layout_t *drawing;
00330         textlabel_t *label;     /* if the cluster has a title */
00331         box bb;                 /* bounding box */
00332         point border[4];        /* sizes of margins for graph labels */
00333         boolean has_labels, has_images, has_Latin1char;
00334         int rankdir;
00335         int ht1, ht2;           /* below and above extremal ranks */
00336         unsigned short flags;
00337         void *alg;
00338 
00339 #ifndef DOT_ONLY
00340         /* to place nodes */
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         /* to have subgraphs */
00348         int n_cluster;
00349         graph_t **clust;        /* clusters are in clust[1..n_cluster] !!! */
00350         node_t *nlist;
00351         rank_t *rank;
00352         /* fast graph node list */
00353         nlist_t comp;
00354         /* connected components */
00355         node_t *minset, *maxset;        /* set leaders */
00356         long n_nodes;
00357         /* includes virtual */
00358         short minrank, maxrank;
00359 
00360         /* various flags */
00361         boolean has_flat_edges;
00362         boolean showboxes;
00363         boolean cluster_was_collapsed;
00364 
00365         int nodesep, ranksep;
00366         node_t *ln, *rn;        /* left, right nodes of bounding box */
00367 
00368 
00369         /* for clusters */
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         /* fast graph */
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         /* for union-find and collapsing nodes */
00456         int UF_size;
00457         node_t *UF_parent;
00458         node_t *inleaf, *outleaf;
00459 
00460         /* for placing nodes */
00461         int rank, order;        /* initially, order = 1 for ordered edges */
00462         int mval;
00463         elist save_in, save_out;
00464 
00465         /* for network-simplex */
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;      /* might be used someday */
00531         textlabel_t *label, *head_label, *tail_label;
00532         char edge_type;
00533         char label_ontop;
00534         edge_t *to_orig;        /* for dot's shapes.c    */
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
Untitled Document Pesquisa Psi SourceForge.net Logo