Bug 467930 - color selectors are not color managed
Color manage GimpColorScale and GimpColorScales.
This commit is contained in:
@ -27,13 +27,15 @@
|
|||||||
#include <gegl.h>
|
#include <gegl.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
#include "libgimpcolor/gimpcolor.h"
|
|
||||||
#include "libgimpbase/gimpbase.h"
|
#include "libgimpbase/gimpbase.h"
|
||||||
|
#include "libgimpconfig/gimpconfig.h"
|
||||||
|
#include "libgimpcolor/gimpcolor.h"
|
||||||
|
|
||||||
#include "gimpwidgetstypes.h"
|
#include "gimpwidgetstypes.h"
|
||||||
|
|
||||||
#include "gimpcairo-utils.h"
|
#include "gimpcairo-utils.h"
|
||||||
#include "gimpcolorscale.h"
|
#include "gimpcolorscale.h"
|
||||||
|
#include "gimpwidgetsutils.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,6 +54,21 @@ enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
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_finalize (GObject *object);
|
||||||
static void gimp_color_scale_get_property (GObject *object,
|
static void gimp_color_scale_get_property (GObject *object,
|
||||||
guint property_id,
|
guint property_id,
|
||||||
@ -77,6 +94,11 @@ static void gimp_color_scale_render (GimpColorScale *scale);
|
|||||||
static void gimp_color_scale_render_alpha (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_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)
|
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);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_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->finalize = gimp_color_scale_finalize;
|
||||||
object_class->get_property = gimp_color_scale_get_property;
|
object_class->get_property = gimp_color_scale_get_property;
|
||||||
object_class->set_property = gimp_color_scale_set_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_COLOR_SELECTOR_VALUE,
|
||||||
GIMP_PARAM_READWRITE |
|
GIMP_PARAM_READWRITE |
|
||||||
G_PARAM_CONSTRUCT));
|
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
|
static void
|
||||||
@ -322,6 +357,7 @@ gimp_color_scale_expose (GtkWidget *widget,
|
|||||||
GdkEventExpose *event)
|
GdkEventExpose *event)
|
||||||
{
|
{
|
||||||
GimpColorScale *scale = GIMP_COLOR_SCALE (widget);
|
GimpColorScale *scale = GIMP_COLOR_SCALE (widget);
|
||||||
|
GimpColorScalePrivate *priv = GET_PRIVATE (widget);
|
||||||
GtkRange *range = GTK_RANGE (widget);
|
GtkRange *range = GTK_RANGE (widget);
|
||||||
GtkStyle *style = gtk_widget_get_style (widget);
|
GtkStyle *style = gtk_widget_get_style (widget);
|
||||||
GdkWindow *window = gtk_widget_get_window (widget);
|
GdkWindow *window = gtk_widget_get_window (widget);
|
||||||
@ -391,11 +427,44 @@ gimp_color_scale_expose (GtkWidget *widget,
|
|||||||
y + allocation.y,
|
y + allocation.y,
|
||||||
w, h);
|
w, h);
|
||||||
|
|
||||||
|
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,
|
buffer = cairo_image_surface_create_for_data (scale->buf,
|
||||||
CAIRO_FORMAT_RGB24,
|
CAIRO_FORMAT_RGB24,
|
||||||
scale->width,
|
scale->width,
|
||||||
scale->height,
|
scale->height,
|
||||||
scale->rowstride);
|
scale->rowstride);
|
||||||
|
}
|
||||||
|
|
||||||
switch (gtk_orientable_get_orientation (GTK_ORIENTABLE (range)))
|
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));
|
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 */
|
/* as in gtkrange.c */
|
||||||
static gboolean
|
static gboolean
|
||||||
should_invert (GtkRange *range)
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -79,6 +79,9 @@ void gimp_color_scale_set_color (GimpColorScale *scale,
|
|||||||
const GimpRGB *rgb,
|
const GimpRGB *rgb,
|
||||||
const GimpHSV *hsv);
|
const GimpHSV *hsv);
|
||||||
|
|
||||||
|
void gimp_color_scale_set_color_config (GimpColorScale *scale,
|
||||||
|
GimpColorConfig *config);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -87,6 +87,8 @@ static void gimp_color_scales_set_color (GimpColorSelector *selector,
|
|||||||
const GimpHSV *hsv);
|
const GimpHSV *hsv);
|
||||||
static void gimp_color_scales_set_channel (GimpColorSelector *selector,
|
static void gimp_color_scales_set_channel (GimpColorSelector *selector,
|
||||||
GimpColorSelectorChannel channel);
|
GimpColorSelectorChannel channel);
|
||||||
|
static void gimp_color_scales_set_config (GimpColorSelector *selector,
|
||||||
|
GimpColorConfig *config);
|
||||||
|
|
||||||
static void gimp_color_scales_update_scales (GimpColorScales *scales,
|
static void gimp_color_scales_update_scales (GimpColorScales *scales,
|
||||||
gint skip);
|
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_show_alpha = gimp_color_scales_set_show_alpha;
|
||||||
selector_class->set_color = gimp_color_scales_set_color;
|
selector_class->set_color = gimp_color_scales_set_color;
|
||||||
selector_class->set_channel = gimp_color_scales_set_channel;
|
selector_class->set_channel = gimp_color_scales_set_channel;
|
||||||
|
selector_class->set_config = gimp_color_scales_set_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -189,6 +192,8 @@ gimp_color_scales_init (GimpColorScales *scales)
|
|||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
scales->sliders[i] = GIMP_SCALE_ENTRY_SCALE (scales->slider_data[i]);
|
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);
|
gimp_color_scale_set_channel (GIMP_COLOR_SCALE (scales->sliders[i]), i);
|
||||||
|
|
||||||
@ -279,6 +284,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
|
static void
|
||||||
gimp_color_scales_update_scales (GimpColorScales *scales,
|
gimp_color_scales_update_scales (GimpColorScales *scales,
|
||||||
gint skip)
|
gint skip)
|
||||||
|
@ -98,6 +98,7 @@ EXPORTS
|
|||||||
gimp_color_scale_new
|
gimp_color_scale_new
|
||||||
gimp_color_scale_set_channel
|
gimp_color_scale_set_channel
|
||||||
gimp_color_scale_set_color
|
gimp_color_scale_set_color
|
||||||
|
gimp_color_scale_set_color_config
|
||||||
gimp_color_scales_get_type
|
gimp_color_scales_get_type
|
||||||
gimp_color_select_get_type
|
gimp_color_select_get_type
|
||||||
gimp_color_selection_color_changed
|
gimp_color_selection_color_changed
|
||||||
|
Reference in New Issue
Block a user