[gimp] Bug 778571 - Add support to import/export layer color tags from/to psd files
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 778571 - Add support to import/export layer color tags from/to psd files
- Date: Mon, 13 Feb 2017 20:33:20 +0000 (UTC)
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]