[gimp] Bug 698859: PSD import filter: opening a PSD file causes...
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 698859: PSD import filter: opening a PSD file causes...
- Date: Sun, 26 Apr 2015 03:40:35 +0000 (UTC)
commit b42e764d9c7bab75dab6b134b5ab8e4d900d3dbd
Author: Massimo Valentini <mvalentini src gnome org>
Date: Sun May 11 10:36:53 2014 +0200
Bug 698859: PSD import filter: opening a PSD file causes...
...file-psd-load segfault.
Fix loading of PSDs where the number of "end group" markers doesn't
match the number of "start group" markers, which seems to be what is
saved by Photoshop in some cases/versions/whatever.
plug-ins/file-psd/psd-load.c | 58 ++++++++++++++++++++++++++---------------
1 files changed, 37 insertions(+), 21 deletions(-)
---
diff --git a/plug-ins/file-psd/psd-load.c b/plug-ins/file-psd/psd-load.c
index 4af965e..a8cf350 100644
--- a/plug-ins/file-psd/psd-load.c
+++ b/plug-ins/file-psd/psd-load.c
@@ -1132,19 +1132,28 @@ add_layers (gint32 image_id,
{
if (lyr_a[lidx]->group_type == 3)
{
- /* the </Layer group> marker layers are used to
- assemble the layer structure in a single pass */
- layer_id = gimp_layer_group_new (image_id);
+ /* the </Layer group> marker layers are used to
+ * assemble the layer structure in a single pass
+ */
+ layer_id = gimp_layer_group_new (image_id);
}
else /* group-type == 1 || group_type == 2 */
{
- layer_id = g_array_index (parent_group_stack, gint32,
- parent_group_stack->len-1);
- /* since the layers are stored in reverse, the group
- layer start marker actually means we're done with
- that layer group */
- g_array_remove_index (parent_group_stack,
- parent_group_stack->len-1);
+ if (parent_group_stack->len)
+ {
+ layer_id = g_array_index (parent_group_stack, gint32,
+ parent_group_stack->len - 1);
+ /* since the layers are stored in reverse, the group
+ * layer start marker actually means we're done with
+ * that layer group
+ */
+ g_array_remove_index (parent_group_stack,
+ parent_group_stack->len - 1);
+ }
+ else
+ {
+ layer_id = -1;
+ }
}
}
@@ -1287,8 +1296,11 @@ add_layers (gint32 image_id,
l_y = 0;
l_w = img_a->columns;
l_h = img_a->rows;
- parent_group_id = g_array_index (parent_group_stack, gint32,
- parent_group_stack->len-1);
+ if (parent_group_stack->len > 0)
+ parent_group_id = g_array_index (parent_group_stack, gint32,
+ parent_group_stack->len - 1);
+ else
+ parent_group_id = -1; /* root */
IFDBG(3) g_debug ("Re-hash channel indices");
for (cidx = 0; cidx < lyr_a[lidx]->num_channels; ++cidx)
@@ -1328,15 +1340,19 @@ add_layers (gint32 image_id,
else
{
IFDBG(2) g_debug ("End group layer id %d.", layer_id);
- layer_mode = psd_to_gimp_blend_mode (lyr_a[lidx]->blend_mode);
- gimp_layer_set_mode (layer_id, layer_mode);
- gimp_layer_set_opacity (layer_id,
- lyr_a[lidx]->opacity * 100 / 255);
- gimp_item_set_name (layer_id, lyr_a[lidx]->name);
- g_free (lyr_a[lidx]->name);
- gimp_item_set_visible (layer_id, lyr_a[lidx]->layer_flags.visible);
- if (lyr_a[lidx]->id)
- gimp_item_set_tattoo (layer_id, lyr_a[lidx]->id);
+ if (layer_id != -1)
+ {
+ layer_mode = psd_to_gimp_blend_mode (lyr_a[lidx]->blend_mode);
+ gimp_layer_set_mode (layer_id, layer_mode);
+ gimp_layer_set_opacity (layer_id,
+ lyr_a[lidx]->opacity * 100 / 255);
+ gimp_item_set_name (layer_id, lyr_a[lidx]->name);
+ g_free (lyr_a[lidx]->name);
+ gimp_item_set_visible (layer_id,
+ lyr_a[lidx]->layer_flags.visible);
+ if (lyr_a[lidx]->id)
+ gimp_item_set_tattoo (layer_id, lyr_a[lidx]->id);
+ }
}
}
else if (empty)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]