[gimp] Bug 320447 - fast switching between "color managed display" and "softproof"



commit a28778475f8c2fecb5961ccb5c0afe98c4037db9
Author: Michael Natterer <mitch gimp org>
Date:   Mon May 16 13:27:59 2016 +0200

    Bug 320447 - fast switching between "color managed display" and "softproof"
    
    Add rendering intent, black point compensation and gammut warning menu
    items to View -> Color Management. They set the respective values of
    the active color management mode, so both "color managed display" and
    "print simulation" are almost completely configurable per-display
    now. Setting the simulation profile is still missing.

 app/actions/view-actions.c              |  109 +++++++++++++++++++++++++++++--
 app/actions/view-commands.c             |  103 +++++++++++++++++++++++++++++
 app/actions/view-commands.h             |    8 ++
 app/display/gimpdisplayshell-handlers.c |    7 ++-
 app/display/gimpdisplayshell-profile.c  |   66 +++++++++++++++++-
 menus/image-menu.xml.in                 |    8 ++
 6 files changed, 290 insertions(+), 11 deletions(-)
---
diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c
index bf6cff0..b858eb6 100644
--- a/app/actions/view-actions.c
+++ b/app/actions/view-actions.c
@@ -162,6 +162,21 @@ static const GimpToggleActionEntry view_toggle_actions[] =
     TRUE,
     GIMP_HELP_VIEW_DOT_FOR_DOT },
 
+  { "view-color-management-black-point-compensation", NULL,
+    NC_("view-action", "_Black Point Compensation"), NULL,
+    NC_("view-action", "Use black point compentation"),
+    G_CALLBACK (view_color_management_bpc_cmd_callback),
+    TRUE,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
+  { "view-color-management-gamut-check", NULL,
+    NC_("view-action", "_Mark Out Of Gamut Colors"), NULL,
+    NC_("view-action", "When softproofing, mark colors which cannot "
+        "be represented in the target color space"),
+    G_CALLBACK (view_color_management_gamut_check_cmd_callback),
+    FALSE,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
   { "view-show-selection", NULL,
     NC_("view-action", "Show _Selection"), "<primary>T",
     NC_("view-action", "Display the selection outline"),
@@ -490,6 +505,33 @@ static const GimpRadioActionEntry view_color_management_mode_actions[] =
     GIMP_HELP_VIEW_COLOR_MANAGEMENT }
 };
 
+static const GimpRadioActionEntry view_color_management_intent_actions[] =
+{
+  { "view-color-management-intent-perceptual", NULL,
+    NC_("view-action", "_Perceptual"), NULL,
+    NC_("view-action", "Rendering intent is percptual"),
+    GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
+  { "view-color-management-intent-relative-colorimetric", NULL,
+    NC_("view-action", "_Relative Colorimetric"), NULL,
+    NC_("view-action", "Rendering intent is relative colorimetic"),
+    GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
+  { "view-color-management-intent-saturation", NULL,
+    NC_("view-action", "_Saturation"), NULL,
+    NC_("view-action", "Rendering intent is saturation"),
+    GIMP_COLOR_RENDERING_INTENT_SATURATION,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT },
+
+  { "view-color-management-intent-absolute-colorimetric", NULL,
+    NC_("view-action", "_Absolute Colorimetric"), NULL,
+    NC_("view-action", "Rendering intent is absolute colorimetic"),
+    GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC,
+    GIMP_HELP_VIEW_COLOR_MANAGEMENT }
+};
+
 static const GimpEnumActionEntry view_padding_color_actions[] =
 {
   { "view-padding-color-theme", NULL,
@@ -647,6 +689,13 @@ view_actions_setup (GimpActionGroup *group)
                                        GIMP_COLOR_MANAGEMENT_DISPLAY,
                                        G_CALLBACK (view_color_management_mode_cmd_callback));
 
+  gimp_action_group_add_radio_actions (group, "view-action",
+                                       view_color_management_intent_actions,
+                                       G_N_ELEMENTS (view_color_management_intent_actions),
+                                       NULL,
+                                       GIMP_COLOR_MANAGEMENT_DISPLAY,
+                                       G_CALLBACK (view_color_management_intent_cmd_callback));
+
   gimp_action_group_add_enum_actions (group, "view-padding-color",
                                       view_padding_color_actions,
                                       G_N_ELEMENTS (view_padding_color_actions),
@@ -703,11 +752,15 @@ view_actions_update (GimpActionGroup *group,
   gboolean            revert_enabled    = FALSE;   /* able to revert zoom? */
   gboolean            flip_horizontally = FALSE;
   gboolean            flip_vertically   = FALSE;
+  gboolean            cm                = FALSE;
+  gboolean            sp                = FALSE;
 
   if (display)
     {
-      GimpImageWindow *window;
-      const gchar     *action = NULL;
+      GimpImageWindow          *window;
+      GimpColorRenderingIntent  intent = GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL;
+      gboolean                  bpc    = TRUE;
+      const gchar              *action = NULL;
 
       image  = gimp_display_get_image (display);
       shell  = gimp_display_get_shell (display);
@@ -735,13 +788,51 @@ view_actions_update (GimpActionGroup *group,
 
         case GIMP_COLOR_MANAGEMENT_DISPLAY:
           action = "view-color-management-mode-display";
+          intent = color_config->display_intent;
+          bpc    = color_config->display_use_black_point_compensation;
+
+          cm = TRUE;
           break;
+
         case GIMP_COLOR_MANAGEMENT_SOFTPROOF:
           action = "view-color-management-mode-softproof";
+          intent = color_config->simulation_intent;
+          bpc    = color_config->simulation_use_black_point_compensation;
+
+          cm = TRUE;
+          sp = TRUE;
+          break;
+        }
+
+      gimp_action_group_set_action_active (group, action, TRUE);
+
+      switch (intent)
+        {
+        case GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL:
+          action = "view-color-management-intent-perceptual";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC:
+          action = "view-color-management-intent-relative-colorimetric";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_SATURATION:
+          action = "view-color-management-intent-saturation";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC:
+          action = "view-color-management-intent-absolute-colorimetric";
           break;
         }
 
       gimp_action_group_set_action_active (group, action, TRUE);
+
+      gimp_action_group_set_action_active (group,
+                                           "view-color-management-black-point-compensation",
+                                           bpc);
+      gimp_action_group_set_action_active (group,
+                                           "view-color-management-gamut-check",
+                                           color_config->simulation_gamut_check);
     }
 
 #define SET_ACTIVE(action,condition) \
@@ -825,10 +916,16 @@ view_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("view-navigation-window", image);
   SET_SENSITIVE ("view-display-filters",   image);
 
-  SET_SENSITIVE ("view-color-management-mode-off",       image);
-  SET_SENSITIVE ("view-color-management-mode-display",   image);
-  SET_SENSITIVE ("view-color-management-mode-softproof", image);
-  SET_SENSITIVE ("view-color-management-reset",          image);
+  SET_SENSITIVE ("view-color-management-mode-off",                     image);
+  SET_SENSITIVE ("view-color-management-mode-display",                 image);
+  SET_SENSITIVE ("view-color-management-mode-softproof",               image);
+  SET_SENSITIVE ("view-color-management-intent-perceptual",            cm);
+  SET_SENSITIVE ("view-color-management-intent-relative-colorimetric", cm);
+  SET_SENSITIVE ("view-color-management-intent-saturation",            cm);
+  SET_SENSITIVE ("view-color-management-intent-absolute-colorimetric", cm);
+  SET_SENSITIVE ("view-color-management-black-point-compensation",     cm);
+  SET_SENSITIVE ("view-color-management-gamut-check",                  sp);
+  SET_SENSITIVE ("view-color-management-reset",                        image);
 
   SET_SENSITIVE ("view-show-selection",      image);
   SET_ACTIVE    ("view-show-selection",      display && options->show_selection);
diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c
index 2041074..d581f9b 100644
--- a/app/actions/view-commands.c
+++ b/app/actions/view-commands.c
@@ -528,6 +528,109 @@ view_color_management_mode_cmd_callback (GtkAction *action,
 }
 
 void
+view_color_management_intent_cmd_callback (GtkAction *action,
+                                           GtkAction *current,
+                                           gpointer   data)
+{
+  GimpDisplayShell          *shell;
+  GimpColorConfig           *color_config;
+  GimpColorRenderingIntent   value;
+  return_if_no_shell (shell, data);
+
+  color_config = gimp_display_shell_get_color_config (shell);
+
+  value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+
+  switch (color_config->mode)
+    {
+    case GIMP_COLOR_MANAGEMENT_DISPLAY:
+      if (value != color_config->display_intent)
+        {
+          g_object_set (color_config,
+                        "display-rendering-intent", value,
+                        NULL);
+          shell->color_config_set = TRUE;
+        }
+      break;
+
+    case GIMP_COLOR_MANAGEMENT_SOFTPROOF:
+      if (value != color_config->simulation_intent)
+        {
+          g_object_set (color_config,
+                        "simulation-rendering-intent", value,
+                        NULL);
+          shell->color_config_set = TRUE;
+        }
+      break;
+
+    default:
+      break;
+    }
+}
+
+void
+view_color_management_bpc_cmd_callback (GtkAction *action,
+                                        gpointer   data)
+{
+  GimpDisplayShell *shell;
+  GimpColorConfig  *color_config;
+  gboolean          active;
+  return_if_no_shell (shell, data);
+
+  color_config = gimp_display_shell_get_color_config (shell);
+
+  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  switch (color_config->mode)
+    {
+    case GIMP_COLOR_MANAGEMENT_DISPLAY:
+      if (active != color_config->display_use_black_point_compensation)
+        {
+          g_object_set (color_config,
+                        "display-use-black-point-compensation", active,
+                        NULL);
+          shell->color_config_set = TRUE;
+        }
+      break;
+
+    case GIMP_COLOR_MANAGEMENT_SOFTPROOF:
+      if (active != color_config->simulation_use_black_point_compensation)
+        {
+          g_object_set (color_config,
+                        "simulation-use-black-point-compensation", active,
+                        NULL);
+          shell->color_config_set = TRUE;
+        }
+      break;
+
+    default:
+      break;
+    }
+}
+
+void
+view_color_management_gamut_check_cmd_callback (GtkAction *action,
+                                                gpointer   data)
+{
+  GimpDisplayShell *shell;
+  GimpColorConfig  *color_config;
+  gboolean          active;
+  return_if_no_shell (shell, data);
+
+  color_config = gimp_display_shell_get_color_config (shell);
+
+  active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  if (active != color_config->simulation_gamut_check)
+    {
+      g_object_set (color_config,
+                    "simulation-gamut-check", active,
+                    NULL);
+      shell->color_config_set = TRUE;
+    }
+}
+
+void
 view_toggle_selection_cmd_callback (GtkAction *action,
                                     gpointer   data)
 {
diff --git a/app/actions/view-commands.h b/app/actions/view-commands.h
index 3af3289..a8c0f02 100644
--- a/app/actions/view-commands.h
+++ b/app/actions/view-commands.h
@@ -74,6 +74,14 @@ void   view_color_management_reset_cmd_callback (GtkAction *action,
 void   view_color_management_mode_cmd_callback  (GtkAction *action,
                                                  GtkAction *current,
                                                  gpointer   data);
+void   view_color_management_intent_cmd_callback(GtkAction *action,
+                                                 GtkAction *current,
+                                                 gpointer   data);
+void   view_color_management_bpc_cmd_callback   (GtkAction *action,
+                                                 gpointer   data);
+void   view_color_management_gamut_check_cmd_callback
+                                                (GtkAction *action,
+                                                 gpointer   data);
 
 void   view_toggle_selection_cmd_callback       (GtkAction *action,
                                                  gpointer   data);
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index 42ead42..8fe8836 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -1126,7 +1126,12 @@ gimp_display_shell_color_config_notify_handler (GObject          *config,
     {
       gboolean copy = TRUE;
 
-      if (! strcmp (param_spec->name, "mode"))
+      if (! strcmp (param_spec->name, "mode")                                 ||
+          ! strcmp (param_spec->name, "display-rendering-intent")             ||
+          ! strcmp (param_spec->name, "display-use-black-point-compensation") ||
+          ! strcmp (param_spec->name, "simulation-rendering-intent")          ||
+          ! strcmp (param_spec->name, "simulation-use-black-point-compensation") ||
+          ! strcmp (param_spec->name, "simulation-gamut-check"))
         {
           if (shell->color_config_set)
             copy = FALSE;
diff --git a/app/display/gimpdisplayshell-profile.c b/app/display/gimpdisplayshell-profile.c
index 190ecdf..139b2d7 100644
--- a/app/display/gimpdisplayshell-profile.c
+++ b/app/display/gimpdisplayshell-profile.c
@@ -250,25 +250,83 @@ gimp_display_shell_color_config_notify (GimpColorConfig  *config,
                                         const GParamSpec *pspec,
                                         GimpDisplayShell *shell)
 {
-  if (! strcmp (pspec->name, "mode"))
+  if (! strcmp (pspec->name, "mode")                                    ||
+      ! strcmp (pspec->name, "display-rendering-intent")                ||
+      ! strcmp (pspec->name, "display-use-black-point-compensation")    ||
+      ! strcmp (pspec->name, "simulation-rendering-intent")             ||
+      ! strcmp (pspec->name, "simulation-use-black-point-compensation") ||
+      ! strcmp (pspec->name, "simulation-gamut-check"))
     {
-      const gchar *action = NULL;
+      GimpColorRenderingIntent intent  = GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL;
+      gboolean                 managed = TRUE;
+      gboolean                 bpc     = TRUE;
+      const gchar             *action  = NULL;
+
+#define SET_SENSITIVE(action, sensitive) \
+      gimp_display_shell_set_action_sensitive (shell, action, sensitive);
+
+#define SET_ACTIVE(action, active) \
+      gimp_display_shell_set_action_active (shell, action, active);
 
       switch (config->mode)
         {
         case GIMP_COLOR_MANAGEMENT_OFF:
-          action = "view-color-management-mode-off";
+          action  = "view-color-management-mode-off";
+          managed = FALSE;
           break;
 
         case GIMP_COLOR_MANAGEMENT_DISPLAY:
           action = "view-color-management-mode-display";
+          intent = config->display_intent;
+          bpc    = config->display_use_black_point_compensation;
           break;
+
         case GIMP_COLOR_MANAGEMENT_SOFTPROOF:
           action = "view-color-management-mode-softproof";
+          intent = config->simulation_intent;
+          bpc    = config->simulation_use_black_point_compensation;
           break;
         }
 
-      gimp_display_shell_set_action_active (shell, action, TRUE);
+      SET_ACTIVE (action, TRUE);
+
+      switch (intent)
+        {
+        case GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL:
+          action = "view-color-management-intent-perceptual";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC:
+          action = "view-color-management-intent-relative-colorimetric";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_SATURATION:
+          action = "view-color-management-intent-saturation";
+          break;
+
+        case GIMP_COLOR_RENDERING_INTENT_ABSOLUTE_COLORIMETRIC:
+          action = "view-color-management-intent-absolute-colorimetric";
+          break;
+        }
+
+      SET_SENSITIVE ("view-color-management-intent-perceptual",
+                     managed);
+      SET_SENSITIVE ("view-color-management-intent-relative-colorimetric",
+                     managed);
+      SET_SENSITIVE ("view-color-management-intent-saturation",
+                     managed);
+      SET_SENSITIVE ("view-color-management-intent-absolute-colorimetric",
+                     managed);
+
+      SET_ACTIVE (action, TRUE);
+
+      SET_SENSITIVE ("view-color-management-black-point-compensation", managed);
+      SET_ACTIVE    ("view-color-management-black-point-compensation", bpc);
+
+      SET_SENSITIVE ("view-color-management-gamut-check",
+                     config->mode == GIMP_COLOR_MANAGEMENT_SOFTPROOF);
+      SET_ACTIVE    ("view-color-management-gamut-check",
+                     config->simulation_gamut_check);
     }
 
   gimp_color_managed_profile_changed (GIMP_COLOR_MANAGED (shell));
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 9e7c8c1..f9f5a3b 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -306,6 +306,14 @@
         <menuitem action="view-color-management-mode-display" />
         <menuitem action="view-color-management-mode-softproof" />
         <separator />
+        <menuitem action="view-color-management-intent-perceptual" />
+        <menuitem action="view-color-management-intent-relative-colorimetric" />
+        <menuitem action="view-color-management-intent-saturation" />
+        <menuitem action="view-color-management-intent-absolute-colorimetric" />
+        <separator />
+        <menuitem action="view-color-management-black-point-compensation" />
+        <menuitem action="view-color-management-gamut-check" />
+        <separator />
         <menuitem action="view-color-management-reset" />
       </menu>
       <separator />


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]