[gimp] Converting CMYK sample points to babl process
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Converting CMYK sample points to babl process
- Date: Wed, 20 Jul 2022 23:07:16 +0000 (UTC)
commit 93399de7cdc84cd06198554e025214d2e66dfa77
Author: Nikc <nikcdc gmail com>
Date: Thu Mar 3 03:15:44 2022 +0000
Converting CMYK sample points to babl process
app/dialogs/dialogs-constructors.c | 3 +-
app/display/gimpcursorview.c | 79 ++++++---
app/display/gimpcursorview.h | 3 +-
app/tools/gimpcolorpickertool.c | 5 +-
app/widgets/gimpcolorframe.c | 308 ++++++++++++++++++++++--------------
app/widgets/gimpcolorframe.h | 13 +-
app/widgets/gimpsamplepointeditor.c | 1 +
7 files changed, 267 insertions(+), 145 deletions(-)
---
diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c
index e6820b57bb..b710d35919 100644
--- a/app/dialogs/dialogs-constructors.c
+++ b/app/dialogs/dialogs-constructors.c
@@ -374,7 +374,8 @@ dialogs_cursor_view_new (GimpDialogFactory *factory,
GimpUIManager *ui_manager,
gint view_size)
{
- return gimp_cursor_view_new (gimp_dialog_factory_get_menu_factory (factory));
+ return gimp_cursor_view_new (context->gimp,
+ gimp_dialog_factory_get_menu_factory (factory));
}
GtkWidget *
diff --git a/app/display/gimpcursorview.c b/app/display/gimpcursorview.c
index cc4392a667..ee3f6ddcab 100644
--- a/app/display/gimpcursorview.c
+++ b/app/display/gimpcursorview.c
@@ -55,6 +55,7 @@
enum
{
PROP_0,
+ PROP_GIMP,
PROP_SAMPLE_MERGED
};
@@ -63,6 +64,8 @@ struct _GimpCursorViewPrivate
{
GimpEditor parent_instance;
+ Gimp *gimp;
+
GtkWidget *coord_hbox;
GtkWidget *selection_hbox;
GtkWidget *color_hbox;
@@ -96,6 +99,7 @@ struct _GimpCursorViewPrivate
static void gimp_cursor_view_docked_iface_init (GimpDockedInterface *iface);
static void gimp_cursor_view_dispose (GObject *object);
+static void gimp_cursor_view_constructed (GObject *object);
static void gimp_cursor_view_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -153,12 +157,20 @@ gimp_cursor_view_class_init (GimpCursorViewClass* klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+ object_class->constructed = gimp_cursor_view_constructed;
object_class->dispose = gimp_cursor_view_dispose;
object_class->get_property = gimp_cursor_view_get_property;
object_class->set_property = gimp_cursor_view_set_property;
widget_class->style_updated = gimp_cursor_view_style_updated;
+ g_object_class_install_property (object_class, PROP_GIMP,
+ g_param_spec_object ("gimp",
+ NULL, NULL,
+ GIMP_TYPE_GIMP,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
g_object_class_install_property (object_class, PROP_SAMPLE_MERGED,
g_param_spec_boolean ("sample-merged",
NULL, NULL,
@@ -306,16 +318,44 @@ gimp_cursor_view_init (GimpCursorView *view)
_("H"), 0.5, 0.5,
view->priv->selection_height_label, 1);
+ /* sample merged toggle */
- /* color information */
+ toggle = gimp_prop_check_button_new (G_OBJECT (view), "sample-merged",
+ _("_Sample Merged"));
+ gtk_box_pack_start (GTK_BOX (view), toggle, FALSE, FALSE, 0);
+}
+
+static void
+gimp_cursor_view_docked_iface_init (GimpDockedInterface *iface)
+{
+ parent_docked_iface = g_type_interface_peek_parent (iface);
+
+ if (! parent_docked_iface)
+ parent_docked_iface = g_type_default_interface_peek (GIMP_TYPE_DOCKED);
+
+ iface->set_aux_info = gimp_cursor_view_set_aux_info;
+ iface->get_aux_info = gimp_cursor_view_get_aux_info;
+ iface->set_context = gimp_cursor_view_set_context;
+}
+
+static void
+gimp_cursor_view_constructed (GObject *object)
+{
+ GimpCursorView *view = GIMP_CURSOR_VIEW (object);
+ gint content_spacing;
+
+ gtk_widget_style_get (GTK_WIDGET (view),
+ "content-spacing", &content_spacing,
+ NULL);
+ /* color information */
view->priv->color_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,
content_spacing);
gtk_box_set_homogeneous (GTK_BOX (view->priv->color_hbox), TRUE);
gtk_box_pack_start (GTK_BOX (view), view->priv->color_hbox, FALSE, FALSE, 0);
gtk_widget_show (view->priv->color_hbox);
- view->priv->color_frame_1 = gimp_color_frame_new ();
+ view->priv->color_frame_1 = gimp_color_frame_new (view->priv->gimp);
gimp_color_frame_set_mode (GIMP_COLOR_FRAME (view->priv->color_frame_1),
GIMP_COLOR_PICK_MODE_PIXEL);
gimp_color_frame_set_ellipsize (GIMP_COLOR_FRAME (view->priv->color_frame_1),
@@ -324,31 +364,13 @@ gimp_cursor_view_init (GimpCursorView *view)
TRUE, TRUE, 0);
gtk_widget_show (view->priv->color_frame_1);
- view->priv->color_frame_2 = gimp_color_frame_new ();
+ view->priv->color_frame_2 = gimp_color_frame_new (view->priv->gimp);
gimp_color_frame_set_mode (GIMP_COLOR_FRAME (view->priv->color_frame_2),
GIMP_COLOR_PICK_MODE_RGB_PERCENT);
gtk_box_pack_start (GTK_BOX (view->priv->color_hbox), view->priv->color_frame_2,
TRUE, TRUE, 0);
gtk_widget_show (view->priv->color_frame_2);
- /* sample merged toggle */
-
- toggle = gimp_prop_check_button_new (G_OBJECT (view), "sample-merged",
- _("_Sample Merged"));
- gtk_box_pack_start (GTK_BOX (view), toggle, FALSE, FALSE, 0);
-}
-
-static void
-gimp_cursor_view_docked_iface_init (GimpDockedInterface *iface)
-{
- parent_docked_iface = g_type_interface_peek_parent (iface);
-
- if (! parent_docked_iface)
- parent_docked_iface = g_type_default_interface_peek (GIMP_TYPE_DOCKED);
-
- iface->set_aux_info = gimp_cursor_view_set_aux_info;
- iface->get_aux_info = gimp_cursor_view_get_aux_info;
- iface->set_context = gimp_cursor_view_set_context;
}
static void
@@ -365,6 +387,9 @@ gimp_cursor_view_dispose (GObject *object)
view->priv->cursor_idle_id = 0;
}
+ view->priv->color_frame_1 = NULL;
+ view->priv->color_frame_2 = NULL;
+
g_clear_object (&view->priv->cursor_image);
G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -380,6 +405,10 @@ gimp_cursor_view_set_property (GObject *object,
switch (property_id)
{
+ case PROP_GIMP:
+ view->priv->gimp = g_value_get_object (value);
+ break;
+
case PROP_SAMPLE_MERGED:
view->priv->sample_merged = g_value_get_boolean (value);
break;
@@ -400,6 +429,10 @@ gimp_cursor_view_get_property (GObject *object,
switch (property_id)
{
+ case PROP_GIMP:
+ g_value_set_object (value, view->priv->gimp);
+ break;
+
case PROP_SAMPLE_MERGED:
g_value_set_boolean (value, view->priv->sample_merged);
break;
@@ -810,11 +843,13 @@ gimp_cursor_view_cursor_idle (GimpCursorView *view)
/* public functions */
GtkWidget *
-gimp_cursor_view_new (GimpMenuFactory *menu_factory)
+gimp_cursor_view_new (Gimp *gimp,
+ GimpMenuFactory *menu_factory)
{
g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
return g_object_new (GIMP_TYPE_CURSOR_VIEW,
+ "gimp", gimp,
"menu-factory", menu_factory,
"menu-identifier", "<CursorInfo>",
"ui-path", "/cursor-info-popup",
diff --git a/app/display/gimpcursorview.h b/app/display/gimpcursorview.h
index f5380410d0..2a774b6c6f 100644
--- a/app/display/gimpcursorview.h
+++ b/app/display/gimpcursorview.h
@@ -51,7 +51,8 @@ struct _GimpCursorViewClass
GType gimp_cursor_view_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_cursor_view_new (GimpMenuFactory *menu_factory);
+GtkWidget * gimp_cursor_view_new (Gimp *gimp,
+ GimpMenuFactory *menu_factory);
void gimp_cursor_view_set_sample_merged (GimpCursorView *view,
gboolean sample_merged);
diff --git a/app/tools/gimpcolorpickertool.c b/app/tools/gimpcolorpickertool.c
index 1670fcc8c9..17e82940fe 100644
--- a/app/tools/gimpcolorpickertool.c
+++ b/app/tools/gimpcolorpickertool.c
@@ -330,6 +330,7 @@ static void
gimp_color_picker_tool_info_create (GimpColorPickerTool *picker_tool,
GimpDisplay *display)
{
+ Gimp *gimp = gimp_display_get_gimp (display);
GimpTool *tool = GIMP_TOOL (picker_tool);
GimpToolOptions *options = GIMP_TOOL_GET_OPTIONS (tool);
GimpContext *context = GIMP_CONTEXT (tool->tool_info->tool_options);
@@ -364,7 +365,7 @@ gimp_color_picker_tool_info_create (GimpColorPickerTool *picker_tool,
hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
- picker_tool->color_frame1 = gimp_color_frame_new ();
+ picker_tool->color_frame1 = gimp_color_frame_new (gimp);
gimp_color_frame_set_color_config (GIMP_COLOR_FRAME (picker_tool->color_frame1),
context->gimp->config->color_management);
gimp_color_frame_set_has_coords (GIMP_COLOR_FRAME (picker_tool->color_frame1),
@@ -377,7 +378,7 @@ gimp_color_picker_tool_info_create (GimpColorPickerTool *picker_tool,
FALSE, FALSE, 0);
gtk_widget_show (picker_tool->color_frame1);
- picker_tool->color_frame2 = gimp_color_frame_new ();
+ picker_tool->color_frame2 = gimp_color_frame_new (gimp);
gimp_color_frame_set_color_config (GIMP_COLOR_FRAME (picker_tool->color_frame2),
context->gimp->config->color_management);
g_object_bind_property (options, "frame2-mode",
diff --git a/app/widgets/gimpcolorframe.c b/app/widgets/gimpcolorframe.c
index e3ef3eab23..c9c9221c87 100644
--- a/app/widgets/gimpcolorframe.c
+++ b/app/widgets/gimpcolorframe.c
@@ -30,7 +30,10 @@
#include "gegl/gimp-babl.h"
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
#include "core/gimpimage.h"
+#include "core/gimpimage-color-profile.h"
#include "gimpcolorframe.h"
@@ -42,6 +45,7 @@
enum
{
PROP_0,
+ PROP_GIMP,
PROP_MODE,
PROP_HAS_NUMBER,
PROP_NUMBER,
@@ -53,28 +57,32 @@ enum
/* local function prototypes */
-static void gimp_color_frame_dispose (GObject *object);
-static void gimp_color_frame_finalize (GObject *object);
-static void gimp_color_frame_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
-static void gimp_color_frame_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-
-static void gimp_color_frame_style_updated (GtkWidget *widget);
-static gboolean gimp_color_frame_draw (GtkWidget *widget,
- cairo_t *cr);
-
-static void gimp_color_frame_combo_callback (GtkWidget *widget,
- GimpColorFrame *frame);
-static void gimp_color_frame_update (GimpColorFrame *frame);
-
-static void gimp_color_frame_create_transform (GimpColorFrame *frame);
-static void gimp_color_frame_destroy_transform (GimpColorFrame *frame);
-
+static void gimp_color_frame_dispose (GObject *object);
+static void gimp_color_frame_finalize (GObject *object);
+static void gimp_color_frame_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void gimp_color_frame_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void gimp_color_frame_style_updated (GtkWidget *widget);
+static gboolean gimp_color_frame_draw (GtkWidget *widget,
+ cairo_t *cr);
+
+static void gimp_color_frame_combo_callback (GtkWidget *widget,
+ GimpColorFrame *frame);
+static void gimp_color_frame_update (GimpColorFrame *frame);
+
+static void gimp_color_frame_image_changed (GimpColorFrame *frame,
+ GimpImage *image,
+ GimpContext *context);
+
+static void gimp_color_frame_update_simulation_profile
+ (GimpImage *image,
+ GimpColorFrame *frame);
G_DEFINE_TYPE (GimpColorFrame, gimp_color_frame, GIMP_TYPE_FRAME)
@@ -95,6 +103,13 @@ gimp_color_frame_class_init (GimpColorFrameClass *klass)
widget_class->style_updated = gimp_color_frame_style_updated;
widget_class->draw = gimp_color_frame_draw;
+ g_object_class_install_property (object_class, PROP_GIMP,
+ g_param_spec_object ("gimp",
+ NULL, NULL,
+ GIMP_TYPE_GIMP,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
+
g_object_class_install_property (object_class, PROP_MODE,
g_param_spec_enum ("mode",
NULL, NULL,
@@ -206,6 +221,8 @@ gimp_color_frame_init (GimpColorFrame *frame)
frame->value_labels[i] = gtk_label_new (" ");
gtk_label_set_selectable (GTK_LABEL (frame->value_labels[i]), TRUE);
gtk_label_set_xalign (GTK_LABEL (frame->value_labels[i]), 1.0);
+ gtk_label_set_ellipsize (GTK_LABEL (frame->value_labels[i]),
+ PANGO_ELLIPSIZE_END);
gtk_box_pack_end (GTK_BOX (hbox), frame->value_labels[i],
TRUE, TRUE, 0);
gtk_widget_show (frame->value_labels[i]);
@@ -245,6 +262,16 @@ gimp_color_frame_dispose (GObject *object)
{
GimpColorFrame *frame = GIMP_COLOR_FRAME (object);
+ if (frame->gimp)
+ {
+ g_signal_handlers_disconnect_by_func (gimp_get_user_context (frame->gimp),
+ gimp_color_frame_image_changed,
+ frame);
+ frame->gimp = NULL;
+ }
+
+ gimp_color_frame_set_image (frame, NULL);
+
gimp_color_frame_set_color_config (frame, NULL);
G_OBJECT_CLASS (parent_class)->dispose (object);
@@ -270,6 +297,10 @@ gimp_color_frame_get_property (GObject *object,
switch (property_id)
{
+ case PROP_GIMP:
+ g_value_set_object (value, frame->gimp);
+ break;
+
case PROP_MODE:
g_value_set_enum (value, frame->pick_mode);
break;
@@ -307,9 +338,25 @@ gimp_color_frame_set_property (GObject *object,
GParamSpec *pspec)
{
GimpColorFrame *frame = GIMP_COLOR_FRAME (object);
+ GimpContext *context;
+ GimpImage *image;
switch (property_id)
{
+ case PROP_GIMP:
+ frame->gimp = g_value_get_object (value);
+ if (frame->gimp)
+ {
+ context = gimp_get_user_context (frame->gimp);
+ image = gimp_context_get_image (context);
+
+ g_signal_connect_swapped (context, "image-changed",
+ G_CALLBACK (gimp_color_frame_image_changed),
+ frame);
+ gimp_color_frame_image_changed (frame, image, context);
+ }
+ break;
+
case PROP_MODE:
gimp_color_frame_set_mode (frame, g_value_get_enum (value));
break;
@@ -423,15 +470,18 @@ gimp_color_frame_draw (GtkWidget *widget,
/**
* gimp_color_frame_new:
+ * @gimp: A #Gimp object.
*
* Creates a new #GimpColorFrame widget.
*
* Returns: The new #GimpColorFrame widget.
**/
GtkWidget *
-gimp_color_frame_new (void)
+gimp_color_frame_new (Gimp *gimp)
{
- return g_object_new (GIMP_TYPE_COLOR_FRAME, NULL);
+ return g_object_new (GIMP_TYPE_COLOR_FRAME,
+ "gimp", gimp,
+ NULL);
}
@@ -622,30 +672,53 @@ gimp_color_frame_set_color_config (GimpColorFrame *frame,
{
if (frame->config)
{
- g_signal_handlers_disconnect_by_func (frame->config,
- gimp_color_frame_destroy_transform,
- frame);
g_object_unref (frame->config);
- gimp_color_frame_destroy_transform (frame);
+ gimp_color_frame_update (frame);
}
frame->config = config;
if (frame->config)
- {
g_object_ref (frame->config);
- g_signal_connect_swapped (frame->config, "notify",
- G_CALLBACK (gimp_color_frame_destroy_transform),
- frame);
- }
-
gimp_color_area_set_color_config (GIMP_COLOR_AREA (frame->color_area),
config);
}
}
+void
+gimp_color_frame_set_image (GimpColorFrame *frame,
+ GimpImage *image)
+{
+ g_return_if_fail (GIMP_IS_COLOR_FRAME (frame));
+ g_return_if_fail (image == NULL || GIMP_IS_IMAGE (image));
+
+ if (image != frame->image)
+ {
+ if (frame->image)
+ {
+ g_signal_handlers_disconnect_by_func (frame->image,
+ gimp_color_frame_update_simulation_profile,
+ frame);
+ g_object_unref (frame->image);
+ }
+ }
+
+ frame->image = image;
+
+ if (frame->image)
+ {
+ g_object_ref (frame->image);
+
+ g_signal_connect (frame->image, "simulation-profile-changed",
+ G_CALLBACK (gimp_color_frame_update_simulation_profile),
+ frame);
+
+ gimp_color_frame_update_simulation_profile (frame->image,
+ frame);
+ }
+}
/* private functions */
@@ -667,10 +740,14 @@ gimp_color_frame_combo_callback (GtkWidget *widget,
static void
gimp_color_frame_update (GimpColorFrame *frame)
{
- const gchar *names[GIMP_COLOR_FRAME_ROWS] = { NULL, };
- gchar **values = NULL;
- gboolean has_alpha;
- gint i;
+ const gchar *names[GIMP_COLOR_FRAME_ROWS] = { NULL, };
+ gchar **values = NULL;
+ const gchar *tooltip[GIMP_COLOR_FRAME_ROWS] = { NULL, };
+ gboolean has_alpha;
+ GimpColorProfile *color_profile = NULL;
+ gint i;
+
+ g_return_if_fail (GIMP_IS_COLOR_FRAME (frame));
has_alpha = babl_format_has_alpha (frame->sample_format);
@@ -1006,62 +1083,68 @@ gimp_color_frame_update (GimpColorFrame *frame)
break;
case GIMP_COLOR_PICK_MODE_CMYK:
- /* TRANSLATORS: C for Cyan (CMYK) */
- names[0] = C_("CMYK", "C:");
- /* TRANSLATORS: M for Magenta (CMYK) */
- names[1] = C_("CMYK", "M:");
- /* TRANSLATORS: Y for Yellow (CMYK) */
- names[2] = C_("CMYK", "Y:");
- /* TRANSLATORS: K for Key/black (CMYK) */
- names[3] = C_("CMYK", "K:");
-
- if (has_alpha)
- /* TRANSLATORS: A for Alpha (color transparency) */
- names[4] = C_("Alpha channel", "A:");
-
- if (frame->sample_valid)
- {
- GimpCMYK cmyk;
+ {
+ const Babl *space = NULL;
+
+ /* Try to load CMYK profile in the following order:
+ * 1) Soft-Proof Profile set in the View Menu
+ * 2) Preferred CMYK Profile set in Preferences
+ * 3) No CMYK Profile (Default Values)
+ */
+ color_profile = frame->view_profile;
+
+ if (! color_profile && frame->config)
+ color_profile = gimp_color_config_get_cmyk_color_profile (frame->config,
+ NULL);
+ if (color_profile)
+ space = gimp_color_profile_get_space (color_profile,
+ gimp_color_config_get_simulation_intent (frame->config),
+ NULL);
+
+ /* TRANSLATORS: C for Cyan (CMYK) */
+ names[0] = C_("CMYK", "C:");
+ /* TRANSLATORS: M for Magenta (CMYK) */
+ names[1] = C_("CMYK", "M:");
+ /* TRANSLATORS: Y for Yellow (CMYK) */
+ names[2] = C_("CMYK", "Y:");
+ /* TRANSLATORS: K for Key/black (CMYK) */
+ names[3] = C_("CMYK", "K:");
+ if (has_alpha)
+ /* TRANSLATORS: A for Alpha (color transparency) */
+ names[4] = C_("Alpha channel", "A:");
+ if (color_profile)
+ names[5] = C_("Color", "Profile:");
+ else
+ names[5] = C_("Color", "No Profile");
- if (! frame->transform)
- gimp_color_frame_create_transform (frame);
+ if (frame->sample_valid)
+ {
+ const Babl *fish = NULL;
+ gfloat cmyk[4];
+ const gchar *profile_label;
- if (frame->transform)
- {
- gdouble rgb_values[3];
- gdouble cmyk_values[4];
-
- rgb_values[0] = frame->color.r;
- rgb_values[1] = frame->color.g;
- rgb_values[2] = frame->color.b;
-
- gimp_color_transform_process_pixels (frame->transform,
- babl_format ("R'G'B' double"),
- rgb_values,
- babl_format ("CMYK double"),
- cmyk_values,
- 1);
-
- cmyk.c = cmyk_values[0] / 100.0;
- cmyk.m = cmyk_values[1] / 100.0;
- cmyk.y = cmyk_values[2] / 100.0;
- cmyk.k = cmyk_values[3] / 100.0;
- }
- else
- {
- gimp_rgb_to_cmyk (&frame->color, 1.0, &cmyk);
- }
+ /* User may swap CMYK color profiles at runtime */
+ fish = babl_fish (babl_format ("R'G'B'A double"),
+ babl_format_with_space ("CMYK float", space));
- cmyk.a = frame->color.a;
+ babl_process (fish, &frame->color, cmyk, 1);
- values = g_new0 (gchar *, 6);
+ values = g_new0 (gchar *, 6);
- values[0] = g_strdup_printf ("%.01f %%", cmyk.c * 100.0);
- values[1] = g_strdup_printf ("%.01f %%", cmyk.m * 100.0);
- values[2] = g_strdup_printf ("%.01f %%", cmyk.y * 100.0);
- values[3] = g_strdup_printf ("%.01f %%", cmyk.k * 100.0);
- values[4] = g_strdup_printf ("%.01f %%", cmyk.a * 100.0);
- }
+ values[0] = g_strdup_printf ("%.0f %%", cmyk[0] * 100.0);
+ values[1] = g_strdup_printf ("%.0f %%", cmyk[1] * 100.0);
+ values[2] = g_strdup_printf ("%.0f %%", cmyk[2] * 100.0);
+ values[3] = g_strdup_printf ("%.0f %%", cmyk[3] * 100.0);
+ if (has_alpha)
+ values[4] = g_strdup_printf ("%.01f %%", frame->color.a * 100.0);
+ if (color_profile)
+ {
+ profile_label = gimp_color_profile_get_label (color_profile);
+ values[5] = g_strdup_printf (_("%s"), profile_label);
+ tooltip[5] = g_strdup_printf (_("%s"), profile_label);
+ }
+ }
+ }
break;
}
@@ -1082,44 +1165,37 @@ gimp_color_frame_update (GimpColorFrame *frame)
gtk_label_set_text (GTK_LABEL (frame->name_labels[i]), " ");
gtk_label_set_text (GTK_LABEL (frame->value_labels[i]), " ");
}
+
+ gtk_widget_set_tooltip_text (GTK_WIDGET (frame->value_labels[i]),
+ tooltip[i]);
}
g_strfreev (values);
}
static void
-gimp_color_frame_create_transform (GimpColorFrame *frame)
+gimp_color_frame_image_changed (GimpColorFrame *frame,
+ GimpImage *image,
+ GimpContext *context)
{
- if (frame->config)
- {
- GimpColorProfile *cmyk_profile;
+ g_return_if_fail (GIMP_IS_COLOR_FRAME (frame));
- cmyk_profile = gimp_color_config_get_cmyk_color_profile (frame->config,
- NULL);
+ if (image == frame->image)
+ return;
- if (cmyk_profile)
- {
- static GimpColorProfile *rgb_profile = NULL;
-
- if (G_UNLIKELY (! rgb_profile))
- rgb_profile = gimp_color_profile_new_rgb_srgb ();
-
- frame->transform =
- gimp_color_transform_new (rgb_profile,
- babl_format ("R'G'B' double"),
- cmyk_profile,
- babl_format ("CMYK double"),
- GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
- GIMP_COLOR_TRANSFORM_FLAGS_NOOPTIMIZE |
- GIMP_COLOR_TRANSFORM_FLAGS_BLACK_POINT_COMPENSATION);
- }
- }
+ gimp_color_frame_set_image (frame, image);
}
static void
-gimp_color_frame_destroy_transform (GimpColorFrame *frame)
+gimp_color_frame_update_simulation_profile (GimpImage *image,
+ GimpColorFrame *frame)
{
- g_clear_object (&frame->transform);
+ g_return_if_fail (GIMP_IS_COLOR_FRAME (frame));
- gimp_color_frame_update (frame);
-}
+ if (image && GIMP_IS_COLOR_FRAME (frame))
+ {
+ frame->view_profile = gimp_image_get_simulation_profile (image);
+
+ gimp_color_frame_update (frame);
+ }
+}
\ No newline at end of file
diff --git a/app/widgets/gimpcolorframe.h b/app/widgets/gimpcolorframe.h
index 90cb05b030..569794367c 100644
--- a/app/widgets/gimpcolorframe.h
+++ b/app/widgets/gimpcolorframe.h
@@ -19,7 +19,7 @@
#define __GIMP_COLOR_FRAME_H__
-#define GIMP_COLOR_FRAME_ROWS 5
+#define GIMP_COLOR_FRAME_ROWS 6
#define GIMP_TYPE_COLOR_FRAME (gimp_color_frame_get_type ())
@@ -36,6 +36,8 @@ struct _GimpColorFrame
{
GimpFrame parent_instance;
+ Gimp *gimp;
+
gboolean sample_valid;
gboolean sample_average;
const Babl *sample_format;
@@ -65,8 +67,10 @@ struct _GimpColorFrame
PangoLayout *number_layout;
+ GimpImage *image;
+
GimpColorConfig *config;
- GimpColorTransform *transform;
+ GimpColorProfile *view_profile;
};
struct _GimpColorFrameClass
@@ -77,7 +81,7 @@ struct _GimpColorFrameClass
GType gimp_color_frame_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_color_frame_new (void);
+GtkWidget * gimp_color_frame_new (Gimp *gimp);
void gimp_color_frame_set_mode (GimpColorFrame *frame,
GimpColorPickMode mode);
@@ -107,5 +111,8 @@ void gimp_color_frame_set_invalid (GimpColorFrame *frame);
void gimp_color_frame_set_color_config (GimpColorFrame *frame,
GimpColorConfig *config);
+void gimp_color_frame_set_image (GimpColorFrame *frame,
+ GimpImage *image);
+
#endif /* __GIMP_COLOR_FRAME_H__ */
diff --git a/app/widgets/gimpsamplepointeditor.c b/app/widgets/gimpsamplepointeditor.c
index d84911b080..2600c89cc9 100644
--- a/app/widgets/gimpsamplepointeditor.c
+++ b/app/widgets/gimpsamplepointeditor.c
@@ -462,6 +462,7 @@ gimp_sample_point_editor_points_changed (GimpSamplePointEditor *editor)
editor->color_frames[i] =
g_object_new (GIMP_TYPE_COLOR_FRAME,
+ "gimp", GIMP (image_editor->image->gimp),
"mode", GIMP_COLOR_PICK_MODE_PIXEL,
"has-number", TRUE,
"number", i + 1,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]