]> granicus.if.org Git - graphviz/commitdiff
Replaced style=gradient attribute with gradient=linear and gradient=radial
authorDwight Perry <dperry@research.att.com>
Mon, 16 Jan 2012 22:50:08 +0000 (17:50 -0500)
committerDwight Perry <dperry@research.att.com>
Mon, 16 Jan 2012 22:50:08 +0000 (17:50 -0500)
lib/common/emit.c
lib/common/globals.h
lib/common/htmllex.c
lib/common/htmltable.c
lib/common/htmltable.h
lib/common/input.c
lib/common/render.h
lib/common/shapes.c
lib/gvc/gvcproc.h
lib/gvc/gvrender.c

index a77ac0eabc13d766d92fc7c46bba25a26475da7e..3d67e9ea1a43fa6377d0447c0bdab81ae2cf1815 100644 (file)
@@ -1017,8 +1017,8 @@ static void emit_xdot (GVJ_t * job, xdot* xd)
 static void emit_background(GVJ_t * job, graph_t *g)
 {
     xdot* xd;
-    char *str,*gcolor,*style;
-    int dfltColor,filltype;
+    char *str,*fillcolor;
+    int dfltColor,gradient;
     
     /* if no bgcolor specified - first assume default of "white" */
     if (! ((str = agget(g, "bgcolor")) && str[0])) {
@@ -1028,18 +1028,6 @@ static void emit_background(GVJ_t * job, graph_t *g)
     else
        dfltColor = 0;
     
-    if (((style = agget(g, "style")) && str[0])) {
-       if(strcmp(style,"linear") == 0)
-         filltype = GRADIENT;
-       else if(strcmp(style,"radial") == 0)
-         filltype = RGRADIENT;
-       else
-         filltype = 0;
-    }
-
-   if ( filltype > 0 && ((gcolor = agget(g, "gradientcolor")) && str[0])) {
-      gvrender_set_gradient(job,g,G_gradientcolor,G_gradientangle);
-   }
 
     /* if device has no truecolor support, change "transparent" to "white" */
     if (! (job->flags & GVDEVICE_DOES_TRUECOLOR) && (streq(str, "transparent")))
@@ -1050,8 +1038,13 @@ static void emit_background(GVJ_t * job, graph_t *g)
           || ((job->flags & GVRENDER_NO_WHITE_BG) && dfltColor))) {
         gvrender_set_fillcolor(job, str);
         gvrender_set_pencolor(job, str);
-       if(filltype > 0)
-         gvrender_box(job, job->clip,filltype); /* linear or radial gradient */
+       gradient = findGradient(g,G_gradient);
+       if(gradient > 0){
+         if (! ((fillcolor = agget(g, "fillcolor")) && str[0]))
+           fillcolor = str;
+         gvrender_set_gradient(job,g,fillcolor,findGradientAngle(g,G_gradientangle));
+         gvrender_box(job, job->clip,gradient); /* linear or radial gradient */
+       }
        else
          gvrender_box(job, job->clip, TRUE);   /* filled */
     }
@@ -3119,14 +3112,6 @@ static char **checkClusterStyle(graph_t* sg, int *flagp)
            if (strcmp(p, "filled") == 0) {
                istyle |= FILLED;
                pp++;
-           }
-           else if (strcmp(p, "linear") == 0) {
-               istyle |= GRADIENT;
-               pp++;
-           }
-                   if (strcmp(p, "radial") == 0) {
-               istyle |= (RGRADIENT);
-               pp++;
            }else if (strcmp(p, "rounded") == 0) {
                istyle |= ROUNDED;
                qp = pp; /* remove rounded from list passed to renderer */
@@ -3174,7 +3159,8 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
     textlabel_t *lab;
     int doAnchor;
     double penwidth;
-
+    int gradient;
+    
     for (c = 1; c <= GD_n_cluster(g); c++) {
        sg = GD_clust(g)[c];
        if (clust_in_layer(job, sg) == FALSE)
@@ -3198,6 +3184,8 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
                filled = TRUE;
        }
        fillcolor = pencolor = 0;
+       gradient = findGradient(sg,G_gradient);
+
        if (GD_gui_state(sg) & GUI_STATE_ACTIVE) {
            pencolor = late_nnstring(sg, G_activepencolor, DEFAULT_ACTIVEPENCOLOR);
            fillcolor = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
@@ -3228,19 +3216,19 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
            /* bgcolor is supported for backward compatability 
               if fill is set, fillcolor trumps bgcolor, so
                don't bother checking.
+               if gradient is set fillcolor trumps bgcolor
              */
-           if (!filled && ((color = agget(sg, "bgcolor")) != 0) && color[0]) {
+           if (!filled && ((color = agget(sg, "bgcolor")) != 0) && color[0] && gradient==0) {
                fillcolor = color;
                filled = TRUE;
             }
-           if (istyle & GRADIENT) {  //handles both linear and radial gradients
-             gvrender_set_gradient(job,sg,G_gradientcolor,G_gradientangle);
-             filled = FALSE;
-           } 
 
        }
        if (!pencolor) pencolor = DEFAULT_COLOR;
        if (!fillcolor) fillcolor = DEFAULT_FILL;
+       if (gradient > 0) {  //handles both linear and radial gradients
+         gvrender_set_gradient(job,sg,fillcolor,findGradientAngle(g,G_gradientangle));
+       } 
 
 #ifndef WITH_CGRAPH
        if (G_penwidth && ((s=agxget(sg, G_penwidth->index)) && s[0])) {
@@ -3259,20 +3247,23 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
                AF[1].y = AF[0].y;
                AF[3].x = AF[0].x;
                AF[3].y = AF[2].y;
-               round_corners(job, fillcolor, pencolor, AF, 4, istyle,istyle & FILLED);
+               if (gradient)
+                 round_corners(job, fillcolor, pencolor, AF, 4, istyle,(istyle & FILLED) | gradient);
+               else
+                 round_corners(job, fillcolor, pencolor, AF, 4, istyle,istyle & FILLED);
            }
        }
        else {
            gvrender_set_pencolor(job, pencolor);
            gvrender_set_fillcolor(job, fillcolor);
            if (late_int(sg, G_peripheries, 1, 0)){
-             if (istyle & GRADIENT)
-                 gvrender_box(job, GD_bb(sg), istyle);
+             if (gradient)
+                 gvrender_box(job, GD_bb(sg), gradient);
              else
                gvrender_box(job, GD_bb(sg), filled);
            }
-           else if (istyle & GRADIENT)
-                 gvrender_box(job, GD_bb(sg), istyle);
+           else if (gradient)
+                 gvrender_box(job, GD_bb(sg), gradient);
            else if (filled) { 
                if (fillcolor && fillcolor != pencolor)
                    gvrender_set_pencolor(job, fillcolor);
index 121539cdb15f38beb6e5c43bfe73beba4c7f1b35..d31a52e0a0fea56173035563251c94678b0d2c0f 100644 (file)
@@ -99,7 +99,7 @@ extern "C" {
        *G_visitedpencolor, *G_visitedfillcolor,
        *G_deletedpencolor, *G_deletedfillcolor,
        *G_ordering, *G_peripheries, *G_penwidth,
-       *G_gradientcolor,*G_gradientangle;
+       *G_gradient*G_gradientangle;
     EXTERN attrsym_t
        *N_height, *N_width, *N_shape, *N_color, *N_fillcolor,
        *N_activepencolor, *N_activefillcolor,
@@ -111,7 +111,7 @@ extern "C" {
        *N_sides, *N_peripheries, *N_ordering, *N_orientation,
        *N_skew, *N_distortion, *N_fixed, *N_imagescale, *N_layer,
        *N_group, *N_comment, *N_vertices, *N_z,
-       *N_penwidth,*N_gradientcolor, *N_gradientangle;
+       *N_penwidth,*N_gradient, *N_gradientangle;
     EXTERN attrsym_t
        *E_weight, *E_minlen, *E_color,
        *E_activepencolor, *E_activefillcolor,
index 1d6a63f075cf1e3724456ea0b26a30417888bcb4..9ca2bb681c1bf45aa499017be12b36afdc882dc1 100644 (file)
@@ -173,6 +173,7 @@ static int gradientcolorfn(htmldata_t * p, char *v)
 }
 
 
+
 /* doInt:
  * Scan v for integral value. Check that
  * the value is >= min and <= max. Return value in ul.
@@ -199,6 +200,18 @@ static int doInt(char *v, char *s, int min, int max, long *ul)
     return rv;
 }
 
+
+static int gradientanglefn(htmldata_t * p, char *v)
+{
+    long u;
+
+    if (doInt(v, "GRADIENTANGLE", 0, 360, &u))
+       return 1;
+    p->gradientangle = (unsigned short) u;
+    return 0;
+}
+
+
 static int borderfn(htmldata_t * p, char *v)
 {
     long u;
@@ -448,6 +461,7 @@ static attr_item tbl_items[] = {
     {"columns", (attrFn) columnsfn},
     {"fixedsize", (attrFn) fixedsizefn},
     {"gradient", (attrFn) gradientfn},
+    {"gradientangle", (attrFn) gradientanglefn},
     {"gradientcolor", (attrFn) gradientcolorfn},
     {"height", (attrFn) heightfn},
     {"href", (attrFn) hreffn},
@@ -473,6 +487,7 @@ static attr_item cell_items[] = {
     {"colspan", (attrFn) colspanfn},
     {"fixedsize", (attrFn) fixedsizefn},
     {"gradient", (attrFn) gradientfn},
+    {"gradientangle", (attrFn) gradientanglefn},
     {"gradientcolor", (attrFn) gradientcolorfn},
     {"height", (attrFn) heightfn},
     {"href", (attrFn) hreffn},
index de878f5aa0b793dc0f3b46189d848173a927f44d..a48aa12efb69ba52f8e5993d03e8b1a46ea0693c 100644 (file)
@@ -487,7 +487,7 @@ emit_html_tbl(GVJ_t * job, htmltbl_t * tbl, htmlenv_t * env)
            gradient = RGRADIENT;
        else
            gradient = 0;
-       bordercolor = gvrender_set_gradient_values(job, tbl->data.gradientcolor, 0);        
+       bordercolor = gvrender_set_gradient_values(job, tbl->data.gradientcolor, tbl->data.gradientangle);          
        
        if (tbl->style & ROUNDED){
            round_corners (job, bordercolor, NULL, AF, 4, tbl->style, gradient);
@@ -599,7 +599,7 @@ emit_html_cell(GVJ_t * job, htmlcell_t * cp, htmlenv_t * env)
          gradient = RGRADIENT;
        else
          gradient = 0;
-       bordercolor = gvrender_set_gradient_values(job, cp->data.gradientcolor, 0);
+       bordercolor = gvrender_set_gradient_values(job, cp->data.gradientcolor, cp->data.gradientangle);
        doGrdtFill(job,bordercolor, pts, gradient);
       }
 
index 33edfa1cebd07bcf25488af55020c233c791a21f..6e9a838e5d32d062648821b7ba1bf4cdbe91c154 100644 (file)
@@ -71,6 +71,7 @@ extern "C" {
        char *pencolor;
        char *gradient;
        char *gradientcolor;
+       int gradientangle;
        signed char space;
        unsigned char border;
        unsigned char pad;
index 789e166da52cdbb27b2341ed21a4173ceac7cc7e..ec8283d0195bcc56972cbd0945bfbbec095136cd 100644 (file)
@@ -794,7 +794,7 @@ void graph_init(graph_t * g, boolean use_rankdir)
     Initial_dist = MYHUGE;
 
     G_ordering = agfindgraphattr(g, "ordering");
-    G_gradientcolor = agfindgraphattr(g,"gradientcolor");
+    G_gradient = agfindgraphattr(g,"gradient");
     G_gradientangle = agfindgraphattr(g,"gradientangle");
 
     /* initialize nodes */
@@ -826,7 +826,7 @@ void graph_init(graph_t * g, boolean use_rankdir)
     N_comment = agfindnodeattr(g, "comment");
     N_vertices = agfindnodeattr(g, "vertices");
     N_z = agfindnodeattr(g, "z");
-    N_gradientcolor = agfindnodeattr(g,"gradientcolor");
+    N_gradient = agfindnodeattr(g,"gradient");
     N_gradientangle = agfindnodeattr(g,"gradientangle");
 
     /* initialize edges */
index 9167d98199c73226d8a8534edee4f23dd8a6c236..10452c5b37b6e5780743524eb259856f4e3e512e 100644 (file)
@@ -160,9 +160,10 @@ extern "C" {
     extern void write_attributed_dot(graph_t *g, FILE *f);
     extern void write_canonical_dot(graph_t *g, FILE *f);
     extern boxf xdotBB (graph_t* g);
-    extern char *findStartColor(void * n, attrsym_t * attr, char *);
-    extern char *findStopColor(void * n, attrsym_t * attr, char *);
-    extern int findGradientAngle(void * n, attrsym_t * attr);
+    extern char *findGradientColor(void * n, char *pos, char *color, char *dflt);
+    extern char *findAttrColor(void *obj, attrsym_t *colorattr, char *dflt);
+    extern int findGradient(void * n, attrsym_t * attr);
+    extern int findGradientAngle(void * n,  attrsym_t * attr);
 
 #undef extern
 
index 284a333d5f3fe9f63f1582d75d8d50dafb4a05a7..edfc29b5108b94e783284f959a148afc491b4332 100644 (file)
@@ -18,6 +18,8 @@
 #define RBCONST 12
 #define RBCURVE .5
 #define GR_SZ 50
+#define GR_START "start"
+#define GR_STOP "stop"
 
 static port Center = { {0, 0}, -1, 0, 0, 0, 1, 0, 0, 0 };
 
@@ -281,40 +283,81 @@ char *findFill(node_t * n)
     return (findFillDflt(n, DEFAULT_FILL));
 }
 
-char *findStartColor(void * n, attrsym_t * attr, char *dflt)
+int findGradient(void * n, attrsym_t * attr)
 {
+    char *gradient;
+
+    gradient = late_nnstring(n, attr, NULL);
+    if(gradient == NULL)
+      return 0;
+    else if( strcmp(gradient,"linear") == 0)
+      return GRADIENT;
+    else if (strcmp(gradient,"radial") == 0)
+      return RGRADIENT;
+    else
+      return 0;
+}
+
+char *findAttrColor(void *obj, attrsym_t *colorattr, char *dflt){
     char *color;
 
-    color = late_nnstring(n, attr, dflt);
-    if (!color[0]) {
-       color = late_nnstring(n, N_color, "");
-       if (!color[0]) {
-           color =  DEFAULT_FILL;
-       }
-    }
+    if(colorattr != NULL)
+      color = late_nnstring(obj, colorattr, dflt);
+    else if(dflt != NULL && dflt[0])
+      color = dflt;
+    else
+      color = DEFAULT_FILL;
     return color;
 }
 
-
-char *findStopColor(void * n, attrsym_t * attr, char *dflt)
+char *findGradientColor(void * n, char *pos, char *g_color, char *dflt)
 {
-    char *color,*str;
+    char *color,*ptr;
 
-    str = late_nnstring(n, attr, dflt);
-    color = strchr(str, ':');
-   if ((color == NULL) || !color[0]) {
-       color = str;
+    if( g_color == NULL){      //use dflt if available else use N_color or default color
+      if(dflt == NULL || !dflt[0]){
+       color = late_nnstring(n, N_color, "");
        if (!color[0]) {
-           color = DEFAULT_FILL;
+           color =  DEFAULT_FILL;
        }
-    }
-    else {
-      color++;
-      if (!color[0]) {
-           color = DEFAULT_FILL;
+      }
+      else
+       color = dflt;
+    }
+    else {             //input color is parameter is available
+      color = g_color;
+      if (!color[0]) { //input color is no good, so use dflt, N_color or default color instead
+       if(dflt == NULL || !dflt[0]){
+         color = late_nnstring(n, N_color, "");
+         if (!color[0])
+           color =  DEFAULT_FILL;
+       }
+       else
+         color = dflt;
+      }
+      else {   //input color is good so search for color separator ':'
+       ptr = strchr(color, ':');  
+       if(strcmp(pos,GR_START) == 0){
+         if(ptr != NULL)
+           *ptr = 0;    //drop gradient stop color
+       }
+       else if(strcmp(pos,GR_STOP) == 0) {
+         if (ptr != NULL) {   //colon not found so use start color
+           ptr++;
+           color = ptr;
+         }
+         if (!color[0]) {      //if color is not good, use dflt, N_color or default color instead
+           if(dflt == NULL || !dflt[0]){
+             color = late_nnstring(n, N_color, "");
+             if (!color[0])
+               color =  DEFAULT_FILL;
+           }
+           else
+             color = dflt;
+         }
        }
+      }
     }
-
     return color;
 }
 
@@ -342,12 +385,6 @@ static char **checkStyle(node_t * n, int *flagp)
            if (streq(p, "filled")) {
                istyle |= FILLED;
                pp++;
-           } else if (streq(p, "linear")) {
-               istyle |= GRADIENT;
-               pp++;
-           }else if (streq(p, "radial")) {
-               istyle |= (RGRADIENT);
-               pp++;
            } else if (streq(p, "rounded")) {
                istyle |= ROUNDED;
                qp = pp;        /* remove rounded from list passed to renderer */
@@ -485,10 +522,7 @@ void round_corners(GVJ_t * job, char *fillc, char *penc, pointf * AF,
                pts[j++] = B[4 * seg + 1];
                pts[j++] = B[4 * seg + 2];
            }
-           if (filled & GRADIENT)
-             gvrender_polygon(job, pts, 2 * sides, filled);
-           else
-             gvrender_polygon(job, pts, 2 * sides, TRUE);
+           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,
@@ -1621,6 +1655,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     boolean pfilled;           /* true if fill not handled by user shape */
     char *color, *name;
     int doMap = (obj->url || obj->explicit_tooltip);
+    int gradient;
 
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
        gvrender_begin_anchor(job,
@@ -1677,13 +1712,11 @@ static void poly_gencode(GVJ_t * job, node_t * n)
        gvrender_set_fillcolor(job, color);
        filled = TRUE;
     } else {
-       if (style & GRADIENT) {
-           gvrender_set_gradient(job,n,N_gradientcolor,N_gradientangle);
-           filled = FALSE;
-       } 
-       else if (style & FILLED) {
+       if (style & FILLED) {
            gvrender_set_fillcolor(job, findFill(n));   /* emit fill color */
            filled = TRUE;
+           if ( findGradient(n,N_gradient) > 0)
+             gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
        } 
        else {
            filled = FALSE;
@@ -1720,8 +1753,10 @@ static void poly_gencode(GVJ_t * job, node_t * n)
        /* lay down fill first */
        if (filled && pfilled) {
            if (sides <= 2) {
-               if (style & GRADIENT)
-                 gvrender_ellipse(job, AF, sides, style);
+               if ( (gradient = findGradient(n,N_gradient)) > 0){
+                 gvrender_ellipse(job, AF, sides, gradient);
+                 gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+               }
                else
                  gvrender_ellipse(job, AF, sides, filled);
                  
@@ -1729,15 +1764,17 @@ static void poly_gencode(GVJ_t * job, node_t * n)
                    Mcircle_hack(job, n);
                }
            } else if (style & (ROUNDED | DIAGONALS)) {
-               if (style & GRADIENT) {
-                 gvrender_set_gradient(job,n,N_gradientcolor,N_gradientangle);
-                 node_round_corners(job, n, AF, sides, style, style);
+             if ( (gradient = findGradient(n,N_gradient)) > 0){
+                 gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+                 node_round_corners(job, n, AF, sides, style, gradient);
                }
                else
                  node_round_corners(job, n, AF, sides, style, filled);
            } else {
-               if (style & GRADIENT)
-                 gvrender_polygon(job, AF, sides, style);
+             if ( (gradient = findGradient(n,N_gradient)) > 0){
+                 gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+                 gvrender_polygon(job, AF, sides, gradient);
+             }
                else
                  gvrender_polygon(job, AF, sides, filled);
            }
@@ -1754,24 +1791,28 @@ static void poly_gencode(GVJ_t * job, node_t * n)
            AF[i].y = P.y * ysize + ND_coord(n).y;
        }
        if (sides <= 2) {
-           if (style & GRADIENT)
-               gvrender_ellipse(job, AF, sides, style);
-           else
-               gvrender_ellipse(job, AF, sides, filled);
-           if (style & DIAGONALS) {
-               Mcircle_hack(job, n);
-           }
+         if ( (gradient = findGradient(n,N_gradient)) > 0){
+           gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+           gvrender_ellipse(job, AF, sides, gradient);
+         }
+         else
+           gvrender_ellipse(job, AF, sides, filled);
+         if (style & DIAGONALS) {
+           Mcircle_hack(job, n);
+         }
        } else if (SPECIAL_CORNERS(style)) {
-         if (style & GRADIENT) {
-           gvrender_set_gradient(job,n,N_gradientcolor,N_gradientangle);
-           node_round_corners(job, n, AF, sides, style, style);
+         if ( (gradient = findGradient(n,N_gradient)) > 0){
+           gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+           node_round_corners(job, n, AF, sides, style, gradient);
          }
          else
            node_round_corners(job, n, AF, sides, style, filled);
        } else {
-           if (style & GRADIENT)
-             gvrender_polygon(job, AF, sides, style);
-           else
+         if ( (gradient = findGradient(n,N_gradient)) > 0){
+           gvrender_set_gradient_attr(job,n,N_fillcolor,N_gradientangle);
+           gvrender_polygon(job, AF, sides, gradient);
+         }
+         else
              gvrender_polygon(job, AF, sides, filled);
        }
        /* fill innermost periphery only */
@@ -2524,6 +2565,7 @@ static void record_gencode(GVJ_t * job, node_t * n)
     int style;
     field_t *f;
     int doMap = (obj->url || obj->explicit_tooltip);
+    int gradient;
 
     f = (field_t *) ND_shape_info(n);
     BF = f->b;
@@ -2549,9 +2591,22 @@ 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, style & FILLED);
-    } else
-       gvrender_box(job, BF, style & FILLED);
+       gradient = findGradient(n,G_gradient);
+       if (gradient > 0) {  //handles both linear and radial gradients
+         gvrender_set_gradient(job,n,findFill(n),findGradientAngle(n,G_gradientangle));
+         node_round_corners(job, n, AF, 4, style, (style & FILLED) | gradient);
+       } 
+       else
+         node_round_corners(job, n, AF, 4, style, style & FILLED);
+    } else {
+       gradient = findGradient(n,G_gradient);
+       if (gradient > 0) {  //handles both linear and radial gradients
+         gvrender_set_gradient(job,n,findFill(n),findGradientAngle(n,G_gradientangle));
+         gvrender_box(job, BF, (style & FILLED) | gradient);
+       }
+       else
+         gvrender_box(job, BF, style & FILLED);
+      }
 
     gen_fields(job, n, f);
 
index f149c8eb21e006abe5033f574f830561d3c15d29..715b4d04b9282b93607c836c3528b1d453a67b11 100644 (file)
     extern void gvrender_set_gradientcolor(GVJ_t * job, char *gr_color_ptr[2]);
     extern void gvrender_set_gradientAngle(GVJ_t * job, int angle);
     extern void gvrender_set_gradientId(GVJ_t * job);
-    extern void gvrender_set_gradient(GVJ_t * job, void *g_obj, attrsym_t * color_attr, attrsym_t * angle_attr);
+    extern void gvrender_set_gradient_attr(GVJ_t * job, void *g_obj, attrsym_t * color_attr, attrsym_t * angle_attr);
+    extern void gvrender_set_gradient(GVJ_t * job, void *g_obj, char *color, int angle);
     extern char *gvrender_set_gradient_values(GVJ_t* job, char* gradcolor, int angle);
+
     extern void gvrender_set_style(GVJ_t * job, char **s);
     extern void gvrender_ellipse(GVJ_t * job, pointf * AF, int n, int filled);
     extern void gvrender_polygon(GVJ_t* job, pointf* af, int n, int filled);
index 4c5763fbae2d4ac2b92c7284965ebd85ffecde36..f3ceba07537252a0b37d1b9f7630246551ba0f14 100644 (file)
@@ -39,8 +39,8 @@
 
 extern int emit_once(char *str);
 extern shape_desc *find_user_shape(char *name);
-extern char *findStopColor(void * n, attrsym_t * attr, char *dflt);
-extern char *findStartColor(void * n, attrsym_t * attr, char *dflt);
+extern char *findGradientColor(void * n, char *pos, char *color, char *dflt);
+extern char *findAttrColor(void *obj, attrsym_t *colorattr, char *dflt);
 extern int findGradientAngle(void * n,  attrsym_t * attr);
 extern boolean mapbool(char *s);
 
@@ -49,6 +49,8 @@ extern int strcasecmp(const char *s1, const char *s2);
 #endif
 
 #define GR_SZ 50
+#define GR_START "start"
+#define GR_STOP "stop"
 
 /* storage for temporary hacks until client API is FP */
 static pointf *AF;
@@ -527,23 +529,37 @@ void gvrender_set_gradientId(GVJ_t * job){
   obj->gradient.id = gradientId++;
 }
 
-void gvrender_set_gradient(GVJ_t * job, void *g_obj, attrsym_t * color_attr, attrsym_t * angle_attr){
-char *ptr, *gradcolor = NULL,*gradstartcolor;
-int angle;
+void gvrender_set_gradient_attr(GVJ_t * job, void *g_obj, attrsym_t * color_attr, attrsym_t * angle_attr){
+  char *color;
+  int angle;
 
+    if(color_attr != NULL) {
+      color = N_GNEW(GR_SZ,char);
+      strcpy(color,findAttrColor(g_obj, color_attr, ""));
+      if ( angle_attr != NULL )
+       angle = findGradientAngle(g_obj,angle_attr);
+      else
+       angle = 0;
+      gvrender_set_gradient(job, g_obj, color, angle);
+      free(color);
+    }
+      
+}
+
+void gvrender_set_gradient(GVJ_t * job, void *g_obj, char * color, int angle){
+char *gradcolor = NULL,*startcolor,*stopcolor;
     
-    if(g_obj != NULL && color_attr != NULL) {
+    if(color != NULL) {
       gradcolor = N_GNEW((2 * GR_SZ)+1,char);
-      gradstartcolor = N_GNEW(GR_SZ,char);
-      strcpy(gradcolor,findStartColor(g_obj,color_attr,DEFAULT_FILL));
-      if ((ptr = strstr(gradcolor, ":")) != NULL) /* if attribute is a color list use first one */
-       *ptr = '\0';
-      strcpy(gradstartcolor,gradcolor);
+      startcolor = strdup(color);
+      stopcolor = strdup(color);
+      findGradientColor(g_obj,GR_START,startcolor,DEFAULT_FILL);
+      strcpy(gradcolor,startcolor);
       strcat(gradcolor,":");
-      strcat(gradcolor,findStopColor(g_obj,color_attr,gradstartcolor)); /* use start color as stop color if : missing */
-      angle = findGradientAngle(g_obj,angle_attr);
+      strcat(gradcolor,findGradientColor(g_obj,GR_STOP, stopcolor, startcolor)); /* use start color as stop color if : missing */
       gvrender_set_gradient_values(job,gradcolor,angle);
-      free(gradstartcolor);
+      free(startcolor);
+      free(stopcolor);
       free(gradcolor);
     }
       
@@ -606,10 +622,6 @@ void gvrender_set_style(GVJ_t * job, char **s)
                obj->penwidth = atof(p);
            } else if (streq(line, "filled"))
                obj->fill = FILL_SOLID;
-           else if (streq(line, "linear"))
-               obj->fill = FILL_LINEAR;
-           else if (streq(line, "radial"))
-               obj->fill = FILL_RADIAL;
            else if (streq(line, "unfilled"))
                obj->fill = FILL_NONE;
            else if (streq(line, "tapered"))