else
if (image_type == GIMP_INDEXED)
ThrowReaderException(CoderError,"ColormapTypeNotSupported");
- (void) SetImageBackgroundColor(image,exception);
image->matte=MagickTrue;
/*
Read properties.
/*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;
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;
/*
the read pointer
*/
+ oldPos=TellBlob(image);
do
{
ssize_t offset = (int) ReadBlobMSBLong(image);
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,
* 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)
{
/*
*/
(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
{
/* 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