[gimp] plug-ins: add support for loading 16-bit per channel CMYK PSD images



commit c6243bf295e710b70a7b285470187b0738a9cb4c
Author: Jacob Boerema <jgboerema gmail com>
Date:   Wed Nov 10 22:41:42 2021 -0500

    plug-ins: add support for loading 16-bit per channel CMYK PSD images

 plug-ins/file-psd/psd-load.c | 72 ++++++++++++++++++++++++++++++++------------
 1 file changed, 52 insertions(+), 20 deletions(-)
---
diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
index c19ce8c0a3..457913cc8c 100644
--- a/plug-ins/file-psd/psd-load.c
+++ b/plug-ins/file-psd/psd-load.c
@@ -379,7 +379,8 @@ read_header_block (PSDimage      *img_a,
 
   if (img_a->color_mode == PSD_CMYK || img_a->color_mode == PSD_LAB)
     {
-      if (img_a->bps != 8)
+      if (img_a->bps != 8 &&
+         (img_a->bps != 16 || img_a->color_mode == PSD_LAB))
         {
           g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
                        _("Unsupported color mode: %s"),
@@ -1263,7 +1264,10 @@ create_gimp_image (PSDimage *img_a,
         break;
 
       case 16:
-        precision = GIMP_PRECISION_U16_NON_LINEAR;
+        if (img_a->color_mode == PSD_CMYK)
+          precision = GIMP_PRECISION_FLOAT_NON_LINEAR;
+        else
+          precision = GIMP_PRECISION_U16_NON_LINEAR;
         break;
 
       case 8:
@@ -1382,40 +1386,58 @@ psd_convert_cmyk_to_srgb (PSDimage *img_a,
     {
       if (alpha)
         {
+          const Babl *psd_format;
+
+          if (img_a->bps == 8)
+            psd_format = babl_format ("cmykA u8");
+          else
+            psd_format = babl_format ("cmykA u16");
+
           if (! img_a->cmyk_transform_alpha)
             {
               GimpColorProfile *srgb = gimp_color_profile_new_rgb_srgb ();
 
-              img_a->cmyk_transform_alpha = gimp_color_transform_new (img_a->cmyk_profile, babl_format 
("cmykA u8"),
-                                                                      srgb, babl_format ("R'G'B'A float"),
+              img_a->cmyk_transform_alpha = gimp_color_transform_new (img_a->cmyk_profile,
+                                                                      psd_format,
+                                                                      srgb,
+                                                                      babl_format ("R'G'B'A float"),
                                                                       0, 0);
 
               g_object_unref (srgb);
             }
 
-        gimp_color_transform_process_pixels (img_a->cmyk_transform_alpha,
-                                             babl_format ("cmykA u8"),
-                                             src,
-                                             babl_format ("R'G'B'A float"),
-                                             dst,
-                                             width * height);
+          gimp_color_transform_process_pixels (img_a->cmyk_transform_alpha,
+                                               psd_format,
+                                               src,
+                                               babl_format ("R'G'B'A float"),
+                                               dst,
+                                               width * height);
         }
       else
         {
+          const Babl *psd_format;
+
+          if (img_a->bps == 8)
+            psd_format = babl_format ("cmyk u8");
+          else
+            psd_format = babl_format ("cmyk u16");
+
           if (! img_a->cmyk_transform)
             {
               GimpColorProfile *srgb = gimp_color_profile_new_rgb_srgb ();
 
-              img_a->cmyk_transform = gimp_color_transform_new (img_a->cmyk_profile, babl_format ("cmyk u8"),
-                                                                      srgb, babl_format ("R'G'B' float"),
-                                                                      0, 0);
+              img_a->cmyk_transform = gimp_color_transform_new (img_a->cmyk_profile,
+                                                                psd_format,
+                                                                srgb,
+                                                                babl_format ("R'G'B' float"),
+                                                                0, 0);
 
 
               g_object_unref (srgb);
             }
 
           gimp_color_transform_process_pixels (img_a->cmyk_transform,
-                                               babl_format ("cmyk u8"),
+                                               psd_format,
                                                src,
                                                babl_format ("R'G'B' float"),
                                                dst,
@@ -1427,9 +1449,19 @@ psd_convert_cmyk_to_srgb (PSDimage *img_a,
       const Babl *fish;
 
       if (alpha)
-        fish = babl_fish ("cmykA u8", "R'G'B'A float");
-      else
-        fish = babl_fish ("cmyk u8", "R'G'B' float");
+        {
+          if (img_a->bps == 8)
+            fish = babl_fish ("cmykA u8", "R'G'B'A float");
+          else
+            fish = babl_fish ("cmykA u16", "R'G'B'A float");
+        }
+       else
+        {
+          if (img_a->bps == 8)
+            fish = babl_fish ("cmyk u8", "R'G'B' float");
+          else
+            fish = babl_fish ("cmyk u16", "R'G'B'A float");
+        }
 
       babl_process (fish, src, dst, width * height);
     }
@@ -1975,7 +2007,7 @@ add_layers (GimpImage     *image,
 
                           if (img_a->color_mode == PSD_CMYK || img_a->color_mode == PSD_LAB)
                             {
-                              dst0 = gegl_scratch_alloc (layer_channels *
+                              dst0 = gegl_scratch_alloc (layer_channels * bps *
                                                          iter->length);
                             }
 
@@ -2925,7 +2957,7 @@ get_layer_format (PSDimage *img_a,
           break;
 
         case 16:
-          format = babl_format ("R'G'B' u16");
+          format = babl_format (img_a->color_mode == PSD_CMYK ? "R'G'B' float" : "R'G'B' u16");
           break;
 
         case 8:
@@ -2948,7 +2980,7 @@ get_layer_format (PSDimage *img_a,
           break;
 
         case 16:
-          format = babl_format ("R'G'B'A u16");
+          format = babl_format (img_a->color_mode == PSD_CMYK ? "R'G'B'A float" : "R'G'B'A u16");
           break;
 
         case 8:


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