[gimp] Bug 698859: PSD import filter: opening a PSD file causes...



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]