]> granicus.if.org Git - graphviz/commitdiff
Allow the user to specify alignment when packing graphs as arrays
authorerg <devnull@localhost>
Thu, 27 May 2010 18:56:39 +0000 (18:56 +0000)
committererg <devnull@localhost>
Thu, 27 May 2010 18:56:39 +0000 (18:56 +0000)
cmd/tools/gvpack.1
doc/info/attrs.html
doc/infosrc/types
lib/pack/pack.c
lib/pack/pack.h

index 9ab64c60fdae45641095da8b5af85ba3611d23a2..7e715b411fe0f7c3b7261737c3e919f631322de3 100644 (file)
@@ -1,4 +1,4 @@
-.TH GVPACK 1 "8 April 2003"
+.TH GVPACK 1 "27 May 2010"
 .SH NAME
 gvpack \- merge and pack disjoint graphs
 .SH SYNOPSIS
@@ -10,6 +10,9 @@ gvpack \- merge and pack disjoint graphs
 .BI \-m margin
 ]
 [
+.B \-array\fI[_flags][n]\fP
+]
+[
 .BI \-o outfile
 ]
 [
@@ -40,6 +43,22 @@ The following options are supported:
 Combines the graphs at the graph level. This uses more space, but prevents
 parts of one graph from occurring between parts of another. 
 .TP
+.BI \-array\fI[_flags][n]\fP
+Combines the graphs at the graph level, placing them in an array.
+By default, the layout is done in row-major order. The number of columns
+used is roughly the square root of the number of graphs. If the optional
+integer \fIn\fP is supplied, this indicates the number of columns to use.
+.TP 
+
+If optional flags are supplied, these consist of an underscore followed
+by any of the letters "c", "t", "b", "l", "r" or "u".
+If "c" is supplied, the graphs are packed in column-major order, in which
+case a final integer specifies the number of rows.
+The flags "t", "b", "l", "r" indicate that components are aligned
+along the top, bottom, left or right, respectively.
+The "u" flag indicates that the insertion order is based on the
+\fIsortv\fP attribute attached to each graph.
+.TP
 .BI \-G "name\fB=\fPvalue"
 Specifies attributes to be added to the resulting union graph. For
 example, this can be used to specify a graph label.
index 63e2d2abba42a2c98d85095c8ad772bc1c5ae6e5..135c2174827eb646fc9be4cfd6e03d4a29c15b6c 100644 (file)
@@ -1957,6 +1957,10 @@ the given types.
   starting in the upper left and going down the first column, then
   down the second column, etc., until all components are used.
   <P>
+  If a graph is smaller than the array cell it occupies, it is centered by default.
+  The optional flags may contain "t", "b", "l", or "r", indicating that the graphs
+  should be aligned along the top, bottom, left or right, respectively.
+  <P>
   If the optional flags contains "u", this causes the insertion
   order of elements in the array to be determined by user-supplied
   values. Each component can specify its sort value by a 
index baf10971aa55b1824e4ef0f5a4c8a0e626b99858..c21eb9b655257d894a1e45cf40952048384e01ca 100644 (file)
@@ -193,6 +193,10 @@ Thus, the mode "array_c4" indicates array packing, with 4 rows,
 starting in the upper left and going down the first column, then
 down the second column, etc., until all components are used.
 <P>
+If a graph is smaller than the array cell it occupies, it is centered by default.
+The optional flags may contain "t", "b", "l", or "r", indicating that the graphs
+should be aligned along the top, bottom, left or right, respectively.
+<P>
 If the optional flags contains "u", this causes the insertion
 order of elements in the array to be determined by user-supplied
 values. Each component can specify its sort value by a 
index 25c07d6502bd16b216e7eff0b25652f49942dd16..28934b8dc1c6ccf68467e84bacaff297eb519ed4 100644 (file)
@@ -705,8 +705,18 @@ arrayRects (int ng, boxf* gs, pack_info* pinfo)
        ip = sinfo[i];
        idx = ip->index;
        bb = gs[idx];
-       places[idx].x = (widths[c] + widths[c+1] - bb.UR.x - bb.LL.x)/2.0;
-       places[idx].y = (heights[r] + heights[r+1] - bb.UR.y - bb.LL.y)/2.0;
+       if (pinfo->flags & PK_LEFT_ALIGN)
+           places[idx].x = widths[c];
+       else if (pinfo->flags & PK_RIGHT_ALIGN)
+           places[idx].x = widths[c+1] - (bb.UR.x - bb.LL.x);
+       else
+           places[idx].x = (widths[c] + widths[c+1] - bb.UR.x - bb.LL.x)/2.0;
+       if (pinfo->flags & PK_TOP_ALIGN)
+           places[idx].y = heights[r] - (bb.UR.y - bb.LL.y);
+       else if (pinfo->flags & PK_BOT_ALIGN)
+           places[idx].y = heights[r+1];
+       else
+           places[idx].y = (heights[r] + heights[r+1] - bb.UR.y - bb.LL.y)/2.0;
        INC(rowMajor,c,r);
     }
 
@@ -1208,6 +1218,22 @@ chkFlags (char* p, pack_info* pinfo)
            pinfo->flags |= PK_USER_VALS;
            p++;
            break;
+       case 't' :
+           pinfo->flags |= PK_TOP_ALIGN;
+           p++;
+           break;
+       case 'b' :
+           pinfo->flags |= PK_BOT_ALIGN;
+           p++;
+           break;
+       case 'l' :
+           pinfo->flags |= PK_LEFT_ALIGN;
+           p++;
+           break;
+       case 'r' :
+           pinfo->flags |= PK_RIGHT_ALIGN;
+           p++;
+           break;
        default :
            more = 0;
            break;
index 229e4fa4486f54a16d361979e6ef391866c7ca2f..8d4c1fa2d489de5cf6794cb73f79e34e656f3a71 100644 (file)
@@ -39,8 +39,12 @@ extern "C" {
  */
     typedef enum { l_undef, l_clust, l_node, l_graph, l_array, l_aspect } pack_mode;
 
-#define PK_COL_MAJOR 1
-#define PK_USER_VALS 2
+#define PK_COL_MAJOR   (1 << 0)
+#define PK_USER_VALS   (1 << 1)
+#define PK_LEFT_ALIGN  (1 << 2)
+#define PK_RIGHT_ALIGN (1 << 3)
+#define PK_TOP_ALIGN   (1 << 4)
+#define PK_BOT_ALIGN   (1 << 5)
 
 typedef unsigned char packval_t;