]> granicus.if.org Git - imagemagick/blobdiff - coders/pnm.c
(no commit message)
[imagemagick] / coders / pnm.c
index 4c0a5142a7cc256f5df88011e7d9c58d391c267f..b7981a2a735ae9ae8496de0907604761f4e9a438 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -134,10 +134,10 @@ static MagickBooleanType IsPNM(const unsigned char *magick,const size_t extent)
 %
 */
 
-static inline long ConstrainPixel(Image *image,const long offset,
-  const unsigned long extent)
+static inline ssize_t ConstrainPixel(Image *image,const ssize_t offset,
+  const size_t extent)
 {
-  if ((offset < 0) || (offset > (long) extent))
+  if ((offset < 0) || (offset > (ssize_t) extent))
     {
       (void) ThrowMagickException(&image->exception,GetMagickModule(),
         CorruptImageError,"InvalidPixel","`%s'",image->filename);
@@ -146,7 +146,7 @@ static inline long ConstrainPixel(Image *image,const long offset,
   return(offset);
 }
 
-static unsigned long PNMInteger(Image *image,const unsigned int base)
+static size_t PNMInteger(Image *image,const unsigned int base)
 {
   char
     *comment;
@@ -158,9 +158,7 @@ static unsigned long PNMInteger(Image *image,const unsigned int base)
     *p;
 
   size_t
-    extent;
-
-  unsigned long
+    extent,
     value;
 
   /*
@@ -208,7 +206,7 @@ static unsigned long PNMInteger(Image *image,const unsigned int base)
       comment=DestroyString(comment);
     }
   if (base == 2)
-    return((unsigned long) (c-(int) '0'));
+    return((size_t) (c-(int) '0'));
   /*
     Evaluate number.
   */
@@ -235,10 +233,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
   Image
     *image;
 
-  long
-    row,
-    y;
-
   MagickBooleanType
     status;
 
@@ -251,22 +245,19 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
   QuantumType
     quantum_type;
 
-  register long
+  register ssize_t
     i;
 
   size_t
+    depth,
     extent,
+    max_value,
     packet_size;
 
   ssize_t
-    count;
-
-  unsigned long
-    depth,
-    max_value;
-
-  CacheView
-    *image_view;
+    count,
+    row,
+    y;
 
   /*
     Open image file.
@@ -367,6 +358,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           */
           if (LocaleCompare(keyword,"depth") == 0)
             packet_size=StringToUnsignedLong(value);
+          (void) packet_size;
           if (LocaleCompare(keyword,"height") == 0)
             image->rows=StringToUnsignedLong(value);
           if (LocaleCompare(keyword,"maxval") == 0)
@@ -429,9 +421,9 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         /*
           Convert PBM image to pixel packets.
         */
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
@@ -440,18 +432,19 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
-            q->red=(Quantum) (PNMInteger(image,2) == 0 ? QuantumRange : 0);
-            q->green=q->red;
-            q->blue=q->red;
+            SetRedPixelComponent(q,PNMInteger(image,2) == 0 ? QuantumRange : 0);
+            SetGreenPixelComponent(q,GetRedPixelComponent(q));
+            SetBluePixelComponent(q,GetRedPixelComponent(q));
             q++;
           }
           if (SyncAuthenticPixels(image,exception) == MagickFalse)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,LoadImageTag,y,image->rows);
+              status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -461,7 +454,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
       }
       case '2':
       {
-        unsigned long
+        size_t
           intensity;
 
         /*
@@ -477,12 +470,12 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
               sizeof(*scale));
             if (scale == (Quantum *) NULL)
               ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-            for (i=0; i <= (long) max_value; i++)
+            for (i=0; i <= (ssize_t) max_value; i++)
               scale[i]=(Quantum) (((double) QuantumRange*i)/max_value+0.5);
           }
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
@@ -491,22 +484,23 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
             intensity=PNMInteger(image,10);
+            SetRedPixelComponent(q,intensity);
             if (scale != (Quantum *) NULL)
-              intensity=(unsigned long) scale[ConstrainPixel(image,(long)
-                intensity,max_value)];
-            q->red=(Quantum) intensity;
-            q->green=q->red;
-            q->blue=q->red;
+              SetRedPixelComponent(q,scale[ConstrainPixel(image,(ssize_t)
+                intensity,max_value)]);
+            SetGreenPixelComponent(q,GetRedPixelComponent(q));
+            SetBluePixelComponent(q,GetRedPixelComponent(q));
             q++;
           }
           if (SyncAuthenticPixels(image,exception) == MagickFalse)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,LoadImageTag,y,image->rows);
+              status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -534,12 +528,12 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
               sizeof(*scale));
             if (scale == (Quantum *) NULL)
               ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-            for (i=0; i <= (long) max_value; i++)
+            for (i=0; i <= (ssize_t) max_value; i++)
               scale[i]=(Quantum) (((double) QuantumRange*i)/max_value+0.5);
           }
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
@@ -548,30 +542,31 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
             pixel.red=(MagickRealType) PNMInteger(image,10);
             pixel.green=(MagickRealType) PNMInteger(image,10);
             pixel.blue=(MagickRealType) PNMInteger(image,10);
             if (scale != (Quantum *) NULL)
               {
-                pixel.red=(MagickRealType) scale[ConstrainPixel(image,(long)
+                pixel.red=(MagickRealType) scale[ConstrainPixel(image,(ssize_t)
                   pixel.red,max_value)];
-                pixel.green=(MagickRealType) scale[ConstrainPixel(image,(long)
-                  pixel.green,max_value)];
-                pixel.blue=(MagickRealType) scale[ConstrainPixel(image,(long)
+                pixel.green=(MagickRealType) scale[ConstrainPixel(image,
+                  (ssize_t) pixel.green,max_value)];
+                pixel.blue=(MagickRealType) scale[ConstrainPixel(image,(ssize_t)
                   pixel.blue,max_value)];
               }
-            q->red=(Quantum) pixel.red;
-            q->green=(Quantum) pixel.green;
-            q->blue=(Quantum) pixel.blue;
+            SetRedPixelComponent(q,pixel.red);
+            SetGreenPixelComponent(q,pixel.green);
+            SetBluePixelComponent(q,pixel.blue);
             q++;
           }
           if (SyncAuthenticPixels(image,exception) == MagickFalse)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,LoadImageTag,y,image->rows);
+              status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -593,15 +588,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
         SetQuantumMinIsWhite(quantum_info,MagickTrue);
         extent=GetQuantumExtent(image,quantum_info,quantum_type);
-        image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp parallel for schedule(static,1) shared(row,status,quantum_type)
-#endif
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          long
-            offset;
-
           MagickBooleanType
             sync;
 
@@ -609,7 +597,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
             *restrict q;
 
           ssize_t
-            count;
+            count,
+            offset;
 
           size_t
             length;
@@ -620,9 +609,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           if (status == MagickFalse)
             continue;
           pixels=GetQuantumPixels(quantum_info);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp critical (MagickCore_ReadPNMImage)
-#endif
           {
             count=ReadBlob(image,extent,pixels);
             if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
@@ -631,7 +617,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 MagickBooleanType
                   proceed;
 
-                proceed=SetImageProgress(image,LoadImageTag,row,image->rows);
+                proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType)
+                  row,image->rows);
                 if (proceed == MagickFalse)
                   status=MagickFalse;
               }
@@ -639,22 +626,20 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           }
           if (count != (ssize_t) extent)
             status=MagickFalse;
-          q=QueueCacheViewAuthenticPixels(image_view,0,offset,image->columns,1,
-            exception);
+          q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             {
               status=MagickFalse;
               continue;
             }
-          length=ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
-            pixels,exception);
+          length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
+            quantum_type,pixels,exception);
           if (length != extent)
             status=MagickFalse;
-          sync=SyncCacheViewAuthenticPixels(image_view,exception);
+          sync=SyncAuthenticPixels(image,exception);
           if (sync == MagickFalse)
             status=MagickFalse;
         }
-        image_view=DestroyCacheView(image_view);
         quantum_info=DestroyQuantumInfo(quantum_info);
         if (status == MagickFalse)
           ThrowReaderException(CorruptImageError,"UnableToReadImageData");
@@ -675,29 +660,23 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         quantum_info=AcquireQuantumInfo(image_info,image);
         if (quantum_info == (QuantumInfo *) NULL)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-        image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp parallel for schedule(static,1) shared(row,status,quantum_type)
-#endif
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          long
-            offset;
-
           MagickBooleanType
             sync;
 
           register const unsigned char
-            *p;
+            *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
             *restrict q;
 
           ssize_t
-            count;
+            count,
+            offset;
 
           unsigned char
             *pixels;
@@ -705,9 +684,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           if (status == MagickFalse)
             continue;
           pixels=GetQuantumPixels(quantum_info);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp critical (MagickCore_ReadPNMImage)
-#endif
           {
             count=ReadBlob(image,extent,pixels);
             if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
@@ -716,7 +692,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 MagickBooleanType
                   proceed;
 
-                proceed=SetImageProgress(image,LoadImageTag,row,image->rows);
+                proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType)
+                  row,image->rows);
                 if (proceed == MagickFalse)
                   status=MagickFalse;
               }
@@ -724,8 +701,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           }
           if (count != (ssize_t) extent)
             status=MagickFalse;
-          q=QueueCacheViewAuthenticPixels(image_view,0,offset,image->columns,1,
-            exception);
+          q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             {
               status=MagickFalse;
@@ -733,7 +709,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
             }
           p=pixels;
           if ((image->depth == 8) || (image->depth == 16))
-            (void) ImportQuantumPixels(image,image_view,quantum_info,
+            (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
               quantum_type,pixels,exception);
           else
             if (image->depth <= 8)
@@ -741,12 +717,12 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 unsigned char
                   pixel;
 
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   p=PushCharPixel(p,&pixel);
                   SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
-                  q->green=q->red;
-                  q->blue=q->red;
+                  SetGreenPixelComponent(q,GetRedPixelComponent(q));
+                  SetBluePixelComponent(q,GetRedPixelComponent(q));
                   q++;
                 }
               }
@@ -755,20 +731,19 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 unsigned short
                   pixel;
 
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   p=PushShortPixel(MSBEndian,p,&pixel);
                   SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
-                  q->green=q->red;
-                  q->blue=q->red;
+                  SetGreenPixelComponent(q,GetRedPixelComponent(q));
+                  SetBluePixelComponent(q,GetRedPixelComponent(q));
                   q++;
                 }
               }
-          sync=SyncCacheViewAuthenticPixels(image_view,exception);
+          sync=SyncAuthenticPixels(image,exception);
           if (sync == MagickFalse)
             status=MagickFalse;
         }
-        image_view=DestroyCacheView(image_view);
         quantum_info=DestroyQuantumInfo(quantum_info);
         if (status == MagickFalse)
           ThrowReaderException(CorruptImageError,"UnableToReadImageData");
@@ -793,32 +768,23 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         quantum_info=AcquireQuantumInfo(image_info,image);
         if (quantum_info == (QuantumInfo *) NULL)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-        image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp parallel for schedule(static,1) shared(row,status,type)
-#endif
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          long
-            offset;
-
           MagickBooleanType
             sync;
 
           register const unsigned char
-            *p;
+            *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
             *restrict q;
 
           ssize_t
-            count;
-
-          size_t
-            length;
+            count,
+            offset;
 
           unsigned char
             *pixels;
@@ -826,9 +792,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           if (status == MagickFalse)
             continue;
           pixels=GetQuantumPixels(quantum_info);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp critical (MagickCore_ReadPNMImage)
-#endif
           {
             count=ReadBlob(image,extent,pixels);
             if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
@@ -837,7 +800,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 MagickBooleanType
                   proceed;
 
-                proceed=SetImageProgress(image,LoadImageTag,row,image->rows);
+                proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType)
+                  row,image->rows);
                 if (proceed == MagickFalse)
                   status=MagickFalse;
               }
@@ -845,80 +809,95 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           }
           if (count != (ssize_t) extent)
             status=MagickFalse;
-          q=QueueCacheViewAuthenticPixels(image_view,0,offset,image->columns,1,
-            exception);
+          q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             {
               status=MagickFalse;
               continue;
             }
           p=pixels;
-          if ((image->depth == 8) || (image->depth == 16))
+          if (image->depth == 8)
+            for (x=0; x < (ssize_t) image->columns; x++)
             {
-              length=ImportQuantumPixels(image,image_view,quantum_info,
-                quantum_type,pixels,exception);
-              if (length != extent)
-                status=MagickFalse;
+              SetRedPixelComponent(q,ScaleCharToQuantum(*p++));
+              SetGreenPixelComponent(q,ScaleCharToQuantum(*p++));
+              SetBluePixelComponent(q,ScaleCharToQuantum(*p++));
+              q->opacity=OpaqueOpacity;
+              q++;
             }
           else
-            if (image->depth <= 8)
-              {
-                unsigned char
-                  pixel;
-
-                register PixelPacket
-                  *restrict r;
-
-                r=q;
-                for (x=0; x < (long) image->columns; x++)
-                {
-                  p=PushCharPixel(p,&pixel);
-                  r->red=ScaleAnyToQuantum(pixel,range);
-                  p=PushCharPixel(p,&pixel);
-                  r->green=ScaleAnyToQuantum(pixel,range);
-                  p=PushCharPixel(p,&pixel);
-                  r->blue=ScaleAnyToQuantum(pixel,range);
-                  r++;
-                }
-              }
-            else
+            if (image->depth == 16)
               {
                 unsigned short
                   pixel;
 
-                register PixelPacket
-                  *restrict r;
-
-                r=q;
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   p=PushShortPixel(MSBEndian,p,&pixel);
-                  r->red=ScaleAnyToQuantum(pixel,range);
+                  SetRedPixelComponent(q,ScaleShortToQuantum(pixel));
                   p=PushShortPixel(MSBEndian,p,&pixel);
-                  r->green=ScaleAnyToQuantum(pixel,range);
+                  SetGreenPixelComponent(q,ScaleShortToQuantum(pixel));
                   p=PushShortPixel(MSBEndian,p,&pixel);
-                  r->blue=ScaleAnyToQuantum(pixel,range);
-                  r++;
+                  SetBluePixelComponent(q,ScaleShortToQuantum(pixel));
+                  SetOpacityPixelComponent(q,OpaqueOpacity);
+                  q++;
                 }
               }
+            else
+              if (image->depth <= 8)
+                {
+                  unsigned char
+                    pixel;
+
+                  for (x=0; x < (ssize_t) image->columns; x++)
+                  {
+                    p=PushCharPixel(p,&pixel);
+                    SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    p=PushCharPixel(p,&pixel);
+                    SetGreenPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    p=PushCharPixel(p,&pixel);
+                    SetBluePixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    SetOpacityPixelComponent(q,OpaqueOpacity);
+                    q++;
+                  }
+                }
+              else
+                {
+                  unsigned short
+                    pixel;
+
+                  for (x=0; x < (ssize_t) image->columns; x++)
+                  {
+                    p=PushShortPixel(MSBEndian,p,&pixel);
+                    SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    p=PushShortPixel(MSBEndian,p,&pixel);
+                    SetGreenPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    p=PushShortPixel(MSBEndian,p,&pixel);
+                    SetBluePixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                    SetOpacityPixelComponent(q,OpaqueOpacity);
+                    q++;
+                  }
+                }
           if ((type == BilevelType) || (type == GrayscaleType))
-            for (x=0; x < (long) image->columns; x++)
             {
-              if ((type == BilevelType) &&
-                  (IsMonochromePixel(q) == MagickFalse))
-                type=IsGrayPixel(q) == MagickFalse ? UndefinedType :
-                  GrayscaleType;
-              if ((type == GrayscaleType) && (IsGrayPixel(q) == MagickFalse))
-                type=UndefinedType;
-              if ((type != BilevelType) && (type != GrayscaleType))
-                break;
-              q++;
+              q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception);
+              for (x=0; x < (ssize_t) image->columns; x++)
+              {
+                if ((type == BilevelType) &&
+                    (IsMonochromePixel(q) == MagickFalse))
+                  type=IsGrayPixel(q) == MagickFalse ? UndefinedType :
+                    GrayscaleType;
+                if ((type == GrayscaleType) && (IsGrayPixel(q) == MagickFalse))
+                  type=UndefinedType;
+                if ((type != BilevelType) && (type != GrayscaleType))
+                  break;
+                q++;
+              }
             }
-          sync=SyncCacheViewAuthenticPixels(image_view,exception);
+          sync=SyncAuthenticPixels(image,exception);
           if (sync == MagickFalse)
             status=MagickFalse;
         }
-        image_view=DestroyCacheView(image_view);
         quantum_info=DestroyQuantumInfo(quantum_info);
         if (status == MagickFalse)
           ThrowReaderException(CorruptImageError,"UnableToReadImageData");
@@ -934,7 +913,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         QuantumAny
           range;
 
-        unsigned long
+        size_t
           channels;
 
         /*
@@ -967,29 +946,23 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         quantum_info=AcquireQuantumInfo(image_info,image);
         if (quantum_info == (QuantumInfo *) NULL)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-        image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp parallel for schedule(static,1) shared(row,status,quantum_type)
-#endif
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          long
-            offset;
-
           MagickBooleanType
             sync;
 
           register const unsigned char
-            *p;
+            *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           register PixelPacket
             *restrict q;
 
           ssize_t
-            count;
+            count,
+            offset;
 
           unsigned char
             *pixels;
@@ -997,9 +970,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           if (status == MagickFalse)
             continue;
           pixels=GetQuantumPixels(quantum_info);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp critical (MagickCore_ReadPNMImage)
-#endif
           {
             count=ReadBlob(image,extent,pixels);
             if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
@@ -1008,7 +978,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 MagickBooleanType
                   proceed;
 
-                proceed=SetImageProgress(image,LoadImageTag,row,image->rows);
+                proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType)
+                  row,image->rows);
                 if (proceed == MagickFalse)
                   status=MagickFalse;
               }
@@ -1016,17 +987,16 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           }
           if (count != (ssize_t) extent)
             status=MagickFalse;
-          q=QueueCacheViewAuthenticPixels(image_view,0,offset,image->columns,1,
-            exception);
+          q=QueueAuthenticPixels(image,0,offset,image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             {
               status=MagickFalse;
               continue;
             }
-          indexes=GetCacheViewAuthenticIndexQueue(image_view);
+          indexes=GetAuthenticIndexQueue(image);
           p=pixels;
           if ((image->depth == 8) || (image->depth == 16))
-            (void) ImportQuantumPixels(image,image_view,quantum_info,
+            (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
               quantum_type,pixels,exception);
           else
             switch (quantum_type)
@@ -1039,17 +1009,18 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned char
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushCharPixel(p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
-                      q->green=q->red;
-                      q->blue=q->red;
+                      SetGreenPixelComponent(q,GetRedPixelComponent(q));
+                      SetBluePixelComponent(q,GetRedPixelComponent(q));
                       SetOpacityPixelComponent(q,OpaqueOpacity);
                       if (image->matte != MagickFalse)
                         {
                           p=PushCharPixel(p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1059,17 +1030,18 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned short
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushShortPixel(MSBEndian,p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
-                      q->green=q->red;
-                      q->blue=q->red;
+                      SetGreenPixelComponent(q,GetRedPixelComponent(q));
+                      SetBluePixelComponent(q,GetRedPixelComponent(q));
                       SetOpacityPixelComponent(q,OpaqueOpacity);
                       if (image->matte != MagickFalse)
                         {
                           p=PushShortPixel(MSBEndian,p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1084,7 +1056,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned char
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushCharPixel(p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
@@ -1093,12 +1065,14 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       p=PushCharPixel(p,&pixel);
                       SetBluePixelComponent(q,ScaleAnyToQuantum(pixel,range));
                       p=PushCharPixel(p,&pixel);
-                      indexes[x]=ScaleAnyToQuantum(pixel,range);
+                      SetIndexPixelComponent(indexes+x,ScaleAnyToQuantum(pixel,
+                        range));
                       SetOpacityPixelComponent(q,OpaqueOpacity);
                       if (image->matte != MagickFalse)
                         {
                           p=PushCharPixel(p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1108,7 +1082,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned short
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushShortPixel(MSBEndian,p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
@@ -1117,12 +1091,14 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       p=PushShortPixel(MSBEndian,p,&pixel);
                       SetBluePixelComponent(q,ScaleAnyToQuantum(pixel,range));
                       p=PushShortPixel(MSBEndian,p,&pixel);
-                      indexes[x]=ScaleAnyToQuantum(pixel,range);
+                      SetIndexPixelComponent(indexes+x,ScaleAnyToQuantum(pixel,
+                        range));
                       SetOpacityPixelComponent(q,OpaqueOpacity);
                       if (image->matte != MagickFalse)
                         {
                           p=PushShortPixel(MSBEndian,p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1136,7 +1112,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned char
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushCharPixel(p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
@@ -1148,7 +1124,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       if (image->matte != MagickFalse)
                         {
                           p=PushCharPixel(p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1158,7 +1135,7 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                     unsigned short
                       pixel;
 
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       p=PushShortPixel(MSBEndian,p,&pixel);
                       SetRedPixelComponent(q,ScaleAnyToQuantum(pixel,range));
@@ -1170,7 +1147,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                       if (image->matte != MagickFalse)
                         {
                           p=PushShortPixel(MSBEndian,p,&pixel);
-                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,range));
+                          SetOpacityPixelComponent(q,ScaleAnyToQuantum(pixel,
+                            range));
                         }
                       q++;
                     }
@@ -1178,11 +1156,10 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 break;
               }
             }
-          sync=SyncCacheViewAuthenticPixels(image_view,exception);
+          sync=SyncAuthenticPixels(image,exception);
           if (sync == MagickFalse)
             status=MagickFalse;
         }
-        image_view=DestroyCacheView(image_view);
         quantum_info=DestroyQuantumInfo(quantum_info);
         if (status == MagickFalse)
           ThrowReaderException(CorruptImageError,"UnableToReadImageData");
@@ -1210,15 +1187,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
         SetQuantumScale(quantum_info,(MagickRealType) QuantumRange*
           fabs(quantum_scale));
         extent=GetQuantumExtent(image,quantum_info,quantum_type);
-        image_view=AcquireCacheView(image);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp parallel for schedule(static,1) shared(row,status,quantum_type)
-#endif
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          long
-            offset;
-
           MagickBooleanType
             sync;
 
@@ -1226,7 +1196,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
             *restrict q;
 
           ssize_t
-            count;
+            count,
+            offset;
 
           size_t
             length;
@@ -1237,9 +1208,6 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           if (status == MagickFalse)
             continue;
           pixels=GetQuantumPixels(quantum_info);
-#if defined(MAGICKCORE_OPENMP_SUPPORT) && (_OPENMP > 200505)
-  #pragma omp critical (MagickCore_ReadPNMImage)
-#endif
           {
             count=ReadBlob(image,extent,pixels);
             if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
@@ -1248,7 +1216,8 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
                 MagickBooleanType
                   proceed;
 
-                proceed=SetImageProgress(image,LoadImageTag,row,image->rows);
+                proceed=SetImageProgress(image,LoadImageTag,(MagickOffsetType)
+                  row,image->rows);
                 if (proceed == MagickFalse)
                   status=MagickFalse;
               }
@@ -1256,22 +1225,21 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
           }
           if ((size_t) count != extent)
             status=MagickFalse;
-          q=QueueCacheViewAuthenticPixels(image_view,0,(long) (image->rows-
-            offset-1),image->columns,1,exception);
+          q=QueueAuthenticPixels(image,0,(ssize_t) (image->rows-offset-1),
+            image->columns,1,exception);
           if (q == (PixelPacket *) NULL)
             {
               status=MagickFalse;
               continue;
             }
-          length=ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
-            pixels,exception);
+          length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
+            quantum_type,pixels,exception);
           if (length != extent)
             status=MagickFalse;
-          sync=SyncCacheViewAuthenticPixels(image_view,exception);
+          sync=SyncAuthenticPixels(image,exception);
           if (sync == MagickFalse)
             status=MagickFalse;
         }
-        image_view=DestroyCacheView(image_view);
         quantum_info=DestroyQuantumInfo(quantum_info);
         if (status == MagickFalse)
           ThrowReaderException(CorruptImageError,"UnableToReadImageData");
@@ -1345,10 +1313,10 @@ static Image *ReadPNMImage(const ImageInfo *image_info,ExceptionInfo *exception)
 %
 %  The format of the RegisterPNMImage method is:
 %
-%      unsigned long RegisterPNMImage(void)
+%      size_t RegisterPNMImage(void)
 %
 */
-ModuleExport unsigned long RegisterPNMImage(void)
+ModuleExport size_t RegisterPNMImage(void)
 {
   MagickInfo
     *entry;
@@ -1368,6 +1336,7 @@ ModuleExport unsigned long RegisterPNMImage(void)
   entry=SetMagickInfo("PFM");
   entry->decoder=(DecodeImageHandler *) ReadPNMImage;
   entry->encoder=(EncodeImageHandler *) WritePNMImage;
+  entry->endian_support=MagickTrue;
   entry->description=ConstantString("Portable float format");
   entry->module=ConstantString("PFM");
   (void) RegisterMagickInfo(entry);
@@ -1458,9 +1427,6 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
   IndexPacket
     index;
 
-  long
-    y;
-
   MagickBooleanType
     status;
 
@@ -1476,20 +1442,18 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
   QuantumType
     quantum_type;
 
-  register long
-    i;
-
   register unsigned char
     *pixels,
     *q;
 
-  ssize_t
-    count;
-
   size_t
     extent,
     packet_size;
 
+  ssize_t
+    count,
+    y;
+
   /*
     Open output image file.
   */
@@ -1595,8 +1559,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
       {
         if (image->colorspace != RGBColorspace)
           (void) TransformImageColorspace(image,RGBColorspace);
-        (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n",
-          image->columns,image->rows);
+        (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n",
+          (double) image->columns,(double) image->rows);
         (void) WriteBlobString(image,buffer);
       }
     else
@@ -1608,7 +1572,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           PAM header.
         */
         (void) FormatMagickString(buffer,MaxTextExtent,
-          "WIDTH %lu\nHEIGHT %lu\n",image->columns,image->rows);
+          "WIDTH %.20g\nHEIGHT %.20g\n",(double) image->columns,(double)
+          image->rows);
         (void) WriteBlobString(image,buffer);
         quantum_type=GetQuantumType(image,&image->exception);
         switch (quantum_type)
@@ -1645,7 +1610,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         if (image->depth > 16)
           image->depth=16;
         (void) FormatMagickString(buffer,MaxTextExtent,
-          "DEPTH %lu\nMAXVAL %lu\n",(unsigned long) packet_size,(unsigned long)
+          "DEPTH %.20g\nMAXVAL %.20g\n",(double) packet_size,(double)
           GetQuantumRange(image->depth));
         (void) WriteBlobString(image,buffer);
         (void) FormatMagickString(buffer,MaxTextExtent,"TUPLTYPE %s\nENDHDR\n",
@@ -1666,22 +1631,18 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           Convert image to a PBM image.
         */
         q=pixels;
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          register const IndexPacket
-            *restrict indexes;
-
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
           if (p == (const PixelPacket *) NULL)
             break;
-          indexes=GetVirtualIndexQueue(image);
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
             pixel=PixelIntensityToQuantum(p);
             *q++=(unsigned char) (pixel >= (Quantum) (QuantumRange/2) ?
@@ -1692,13 +1653,13 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                 *q++='\n';
                 (void) WriteBlob(image,q-pixels,pixels);
                 q=pixels;
-                i=0;
               }
             p++;
           }
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -1723,18 +1684,18 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         else
           (void) WriteBlobString(image,"65535\n");
         q=pixels;
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
           if (p == (const PixelPacket *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
             index=PixelIntensityToQuantum(p);
             if (image->depth <= 8)
@@ -1756,7 +1717,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           }
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -1781,18 +1743,18 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         else
           (void) WriteBlobString(image,"65535\n");
         q=pixels;
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
           if (p == (const PixelPacket *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
             if (image->depth <= 8)
               count=(ssize_t) FormatMagickString(buffer,MaxTextExtent,
@@ -1817,7 +1779,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           }
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -1840,7 +1803,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
         quantum_info->min_is_white=MagickTrue;
         pixels=GetQuantumPixels(quantum_info);
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const PixelPacket
             *restrict p;
@@ -1855,7 +1818,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -1873,7 +1837,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         */
         if (image->depth > 8)
           image->depth=16;
-        (void) FormatMagickString(buffer,MaxTextExtent,"%lu\n",(unsigned long)
+        (void) FormatMagickString(buffer,MaxTextExtent,"%.20g\n",(double)
           GetQuantumRange(image->depth));
         (void) WriteBlobString(image,buffer);
         quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
@@ -1883,12 +1847,12 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         pixels=GetQuantumPixels(quantum_info);
         extent=GetQuantumExtent(image,quantum_info,GrayQuantum);
         range=GetQuantumRange(image->depth);
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
@@ -1901,7 +1865,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           else
             {
               if (image->depth <= 8)
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   if (IsGrayPixel(p) == MagickFalse)
                     pixel=ScaleQuantumToAny(PixelIntensityToQuantum(p),range);
@@ -1910,13 +1874,13 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                       if (image->depth == 8)
                         pixel=ScaleQuantumToChar(GetRedPixelComponent(p));
                       else
-                        pixel=ScaleQuantumToAny(p->red,range);
+                        pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                     }
                   q=PopCharPixel((unsigned char) pixel,q);
                   p++;
                 }
               else
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   if (IsGrayPixel(p) == MagickFalse)
                     pixel=ScaleQuantumToAny(PixelIntensityToQuantum(p),range);
@@ -1925,7 +1889,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                       if (image->depth == 16)
                         pixel=ScaleQuantumToShort(GetRedPixelComponent(p));
                       else
-                        pixel=ScaleQuantumToAny(p->red,range);
+                        pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                     }
                   q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
                   p++;
@@ -1937,7 +1901,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -1955,7 +1920,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         */
         if (image->depth > 8)
           image->depth=16;
-        (void) FormatMagickString(buffer,MaxTextExtent,"%lu\n",(unsigned long)
+        (void) FormatMagickString(buffer,MaxTextExtent,"%.20g\n",(double)
           GetQuantumRange(image->depth));
         (void) WriteBlobString(image,buffer);
         quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
@@ -1964,12 +1929,12 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         pixels=GetQuantumPixels(quantum_info);
         extent=GetQuantumExtent(image,quantum_info,quantum_type);
         range=GetQuantumRange(image->depth);
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
@@ -1982,37 +1947,25 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           else
             {
               if (image->depth <= 8)
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
-                  pixel=ScaleQuantumToAny(p->red,range);
+                  pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                   q=PopCharPixel((unsigned char) pixel,q);
-                  pixel=ScaleQuantumToAny(p->green,range);
+                  pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                   q=PopCharPixel((unsigned char) pixel,q);
-                  pixel=ScaleQuantumToAny(p->blue,range);
+                  pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                   q=PopCharPixel((unsigned char) pixel,q);
-                  if (image->matte != MagickFalse)
-                    {
-                      pixel=ScaleQuantumToAny((Quantum) (QuantumRange-
-                        GetOpacityPixelComponent(p)),range);
-                      q=PopCharPixel((unsigned char) pixel,q);
-                    }
                   p++;
                 }
               else
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
-                  pixel=ScaleQuantumToAny(p->red,range);
+                  pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                   q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                  pixel=ScaleQuantumToAny(p->green,range);
+                  pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                   q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                  pixel=ScaleQuantumToAny(p->blue,range);
+                  pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                   q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                  if (image->matte != MagickFalse)
-                    {
-                      pixel=ScaleQuantumToAny((Quantum) (QuantumRange-
-                        GetOpacityPixelComponent(p)),range);
-                      q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                    }
                   p++;
                 }
               extent=(size_t) (q-pixels);
@@ -2022,7 +1975,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -2043,7 +1997,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
         pixels=GetQuantumPixels(quantum_info);
         range=GetQuantumRange(image->depth);
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           register const IndexPacket
             *restrict indexes;
@@ -2051,7 +2005,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           register const PixelPacket
             *restrict p;
 
-          register long
+          register ssize_t
             x;
 
           p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
@@ -2070,27 +2024,27 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                 case GrayAlphaQuantum:
                 {
                   if (image->depth <= 8)
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       pixel=ScaleQuantumToAny(PixelIntensityToQuantum(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
                       if (image->matte != MagickFalse)
                         {
-                          pixel=(unsigned char) ScaleQuantumToAny(p->opacity,
-                            range);
+                          pixel=(unsigned char) ScaleQuantumToAny(
+                            GetOpacityPixelComponent(p),range);
                           q=PopCharPixel((unsigned char) pixel,q);
                         }
                       p++;
                     }
                   else
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
                       pixel=ScaleQuantumToAny(PixelIntensityToQuantum(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
                       if (image->matte != MagickFalse)
                         {
-                          pixel=(unsigned char) ScaleQuantumToAny(p->opacity,
-                            range);
+                          pixel=(unsigned char) ScaleQuantumToAny(
+                            GetOpacityPixelComponent(p),range);
                           q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
                         }
                       p++;
@@ -2101,15 +2055,16 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                 case CMYKAQuantum:
                 {
                   if (image->depth <= 8)
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
-                      pixel=ScaleQuantumToAny(p->red,range);
+                      pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
-                      pixel=ScaleQuantumToAny(p->green,range);
+                      pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
-                      pixel=ScaleQuantumToAny(p->blue,range);
+                      pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
-                      pixel=ScaleQuantumToAny(indexes[x],range);
+                      pixel=ScaleQuantumToAny(
+                        GetIndexPixelComponent(indexes+x),range);
                       q=PopCharPixel((unsigned char) pixel,q);
                       if (image->matte != MagickFalse)
                         {
@@ -2120,15 +2075,16 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                       p++;
                     }
                   else
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
-                      pixel=ScaleQuantumToAny(p->red,range);
+                      pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                      pixel=ScaleQuantumToAny(p->green,range);
+                      pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                      pixel=ScaleQuantumToAny(p->blue,range);
+                      pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                      pixel=ScaleQuantumToAny(indexes[x],range);
+                      pixel=ScaleQuantumToAny(
+                        GetIndexPixelComponent(indexes+x),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
                       if (image->matte != MagickFalse)
                         {
@@ -2143,13 +2099,13 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                 default:
                 {
                   if (image->depth <= 8)
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
-                      pixel=ScaleQuantumToAny(p->red,range);
+                      pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
-                      pixel=ScaleQuantumToAny(p->green,range);
+                      pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
-                      pixel=ScaleQuantumToAny(p->blue,range);
+                      pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                       q=PopCharPixel((unsigned char) pixel,q);
                       if (image->matte != MagickFalse)
                         {
@@ -2160,13 +2116,13 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
                       p++;
                     }
                   else
-                    for (x=0; x < (long) image->columns; x++)
+                    for (x=0; x < (ssize_t) image->columns; x++)
                     {
-                      pixel=ScaleQuantumToAny(p->red,range);
+                      pixel=ScaleQuantumToAny(GetRedPixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                      pixel=ScaleQuantumToAny(p->green,range);
+                      pixel=ScaleQuantumToAny(GetGreenPixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
-                      pixel=ScaleQuantumToAny(p->blue,range);
+                      pixel=ScaleQuantumToAny(GetBluePixelComponent(p),range);
                       q=PopShortPixel(MSBEndian,(unsigned short) pixel,q);
                       if (image->matte != MagickFalse)
                         {
@@ -2186,7 +2142,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
             break;
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
@@ -2208,7 +2165,7 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
         if (status == MagickFalse)
           ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
         pixels=GetQuantumPixels(quantum_info);
-        for (y=(long) image->rows-1; y >= 0; y--)
+        for (y=(ssize_t) image->rows-1; y >= 0; y--)
         {
           register const PixelPacket
             *restrict p;
@@ -2221,7 +2178,8 @@ static MagickBooleanType WritePNMImage(const ImageInfo *image_info,Image *image)
           (void) WriteBlob(image,extent,pixels);
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }