Bug 467930 - color selectors are not color managed

Color manage the water color selector.
This commit is contained in:
Michael Natterer 2016-05-28 00:38:57 +02:00
parent 9a871f6262
commit ee0c51a43e

View file

@ -46,11 +46,16 @@ struct _ColorselWater
{ {
GimpColorSelector parent_instance; GimpColorSelector parent_instance;
GtkWidget *area;
gdouble last_x; gdouble last_x;
gdouble last_y; gdouble last_y;
gfloat pressure_adjust; gfloat pressure_adjust;
guint32 motion_time; guint32 motion_time;
GimpColorConfig *config;
GimpColorTransform *transform;
}; };
struct _ColorselWaterClass struct _ColorselWaterClass
@ -61,8 +66,19 @@ struct _ColorselWaterClass
static GType colorsel_water_get_type (void); static GType colorsel_water_get_type (void);
static void colorsel_water_dispose (GObject *object);
static void colorsel_water_set_config (GimpColorSelector *selector,
GimpColorConfig *config);
static void colorsel_water_config_notify (GimpColorConfig *config,
const GParamSpec *pspec,
ColorselWater *water);
static void colorsel_water_create_transform (ColorselWater *water);
static gboolean select_area_expose (GtkWidget *widget, static gboolean select_area_expose (GtkWidget *widget,
GdkEventExpose *event); GdkEventExpose *event,
ColorselWater *water);
static gboolean button_press_event (GtkWidget *widget, static gboolean button_press_event (GtkWidget *widget,
GdkEventButton *event, GdkEventButton *event,
ColorselWater *water); ColorselWater *water);
@ -108,11 +124,15 @@ gimp_module_register (GTypeModule *module)
static void static void
colorsel_water_class_init (ColorselWaterClass *klass) colorsel_water_class_init (ColorselWaterClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpColorSelectorClass *selector_class = GIMP_COLOR_SELECTOR_CLASS (klass); GimpColorSelectorClass *selector_class = GIMP_COLOR_SELECTOR_CLASS (klass);
object_class->dispose = colorsel_water_dispose;
selector_class->name = _("Watercolor"); selector_class->name = _("Watercolor");
selector_class->help_id = "gimp-colorselector-watercolor"; selector_class->help_id = "gimp-colorselector-watercolor";
selector_class->icon_name = GIMP_STOCK_TOOL_PAINTBRUSH; selector_class->icon_name = GIMP_STOCK_TOOL_PAINTBRUSH;
selector_class->set_config = colorsel_water_set_config;
} }
static void static void
@ -124,7 +144,6 @@ static void
colorsel_water_init (ColorselWater *water) colorsel_water_init (ColorselWater *water)
{ {
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *area;
GtkWidget *frame; GtkWidget *frame;
GtkAdjustment *adj; GtkAdjustment *adj;
GtkWidget *scale; GtkWidget *scale;
@ -140,24 +159,24 @@ colorsel_water_init (ColorselWater *water)
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
area = gtk_drawing_area_new (); water->area = gtk_drawing_area_new ();
gtk_container_add (GTK_CONTAINER (frame), area); gtk_container_add (GTK_CONTAINER (frame), water->area);
g_signal_connect (area, "expose-event", g_signal_connect (water->area, "expose-event",
G_CALLBACK (select_area_expose), G_CALLBACK (select_area_expose),
NULL); water);
/* Event signals */ /* Event signals */
g_signal_connect (area, "motion-notify-event", g_signal_connect (water->area, "motion-notify-event",
G_CALLBACK (motion_notify_event), G_CALLBACK (motion_notify_event),
water); water);
g_signal_connect (area, "button-press-event", g_signal_connect (water->area, "button-press-event",
G_CALLBACK (button_press_event), G_CALLBACK (button_press_event),
water); water);
g_signal_connect (area, "proximity-out-event", g_signal_connect (water->area, "proximity-out-event",
G_CALLBACK (proximity_out_event), G_CALLBACK (proximity_out_event),
water); water);
gtk_widget_add_events (area, gtk_widget_add_events (water->area,
GDK_LEAVE_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_PRESS_MASK |
GDK_KEY_PRESS_MASK | GDK_KEY_PRESS_MASK |
@ -168,8 +187,8 @@ colorsel_water_init (ColorselWater *water)
/* The following call enables tracking and processing of extension /* The following call enables tracking and processing of extension
* events for the drawing area * events for the drawing area
*/ */
gtk_widget_set_extension_events (area, GDK_EXTENSION_EVENTS_ALL); gtk_widget_set_extension_events (water->area, GDK_EXTENSION_EVENTS_ALL);
gtk_widget_grab_focus (area); gtk_widget_grab_focus (water->area);
adj = GTK_ADJUSTMENT (gtk_adjustment_new (200.0 - water->pressure_adjust * 100.0, adj = GTK_ADJUSTMENT (gtk_adjustment_new (200.0 - water->pressure_adjust * 100.0,
0.0, 200.0, 1.0, 1.0, 0.0)); 0.0, 200.0, 1.0, 1.0, 0.0));
@ -197,9 +216,84 @@ calc (gdouble x,
return 128 + (x - 0.5) * c - (y - 0.5) * s; return 128 + (x - 0.5) * c - (y - 0.5) * s;
} }
static void
colorsel_water_dispose (GObject *object)
{
colorsel_water_set_config (GIMP_COLOR_SELECTOR (object), NULL);
G_OBJECT_CLASS (colorsel_water_parent_class)->dispose (object);
}
static void
colorsel_water_set_config (GimpColorSelector *selector,
GimpColorConfig *config)
{
ColorselWater *water = COLORSEL_WATER (selector);
if (water->config)
{
g_signal_handlers_disconnect_by_func (water->config,
colorsel_water_config_notify,
water);
g_object_unref (water->config);
if (water->transform)
{
g_object_unref (water->transform);
water->transform = NULL;
}
}
water->config = config;
if (water->config)
{
g_object_ref (water->config);
g_signal_connect (water->config, "notify",
G_CALLBACK (colorsel_water_config_notify),
water);
}
}
static void
colorsel_water_config_notify (GimpColorConfig *config,
const GParamSpec *pspec,
ColorselWater *water)
{
if (water->transform)
{
g_object_unref (water->transform);
water->transform = NULL;
}
gtk_widget_queue_draw (GTK_WIDGET (water->area));
}
static void
colorsel_water_create_transform (ColorselWater *water)
{
if (water->config)
{
static GimpColorProfile *profile = NULL;
const Babl *format = babl_format ("cairo-RGB24");
if (G_UNLIKELY (! profile))
profile = gimp_color_profile_new_rgb_srgb ();
water->transform = gimp_widget_get_color_transform (water->area,
water->config,
profile,
format,
format);
}
}
static gboolean static gboolean
select_area_expose (GtkWidget *widget, select_area_expose (GtkWidget *widget,
GdkEventExpose *event) GdkEventExpose *event,
ColorselWater *water)
{ {
cairo_t *cr; cairo_t *cr;
GtkAllocation allocation; GtkAllocation allocation;
@ -226,6 +320,9 @@ select_area_expose (GtkWidget *widget,
dest = cairo_image_surface_get_data (surface); dest = cairo_image_surface_get_data (surface);
if (! water->transform)
colorsel_water_create_transform (water);
for (j = 0, y = event->area.y / allocation.height; for (j = 0, y = event->area.y / allocation.height;
j < event->area.height; j < event->area.height;
j++, y += dy) j++, y += dy)
@ -260,6 +357,14 @@ select_area_expose (GtkWidget *widget,
d += 4; d += 4;
} }
if (water->transform)
gimp_color_transform_process_pixels (water->transform,
babl_format ("cairo-RGB24"),
dest,
babl_format ("cairo-RGB24"),
dest,
event->area.width);
dest += cairo_image_surface_get_stride (surface); dest += cairo_image_surface_get_stride (surface);
} }