1
1
mirror of https://gitlab.gnome.org/GNOME/gimp.git synced 2025-10-06 01:12:40 +02:00

Compare commits

...

1 Commits

Author SHA1 Message Date
Alx Sa
03864c6d63 plug-ins: Load image and layer PSD metadata together
TIFFs can store both image and layer PSD metadata.
Since some aspects of the layers rely on PSD
image metadata (like which layers are selected), it
makes sense to load both at once.
This patch adds support in the PSD metadata loader
to process both image and layer resources in one call,
and updates the TIFF plug-in to use this feature.
2025-04-20 14:27:30 +00:00
4 changed files with 68 additions and 58 deletions

View File

@@ -326,6 +326,7 @@ load_image (GFile *file,
/* Loading metadata for external file formats */
GimpImage *
load_image_metadata (GFile *file,
GFile *layer_file,
gint data_length,
GimpImage *image,
gboolean for_layers,
@@ -367,7 +368,7 @@ load_image_metadata (GFile *file,
initialize_unsupported (unsupported_features);
img_a.unsupported_features = unsupported_features;
if (! for_layers)
if (! for_layers || layer_file)
{
PSDimageres res_a;
@@ -389,12 +390,24 @@ load_image_metadata (GFile *file,
break;
}
}
else
if (for_layers)
{
PSDlayer **lyr_a = NULL;
gchar sig[4];
gchar key[4];
if (input)
g_object_unref (input);
/* Convert layer metadata file to input stream */
input = G_INPUT_STREAM (g_file_read (layer_file, NULL, error));
if (! input)
{
g_object_unref (input);
return image;
}
if (psd_read (input, &sig, 4, error) < 4)
{
g_object_unref (input);
@@ -2750,7 +2763,8 @@ add_layers (GimpImage *image,
g_array_free (parent_group_stack, FALSE);
/* Set the selected layers */
gimp_image_take_selected_layers (image, selected_layers);
if (selected_layers)
gimp_image_take_selected_layers (image, selected_layers);
g_list_free (img_a->layer_selection);
return 0;

View File

@@ -31,6 +31,7 @@ GimpImage * load_image (GFile *file,
GimpImage * load_image_metadata
(GFile *file,
GFile *layer_file,
gint data_length,
GimpImage *image,
gboolean for_layers,

View File

@@ -315,7 +315,14 @@ psd_create_procedure (GimpPlugIn *plug_in,
"If the metadata contains image or "
"layer PSD resources.",
FALSE,
G_PARAM_READWRITE);
GIMP_PARAM_READWRITE);
gimp_procedure_add_file_argument (procedure, "layer-file",
"Layer file",
"File containing layer metadata "
"(if supported)",
GIMP_FILE_CHOOSER_ACTION_OPEN,
FALSE, NULL,
G_PARAM_READWRITE);
gimp_procedure_add_boolean_argument (procedure, "cmyk",
"CMYK",
"If the layer metadata needs to be "
@@ -493,9 +500,10 @@ psd_load_metadata (GimpProcedure *procedure,
GimpImage *image;
gint data_length;
PSDSupport unsupported_features;
gboolean is_layer = FALSE;
gboolean is_cmyk = FALSE;
GError *error = NULL;
GFile *layer_file = NULL;
gboolean is_layer = FALSE;
gboolean is_cmyk = FALSE;
GError *error = NULL;
gegl_init (NULL, NULL);
@@ -504,11 +512,12 @@ psd_load_metadata (GimpProcedure *procedure,
"image", &image,
"size", &data_length,
"metadata-type", &is_layer,
"layer-file", &layer_file,
"cmyk", &is_cmyk,
NULL);
image = load_image_metadata (file, data_length, image, is_layer, is_cmyk,
&unsupported_features, &error);
image = load_image_metadata (file, layer_file, data_length, image, is_layer,
is_cmyk, &unsupported_features, &error);
/* Check for unsupported layers */

View File

@@ -1769,13 +1769,16 @@ load_image (GimpProcedure *procedure,
gimp_image_undo_enable (*image);
}
/* Load Photoshop layer metadata */
/* Load Photoshop image and layer metadata */
if (TIFFGetField (tif, TIFFTAG_PHOTOSHOP, &photoshop_len, &photoshop_data))
{
FILE *fp;
GFile *temp_file = NULL;
GimpProcedure *procedure;
GimpValueArray *return_vals = NULL;
FILE *fp;
guchar *ps_layer_data;
gint ps_layer_len;
GFile *temp_file = NULL;
GFile *layer_temp_file = NULL;
GimpValueArray *return_vals = NULL;
temp_file = gimp_temp_file ("tmp");
fp = g_fopen (g_file_peek_path (temp_file), "wb");
@@ -1791,66 +1794,49 @@ load_image (GimpProcedure *procedure,
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
fclose (fp);
procedure = gimp_pdb_lookup_procedure (gimp_get_pdb (),
"file-psd-load-metadata");
return_vals = gimp_procedure_run (procedure,
"run-mode", GIMP_RUN_NONINTERACTIVE,
"file", temp_file,
"size", photoshop_len,
"image", *image,
"metadata-type", FALSE,
NULL);
g_file_delete (temp_file, NULL, NULL);
g_object_unref (temp_file);
gimp_value_array_unref (return_vals);
*ps_metadata_loaded = TRUE;
}
if (TIFFGetField (tif, TIFFTAG_IMAGESOURCEDATA, &photoshop_len, &photoshop_data))
{
FILE *fp;
GFile *temp_file = NULL;
GimpProcedure *procedure;
GimpValueArray *return_vals = NULL;
/* Photoshop metadata starts with 'Adobe Photoshop Document Data Block'
* so we need to skip past that for the data. */
photoshop_data += 36;
photoshop_len -= 36;
temp_file = gimp_temp_file ("tmp");
fp = g_fopen (g_file_peek_path (temp_file), "wb");
if (! fp)
/* Check if we also have layer metadata */
if (TIFFGetField (tif, TIFFTAG_IMAGESOURCEDATA, &ps_layer_len,
&ps_layer_data))
{
g_message (_("Error trying to open temporary %s file '%s' "
"for tiff metadata loading: %s"),
"tmp", gimp_file_get_utf8_name (temp_file),
g_strerror (errno));
/* Photoshop metadata starts with 'Adobe Photoshop Document Data
* Block' so we need to skip past that for the data. */
ps_layer_data += 36;
ps_layer_len -= 36;
layer_temp_file = gimp_temp_file ("tmp");
fp = g_fopen (g_file_peek_path (layer_temp_file), "wb");
if (! fp)
{
g_message (_("Error trying to open temporary %s file '%s' "
"for tiff metadata loading: %s"),
"tmp", gimp_file_get_utf8_name (layer_temp_file),
g_strerror (errno));
}
fwrite (ps_layer_data, sizeof (guchar), ps_layer_len, fp);
fclose (fp);
}
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
fclose (fp);
procedure = gimp_pdb_lookup_procedure (gimp_get_pdb (),
"file-psd-load-metadata");
/* We would like to use run_mode below. That way we could show a dialog
* when unsupported Photoshop data is detected in interactive mode.
* However, in interactive mode saved config values take precedence over
* these values set below, so that won't work. */
return_vals = gimp_procedure_run (procedure,
"run-mode", GIMP_RUN_NONINTERACTIVE,
"file", temp_file,
"layer-file", layer_temp_file,
"size", photoshop_len,
"image", *image,
"metadata-type", TRUE,
"metadata-type", (layer_temp_file != NULL),
"cmyk", is_cmyk,
NULL);
g_file_delete (temp_file, NULL, NULL);
g_object_unref (temp_file);
if (layer_temp_file)
{
g_file_delete (layer_temp_file, NULL, NULL);
g_object_unref (layer_temp_file);
}
gimp_value_array_unref (return_vals);
*ps_metadata_loaded = TRUE;