From: dirk Date: Fri, 28 Mar 2014 19:48:49 +0000 (+0000) Subject: Improved ping of PSD image. X-Git-Tag: 7.0.1-0~2539 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4d9863ca77e690fdde8653d1f3db0721bd25978e;p=imagemagick Improved ping of PSD image. --- diff --git a/coders/psd.c b/coders/psd.c index 6f30d1202..b250c14ff 100644 --- a/coders/psd.c +++ b/coders/psd.c @@ -467,7 +467,7 @@ static inline size_t GetPSDPacketSize(Image *image) 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 MagickStatusType ReadPSDChannelRaw(Image *image,const size_t channels, } 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 @@ static inline MagickOffsetType *ReadPSDRLEOffsets(Image *image, 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 @@ static MagickStatusType ReadPSDChannelZip(Image *image, #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 @@ static MagickStatusType ReadPSDChannel(Image *image,PSDInfo *psd_info, 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 @@ static MagickStatusType ReadPSDLayer(Image *image,PSDInfo *psd_info, 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,36 +1424,39 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info, } } - 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; } - } - continue; - } - if (image->debug != MagickFalse) - (void) LogMagickEvent(CoderEvent,GetMagickModule(), - " reading data for layer %.20g",(double) i); + 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=ReadPSDLayer(image,psd_info,&layer_info[i],exception); + if (status == MagickFalse) + break; - status=SetImageProgress(image,LoadImagesTag,i,(MagickSizeType) - number_layers); - if (status == MagickFalse) - break; - } + status=SetImageProgress(image,LoadImagesTag,i,(MagickSizeType) + number_layers); + if (status == MagickFalse) + break; + } + } if (status != MagickFalse) { @@ -1487,8 +1491,8 @@ static MagickStatusType ReadPSDLayers(Image *image,PSDInfo *psd_info, 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 @@ static Image *ReadPSDImage(const ImageInfo *image_info, &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 @@ static Image *ReadPSDImage(const ImageInfo *image_info, } 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 @@ static Image *ReadPSDImage(const ImageInfo *image_info, */ 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 @@ static Image *ReadPSDImage(const ImageInfo *image_info, 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);