diff options
Diffstat (limited to 'generic/Draw.c')
-rw-r--r-- | generic/Draw.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/generic/Draw.c b/generic/Draw.c index ce48b3d..cc5378c 100644 --- a/generic/Draw.c +++ b/generic/Draw.c @@ -321,27 +321,42 @@ ReliefColorOfSegment(ZnReal x1, WidgetInfo *wi) { ZnReal angle, angle_step, origin, position; - int num_colors; + int num_colors, color_index; num_colors = RELIEF_STEPS*2+1; - angle_step = 2*M_PI / num_colors; + angle_step = M_PI / (num_colors-1); origin = -(DegreesToRadian(wi->light_angle))-(angle_step/2.0); if (relief == RELIEF_BEVEL_IN) { origin += M_PI; } - angle = (ProjectionToAngle(y1 - y2, x2 - x1) + M_PI - origin); + angle = ProjectionToAngle(y1 - y2, x2 - x1) + M_PI - origin; while (angle < 0.0) { angle += 2*M_PI; } while (angle > 2*M_PI) { angle -= 2*M_PI; } - position = (angle/angle_step)*(100/num_colors); - /*printf("position %g, angle %g, origin %g\n", - position, - RadianToDegrees(angle), - RadianToDegrees(origin));*/ + + color_index = (int) (angle/angle_step); + if (color_index > num_colors-1) { + color_index = 2*(num_colors-1)-color_index; + } + if ((color_index < 0) || (color_index >= num_colors)) { + printf("Color index out of gradient (should not happen).\n"); + if (color_index < 0) { + color_index = 0; + } + if (color_index >= num_colors) { + color_index = num_colors-1; + } + } + position = 100*color_index/num_colors; + /*printf("position %g, angle %g(%g), origin %g\n", + position, + RadianToDegrees(angle), + angle, + RadianToDegrees(origin));*/ return ZnPixel(ZnGetGradientColor(wi->win, gradient, position)); } |