widgets,modules,plug-ins: GeglColor ports

After the color space invasion, the
Clip Warning filter no longer had color
areas for its shadow, highlights, and
bogus color properties. This patch ports
them to GeglColor so the widget can be
created correctly.
GimpRGB structs are also converted to
GeglColor in GimpPanedBox and two
plug-ins.
This commit is contained in:
Alx Sa 2024-03-20 02:53:41 +00:00
parent 0bc99a29e1
commit ef548fff65
4 changed files with 146 additions and 86 deletions

View file

@ -362,10 +362,12 @@ gimp_paned_box_drop_indicator_draw (GtkWidget *widget,
gpointer data) gpointer data)
{ {
GimpPanedBox *paned_box = GIMP_PANED_BOX (widget); GimpPanedBox *paned_box = GIMP_PANED_BOX (widget);
GimpRGB color; GeglColor *color;
gdouble rgba[4];
gsize i; gsize i;
gimp_rgb_parse_hex (&color, DROP_HIGHLIGHT_COLOR, -1); color = gimp_color_parse_hex (DROP_HIGHLIGHT_COLOR, -1);
gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), rgba);
for (i = 0; i < G_N_ELEMENTS (paned_box->p->dnd_highlights); i++) for (i = 0; i < G_N_ELEMENTS (paned_box->p->dnd_highlights); i++)
{ {
@ -374,7 +376,10 @@ gimp_paned_box_drop_indicator_draw (GtkWidget *widget,
if (! highlight->active) if (! highlight->active)
continue; continue;
cairo_set_source_rgba (cr, color.r, color.g, color.b, highlight->opacity); rgba[3] = highlight->opacity;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), rgba);
gimp_cairo_set_source_color (cr, color, NULL, FALSE, widget);
cairo_rectangle (cr, cairo_rectangle (cr,
highlight->area.x, highlight->area.x,
@ -384,6 +389,7 @@ gimp_paned_box_drop_indicator_draw (GtkWidget *widget,
cairo_fill (cr); cairo_fill (cr);
} }
g_object_unref (color);
return FALSE; return FALSE;
} }

View file

@ -33,9 +33,9 @@
#include "libgimp/libgimp-intl.h" #include "libgimp/libgimp-intl.h"
#define DEFAULT_SHADOWS_COLOR (&(GimpRGB) {0.25, 0.25, 1.00, 1.00}) #define DEFAULT_SHADOWS_COLOR ((gdouble[]) {0.25, 0.25, 1.00, 1.00})
#define DEFAULT_HIGHLIGHTS_COLOR (&(GimpRGB) {1.00, 0.25, 0.25, 1.00}) #define DEFAULT_HIGHLIGHTS_COLOR ((gdouble[]) {1.00, 0.25, 0.25, 1.00})
#define DEFAULT_BOGUS_COLOR (&(GimpRGB) {1.00, 1.00, 0.25, 1.00}) #define DEFAULT_BOGUS_COLOR ((gdouble[]) {1.00, 1.00, 0.25, 1.00})
#define CDISPLAY_TYPE_CLIP_WARNING (cdisplay_clip_warning_get_type ()) #define CDISPLAY_TYPE_CLIP_WARNING (cdisplay_clip_warning_get_type ())
@ -61,11 +61,11 @@ struct _CdisplayClipWarning
GimpColorDisplay parent_instance; GimpColorDisplay parent_instance;
gboolean show_shadows; gboolean show_shadows;
GimpRGB shadows_color; GeglColor *shadows_color;
gboolean show_highlights; gboolean show_highlights;
GimpRGB highlights_color; GeglColor *highlights_color;
gboolean show_bogus; gboolean show_bogus;
GimpRGB bogus_color; GeglColor *bogus_color;
gboolean include_alpha; gboolean include_alpha;
gboolean include_transparent; gboolean include_transparent;
@ -94,6 +94,7 @@ enum
GType cdisplay_clip_warning_get_type (void); GType cdisplay_clip_warning_get_type (void);
static void cdisplay_clip_warning_finalize (GObject *object);
static void cdisplay_clip_warning_set_property (GObject *object, static void cdisplay_clip_warning_set_property (GObject *object,
guint property_id, guint property_id,
const GValue *value, const GValue *value,
@ -152,10 +153,14 @@ cdisplay_clip_warning_class_init (CdisplayClipWarningClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpColorDisplayClass *display_class = GIMP_COLOR_DISPLAY_CLASS (klass); GimpColorDisplayClass *display_class = GIMP_COLOR_DISPLAY_CLASS (klass);
GeglColor *color = gegl_color_new (NULL);
object_class->get_property = cdisplay_clip_warning_get_property; object_class->finalize = cdisplay_clip_warning_finalize;
object_class->set_property = cdisplay_clip_warning_set_property; object_class->get_property = cdisplay_clip_warning_get_property;
object_class->set_property = cdisplay_clip_warning_set_property;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
DEFAULT_SHADOWS_COLOR);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SHOW_SHADOWS, GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SHOW_SHADOWS,
"show-shadows", "show-shadows",
_("Show shadows"), _("Show shadows"),
@ -163,14 +168,13 @@ cdisplay_clip_warning_class_init (CdisplayClipWarningClass *klass)
TRUE, TRUE,
GIMP_PARAM_STATIC_STRINGS); GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_RGB (object_class, PROP_SHADOWS_COLOR, GIMP_CONFIG_PROP_COLOR (object_class, PROP_SHADOWS_COLOR,
"shadows-color", "shadows-color",
_("Shadows color"), _("Shadows color"),
_("Shadows warning color"), _("Shadows warning color"),
FALSE, color,
DEFAULT_SHADOWS_COLOR, GIMP_PARAM_STATIC_STRINGS |
GIMP_PARAM_STATIC_STRINGS | GIMP_CONFIG_PARAM_DEFAULTS);
GIMP_CONFIG_PARAM_DEFAULTS);
gegl_param_spec_set_property_key ( gegl_param_spec_set_property_key (
g_object_class_find_property (G_OBJECT_CLASS (klass), "shadows-color"), g_object_class_find_property (G_OBJECT_CLASS (klass), "shadows-color"),
@ -183,14 +187,15 @@ cdisplay_clip_warning_class_init (CdisplayClipWarningClass *klass)
TRUE, TRUE,
GIMP_PARAM_STATIC_STRINGS); GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_RGB (object_class, PROP_HIGHLIGHTS_COLOR, gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
"highlights-color", DEFAULT_HIGHLIGHTS_COLOR);
_("Highlights color"), GIMP_CONFIG_PROP_COLOR (object_class, PROP_HIGHLIGHTS_COLOR,
_("Highlights warning color"), "highlights-color",
FALSE, _("Highlights color"),
DEFAULT_HIGHLIGHTS_COLOR, _("Highlights warning color"),
GIMP_PARAM_STATIC_STRINGS | color,
GIMP_CONFIG_PARAM_DEFAULTS); GIMP_PARAM_STATIC_STRINGS |
GIMP_CONFIG_PARAM_DEFAULTS);
gegl_param_spec_set_property_key ( gegl_param_spec_set_property_key (
g_object_class_find_property (G_OBJECT_CLASS (klass), "highlights-color"), g_object_class_find_property (G_OBJECT_CLASS (klass), "highlights-color"),
@ -203,14 +208,15 @@ cdisplay_clip_warning_class_init (CdisplayClipWarningClass *klass)
TRUE, TRUE,
GIMP_PARAM_STATIC_STRINGS); GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_RGB (object_class, PROP_BOGUS_COLOR, gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
"bogus-color", DEFAULT_BOGUS_COLOR);
_("Bogus color"), GIMP_CONFIG_PROP_COLOR (object_class, PROP_BOGUS_COLOR,
_("Bogus warning color"), "bogus-color",
FALSE, _("Bogus color"),
DEFAULT_BOGUS_COLOR, _("Bogus warning color"),
GIMP_PARAM_STATIC_STRINGS | color,
GIMP_CONFIG_PARAM_DEFAULTS); GIMP_PARAM_STATIC_STRINGS |
GIMP_CONFIG_PARAM_DEFAULTS);
gegl_param_spec_set_property_key ( gegl_param_spec_set_property_key (
g_object_class_find_property (G_OBJECT_CLASS (klass), "bogus-color"), g_object_class_find_property (G_OBJECT_CLASS (klass), "bogus-color"),
@ -235,6 +241,8 @@ cdisplay_clip_warning_class_init (CdisplayClipWarningClass *klass)
display_class->icon_name = GIMP_ICON_DISPLAY_FILTER_CLIP_WARNING; display_class->icon_name = GIMP_ICON_DISPLAY_FILTER_CLIP_WARNING;
display_class->convert_buffer = cdisplay_clip_warning_convert_buffer; display_class->convert_buffer = cdisplay_clip_warning_convert_buffer;
g_object_unref (color);
} }
static void static void
@ -245,6 +253,32 @@ cdisplay_clip_warning_class_finalize (CdisplayClipWarningClass *klass)
static void static void
cdisplay_clip_warning_init (CdisplayClipWarning *clip_warning) cdisplay_clip_warning_init (CdisplayClipWarning *clip_warning)
{ {
GeglColor *color;
color = gegl_color_new (NULL);
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
DEFAULT_SHADOWS_COLOR);
clip_warning->shadows_color = color;
color = gegl_color_new (NULL);
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
DEFAULT_HIGHLIGHTS_COLOR);
clip_warning->highlights_color = color;
color = gegl_color_new (NULL);
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"),
DEFAULT_BOGUS_COLOR);
clip_warning->bogus_color = color;
}
static void
cdisplay_clip_warning_finalize (GObject *object)
{
CdisplayClipWarning *clip_warning = CDISPLAY_CLIP_WARNING (object);
g_clear_object (&clip_warning->shadows_color);
g_clear_object (&clip_warning->highlights_color);
g_clear_object (&clip_warning->bogus_color);
} }
static void static void
@ -261,21 +295,21 @@ cdisplay_clip_warning_get_property (GObject *object,
g_value_set_boolean (value, clip_warning->show_shadows); g_value_set_boolean (value, clip_warning->show_shadows);
break; break;
case PROP_SHADOWS_COLOR: case PROP_SHADOWS_COLOR:
g_value_set_boxed (value, &clip_warning->shadows_color); g_value_set_object (value, clip_warning->shadows_color);
break; break;
case PROP_SHOW_HIGHLIGHTS: case PROP_SHOW_HIGHLIGHTS:
g_value_set_boolean (value, clip_warning->show_highlights); g_value_set_boolean (value, clip_warning->show_highlights);
break; break;
case PROP_HIGHLIGHTS_COLOR: case PROP_HIGHLIGHTS_COLOR:
g_value_set_boxed (value, &clip_warning->highlights_color); g_value_set_object (value, clip_warning->highlights_color);
break; break;
case PROP_SHOW_BOGUS: case PROP_SHOW_BOGUS:
g_value_set_boolean (value, clip_warning->show_bogus); g_value_set_boolean (value, clip_warning->show_bogus);
break; break;
case PROP_BOGUS_COLOR: case PROP_BOGUS_COLOR:
g_value_set_boxed (value, &clip_warning->bogus_color); g_value_set_object (value, clip_warning->bogus_color);
break; break;
case PROP_INCLUDE_ALPHA: case PROP_INCLUDE_ALPHA:
@ -314,21 +348,24 @@ cdisplay_clip_warning_set_property (GObject *object,
SET_MEMBER_VAL (show_shadows, gboolean, g_value_get_boolean (value)); SET_MEMBER_VAL (show_shadows, gboolean, g_value_get_boolean (value));
break; break;
case PROP_SHADOWS_COLOR: case PROP_SHADOWS_COLOR:
SET_MEMBER_PTR (shadows_color, g_value_get_boxed (value)); g_clear_object (&clip_warning->shadows_color);
clip_warning->shadows_color = gegl_color_duplicate (g_value_get_object (value));
break; break;
case PROP_SHOW_HIGHLIGHTS: case PROP_SHOW_HIGHLIGHTS:
SET_MEMBER_VAL (show_highlights, gboolean, g_value_get_boolean (value)); SET_MEMBER_VAL (show_highlights, gboolean, g_value_get_boolean (value));
break; break;
case PROP_HIGHLIGHTS_COLOR: case PROP_HIGHLIGHTS_COLOR:
SET_MEMBER_PTR (highlights_color, g_value_get_boxed (value)); g_clear_object (&clip_warning->highlights_color);
clip_warning->highlights_color = gegl_color_duplicate (g_value_get_object (value));
break; break;
case PROP_SHOW_BOGUS: case PROP_SHOW_BOGUS:
SET_MEMBER_VAL (show_bogus, gboolean, g_value_get_boolean (value)); SET_MEMBER_VAL (show_bogus, gboolean, g_value_get_boolean (value));
break; break;
case PROP_BOGUS_COLOR: case PROP_BOGUS_COLOR:
SET_MEMBER_PTR (bogus_color, g_value_get_boxed (value)); g_clear_object (&clip_warning->bogus_color);
clip_warning->bogus_color = gegl_color_duplicate (g_value_get_object (value));
break; break;
case PROP_INCLUDE_ALPHA: case PROP_INCLUDE_ALPHA:
@ -343,6 +380,15 @@ cdisplay_clip_warning_set_property (GObject *object,
break; break;
} }
if (property_id == PROP_SHADOWS_COLOR ||
property_id == PROP_HIGHLIGHTS_COLOR ||
property_id == PROP_BOGUS_COLOR)
{
cdisplay_clip_warning_update_colors (clip_warning);
g_object_notify (G_OBJECT (clip_warning), pspec->name);
gimp_color_display_changed (GIMP_COLOR_DISPLAY (clip_warning));
}
#undef SET_MEMBER_PTR #undef SET_MEMBER_PTR
#undef SET_MEMBER_VAL #undef SET_MEMBER_VAL
} }
@ -449,32 +495,42 @@ cdisplay_clip_warning_update_colors (CdisplayClipWarning *clip_warning)
gfloat *alt_color = clip_warning->colors[i][1]; gfloat *alt_color = clip_warning->colors[i][1];
gfloat alt_value; gfloat alt_value;
gint n = 0; gint n = 0;
gfloat rgb[3];
memset (color, 0, 3 * sizeof (gfloat)); memset (color, 0, 3 * sizeof (gfloat));
if (i & WARNING_SHADOW) if (i & WARNING_SHADOW)
{ {
color[0] += clip_warning->shadows_color.r; gegl_color_get_pixel (clip_warning->shadows_color,
color[1] += clip_warning->shadows_color.g; babl_format ("R'G'B' float"),
color[2] += clip_warning->shadows_color.b; rgb);
color[0] += rgb[0];
color[1] += rgb[1];
color[2] += rgb[2];
n++; n++;
} }
if (i & WARNING_HIGHLIGHT) if (i & WARNING_HIGHLIGHT)
{ {
color[0] += clip_warning->highlights_color.r; gegl_color_get_pixel (clip_warning->highlights_color,
color[1] += clip_warning->highlights_color.g; babl_format ("R'G'B' float"),
color[2] += clip_warning->highlights_color.b; rgb);
color[0] += rgb[0];
color[1] += rgb[1];
color[2] += rgb[2];
n++; n++;
} }
if (i & WARNING_BOGUS) if (i & WARNING_BOGUS)
{ {
color[0] += clip_warning->bogus_color.r; gegl_color_get_pixel (clip_warning->bogus_color,
color[1] += clip_warning->bogus_color.g; babl_format ("R'G'B' float"),
color[2] += clip_warning->bogus_color.b; rgb);
color[0] += rgb[0];
color[1] += rgb[1];
color[2] += rgb[2];
n++; n++;
} }

View file

@ -232,7 +232,7 @@ static cairo_surface_t *get_cairo_surface (GimpDrawable *drawable
gboolean as_mask, gboolean as_mask,
GError **error); GError **error);
static GimpRGB get_layer_color (GimpLayer *layer, static GeglColor * get_layer_color (GimpLayer *layer,
gboolean *single); gboolean *single);
static void drawText (GimpLayer *layer, static void drawText (GimpLayer *layer,
@ -1463,11 +1463,11 @@ get_cairo_surface (GimpDrawable *drawable,
/* A function to check if a drawable is single colored This allows to /* A function to check if a drawable is single colored This allows to
* convert bitmaps to vector where possible * convert bitmaps to vector where possible
*/ */
static GimpRGB static GeglColor *
get_layer_color (GimpLayer *layer, get_layer_color (GimpLayer *layer,
gboolean *single) gboolean *single)
{ {
GimpRGB col; GeglColor *col = gegl_color_new (NULL);
gdouble red, green, blue, alpha; gdouble red, green, blue, alpha;
gdouble dev, devSum; gdouble dev, devSum;
gdouble median, pixels, count, percentile; gdouble median, pixels, count, percentile;
@ -1483,7 +1483,7 @@ get_layer_color (GimpLayer *layer,
{ {
/* FIXME: We can't do a proper histogram on indexed layers! */ /* FIXME: We can't do a proper histogram on indexed layers! */
*single = FALSE; *single = FALSE;
col. r = col.g = col.b = col.a = 0; gegl_color_set_rgba (col, 0.0, 0.0, 0.0, 0.0);
return col; return col;
} }
@ -1528,11 +1528,7 @@ get_layer_color (GimpLayer *layer,
devSum += dev; devSum += dev;
*single = devSum == 0; *single = devSum == 0;
col.r = red / 255; gegl_color_set_rgba (col, red, green, blue, alpha);
col.g = green / 255;
col.b = blue / 255;
col.a = alpha / 255;
return col; return col;
} }
@ -1891,8 +1887,8 @@ draw_layer (GimpLayer **layers,
{ {
/* For raster layers */ /* For raster layers */
GimpRGB layer_color; GeglColor *layer_color;
gboolean single_color = FALSE; gboolean single_color = FALSE;
layer_color = get_layer_color (layer, &single_color); layer_color = get_layer_color (layer, &single_color);
@ -1902,11 +1898,7 @@ draw_layer (GimpLayer **layers,
if (vectorize && single_color) if (vectorize && single_color)
{ {
cairo_set_source_rgba (cr, gimp_cairo_set_source_color (cr, layer_color, NULL, FALSE, NULL);
layer_color.r,
layer_color.g,
layer_color.b,
layer_color.a * opacity);
if (mask) if (mask)
cairo_mask_surface (cr, mask_image, x, y); cairo_mask_surface (cr, mask_image, x, y);
else else
@ -1938,6 +1930,8 @@ draw_layer (GimpLayer **layers,
cairo_surface_destroy (layer_image); cairo_surface_destroy (layer_image);
} }
g_object_unref (layer_color);
} }
else else
{ {

View file

@ -2486,15 +2486,15 @@ color1_changed (GimpColorButton *button)
if (t) if (t)
{ {
GeglColor *color; GeglColor *color;
GimpRGB rgb; gdouble rgba[4];
color = gimp_color_button_get_color (button); color = gimp_color_button_get_color (button);
gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), &rgb); gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), rgba);
t->color1.x = rgb.r; t->color1.x = rgba[0];
t->color1.y = rgb.g; t->color1.y = rgba[1];
t->color1.z = rgb.b; t->color1.z = rgba[2];
t->color1.w = rgb.a; t->color1.w = rgba[3];
restartrender (); restartrender ();
@ -2510,15 +2510,15 @@ color2_changed (GimpColorButton *button)
if (t) if (t)
{ {
GeglColor *color; GeglColor *color;
GimpRGB rgb; gdouble rgba[4];
color = gimp_color_button_get_color (button); color = gimp_color_button_get_color (button);
gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), &rgb); gegl_color_get_pixel (color, babl_format ("R'G'B'A double"), rgba);
t->color2.x = rgb.r; t->color2.x = rgba[0];
t->color2.y = rgb.g; t->color2.y = rgba[1];
t->color2.z = rgb.b; t->color2.z = rgba[2];
t->color2.w = rgb.a; t->color2.w = rgba[3];
restartrender (); restartrender ();
@ -2531,7 +2531,7 @@ drawcolor1 (GtkWidget *w)
{ {
static GtkWidget *lastw = NULL; static GtkWidget *lastw = NULL;
GeglColor *color; GeglColor *color;
GimpRGB rgb; gdouble rgba[4];
texture *t = currenttexture (); texture *t = currenttexture ();
if (w) if (w)
@ -2545,9 +2545,11 @@ drawcolor1 (GtkWidget *w)
return; return;
color = gegl_color_new (NULL); color = gegl_color_new (NULL);
gimp_rgba_set (&rgb, rgba[0] = t->color1.x;
t->color1.x, t->color1.y, t->color1.z, t->color1.w); rgba[1] = t->color1.y;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), &rgb); rgba[2] = t->color1.z;
rgba[3] = t->color1.w;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), rgba);
gimp_color_button_set_color (GIMP_COLOR_BUTTON (w), color); gimp_color_button_set_color (GIMP_COLOR_BUTTON (w), color);
g_object_unref (color); g_object_unref (color);
@ -2558,7 +2560,7 @@ drawcolor2 (GtkWidget *w)
{ {
static GtkWidget *lastw = NULL; static GtkWidget *lastw = NULL;
GeglColor *color; GeglColor *color;
GimpRGB rgb; gdouble rgba[4];
texture *t = currenttexture (); texture *t = currenttexture ();
if (w) if (w)
@ -2572,9 +2574,11 @@ drawcolor2 (GtkWidget *w)
return; return;
color = gegl_color_new (NULL); color = gegl_color_new (NULL);
gimp_rgba_set (&rgb, rgba[0] = t->color2.x;
t->color2.x, t->color2.y, t->color2.z, t->color2.w); rgba[1] = t->color2.y;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), &rgb); rgba[2] = t->color2.z;
rgba[3] = t->color2.w;
gegl_color_set_pixel (color, babl_format ("R'G'B'A double"), rgba);
gimp_color_button_set_color (GIMP_COLOR_BUTTON (w), color); gimp_color_button_set_color (GIMP_COLOR_BUTTON (w), color);
g_object_unref (color); g_object_unref (color);