[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 22:52:00 +0000 (UTC)
commit 9014fbeb32357dc546075ffd55b1600539281765
Author: Michael Natterer <mitch gimp org>
Date: Fri May 27 00:51:32 2016 +0200
Bug 467930 - color selectors are not color managed
Color manage GimpColorScale and GimpColorScales.
libgimpwidgets/gimpcolorscale.c | 246 +++++++++++++++++++++++++++++++-------
libgimpwidgets/gimpcolorscale.h | 21 ++--
libgimpwidgets/gimpcolorscales.c | 20 +++
libgimpwidgets/gimpwidgets.def | 1 +
4 files changed, 233 insertions(+), 55 deletions(-)
---
diff --git a/libgimpwidgets/gimpcolorscale.c b/libgimpwidgets/gimpcolorscale.c
index ea26ca5..690dbfb 100644
--- a/libgimpwidgets/gimpcolorscale.c
+++ b/libgimpwidgets/gimpcolorscale.c
@@ -27,13 +27,15 @@
#include <gegl.h>
#include <gtk/gtk.h>
-#include "libgimpcolor/gimpcolor.h"
#include "libgimpbase/gimpbase.h"
+#include "libgimpconfig/gimpconfig.h"
+#include "libgimpcolor/gimpcolor.h"
#include "gimpwidgetstypes.h"
#include "gimpcairo-utils.h"
#include "gimpcolorscale.h"
+#include "gimpwidgetsutils.h"
/**
@@ -52,30 +54,50 @@ enum
};
-static void gimp_color_scale_finalize (GObject *object);
-static void gimp_color_scale_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
-static void gimp_color_scale_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void gimp_color_scale_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void gimp_color_scale_state_changed (GtkWidget *widget,
- GtkStateType previous_state);
-static gboolean gimp_color_scale_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gimp_color_scale_button_release (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gimp_color_scale_expose (GtkWidget *widget,
- GdkEventExpose *event);
-
-static void gimp_color_scale_render (GimpColorScale *scale);
-static void gimp_color_scale_render_alpha (GimpColorScale *scale);
-static void gimp_color_scale_render_stipple (GimpColorScale *scale);
+typedef struct _GimpColorScalePrivate GimpColorScalePrivate;
+
+struct _GimpColorScalePrivate
+{
+ GimpColorConfig *config;
+ GimpColorTransform *transform;
+};
+
+#define GET_PRIVATE(obj) \
+ G_TYPE_INSTANCE_GET_PRIVATE (obj, \
+ GIMP_TYPE_COLOR_SCALE, \
+ GimpColorScalePrivate)
+
+
+static void gimp_color_scale_dispose (GObject *object);
+static void gimp_color_scale_finalize (GObject *object);
+static void gimp_color_scale_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void gimp_color_scale_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void gimp_color_scale_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
+static void gimp_color_scale_state_changed (GtkWidget *widget,
+ GtkStateType previous_state);
+static gboolean gimp_color_scale_button_press (GtkWidget *widget,
+ GdkEventButton *event);
+static gboolean gimp_color_scale_button_release (GtkWidget *widget,
+ GdkEventButton *event);
+static gboolean gimp_color_scale_expose (GtkWidget *widget,
+ GdkEventExpose *event);
+
+static void gimp_color_scale_render (GimpColorScale *scale);
+static void gimp_color_scale_render_alpha (GimpColorScale *scale);
+static void gimp_color_scale_render_stipple (GimpColorScale *scale);
+
+static void gimp_color_scale_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorScale *scale);
+static void gimp_color_scale_create_transform (GimpColorScale *scale);
G_DEFINE_TYPE (GimpColorScale, gimp_color_scale, GTK_TYPE_SCALE)
@@ -89,6 +111,7 @@ gimp_color_scale_class_init (GimpColorScaleClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->dispose = gimp_color_scale_dispose;
object_class->finalize = gimp_color_scale_finalize;
object_class->get_property = gimp_color_scale_get_property;
object_class->set_property = gimp_color_scale_set_property;
@@ -112,6 +135,18 @@ gimp_color_scale_class_init (GimpColorScaleClass *klass)
GIMP_COLOR_SELECTOR_VALUE,
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
+
+ g_type_class_add_private (object_class, sizeof (GimpColorScalePrivate));
+}
+
+static void
+gimp_color_scale_dispose (GObject *object)
+{
+ GimpColorScale *scale = GIMP_COLOR_SCALE (object);
+
+ gimp_color_scale_set_color_config (scale, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
@@ -321,22 +356,23 @@ static gboolean
gimp_color_scale_expose (GtkWidget *widget,
GdkEventExpose *event)
{
- GimpColorScale *scale = GIMP_COLOR_SCALE (widget);
- GtkRange *range = GTK_RANGE (widget);
- GtkStyle *style = gtk_widget_get_style (widget);
- GdkWindow *window = gtk_widget_get_window (widget);
- gboolean sensitive = gtk_widget_is_sensitive (widget);
- GtkAllocation allocation;
- GdkRectangle range_rect;
- GdkRectangle area = { 0, };
- cairo_surface_t *buffer;
- gint focus = 0;
- gint trough_border;
- gint slider_start;
- gint slider_size;
- gint x, y;
- gint w, h;
- cairo_t *cr;
+ GimpColorScale *scale = GIMP_COLOR_SCALE (widget);
+ GimpColorScalePrivate *priv = GET_PRIVATE (widget);
+ GtkRange *range = GTK_RANGE (widget);
+ GtkStyle *style = gtk_widget_get_style (widget);
+ GdkWindow *window = gtk_widget_get_window (widget);
+ gboolean sensitive = gtk_widget_is_sensitive (widget);
+ GtkAllocation allocation;
+ GdkRectangle range_rect;
+ GdkRectangle area = { 0, };
+ cairo_surface_t *buffer;
+ gint focus = 0;
+ gint trough_border;
+ gint slider_start;
+ gint slider_size;
+ gint x, y;
+ gint w, h;
+ cairo_t *cr;
if (! scale->buf || ! gtk_widget_is_drawable (widget))
return FALSE;
@@ -391,11 +427,44 @@ gimp_color_scale_expose (GtkWidget *widget,
y + allocation.y,
w, h);
- buffer = cairo_image_surface_create_for_data (scale->buf,
- CAIRO_FORMAT_RGB24,
- scale->width,
- scale->height,
- scale->rowstride);
+ if (! priv->transform)
+ gimp_color_scale_create_transform (scale);
+
+ if (priv->transform)
+ {
+ const Babl *format = babl_format ("cairo-RGB24");
+ guchar *buf = g_new (guchar, scale->rowstride * scale->height);
+ guchar *src = scale->buf;
+ guchar *dest = buf;
+ gint i;
+
+ for (i = 0; i < scale->height; i++)
+ {
+ gimp_color_transform_process_pixels (priv->transform,
+ format, src,
+ format, dest,
+ scale->width);
+
+ src += scale->rowstride;
+ dest += scale->rowstride;
+ }
+
+ buffer = cairo_image_surface_create_for_data (buf,
+ CAIRO_FORMAT_RGB24,
+ scale->width,
+ scale->height,
+ scale->rowstride);
+ cairo_surface_set_user_data (buffer, NULL,
+ buf, (cairo_destroy_func_t) g_free);
+ }
+ else
+ {
+ buffer = cairo_image_surface_create_for_data (scale->buf,
+ CAIRO_FORMAT_RGB24,
+ scale->width,
+ scale->height,
+ scale->rowstride);
+ }
switch (gtk_orientable_get_orientation (GTK_ORIENTABLE (range)))
{
@@ -571,6 +640,53 @@ gimp_color_scale_set_color (GimpColorScale *scale,
gtk_widget_queue_draw (GTK_WIDGET (scale));
}
+/**
+ * gimp_color_scale_set_color_config:
+ * @scale: a #GimpColorScale widget.
+ * @config: a #GimpColorConfig object.
+ *
+ * Sets the color management configuration to use with this color scale.
+ *
+ * Since: 2.10
+ */
+void
+gimp_color_scale_set_color_config (GimpColorScale *scale,
+ GimpColorConfig *config)
+{
+ GimpColorScalePrivate *priv;
+
+ g_return_if_fail (GIMP_IS_COLOR_SCALE (scale));
+ g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config));
+
+ priv = GET_PRIVATE (scale);
+
+ if (priv->config)
+ {
+ g_signal_handlers_disconnect_by_func (priv->config,
+ gimp_color_scale_config_notify,
+ scale);
+ 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_scale_config_notify),
+ scale);
+ }
+}
+
+
/* as in gtkrange.c */
static gboolean
should_invert (GtkRange *range)
@@ -861,3 +977,41 @@ gimp_color_scale_render_stipple (GimpColorScale *scale)
}
}
}
+
+static void
+gimp_color_scale_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorScale *scale)
+{
+ GimpColorScalePrivate *priv = GET_PRIVATE (scale);
+
+ if (priv->transform)
+ {
+ g_object_unref (priv->transform);
+ priv->transform = NULL;
+ }
+
+ gtk_widget_queue_draw (GTK_WIDGET (scale));
+}
+
+static void
+gimp_color_scale_create_transform (GimpColorScale *scale)
+{
+ GimpColorScalePrivate *priv = GET_PRIVATE (scale);
+
+ 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 (scale),
+ priv->config,
+ profile,
+ format,
+ format);
+ }
+}
diff --git a/libgimpwidgets/gimpcolorscale.h b/libgimpwidgets/gimpcolorscale.h
index 7c85dc5..e6e1c3e 100644
--- a/libgimpwidgets/gimpcolorscale.h
+++ b/libgimpwidgets/gimpcolorscale.h
@@ -69,15 +69,18 @@ struct _GimpColorScaleClass
};
-GType gimp_color_scale_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_color_scale_new (GtkOrientation orientation,
- GimpColorSelectorChannel channel);
-
-void gimp_color_scale_set_channel (GimpColorScale *scale,
- GimpColorSelectorChannel channel);
-void gimp_color_scale_set_color (GimpColorScale *scale,
- const GimpRGB *rgb,
- const GimpHSV *hsv);
+GType gimp_color_scale_get_type (void) G_GNUC_CONST;
+GtkWidget * gimp_color_scale_new (GtkOrientation orientation,
+ GimpColorSelectorChannel channel);
+
+void gimp_color_scale_set_channel (GimpColorScale *scale,
+ GimpColorSelectorChannel channel);
+void gimp_color_scale_set_color (GimpColorScale *scale,
+ const GimpRGB *rgb,
+ const GimpHSV *hsv);
+
+void gimp_color_scale_set_color_config (GimpColorScale *scale,
+ GimpColorConfig *config);
G_END_DECLS
diff --git a/libgimpwidgets/gimpcolorscales.c b/libgimpwidgets/gimpcolorscales.c
index c3b1e8a..4eef817 100644
--- a/libgimpwidgets/gimpcolorscales.c
+++ b/libgimpwidgets/gimpcolorscales.c
@@ -87,6 +87,8 @@ static void gimp_color_scales_set_color (GimpColorSelector *selector,
const GimpHSV *hsv);
static void gimp_color_scales_set_channel (GimpColorSelector *selector,
GimpColorSelectorChannel channel);
+static void gimp_color_scales_set_config (GimpColorSelector *selector,
+ GimpColorConfig *config);
static void gimp_color_scales_update_scales (GimpColorScales *scales,
gint skip);
@@ -114,6 +116,7 @@ gimp_color_scales_class_init (GimpColorScalesClass *klass)
selector_class->set_show_alpha = gimp_color_scales_set_show_alpha;
selector_class->set_color = gimp_color_scales_set_color;
selector_class->set_channel = gimp_color_scales_set_channel;
+ selector_class->set_config = gimp_color_scales_set_config;
}
static void
@@ -189,6 +192,8 @@ gimp_color_scales_init (GimpColorScales *scales)
NULL);
scales->sliders[i] = GIMP_SCALE_ENTRY_SCALE (scales->slider_data[i]);
+ g_object_add_weak_pointer (G_OBJECT (scales->sliders[i]),
+ (gpointer) &scales->sliders[i]);
gimp_color_scale_set_channel (GIMP_COLOR_SCALE (scales->sliders[i]), i);
@@ -280,6 +285,21 @@ gimp_color_scales_set_channel (GimpColorSelector *selector,
}
static void
+gimp_color_scales_set_config (GimpColorSelector *selector,
+ GimpColorConfig *config)
+{
+ GimpColorScales *scales = GIMP_COLOR_SCALES (selector);
+ gint i;
+
+ for (i = 0; i < 7; i++)
+ {
+ if (scales->sliders[i])
+ gimp_color_scale_set_color_config (GIMP_COLOR_SCALE (scales->sliders[i]),
+ config);
+ }
+}
+
+static void
gimp_color_scales_update_scales (GimpColorScales *scales,
gint skip)
{
diff --git a/libgimpwidgets/gimpwidgets.def b/libgimpwidgets/gimpwidgets.def
index e131745..e08fd5e 100644
--- a/libgimpwidgets/gimpwidgets.def
+++ b/libgimpwidgets/gimpwidgets.def
@@ -98,6 +98,7 @@ EXPORTS
gimp_color_scale_new
gimp_color_scale_set_channel
gimp_color_scale_set_color
+ gimp_color_scale_set_color_config
gimp_color_scales_get_type
gimp_color_select_get_type
gimp_color_selection_color_changed
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]