[gimp] Bug 778571 - Add support to import/export layer color tags from/to psd files



commit 9b636ff79829b7161fa150cbbf8da869b8643ffd
Author: Juan Palacios <jpalaciosdev gmail com>
Date:   Mon Feb 13 19:25:02 2017 +0100

    Bug 778571 - Add support to import/export layer color tags from/to psd files
    
    Except GIMP's "brown" tag which is not supported by PS.

 plug-ins/file-psd/psd-layer-res-load.c |   32 +++++++++++
 plug-ins/file-psd/psd-load.c           |    5 ++
 plug-ins/file-psd/psd-save.c           |   13 +++++
 plug-ins/file-psd/psd-util.c           |   90 ++++++++++++++++++++++++++++++++
 plug-ins/file-psd/psd-util.h           |    4 ++
 plug-ins/file-psd/psd.h                |    1 +
 6 files changed, 145 insertions(+), 0 deletions(-)
---
diff --git a/plug-ins/file-psd/psd-layer-res-load.c b/plug-ins/file-psd/psd-layer-res-load.c
index dea554d..156c4bf 100644
--- a/plug-ins/file-psd/psd-layer-res-load.c
+++ b/plug-ins/file-psd/psd-layer-res-load.c
@@ -169,6 +169,11 @@ static gint     load_resource_lyid    (const PSDlayerres     *res_a,
                                        FILE                  *f,
                                        GError               **error);
 
+static gint     load_resource_lclr    (const PSDlayerres     *res_a,
+                                       PSDlayer              *lyr_a,
+                                       FILE                  *f,
+                                       GError               **error);
+
 static gint     load_resource_lsct    (const PSDlayerres     *res_a,
                                        PSDlayer              *lyr_a,
                                        FILE                  *f,
@@ -267,6 +272,9 @@ load_layer_resource (PSDlayerres  *res_a,
       else if (memcmp (res_a->key, PSD_LPRP_ID, 4) == 0)
        load_resource_lyid (res_a, lyr_a, f, error);
 
+      else if (memcmp (res_a->key, PSD_LPRP_COLOR, 4) == 0)
+       load_resource_lclr (res_a, lyr_a, f, error);
+
       else if (memcmp (res_a->key, PSD_LOTH_SECTION, 4) == 0)
        load_resource_lsct (res_a, lyr_a, f, error);
 
@@ -497,6 +505,30 @@ load_resource_lyid (const PSDlayerres  *res_a,
 }
 
 static gint
+load_resource_lclr (const PSDlayerres  *res_a,
+                    PSDlayer           *lyr_a,
+                    FILE               *f,
+                    GError            **error)
+{
+  /* Load layer sheet color code */
+  IFDBG(2) g_debug ("Process layer resource block %.4s: Sheet color",
+                    res_a->key);
+
+  if (fread (lyr_a->color_tag, 8, 1, f) < 1)
+    {
+      psd_set_error (feof (f), errno, error);
+      return -1;
+    }
+
+  /* Photoshop only uses color_tag[0] to store a color code */
+  lyr_a->color_tag[0] = GUINT16_FROM_BE(lyr_a->color_tag[0]);
+
+  IFDBG(3) g_debug ("Layer sheet color: %i", lyr_a->color_tag[0]);
+
+  return 0;
+}
+
+static gint
 load_resource_lsct (const PSDlayerres  *res_a,
                     PSDlayer           *lyr_a,
                     FILE               *f,
diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
index e7db2cd..15faaef 100644
--- a/plug-ins/file-psd/psd-load.c
+++ b/plug-ins/file-psd/psd-load.c
@@ -1603,6 +1603,11 @@ add_layers (gint32     image_id,
                   g_free (pixels);
                 }
             }
+
+          /* Set layer color tag */
+          gimp_item_set_color_tag(layer_id,
+                                  psd_to_gimp_layer_color_tag(lyr_a[lidx]->color_tag[0]));
+
           for (cidx = 0; cidx < lyr_a[lidx]->num_channels; ++cidx)
             if (lyr_chn[cidx])
               g_free (lyr_chn[cidx]);
diff --git a/plug-ins/file-psd/psd-save.c b/plug-ins/file-psd/psd-save.c
index ee540c5..c7fbcbc 100644
--- a/plug-ins/file-psd/psd-save.c
+++ b/plug-ins/file-psd/psd-save.c
@@ -73,6 +73,7 @@
 #include "libgimp/gimp.h"
 #include "libgimp/gimpui.h"
 
+#include "psd-util.h"
 #include "psd-save.h"
 
 #include "libgimp/stdplugins-intl.h"
@@ -1112,8 +1113,20 @@ save_layer_and_mask (FILE   *fd,
       write_pascalstring (fd, layerName, 4, "layer name");
       IFDBG printf ("\t\tLayer name: %s\n", layerName);
 
+      /* Additional layer information blocks */
+      /* Unicode layer name */
       write_datablock_luni(fd, layerName, "luni extra data block");
 
+      /* Layer color tag */
+      xfwrite (fd, "8BIMlclr", 8, "sheet color signature");
+      write_gint32 (fd, 8, "sheet color size");
+      write_gint16 (fd,
+                    gimp_to_psd_layer_color_tag(gimp_item_get_color_tag(PSDImageData.lLayers[i])),
+                    "sheet color code");
+      write_gint16 (fd, 0, "sheet color unused value");
+      write_gint16 (fd, 0, "sheet color unused value");
+      write_gint16 (fd, 0, "sheet color unused value");
+
       /* Write real length for: Extra data */
 
       eof_pos = ftell (fd);
diff --git a/plug-ins/file-psd/psd-util.c b/plug-ins/file-psd/psd-util.c
index ce73af8..cada46f 100644
--- a/plug-ins/file-psd/psd-util.c
+++ b/plug-ins/file-psd/psd-util.c
@@ -1019,3 +1019,93 @@ gimp_layer_mode_effects_name (GimpLayerMode mode)
   err_name = g_strdup_printf ("UNKNOWN (%d)", mode);
   return err_name;
 }
+
+GimpColorTag
+psd_to_gimp_layer_color_tag (guint16 layer_color_tag)
+{
+  GimpColorTag colorTag;
+
+  switch (layer_color_tag)
+    {
+    case 1:
+      colorTag = GIMP_COLOR_TAG_RED;
+      break;
+
+    case 2:
+      colorTag = GIMP_COLOR_TAG_ORANGE;
+      break;
+
+    case 3:
+      colorTag = GIMP_COLOR_TAG_YELLOW;
+      break;
+
+    case 4:
+      colorTag = GIMP_COLOR_TAG_GREEN;
+      break;
+
+    case 5:
+      colorTag = GIMP_COLOR_TAG_BLUE;
+      break;
+
+    case 6:
+      colorTag = GIMP_COLOR_TAG_VIOLET;
+      break;
+
+    case 7:
+      colorTag = GIMP_COLOR_TAG_GRAY;
+      break;
+
+    default:
+      if (CONVERSION_WARNINGS)
+        g_message ("Unsupported Photoshop layer color tag: %i. GIMP layer color tag set to none.",
+                       layer_color_tag);
+      colorTag = GIMP_COLOR_TAG_NONE;
+    }
+
+  return colorTag;
+}
+
+guint16
+gimp_to_psd_layer_color_tag (GimpColorTag layer_color_tag)
+{
+  guint16 color_tag;
+
+  switch (layer_color_tag)
+    {
+    case GIMP_COLOR_TAG_RED:
+        color_tag = 1;
+      break;
+
+    case GIMP_COLOR_TAG_ORANGE:
+        color_tag = 2;
+      break;
+
+    case GIMP_COLOR_TAG_YELLOW:
+        color_tag = 3;
+      break;
+
+    case GIMP_COLOR_TAG_GREEN:
+        color_tag = 4;
+      break;
+
+    case GIMP_COLOR_TAG_BLUE:
+        color_tag = 5;
+      break;
+
+    case GIMP_COLOR_TAG_VIOLET:
+        color_tag = 6;
+      break;
+
+    case GIMP_COLOR_TAG_GRAY:
+        color_tag = 7;
+      break;
+
+    default:
+      if (CONVERSION_WARNINGS)
+        g_message ("Photoshop doesn't support GIMP layer color tag: %i. Photoshop layer color tag set to 
none.",
+                   layer_color_tag);
+        color_tag = 0;
+    }
+
+  return color_tag;
+}
diff --git a/plug-ins/file-psd/psd-util.h b/plug-ins/file-psd/psd-util.h
index f339080..e3d6c1d 100644
--- a/plug-ins/file-psd/psd-util.h
+++ b/plug-ins/file-psd/psd-util.h
@@ -81,4 +81,8 @@ GimpLayerMode           psd_to_gimp_blend_mode (const gchar            *psd_mode
 gchar *                 gimp_to_psd_blend_mode (GimpLayerMode           layer_mode,
                                                 GimpLayerCompositeMode  layer_composite);
 
+GimpColorTag            psd_to_gimp_layer_color_tag (guint16 layer_color_tag);
+
+guint16                 gimp_to_psd_layer_color_tag (GimpColorTag layer_color_tag);
+
 #endif /* __PSD_UTIL_H__ */
diff --git a/plug-ins/file-psd/psd.h b/plug-ins/file-psd/psd.h
index 6002cb5..48bf767 100644
--- a/plug-ins/file-psd/psd.h
+++ b/plug-ins/file-psd/psd.h
@@ -585,6 +585,7 @@ typedef struct
   PSDText               text;                   /* PSD text */
   guint32               id;                     /* Layer ID (Tattoo) */
   guchar                group_type;             /* 0 -> not a group; 1 -> open folder; 2 -> closed folder; 3 
-> end of group */
+  guint16               color_tag[4];           /* 4 * 16 bit color components */
 } PSDlayer;
 
 /* PSD Channel data structure */


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