From 53f4f132d1573969b9b6e05ad90421e0fdba7df5 Mon Sep 17 00:00:00 2001 From: lecoanet Date: Mon, 30 May 2005 15:21:52 +0000 Subject: 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. --- generic/Color.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) (limited to 'generic') 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; inum_actual_colors; i++) printf("control %d: %d\n", i, grad->actual_colors[i].control);*/ + //for (i=0; inum_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; } -- cgit v1.1