[gimp] Bug 467930 - color selectors are not color managed
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 467930 - color selectors are not color managed
- Date: Thu, 26 May 2016 23:13:08 +0000 (UTC)
commit 0d8b8c2f99779833bb90ba1ee01685a814c9cb7e
Author: Michael Natterer <mitch gimp org>
Date: Fri May 27 01:12:35 2016 +0200
Bug 467930 - color selectors are not color managed
Color manage the wheel/triangle color selector.
modules/color-selector-wheel.c | 23 ++++-
modules/gimpcolorwheel.c | 195 +++++++++++++++++++++++++++++++++++-----
modules/gimpcolorwheel.h | 29 ++++---
3 files changed, 206 insertions(+), 41 deletions(-)
---
diff --git a/modules/color-selector-wheel.c b/modules/color-selector-wheel.c
index 9af8d39..00c3364 100644
--- a/modules/color-selector-wheel.c
+++ b/modules/color-selector-wheel.c
@@ -61,6 +61,8 @@ static GType colorsel_wheel_get_type (void);
static void colorsel_wheel_set_color (GimpColorSelector *selector,
const GimpRGB *rgb,
const GimpHSV *hsv);
+static void colorsel_wheel_set_config (GimpColorSelector *selector,
+ GimpColorConfig *config);
static void colorsel_wheel_changed (GimpColorWheel *hsv,
GimpColorSelector *selector);
@@ -99,10 +101,11 @@ colorsel_wheel_class_init (ColorselWheelClass *klass)
{
GimpColorSelectorClass *selector_class = GIMP_COLOR_SELECTOR_CLASS (klass);
- selector_class->name = _("Wheel");
- selector_class->help_id = "gimp-colorselector-triangle";
- selector_class->icon_name = GIMP_STOCK_COLOR_TRIANGLE;
- selector_class->set_color = colorsel_wheel_set_color;
+ selector_class->name = _("Wheel");
+ selector_class->help_id = "gimp-colorselector-triangle";
+ selector_class->icon_name = GIMP_STOCK_COLOR_TRIANGLE;
+ selector_class->set_color = colorsel_wheel_set_color;
+ selector_class->set_config = colorsel_wheel_set_config;
}
static void
@@ -121,6 +124,8 @@ colorsel_wheel_init (ColorselWheel *wheel)
gtk_widget_show (frame);
wheel->hsv = gimp_color_wheel_new ();
+ g_object_add_weak_pointer (G_OBJECT (wheel->hsv),
+ (gpointer) &wheel->hsv);
gtk_container_add (GTK_CONTAINER (frame), wheel->hsv);
gtk_widget_show (wheel->hsv);
@@ -141,6 +146,16 @@ colorsel_wheel_set_color (GimpColorSelector *selector,
}
static void
+colorsel_wheel_set_config (GimpColorSelector *selector,
+ GimpColorConfig *config)
+{
+ ColorselWheel *wheel = COLORSEL_WHEEL (selector);
+
+ if (wheel->hsv)
+ gimp_color_wheel_set_color_config (GIMP_COLOR_WHEEL (wheel->hsv), config);
+}
+
+static void
colorsel_wheel_changed (GimpColorWheel *hsv,
GimpColorSelector *selector)
{
diff --git a/modules/gimpcolorwheel.c b/modules/gimpcolorwheel.c
index af97e00..19fb233 100644
--- a/modules/gimpcolorwheel.c
+++ b/modules/gimpcolorwheel.c
@@ -35,8 +35,10 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#include <libgimpconfig/gimpconfig.h>
#include <libgimpcolor/gimpcolor.h>
#include <libgimpmath/gimpmath.h>
+#include <libgimpwidgets/gimpwidgets.h>
#include "gimpcolorwheel.h"
@@ -81,6 +83,9 @@ typedef struct
DragMode mode;
guint focus_on_ring : 1;
+
+ GimpColorConfig *config;
+ GimpColorTransform *transform;
} GimpColorWheelPrivate;
enum
@@ -90,28 +95,35 @@ enum
LAST_SIGNAL
};
-static void gimp_color_wheel_map (GtkWidget *widget);
-static void gimp_color_wheel_unmap (GtkWidget *widget);
-static void gimp_color_wheel_realize (GtkWidget *widget);
-static void gimp_color_wheel_unrealize (GtkWidget *widget);
-static void gimp_color_wheel_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-static void gimp_color_wheel_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gboolean gimp_color_wheel_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gimp_color_wheel_button_release (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gimp_color_wheel_motion (GtkWidget *widget,
- GdkEventMotion *event);
-static gboolean gimp_color_wheel_expose (GtkWidget *widget,
- GdkEventExpose *event);
-static gboolean gimp_color_wheel_grab_broken (GtkWidget *widget,
- GdkEventGrabBroken *event);
-static gboolean gimp_color_wheel_focus (GtkWidget *widget,
- GtkDirectionType direction);
-static void gimp_color_wheel_move (GimpColorWheel *wheel,
- GtkDirectionType dir);
+static void gimp_color_wheel_dispose (GObject *object);
+
+static void gimp_color_wheel_map (GtkWidget *widget);
+static void gimp_color_wheel_unmap (GtkWidget *widget);
+static void gimp_color_wheel_realize (GtkWidget *widget);
+static void gimp_color_wheel_unrealize (GtkWidget *widget);
+static void gimp_color_wheel_size_request (GtkWidget *widget,
+ GtkRequisition *requisition);
+static void gimp_color_wheel_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+static gboolean gimp_color_wheel_button_press (GtkWidget *widget,
+ GdkEventButton *event);
+static gboolean gimp_color_wheel_button_release (GtkWidget *widget,
+ GdkEventButton *event);
+static gboolean gimp_color_wheel_motion (GtkWidget *widget,
+ GdkEventMotion *event);
+static gboolean gimp_color_wheel_expose (GtkWidget *widget,
+ GdkEventExpose *event);
+static gboolean gimp_color_wheel_grab_broken (GtkWidget *widget,
+ GdkEventGrabBroken *event);
+static gboolean gimp_color_wheel_focus (GtkWidget *widget,
+ GtkDirectionType direction);
+static void gimp_color_wheel_move (GimpColorWheel *wheel,
+ GtkDirectionType dir);
+
+static void gimp_color_wheel_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorWheel *wheel);
+static void gimp_color_wheel_create_transform (GimpColorWheel *wheel);
static guint wheel_signals[LAST_SIGNAL];
@@ -135,6 +147,8 @@ gimp_color_wheel_class_init (GimpColorWheelClass *class)
GimpColorWheelClass *wheel_class = GIMP_COLOR_WHEEL_CLASS (class);
GtkBindingSet *binding_set;
+ object_class->dispose = gimp_color_wheel_dispose;
+
widget_class->map = gimp_color_wheel_map;
widget_class->unmap = gimp_color_wheel_unmap;
widget_class->realize = gimp_color_wheel_realize;
@@ -227,6 +241,16 @@ gimp_color_wheel_init (GimpColorWheel *wheel)
}
static void
+gimp_color_wheel_dispose (GObject *object)
+{
+ GimpColorWheel *wheel = GIMP_COLOR_WHEEL (object);
+
+ gimp_color_wheel_set_color_config (wheel, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
gimp_color_wheel_map (GtkWidget *widget)
{
GimpColorWheel *wheel = GIMP_COLOR_WHEEL (widget);
@@ -862,7 +886,24 @@ paint_ring (GimpColorWheel *wheel,
}
}
- source = cairo_image_surface_create_for_data ((unsigned char *)buf,
+ if (priv->transform)
+ {
+ const Babl *format = babl_format ("cairo-RGB24");
+ guchar *b = (guchar *) buf;
+ gint i;
+
+ for (i = 0; i < height; i++)
+ {
+ gimp_color_transform_process_pixels (priv->transform,
+ format, b,
+ format, b,
+ width);
+
+ b += stride;
+ }
+ }
+
+ source = cairo_image_surface_create_for_data ((guchar *) buf,
CAIRO_FORMAT_RGB24,
width, height, stride);
@@ -1073,7 +1114,24 @@ paint_triangle (GimpColorWheel *wheel,
}
}
- source = cairo_image_surface_create_for_data ((unsigned char *)buf,
+ if (priv->transform)
+ {
+ const Babl *format = babl_format ("cairo-RGB24");
+ guchar *b = (guchar *) buf;
+ gint i;
+
+ for (i = 0; i < height; i++)
+ {
+ gimp_color_transform_process_pixels (priv->transform,
+ format, b,
+ format, b,
+ width);
+
+ b += stride;
+ }
+ }
+
+ source = cairo_image_surface_create_for_data ((guchar *) buf,
CAIRO_FORMAT_RGB24,
width, height, stride);
@@ -1154,6 +1212,11 @@ paint (GimpColorWheel *hsv,
gint width,
gint height)
{
+ GimpColorWheelPrivate *priv = hsv->priv;
+
+ if (! priv->transform)
+ gimp_color_wheel_create_transform (hsv);
+
paint_ring (hsv, cr, x, y, width, height);
paint_triangle (hsv, cr, x, y, width, height);
}
@@ -1380,6 +1443,52 @@ gimp_color_wheel_get_ring_fraction (GimpColorWheel *wheel)
}
/**
+ * gimp_color_wheel_set_color_config:
+ * @wheel: a #GimpColorWheel widget.
+ * @config: a #GimpColorConfig object.
+ *
+ * Sets the color management configuration to use with this color wheel.
+ *
+ * Since: 2.10
+ */
+void
+gimp_color_wheel_set_color_config (GimpColorWheel *wheel,
+ GimpColorConfig *config)
+{
+ GimpColorWheelPrivate *priv;
+
+ g_return_if_fail (GIMP_IS_COLOR_WHEEL (wheel));
+ g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config));
+
+ priv = wheel->priv;
+
+ if (priv->config)
+ {
+ g_signal_handlers_disconnect_by_func (priv->config,
+ gimp_color_wheel_config_notify,
+ wheel);
+ g_object_unref (priv->config);
+
+ if (priv->transform)
+ {
+ g_object_unref (priv->transform);
+ priv->transform = NULL;
+ }
+ }
+
+ priv->config = config;
+
+ if (priv->config)
+ {
+ g_object_ref (priv->config);
+
+ g_signal_connect (priv->config, "notify",
+ G_CALLBACK (gimp_color_wheel_config_notify),
+ wheel);
+ }
+}
+
+/**
* gimp_color_wheel_is_adjusting:
* @hsv: A #GimpColorWheel
*
@@ -1481,3 +1590,41 @@ gimp_color_wheel_move (GimpColorWheel *wheel,
gimp_color_wheel_set_color (wheel, hue, sat, val);
}
+
+static void
+gimp_color_wheel_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorWheel *wheel)
+{
+ GimpColorWheelPrivate *priv = wheel->priv;
+
+ if (priv->transform)
+ {
+ g_object_unref (priv->transform);
+ priv->transform = NULL;
+ }
+
+ gtk_widget_queue_draw (GTK_WIDGET (wheel));
+}
+
+static void
+gimp_color_wheel_create_transform (GimpColorWheel *wheel)
+{
+ GimpColorWheelPrivate *priv = wheel->priv;
+
+ if (priv->config)
+ {
+ static GimpColorProfile *profile = NULL;
+
+ const Babl *format = babl_format ("cairo-RGB24");
+
+ if (G_UNLIKELY (! profile))
+ profile = gimp_color_profile_new_rgb_srgb ();
+
+ priv->transform = gimp_widget_get_color_transform (GTK_WIDGET (wheel),
+ priv->config,
+ profile,
+ format,
+ format);
+ }
+}
diff --git a/modules/gimpcolorwheel.h b/modules/gimpcolorwheel.h
index c6cc289..b729869 100644
--- a/modules/gimpcolorwheel.h
+++ b/modules/gimpcolorwheel.h
@@ -70,25 +70,28 @@ struct _GimpColorWheelClass
};
-void color_wheel_register_type (GTypeModule *module);
+void color_wheel_register_type (GTypeModule *module);
GType gimp_color_wheel_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_color_wheel_new (void);
-void gimp_color_wheel_set_color (GimpColorWheel *wheel,
- double h,
- double s,
- double v);
-void gimp_color_wheel_get_color (GimpColorWheel *wheel,
- gdouble *h,
- gdouble *s,
- gdouble *v);
+void gimp_color_wheel_set_color (GimpColorWheel *wheel,
+ double h,
+ double s,
+ double v);
+void gimp_color_wheel_get_color (GimpColorWheel *wheel,
+ gdouble *h,
+ gdouble *s,
+ gdouble *v);
-void gimp_color_wheel_set_ring_fraction (GimpColorWheel *wheel,
- gdouble fraction);
-gdouble gimp_color_wheel_get_ring_fraction (GimpColorWheel *wheel);
+void gimp_color_wheel_set_ring_fraction (GimpColorWheel *wheel,
+ gdouble fraction);
+gdouble gimp_color_wheel_get_ring_fraction (GimpColorWheel *wheel);
-gboolean gimp_color_wheel_is_adjusting (GimpColorWheel *wheel);
+void gimp_color_wheel_set_color_config (GimpColorWheel *wheel,
+ GimpColorConfig *config);
+
+gboolean gimp_color_wheel_is_adjusting (GimpColorWheel *wheel);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]