]> granicus.if.org Git - imagemagick/blobdiff - coders/viff.c
Accommodate background color index in PLTE chunk
[imagemagick] / coders / viff.c
index a0db6d9b06a30534484dafa873a2b8c236f4f4b5..2cfd1c742ddfe583aff78a1a0041246d3e01d368 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2012 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  %
 /*
   Include declarations.
 */
-#include "magick/studio.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/cache.h"
-#include "magick/color.h"
-#include "magick/color-private.h"
-#include "magick/colorspace.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/image.h"
-#include "magick/image-private.h"
-#include "magick/list.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/monitor.h"
-#include "magick/monitor-private.h"
-#include "magick/property.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/string_.h"
-#include "magick/module.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/attribute.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/color.h"
+#include "MagickCore/color-private.h"
+#include "MagickCore/colormap.h"
+#include "MagickCore/colorspace.h"
+#include "MagickCore/colorspace-private.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/image.h"
+#include "MagickCore/image-private.h"
+#include "MagickCore/list.h"
+#include "MagickCore/magick.h"
+#include "MagickCore/memory_.h"
+#include "MagickCore/monitor.h"
+#include "MagickCore/monitor-private.h"
+#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/property.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/static.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
 \f
 /*
   Forward declarations.
 */
 static MagickBooleanType
-  WriteVIFFImage(const ImageInfo *,Image *);
+  WriteVIFFImage(const ImageInfo *,Image *,ExceptionInfo *);
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -91,7 +95,6 @@ static MagickBooleanType
 %
 %    o length: Specifies the length of the magick string.
 %
-%
 */
 static MagickBooleanType IsVIFF(const unsigned char *magick,const size_t length)
 {
@@ -172,12 +175,12 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
     char
       comment[512];
 
-    unsigned long
+    unsigned int
       rows,
       columns,
       subrows;
 
-    long
+    int
       x_offset,
       y_offset;
 
@@ -185,7 +188,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
       x_bits_per_pixel,
       y_bits_per_pixel;
 
-    unsigned long
+    unsigned int
       location_type,
       location_dimension,
       number_of_images,
@@ -213,43 +216,38 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
   int
     bit;
 
-  long
-    y;
-
   MagickBooleanType
     status;
 
   MagickSizeType
     number_pixels;
 
-  register IndexPacket
-    *indexes;
-
-  register long
+  register ssize_t
     x;
 
-  register PixelPacket
+  register Quantum
     *q;
 
-  register long
+  register ssize_t
     i;
 
   register unsigned char
     *p;
 
+  size_t
+    bytes_per_pixel,
+    lsb_first,
+    max_packets,
+    quantum;
+
   ssize_t
-    count;
+    count,
+    y;
 
   unsigned char
     buffer[7],
     *viff_pixels;
 
-  unsigned long
-    bytes_per_pixel,
-    lsb_first,
-    max_packets,
-    quantum;
-
   ViffInfo
     viff_info;
 
@@ -263,7 +261,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
       image_info->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  image=AcquireImage(image_info);
+  image=AcquireImage(image_info,exception);
   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
   if (status == MagickFalse)
     {
@@ -292,15 +290,15 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
     count=ReadBlob(image,512,(unsigned char *) viff_info.comment);
     viff_info.comment[511]='\0';
     if (strlen(viff_info.comment) > 4)
-      (void) SetImageProperty(image,"comment",viff_info.comment);
+      (void) SetImageProperty(image,"comment",viff_info.comment,exception);
     if ((viff_info.machine_dependency == VFF_DEP_DECORDER) ||
         (viff_info.machine_dependency == VFF_DEP_NSORDER))
       {
         viff_info.rows=ReadBlobLSBLong(image);
         viff_info.columns=ReadBlobLSBLong(image);
         viff_info.subrows=ReadBlobLSBLong(image);
-        viff_info.x_offset=(long) ReadBlobLSBLong(image);
-        viff_info.y_offset=(long) ReadBlobLSBLong(image);
+        viff_info.x_offset=(int) ReadBlobLSBLong(image);
+        viff_info.y_offset=(int) ReadBlobLSBLong(image);
         viff_info.x_bits_per_pixel=(float) ReadBlobLSBLong(image);
         viff_info.y_bits_per_pixel=(float) ReadBlobLSBLong(image);
         viff_info.location_type=ReadBlobLSBLong(image);
@@ -323,8 +321,8 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
         viff_info.rows=ReadBlobMSBLong(image);
         viff_info.columns=ReadBlobMSBLong(image);
         viff_info.subrows=ReadBlobMSBLong(image);
-        viff_info.x_offset=(long) ReadBlobMSBLong(image);
-        viff_info.y_offset=(long) ReadBlobMSBLong(image);
+        viff_info.x_offset=(int) ReadBlobMSBLong(image);
+        viff_info.y_offset=(int) ReadBlobMSBLong(image);
         viff_info.x_bits_per_pixel=(float) ReadBlobMSBLong(image);
         viff_info.y_bits_per_pixel=(float) ReadBlobMSBLong(image);
         viff_info.location_type=ReadBlobMSBLong(image);
@@ -346,7 +344,8 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
       (void) ReadBlobByte(image);
     image->columns=viff_info.rows;
     image->rows=viff_info.columns;
-    image->depth=viff_info.x_bits_per_pixel <= 8 ? 8UL : MAGICKCORE_QUANTUM_DEPTH;
+    image->depth=viff_info.x_bits_per_pixel <= 8 ? 8UL :
+      MAGICKCORE_QUANTUM_DEPTH;
     /*
       Verify that we can read this VIFF image.
     */
@@ -395,7 +394,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
             image->colors=image->depth <= 8 ? 256UL : 65536UL;
             if (viff_info.data_storage_type == VFF_TYP_BIT)
               image->colors=2;
-            if (AcquireImageColormap(image,image->colors) == MagickFalse)
+            if (AcquireImageColormap(image,image->colors,exception) == MagickFalse)
               ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
           }
         break;
@@ -419,7 +418,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
           default: bytes_per_pixel=1; break;
         }
         image->colors=viff_info.map_columns;
-        if (AcquireImageColormap(image,image->colors) == MagickFalse)
+        if (AcquireImageColormap(image,image->colors,exception) == MagickFalse)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
         viff_colormap=(unsigned char *) AcquireQuantumMemory(image->colors,
           viff_info.map_rows*bytes_per_pixel*sizeof(*viff_colormap));
@@ -451,7 +450,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
             }
             default: break;
           }
-        for (i=0; i < (long) (viff_info.map_rows*image->colors); i++)
+        for (i=0; i < (ssize_t) (viff_info.map_rows*image->colors); i++)
         {
           switch ((int) viff_info.map_storage_type)
           {
@@ -461,7 +460,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
             case VFF_MAPTYP_DOUBLE: value=((double *) viff_colormap)[i]; break;
             default: value=1.0*viff_colormap[i]; break;
           }
-          if (i < (long) image->colors)
+          if (i < (ssize_t) image->colors)
             {
               image->colormap[i].red=ScaleCharToQuantum((unsigned char) value);
               image->colormap[i].green=
@@ -469,11 +468,11 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
               image->colormap[i].blue=ScaleCharToQuantum((unsigned char) value);
             }
           else
-            if (i < (long) (2*image->colors))
+            if (i < (ssize_t) (2*image->colors))
               image->colormap[i % image->colors].green=
                 ScaleCharToQuantum((unsigned char) value);
             else
-              if (i < (long) (3*image->colors))
+              if (i < (ssize_t) (3*image->colors))
                 image->colormap[i % image->colors].blue=
                   ScaleCharToQuantum((unsigned char) value);
         }
@@ -508,7 +507,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
     if (viff_info.data_storage_type == VFF_TYP_BIT)
       max_packets=((image->columns+7UL) >> 3UL)*image->rows;
     else
-      max_packets=(unsigned long) (number_pixels*viff_info.number_data_bands);
+      max_packets=(size_t) (number_pixels*viff_info.number_data_bands);
     viff_pixels=(unsigned char *) AcquireQuantumMemory(max_packets,
       bytes_per_pixel*sizeof(*viff_pixels));
     if (viff_pixels == (unsigned char *) NULL)
@@ -554,7 +553,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
         }
         max_value=value;
         min_value=value;
-        for (i=0; i < (long) max_packets; i++)
+        for (i=0; i < (ssize_t) max_packets; i++)
         {
           switch ((int) viff_info.data_storage_type)
           {
@@ -585,7 +584,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
       Convert pixels to Quantum size.
     */
     p=(unsigned char *) viff_pixels;
-    for (i=0; i < (long) max_packets; i++)
+    for (i=0; i < (ssize_t) max_packets; i++)
     {
       switch ((int) viff_info.data_storage_type)
       {
@@ -616,33 +615,36 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
         /*
           Convert bitmap scanline.
         */
-        (void) SetImageType(image,BilevelType);
-        (void) SetImageType(image,PaletteType);
-        for (y=0; y < (long) image->rows; y++)
+        (void) SetImageType(image,BilevelType,exception);
+        (void) SetImageType(image,PaletteType,exception);
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
-          if (q == (PixelPacket *) NULL)
+          if (q == (Quantum *) NULL)
             break;
-          indexes=GetAuthenticIndexQueue(image);
-          for (x=0; x < (long) (image->columns-7); x+=8)
+          for (x=0; x < (ssize_t) (image->columns-7); x+=8)
           {
             for (bit=0; bit < 8; bit++)
-              if (PixelIntensity(q) < ((MagickRealType) QuantumRange/2.0))
+            {
+              if (GetPixelIntensity(image,q) < ((MagickRealType) QuantumRange/2.0))
                 {
-                  quantum=(unsigned long) indexes[x+bit];
+                  quantum=(size_t) GetPixelIndex(image,q);
                   quantum|=0x01;
-                  indexes[x+bit]=(IndexPacket) quantum;
+                  SetPixelIndex(image,quantum,q);
                 }
+              q+=GetPixelChannels(image);
+            }
             p++;
           }
           if ((image->columns % 8) != 0)
             {
-              for (bit=0; bit < (long) (image->columns % 8); bit++)
-                if (PixelIntensity(q) < ((MagickRealType) QuantumRange/2.0))
+              for (bit=0; bit < (ssize_t) (image->columns % 8); bit++)
+                if (GetPixelIntensity(image,q) < ((MagickRealType) QuantumRange/2.0))
                   {
-                    quantum=(unsigned long) indexes[x+bit];
+                    quantum=(size_t) GetPixelIndex(image,q);
                     quantum|=0x01;
-                    indexes[x+bit]=(IndexPacket) quantum;
+                    SetPixelIndex(image,quantum,q);
+                    q+=GetPixelChannels(image);
                   }
               p++;
             }
@@ -650,7 +652,8 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
             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;
             }
@@ -658,19 +661,22 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
       }
     else
       if (image->storage_class == PseudoClass)
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
           q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
-          if (q == (PixelPacket *) NULL)
+          if (q == (Quantum *) NULL)
             break;
-          indexes=GetAuthenticIndexQueue(image);
-          for (x=0; x < (long) image->columns; x++)
-            indexes[x]=(IndexPacket) (*p++);
+          for (x=0; x < (ssize_t) image->columns; x++)
+          {
+            SetPixelIndex(image,*p++,q);
+            q+=GetPixelChannels(image);
+          }
           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;
             }
@@ -681,32 +687,36 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
             Convert DirectColor scanline.
           */
           number_pixels=(MagickSizeType) image->columns*image->rows;
-          for (y=0; y < (long) image->rows; y++)
+          for (y=0; y < (ssize_t) image->rows; y++)
           {
             q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
-            if (q == (PixelPacket *) NULL)
+            if (q == (Quantum *) NULL)
               break;
-            for (x=0; x < (long) image->columns; x++)
+            for (x=0; x < (ssize_t) image->columns; x++)
             {
-              q->red=ScaleCharToQuantum(*p);
-              q->green=ScaleCharToQuantum(*(p+number_pixels));
-              q->blue=ScaleCharToQuantum(*(p+2*number_pixels));
+              SetPixelRed(image,ScaleCharToQuantum(*p),q);
+              SetPixelGreen(image,ScaleCharToQuantum(*(p+number_pixels)),q);
+              SetPixelBlue(image,ScaleCharToQuantum(*(p+2*number_pixels)),q);
               if (image->colors != 0)
                 {
-                  q->red=image->colormap[(long) q->red].red;
-                  q->green=image->colormap[(long) q->green].green;
-                  q->blue=image->colormap[(long) q->blue].blue;
+                  SetPixelRed(image,image->colormap[(ssize_t)
+                    GetPixelRed(image,q)].red,q);
+                  SetPixelGreen(image,image->colormap[(ssize_t)
+                    GetPixelGreen(image,q)].green,q);
+                  SetPixelBlue(image,image->colormap[(ssize_t)
+                    GetPixelBlue(image,q)].blue,q);
                 }
-              q->opacity=(Quantum) (image->matte ? QuantumRange-
-                ScaleCharToQuantum(*(p+number_pixels*3)) : OpaqueOpacity);
+              SetPixelAlpha(image,image->matte != MagickFalse ?
+                ScaleCharToQuantum(*(p+number_pixels*3)) : OpaqueAlpha,q);
               p++;
-              q++;
+              q+=GetPixelChannels(image);
             }
             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;
               }
@@ -714,7 +724,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
         }
     viff_pixels=(unsigned char *) RelinquishMagickMemory(viff_pixels);
     if (image->storage_class == PseudoClass)
-      (void) SyncImage(image);
+      (void) SyncImage(image,exception);
     if (EOFBlob(image) != MagickFalse)
       {
         ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
@@ -733,7 +743,7 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
         /*
           Allocate next image structure.
         */
-        AcquireNextImage(image_info,image);
+        AcquireNextImage(image_info,image,exception);
         if (GetNextImageInList(image) == (Image *) NULL)
           {
             image=DestroyImageList(image);
@@ -770,10 +780,10 @@ static Image *ReadVIFFImage(const ImageInfo *image_info,
 %
 %  The format of the RegisterVIFFImage method is:
 %
-%      unsigned long RegisterVIFFImage(void)
+%      size_t RegisterVIFFImage(void)
 %
 */
-ModuleExport unsigned long RegisterVIFFImage(void)
+ModuleExport size_t RegisterVIFFImage(void)
 {
   MagickInfo
     *entry;
@@ -835,7 +845,7 @@ ModuleExport void UnregisterVIFFImage(void)
 %  The format of the WriteVIFFImage method is:
 %
 %      MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
-%        Image *image)
+%        Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows.
 %
@@ -843,6 +853,8 @@ ModuleExport void UnregisterVIFFImage(void)
 %
 %    o image:  The image.
 %
+%    o exception: return any errors or warnings in this structure.
+%
 */
 
 static inline size_t MagickMin(const size_t x,const size_t y)
@@ -853,7 +865,7 @@ static inline size_t MagickMin(const size_t x,const size_t y)
 }
 
 static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
-  Image *image)
+  Image *image,ExceptionInfo *exception)
 {
 #define VFF_CM_genericRGB  15
 #define VFF_CM_NONE  0
@@ -878,20 +890,18 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
       reserve[3],
       comment[512];
 
-    unsigned long
+    size_t
       rows,
       columns,
       subrows;
 
-    long
+    int
       x_offset,
       y_offset;
 
     unsigned int
       x_bits_per_pixel,
-      y_bits_per_pixel;
-
-    unsigned long
+      y_bits_per_pixel,
       location_type,
       location_dimension,
       number_of_images,
@@ -911,9 +921,6 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
   const char
     *value;
 
-  long
-    y;
-
   MagickBooleanType
     status;
 
@@ -924,21 +931,21 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
     number_pixels,
     packets;
 
-  register const IndexPacket
-    *indexes;
-
-  register const PixelPacket
+  register const Quantum
     *p;
 
-  register long
+  register ssize_t
     x;
 
-  register long
+  register ssize_t
     i;
 
   register unsigned char
     *q;
 
+  ssize_t
+    y;
+
   unsigned char
     buffer[8],
     *viff_pixels;
@@ -955,7 +962,9 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
-  status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception);
+  assert(exception != (ExceptionInfo *) NULL);
+  assert(exception->signature == MagickSignature);
+  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
   if (status == MagickFalse)
     return(status);
   (void) ResetMagickMemory(&viff_info,0,sizeof(ViffInfo));
@@ -965,19 +974,18 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
     /*
       Initialize VIFF image structure.
     */
-    if (image->colorspace != RGBColorspace)
-      (void) TransformImageColorspace(image,RGBColorspace);
-    if (IsGrayImage(image,&image->exception) != MagickFalse)
-      (void) SetImageStorageClass(image,DirectClass);
+    if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
+      (void) TransformImageColorspace(image,sRGBColorspace,exception);
     viff_info.identifier=(char) 0xab;
     viff_info.file_type=1;
     viff_info.release=1;
     viff_info.version=3;
     viff_info.machine_dependency=VFF_DEP_IEEEORDER;  /* IEEE byte ordering */
     *viff_info.comment='\0';
-    value=GetImageProperty(image,"comment");
+    value=GetImageProperty(image,"comment",exception);
     if (value != (const char *) NULL)
-      (void) CopyMagickString(viff_info.comment,value,MagickMin(strlen(value),511)+1);
+      (void) CopyMagickString(viff_info.comment,value,MagickMin(strlen(value),
+        511)+1);
     viff_info.rows=image->columns;
     viff_info.columns=image->rows;
     viff_info.subrows=0;
@@ -1013,7 +1021,7 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
         viff_info.color_space_model=VFF_CM_NONE;
         viff_info.data_storage_type=VFF_TYP_1_BYTE;
         packets=number_pixels;
-        if (IsGrayImage(image,&image->exception) == MagickFalse)
+        if (IsImageGray(image,exception) == MagickFalse)
           {
             /*
               Colormapped VIFF raster.
@@ -1021,7 +1029,7 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
             viff_info.map_scheme=VFF_MS_ONEPERBAND;
             viff_info.map_storage_type=VFF_MAPTYP_1_BYTE;
             viff_info.map_rows=3;
-            viff_info.map_columns=image->colors;
+            viff_info.map_columns=(unsigned int) image->colors;
           }
         else
           if (image->colors <= 2)
@@ -1046,29 +1054,29 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
     buffer[7]=(unsigned char) viff_info.reserve[2];
     (void) WriteBlob(image,8,buffer);
     (void) WriteBlob(image,512,(unsigned char *) viff_info.comment);
-    (void) WriteBlobMSBLong(image,viff_info.rows);
-    (void) WriteBlobMSBLong(image,viff_info.columns);
-    (void) WriteBlobMSBLong(image,viff_info.subrows);
-    (void) WriteBlobMSBLong(image,(unsigned long) viff_info.x_offset);
-    (void) WriteBlobMSBLong(image,(unsigned long) viff_info.y_offset);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.rows);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.columns);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.subrows);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.x_offset);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.y_offset);
     viff_info.x_bits_per_pixel=1U*(63 << 24) | (128 << 16);
-    (void) WriteBlobMSBLong(image,(unsigned long) viff_info.x_bits_per_pixel);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.x_bits_per_pixel);
     viff_info.y_bits_per_pixel=1U*(63 << 24) | (128 << 16);
-    (void) WriteBlobMSBLong(image,(unsigned long) viff_info.y_bits_per_pixel);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.y_bits_per_pixel);
     (void) WriteBlobMSBLong(image,viff_info.location_type);
     (void) WriteBlobMSBLong(image,viff_info.location_dimension);
-    (void) WriteBlobMSBLong(image,viff_info.number_of_images);
-    (void) WriteBlobMSBLong(image,viff_info.number_data_bands);
-    (void) WriteBlobMSBLong(image,viff_info.data_storage_type);
-    (void) WriteBlobMSBLong(image,viff_info.data_encode_scheme);
-    (void) WriteBlobMSBLong(image,viff_info.map_scheme);
-    (void) WriteBlobMSBLong(image,viff_info.map_storage_type);
-    (void) WriteBlobMSBLong(image,viff_info.map_rows);
-    (void) WriteBlobMSBLong(image,viff_info.map_columns);
-    (void) WriteBlobMSBLong(image,viff_info.map_subrows);
-    (void) WriteBlobMSBLong(image,viff_info.map_enable);
-    (void) WriteBlobMSBLong(image,viff_info.maps_per_cycle);
-    (void) WriteBlobMSBLong(image,viff_info.color_space_model);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.number_of_images);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.number_data_bands);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.data_storage_type);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.data_encode_scheme);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_scheme);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_storage_type);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_rows);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_columns);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_subrows);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.map_enable);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.maps_per_cycle);
+    (void) WriteBlobMSBLong(image,(unsigned int) viff_info.color_space_model);
     for (i=0; i < 420; i++)
       (void) WriteBlobByte(image,'\0');
     /*
@@ -1085,32 +1093,33 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
           Convert DirectClass packet to VIFF RGB pixel.
         */
         number_pixels=(MagickSizeType) image->columns*image->rows;
-        for (y=0; y < (long) image->rows; y++)
+        for (y=0; y < (ssize_t) image->rows; y++)
         {
-          p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
-          if (p == (const PixelPacket *) NULL)
+          p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+          if (p == (const Quantum *) NULL)
             break;
-          for (x=0; x < (long) image->columns; x++)
+          for (x=0; x < (ssize_t) image->columns; x++)
           {
-            *q=ScaleQuantumToChar(GetRedPixelComponent(p));
-            *(q+number_pixels)=ScaleQuantumToChar(GetGreenPixelComponent(p));
-            *(q+number_pixels*2)=ScaleQuantumToChar(GetBluePixelComponent(p));
+            *q=ScaleQuantumToChar(GetPixelRed(image,p));
+            *(q+number_pixels)=ScaleQuantumToChar(GetPixelGreen(image,p));
+            *(q+number_pixels*2)=ScaleQuantumToChar(GetPixelBlue(image,p));
             if (image->matte != MagickFalse)
               *(q+number_pixels*3)=ScaleQuantumToChar((Quantum)
-                (GetAlphaPixelComponent(p)));
-            p++;
+                (GetPixelAlpha(image,p)));
+            p+=GetPixelChannels(image);
             q++;
           }
           if (image->previous == (Image *) NULL)
             {
-              status=SetImageProgress(image,SaveImageTag,y,image->rows);
+              status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
+                image->rows);
               if (status == MagickFalse)
                 break;
             }
         }
       }
     else
-      if (IsGrayImage(image,&image->exception) == MagickFalse)
+      if (IsImageGray(image,exception) == MagickFalse)
         {
           unsigned char
             *viff_colormap;
@@ -1123,11 +1132,11 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
           if (viff_colormap == (unsigned char *) NULL)
             ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
           q=viff_colormap;
-          for (i=0; i < (long) image->colors; i++)
+          for (i=0; i < (ssize_t) image->colors; i++)
             *q++=ScaleQuantumToChar(image->colormap[i].red);
-          for (i=0; i < (long) image->colors; i++)
+          for (i=0; i < (ssize_t) image->colors; i++)
             *q++=ScaleQuantumToChar(image->colormap[i].green);
-          for (i=0; i < (long) image->colors; i++)
+          for (i=0; i < (ssize_t) image->colors; i++)
             *q++=ScaleQuantumToChar(image->colormap[i].blue);
           (void) WriteBlob(image,3*image->colors,viff_colormap);
           viff_colormap=(unsigned char *) RelinquishMagickMemory(viff_colormap);
@@ -1135,17 +1144,20 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
             Convert PseudoClass packet to VIFF colormapped pixels.
           */
           q=viff_pixels;
-          for (y=0; y < (long) image->rows; y++)
+          for (y=0; y < (ssize_t) image->rows; y++)
           {
-            p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception);
-            if (p == (const PixelPacket *) NULL)
+            p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+            if (p == (const Quantum *) NULL)
               break;
-            indexes=GetVirtualIndexQueue(image);
-            for (x=0; x < (long) image->columns; x++)
-              *q++=(unsigned char) indexes[x];
+            for (x=0; x < (ssize_t) image->columns; x++)
+            {
+              *q++=(unsigned char) GetPixelIndex(image,p);
+              p+=GetPixelChannels(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;
               }
@@ -1154,7 +1166,7 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
       else
         if (image->colors <= 2)
           {
-            long
+            ssize_t
               x,
               y;
 
@@ -1165,20 +1177,18 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
             /*
               Convert PseudoClass image to a VIFF monochrome image.
             */
-            (void) SetImageType(image,BilevelType);
-            for (y=0; y < (long) image->rows; y++)
+            (void) SetImageType(image,BilevelType,exception);
+            for (y=0; y < (ssize_t) image->rows; y++)
             {
-              p=GetVirtualPixels(image,0,y,image->columns,1,
-                &image->exception);
-              if (p == (const PixelPacket *) NULL)
+              p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+              if (p == (const Quantum *) NULL)
                 break;
-              indexes=GetVirtualIndexQueue(image);
               bit=0;
               byte=0;
-              for (x=0; x < (long) image->columns; x++)
+              for (x=0; x < (ssize_t) image->columns; x++)
               {
                 byte>>=1;
-                if (PixelIntensity(p) < ((MagickRealType) QuantumRange/2.0))
+                if (GetPixelIntensity(image,p) < ((MagickRealType) QuantumRange/2.0))
                   byte|=0x80;
                 bit++;
                 if (bit == 8)
@@ -1187,12 +1197,14 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
                     bit=0;
                     byte=0;
                   }
+                p+=GetPixelChannels(image);
               }
               if (bit != 0)
                 *q++=byte >> (8-bit);
               if (image->previous == (Image *) NULL)
                 {
-                  status=SetImageProgress(image,SaveImageTag,y,image->rows);
+                  status=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
+                    y,image->rows);
                   if (status == MagickFalse)
                     break;
                 }
@@ -1203,20 +1215,20 @@ static MagickBooleanType WriteVIFFImage(const ImageInfo *image_info,
             /*
               Convert PseudoClass packet to VIFF grayscale pixel.
             */
-            for (y=0; y < (long) image->rows; y++)
+            for (y=0; y < (ssize_t) image->rows; y++)
             {
-              p=GetVirtualPixels(image,0,y,image->columns,1,
-                &image->exception);
-              if (p == (const PixelPacket *) NULL)
+              p=GetVirtualPixels(image,0,y,image->columns,1,exception);
+              if (p == (const Quantum *) NULL)
                 break;
-              for (x=0; x < (long) image->columns; x++)
+              for (x=0; x < (ssize_t) image->columns; x++)
               {
-                *q++=(unsigned char) PixelIntensityToQuantum(p);
-                p++;
+                *q++=(unsigned char) GetPixelIntensity(image,p);
+                p+=GetPixelChannels(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;
                 }