]> granicus.if.org Git - graphviz/commitdiff
Fix call to round_corner to assume colors have been set;
authorEmden Gansner <erg@research.att.com>
Wed, 25 Jan 2012 21:13:41 +0000 (16:13 -0500)
committerEmden Gansner <erg@research.att.com>
Wed, 25 Jan 2012 21:13:41 +0000 (16:13 -0500)
do rounded fill using a single Bezier so that gradient fill will work

lib/common/emit.c
lib/common/htmltable.c
lib/common/render.h
lib/common/shapes.c

index ddea733daf16a6b2e00d05cd50e77d8abd6d0a0f..7db2ef5c22e28a50447b539f88417eba15bddf9a 100644 (file)
@@ -3352,7 +3352,7 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
                    gvrender_set_pencolor(job, pencolor);
                else
                    gvrender_set_pencolor(job, "transparent");
-               round_corners(job, fillcolor, pencolor, AF, 4, istyle, filled);
+               round_corners(job, AF, 4, istyle, filled);
            }
        }
        else {
index 53b3594841e6ea959102ed72889fd1e2ca125100..571ee4d5941a60c492546c0e5a6d42d6f9f0a516 100644 (file)
@@ -487,8 +487,7 @@ emit_html_tbl(GVJ_t * job, htmltbl_t * tbl, htmlenv_t * env)
        char* clrs[2];
        int filled = setFill (job, tbl->data.bgcolor, tbl->data.gradientangle, tbl->data.style, clrs);
        if (tbl->data.style & ROUNDED){
-           gvrender_set_pencolor(job, "transparent");
-           round_corners (job, tbl->data.bgcolor, NULL, AF, 4, tbl->data.style, filled);
+           round_corners (job, AF, 4, tbl->data.style, filled);
        }
        else
            gvrender_box(job, pts, filled);
@@ -516,7 +515,7 @@ emit_html_tbl(GVJ_t * job, htmltbl_t * tbl, htmlenv_t * env)
            char* color = (tbl->data.pencolor ? tbl->data.pencolor : DEFAULT_COLOR);
            gvrender_set_penwidth(job, tbl->data.border);
            gvrender_set_pencolor(job, color);
-           round_corners (job, tbl->data.bgcolor, color, AF, 4, tbl->data.style, 0);
+           round_corners (job, AF, 4, tbl->data.style, 0);
        }
        else
            doBorder(job, tbl->data.pencolor, tbl->data.border, pts);
index dfa3353834906ac2f073aa37ffa9418c67766858..36f0b0d2b0d2cfc39923c9b82a7d26f412f144af 100644 (file)
@@ -141,7 +141,7 @@ extern "C" {
     extern int rank(graph_t * g, int balance, int maxiter);
     extern port resolvePort(node_t*  n, node_t* other, port* oldport);
     extern void resolvePorts (edge_t* e);
-    extern void round_corners(GVJ_t*, char*, char*, pointf*, int, int,int);
+    extern void round_corners(GVJ_t*, pointf*, int, int,int);
     extern int routesplinesinit(void);
     extern pointf *routesplines(path *, int *);
     extern void routesplinesterm(void);
index 734b4201b15dba610bf2cd43ce6b0de6aa7aaa6d..76b3c31dda087282d8a06befc4d6b35d35bbafc9 100644 (file)
@@ -99,7 +99,7 @@ static polygon_t p_Mcircle =
 
 #define IS_BOX(n) (ND_shape(n)->polygon == &p_box)
 
-/* True if style requires processing through node_round_corners. */
+/* True if style requires processing through round_corners. */
 #define SPECIAL_CORNERS(style) \
        ((style) & (ROUNDED | DIAGONALS | DOGEAR | TAB | FOLDER | BOX3D | COMPONENT))
 
@@ -246,18 +246,6 @@ void pencolor(GVJ_t * job, node_t * n)
        gvrender_set_pencolor(job, DEFAULT_COLOR);
 }
 
-static
-char *findPen(node_t * n)
-{
-    char *color;
-
-    color = late_nnstring(n, N_color, "");
-    if (color[0])
-       return color;
-    else
-       return DEFAULT_COLOR;
-}
-
 static
 char *findFillDflt(node_t * n, char *dflt)
 {
@@ -384,12 +372,20 @@ static void Mcircle_hack(GVJ_t * job, node_t * n)
     gvrender_polyline(job, AF, 2);
 }
 
-void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
-                  int sides, int style, int filled)
+/* round_corners:
+ * Handle some special graphical cases, such as rounding the shape,
+ * adding diagonals at corners, or drawing certain non-simple figures.
+ * Any drawing done here should assume fillcolors, pencolors, etc.
+ * have been set by the calling routine. Normally, the drawing should
+ * consist of a region, filled or unfilled, followed by additional line
+ * segments. A single fill is necessary for gradient colors to work.
+ */
+void round_corners(GVJ_t * job, pointf * AF, int sides, int style, int filled)
 {
     pointf *B, C[4], *D, p0, p1;
     double rbconst, d, dx, dy, t;
     int i, seg, mode;
+    pointf* pts;
 
     if (style & DIAGONALS)
        mode = DIAGONALS;
@@ -431,7 +427,7 @@ void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
            t /= 2;
        if (mode != ROUNDED)
            B[i++] = p0;
-       if (mode == ROUNDED)
+       else 
            B[i++] = interpolate_pointf(RBCURVE * t, p0, p1);
        B[i++] = interpolate_pointf(t, p0, p1);
        B[i++] = interpolate_pointf(1.0 - t, p0, p1);
@@ -444,18 +440,30 @@ void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
 
     switch (mode) {
     case ROUNDED:
+       pts = N_GNEW(6 * sides + 2, pointf);
+       i = 0;
+       for (seg = 0; seg < sides; seg++) {
+           pts[i++] = B[4 * seg];
+           pts[i++] = B[4 * seg+1];
+           pts[i++] = B[4 * seg+1];
+           pts[i++] = B[4 * seg+2];
+           pts[i++] = B[4 * seg+2];
+           pts[i++] = B[4 * seg+3];
+       }
+       pts[i++] = pts[0];
+       pts[i++] = pts[1];
+       gvrender_beziercurve(job, pts+1, i-1, FALSE, FALSE, filled);
+       free (pts);
+       
+#if 0
        if (filled) {
-           int j = 0;
            pointf *pts = N_GNEW(2 * sides, pointf);
-           for (seg = 0; seg < sides; seg++) {
                pts[j++] = B[4 * seg + 1];
                pts[j++] = B[4 * seg + 2];
            }
            gvrender_polygon(job, pts, 2 * sides, filled);
            free(pts);
            for (seg = 0; seg < sides; seg++) {
-               gvrender_beziercurve(job, B + 4 * seg + 2, 4, FALSE, FALSE,
-                                    TRUE);
            }
        }
        if (penc) {
@@ -464,6 +472,7 @@ void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
                gvrender_beziercurve(job, B + 4 * seg + 2, 4, FALSE, FALSE, FALSE);
            }
        }
+#endif
        break;
     case DIAGONALS:
        /* diagonals are weird.  rewrite someday. */
@@ -651,13 +660,6 @@ void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
     free(B);
 }
 
-static void
-node_round_corners(GVJ_t * job, node_t * n, pointf * AF, int sides,
-                  int style, int filled)
-{
-    round_corners(job, findFill(n), findPen(n), AF, sides, style, filled);
-}
-
 /*=============================poly start=========================*/
 
 /* userSize;
@@ -1637,8 +1639,10 @@ static void poly_gencode(GVJ_t * job, node_t * n)
                else
                    filled = GRADIENT;
            }
-           else
+           else {
                gvrender_set_fillcolor(job, fillcolor);
+               filled = FILL;
+           }
        }
        else {
            filled = FALSE;
@@ -1677,7 +1681,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
                    Mcircle_hack(job, n);
                }
            } else if (style & (ROUNDED | DIAGONALS)) {
-               node_round_corners(job, n, AF, sides, style, filled);
+               round_corners(job, AF, sides, style, filled);
            } else {
                gvrender_polygon(job, AF, sides, filled);
            }
@@ -1699,7 +1703,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
                Mcircle_hack(job, n);
            }
        } else if (SPECIAL_CORNERS(style)) {
-           node_round_corners(job, n, AF, sides, style, filled);
+           round_corners(job, AF, sides, style, filled);
        } else {
              gvrender_polygon(job, AF, sides, filled);
        }
@@ -2499,7 +2503,7 @@ static void record_gencode(GVJ_t * job, node_t * n)
        AF[1].y = AF[0].y;
        AF[3].x = AF[0].x;
        AF[3].y = AF[2].y;
-       node_round_corners(job, n, AF, 4, style, filled);
+       round_corners(job, AF, 4, style, filled);
     } else {
        gvrender_box(job, BF, filled);
     }