diff --git a/coders/psd.c b/coders/psd.c
index 45ebb56..8c89750 100644
--- a/coders/psd.c
+++ b/coders/psd.c
@@ -2228,123 +2228,123 @@
   if (layer_count == 0)
     (void) SetPSDSize(&psd_info,image,0);
   else
-  {
-    CompressionType
-      compression;
-
-    (void) SetPSDSize(&psd_info,image,layer_info_size+
-      (psd_info.version == 1 ? 8 : 16));
-    if ((layer_info_size/2) != ((layer_info_size+1)/2))
-      rounded_layer_info_size=layer_info_size+1;
-    else
-      rounded_layer_info_size=layer_info_size;
-    (void) SetPSDSize(&psd_info,image,rounded_layer_info_size);
-    (void) WriteBlobMSBShort(image,(unsigned short) layer_count);
-    layer_count=1;
-    compression=base_image->compression;
-    next_image=base_image;
-    while (next_image != NULL)
     {
-      next_image->compression=NoCompression;
-      (void) WriteBlobMSBLong(image,0);
-      (void) WriteBlobMSBLong(image,0);
-      (void) WriteBlobMSBLong(image,(unsigned int) next_image->rows);
-      (void) WriteBlobMSBLong(image,(unsigned int) next_image->columns);
-      packet_size=next_image->depth > 8 ? 2UL : 1UL;
-      channel_size=(unsigned int) ((packet_size*next_image->rows*
-        next_image->columns)+2);
-      if ((IsGrayImage(next_image,&image->exception) != MagickFalse) ||
-          (next_image->storage_class == PseudoClass))
-        {
-           (void) WriteBlobMSBShort(image,(unsigned short)
-             (next_image->matte != MagickFalse ? 2 : 1));
-           (void) WriteBlobMSBShort(image,0);
-           (void) SetPSDSize(&psd_info,image,channel_size);
-           if (next_image->matte != MagickFalse)
-             {
-               (void) WriteBlobMSBShort(image,(unsigned short) -1);
-               (void) SetPSDSize(&psd_info,image,channel_size);
-             }
-         }
-        else
-          if (next_image->colorspace != CMYKColorspace)
-            {
-              (void) WriteBlobMSBShort(image,(unsigned short)
-                (next_image->matte != MagickFalse ? 4 : 3));
-             (void) WriteBlobMSBShort(image,0);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             (void) WriteBlobMSBShort(image,1);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             (void) WriteBlobMSBShort(image,2);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             if (next_image->matte!= MagickFalse )
-               {
-                 (void) WriteBlobMSBShort(image,(unsigned short) -1);
-                 (void) SetPSDSize(&psd_info,image,channel_size);
-               }
-           }
-         else
-           {
-             (void) WriteBlobMSBShort(image,(unsigned short)
-               (next_image->matte ? 5 : 4));
-             (void) WriteBlobMSBShort(image,0);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             (void) WriteBlobMSBShort(image,1);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             (void) WriteBlobMSBShort(image,2);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             (void) WriteBlobMSBShort(image,3);
-             (void) SetPSDSize(&psd_info,image,channel_size);
-             if (next_image->matte)
-               {
-                 (void) WriteBlobMSBShort(image,(unsigned short) -1);
-                 (void) SetPSDSize(&psd_info,image,channel_size);
-               }
-           }
-      (void) WriteBlob(image,4,(const unsigned char *) "8BIM");
-      (void) WriteBlob(image,4,(const unsigned char *)
-        CompositeOperatorToPSDBlendMode(next_image->compose));
-      (void) WriteBlobByte(image,255); /* layer opacity */
-      (void) WriteBlobByte(image,0);
-      (void) WriteBlobByte(image,1); /* layer propertys - visible, etc. */
-      (void) WriteBlobByte(image,0);
-      property=(const char *) GetImageProperty(next_image,"label");
-      if (property == (const char *) NULL)
-        {
-          (void) WriteBlobMSBLong(image,16);
-          (void) WriteBlobMSBLong(image,0);
-          (void) WriteBlobMSBLong(image,0);
-          (void) FormatMagickString((char *) layer_name,MaxTextExtent,"L%06ld",
-            (long) layer_count++);
-          WritePascalString( image, (char*)layer_name, 4 );
-        }
+      CompressionType
+        compression;
+
+      (void) SetPSDSize(&psd_info,image,layer_info_size+
+        (psd_info.version == 1 ? 8 : 16));
+      if ((layer_info_size/2) != ((layer_info_size+1)/2))
+        rounded_layer_info_size=layer_info_size+1;
       else
-        {
-          size_t
-            length;
+        rounded_layer_info_size=layer_info_size;
+      (void) SetPSDSize(&psd_info,image,rounded_layer_info_size);
+      (void) WriteBlobMSBShort(image,(unsigned short) layer_count);
+      layer_count=1;
+      compression=base_image->compression;
+      next_image=base_image;
+      while (next_image != NULL)
+      {
+        next_image->compression=NoCompression;
+        (void) WriteBlobMSBLong(image,0);
+        (void) WriteBlobMSBLong(image,0);
+        (void) WriteBlobMSBLong(image,(unsigned int) next_image->rows);
+        (void) WriteBlobMSBLong(image,(unsigned int) next_image->columns);
+        packet_size=next_image->depth > 8 ? 2UL : 1UL;
+        channel_size=(unsigned int) ((packet_size*next_image->rows*
+          next_image->columns)+2);
+        if ((IsGrayImage(next_image,&image->exception) != MagickFalse) ||
+            (next_image->storage_class == PseudoClass))
+          {
+             (void) WriteBlobMSBShort(image,(unsigned short)
+               (next_image->matte != MagickFalse ? 2 : 1));
+             (void) WriteBlobMSBShort(image,0);
+             (void) SetPSDSize(&psd_info,image,channel_size);
+             if (next_image->matte != MagickFalse)
+               {
+                 (void) WriteBlobMSBShort(image,(unsigned short) -1);
+                 (void) SetPSDSize(&psd_info,image,channel_size);
+               }
+           }
+          else
+            if (next_image->colorspace != CMYKColorspace)
+              {
+                (void) WriteBlobMSBShort(image,(unsigned short)
+                  (next_image->matte != MagickFalse ? 4 : 3));
+               (void) WriteBlobMSBShort(image,0);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               (void) WriteBlobMSBShort(image,1);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               (void) WriteBlobMSBShort(image,2);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               if (next_image->matte!= MagickFalse )
+                 {
+                   (void) WriteBlobMSBShort(image,(unsigned short) -1);
+                   (void) SetPSDSize(&psd_info,image,channel_size);
+                 }
+             }
+           else
+             {
+               (void) WriteBlobMSBShort(image,(unsigned short)
+                 (next_image->matte ? 5 : 4));
+               (void) WriteBlobMSBShort(image,0);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               (void) WriteBlobMSBShort(image,1);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               (void) WriteBlobMSBShort(image,2);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               (void) WriteBlobMSBShort(image,3);
+               (void) SetPSDSize(&psd_info,image,channel_size);
+               if (next_image->matte)
+                 {
+                   (void) WriteBlobMSBShort(image,(unsigned short) -1);
+                   (void) SetPSDSize(&psd_info,image,channel_size);
+                 }
+             }
+        (void) WriteBlob(image,4,(const unsigned char *) "8BIM");
+        (void) WriteBlob(image,4,(const unsigned char *)
+          CompositeOperatorToPSDBlendMode(next_image->compose));
+        (void) WriteBlobByte(image,255); /* layer opacity */
+        (void) WriteBlobByte(image,0);
+        (void) WriteBlobByte(image,1); /* layer propertys - visible, etc. */
+        (void) WriteBlobByte(image,0);
+        property=(const char *) GetImageProperty(next_image,"label");
+        if (property == (const char *) NULL)
+          {
+            (void) WriteBlobMSBLong(image,16);
+            (void) WriteBlobMSBLong(image,0);
+            (void) WriteBlobMSBLong(image,0);
+            (void) FormatMagickString((char *) layer_name,MaxTextExtent,
+              "L%06ld",(long) layer_count++);
+            WritePascalString( image, (char*)layer_name, 4 );
+          }
+        else
+          {
+            size_t
+              length;
 
-          length=strlen(property);
-          (void) WriteBlobMSBLong(image,(unsigned int) (length+(4-(length % 4))+
-            8));
-          (void) WriteBlobMSBLong(image,0);
-          (void) WriteBlobMSBLong(image,0);
-          WritePascalString(image,property,4);
-        }
-      next_image=GetNextImageInList(next_image);
+            length=strlen(property);
+            (void) WriteBlobMSBLong(image,(unsigned int) (length+(4-
+              (length % 4))+8));
+            (void) WriteBlobMSBLong(image,0);
+            (void) WriteBlobMSBLong(image,0);
+            WritePascalString(image,property,4);
+          }
+        next_image=GetNextImageInList(next_image);
+      }
+      /*
+        Now the image data!
+      */
+      next_image=base_image;
+      while (next_image != NULL)
+      {
+        status=WriteImageChannels(&psd_info,image_info,image,next_image,
+          MagickTrue);
+        next_image=GetNextImageInList(next_image);
+      }
+      (void) WriteBlobMSBLong(image,0);  /* user mask data */
+      base_image->compression=compression;
     }
-    /*
-      Now the image data!
-    */
-    next_image=base_image;
-    while (next_image != NULL)
-    {
-      status=WriteImageChannels(&psd_info,image_info,image,next_image,
-        MagickTrue);
-      next_image=GetNextImageInList(next_image);
-    }
-    (void) WriteBlobMSBLong(image,0);  /* user mask data */
-    base_image->compression=compression;
-  }
   /*
     Write composite image.
   */
diff --git a/magick/resize.c b/magick/resize.c
index 18b8b8e..81680a4 100644
--- a/magick/resize.c
+++ b/magick/resize.c
@@ -303,7 +303,7 @@
   const ResizeFilter *magick_unused(resize_filter))
 {
   /*
-    This function actually a X-scaled Sinc(x) function.
+    This function is actually a X-scaled Sinc(x) function.
   */
   if (x == 0.0)
     return(1.0);
