[gimp] app: clean up most "non-linear" vs. "perceptual" confusion



commit eec1df23a54287261788d1f07887c4c180f975ee
Author: Michael Natterer <mitch gimp org>
Date:   Fri May 31 16:48:19 2019 +0200

    app: clean up most "non-linear" vs. "perceptual" confusion
    
    There should never be an image using GIMP_TRC_PERCEPTUAL, but things
    should work if one is encountered anyway.
    
    In the Image -> Precision menu and the Convert Precision dialog, have
    menu items / radio buttons for both non-linear and perceptual, but
    hide the perceptual choice unless the image is in perceptual TRC mode.
    
    This should eliminate the possibility to create perceptual TRC images
    from the GUI.

 app/actions/image-actions.c            | 81 +++++++++++++++++++++-------------
 app/dialogs/convert-precision-dialog.c |  7 ++-
 menus/image-menu.xml.in                |  3 +-
 3 files changed, 59 insertions(+), 32 deletions(-)
---
diff --git a/app/actions/image-actions.c b/app/actions/image-actions.c
index fc290e636f..7a531e7c03 100644
--- a/app/actions/image-actions.c
+++ b/app/actions/image-actions.c
@@ -246,17 +246,23 @@ static const GimpRadioActionEntry image_convert_precision_actions[] =
 
 static const GimpRadioActionEntry image_convert_trc_actions[] =
 {
-  { "image-convert-gamma", NULL,
-    NC_("image-convert-action", "Perceptual gamma (sRGB)"), NULL,
-    NC_("image-convert-action",
-        "Convert the image to perceptual (sRGB) gamma"),
-    GIMP_TRC_NON_LINEAR, GIMP_HELP_IMAGE_CONVERT_GAMMA },
-
   { "image-convert-linear", NULL,
     NC_("image-convert-action", "Linear light"), NULL,
     NC_("image-convert-action",
         "Convert the image to linear light"),
-    GIMP_TRC_LINEAR, GIMP_HELP_IMAGE_CONVERT_GAMMA }
+    GIMP_TRC_LINEAR, GIMP_HELP_IMAGE_CONVERT_GAMMA },
+
+  { "image-convert-non-linear", NULL,
+    NC_("image-convert-action", "Non-Linear"), NULL,
+    NC_("image-convert-action",
+        "Convert the image to non-linear gamma from the color profile"),
+    GIMP_TRC_NON_LINEAR, GIMP_HELP_IMAGE_CONVERT_GAMMA },
+
+  { "image-convert-perceptual", NULL,
+    NC_("image-convert-action", "Perceptual (sRGB)"), NULL,
+    NC_("image-convert-action",
+        "Convert the image to perceptual (sRGB) gamma"),
+    GIMP_TRC_PERCEPTUAL, GIMP_HELP_IMAGE_CONVERT_GAMMA }
 };
 
 static const GimpEnumActionEntry image_flip_actions[] =
@@ -361,6 +367,15 @@ image_actions_update (GimpActionGroup *group,
   gboolean   profile_hidden = FALSE;
   gboolean   profile        = FALSE;
 
+#define SET_LABEL(action,label) \
+        gimp_action_group_set_action_label (group, action, (label))
+#define SET_SENSITIVE(action,condition) \
+        gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
+#define SET_ACTIVE(action,condition) \
+        gimp_action_group_set_action_active (group, action, (condition) != 0)
+#define SET_VISIBLE(action,condition) \
+        gimp_action_group_set_action_visible (group, action, (condition) != 0)
+
   if (image)
     {
       GimpContainer     *layers;
@@ -368,10 +383,13 @@ image_actions_update (GimpActionGroup *group,
       GimpImageBaseType  base_type;
       GimpPrecision      precision;
       GimpComponentType  component_type;
+      GimpTRCType        trc;
 
       base_type      = gimp_image_get_base_type (image);
       precision      = gimp_image_get_precision (image);
       component_type = gimp_image_get_component_type (image);
+      trc            = gimp_babl_format_get_trc
+                         (gimp_image_get_layer_format (image, FALSE));
 
       switch (base_type)
         {
@@ -380,7 +398,7 @@ image_actions_update (GimpActionGroup *group,
         case GIMP_INDEXED: action = "image-convert-indexed";   break;
         }
 
-      gimp_action_group_set_action_active (group, action, TRUE);
+      SET_ACTIVE (action, TRUE);
 
       switch (component_type)
         {
@@ -392,21 +410,28 @@ image_actions_update (GimpActionGroup *group,
         case GIMP_COMPONENT_TYPE_DOUBLE: action = "image-convert-double"; break;
         }
 
-      gimp_action_group_set_action_active (group, action, TRUE);
+      SET_ACTIVE (action, TRUE);
 
-      if (gimp_babl_format_get_trc (gimp_image_get_layer_format (image,
-                                                                 FALSE)) ==
-          GIMP_TRC_LINEAR)
+      switch (trc)
         {
-          gimp_action_group_set_action_active (group, "image-convert-linear",
-                                               TRUE);
-        }
-      else
-        {
-          gimp_action_group_set_action_active (group, "image-convert-gamma",
-                                               TRUE);
+        case GIMP_TRC_LINEAR:
+          action = "image-convert-linear";
+          SET_VISIBLE ("image-convert-perceptual", FALSE);
+          break;
+
+        case GIMP_TRC_NON_LINEAR:
+          action = "image-convert-non-linear";
+          SET_VISIBLE ("image-convert-perceptual", FALSE);
+          break;
+
+        case GIMP_TRC_PERCEPTUAL:
+          action = "image-convert-perceptual";
+          SET_VISIBLE ("image-convert-perceptual", TRUE);
+          break;
         }
 
+      SET_ACTIVE (action, TRUE);
+
       is_indexed  = (base_type == GIMP_INDEXED);
       is_u8_gamma = (precision == GIMP_PRECISION_U8_NON_LINEAR);
       is_double   = (component_type == GIMP_COMPONENT_TYPE_DOUBLE);
@@ -421,15 +446,10 @@ image_actions_update (GimpActionGroup *group,
       profile_srgb = gimp_image_get_use_srgb_profile (image, &profile_hidden);
       profile      = (gimp_image_get_color_profile (image) != NULL);
     }
-
-#define SET_LABEL(action,label) \
-        gimp_action_group_set_action_label (group, action, (label))
-#define SET_SENSITIVE(action,condition) \
-        gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
-#define SET_ACTIVE(action,condition) \
-        gimp_action_group_set_action_active (group, action, (condition) != 0)
-#define SET_VISIBLE(action,condition) \
-        gimp_action_group_set_action_visible (group, action, (condition) != 0)
+  else
+    {
+      SET_VISIBLE ("image-convert-perceptual", FALSE);
+    }
 
   SET_SENSITIVE ("image-duplicate", image);
 
@@ -460,8 +480,9 @@ image_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("image-convert-double", image && !is_indexed);
   SET_VISIBLE   ("image-convert-double", is_double);
 
-  SET_SENSITIVE ("image-convert-gamma",  image);
-  SET_SENSITIVE ("image-convert-linear", image && !is_indexed);
+  SET_SENSITIVE ("image-convert-linear",     image && !is_indexed);
+  SET_SENSITIVE ("image-convert-non-linear", image);
+  SET_SENSITIVE ("image-convert-perceptual", image && !is_indexed);
 
   SET_SENSITIVE ("image-color-profile-use-srgb", image && (profile || profile_hidden));
   SET_ACTIVE    ("image-color-profile-use-srgb", image && profile_srgb);
diff --git a/app/dialogs/convert-precision-dialog.c b/app/dialogs/convert-precision-dialog.c
index f65408849b..2d84b5ed0c 100644
--- a/app/dialogs/convert-precision-dialog.c
+++ b/app/dialogs/convert-precision-dialog.c
@@ -81,6 +81,7 @@ convert_precision_dialog_new (GimpImage                    *image,
   GtkWidget     *main_vbox;
   GtkWidget     *vbox;
   GtkWidget     *frame;
+  GtkWidget     *perceptual_radio;
   const gchar   *enum_desc;
   gchar         *blurb;
   const Babl    *old_format;
@@ -209,9 +210,13 @@ convert_precision_dialog_new (GimpImage                    *image,
                                    GIMP_TRC_NON_LINEAR, NULL,
 
                                    _("Perceptual (sRGB)"),
-                                   GIMP_TRC_PERCEPTUAL, NULL,
+                                   GIMP_TRC_PERCEPTUAL, &perceptual_radio,
 
                                    NULL);
+
+  if (private->trc != GIMP_TRC_PERCEPTUAL)
+    gtk_widget_hide (perceptual_radio);
+
   gtk_container_add (GTK_CONTAINER (frame), vbox);
   gtk_widget_show (vbox);
 
diff --git a/menus/image-menu.xml.in b/menus/image-menu.xml.in
index 7c63730a38..48a4a70558 100644
--- a/menus/image-menu.xml.in
+++ b/menus/image-menu.xml.in
@@ -377,8 +377,9 @@
         <menuitem action="image-convert-float" />
         <menuitem action="image-convert-double" />
         <separator />
-        <menuitem action="image-convert-gamma" />
         <menuitem action="image-convert-linear" />
+        <menuitem action="image-convert-non-linear" />
+        <menuitem action="image-convert-perceptual" />
         <separator />
       </menu>
       <menu action="image-color-management-menu" name="Color Management">


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