From c31d2639e337108f548b0ffff16760589d7bb498 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Sat, 20 Jan 2001 16:28:05 +0000 Subject: [PATCH] made gradient_get_color_at() use GimpRGB. 2001-01-20 Michael Natterer * app/gradient.[ch]: made gradient_get_color_at() use GimpRGB. * app/airbrush.c * app/blend.c * app/gimpcontextpreview.c * app/gradient_select.c * app/paint_core.[ch] * app/paintbrush.c * app/palette.c * app/pencil.c * app/gradients_cmds.c * app/gradient_select_cmds.c * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/gradients.pdb: changed accordingly. --- ChangeLog | 18 +++++ app/airbrush.c | 15 ++-- app/blend.c | 5 +- app/core/gimpdrawable-blend.c | 5 +- app/gimpcontextpreview.c | 24 +++--- app/gradient.c | 111 +++++++++++++-------------- app/gradient.h | 5 +- app/gradient_editor.c | 111 +++++++++++++-------------- app/gradient_editor.h | 5 +- app/gradient_select.c | 16 ++-- app/gradient_select_cmds.c | 19 ++--- app/gradients_cmds.c | 24 +++--- app/gui/gradient-editor.c | 111 +++++++++++++-------------- app/gui/gradient-editor.h | 5 +- app/gui/gradient-select.c | 16 ++-- app/gui/palette-editor.c | 33 ++++---- app/paint/gimpairbrush.c | 15 ++-- app/paint/gimppencil.c | 15 ++-- app/paint_core.c | 7 +- app/paint_core.h | 5 +- app/paintbrush.c | 44 +++++------ app/palette.c | 33 ++++---- app/pencil.c | 15 ++-- app/tools/airbrush.c | 15 ++-- app/tools/blend.c | 5 +- app/tools/gimpairbrushtool.c | 15 ++-- app/tools/gimpblendtool.c | 5 +- app/tools/gimppenciltool.c | 15 ++-- app/tools/paint_core.c | 7 +- app/tools/paint_core.h | 5 +- app/tools/paintbrush.c | 44 +++++------ app/tools/pencil.c | 15 ++-- app/widgets/gimpgradienteditor.c | 111 +++++++++++++-------------- app/widgets/gimpgradienteditor.h | 5 +- app/widgets/gimppaletteeditor.c | 33 ++++---- tools/pdbgen/pdb/gradient_select.pdb | 19 ++--- tools/pdbgen/pdb/gradients.pdb | 24 +++--- 37 files changed, 499 insertions(+), 476 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8cba8662f0..f5fa9603b3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2001-01-20 Michael Natterer + + * app/gradient.[ch]: made gradient_get_color_at() use GimpRGB. + + * app/airbrush.c + * app/blend.c + * app/gimpcontextpreview.c + * app/gradient_select.c + * app/paint_core.[ch] + * app/paintbrush.c + * app/palette.c + * app/pencil.c + + * app/gradients_cmds.c + * app/gradient_select_cmds.c + * tools/pdbgen/pdb/gradient_select.pdb + * tools/pdbgen/pdb/gradients.pdb: changed accordingly. + 2001-01-20 Michael Natterer * app/color_notebook.[ch] diff --git a/app/airbrush.c b/app/airbrush.c index 62f163400b..47b307737c 100644 --- a/app/airbrush.c +++ b/app/airbrush.c @@ -330,14 +330,17 @@ airbrush_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/blend.c b/app/blend.c index e21ded4f5e..982df28bfd 100644 --- a/app/blend.c +++ b/app/blend.c @@ -1383,8 +1383,9 @@ gradient_render_pixel (double x, /* Blend the colors */ if (rbd->blend_mode == CUSTOM_MODE) - gradient_get_color_at (gimp_context_get_gradient (NULL), - factor, &color->r, &color->g, &color->b, &color->a); + { + gradient_get_color_at (gimp_context_get_gradient (NULL), factor, color); + } else { /* Blend values */ diff --git a/app/core/gimpdrawable-blend.c b/app/core/gimpdrawable-blend.c index e21ded4f5e..982df28bfd 100644 --- a/app/core/gimpdrawable-blend.c +++ b/app/core/gimpdrawable-blend.c @@ -1383,8 +1383,9 @@ gradient_render_pixel (double x, /* Blend the colors */ if (rbd->blend_mode == CUSTOM_MODE) - gradient_get_color_at (gimp_context_get_gradient (NULL), - factor, &color->r, &color->g, &color->b, &color->a); + { + gradient_get_color_at (gimp_context_get_gradient (NULL), factor, color); + } else { /* Blend values */ diff --git a/app/gimpcontextpreview.c b/app/gimpcontextpreview.c index ef9903bc42..c8f96c9fa6 100644 --- a/app/gimpcontextpreview.c +++ b/app/gimpcontextpreview.c @@ -904,11 +904,11 @@ draw_gradient (GtkPreview *preview, gint width, gint height) { - guchar *p0, *p1, *even, *odd; - gint x, y; - gdouble dx, cur_x; - gdouble r, g, b, a; - gdouble c0, c1; + guchar *p0, *p1, *even, *odd; + gint x, y; + gdouble dx, cur_x; + GimpRGB color; + gdouble c0, c1; dx = 1.0 / (width - 1); cur_x = 0.0; @@ -917,7 +917,7 @@ draw_gradient (GtkPreview *preview, for (x = 0; x < width; x++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE_SM) & 1) { @@ -930,13 +930,13 @@ draw_gradient (GtkPreview *preview, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } diff --git a/app/gradient.c b/app/gradient.c index 693c71922a..ce8f5fc908 100644 --- a/app/gradient.c +++ b/app/gradient.c @@ -711,10 +711,7 @@ gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a) + GimpRGB *color) { gdouble factor = 0.0; grad_segment_t *seg; @@ -722,10 +719,12 @@ gradient_get_color_at (gradient_t *gradient, gdouble middle; GimpRGB rgb; + g_return_if_fail (color != NULL); + /* if there is no gradient return a totally transparent black */ if (gradient == NULL) { - r = 0; g = 0; b = 0; a = 0; + gimp_rgba_set (color, 0.0, 0.0, 0.0, 0.0); return; } @@ -780,13 +779,18 @@ gradient_get_color_at (gradient_t *gradient, /* Calculate color components */ - *a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; + rgb.a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; if (seg->color == GRAD_RGB) { - *r = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; - *g = seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; - *b = seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; + rgb.r + = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; + + rgb.g = + seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; + + rgb.b = + seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; } else { @@ -837,11 +841,9 @@ gradient_get_color_at (gradient_t *gradient, } gimp_hsv_to_rgb (&left_hsv, &rgb); - - *r = rgb.r; - *g = rgb.g; - *b = rgb.b; } + + *color = rgb; } /***** The main gradient editor dialog *****/ @@ -1361,7 +1363,7 @@ gradient_clist_fill_preview (gradient_t *gradient, guchar *even, *odd; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -1373,7 +1375,7 @@ gradient_clist_fill_preview (gradient_t *gradient, for (x = 0; x < width; x++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE_SM) & 1) { @@ -1386,13 +1388,13 @@ gradient_clist_fill_preview (gradient_t *gradient, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -2298,25 +2300,28 @@ static void preview_set_hint (gint x) { gdouble xpos; - gdouble r, g, b, a; - gdouble h, s, v; + GimpRGB rgb; + GimpHSV hsv; gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, xpos, &rgb); - h = r; - s = g; - v = b; - - gimp_rgb_to_hsv_double (&h, &s, &v); + gimp_rgb_to_hsv (&rgb, &hsv); str = g_strdup_printf (_("Position: %0.6f " "RGB (%0.3f, %0.3f, %0.3f) " "HSV (%0.3f, %0.3f, %0.3f) " "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + xpos, + rgb.r, + rgb.g, + rgb.b, + hsv.h * 360.0, + hsv.s, + hsv.v, + rgb.a); ed_set_hint (str); g_free (str); @@ -2332,8 +2337,7 @@ preview_set_foreground (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_foreground (gimp_context_get_user (), &color); @@ -2356,8 +2360,7 @@ preview_set_background (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_background (gimp_context_get_user (), &color); @@ -2464,7 +2467,7 @@ preview_fill_image (gint width, guchar *p0, *p1; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -2475,7 +2478,7 @@ preview_fill_image (gint width, /* Create lines to fill the image */ for (x = 0; x < width; x++) { - gradient_get_color_at (curr_gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE) & 1) { @@ -2488,13 +2491,13 @@ preview_fill_image (gint width, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -4713,11 +4716,11 @@ cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) { - double r, g, b, a; + GimpRGB color; grad_segment_t *newseg; /* Get color at original segment's midpoint */ - gradient_get_color_at (curr_gradient, lseg->middle, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, lseg->middle, &color); /* Create a new segment and insert it in the list */ @@ -4746,10 +4749,10 @@ cpopup_split_midpoint (grad_segment_t *lseg, newseg->right_color = lseg->right_color; - lseg->right_color.r = newseg->left_color.r = r; - lseg->right_color.g = newseg->left_color.g = g; - lseg->right_color.b = newseg->left_color.b = b; - lseg->right_color.a = newseg->left_color.a = a; + lseg->right_color.r = newseg->left_color.r = color.r; + lseg->right_color.g = newseg->left_color.g = color.g; + lseg->right_color.b = newseg->left_color.b = color.b; + lseg->right_color.a = newseg->left_color.a = color.a; /* Set parameters of new segment */ @@ -4904,16 +4907,8 @@ cpopup_split_uniform (grad_segment_t *lseg, seg->right = lseg->left + (i + 1) * seg_len; seg->middle = (seg->left + seg->right) / 2.0; - gradient_get_color_at (curr_gradient, seg->left, - &seg->left_color.r, - &seg->left_color.g, - &seg->left_color.b, - &seg->left_color.a); - gradient_get_color_at (curr_gradient, seg->right, - &seg->right_color.r, - &seg->right_color.g, - &seg->right_color.b, - &seg->right_color.a); + gradient_get_color_at (curr_gradient, seg->left, &seg->left_color); + gradient_get_color_at (curr_gradient, seg->right, &seg->right_color); seg->type = lseg->type; seg->color = lseg->color; diff --git a/app/gradient.h b/app/gradient.h index b16122b89a..c3c31e627e 100644 --- a/app/gradient.h +++ b/app/gradient.h @@ -39,10 +39,7 @@ gint gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a); + GimpRGB *color); #endif /* __GRADIENT_H__ */ diff --git a/app/gradient_editor.c b/app/gradient_editor.c index 693c71922a..ce8f5fc908 100644 --- a/app/gradient_editor.c +++ b/app/gradient_editor.c @@ -711,10 +711,7 @@ gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a) + GimpRGB *color) { gdouble factor = 0.0; grad_segment_t *seg; @@ -722,10 +719,12 @@ gradient_get_color_at (gradient_t *gradient, gdouble middle; GimpRGB rgb; + g_return_if_fail (color != NULL); + /* if there is no gradient return a totally transparent black */ if (gradient == NULL) { - r = 0; g = 0; b = 0; a = 0; + gimp_rgba_set (color, 0.0, 0.0, 0.0, 0.0); return; } @@ -780,13 +779,18 @@ gradient_get_color_at (gradient_t *gradient, /* Calculate color components */ - *a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; + rgb.a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; if (seg->color == GRAD_RGB) { - *r = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; - *g = seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; - *b = seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; + rgb.r + = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; + + rgb.g = + seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; + + rgb.b = + seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; } else { @@ -837,11 +841,9 @@ gradient_get_color_at (gradient_t *gradient, } gimp_hsv_to_rgb (&left_hsv, &rgb); - - *r = rgb.r; - *g = rgb.g; - *b = rgb.b; } + + *color = rgb; } /***** The main gradient editor dialog *****/ @@ -1361,7 +1363,7 @@ gradient_clist_fill_preview (gradient_t *gradient, guchar *even, *odd; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -1373,7 +1375,7 @@ gradient_clist_fill_preview (gradient_t *gradient, for (x = 0; x < width; x++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE_SM) & 1) { @@ -1386,13 +1388,13 @@ gradient_clist_fill_preview (gradient_t *gradient, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -2298,25 +2300,28 @@ static void preview_set_hint (gint x) { gdouble xpos; - gdouble r, g, b, a; - gdouble h, s, v; + GimpRGB rgb; + GimpHSV hsv; gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, xpos, &rgb); - h = r; - s = g; - v = b; - - gimp_rgb_to_hsv_double (&h, &s, &v); + gimp_rgb_to_hsv (&rgb, &hsv); str = g_strdup_printf (_("Position: %0.6f " "RGB (%0.3f, %0.3f, %0.3f) " "HSV (%0.3f, %0.3f, %0.3f) " "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + xpos, + rgb.r, + rgb.g, + rgb.b, + hsv.h * 360.0, + hsv.s, + hsv.v, + rgb.a); ed_set_hint (str); g_free (str); @@ -2332,8 +2337,7 @@ preview_set_foreground (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_foreground (gimp_context_get_user (), &color); @@ -2356,8 +2360,7 @@ preview_set_background (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_background (gimp_context_get_user (), &color); @@ -2464,7 +2467,7 @@ preview_fill_image (gint width, guchar *p0, *p1; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -2475,7 +2478,7 @@ preview_fill_image (gint width, /* Create lines to fill the image */ for (x = 0; x < width; x++) { - gradient_get_color_at (curr_gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE) & 1) { @@ -2488,13 +2491,13 @@ preview_fill_image (gint width, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -4713,11 +4716,11 @@ cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) { - double r, g, b, a; + GimpRGB color; grad_segment_t *newseg; /* Get color at original segment's midpoint */ - gradient_get_color_at (curr_gradient, lseg->middle, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, lseg->middle, &color); /* Create a new segment and insert it in the list */ @@ -4746,10 +4749,10 @@ cpopup_split_midpoint (grad_segment_t *lseg, newseg->right_color = lseg->right_color; - lseg->right_color.r = newseg->left_color.r = r; - lseg->right_color.g = newseg->left_color.g = g; - lseg->right_color.b = newseg->left_color.b = b; - lseg->right_color.a = newseg->left_color.a = a; + lseg->right_color.r = newseg->left_color.r = color.r; + lseg->right_color.g = newseg->left_color.g = color.g; + lseg->right_color.b = newseg->left_color.b = color.b; + lseg->right_color.a = newseg->left_color.a = color.a; /* Set parameters of new segment */ @@ -4904,16 +4907,8 @@ cpopup_split_uniform (grad_segment_t *lseg, seg->right = lseg->left + (i + 1) * seg_len; seg->middle = (seg->left + seg->right) / 2.0; - gradient_get_color_at (curr_gradient, seg->left, - &seg->left_color.r, - &seg->left_color.g, - &seg->left_color.b, - &seg->left_color.a); - gradient_get_color_at (curr_gradient, seg->right, - &seg->right_color.r, - &seg->right_color.g, - &seg->right_color.b, - &seg->right_color.a); + gradient_get_color_at (curr_gradient, seg->left, &seg->left_color); + gradient_get_color_at (curr_gradient, seg->right, &seg->right_color); seg->type = lseg->type; seg->color = lseg->color; diff --git a/app/gradient_editor.h b/app/gradient_editor.h index b16122b89a..c3c31e627e 100644 --- a/app/gradient_editor.h +++ b/app/gradient_editor.h @@ -39,10 +39,7 @@ gint gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a); + GimpRGB *color); #endif /* __GRADIENT_H__ */ diff --git a/app/gradient_select.c b/app/gradient_select.c index e2f8ff5f60..5f0a284625 100644 --- a/app/gradient_select.c +++ b/app/gradient_select.c @@ -328,8 +328,10 @@ gradient_change_callbacks (GradientSelect *gsp, { gdouble *values, *pv; double pos, delta; - double r, g, b, a; - gint i = gsp->sample_size; + GimpRGB color; + gint i; + + i = gsp->sample_size; pos = 0.0; delta = 1.0 / (i - 1); @@ -338,12 +340,12 @@ gradient_change_callbacks (GradientSelect *gsp, while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } diff --git a/app/gradient_select_cmds.c b/app/gradient_select_cmds.c index 8d52766c52..b4edc6bc5c 100644 --- a/app/gradient_select_cmds.c +++ b/app/gradient_select_cmds.c @@ -327,23 +327,24 @@ gradients_get_gradient_data_invoker (Argument *args) if (success) { gdouble *pv; - gdouble pos, delta; - gdouble r, g, b, a; - int i = sample_size; + gdouble pos, delta; + GimpRGB color; + gint i; - pos = 0.0; + i = sample_size; + pos = 0.0; delta = 1.0 / (i - 1); pv = values = g_new (gdouble, i * 4); while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } diff --git a/app/gradients_cmds.c b/app/gradients_cmds.c index 2ded96df00..b823b8210a 100644 --- a/app/gradients_cmds.c +++ b/app/gradients_cmds.c @@ -211,7 +211,7 @@ gradients_sample_uniform_invoker (Argument *args) gdouble *color_samples = NULL; gradient_t *gradient; gdouble pos, delta; - gdouble r, g, b, a; + GimpRGB color; gdouble *pv; i = args[0].value.pdb_int; @@ -231,12 +231,12 @@ gradients_sample_uniform_invoker (Argument *args) while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } @@ -302,7 +302,7 @@ gradients_sample_custom_invoker (Argument *args) gint32 array_length = 0; gdouble *color_samples = NULL; gradient_t *gradient; - gdouble r, g, b, a; + GimpRGB color; gdouble *pv; i = args[0].value.pdb_int; @@ -321,12 +321,12 @@ gradients_sample_custom_invoker (Argument *args) while (i--) { - gradient_get_color_at (gradient, *pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, *pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos++; } diff --git a/app/gui/gradient-editor.c b/app/gui/gradient-editor.c index 693c71922a..ce8f5fc908 100644 --- a/app/gui/gradient-editor.c +++ b/app/gui/gradient-editor.c @@ -711,10 +711,7 @@ gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a) + GimpRGB *color) { gdouble factor = 0.0; grad_segment_t *seg; @@ -722,10 +719,12 @@ gradient_get_color_at (gradient_t *gradient, gdouble middle; GimpRGB rgb; + g_return_if_fail (color != NULL); + /* if there is no gradient return a totally transparent black */ if (gradient == NULL) { - r = 0; g = 0; b = 0; a = 0; + gimp_rgba_set (color, 0.0, 0.0, 0.0, 0.0); return; } @@ -780,13 +779,18 @@ gradient_get_color_at (gradient_t *gradient, /* Calculate color components */ - *a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; + rgb.a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; if (seg->color == GRAD_RGB) { - *r = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; - *g = seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; - *b = seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; + rgb.r + = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; + + rgb.g = + seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; + + rgb.b = + seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; } else { @@ -837,11 +841,9 @@ gradient_get_color_at (gradient_t *gradient, } gimp_hsv_to_rgb (&left_hsv, &rgb); - - *r = rgb.r; - *g = rgb.g; - *b = rgb.b; } + + *color = rgb; } /***** The main gradient editor dialog *****/ @@ -1361,7 +1363,7 @@ gradient_clist_fill_preview (gradient_t *gradient, guchar *even, *odd; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -1373,7 +1375,7 @@ gradient_clist_fill_preview (gradient_t *gradient, for (x = 0; x < width; x++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE_SM) & 1) { @@ -1386,13 +1388,13 @@ gradient_clist_fill_preview (gradient_t *gradient, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -2298,25 +2300,28 @@ static void preview_set_hint (gint x) { gdouble xpos; - gdouble r, g, b, a; - gdouble h, s, v; + GimpRGB rgb; + GimpHSV hsv; gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, xpos, &rgb); - h = r; - s = g; - v = b; - - gimp_rgb_to_hsv_double (&h, &s, &v); + gimp_rgb_to_hsv (&rgb, &hsv); str = g_strdup_printf (_("Position: %0.6f " "RGB (%0.3f, %0.3f, %0.3f) " "HSV (%0.3f, %0.3f, %0.3f) " "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + xpos, + rgb.r, + rgb.g, + rgb.b, + hsv.h * 360.0, + hsv.s, + hsv.v, + rgb.a); ed_set_hint (str); g_free (str); @@ -2332,8 +2337,7 @@ preview_set_foreground (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_foreground (gimp_context_get_user (), &color); @@ -2356,8 +2360,7 @@ preview_set_background (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_background (gimp_context_get_user (), &color); @@ -2464,7 +2467,7 @@ preview_fill_image (gint width, guchar *p0, *p1; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -2475,7 +2478,7 @@ preview_fill_image (gint width, /* Create lines to fill the image */ for (x = 0; x < width; x++) { - gradient_get_color_at (curr_gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE) & 1) { @@ -2488,13 +2491,13 @@ preview_fill_image (gint width, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -4713,11 +4716,11 @@ cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) { - double r, g, b, a; + GimpRGB color; grad_segment_t *newseg; /* Get color at original segment's midpoint */ - gradient_get_color_at (curr_gradient, lseg->middle, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, lseg->middle, &color); /* Create a new segment and insert it in the list */ @@ -4746,10 +4749,10 @@ cpopup_split_midpoint (grad_segment_t *lseg, newseg->right_color = lseg->right_color; - lseg->right_color.r = newseg->left_color.r = r; - lseg->right_color.g = newseg->left_color.g = g; - lseg->right_color.b = newseg->left_color.b = b; - lseg->right_color.a = newseg->left_color.a = a; + lseg->right_color.r = newseg->left_color.r = color.r; + lseg->right_color.g = newseg->left_color.g = color.g; + lseg->right_color.b = newseg->left_color.b = color.b; + lseg->right_color.a = newseg->left_color.a = color.a; /* Set parameters of new segment */ @@ -4904,16 +4907,8 @@ cpopup_split_uniform (grad_segment_t *lseg, seg->right = lseg->left + (i + 1) * seg_len; seg->middle = (seg->left + seg->right) / 2.0; - gradient_get_color_at (curr_gradient, seg->left, - &seg->left_color.r, - &seg->left_color.g, - &seg->left_color.b, - &seg->left_color.a); - gradient_get_color_at (curr_gradient, seg->right, - &seg->right_color.r, - &seg->right_color.g, - &seg->right_color.b, - &seg->right_color.a); + gradient_get_color_at (curr_gradient, seg->left, &seg->left_color); + gradient_get_color_at (curr_gradient, seg->right, &seg->right_color); seg->type = lseg->type; seg->color = lseg->color; diff --git a/app/gui/gradient-editor.h b/app/gui/gradient-editor.h index b16122b89a..c3c31e627e 100644 --- a/app/gui/gradient-editor.h +++ b/app/gui/gradient-editor.h @@ -39,10 +39,7 @@ gint gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a); + GimpRGB *color); #endif /* __GRADIENT_H__ */ diff --git a/app/gui/gradient-select.c b/app/gui/gradient-select.c index e2f8ff5f60..5f0a284625 100644 --- a/app/gui/gradient-select.c +++ b/app/gui/gradient-select.c @@ -328,8 +328,10 @@ gradient_change_callbacks (GradientSelect *gsp, { gdouble *values, *pv; double pos, delta; - double r, g, b, a; - gint i = gsp->sample_size; + GimpRGB color; + gint i; + + i = gsp->sample_size; pos = 0.0; delta = 1.0 / (i - 1); @@ -338,12 +340,12 @@ gradient_change_callbacks (GradientSelect *gsp, while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } diff --git a/app/gui/palette-editor.c b/app/gui/palette-editor.c index be301bf180..ce07497772 100644 --- a/app/gui/palette-editor.c +++ b/app/gui/palette-editor.c @@ -2319,21 +2319,23 @@ static void palette_import_fill_grad_preview (GtkWidget *preview, gradient_t *gradient) { - guchar buffer[3*IMPORT_PREVIEW_WIDTH]; - gint loop; - guchar *p = buffer; + guchar buffer[3*IMPORT_PREVIEW_WIDTH]; + gint loop; + guchar *p = buffer; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; dx = 1.0/ (IMPORT_PREVIEW_WIDTH - 1); cur_x = 0; for (loop = 0 ; loop < IMPORT_PREVIEW_WIDTH; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - *p++ = r * 255.0; - *p++ = g * 255.0; - *p++ = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + *p++ = (guchar) (color.r * 255.999); + *p++ = (guchar) (color.g * 255.999); + *p++ = (guchar) (color.b * 255.999); + cur_x += dx; } @@ -2736,7 +2738,8 @@ palette_import_create_from_grad (gchar *name) { /* Add names to entry */ gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; + guchar r, g, b; gint sample_sz; gint loop; @@ -2749,13 +2752,15 @@ palette_import_create_from_grad (gchar *name) for (loop = 0; loop < sample_sz; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - r = r * 255.0; - g = g * 255.0; - b = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + gimp_rgb_get_uchar (&color, &r, &g, &b); + cur_x += dx; palette_entries_add_entry (entries, _("Untitled"), - (gint) r, (gint) g, (gint) b); + (gint) r, + (gint) g, + (gint) b); } palette_insert_all (entries); diff --git a/app/paint/gimpairbrush.c b/app/paint/gimpairbrush.c index 62f163400b..47b307737c 100644 --- a/app/paint/gimpairbrush.c +++ b/app/paint/gimpairbrush.c @@ -330,14 +330,17 @@ airbrush_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/paint/gimppencil.c b/app/paint/gimppencil.c index 4835842b50..59915c5289 100644 --- a/app/paint/gimppencil.c +++ b/app/paint/gimppencil.c @@ -172,14 +172,17 @@ pencil_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + paint_appl_mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/paint_core.c b/app/paint_core.c index 81c59503e4..d3829c3d68 100644 --- a/app/paint_core.c +++ b/app/paint_core.c @@ -1019,10 +1019,7 @@ paint_core_cleanup (void) void paint_core_get_color_from_gradient (PaintCore *paint_core, gdouble gradient_length, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a, + GimpRGB *color, GradientPaintMode mode) { gdouble y; @@ -1040,7 +1037,7 @@ paint_core_get_color_from_gradient (PaintCore *paint_core, else y = y - (int)y; - gradient_get_color_at (gimp_context_get_gradient (NULL), y, r, g, b, a); + gradient_get_color_at (gimp_context_get_gradient (NULL), y, color); } diff --git a/app/paint_core.h b/app/paint_core.h index 9621bdef3f..e7dd38e62b 100644 --- a/app/paint_core.h +++ b/app/paint_core.h @@ -155,10 +155,7 @@ void paint_core_cleanup (void); void paint_core_get_color_from_gradient (PaintCore *paint_core, gdouble gradient_length, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a, + GimpRGB *color, GradientPaintMode mode); /* paint tool painting functions */ diff --git a/app/paintbrush.c b/app/paintbrush.c index e01c9cf8fd..5d9cee29be 100644 --- a/app/paintbrush.c +++ b/app/paintbrush.c @@ -490,17 +490,17 @@ paintbrush_motion (PaintCore *paint_core, PaintApplicationMode incremental, GradientPaintMode gradient_type) { - GImage *gimage; - TempBuf * area; - gdouble x, paint_left; - gdouble position; - guchar local_blend = OPAQUE_OPACITY; - guchar temp_blend = OPAQUE_OPACITY; - guchar col[MAX_CHANNELS]; - gdouble r,g,b,a; - gint mode; - gint opacity; - gdouble scale; + GImage *gimage; + TempBuf *area; + gdouble x, paint_left; + gdouble position; + guchar local_blend = OPAQUE_OPACITY; + guchar temp_blend = OPAQUE_OPACITY; + guchar col[MAX_CHANNELS]; + GimpRGB color; + gint mode; + gint opacity; + gdouble scale; PaintApplicationMode paint_appl_mode = incremental ? INCREMENTAL : CONSTANT; position = 0.0; @@ -538,19 +538,19 @@ paintbrush_motion (PaintCore *paint_core, { if (pressure_options->color) gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); + paint_core->curpressure, &color); else paint_core_get_color_from_gradient (paint_core, gradient_length, - &r, &g, &b, &a, mode); - r = r * 255.0; - g = g * 255.0; - b = b * 255.0; - a = a * 255.0; - temp_blend = (gint)((a * local_blend) / 255); - col[0] = (gint)r; - col[1] = (gint)g; - col[2] = (gint)b; - col[3] = OPAQUE_OPACITY; + &color, mode); + + temp_blend = (gint) ((color.a * local_blend)); + + gimp_rgb_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX]); + col[ALPHA_PIX] = OPAQUE_OPACITY; + /* always use incremental mode with gradients */ /* make the gui cool later */ paint_appl_mode = INCREMENTAL; diff --git a/app/palette.c b/app/palette.c index be301bf180..ce07497772 100644 --- a/app/palette.c +++ b/app/palette.c @@ -2319,21 +2319,23 @@ static void palette_import_fill_grad_preview (GtkWidget *preview, gradient_t *gradient) { - guchar buffer[3*IMPORT_PREVIEW_WIDTH]; - gint loop; - guchar *p = buffer; + guchar buffer[3*IMPORT_PREVIEW_WIDTH]; + gint loop; + guchar *p = buffer; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; dx = 1.0/ (IMPORT_PREVIEW_WIDTH - 1); cur_x = 0; for (loop = 0 ; loop < IMPORT_PREVIEW_WIDTH; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - *p++ = r * 255.0; - *p++ = g * 255.0; - *p++ = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + *p++ = (guchar) (color.r * 255.999); + *p++ = (guchar) (color.g * 255.999); + *p++ = (guchar) (color.b * 255.999); + cur_x += dx; } @@ -2736,7 +2738,8 @@ palette_import_create_from_grad (gchar *name) { /* Add names to entry */ gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; + guchar r, g, b; gint sample_sz; gint loop; @@ -2749,13 +2752,15 @@ palette_import_create_from_grad (gchar *name) for (loop = 0; loop < sample_sz; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - r = r * 255.0; - g = g * 255.0; - b = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + gimp_rgb_get_uchar (&color, &r, &g, &b); + cur_x += dx; palette_entries_add_entry (entries, _("Untitled"), - (gint) r, (gint) g, (gint) b); + (gint) r, + (gint) g, + (gint) b); } palette_insert_all (entries); diff --git a/app/pencil.c b/app/pencil.c index 4835842b50..59915c5289 100644 --- a/app/pencil.c +++ b/app/pencil.c @@ -172,14 +172,17 @@ pencil_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + paint_appl_mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/tools/airbrush.c b/app/tools/airbrush.c index 62f163400b..47b307737c 100644 --- a/app/tools/airbrush.c +++ b/app/tools/airbrush.c @@ -330,14 +330,17 @@ airbrush_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/tools/blend.c b/app/tools/blend.c index e21ded4f5e..982df28bfd 100644 --- a/app/tools/blend.c +++ b/app/tools/blend.c @@ -1383,8 +1383,9 @@ gradient_render_pixel (double x, /* Blend the colors */ if (rbd->blend_mode == CUSTOM_MODE) - gradient_get_color_at (gimp_context_get_gradient (NULL), - factor, &color->r, &color->g, &color->b, &color->a); + { + gradient_get_color_at (gimp_context_get_gradient (NULL), factor, color); + } else { /* Blend values */ diff --git a/app/tools/gimpairbrushtool.c b/app/tools/gimpairbrushtool.c index 62f163400b..47b307737c 100644 --- a/app/tools/gimpairbrushtool.c +++ b/app/tools/gimpairbrushtool.c @@ -330,14 +330,17 @@ airbrush_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c index e21ded4f5e..982df28bfd 100644 --- a/app/tools/gimpblendtool.c +++ b/app/tools/gimpblendtool.c @@ -1383,8 +1383,9 @@ gradient_render_pixel (double x, /* Blend the colors */ if (rbd->blend_mode == CUSTOM_MODE) - gradient_get_color_at (gimp_context_get_gradient (NULL), - factor, &color->r, &color->g, &color->b, &color->a); + { + gradient_get_color_at (gimp_context_get_gradient (NULL), factor, color); + } else { /* Blend values */ diff --git a/app/tools/gimppenciltool.c b/app/tools/gimppenciltool.c index 4835842b50..59915c5289 100644 --- a/app/tools/gimppenciltool.c +++ b/app/tools/gimppenciltool.c @@ -172,14 +172,17 @@ pencil_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + paint_appl_mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/tools/paint_core.c b/app/tools/paint_core.c index 81c59503e4..d3829c3d68 100644 --- a/app/tools/paint_core.c +++ b/app/tools/paint_core.c @@ -1019,10 +1019,7 @@ paint_core_cleanup (void) void paint_core_get_color_from_gradient (PaintCore *paint_core, gdouble gradient_length, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a, + GimpRGB *color, GradientPaintMode mode) { gdouble y; @@ -1040,7 +1037,7 @@ paint_core_get_color_from_gradient (PaintCore *paint_core, else y = y - (int)y; - gradient_get_color_at (gimp_context_get_gradient (NULL), y, r, g, b, a); + gradient_get_color_at (gimp_context_get_gradient (NULL), y, color); } diff --git a/app/tools/paint_core.h b/app/tools/paint_core.h index 9621bdef3f..e7dd38e62b 100644 --- a/app/tools/paint_core.h +++ b/app/tools/paint_core.h @@ -155,10 +155,7 @@ void paint_core_cleanup (void); void paint_core_get_color_from_gradient (PaintCore *paint_core, gdouble gradient_length, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a, + GimpRGB *color, GradientPaintMode mode); /* paint tool painting functions */ diff --git a/app/tools/paintbrush.c b/app/tools/paintbrush.c index e01c9cf8fd..5d9cee29be 100644 --- a/app/tools/paintbrush.c +++ b/app/tools/paintbrush.c @@ -490,17 +490,17 @@ paintbrush_motion (PaintCore *paint_core, PaintApplicationMode incremental, GradientPaintMode gradient_type) { - GImage *gimage; - TempBuf * area; - gdouble x, paint_left; - gdouble position; - guchar local_blend = OPAQUE_OPACITY; - guchar temp_blend = OPAQUE_OPACITY; - guchar col[MAX_CHANNELS]; - gdouble r,g,b,a; - gint mode; - gint opacity; - gdouble scale; + GImage *gimage; + TempBuf *area; + gdouble x, paint_left; + gdouble position; + guchar local_blend = OPAQUE_OPACITY; + guchar temp_blend = OPAQUE_OPACITY; + guchar col[MAX_CHANNELS]; + GimpRGB color; + gint mode; + gint opacity; + gdouble scale; PaintApplicationMode paint_appl_mode = incremental ? INCREMENTAL : CONSTANT; position = 0.0; @@ -538,19 +538,19 @@ paintbrush_motion (PaintCore *paint_core, { if (pressure_options->color) gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); + paint_core->curpressure, &color); else paint_core_get_color_from_gradient (paint_core, gradient_length, - &r, &g, &b, &a, mode); - r = r * 255.0; - g = g * 255.0; - b = b * 255.0; - a = a * 255.0; - temp_blend = (gint)((a * local_blend) / 255); - col[0] = (gint)r; - col[1] = (gint)g; - col[2] = (gint)b; - col[3] = OPAQUE_OPACITY; + &color, mode); + + temp_blend = (gint) ((color.a * local_blend)); + + gimp_rgb_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX]); + col[ALPHA_PIX] = OPAQUE_OPACITY; + /* always use incremental mode with gradients */ /* make the gui cool later */ paint_appl_mode = INCREMENTAL; diff --git a/app/tools/pencil.c b/app/tools/pencil.c index 4835842b50..59915c5289 100644 --- a/app/tools/pencil.c +++ b/app/tools/pencil.c @@ -172,14 +172,17 @@ pencil_motion (PaintCore *paint_core, /* color the pixels */ if (pressure_options->color) { - gdouble r, g, b, a; + GimpRGB color; gradient_get_color_at (gimp_context_get_gradient (NULL), - paint_core->curpressure, &r, &g, &b, &a); - col[0] = r * 255.0; - col[1] = g * 255.0; - col[2] = b * 255.0; - col[3] = a * 255.0; + paint_core->curpressure, &color); + + gimp_rgba_get_uchar (&color, + &col[RED_PIX], + &col[GREEN_PIX], + &col[BLUE_PIX], + &col[ALPHA_PIX]); + paint_appl_mode = INCREMENTAL; color_pixels (temp_buf_data (area), col, area->width * area->height, area->bytes); diff --git a/app/widgets/gimpgradienteditor.c b/app/widgets/gimpgradienteditor.c index 693c71922a..ce8f5fc908 100644 --- a/app/widgets/gimpgradienteditor.c +++ b/app/widgets/gimpgradienteditor.c @@ -711,10 +711,7 @@ gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a) + GimpRGB *color) { gdouble factor = 0.0; grad_segment_t *seg; @@ -722,10 +719,12 @@ gradient_get_color_at (gradient_t *gradient, gdouble middle; GimpRGB rgb; + g_return_if_fail (color != NULL); + /* if there is no gradient return a totally transparent black */ if (gradient == NULL) { - r = 0; g = 0; b = 0; a = 0; + gimp_rgba_set (color, 0.0, 0.0, 0.0, 0.0); return; } @@ -780,13 +779,18 @@ gradient_get_color_at (gradient_t *gradient, /* Calculate color components */ - *a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; + rgb.a = seg->left_color.a + (seg->right_color.a - seg->left_color.a) * factor; if (seg->color == GRAD_RGB) { - *r = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; - *g = seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; - *b = seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; + rgb.r + = seg->left_color.r + (seg->right_color.r - seg->left_color.r) * factor; + + rgb.g = + seg->left_color.g + (seg->right_color.g - seg->left_color.g) * factor; + + rgb.b = + seg->left_color.b + (seg->right_color.b - seg->left_color.b) * factor; } else { @@ -837,11 +841,9 @@ gradient_get_color_at (gradient_t *gradient, } gimp_hsv_to_rgb (&left_hsv, &rgb); - - *r = rgb.r; - *g = rgb.g; - *b = rgb.b; } + + *color = rgb; } /***** The main gradient editor dialog *****/ @@ -1361,7 +1363,7 @@ gradient_clist_fill_preview (gradient_t *gradient, guchar *even, *odd; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -1373,7 +1375,7 @@ gradient_clist_fill_preview (gradient_t *gradient, for (x = 0; x < width; x++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE_SM) & 1) { @@ -1386,13 +1388,13 @@ gradient_clist_fill_preview (gradient_t *gradient, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -2298,25 +2300,28 @@ static void preview_set_hint (gint x) { gdouble xpos; - gdouble r, g, b, a; - gdouble h, s, v; + GimpRGB rgb; + GimpHSV hsv; gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, xpos, &rgb); - h = r; - s = g; - v = b; - - gimp_rgb_to_hsv_double (&h, &s, &v); + gimp_rgb_to_hsv (&rgb, &hsv); str = g_strdup_printf (_("Position: %0.6f " "RGB (%0.3f, %0.3f, %0.3f) " "HSV (%0.3f, %0.3f, %0.3f) " "Opacity: %0.3f"), - xpos, r, g, b, h * 360.0, s, v, a); + xpos, + rgb.r, + rgb.g, + rgb.b, + hsv.h * 360.0, + hsv.s, + hsv.v, + rgb.a); ed_set_hint (str); g_free (str); @@ -2332,8 +2337,7 @@ preview_set_foreground (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_foreground (gimp_context_get_user (), &color); @@ -2356,8 +2360,7 @@ preview_set_background (gint x) gchar *str; xpos = control_calc_g_pos (x); - gradient_get_color_at (curr_gradient, xpos, - &color.r, &color.g, &color.b, &color.a); + gradient_get_color_at (curr_gradient, xpos, &color); gimp_context_set_background (gimp_context_get_user (), &color); @@ -2464,7 +2467,7 @@ preview_fill_image (gint width, guchar *p0, *p1; gint x, y; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; gdouble c0, c1; dx = (right - left) / (width - 1); @@ -2475,7 +2478,7 @@ preview_fill_image (gint width, /* Create lines to fill the image */ for (x = 0; x < width; x++) { - gradient_get_color_at (curr_gradient, cur_x, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, cur_x, &color); if ((x / GIMP_CHECK_SIZE) & 1) { @@ -2488,13 +2491,13 @@ preview_fill_image (gint width, c1 = GIMP_CHECK_LIGHT; } - *p0++ = (c0 + (r - c0) * a) * 255.0; - *p0++ = (c0 + (g - c0) * a) * 255.0; - *p0++ = (c0 + (b - c0) * a) * 255.0; + *p0++ = (c0 + (color.r - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.g - c0) * color.a) * 255.0; + *p0++ = (c0 + (color.b - c0) * color.a) * 255.0; - *p1++ = (c1 + (r - c1) * a) * 255.0; - *p1++ = (c1 + (g - c1) * a) * 255.0; - *p1++ = (c1 + (b - c1) * a) * 255.0; + *p1++ = (c1 + (color.r - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.g - c1) * color.a) * 255.0; + *p1++ = (c1 + (color.b - c1) * color.a) * 255.0; cur_x += dx; } @@ -4713,11 +4716,11 @@ cpopup_split_midpoint (grad_segment_t *lseg, grad_segment_t **newl, grad_segment_t **newr) { - double r, g, b, a; + GimpRGB color; grad_segment_t *newseg; /* Get color at original segment's midpoint */ - gradient_get_color_at (curr_gradient, lseg->middle, &r, &g, &b, &a); + gradient_get_color_at (curr_gradient, lseg->middle, &color); /* Create a new segment and insert it in the list */ @@ -4746,10 +4749,10 @@ cpopup_split_midpoint (grad_segment_t *lseg, newseg->right_color = lseg->right_color; - lseg->right_color.r = newseg->left_color.r = r; - lseg->right_color.g = newseg->left_color.g = g; - lseg->right_color.b = newseg->left_color.b = b; - lseg->right_color.a = newseg->left_color.a = a; + lseg->right_color.r = newseg->left_color.r = color.r; + lseg->right_color.g = newseg->left_color.g = color.g; + lseg->right_color.b = newseg->left_color.b = color.b; + lseg->right_color.a = newseg->left_color.a = color.a; /* Set parameters of new segment */ @@ -4904,16 +4907,8 @@ cpopup_split_uniform (grad_segment_t *lseg, seg->right = lseg->left + (i + 1) * seg_len; seg->middle = (seg->left + seg->right) / 2.0; - gradient_get_color_at (curr_gradient, seg->left, - &seg->left_color.r, - &seg->left_color.g, - &seg->left_color.b, - &seg->left_color.a); - gradient_get_color_at (curr_gradient, seg->right, - &seg->right_color.r, - &seg->right_color.g, - &seg->right_color.b, - &seg->right_color.a); + gradient_get_color_at (curr_gradient, seg->left, &seg->left_color); + gradient_get_color_at (curr_gradient, seg->right, &seg->right_color); seg->type = lseg->type; seg->color = lseg->color; diff --git a/app/widgets/gimpgradienteditor.h b/app/widgets/gimpgradienteditor.h index b16122b89a..c3c31e627e 100644 --- a/app/widgets/gimpgradienteditor.h +++ b/app/widgets/gimpgradienteditor.h @@ -39,10 +39,7 @@ gint gradient_list_get_gradient_index (GSList *list, void gradient_get_color_at (gradient_t *gradient, gdouble pos, - gdouble *r, - gdouble *g, - gdouble *b, - gdouble *a); + GimpRGB *color); #endif /* __GRADIENT_H__ */ diff --git a/app/widgets/gimppaletteeditor.c b/app/widgets/gimppaletteeditor.c index be301bf180..ce07497772 100644 --- a/app/widgets/gimppaletteeditor.c +++ b/app/widgets/gimppaletteeditor.c @@ -2319,21 +2319,23 @@ static void palette_import_fill_grad_preview (GtkWidget *preview, gradient_t *gradient) { - guchar buffer[3*IMPORT_PREVIEW_WIDTH]; - gint loop; - guchar *p = buffer; + guchar buffer[3*IMPORT_PREVIEW_WIDTH]; + gint loop; + guchar *p = buffer; gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; dx = 1.0/ (IMPORT_PREVIEW_WIDTH - 1); cur_x = 0; for (loop = 0 ; loop < IMPORT_PREVIEW_WIDTH; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - *p++ = r * 255.0; - *p++ = g * 255.0; - *p++ = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + *p++ = (guchar) (color.r * 255.999); + *p++ = (guchar) (color.g * 255.999); + *p++ = (guchar) (color.b * 255.999); + cur_x += dx; } @@ -2736,7 +2738,8 @@ palette_import_create_from_grad (gchar *name) { /* Add names to entry */ gdouble dx, cur_x; - gdouble r, g, b, a; + GimpRGB color; + guchar r, g, b; gint sample_sz; gint loop; @@ -2749,13 +2752,15 @@ palette_import_create_from_grad (gchar *name) for (loop = 0; loop < sample_sz; loop++) { - gradient_get_color_at (gradient, cur_x, &r, &g, &b, &a); - r = r * 255.0; - g = g * 255.0; - b = b * 255.0; + gradient_get_color_at (gradient, cur_x, &color); + + gimp_rgb_get_uchar (&color, &r, &g, &b); + cur_x += dx; palette_entries_add_entry (entries, _("Untitled"), - (gint) r, (gint) g, (gint) b); + (gint) r, + (gint) g, + (gint) b); } palette_insert_all (entries); diff --git a/tools/pdbgen/pdb/gradient_select.pdb b/tools/pdbgen/pdb/gradient_select.pdb index ce7b9b00b7..ce8ea430e6 100644 --- a/tools/pdbgen/pdb/gradient_select.pdb +++ b/tools/pdbgen/pdb/gradient_select.pdb @@ -210,23 +210,24 @@ HELP if (success) { gdouble *pv; - gdouble pos, delta; - gdouble r, g, b, a; - int i = sample_size; + gdouble pos, delta; + GimpRGB color; + gint i; - pos = 0.0; + i = sample_size; + pos = 0.0; delta = 1.0 / (i - 1); pv = values = g_new (gdouble, i * 4); while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } diff --git a/tools/pdbgen/pdb/gradients.pdb b/tools/pdbgen/pdb/gradients.pdb index 62eb2a86ab..ccf53b83a8 100644 --- a/tools/pdbgen/pdb/gradients.pdb +++ b/tools/pdbgen/pdb/gradients.pdb @@ -149,7 +149,7 @@ HELP &sample_outargs; %invoke = ( - vars => [ 'gradient_t *gradient', 'gdouble pos, delta', 'gdouble r, g, b, a', 'gdouble *pv' ], + vars => [ 'gradient_t *gradient', 'gdouble pos, delta', 'GimpRGB color', 'gdouble *pv' ], code => <<'CODE' { pos = 0.0; @@ -163,12 +163,12 @@ HELP while (i--) { - gradient_get_color_at (gradient, pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos += delta; } @@ -204,7 +204,7 @@ HELP &sample_outargs; %invoke = ( - vars => [ 'gradient_t *gradient', 'gdouble r, g, b, a', 'gdouble *pv' ], + vars => [ 'gradient_t *gradient', 'GimpRGB color', 'gdouble *pv' ], code => <<'CODE' { array_length = i * 4; @@ -215,12 +215,12 @@ HELP while (i--) { - gradient_get_color_at (gradient, *pos, &r, &g, &b, &a); + gradient_get_color_at (gradient, *pos, &color); - *pv++ = r; - *pv++ = g; - *pv++ = b; - *pv++ = a; + *pv++ = color.r; + *pv++ = color.g; + *pv++ = color.b; + *pv++ = color.a; pos++; }