Improved ping of PSD image.
diff --git a/coders/psd.c b/coders/psd.c
index 6f30d12..b250c14 100644
--- a/coders/psd.c
+++ b/coders/psd.c
@@ -467,7 +467,7 @@
return(1);
}
-static inline MagickSizeType GetPSDSize(PSDInfo *psd_info,Image *image)
+static inline MagickSizeType GetPSDSize(const PSDInfo *psd_info,Image *image)
{
if (psd_info->version == 1)
return((MagickSizeType) ReadBlobMSBLong(image));
@@ -792,7 +792,7 @@
}
static inline MagickOffsetType *ReadPSDRLEOffsets(Image *image,
- PSDInfo *psd_info,const size_t size)
+ const PSDInfo *psd_info,const size_t size)
{
MagickOffsetType
*offsets;
@@ -814,7 +814,7 @@
return offsets;
}
-static MagickStatusType ReadPSDChannelRLE(Image *image,PSDInfo *psd_info,
+static MagickStatusType ReadPSDChannelRLE(Image *image,const PSDInfo *psd_info,
const ssize_t type,MagickOffsetType *offsets,ExceptionInfo *exception)
{
MagickStatusType
@@ -1013,7 +1013,7 @@
#endif
}
-static MagickStatusType ReadPSDChannel(Image *image,PSDInfo *psd_info,
+static MagickStatusType ReadPSDChannel(Image *image,const PSDInfo *psd_info,
const LayerInfo* layer_info,const size_t channel,
const PSDCompressionType compression,ExceptionInfo *exception)
{
@@ -1077,7 +1077,7 @@
return(status);
}
-static MagickStatusType ReadPSDLayer(Image *image,PSDInfo *psd_info,
+static MagickStatusType ReadPSDLayer(Image *image,const PSDInfo *psd_info,
LayerInfo* layer_info,ExceptionInfo *exception)
{
char
@@ -1147,8 +1147,9 @@
return(status);
}
-static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info,
- MagickBooleanType skip_layers,ExceptionInfo *exception)
+static MagickStatusType ReadPSDLayers(Image *image,const ImageInfo *image_info,
+ const PSDInfo *psd_info,const MagickBooleanType skip_layers,
+ ExceptionInfo *exception)
{
char
type[4];
@@ -1423,37 +1424,40 @@
}
}
- for (i=0; i < number_layers; i++)
- {
- if (layer_info[i].image == (Image *) NULL)
+ if (image_info->ping == MagickFalse)
{
- for (j=0; j < layer_info[i].channels; j++)
+ for (i=0; i < number_layers; i++)
{
- if (DiscardBlobBytes(image,layer_info[i].channel_info[j].size) ==
- MagickFalse)
+ if (layer_info[i].image == (Image *) NULL)
{
- layer_info=DestroyLayerInfo(layer_info,number_layers);
- ThrowBinaryException(CorruptImageError,
- "UnexpectedEndOfFile",image->filename);
+ for (j=0; j < layer_info[i].channels; j++)
+ {
+ if (DiscardBlobBytes(image,
+ layer_info[i].channel_info[j].size) == MagickFalse)
+ {
+ layer_info=DestroyLayerInfo(layer_info,number_layers);
+ ThrowBinaryException(CorruptImageError,
+ "UnexpectedEndOfFile",image->filename);
+ }
+ }
+ continue;
}
+
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(CoderEvent,GetMagickModule(),
+ " reading data for layer %.20g",(double) i);
+
+ status=ReadPSDLayer(image,psd_info,&layer_info[i],exception);
+ if (status == MagickFalse)
+ break;
+
+ status=SetImageProgress(image,LoadImagesTag,i,(MagickSizeType)
+ number_layers);
+ if (status == MagickFalse)
+ break;
}
- continue;
}
- if (image->debug != MagickFalse)
- (void) LogMagickEvent(CoderEvent,GetMagickModule(),
- " reading data for layer %.20g",(double) i);
-
- status=ReadPSDLayer(image,psd_info,&layer_info[i],exception);
- if (status == MagickFalse)
- break;
-
- status=SetImageProgress(image,LoadImagesTag,i,(MagickSizeType)
- number_layers);
- if (status == MagickFalse)
- break;
- }
-
if (status != MagickFalse)
{
for (i=0; i < number_layers; i++)
@@ -1487,8 +1491,8 @@
return(status);
}
-static MagickStatusType ReadPSDMergedImage(Image* image,PSDInfo* psd_info,
- ExceptionInfo *exception)
+static MagickStatusType ReadPSDMergedImage(Image* image,
+ const PSDInfo* psd_info,ExceptionInfo *exception)
{
MagickOffsetType
*offsets;
@@ -1717,14 +1721,6 @@
&has_merged_image,exception);
blocks=(unsigned char *) RelinquishMagickMemory(blocks);
}
- /*
- If we are only "pinging" the image, then we're done - so return.
- */
- if (image_info->ping != MagickFalse)
- {
- (void) CloseBlob(image);
- return(GetFirstImageInList(image));
- }
/*
Layer and mask block.
*/
@@ -1752,7 +1748,8 @@
}
else
{
- if (ReadPSDLayers(image,&psd_info,skip_layers,exception) != MagickTrue)
+ if (ReadPSDLayers(image,image_info,&psd_info,skip_layers,exception) !=
+ MagickTrue)
{
(void) CloseBlob(image);
return((Image *) NULL);
@@ -1763,7 +1760,14 @@
*/
SeekBlob(image,offset+length,SEEK_SET);
}
-
+ /*
+ If we are only "pinging" the image, then we're done - so return.
+ */
+ if (image_info->ping != MagickFalse)
+ {
+ (void) CloseBlob(image);
+ return(GetFirstImageInList(image));
+ }
/*
Read the precombined layer, present for PSD < 4 compatibility.
*/
@@ -1777,8 +1781,8 @@
length != 0)
{
SeekBlob(image,offset,SEEK_SET);
- if (ReadPSDLayers(image,&psd_info,MagickFalse,exception) !=
- MagickTrue)
+ if (ReadPSDLayers(image,image_info,&psd_info,MagickFalse,exception) !=
+ MagickTrue)
{
(void) CloseBlob(image);
return((Image *) NULL);