vcg.h revision b7f2b4d529ee03ee0e4172cc06e7cd973bd9bef5
1/* VCG description handler for Bison.
2
3   Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
4
5   This file is part of Bison, the GNU Compiler Compiler.
6
7   Bison is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12   Bison is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with Bison; see the file COPYING.  If not, write to
19   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20   Boston, MA 02110-1301, USA.  */
21
22#ifndef VCG_H_
23# define VCG_H_
24
25/* VCG color map. The 32 prime predefined colors. */
26enum color
27{
28  white		= 0,
29  blue,
30  red,
31  green		= 3,
32  yellow,
33  magenta,
34  cyan		= 6,
35  darkgrey,
36  darkblue,
37  darkred	= 9,
38  darkgreen,
39  darkyellow,
40  darkmagenta	= 12,
41  darkcyan,
42  gold,
43  lightgrey	= 15,
44  lightblue,
45  lightred,
46  lightgreen	= 18,
47  lightyellow,
48  lightmagenta,
49  lightcyan	= 21,
50  lilac,
51  turquoise,
52  aquamarine	= 24,
53  khaki,
54  purple,
55  yellowgreen	= 27,
56  pink,
57  orange,
58  orchid,
59  black		= 31
60};
61
62/* VCG textmode. Specify the adjustement of the text within the border of a summary node. */
63enum textmode
64{
65  centered,
66  left_justify,
67  right_justify
68};
69
70/* VCG shapes. Used for nodes shapes. */
71enum shape
72{
73  box,
74  rhomb,
75  ellipse,
76  triangle
77};
78
79/* Structure for colorentries.  */
80struct colorentry
81{
82  int color_index;
83  int red_cp;
84  int green_cp;
85  int blue_cp;
86  struct colorentry *next;
87};
88
89/* Structure to construct lists of classnames. */
90struct classname
91{
92  int no; /* Class number */
93  const char *name; /* Name associated to the class no. */
94  struct classname *next; /* next name class association. */
95};
96
97/* Structure is in infoname.  */
98struct infoname
99{
100  int integer;
101  char const *chars;
102  struct infoname *next;
103};
104
105/* VCG decision yes/no. */
106enum decision
107{
108  yes,
109  no
110};
111
112/* VCG graph orientation. */
113enum orientation
114{
115  top_to_bottom,
116  bottom_to_top,
117  left_to_right,
118  right_to_left
119};
120
121/* VCG alignment for node alignement. */
122enum alignment
123{
124  center,
125  top,
126  bottom
127};
128
129/* VCG arrow mode. */
130enum arrow_mode
131{
132  fixed,
133  free_a
134};
135
136/* VCG crossing weight type. */
137enum crossing_type
138{
139  bary,
140  median,
141  barymedian,
142  medianbary
143};
144
145/* VCG views. */
146enum view
147{
148  normal_view,
149  cfish,
150  pfish,
151  fcfish,
152  fpfish
153};
154
155/*------------------------------------------------------.
156| Node attributs list. structure that describes a node. |
157`------------------------------------------------------*/
158
159struct node
160{
161  /* Title the unique string identifying the node. This attribute is
162     mandatory. */
163  const char *title;
164
165  /* Label the text displayed inside the node. If no label is specified
166     then the title of the node will be used. Note that this text may
167     contain control characters like NEWLINE that influences the size of
168     the node. */
169  const char *label;
170
171  /* loc is the location as x, y position relatively to the system of
172     coordinates of the graph. Locations are specified in the form
173     loc: - x: xpos y: ypos "". The locations of nodes are only valid,
174     if the whole graph is fully specified with locations and no part is
175     folded. The layout algorithm of the tool calculates appropriate x, y
176     positions, if at least one node that must be drawn (i.e., is not
177     hidden by folding or edge classes) does not have fixed specified
178     locations.
179     Default is none. */
180  int locx;
181  int locy;
182
183  /* vertical order is the level position (rank) of the node. We can also
184     specify level: int. Level specifications are only valid, if the
185     layout is calculated, i.e. if at least one node does not have a
186     fixed location specification. The layout algorithm partitioned all
187     nodes into levels 0...maxlevel. Nodes at the level 0 are on the
188     upper corner. The algorithm is able to calculate appropriate levels
189     for the nodes automatically, if no fixed levels are given.
190     Specifications of levels are additional constraints, that may be
191     ignored, if they are in conflict with near edge specifications.
192     Default values are unspecified. */
193  int vertical_order;
194
195  /* horizontal order is the horizontal position of the node within a
196     level. The nodes which are specified with horizontal positions are
197     ordered according to these positions within the levels. The nodes
198     which do not have this attribute are inserted into this ordering by
199     the crossing reduction mechanism. Note that connected components are
200     handled separately, thus it is not possible to intermix such
201     components by specifying a horizontal order. If the algorithm for
202     downward laid out trees is used, the horizontal order influences
203     only the order of the child nodes at a node, but not the order of
204     the whole level.
205     Default is unspecified. */
206  int horizontal_order;
207
208  /* width, height is the width and height of a node including the border.
209     If no value (in pixels) is given then width and height are
210     calculated from the size of the label.
211     Default are width and height of the label. */
212  int width;
213  int height;
214
215  /* shrink, stretch gives the shrinking and stretching factor of the
216     node. The values of the attributes width, height, borderwidth and
217     the size of the label text is scaled by ((stretch=shrink) \Lambda
218     100) percent. Note that the actual scale value is determined by the
219     scale value of a node relatively to a scale value of the graph,
220     i.e. if (stretch,shrink) = (2,1) for the graph and (stretch,shrink)
221     = (2,1) for the node of the graph, then the node is scaled by the
222     factor 4 compared to the normal size. The scale value can also be
223     specified by scaling: float.
224     Default are 1,1. */
225  int shrink;
226  int stretch;
227
228  /* folding specifies the default folding of the nodes. The folding k
229     (with k ? 0) means that the graph part that is reachable via edges
230     of a class less or equal to k is folded and displayed as one node.
231     There are commands to unfold such summary nodes, see section 5. If
232     no folding is specified for a node, then the node may be folded if
233     it is in the region of another node that starts the folding. If
234     folding 0 is specified, then the node is never folded. In this case
235     the folding stops at the predecessors of this node, if it is
236     reachable from another folding node. The summary node inherits some
237     attributes from the original node which starts the folding (all
238     color attributes, textmode and label, but not the location). A
239     folded region may contain folded regions with smaller folding class
240     values (nested foldings). If there is more than one node that start
241     the folding of the same region (this implies that the folding class
242     values are equal) then the attributes are inherited by one of these
243     nodes nondeterministically. If foldnode attributes are specified,
244     then the summary node attributes are inherited from these attributes.
245     Default is none. */
246  int folding;
247
248  /* shape specifies the visual appearance of a node: box, rhomb, ellipse,
249     and triangle. The drawing of ellipses is much slower than the drawing
250     of the other shapes.
251     Default is box. */
252  enum shape shape;
253
254  /* textmode specifies the adjustment of the text within the border of a
255     node. The possibilities are center, left.justify and right.justify.
256     Default is center. */
257  enum textmode textmode;
258
259  /* borderwidth specifies the thickness of the node's border in pixels.
260     color is the background color of the node. If none is given, the
261     node is white. For the possibilities, see the attribute color for
262     graphs.
263     Default is 2. */
264  int borderwidth;
265
266  /* node color.
267     Default is white or transparent, */
268  enum color color;
269
270  /* textcolor is the color for the label text. bordercolor is the color
271     of the border. Default color is the textcolor. info1, info2, info3
272     combines additional text labels with a node or a folded graph. info1,
273     Default is black. */
274  enum color textcolor;
275
276  /* info2, info3 can be selected from the menu. The corresponding text
277     labels can be shown by mouse clicks on nodes.
278     Default are null strings. */
279  const char *infos[3];
280
281  /* Node border color.
282     Default is textcolor. */
283  enum color bordercolor;
284
285  /* Next node node... */
286  struct node *next;
287};
288
289/* typedef alias. */
290typedef struct node node;
291
292/*-------------------------------------------------------.
293| Edge attributs list. Structure that describes an edge. |
294`-------------------------------------------------------*/
295
296/* VCG Edge type. */
297enum edge_type
298{
299  normal_edge,
300  back_edge,
301  near_edge,
302  bent_near_edge
303};
304
305/* Structs enum definitions for edges. */
306enum linestyle
307{
308  continuous,
309  dashed,
310  dotted,
311  invisible
312};
313
314enum arrowstyle
315{
316  solid,
317  line,
318  none
319};
320
321/* The struct edge itself. */
322struct edge
323{
324
325  /* Edge type.
326     Default is normal edge. */
327  enum edge_type type;
328
329  /* Sourcename is the title of the source node of the edge.
330     Default: none. */
331  const char *sourcename; /* Mandatory. */
332
333  /* Targetname is the title of the target node of the edge.
334     Default: none. */
335  const char *targetname; /* Mandatory. */
336
337  /* Label specifies the label of the edge. It is drawn if
338     display.edge.labels is set to yes.
339     Default: no label. */
340  const char *label;
341
342  /* Linestyle specifies the style the edge is drawn. Possibilities are:
343     ffl continuous a solid line is drawn ( -- ) ffl dashed the edge
344     consists of single dashes ( - - - ) ffl dotted the edge is made of
345     single dots ( \Delta  \Delta  \Delta  ) ffl invisible the edge is not
346     drawn. The attributes of its shape (color, thickness) are ignored.
347     To draw a dashed or dotted line needs more time than solid lines.
348     Default is continuous. */
349  enum linestyle linestyle;
350
351  /* Thickness is the thickness of an edge.
352     Default is 2. */
353  int thickness;
354
355  /* Class specifies the folding class of the edge. Nodes reachable by
356     edges of a class less or equal to a constant k specify folding
357     regions of k. See the node attribute folding and the folding commands.
358     Default is 1. */
359  int class;
360
361  /* color is the color of the edge.
362     Default is black. */
363  enum color color;
364
365  /* textcolor is the color of the label of the edge. arrowcolor,
366     backarrowcolor is the color of the arrow head and of the backarrow
367     head. priority The positions of the nodes are mainly determined by
368     the incoming and outgoing edges. One can think of rubberbands instead
369     of edges that pull a node into its position. The priority of an edges
370     corresponds to the strength of the rubberband.
371     Default is color. */
372  enum color textcolor;
373
374  /* Arrow color.
375     Default is color. */
376  enum color arrowcolor;
377
378  /* BackArrow color.
379     Default is color. */
380  enum color backarrowcolor;
381
382  /* arrowsize, backarrowsize The arrow head is a right-angled, isosceles
383     triangle and the cathetuses have length arrowsize.
384     Default is 10. */
385  int arrowsize;
386
387  /* Backarrow size
388     Default is 0. */
389  int backarrowsize;
390
391  /* arrowstyle, backarrowstyle Each edge has two arrow heads: the one
392     appears at the target node (the normal arrow head), the other appears
393     at the source node (the backarrow head). Normal edges only have the
394     normal solid arrow head, while the backarrow head is not drawn, i.e.
395     it is none. Arrowstyle is the style of the normal arrow head, and
396     backarrowstyle is the style of the backarrow head. Styles are none,
397     i.e. no arrow head, solid, and line.
398     Default is solid. */
399  enum arrowstyle arrowstyle;
400
401  /* Default is none. */
402  enum arrowstyle backarrowstyle;
403
404  /* Default is 1. */
405  int priority;
406
407  /* Anchor. An anchor point describes the vertical position in a node
408     where an edge goes out. This is useful, if node labels are several
409     lines long, and outgoing edges are related to label lines. (E.g.,
410     this allows a nice visualization of structs containing pointers as
411     fields.).
412     Default is none. */
413  int anchor;
414
415  /* Horizontal order is the horizontal position the edge. This is of
416     interest only if the edge crosses several levels because it specifies
417     the point where the edge crosses the level. within a level. The nodes
418     which are specified with horizontal positions are ordered according
419     to these positions within a level. The horizontal position of a long
420     edge that crosses the level specifies between which two node of that
421     level the edge has to be drawn. Other edges which do not have this
422     attribute are inserted into this ordering by the crossing reduction
423     mechanism. Note that connected components are handled separately,
424     thus it is not possible to intermix such components by specifying a
425     horizontal order.
426     Default is unspcified. */
427  int horizontal_order;
428
429  /*
430  ** Next edge node...
431  */
432  struct edge *next;
433
434};
435
436/*
437** typedef alias.
438*/
439typedef struct edge edge;
440
441/*--------------------------------------------------------.
442| Graph attributs list. Structure that describes a graph. |
443`--------------------------------------------------------*/
444
445struct graph
446{
447  /* Graph title or name.
448     Title specifies the name (a string) associated with the graph. The
449     default name of a subgraph is the name of the outer graph, and the
450     name of the outmost graph is the name of the specification input
451     file. The name of a graph is used to identify this graph, e.g., if
452     we want to express that an edge points to a subgraph. Such edges
453     point to the root of the graph, i.e. the first node of the graph or
454     the root of the first subgraph in the graph, if the subgraph is
455     visualized explicitly.
456     By default, it's the name of the vcg graph file description. */
457  const char *title;
458
459  /* Graph label.
460     Label the text displayed inside the node, when the graph is folded
461     to a node. If no label is specified then the title of the graph will
462     be used. Note that this text may contain control characters like
463     NEWLINE that influences the size of the node.
464     By default, it takes the title value */
465  const char *label;
466
467  /* Any informations.
468     Info1, info2, info3 combines additional text labels with a node or a
469     folded graph. info1, info2, info3 can be selected from the menu
470     interactively. The corresponding text labels can be shown by mouse
471     clicks on nodes.
472     Default values are empty strings (here NULL pointers) */
473  const char *infos[3];
474
475  /* Background color and summary node colors
476     Color specifies the background color for the outermost graph, or the
477     color of the summary node for subgraphs. Colors are given in the enum
478     declared above. If more than these default colors are needed, a
479     color map with maximal 256 entries can be used. The first 32 entries
480     correspond to the colors just listed. A color of the color map can
481     selected by the color map index, an integer, for instance red has
482     index 2, green has index 3, etc.
483     Default is white for background and white or transparent for summary
484     nodes. */
485  enum color color;
486
487  /* Textcolor.
488     need explanations ???
489     default is black for summary nodes. */
490  enum color textcolor;
491
492  /* Bordercolor is the color of the summary node's border. Default color
493     is the textcolor. width, height are width and height of the
494     displayed part of the window of the outermost graph in pixels, or
495     width and height of the summary node of inner subgraphs.
496     Default is the default of the textcolor. */
497  enum color bordercolor;
498
499  /* Width, height are width and height of the displayed part of the
500     window of the outermost graph in pixels, or width and height of the
501     summary node of inner subgraphs.
502     Default value is 100. */
503  int width;
504  int height;
505
506  /* Specify the thickness if summary node's border in pixels.
507     default value is 2. */
508  int borderwidth;
509
510  /* x, y are the x-position and y-position of the graph's window in
511     pixels, relatively to the root screen, if it is the outermost graph.
512     The origin of the window is upper, left hand. For inner subgraphs,
513     it is the position of the folded summary node. The position can also
514     be specified in the form loc: fx:int y:intg.
515     The default value is 0. */
516  int x;
517  int y;
518
519  /* folding of a subgraph is 1, if the subgraph is fused, and 0, if the
520     subgraph is visualized explicitly. There are commands to unfold such
521     summary nodes.
522     Default value is 0 */
523  int folding;
524
525  /* Shrink, stretch gives the shrinking and stretching factor for the
526     graph's representation (default is 1, 1). ((stretch=shrink) \Lambda
527     100) is the scaling of the graph in percentage, e.g.,
528     (stretch,shrink) = (1,1) or (2,2) or (3,3) : : : is normal size,
529     (stretch,shrink) = (1,2) is half size, (stretch,shrink) = (2,1) is
530     double size. For subgraphs, it is also the scaling factor of the
531     summary node. The scaling factor can also be specified by scaling:
532     float (here, scaling 1.0 means normal size). */
533  int shrink;
534  int stretch;
535
536  /* textmode specifies the adjustment of the text within the border of a
537     summary node. The possibilities are center, left.justify and
538     right.justify.
539     Default value is center.*/
540  enum textmode textmode;
541
542  /* Shape can be specified for subgraphs only. It is the shape of the
543     subgraph summary node that appears if the subgraph is folded: box,
544     rhomb, ellipse, and triangle. vertical order is the level position
545     (rank) of the summary node of an inner subgraph, if this subgraph is
546     folded. We can also specify level: int. The level is only
547     recognized, if an automatical layout is calculated. horizontal order
548     is the horizontal position of the summary node within a level. The
549     nodes which are specified with horizontal positions are ordered
550     according to these positions within the levels. The nodes which do
551     not have this attribute are inserted into this ordering by the
552     crossing reduction mechanism. Note that connected
553     components are handled separately, thus it is not possible to
554     intermix such components by specifying a horizontal order. If the
555     algorithm for downward laid out trees is used, the horizontal order
556     influences only the order of the child nodes at a node, but not the
557     order of the whole level.
558     Default is box, other: rhomb, ellipse, triangle. */
559  enum shape shape;
560
561  /* Vertical order is the level position (rank) of the summary node of an
562     inner subgraph, if this subgraph is folded. We can also specify
563     level: int. The level is only recognized, if an automatical layout is
564     calculated.  */
565  int vertical_order;
566
567  /* Horizontal order is the horizontal position of the summary node within
568     a level. The nodes which are specified with horizontal positions are
569     ordered according to these positions within the levels. The nodes which
570     do not have this attribute are inserted into this ordering by the
571     crossing reduction mechanism. Note that connected components are
572     handled separately, thus it is not possible to intermix such components
573     by specifying a horizontal order. If the algorithm for downward laid
574     out trees is used, the horizontal order influences only the order of
575     the child nodes at a node, but not the order of the whole level.  */
576  int horizontal_order;
577
578  /* xmax, ymax specify the maximal size of the virtual window that is
579     used to display the graph. This is usually larger than the displayed
580     part, thus the width and height of the displayed part cannot be
581     greater than xmax and ymax. Only those parts of the graph are drawn
582     that are inside the virtual window. The virtual window can be moved
583     over the potential infinite system of coordinates by special
584     positioning commands.
585     Defaults are 90 and 90. */
586  int xmax;
587  int ymax;
588
589  /* xy-base: specify the upper left corner coordinates of the graph
590     relatively to the root window.
591     Defaults are 5, 5. */
592  int xbase;
593  int ybase;
594
595  /* xspace, yspace the minimum horizontal and vertical distance between
596     nodes. xlspace is the horizontal distance between lines at the
597     points where they cross the levels. (At these points, dummy nodes
598     are used. In fact, this is the horizontal distance between dummy
599     nodes.) It is recommended to set xlspace to a larger value, if
600     splines are used to draw edges, to prevent sharp bendings.
601     Default are 20 and 70. */
602  int xspace;
603  int yspace;
604
605  /* The horizontal space between lines at the point where they cross
606     the levels.
607     defaults value is 1/2 xspace (polygone) and 4/5 xspace (splines)*/
608  int xlspace;
609
610  /* xraster, yraster specifies the raster distance for the position of
611     the nodes. The center of a node is aligned to this raster. xlraster
612     is the horizontal raster for the positions of the line control
613     points (the dummy nodes). It should be a divisor of xraster.
614     defaults are 1,1. */
615  int xraster;
616  int yraster;
617
618  /* xlraster is the horizontal raster for the positions of the line
619     control points (the dummy nodes). It should be a divisor of xraster.
620     defaults is 1. */
621  int xlraster;
622
623  /* hidden specifies the classes of edges that are hidden.
624     Edges that are within such a class are not laid out nor drawn.
625     Nodes that are only reachable (forward or backward) by edges of an
626     hidden class are not drawn. However, nodes that are not reachable
627     at all are drawn. (But see attribute ignore.singles.) Specification
628     of classes of hidden edges allows to hide parts of a graph, e.g.,
629     annotations of a syntax tree. This attribute is only allowed at the
630     outermost level. More than one settings are possible to specify
631     exactly the set of classes that are hidden. Note the important
632     difference between hiding of edges and the edge line style invisible.
633     Hidden edges are not existent in the layout. Edges with line style
634     invisible are existent in the layout; they need space and may
635     produce crossings and influence the layout, but you cannot see
636     them.
637     No default value. */
638  int hidden;
639
640  /* Classname allows to introduce names for the edge classes. The names
641     are used in the menus. infoname allows to introduce names for the
642     additional text labels. The names are used in the menus.
643     defaults are 1,2,3...
644     By default, no class names. */
645  struct classname *classname;
646
647  /* Infoname allows to introduce names for the additional text labels.
648     The names are used in the menus.
649     Infoname is given by an integer and a string.
650     The default value is NULL.  */
651  struct infoname *infoname;
652
653  /* Colorentry allows to fill the color map. A color is a triplet of integer
654     values for the red/green/blue-part. Each integer is between 0 (off) and
655     255 (on), e.g., 0 0 0 is black and 255 255 255 is white. For instance
656     colorentry 75 : 70 130 180 sets the map entry 75 to steel blue. This
657     color can be used by specifying just the number 75.
658     Default id NULL.  */
659  struct colorentry *colorentry;
660
661  /* Layout downfactor, layout upfactor, layout nearfactor The layout
662     algorithm partitions the set of edges into edges pointing upward,
663     edges pointing downward, and edges pointing sidewards. The last type
664     of edges is also called near edges. If the layout.downfactor is
665     large compared to the layout.upfactor and the layout.nearfactor,
666     then the positions of the nodes is mainly determined by the edges
667     pointing downwards. If the layout.upfactor is large compared to the
668     layout.downfactor and the layout.nearfactor, then the positions of
669     the nodes is mainly determined by the edges pointing upwards. If the
670     layout.nearfactor is large, then the positions of the nodes is
671     mainly determined by the edges pointing sidewards. These attributes
672     have no effect, if the method for downward laid out trees is used.
673     Default is normal. */
674  int layout_downfactor;
675  int layout_upfactor;
676  int layout_nearfactor;
677  /* Layout splinefactor determines the bending at splines. The factor
678     100 indicates a very sharp bending, a factor 1 indicates a very flat
679     bending. Useful values are 30 : : : 80. */
680  int layout_splinefactor;
681
682  /* Late edge labels yes means that the graph is first partitioned and
683     then, labels are introduced. The default algorithm first creates
684     labels and then partitions the graph, which yield a more compact
685     layout, but may have more crossings.
686     Default is no. */
687  enum decision late_edge_labels;
688
689  /* Display edge labels yes means display labels and no means don't
690     display edge labels.
691     Default vaule is no. */
692  enum decision display_edge_labels;
693
694  /* Dirty edge labels yes enforces a fast layout of edge labels, which
695     may very ugly because several labels may be drawn at the same place.
696     Dirty edge labels cannot be used if splines are used.
697     Default is no.
698  */
699  enum decision dirty_edge_labels;
700
701  /* Finetuning no switches the fine tuning phase of the graph layout
702     algorithm off, while it is on as default. The fine tuning phase
703     tries to give all edges the same length.
704     Default is yes. */
705  enum decision finetuning;
706
707  /* Ignore singles yes hides all nodes which would appear single and
708     unconnected from the remaining graph. Such nodes have no edge at all
709     and are sometimes very ugly. Default is to show all nodes.
710     Default is no. */
711  enum decision ignore_singles;
712
713  /* priority phase yes replaces the normal pendulum method by a
714     specialized method: It forces straight long edges with 90 degree,
715     just as the straight phase. In fact, the straight phase is a fine
716     tune phase of the priority method. This phase is also recommended,
717     if an orthogonal layout is selected (see manhattan.edges).
718     Default is no. */
719  enum decision priority_phase;
720
721  /* manhattan edges yes switches the orthogonal layout on. Orthogonal
722     layout (or manhattan layout) means that all edges consist of line
723     segments with gradient 0 or 90 degree. Vertical edge segments might
724     by shared by several edges, while horizontal edge segments are never
725     shared. This results in very aesthetical layouts just for flowcharts.
726     If the orthogonal layout is used, then the priority phase and
727     straight phase should be used. Thus, these both phases are switched
728     on, too, unless priority layout and straight line tuning are
729     switched off explicitly.
730     Default is no. */
731  enum decision manhattan_edges;
732
733  /* Smanhattan edges yes switches a specialized orthogonal layout on:
734     Here, all horizontal edge segments between two levels share the same
735     horizontal line, i.e. not only vertical edge segments are shared,
736     but horizontal edge segments are shared by several edges, too. This
737     looks nice for trees but might be too confusing in general, because
738     the location of an edge might be ambiguously.
739     Default is no. */
740  enum decision smanhattan_edges;
741
742  /* Near edges no suppresses near edges and bent near edges in the
743     graph layout.
744     Default is yes. */
745  enum decision near_edges;
746
747  /* Orientation specifies the orientation of the graph: top.to.bottom,
748     bottom.to.top, left.to.right or right.to.left. Note: the normal
749     orientation is top.to.bottom. All explanations here are given
750     relatively to the normal orientation, i.e., e.g., if the orientation
751     is left to right, the attribute xlspace is not the horizontal but
752     the vertical distance between lines, etc.
753     Default is to_to_bottom. */
754  enum orientation orientation;
755
756  /* Node alignment specified the vertical alignment of nodes at the
757     horizontal reference line of the levels. If top is specified, the
758     tops of all nodes of a level have the same y-coordinate; on bottom,
759     the bottoms have the same y-coordinate, on center the nodes are
760     centered at the levels.
761     Default is center. */
762  enum alignment node_alignment;
763
764  /* Port sharing no suppresses the sharing of ports of edges at the
765     nodes. Normally, if multiple edges are adjacent to the same node,
766     and the arrow head of all these edges has the same visual appearance
767     (color, size, etc.), then these edges may share a port at a node,
768     i.e. only one arrow head is draw, and all edges are incoming into
769     this arrow head. This allows to have many edges adjacent to one node
770     without getting confused by too many arrow heads. If no port sharing
771     is used, each edge has its own port, i.e. its own place where it is
772     adjacent to the node.
773     Default is yes. */
774  enum decision port_sharing;
775
776  /* Arrow mode fixed (default) should be used, if port sharing is used,
777     because then, only a fixed set of rotations for the arrow heads are
778     used. If the arrow mode is free, then each arrow head is rotated
779     individually to each edge. But this can yield to a black spot, where
780     nothing is recognizable, if port sharing is used, since all these
781     qdifferently rotated arrow heads are drawn at the same place. If the
782     arrow mode is fixed, then the arrow head is rotated only in steps of
783     45 degree, and only one arrow head occurs at each port.
784     Default is fixed. */
785  enum arrow_mode arrow_mode;
786
787  /* Treefactor The algorithm tree for downward laid out trees tries to
788     produce a medium dense, balanced tree-like layout. If the tree
789     factor is greater than 0.5, the tree edges are spread, i.e. they
790     get a larger gradient. This may improve the readability of the tree.
791     Note: it is not obvious whether spreading results in a more dense or
792     wide layout. For a tree, there is a tree factor such that the whole
793     tree is minimal wide.
794     Default is 0.5. */
795  float treefactor;
796
797  /* Spreadlevel This parameter only influences the algorithm tree, too.
798     For large, balanced trees, spreading of the uppermost nodes would
799     enlarge the width of the tree too much, such that the tree does not
800     fit anymore in a window. Thus, the spreadlevel specifies the minimal
801     level (rank) where nodes are spread. Nodes of levels upper than
802     spreadlevel are not spread.
803     Default is 1. */
804  int spreadlevel;
805
806  /* Crossing weight specifies the weight that is used for the crossing
807     reduction: bary (default), median, barymedian or medianbary. We
808     cannot give a general recommendation, which is the best method. For
809     graphs with very large average degree of edges (number of incoming
810     and outgoing edges at a node), the weight bary is the fastest
811     method. With the weights barymedian and medianbary, equal weights of
812     different nodes are not very probable, thus the crossing reduction
813     phase 2 might be very fast.
814     Default is bary. */
815  enum crossing_type crossing_weight;
816
817  /* Crossing phase2 is the most time consuming phase of the crossing
818     reduction. In this phase, the nodes that happen to have equal
819     crossing weights are permuted. By specifying no, this phase is
820     suppressed.
821     Default is yes. */
822  enum decision crossing_phase2;
823
824  /* Crossing optimization is a postprocessing phase after the normal
825     crossing reduction: we try to optimize locally, by exchanging pairs
826     of nodes to reduce the crossings. Although this phase is not very
827     time consuming, it can be suppressed by specifying no.
828     Default is yes. */
829  enum decision crossing_optimization;
830
831  /* View allows to select the fisheye views. Because
832     of the fixed size of the window that shows the graph, we normally
833     can only see a small amount of a large graph. If we shrink the graph
834     such that it fits into the window, we cannot recognize any detail
835     anymore. Fisheye views are coordinate transformations: the view onto
836     the graph is distort, to overcome this usage deficiency. The polar
837     fisheye is easy to explain: assume a projection of the plane that
838     contains the graph picture onto a spheric ball. If we now look onto
839     this ball in 3 D, we have a polar fisheye view. There is a focus
840     point which is magnified such that we see all details. Parts of the
841     plane that are far away from the focus point are demagnified very
842     much. Cartesian fisheye have a similar effect; only the formula for
843     the coordinate transformation is different. Selecting cfish means
844     the cartesian fisheye is used which demagnifies such that the whole
845     graph is visible (self adaptable cartesian fisheye). With fcfish,
846     the cartesian fisheye shows the region of a fixed radius around the
847     focus point (fixed radius cartesian fisheye). This region might be
848     smaller than the whole graph, but the demagnification needed to show
849     this region in the window is also not so large, thus more details
850     are recognizable. With pfish the self adaptable polar fisheye is
851     selected that shows the whole graph, and with fpfish the fixed
852     radius polar fisheye is selected.
853     Default is normal view.  */
854  enum view view;
855
856  /* Edges no suppresses the drawing of edges.
857     Default is yes. */
858  enum decision edges;
859
860  /* Nodes no suppresses the drawing of nodes.
861     Default is yes. */
862  enum decision nodes;
863
864  /* Splines specifies whether splines are used to draw edges (yes or no).
865     As default, polygon segments are used to draw edges, because this is
866     much faster. Note that the spline drawing routine is not fully
867     validated, and is very slow. Its use is mainly to prepare high
868     quality PostScript output for very small graphs.
869     Default is no. */
870  enum decision splines;
871
872  /* Bmax set the maximal number of iterations that are done for the
873     reduction of edge bendings.
874   Default is 100. */
875  int bmax;
876
877  /* Cmin set the minimal number of iterations that are done for the
878     crossing reduction with the crossing weights. The normal method
879     stops if two consecutive checks does not reduce the number of
880     crossings anymore. However, this increasing of the number of
881     crossings might be locally, such that after some more iterations,
882     the crossing number might decrease much more.
883     Default is 0. */
884  int cmin;
885
886  /* Cmax set the maximal number of interactions for crossing reduction.
887     This is helpful for speeding up the layout process.
888     Default is -1, which represents infinity.  */
889  int cmax;
890
891  /* Pmin set the minimal number of iterations that is done with the
892     pendulum method. Similar to the crossing reduction, this method
893     stops if the `imbalancement weight' does not decreases anymore.
894     However, the increasing of the imbalancement weight might be locally,
895     such that after some more iterations, the imbalancement weight might
896     decrease much more.
897     Default is 0. */
898  int pmin;
899
900  /* Pmax set the maximal number of iterations of the pendulum method.
901     This is helpful for speedup the layout process.
902     Default is 100. */
903  int pmax;
904
905  /* Rmin set the minimal number of iterations that is done with the
906     rubberband method. This is similar as for the pendulum method.
907     Default is 0. */
908  int rmin;
909
910  /* Rmax set the maximal number of iterations of the rubberband method.
911     This is helpful for speedup the layout process.
912     Default is 100. */
913  int rmax;
914
915  /* Smax set the maximal number of iterations of the straight line
916     recognition phase (useful only, if the straight line recognition
917     phase is switched on, see attribute straight.phase).
918     Default is 100. */
919  int smax;
920
921  /* Generic values.
922   */
923  node node;
924  edge edge;
925
926  /* List of nodes declared.
927     Pointer. */
928  node *node_list;
929
930  /* List of edges declared.
931     Pointer. */
932  edge *edge_list;
933
934};
935
936/* Graph typedefs. */
937typedef struct graph graph;
938
939void new_graph (graph *g);
940void new_node (node *n);
941void new_edge (edge *e);
942
943void add_node (graph *g, node *n);
944void add_edge (graph *g, edge *e);
945
946void add_colorentry (graph *g, int color_idx, int red_cp,
947		     int green_cp, int blue_cp);
948void add_classname (graph *g, int val, const char *name);
949void add_infoname (graph *g, int val, const char *name);
950
951void open_node (FILE *fout);
952void output_node (node *n, FILE *fout);
953void close_node (FILE *fout);
954
955void open_edge (edge *e, FILE *fout);
956void output_edge (edge *e, FILE *fout);
957void close_edge (FILE *fout);
958
959void open_graph (FILE *fout);
960void output_graph (graph *g, FILE *fout);
961void close_graph (graph *g, FILE *fout);
962
963#endif /* VCG_H_ */
964