aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlecoanet2005-05-30 15:21:52 +0000
committerlecoanet2005-05-30 15:21:52 +0000
commit53f4f132d1573969b9b6e05ad90421e0fdba7df5 (patch)
treef6aeb489d5d27ff6967ee71e5d246fa46274a5d3
parent45ae28c31f43b439c368042106c09148a2bf5d4d (diff)
downloadtkzinc-53f4f132d1573969b9b6e05ad90421e0fdba7df5.zip
tkzinc-53f4f132d1573969b9b6e05ad90421e0fdba7df5.tar.gz
tkzinc-53f4f132d1573969b9b6e05ad90421e0fdba7df5.tar.bz2
tkzinc-53f4f132d1573969b9b6e05ad90421e0fdba7df5.tar.xz
Add a test on the coordinates of a gradient when specified as 2 points. The corner
should be greater than the origin. Fixed a bug causing a segv when either a gradient is specified either fully on the right or on the left of the filled object.
-rw-r--r--generic/Color.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/generic/Color.c b/generic/Color.c
index 8fb7b6a..e79c60e 100644
--- a/generic/Color.c
+++ b/generic/Color.c
@@ -429,15 +429,16 @@ InterpolateGradientColor(Tk_Window tkwin,
ZnReal pos1, pos2, ipos, interp_rel_pos, tmp;
XColor rgb;
- /*printf("interp_pos: %d, min_pos: %d, span: %d\n ", interp_pos, min_pos, span);*/
+ //printf("interp_pos: %d, min_pos: %d, span: %d\n ", interp_pos, min_pos, span);
pos1 = ((ZnReal)gc1->position-(ZnReal)min_pos)/(ZnReal)span;
pos2 = ((ZnReal)gc2->position-(ZnReal)min_pos)/(ZnReal)span;
ipos = ((ZnReal)interp_pos-(ZnReal)min_pos)/(ZnReal)span;
interp_rel_pos = (ipos-pos1)*100/(pos2-pos1);
- /*printf("pos1: %g, pos2: %g, interp_rel_pos: %g\n", pos1, pos2, interp_rel_pos);*/
+ //printf("pos1: %g, pos2: %g, interp_rel_pos: %g\n", pos1, pos2, interp_rel_pos);
if (interp_rel_pos < gc1->control) {
tmp = interp_rel_pos * 100.0 / gc1->control;
+ //printf("rgb : %d, mid rgb : %d\n\n", gc1->rgb, gc1->mid_rgb);
rgb.red = (unsigned short) (gc1->rgb->red + (gc1->mid_rgb->red - gc1->rgb->red) * tmp / 100.0);
rgb.green = (unsigned short) (gc1->rgb->green + (gc1->mid_rgb->green - gc1->rgb->green) * tmp / 100.0);
rgb.blue = (unsigned short) (gc1->rgb->blue + (gc1->mid_rgb->blue - gc1->rgb->blue) * tmp / 100.0);
@@ -494,6 +495,7 @@ InterpolateGradientColor(Tk_Window tkwin,
gc_adjust->control = 50;
}
}
+ //printf("out of InterpolateGradientColor\n");
}
@@ -509,6 +511,7 @@ ReduceGradient(Tk_Window tkwin,
int i, j, first_color, last_color;
ZnBool interpolate_first, interpolate_last;
+ //printf("In ReduceGradient\n");
dx = grad->e.x - grad->p.x;
dy = grad->e.y - grad->p.y;
len = sqrt(dx*dx+dy*dy);
@@ -558,8 +561,8 @@ ReduceGradient(Tk_Window tkwin,
end_in_new = (1-minx)*100/span;
}
- /*printf("minx: %g, maxx: %g, start%%: %g, end%%: %g\n",
- minx, maxx, start_in_new, end_in_new);*/
+ //printf("minx: %g, maxx: %g, start%%: %g, end%%: %g\n",
+ // minx, maxx, start_in_new, end_in_new);
/*
* Gradient is unchanged
@@ -568,19 +571,21 @@ ReduceGradient(Tk_Window tkwin,
(ABS(end_in_new-100.0) < PRECISION_LIMIT)) {
goto unchanged;
}
+ //printf("start_in_new: %g, end_in_new: %g\n", start_in_new, end_in_new);
if ((start_in_new > 100.0) || (end_in_new < 0.0)) {
grad->num_actual_colors = 1;
grad->actual_colors = ZnMalloc(sizeof(ZnGradientColor));
+ grad->actual_colors[0].position = 0;
+ grad->actual_colors[0].mid_rgb = NULL;
if (end_in_new < 0.0) {
- grad->actual_colors[0].alpha = grad->colors_in[0].alpha;
- grad->actual_colors[0].rgb = Tk_GetColorByValue(tkwin,
- grad->colors_in[0].rgb);
+ grad->actual_colors[0].alpha = grad->colors_in[grad->num_colors_in-1].alpha;
+ grad->actual_colors[0].rgb = Tk_GetColorByValue(tkwin, grad->colors_in[grad->num_colors_in-1].rgb);
}
else {
- grad->actual_colors[0].alpha = grad->colors_in[grad->num_colors_in].alpha;
- grad->actual_colors[0].rgb = Tk_GetColorByValue(tkwin,
- grad->colors_in[grad->num_colors_in].rgb);
+ grad->actual_colors[0].alpha = grad->colors_in[0].alpha;
+ grad->actual_colors[0].rgb = Tk_GetColorByValue(tkwin, grad->colors_in[0].rgb);
}
+ return;
}
grad->num_actual_colors = grad->num_colors_in;
@@ -646,6 +651,7 @@ ReduceGradient(Tk_Window tkwin,
grad->actual_colors = ZnMalloc(grad->num_actual_colors*sizeof(ZnGradientColor));
j = 0;
if (interpolate_first) {
+ //printf("Interpolate first color, index: %d\n", first_color);
InterpolateGradientColor(tkwin,
&grad->colors_in[first_color-1],
&grad->colors_in[first_color],
@@ -681,6 +687,7 @@ ReduceGradient(Tk_Window tkwin,
}
if (interpolate_last) {
+ //printf("Interpolate last color\n");
InterpolateGradientColor(tkwin,
&grad->colors_in[last_color],
&grad->colors_in[last_color+1],
@@ -698,7 +705,8 @@ ReduceGradient(Tk_Window tkwin,
/*printf("adding a color at end\n");*/
}
grad->actual_colors[j].position = 100;
- /* for (i=0; i<grad->num_actual_colors; i++) printf("control %d: %d\n", i, grad->actual_colors[i].control);*/
+ //for (i=0; i<grad->num_actual_colors; i++) printf("control %d: %d\n", i, grad->actual_colors[i].control);
+ //printf("Out of ReduceGradient\n");
}
@@ -816,7 +824,7 @@ ZnGetGradient(Tcl_Interp *interp,
int new, red_range, green_range, blue_range;
ZnBool simple;
- /* printf("ZnGetGradient : %s\n", desc);*/
+ //printf("ZnGetGradient : %s\n", desc);
if (!desc || !*desc) {
return NULL;
}
@@ -920,12 +928,22 @@ ZnGetGradient(Tcl_Interp *interp,
}
else {
Tcl_AppendResult(interp, "invalid gradient type \"",
- desc, "\",", NULL);
+ desc, "\"", NULL);
goto grad_err1;
}
scan_ptr = next_ptr + 1;
next_ptr = strchr(scan_ptr, '|');
}
+ // If the gradient is specified using two points,
+ // test whether the origin point is lower than the corner point.
+ if (num_coords == 4) {
+ if ((coords[2] < coords[0]) || (coords[3] < coords[1])) {
+ Tcl_AppendResult(interp, "Origin point is greater than corner in gradient \"",
+ desc, "\"", NULL);
+ goto grad_err1;
+ }
+ }
+
/*
* Create the gradient structure.
*/
@@ -1117,8 +1135,8 @@ ZnGetGradient(Tcl_Interp *interp,
ReduceGradient(tkwin, grad);
}
- /*printf("num in: %d, num actual: %d\n", grad->num_colors_in,grad->num_actual_colors);*/
- /*printf("ZnGetGradient end : %s\n", desc);*/
+ //printf("num in: %d, num actual: %d\n", grad->num_colors_in,grad->num_actual_colors);
+ //printf("ZnGetGradient end : %s\n", desc);
return grad;
}