[gimp] Bug 467930 - color selectors are not color managed



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]