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);