[gimp] Converting CMYK sample points to babl process



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]