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])) {
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")))
|| ((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 */
}
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 */
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)
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);
/* 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])) {
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);
*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,
*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,
}
+
/* doInt:
* Scan v for integral value. Check that
* the value is >= min and <= max. Return value in 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;
{"columns", (attrFn) columnsfn},
{"fixedsize", (attrFn) fixedsizefn},
{"gradient", (attrFn) gradientfn},
+ {"gradientangle", (attrFn) gradientanglefn},
{"gradientcolor", (attrFn) gradientcolorfn},
{"height", (attrFn) heightfn},
{"href", (attrFn) hreffn},
{"colspan", (attrFn) colspanfn},
{"fixedsize", (attrFn) fixedsizefn},
{"gradient", (attrFn) gradientfn},
+ {"gradientangle", (attrFn) gradientanglefn},
{"gradientcolor", (attrFn) gradientcolorfn},
{"height", (attrFn) heightfn},
{"href", (attrFn) hreffn},
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);
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);
}
char *pencolor;
char *gradient;
char *gradientcolor;
+ int gradientangle;
signed char space;
unsigned char border;
unsigned char pad;
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 */
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 */
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
#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 };
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;
}
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 */
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,
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,
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;
/* 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);
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);
}
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 */
int style;
field_t *f;
int doMap = (obj->url || obj->explicit_tooltip);
+ int gradient;
f = (field_t *) ND_shape_info(n);
BF = f->b;
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);
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);
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);
#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;
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);
}
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"))