]> granicus.if.org Git - imagemagick/blobdiff - coders/pict.c
(no commit message)
[imagemagick] / coders / pict.c
index 2b316cc41ff51499116fef90b35e1f9b3b197855..09ba705b49247bde1c9424626fd582b5a65c011d 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-private.h"
-#include "magick/colormap.h"
-#include "magick/colormap-private.h"
-#include "magick/colorspace.h"
-#include "magick/composite.h"
-#include "magick/constitute.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/log.h"
-#include "magick/magick.h"
-#include "magick/memory_.h"
-#include "magick/monitor.h"
-#include "magick/monitor-private.h"
-#include "magick/profile.h"
-#include "magick/resource_.h"
-#include "magick/quantum-private.h"
-#include "magick/static.h"
-#include "magick/string_.h"
-#include "magick/module.h"
-#include "magick/transform.h"
-#include "magick/utility.h"
+#include "MagickCore/studio.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/color-private.h"
+#include "MagickCore/colormap.h"
+#include "MagickCore/colormap-private.h"
+#include "MagickCore/colorspace.h"
+#include "MagickCore/colorspace-private.h"
+#include "MagickCore/composite.h"
+#include "MagickCore/constitute.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/log.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/profile.h"
+#include "MagickCore/resource_.h"
+#include "MagickCore/quantum-private.h"
+#include "MagickCore/static.h"
+#include "MagickCore/string_.h"
+#include "MagickCore/module.h"
+#include "MagickCore/transform.h"
+#include "MagickCore/utility.h"
 \f
 /*
   ImageMagick Macintosh PICT Methods.
@@ -319,7 +321,7 @@ static const PICTCode
   Forward declarations.
 */
 static MagickBooleanType
-  WritePICTImage(const ImageInfo *,Image *);
+  WritePICTImage(const ImageInfo *,Image *,ExceptionInfo *);
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -425,12 +427,9 @@ static unsigned char *ExpandBuffer(unsigned char *pixels,
 }
 
 static unsigned char *DecodeImage(Image *blob,Image *image,
-  size_t bytes_per_line,const unsigned int bits_per_pixel,size_t *extent)
+  size_t bytes_per_line,const unsigned int bits_per_pixel,size_t *extent,
+  ExceptionInfo *exception)
 {
-  ssize_t
-    j,
-    y;
-
   MagickSizeType
     number_pixels;
 
@@ -442,21 +441,21 @@ static unsigned char *DecodeImage(Image *blob,Image *image,
     *q;
 
   size_t
+    bytes_per_pixel,
     length,
-    row_bytes;
+    row_bytes,
+    scanline_length,
+    width;
 
   ssize_t
-    count;
+    count,
+    j,
+    y;
 
   unsigned char
     *pixels,
     *scanline;
 
-  size_t
-    bytes_per_pixel,
-    scanline_length,
-    width;
-
   /*
     Determine pixel buffer size.
   */
@@ -496,13 +495,14 @@ static unsigned char *DecodeImage(Image *blob,Image *image,
       */
       for (y=0; y < (ssize_t) image->rows; y++)
       {
-        q=pixels+y*width;
+        q=pixels+y*width*GetPixelChannels(image);;
         number_pixels=bytes_per_line;
         count=ReadBlob(blob,(size_t) number_pixels,scanline);
+        (void) count;
         p=ExpandBuffer(scanline,&number_pixels,bits_per_pixel);
         if ((q+number_pixels) > (pixels+(*extent)))
           {
-            (void) ThrowMagickException(&image->exception,GetMagickModule(),
+            (void) ThrowMagickException(exception,GetMagickModule(),
               CorruptImageError,"UnableToUncompressImage","`%s'",
               image->filename);
             break;
@@ -524,7 +524,7 @@ static unsigned char *DecodeImage(Image *blob,Image *image,
       scanline_length=1UL*ReadBlobByte(blob);
     if (scanline_length >= row_bytes)
       {
-        (void) ThrowMagickException(&image->exception,GetMagickModule(),
+        (void) ThrowMagickException(exception,GetMagickModule(),
           CorruptImageError,"UnableToUncompressImage","`%s'",image->filename);
         break;
       }
@@ -551,7 +551,7 @@ static unsigned char *DecodeImage(Image *blob,Image *image,
               (void) CopyMagickMemory(q,p,(size_t) number_pixels);
             q+=number_pixels;
           }
-          j+=bytes_per_pixel+1;
+          j+=(ssize_t) bytes_per_pixel+1;
         }
   }
   scanline=(unsigned char *) RelinquishMagickMemory(scanline);
@@ -595,11 +595,6 @@ static size_t EncodeImage(Image *image,const unsigned char *scanline,
 #define MaxCount  128
 #define MaxPackbitsRunlength  128
 
-  ssize_t
-    count,
-    repeat_count,
-    runlength;
-
   register const unsigned char
     *p;
 
@@ -612,6 +607,11 @@ static size_t EncodeImage(Image *image,const unsigned char *scanline,
   size_t
     length;
 
+  ssize_t
+    count,
+    repeat_count,
+    runlength;
+
   unsigned char
     index;
 
@@ -798,19 +798,10 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
   Image
     *image;
 
-  IndexPacket
-    index;
-
   int
     c,
     code;
 
-  ssize_t
-    flags,
-    j,
-    version,
-    y;
-
   MagickBooleanType
     jpeg,
     status;
@@ -821,24 +812,26 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
   PICTPixmap
     pixmap;
 
-  register IndexPacket
-    *indexes;
-
-  register ssize_t
-    x;
+  Quantum
+    index;
 
-  register PixelPacket
+  register Quantum
     *q;
 
   register ssize_t
-    i;
+    i,
+    x;
 
   size_t
     extent,
     length;
 
   ssize_t
-    count;
+    count,
+    flags,
+    j,
+    version,
+    y;
 
   StringInfo
     *profile;
@@ -853,7 +846,7 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
       image_info->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-  image=AcquireImage(image_info);
+  image=AcquireImage(image_info,exception);
   image->depth=8;
   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
   if (status == MagickFalse)
@@ -893,8 +886,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
   flags=0;
   image->columns=1UL*(frame.right-frame.left);
   image->rows=1UL*(frame.bottom-frame.top);
-  image->x_resolution=DefaultResolution;
-  image->y_resolution=DefaultResolution;
+  image->resolution.x=DefaultResolution;
+  image->resolution.y=DefaultResolution;
   image->units=UndefinedResolution;
   /*
     Interpret PICT opcodes.
@@ -938,7 +931,7 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
               break;
             image->columns=1UL*(frame.right-frame.left);
             image->rows=1UL*(frame.bottom-frame.top);
-            (void) SetImageBackgroundColor(image);
+            (void) SetImageBackgroundColor(image,exception);
             break;
           }
           case 0x12:
@@ -970,8 +963,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
             ReadRectangle(image,frame);
             ReadPixmap(pixmap);
             image->depth=1UL*pixmap.component_size;
-            image->x_resolution=1.0*pixmap.horizontal_resolution;
-            image->y_resolution=1.0*pixmap.vertical_resolution;
+            image->resolution.x=1.0*pixmap.horizontal_resolution;
+            image->resolution.y=1.0*pixmap.vertical_resolution;
             image->units=PixelsPerInchResolution;
             (void) ReadBlobMSBLong(image);
             flags=1L*ReadBlobMSBShort(image);
@@ -1038,8 +1031,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
           case 0x9a:
           case 0x9b:
           {
-            ssize_t
-              bytes_per_line;
+            Image
+              *tile_image;
 
             PICTRectangle
               source,
@@ -1051,12 +1044,12 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
             size_t
               j;
 
+            ssize_t
+              bytes_per_line;
+
             unsigned char
               *pixels;
 
-            Image
-              *tile_image;
-
             /*
               Pixmap clipped by a rectangle.
             */
@@ -1084,8 +1077,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
                 tile_image->depth=1UL*pixmap.component_size;
                 tile_image->matte=pixmap.component_count == 4 ?
                   MagickTrue : MagickFalse;
-                tile_image->x_resolution=(double) pixmap.horizontal_resolution;
-                tile_image->y_resolution=(double) pixmap.vertical_resolution;
+                tile_image->resolution.x=(double) pixmap.horizontal_resolution;
+                tile_image->resolution.y=(double) pixmap.vertical_resolution;
                 tile_image->units=PixelsPerInchResolution;
                 if (tile_image->matte != MagickFalse)
                   image->matte=tile_image->matte;
@@ -1102,7 +1095,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
                     flags=1L*ReadBlobMSBShort(image);
                     tile_image->colors=1UL*ReadBlobMSBShort(image)+1;
                   }
-                status=AcquireImageColormap(tile_image,tile_image->colors);
+                status=AcquireImageColormap(tile_image,tile_image->colors,
+                  exception);
                 if (status == MagickFalse)
                   {
                     tile_image=DestroyImage(tile_image);
@@ -1151,10 +1145,11 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
               }
             if ((code != 0x9a) && (code != 0x9b) &&
                 (bytes_per_line & 0x8000) == 0)
-              pixels=DecodeImage(image,tile_image,1UL*bytes_per_line,1,&extent);
+              pixels=DecodeImage(image,tile_image,1UL*bytes_per_line,1,&extent,
+                exception);
             else
               pixels=DecodeImage(image,tile_image,1UL*bytes_per_line,1U*
-                pixmap.bits_per_pixel,&extent);
+                pixmap.bits_per_pixel,&extent,exception);
             if (pixels == (unsigned char *) NULL)
               {
                 tile_image=DestroyImage(tile_image);
@@ -1171,18 +1166,20 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
                 ThrowReaderException(CorruptImageError,"NotEnoughPixelData");
               q=QueueAuthenticPixels(tile_image,0,y,tile_image->columns,1,
                 exception);
-              if (q == (PixelPacket *) NULL)
+              if (q == (Quantum *) NULL)
                 break;
-              indexes=GetAuthenticIndexQueue(tile_image);
               for (x=0; x < (ssize_t) tile_image->columns; x++)
               {
                 if (tile_image->storage_class == PseudoClass)
                   {
-                    index=ConstrainColormapIndex(tile_image,*p);
-                    indexes[x]=index;
-                    q->red=tile_image->colormap[(ssize_t) index].red;
-                    q->green=tile_image->colormap[(ssize_t) index].green;
-                    q->blue=tile_image->colormap[(ssize_t) index].blue;
+                    index=ConstrainColormapIndex(tile_image,*p,exception);
+                    SetPixelIndex(tile_image,index,q);
+                    SetPixelRed(tile_image,
+                      tile_image->colormap[(ssize_t) index].red,q);
+                    SetPixelGreen(tile_image,
+                      tile_image->colormap[(ssize_t) index].green,q);
+                    SetPixelBlue(tile_image,
+                      tile_image->colormap[(ssize_t) index].blue,q);
                   }
                 else
                   {
@@ -1190,12 +1187,13 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
                       {
                         i=(*p++);
                         j=(*p);
-                        q->red=ScaleCharToQuantum((unsigned char)
-                          ((i & 0x7c) << 1));
-                        q->green=ScaleCharToQuantum((unsigned char)
-                          (((i & 0x03) << 6) | ((j & 0xe0) >> 2)));
-                        q->blue=ScaleCharToQuantum((unsigned char)
-                          ((j & 0x1f) << 3));
+                        SetPixelRed(tile_image,ScaleCharToQuantum(
+                          (unsigned char) ((i & 0x7c) << 1)),q);
+                        SetPixelGreen(tile_image,ScaleCharToQuantum(
+                          (unsigned char) (((i & 0x03) << 6) |
+                          ((j & 0xe0) >> 2))),q);
+                        SetPixelBlue(tile_image,ScaleCharToQuantum(
+                          (unsigned char) ((j & 0x1f) << 3)),q);
                       }
                     else
                       if (tile_image->matte == MagickFalse)
@@ -1203,28 +1201,28 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
                           if (p > (pixels+extent+2*image->columns))
                             ThrowReaderException(CorruptImageError,
                               "NotEnoughPixelData");
-                          q->red=ScaleCharToQuantum(*p);
-                          q->green=ScaleCharToQuantum(
-                            *(p+tile_image->columns));
-                          q->blue=ScaleCharToQuantum(
-                            *(p+2*tile_image->columns));
+                          SetPixelRed(tile_image,ScaleCharToQuantum(*p),q);
+                          SetPixelGreen(tile_image,ScaleCharToQuantum(
+                            *(p+tile_image->columns)),q);
+                          SetPixelBlue(tile_image,ScaleCharToQuantum(
+                            *(p+2*tile_image->columns)),q);
                         }
                       else
                         {
                           if (p > (pixels+extent+3*image->columns))
                             ThrowReaderException(CorruptImageError,
                               "NotEnoughPixelData");
-                          q->opacity=(Quantum) (QuantumRange-
-                            ScaleCharToQuantum(*p));
-                          q->red=ScaleCharToQuantum(*(p+tile_image->columns));
-                          q->green=(Quantum) ScaleCharToQuantum(
-                            *(p+2*tile_image->columns));
-                          q->blue=ScaleCharToQuantum(
-                            *(p+3*tile_image->columns));
+                          SetPixelAlpha(tile_image,ScaleCharToQuantum(*p),q);
+                          SetPixelRed(tile_image,ScaleCharToQuantum(
+                            *(p+tile_image->columns)),q);
+                          SetPixelGreen(tile_image,ScaleCharToQuantum(
+                            *(p+2*tile_image->columns)),q);
+                          SetPixelBlue(tile_image,ScaleCharToQuantum(
+                            *(p+3*tile_image->columns)),q);
                         }
                   }
                 p++;
-                q++;
+                q+=GetPixelChannels(tile_image);
               }
               if (SyncAuthenticPixels(tile_image,exception) == MagickFalse)
                 break;
@@ -1243,8 +1241,8 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
             if (jpeg == MagickFalse)
               if ((code == 0x9a) || (code == 0x9b) ||
                   ((bytes_per_line & 0x8000) != 0))
-                (void) CompositeImage(image,CopyCompositeOp,tile_image,
-                  destination.left,destination.top);
+                (void) CompositeImage(image,tile_image,CopyCompositeOp,
+                  MagickTrue,destination.left,destination.top,exception);
             tile_image=DestroyImage(tile_image);
             break;
           }
@@ -1271,15 +1269,16 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
             if (info == (unsigned char *) NULL)
               break;
             count=ReadBlob(image,length,info);
+            (void) count;
             switch (type)
             {
               case 0xe0:
               {
                 if (length == 0)
                   break;
-                profile=AcquireStringInfo(length);
+                profile=BlobToStringInfo((const void *) NULL,length);
                 SetStringInfoDatum(profile,info);
-                status=SetImageProfile(image,"icc",profile);
+                status=SetImageProfile(image,"icc",profile,exception);
                 profile=DestroyStringInfo(profile);
                 if (status == MagickFalse)
                   ThrowReaderException(ResourceLimitError,
@@ -1290,9 +1289,9 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
               {
                 if (length == 0)
                   break;
-                profile=AcquireStringInfo(length);
+                profile=BlobToStringInfo((const void *) NULL,length);
                 SetStringInfoDatum(profile,info);
-                status=SetImageProfile(image,"iptc",profile);
+                status=SetImageProfile(image,"iptc",profile,exception);
                 if (status == MagickFalse)
                   ThrowReaderException(ResourceLimitError,
                     "MemoryAllocationFailed");
@@ -1380,16 +1379,17 @@ static Image *ReadPICTImage(const ImageInfo *image_info,
         read_info=DestroyImageInfo(read_info);
         if (tile_image == (Image *) NULL)
           continue;
-        (void) FormatMagickString(geometry,MaxTextExtent,"%lux%lu",
-          (unsigned long) MagickMax(image->columns,tile_image->columns),
-          (unsigned long) MagickMax(image->rows,tile_image->rows));
+        (void) FormatLocaleString(geometry,MaxTextExtent,"%.20gx%.20g",
+          (double) MagickMax(image->columns,tile_image->columns),
+          (double) MagickMax(image->rows,tile_image->rows));
         (void) SetImageExtent(image,
           MagickMax(image->columns,tile_image->columns),
-          MagickMax(image->rows,tile_image->rows));
-        if (image->colorspace != RGBColorspace)
-          (void) TransformImageColorspace(image,tile_image->colorspace);
-        (void) CompositeImage(image,CopyCompositeOp,tile_image,frame.left,
-          frame.right);
+          MagickMax(image->rows,tile_image->rows),exception);
+        if (IssRGBCompatibleColorspace(tile_image->colorspace) == MagickFalse)
+          (void) TransformImageColorspace(image,tile_image->colorspace,
+            exception);
+        (void) CompositeImage(image,tile_image,CopyCompositeOp,MagickTrue,
+          frame.left,frame.right,exception);
         image->compression=tile_image->compression;
         tile_image=DestroyImage(tile_image);
         continue;
@@ -1455,6 +1455,7 @@ ModuleExport size_t RegisterPICTImage(void)
   entry->decoder=(DecodeImageHandler *) ReadPICTImage;
   entry->encoder=(EncodeImageHandler *) WritePICTImage;
   entry->adjoin=MagickFalse;
+  entry->seekable_stream=MagickTrue;
   entry->description=ConstantString("Apple Macintosh QuickDraw/PICT");
   entry->magick=(IsImageFormatHandler *) IsPICT;
   entry->module=ConstantString("PICT");
@@ -1463,6 +1464,7 @@ ModuleExport size_t RegisterPICTImage(void)
   entry->decoder=(DecodeImageHandler *) ReadPICTImage;
   entry->encoder=(EncodeImageHandler *) WritePICTImage;
   entry->adjoin=MagickFalse;
+  entry->seekable_stream=MagickTrue;
   entry->description=ConstantString("Apple Macintosh QuickDraw/PICT");
   entry->magick=(IsImageFormatHandler *) IsPICT;
   entry->module=ConstantString("PICT");
@@ -1512,7 +1514,7 @@ ModuleExport void UnregisterPICTImage(void)
 %  The format of the WritePICTImage method is:
 %
 %      MagickBooleanType WritePICTImage(const ImageInfo *image_info,
-%        Image *image)
+%        Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows.
 %
@@ -1520,9 +1522,11 @@ ModuleExport void UnregisterPICTImage(void)
 %
 %    o image:  The image.
 %
+%    o exception: return any errors or warnings in this structure.
+%
 */
 static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
-  Image *image)
+  Image *image,ExceptionInfo *exception)
 {
 #define MaxCount  128
 #define PictCropRegionOp  0x01
@@ -1541,9 +1545,6 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
     x_resolution,
     y_resolution;
 
-  ssize_t
-    y;
-
   MagickBooleanType
     status;
 
@@ -1561,10 +1562,7 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
     size_rectangle,
     source_rectangle;
 
-  register const IndexPacket
-    *indexes;
-
-  register const PixelPacket
+  register const Quantum
     *p;
 
   register ssize_t
@@ -1572,17 +1570,18 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
     x;
 
   size_t
-    count;
+    bytes_per_line,
+    count,
+    storage_class;
+
+  ssize_t
+    y;
 
   unsigned char
     *buffer,
     *packed_scanline,
     *scanline;
 
-  size_t
-    bytes_per_line,
-    storage_class;
-
   unsigned short
     base_address,
     row_bytes,
@@ -1599,11 +1598,13 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   if ((image->columns > 65535L) || (image->rows > 65535L))
     ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit");
-  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);
-  if (image->colorspace != RGBColorspace)
-    (void) TransformImageColorspace(image,RGBColorspace);
+  if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
+    (void) TransformImageColorspace(image,sRGBColorspace,exception);
   /*
     Initialize image info.
   */
@@ -1632,9 +1633,9 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
   pixmap.table=0;
   pixmap.reserved=0;
   transfer_mode=0;
-  x_resolution=image->x_resolution != 0.0 ? image->x_resolution :
+  x_resolution=image->resolution.x != 0.0 ? image->resolution.x :
     DefaultResolution;
-  y_resolution=image->y_resolution != 0.0 ? image->y_resolution :
+  y_resolution=image->resolution.y != 0.0 ? image->resolution.y :
     DefaultResolution;
   storage_class=image->storage_class;
   if (image_info->compression == JPEGCompression)
@@ -1739,7 +1740,7 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
       unsigned char
         *blob;
 
-      jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception);
+      jpeg_image=CloneImage(image,0,0,MagickTrue,exception);
       if (jpeg_image == (Image *) NULL)
         {
           (void) CloseBlob(image);
@@ -1749,13 +1750,13 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
       (void) CopyMagickString(jpeg_info->magick,"JPEG",MaxTextExtent);
       length=0;
       blob=(unsigned char *) ImageToBlob(jpeg_info,jpeg_image,&length,
-        &image->exception);
+        exception);
       jpeg_info=DestroyImageInfo(jpeg_info);
       if (blob == (unsigned char *) NULL)
         return(MagickFalse);
       jpeg_image=DestroyImage(jpeg_image);
       (void) WriteBlobMSBShort(image,PictJPEGOp);
-      (void) WriteBlobMSBLong(image,(size_t) length+154);
+      (void) WriteBlobMSBLong(image,(unsigned int) length+154);
       (void) WriteBlobMSBShort(image,0x0000);
       (void) WriteBlobMSBLong(image,0x00010000UL);
       (void) WriteBlobMSBLong(image,0x00000000UL);
@@ -1826,7 +1827,7 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
   */
   (void) WriteBlobMSBShort(image,(unsigned short) pixmap.version);
   (void) WriteBlobMSBShort(image,(unsigned short) pixmap.pack_type);
-  (void) WriteBlobMSBLong(image,pixmap.pack_size);
+  (void) WriteBlobMSBLong(image,(unsigned int) pixmap.pack_size);
   (void) WriteBlobMSBShort(image,(unsigned short) (x_resolution+0.5));
   (void) WriteBlobMSBShort(image,0x0000);
   (void) WriteBlobMSBShort(image,(unsigned short) (y_resolution+0.5));
@@ -1838,9 +1839,9 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
   */
   (void) WriteBlobMSBShort(image,(unsigned short) pixmap.component_count);
   (void) WriteBlobMSBShort(image,(unsigned short) pixmap.component_size);
-  (void) WriteBlobMSBLong(image,(size_t) pixmap.plane_bytes);
-  (void) WriteBlobMSBLong(image,(size_t) pixmap.table);
-  (void) WriteBlobMSBLong(image,(size_t) pixmap.reserved);
+  (void) WriteBlobMSBLong(image,(unsigned int) pixmap.plane_bytes);
+  (void) WriteBlobMSBLong(image,(unsigned int) pixmap.table);
+  (void) WriteBlobMSBLong(image,(unsigned int) pixmap.reserved);
   if (storage_class == PseudoClass)
     {
       /*
@@ -1879,18 +1880,20 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
   if ((storage_class == PseudoClass) && (image->matte == MagickFalse))
     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 < (ssize_t) image->columns; x++)
-        scanline[x]=(unsigned char) indexes[x];
+      {
+        scanline[x]=(unsigned char) GetPixelIndex(image,p);
+        p+=GetPixelChannels(image);
+      }
       count+=EncodeImage(image,scanline,(size_t) (row_bytes & 0x7FFF),
         packed_scanline);
       if (image->previous == (Image *) NULL)
         {
           status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
-                image->rows);
+            image->rows);
           if (status == MagickFalse)
             break;
         }
@@ -1900,8 +1903,8 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
       {
         (void) ResetMagickMemory(scanline,0,row_bytes);
         for (y=0; y < (ssize_t) image->rows; y++)
-          count+=EncodeImage(image,scanline,(size_t)
-            (row_bytes & 0x7FFF),packed_scanline);
+          count+=EncodeImage(image,scanline,(size_t) (row_bytes & 0x7FFF),
+            packed_scanline);
       }
     else
       {
@@ -1917,8 +1920,8 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
         opacity=scanline+3*image->columns;
         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;
           red=scanline;
           green=scanline+image->columns;
@@ -1932,13 +1935,12 @@ static MagickBooleanType WritePICTImage(const ImageInfo *image_info,
             }
           for (x=0; x < (ssize_t) image->columns; x++)
           {
-            *red++=ScaleQuantumToChar(GetRedPixelComponent(p));
-            *green++=ScaleQuantumToChar(GetGreenPixelComponent(p));
-            *blue++=ScaleQuantumToChar(GetBluePixelComponent(p));
+            *red++=ScaleQuantumToChar(GetPixelRed(image,p));
+            *green++=ScaleQuantumToChar(GetPixelGreen(image,p));
+            *blue++=ScaleQuantumToChar(GetPixelBlue(image,p));
             if (image->matte != MagickFalse)
-              *opacity++=ScaleQuantumToChar((Quantum)
-                (GetAlphaPixelComponent(p)));
-            p++;
+              *opacity++=ScaleQuantumToChar((Quantum) (GetPixelAlpha(image,p)));
+            p+=GetPixelChannels(image);
           }
           count+=EncodeImage(image,scanline,bytes_per_line & 0x7FFF,
             packed_scanline);