[gimp/gimp-2-10] plug-ins: add support for reading raster layers of newer psp versions.



commit 94bea61b1092fde7d8f6e76160ca7a1886fc09df
Author: Jacob Boerema <jgboerema gmail com>
Date:   Sun Aug 30 16:46:07 2020 -0400

    plug-ins: add support for reading raster layers of newer psp versions.
    
    (cherry picked from commit fa40bc7)

 plug-ins/common/file-psp.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)
---
diff --git a/plug-ins/common/file-psp.c b/plug-ins/common/file-psp.c
index 26df16b1fd..56723d2863 100644
--- a/plug-ins/common/file-psp.c
+++ b/plug-ins/common/file-psp.c
@@ -1309,7 +1309,9 @@ read_raster_layer_info (FILE      *f,
                         guint16   *channel_count,
                         GError   **error)
 {
-  guint32 layer_extension_len;
+  long    block_start;
+  guint32 layer_extension_len, block_len;
+  gint    block_id;
 
   if (fseek (f, layer_extension_start, SEEK_SET) < 0
       || fread (&layer_extension_len, 4, 1, f) < 1)
@@ -1319,6 +1321,40 @@ read_raster_layer_info (FILE      *f,
       return FALSE;
     }
 
+    /* Newer versions of PSP have an extra block here for raster layers
+       with block id = 0x21. Most likely this was to fix an oversight in
+       the specification since vector and adjustment layers already were
+       using a similar extension block since file version 4.
+       The old chunk with bitmap_count and channel_count starts after this block.
+       We do not know starting from which version this change was implemented
+       but most likely version 9 (could also be version 10) so we can't test
+       based on version number only.
+       Although this is kind of a hack we can safely test for the block starting
+       code since the layer_extension_len here is always a small number.
+      */
+    if (psp_ver_major > 8 && memcmp (&layer_extension_len, "~BK\0", 4) == 0)
+      {
+        if (fread (&block_id, 2, 1, f) < 1
+            || fread (&block_len, 4, 1, f) < 1)
+          {
+            g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                         _("Error reading block information"));
+            return FALSE;
+          }
+        block_id = GUINT16_FROM_LE (block_id);
+        block_len = GUINT32_FROM_LE (block_len);
+
+        block_start = ftell (f);
+        layer_extension_start = block_start + block_len;
+
+        if (fseek (f, layer_extension_start, SEEK_SET) < 0
+            || fread (&layer_extension_len, 4, 1, f) < 1)
+          {
+            g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                         _("Error reading layer extension information"));
+            return FALSE;
+          }
+      }
     layer_extension_len = GUINT32_FROM_LE (layer_extension_len);
 
     if (fread (bitmap_count, 2, 1, f) < 1


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