[gimp] libgimpwidgets: add gimp_color_area_set_color_config()
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimpwidgets: add gimp_color_area_set_color_config()
- Date: Wed, 25 May 2016 14:58:08 +0000 (UTC)
commit 1cffaa71201d768f015fab5a6e18ac5f74e6fc9e
Author: Michael Natterer <mitch gimp org>
Date: Wed May 25 12:39:31 2016 +0200
libgimpwidgets: add gimp_color_area_set_color_config()
And do a display profile transform on the color area if it's set.
libgimpwidgets/gimpcolorarea.c | 180 +++++++++++++++++++++++++++++++++++++---
libgimpwidgets/gimpcolorarea.h | 34 ++++----
libgimpwidgets/gimpwidgets.def | 1 +
3 files changed, 188 insertions(+), 27 deletions(-)
---
diff --git a/libgimpwidgets/gimpcolorarea.c b/libgimpwidgets/gimpcolorarea.c
index 66d3e2d..854c6fc 100644
--- a/libgimpwidgets/gimpcolorarea.c
+++ b/libgimpwidgets/gimpcolorarea.c
@@ -21,16 +21,20 @@
#include "config.h"
+#include <lcms2.h>
+
#include <gegl.h>
#include <gtk/gtk.h>
-#include "libgimpcolor/gimpcolor.h"
#include "libgimpbase/gimpbase.h"
+#include "libgimpcolor/gimpcolor.h"
+#include "libgimpconfig/gimpconfig.h"
#include "gimpwidgetstypes.h"
#include "gimpcairo-utils.h"
#include "gimpcolorarea.h"
+#include "gimpwidgetsutils.h"
/**
@@ -63,6 +67,22 @@ enum
};
+typedef struct _GimpColorAreaPrivate GimpColorAreaPrivate;
+
+struct _GimpColorAreaPrivate
+{
+ GimpColorConfig *config;
+ GimpColorTransform transform;
+};
+
+#define GET_PRIVATE(obj) \
+ G_TYPE_INSTANCE_GET_PRIVATE (obj, \
+ GIMP_TYPE_COLOR_AREA, \
+ GimpColorAreaPrivate)
+
+
+static void gimp_color_area_dispose (GObject *object);
+static void gimp_color_area_finalize (GObject *object);
static void gimp_color_area_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -71,7 +91,6 @@ static void gimp_color_area_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
-static void gimp_color_area_finalize (GObject *object);
static void gimp_color_area_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
@@ -106,6 +125,12 @@ static void gimp_color_area_drag_data_get (GtkWidget *widget,
guint info,
guint time);
+static void gimp_color_area_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorArea *area);
+
+static void gimp_color_area_create_transform (GimpColorArea *area);
+
G_DEFINE_TYPE (GimpColorArea, gimp_color_area, GTK_TYPE_DRAWING_AREA)
@@ -132,9 +157,10 @@ gimp_color_area_class_init (GimpColorAreaClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ object_class->dispose = gimp_color_area_dispose;
+ object_class->finalize = gimp_color_area_finalize;
object_class->get_property = gimp_color_area_get_property;
object_class->set_property = gimp_color_area_set_property;
- object_class->finalize = gimp_color_area_finalize;
widget_class->size_allocate = gimp_color_area_size_allocate;
widget_class->state_changed = gimp_color_area_state_changed;
@@ -199,6 +225,8 @@ gimp_color_area_class_init (GimpColorAreaClass *klass)
NULL, NULL,
FALSE,
GIMP_PARAM_READWRITE));
+
+ g_type_class_add_private (object_class, sizeof (GimpColorAreaPrivate));
}
static void
@@ -219,6 +247,16 @@ gimp_color_area_init (GimpColorArea *area)
}
static void
+gimp_color_area_dispose (GObject *object)
+{
+ GimpColorArea *area = GIMP_COLOR_AREA (object);
+
+ gimp_color_area_set_color_config (area, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
gimp_color_area_finalize (GObject *object)
{
GimpColorArea *area = GIMP_COLOR_AREA (object);
@@ -342,10 +380,11 @@ static gboolean
gimp_color_area_expose (GtkWidget *widget,
GdkEventExpose *event)
{
- GimpColorArea *area = GIMP_COLOR_AREA (widget);
- GtkStyle *style = gtk_widget_get_style (widget);
- cairo_t *cr;
- cairo_surface_t *buffer;
+ GimpColorArea *area = GIMP_COLOR_AREA (widget);
+ GimpColorAreaPrivate *priv = GET_PRIVATE (widget);
+ GtkStyle *style = gtk_widget_get_style (widget);
+ cairo_t *cr;
+ cairo_surface_t *buffer;
if (! area->buf || ! gtk_widget_is_drawable (widget))
return FALSE;
@@ -358,11 +397,41 @@ gimp_color_area_expose (GtkWidget *widget,
gdk_cairo_region (cr, event->region);
cairo_clip (cr);
- buffer = cairo_image_surface_create_for_data (area->buf,
- CAIRO_FORMAT_RGB24,
- area->width,
- area->height,
- area->rowstride);
+ if (! priv->transform)
+ gimp_color_area_create_transform (area);
+
+ if (priv->transform)
+ {
+ guchar *buf = g_new (guchar, area->rowstride * area->height);
+ guchar *src = area->buf;
+ guchar *dest = buf;
+ gint i;
+
+ for (i = 0; i < area->height; i++)
+ {
+ cmsDoTransform (priv->transform, src, dest, area->width);
+
+ src += area->rowstride;
+ dest += area->rowstride;
+ }
+
+ buffer = cairo_image_surface_create_for_data (buf,
+ CAIRO_FORMAT_RGB24,
+ area->width,
+ area->height,
+ area->rowstride);
+ cairo_surface_set_user_data (buffer, NULL,
+ buf, (cairo_destroy_func_t) g_free);
+ }
+ else
+ {
+ buffer = cairo_image_surface_create_for_data (area->buf,
+ CAIRO_FORMAT_RGB24,
+ area->width,
+ area->height,
+ area->rowstride);
+ }
+
cairo_set_source_surface (cr, buffer, 0.0, 0.0);
cairo_surface_destroy (buffer);
@@ -523,6 +592,55 @@ gimp_color_area_set_draw_border (GimpColorArea *area,
}
}
+/**
+ * gimp_color_area_set_color_config:
+ * @area: a #GimpColorArea widget.
+ * @config: a #GimpColorConfig object.
+ *
+ * Sets the color management configuration to use with this color area.
+ *
+ * Since: 2.10
+ */
+void
+gimp_color_area_set_color_config (GimpColorArea *area,
+ GimpColorConfig *config)
+{
+ GimpColorAreaPrivate *priv;
+
+ g_return_if_fail (GIMP_IS_COLOR_AREA (area));
+ g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config));
+
+ priv = GET_PRIVATE (area);
+
+ if (priv->config)
+ {
+ g_signal_handlers_disconnect_by_func (priv->config,
+ gimp_color_area_config_notify,
+ area);
+ g_object_unref (priv->config);
+
+ if (priv->transform)
+ {
+ cmsDeleteTransform (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_area_config_notify),
+ area);
+ }
+}
+
+
+/* private functions */
+
static void
gimp_color_area_render_buf (GtkWidget *widget,
gboolean insensitive,
@@ -791,3 +909,41 @@ gimp_color_area_drag_data_get (GtkWidget *widget,
gdk_atom_intern ("application/x-color", FALSE),
16, (guchar *) vals, 8);
}
+
+static void
+gimp_color_area_config_notify (GimpColorConfig *config,
+ const GParamSpec *pspec,
+ GimpColorArea *area)
+{
+ GimpColorAreaPrivate *priv = GET_PRIVATE (area);
+
+ if (priv->transform)
+ {
+ cmsDeleteTransform (priv->transform);
+ priv->transform = NULL;
+ }
+
+ gtk_widget_queue_draw (GTK_WIDGET (area));
+}
+
+static void
+gimp_color_area_create_transform (GimpColorArea *area)
+{
+ GimpColorAreaPrivate *priv = GET_PRIVATE (area);
+
+ 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 (area),
+ priv->config,
+ profile,
+ &format,
+ &format);
+ }
+}
diff --git a/libgimpwidgets/gimpcolorarea.h b/libgimpwidgets/gimpcolorarea.h
index beaf101..807de27 100644
--- a/libgimpwidgets/gimpcolorarea.h
+++ b/libgimpwidgets/gimpcolorarea.h
@@ -74,21 +74,25 @@ struct _GimpColorAreaClass
};
-GType gimp_color_area_get_type (void) G_GNUC_CONST;
-
-GtkWidget * gimp_color_area_new (const GimpRGB *color,
- GimpColorAreaType type,
- GdkModifierType drag_mask);
-
-void gimp_color_area_set_color (GimpColorArea *area,
- const GimpRGB *color);
-void gimp_color_area_get_color (GimpColorArea *area,
- GimpRGB *color);
-gboolean gimp_color_area_has_alpha (GimpColorArea *area);
-void gimp_color_area_set_type (GimpColorArea *area,
- GimpColorAreaType type);
-void gimp_color_area_set_draw_border (GimpColorArea *area,
- gboolean draw_border);
+GType gimp_color_area_get_type (void) G_GNUC_CONST;
+
+GtkWidget * gimp_color_area_new (const GimpRGB *color,
+ GimpColorAreaType type,
+ GdkModifierType drag_mask);
+
+void gimp_color_area_set_color (GimpColorArea *area,
+ const GimpRGB *color);
+void gimp_color_area_get_color (GimpColorArea *area,
+ GimpRGB *color);
+
+gboolean gimp_color_area_has_alpha (GimpColorArea *area);
+void gimp_color_area_set_type (GimpColorArea *area,
+ GimpColorAreaType type);
+void gimp_color_area_set_draw_border (GimpColorArea *area,
+ gboolean draw_border);
+
+void gimp_color_area_set_color_config (GimpColorArea *area,
+ GimpColorConfig *config);
G_END_DECLS
diff --git a/libgimpwidgets/gimpwidgets.def b/libgimpwidgets/gimpwidgets.def
index 5eb7d03..e131745 100644
--- a/libgimpwidgets/gimpwidgets.def
+++ b/libgimpwidgets/gimpwidgets.def
@@ -29,6 +29,7 @@ EXPORTS
gimp_color_area_has_alpha
gimp_color_area_new
gimp_color_area_set_color
+ gimp_color_area_set_color_config
gimp_color_area_set_draw_border
gimp_color_area_set_type
gimp_color_area_type_get_type
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]