]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Fri, 30 Mar 2012 18:29:39 +0000 (18:29 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Fri, 30 Mar 2012 18:29:39 +0000 (18:29 +0000)
coders/xcf.c

index 746f0daad4e48536dad9a06dfc2cb169a7f9e373..ee1b7d618896795567613fbf9809b14ff0b394da 100644 (file)
@@ -1040,7 +1040,6 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
     else
       if (image_type == GIMP_INDEXED)
         ThrowReaderException(CoderError,"ColormapTypeNotSupported");
-  (void) SetImageBackgroundColor(image,exception);
   image->matte=MagickTrue;
   /*
     Read properties.
@@ -1195,8 +1194,8 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
         /*BOGUS: ignored for now */
         /*float  factor = (float) */ (void) ReadBlobMSBLong(image);
         /* size_t digits =  */ (void) ReadBlobMSBLong(image);
-        for (i=0; i<5; i++)
-         (void) ReadBlobStringWithLongSize(image, unit_string,
+        for (i=0; i < 5; i++)
+         (void) ReadBlobStringWithLongSize(image,unit_string,
            sizeof(unit_string),exception);
       }
      break;
@@ -1229,12 +1228,16 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
   else
     {
       int
+        number_layers = 0,
+        num_layers = 0,
         current_layer = 0,
-        foundAllLayers = MagickFalse,
-        number_layers = 0;
+        first_layer = 0,
+        last_layer = 0,
+        last = 0,
+        foundAllLayers = MagickFalse;
 
       MagickOffsetType
-        oldPos=TellBlob(image);
+        oldPos;
 
       XCFLayerInfo
         *layer_info;
@@ -1242,6 +1245,7 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
       /* 
         the read pointer
       */
+      oldPos=TellBlob(image);
       do
       {
         ssize_t offset = (int) ReadBlobMSBLong(image);
@@ -1259,6 +1263,20 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
     offset=SeekBlob(image,oldPos,SEEK_SET); /* restore the position! */
     if (offset < 0)
       ThrowReaderException(CorruptImageError,"ImproperImageHeader");
+    first_layer=image_info->scene;
+    num_layers=number_layers;
+    /* number_scenes==0 means read all the images */
+    if ((image_info->number_scenes > 0) &&
+        (image_info->number_scenes < number_layers))
+      num_layers=image_info->scene;
+    last_layer=first_layer+num_layers-1;
+
+    /* XCF has layers backwards. */
+    last=last_layer;
+    last_layer=number_layers-first_layer - 1;
+    first_layer=number_layers-last-1;
+    number_layers=num_layers;
+
     /* allocate our array of layer info blocks */
     length=(size_t) number_layers;
     layer_info=(XCFLayerInfo *) AcquireQuantumMemory(length,
@@ -1286,25 +1304,29 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
       *  next layer offset is stored.
       */
       saved_pos=TellBlob(image);
-      /* seek to the layer offset */
-      offset=SeekBlob(image,offset,SEEK_SET);
-      /* read in the layer */
-      layer_ok=ReadOneLayer(image,&doc_info,&layer_info[current_layer],
-        exception);
-      if (layer_ok == MagickFalse)
+      if ((first_layer <= current_layer) && (current_layer <= last_layer))
         {
-          int j;
-
-          for (j=0; j < current_layer; j++)
-            layer_info[j].image=DestroyImage(layer_info[j].image);
-        ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+          /* seek to the layer offset */
+          offset=SeekBlob(image,offset,SEEK_SET);
+          /* read in the layer */
+          layer_ok=ReadOneLayer(image,&doc_info,&layer_info[current_layer],
+            exception);
+          if (layer_ok == MagickFalse)
+            {
+              int j;
+    
+              for (j=0; j < current_layer; j++)
+                layer_info[j].image=DestroyImage(layer_info[j].image);
+              layer_info=(XCFLayerInfo *) RelinquishMagickMemory(layer_info);
+              ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+            }
+          /* restore the saved position so we'll be ready to
+          *  read the next offset.
+          */
+          offset=SeekBlob(image, saved_pos, SEEK_SET);
+        }
+        current_layer++;
       }
-      /* restore the saved position so we'll be ready to
-      *  read the next offset.
-      */
-      offset=SeekBlob(image, saved_pos, SEEK_SET);
-      current_layer++;
-    }
     if (number_layers == 1)
       {
         /*
@@ -1312,7 +1334,7 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
         */
         (void) CompositeImage(image,layer_info[0].image,OverCompositeOp,
           MagickTrue,layer_info[0].offset_x,layer_info[0].offset_y,exception);
-        layer_info[0].image =DestroyImage( layer_info[0].image);
+        layer_info[0].image=DestroyImage( layer_info[0].image);
       }
     else
       {
@@ -1353,23 +1375,18 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception)
         /* now reverse the order of the layers as they are put
            into subimages
         */
-        j=number_layers-2;
-        image->next=layer_info[j].image;
-        layer_info[j].image->previous=image;
-        layer_info[j].image->page.x=layer_info[j].offset_x;
-        layer_info[j].image->page.y=layer_info[j].offset_y;
-        layer_info[j].image->page.width=layer_info[j].width;
-        layer_info[j].image->page.height=layer_info[j].height;
-        for (j=number_layers-3; j>=0; j--)
-        {
-          if (j > 0)
-            layer_info[j].image->next=layer_info[j-1].image;
-          if (j < (number_layers-1))
-            layer_info[j].image->previous=layer_info[j+1].image;
-          layer_info[j].image->page.x=layer_info[j].offset_x;
-          layer_info[j].image->page.y=layer_info[j].offset_y;
-          layer_info[j].image->page.width=layer_info[j].width;
-          layer_info[j].image->page.height=layer_info[j].height;
+      image->next=layer_info[number_layers-2].image;
+      layer_info[number_layers-2].image->previous=image;
+      for (j=number_layers-2; j>=0; j--)
+      {
+        if (j > 0)
+          layer_info[j].image->next=layer_info[j-1].image;
+        if (j < (number_layers-1))
+          layer_info[j].image->previous=layer_info[j+1].image;
+        layer_info[j].image->page.x = layer_info[j].offset_x;
+        layer_info[j].image->page.y = layer_info[j].offset_y;
+        layer_info[j].image->page.width = layer_info[j].width;
+        layer_info[j].image->page.height = layer_info[j].height;
         }
       }
 #endif