]> granicus.if.org Git - graphviz/commitdiff
Fix bug 741
authorerg <devnull@localhost>
Thu, 14 Jul 2005 22:58:42 +0000 (22:58 +0000)
committererg <devnull@localhost>
Thu, 14 Jul 2005 22:58:42 +0000 (22:58 +0000)
lib/common/input.c
lib/common/shapes.c
lib/common/types.h

index dcfcea41882dfc58081c47ce4b8bc2511d2a1ef8..036bb33361c236132294d831a6c3e095d95035ae 100644 (file)
@@ -464,6 +464,7 @@ void graph_init(graph_t * g, boolean use_rankdir)
     double xf;
     static char *rankname[] = { "local", "global", "none", NULL };
     static int rankcode[] = { LOCAL, GLOBAL, NOCLUST, LOCAL };
+    int rankdir;
 
     GD_drawing(g) = NEW(layout_t);
 
@@ -491,16 +492,24 @@ void graph_init(graph_t * g, boolean use_rankdir)
     /* setting rankdir=LR is only defined in dot,
      * but having it set causes shape code and others to use it. 
      * The result is confused output, so we turn it off unless requested.
+     * This effective rankdir is stored in the bottom 2 bits of g->u.rankdir.
+     * Sometimes, the code really needs the graph's rankdir, e.g., neato -n
+     * with record shapes, so we store the real rankdir in the next 2 bits.
      */
-    GD_rankdir(g) = RANKDIR_TB;
-    if (use_rankdir && (p = agget(g, "rankdir"))) {
+    rankdir = RANKDIR_TB;
+    if ((p = agget(g, "rankdir"))) {
        if (streq(p, "LR"))
-           GD_rankdir(g) = RANKDIR_LR;
+           rankdir = RANKDIR_LR;
        else if (streq(p, "BT"))
-           GD_rankdir(g) = RANKDIR_BT;
+           rankdir = RANKDIR_BT;
        else if (streq(p, "RL"))
-           GD_rankdir(g) = RANKDIR_RL;
+           rankdir = RANKDIR_RL;
     }
+    if (use_rankdir)
+       g->u.rankdir = (rankdir << 2) || rankdir;
+    else
+       g->u.rankdir = (rankdir << 2);
+
     xf = late_double(g, agfindattr(g, "nodesep"), DEFAULT_NODESEP,
                     MIN_NODESEP);
     GD_nodesep(g) = POINTS(xf);
index 76676679ef7b2c4b3855d469c9a21f92341adf0c..cf775218c3bb8033a7be7a6478c21b75b27f79a2 100644 (file)
@@ -1662,17 +1662,21 @@ static void record_init(node_t * n)
 {
     field_t *info;
     point ul, sz;
-    int len;
+    int flip, len;
     char *textbuf;             /* temp buffer for storing labels */
     int sides = BOTTOM | RIGHT | TOP | LEFT; 
 
+    if (Nop)
+       flip = NOT(GD_realflip(n->graph));
+    else
+       flip = NOT(GD_flip(n->graph));
     reclblp = ND_label(n)->text;
     len = strlen(reclblp);
     textbuf = N_NEW(len + 1, char);
-    if (!(info = parse_reclbl(n,NOT(GD_flip(n->graph)), TRUE, textbuf))) {
+    if (!(info = parse_reclbl(n, flip, TRUE, textbuf))) {
        agerr(AGERR, "bad label format %s\n", ND_label(n)->text);
        reclblp = "\\N";
-       info = parse_reclbl(n, NOT(GD_flip(n->graph)), TRUE, textbuf);
+       info = parse_reclbl(n, flip, TRUE, textbuf);
     }
     free(textbuf);
 
index 72c2e58c6e8f7f0a27303b0558c97da1f9e15c26..bd8d4566f81348efad2e441438dd200def4e42aa 100644 (file)
@@ -418,8 +418,10 @@ extern "C" {
 #define GD_installed(g) (g)->u.installed
 #define GD_label(g) (g)->u.label
 #define GD_leader(g) (g)->u.leader
-#define GD_rankdir(g) (g)->u.rankdir
+#define GD_rankdir(g) ((g)->u.rankdir & 0x3)
 #define GD_flip(g) (GD_rankdir(g) & 1)
+#define GD_realrankdir(g) ((g)->u.rankdir >> 2)
+#define GD_realflip(g) (GD_realrankdir(g) & 1)
 #define GD_ln(g) (g)->u.ln
 #define GD_maxrank(g) (g)->u.maxrank
 #define GD_maxset(g) (g)->u.maxset