]> granicus.if.org Git - imagemagick/blobdiff - coders/pcd.c
(no commit message)
[imagemagick] / coders / pcd.c
index 0b01d8c91f7391a254a6e3daf2bc7c4af958b423..0aa96b8db73ceace7ca3c7c9a2ae9afef26a994b 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 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/property.h"
-#include "magick/blob.h"
-#include "magick/blob-private.h"
-#include "magick/cache.h"
-#include "magick/client.h"
-#include "magick/colorspace.h"
-#include "magick/constitute.h"
-#include "magick/decorate.h"
-#include "magick/exception.h"
-#include "magick/exception-private.h"
-#include "magick/gem.h"
-#include "magick/geometry.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/montage.h"
-#include "magick/resize.h"
-#include "magick/shear.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/property.h"
+#include "MagickCore/blob.h"
+#include "MagickCore/blob-private.h"
+#include "MagickCore/cache.h"
+#include "MagickCore/client.h"
+#include "MagickCore/colorspace.h"
+#include "MagickCore/colorspace-private.h"
+#include "MagickCore/constitute.h"
+#include "MagickCore/decorate.h"
+#include "MagickCore/distort.h"
+#include "MagickCore/exception.h"
+#include "MagickCore/exception-private.h"
+#include "MagickCore/gem.h"
+#include "MagickCore/geometry.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/montage.h"
+#include "MagickCore/pixel-accessor.h"
+#include "MagickCore/resize.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
 /*
   Forward declarations.
 */
 static MagickBooleanType
-  WritePCDImage(const ImageInfo *,Image *);
+  WritePCDImage(const ImageInfo *,Image *,ExceptionInfo *);
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -109,9 +111,9 @@ static MagickBooleanType
 %
 */
 static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
-  unsigned char *chroma1,unsigned char *chroma2)
+  unsigned char *chroma1,unsigned char *chroma2,ExceptionInfo *exception)
 {
-#define IsSync  ((sum & 0xffffff00UL) == 0xfffffe00UL)
+#define IsSync(sum)  ((sum & 0xffffff00UL) == 0xfffffe00UL)
 #define PCDGetBits(n) \
 {  \
   sum=(sum << n) & 0xffffffff; \
@@ -127,8 +129,6 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
     bits+=8; \
     p++; \
   } \
-  if (EOFBlob(image) != MagickFalse) \
-    break; \
 }
 
   typedef struct PCDTable
@@ -144,13 +144,10 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
       key;
   } PCDTable;
 
-  long
-    quantum;
-
   PCDTable
     *pcd_table[3];
 
-  register long
+  register ssize_t
     i,
     j;
 
@@ -162,21 +159,20 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
     *q;
 
   size_t
-    length;
-
-  ssize_t
-    count;
-
-  unsigned char
-    *buffer;
-
-  unsigned long
     bits,
+    length,
     plane,
     pcd_length[3],
     row,
     sum;
 
+  ssize_t
+    count,
+    quantum;
+
+  unsigned char
+    *buffer;
+
   /*
     Initialize Huffman tables.
   */
@@ -207,7 +203,7 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
           image->filename);
       }
     r=pcd_table[i];
-    for (j=0; j < (long) length; j++)
+    for (j=0; j < (ssize_t) length; j++)
     {
       PCDGetBits(8);
       r->length=(unsigned int) (sum & 0xff)+1;
@@ -223,7 +219,7 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
       r->mask=(~((1U << (32-r->length))-1));
       r++;
     }
-    pcd_length[i]=(unsigned long) length;
+    pcd_length[i]=(size_t) length;
   }
   /*
     Search for Sync byte.
@@ -234,7 +230,7 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
     PCDGetBits(16);
   while ((sum & 0x00fff000UL) != 0x00fff000UL)
     PCDGetBits(8);
-  while (IsSync == 0)
+  while (IsSync(sum) == 0)
     PCDGetBits(1);
   /*
     Recover the Huffman encoded luminance and chrominance deltas.
@@ -246,7 +242,7 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
   q=luma;
   for ( ; ; )
   {
-    if (IsSync != 0)
+    if (IsSync(sum) != 0)
       {
         /*
           Determine plane and row number.
@@ -293,23 +289,22 @@ static MagickBooleanType DecodeImage(Image *image,unsigned char *luma,
       Decode luminance or chrominance deltas.
     */
     r=pcd_table[plane];
-    for (i=0; ((i < (long) length) && ((sum & r->mask) != r->sequence)); i++)
+    for (i=0; ((i < (ssize_t) length) && ((sum & r->mask) != r->sequence)); i++)
       r++;
-    if ((row > image->rows) || (r == (PCDTable *) NULL) ||
-        ((size_t) (q-luma) > (image->columns*image->rows)))
+    if ((row > image->rows) || (r == (PCDTable *) NULL))
       {
-        (void) ThrowMagickException(&image->exception,GetMagickModule(),
+        (void) ThrowMagickException(exception,GetMagickModule(),
           CorruptImageWarning,"SkipToSyncByte","`%s'",image->filename);
         while ((sum & 0x00fff000) != 0x00fff000)
           PCDGetBits(8);
-        while (IsSync == 0)
+        while (IsSync(sum) == 0)
           PCDGetBits(1);
         continue;
       }
     if (r->key < 128)
-      quantum=(long) (*q)+r->key;
+      quantum=(ssize_t) (*q)+r->key;
     else
-      quantum=(long) (*q)+r->key-256;
+      quantum=(ssize_t) (*q)+r->key-256;
     *q=(unsigned char) ((quantum < 0) ? 0 : (quantum > 255) ? 255 : quantum);
     q++;
     PCDGetBits(r->length);
@@ -411,7 +406,7 @@ static Image *OverviewImage(const ImageInfo *image_info,Image *image,
   for (p=image; p != (Image *) NULL; p=p->next)
   {
     (void) DeleteImageProperty(p,"label");
-    (void) SetImageProperty(p,"label",DefaultTileLabel);
+    (void) SetImageProperty(p,"label",DefaultTileLabel,exception);
   }
   montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
   (void) CopyMagickString(montage_info->filename,image_info->filename,
@@ -424,10 +419,10 @@ static Image *OverviewImage(const ImageInfo *image_info,Image *image,
   return(montage_image);
 }
 
-static void Upsample(const unsigned long width,const unsigned long height,
-  const unsigned long scaled_width,unsigned char *pixels)
+static void Upsample(const size_t width,const size_t height,
+  const size_t scaled_width,unsigned char *pixels)
 {
-  register long
+  register ssize_t
     x,
     y;
 
@@ -440,39 +435,36 @@ static void Upsample(const unsigned long width,const unsigned long height,
     Create a new image that is a integral size greater than an existing one.
   */
   assert(pixels != (unsigned char *) NULL);
-  for (y=0; y < (long) height; y++)
+  for (y=0; y < (ssize_t) height; y++)
   {
     p=pixels+(height-1-y)*scaled_width+(width-1);
     q=pixels+((height-1-y) << 1)*scaled_width+((width-1) << 1);
     *q=(*p);
     *(q+1)=(*(p));
-    for (x=1; x < (long) width; x++)
+    for (x=1; x < (ssize_t) width; x++)
     {
       p--;
       q-=2;
       *q=(*p);
-      *(q+1)=(unsigned char) ((((unsigned long) *p)+
-        ((unsigned long) *(p+1))+1) >> 1);
+      *(q+1)=(unsigned char) ((((size_t) *p)+((size_t) *(p+1))+1) >> 1);
     }
   }
-  for (y=0; y < (long) (height-1); y++)
+  for (y=0; y < (ssize_t) (height-1); y++)
   {
-    p=pixels+((unsigned long) y << 1)*scaled_width;
+    p=pixels+((size_t) y << 1)*scaled_width;
     q=p+scaled_width;
     r=q+scaled_width;
-    for (x=0; x < (long) (width-1); x++)
+    for (x=0; x < (ssize_t) (width-1); x++)
     {
-      *q=(unsigned char) ((((unsigned long) *p)+((unsigned long) *r)+1) >> 1);
-      *(q+1)=(unsigned char) ((((unsigned long) *p)+((unsigned long) *(p+2))+
-        ((unsigned long) *r)+((unsigned long) *(r+2))+2) >> 2);
+      *q=(unsigned char) ((((size_t) *p)+((size_t) *r)+1) >> 1);
+      *(q+1)=(unsigned char) ((((size_t) *p)+((size_t) *(p+2))+
+        ((size_t) *r)+((size_t) *(r+2))+2) >> 2);
       q+=2;
       p+=2;
       r+=2;
     }
-    *q++=(unsigned char) ((((unsigned long) *p++)+
-      ((unsigned long) *r++)+1) >> 1);
-    *q++=(unsigned char) ((((unsigned long) *p++)+
-      ((unsigned long) *r++)+1) >> 1);
+    *q++=(unsigned char) ((((size_t) *p++)+((size_t) *r++)+1) >> 1);
+    *q++=(unsigned char) ((((size_t) *p++)+((size_t) *r++)+1) >> 1);
   }
   p=pixels+(2*height-2)*scaled_width;
   q=pixels+(2*height-1)*scaled_width;
@@ -484,9 +476,6 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   Image
     *image;
 
-  long
-    x;
-
   MagickBooleanType
     status;
 
@@ -496,11 +485,11 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   MagickSizeType
     number_pixels;
 
-  register long
+  register ssize_t
     i,
     y;
 
-  register PixelPacket
+  register Quantum
     *q;
 
   register unsigned char
@@ -508,8 +497,16 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
     *c2,
     *yy;
 
+  size_t
+    height,
+    number_images,
+    rotate,
+    scene,
+    width;
+
   ssize_t
-    count;
+    count,
+    x;
 
   unsigned char
     *chroma1,
@@ -520,13 +517,6 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   unsigned int
     overview;
 
-  unsigned long
-    height,
-    number_images,
-    rotate,
-    scene,
-    width;
-
   /*
     Open image file.
   */
@@ -537,7 +527,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
       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)
     {
@@ -553,7 +543,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   count=ReadBlob(image,3*0x800,header);
   overview=LocaleNCompare((char *) header,"PCD_OPA",7) == 0;
   if ((count == 0) ||
-      ((LocaleNCompare((char *) header+0x800,"PCD",3) != 0) && !overview))
+      ((LocaleNCompare((char *) header+0x800,"PCD",3) != 0) && (overview ==0)))
     ThrowReaderException(CorruptImageError,"ImproperImageHeader");
   rotate=header[0x0e02] & 0x03;
   number_images=(header[10] << 8) | header[11];
@@ -576,15 +566,15 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
       }
     }
   if (image_info->number_scenes != 0)
-    scene=(unsigned long) MagickMin(image_info->scene,6);
-  if (overview)
+    scene=(size_t) MagickMin(image_info->scene,6);
+  if (overview != 0)
     scene=1;
   /*
     Initialize image structure.
   */
   width=192;
   height=128;
-  for (i=1; i < (long) MagickMin(scene,3); i++)
+  for (i=1; i < (ssize_t) MagickMin(scene,3); i++)
   {
     width<<=1;
     height<<=1;
@@ -592,23 +582,23 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   image->columns=width;
   image->rows=height;
   image->depth=8;
-  for ( ; i < (long) scene; i++)
+  for ( ; i < (ssize_t) scene; i++)
   {
     image->columns<<=1;
     image->rows<<=1;
   }
   /*
-    Allocate lumand chroma memory.
+    Allocate luma and chroma memory.
   */
   number_pixels=(MagickSizeType) image->columns*image->rows;
   if (number_pixels != (size_t) number_pixels)
     ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
   chroma1=(unsigned char *) AcquireQuantumMemory(image->columns+1UL,image->rows*
-    sizeof(*chroma1));
+    10*sizeof(*chroma1));
   chroma2=(unsigned char *) AcquireQuantumMemory(image->columns+1UL,image->rows*
-    sizeof(*chroma2));
+    10*sizeof(*chroma2));
   luma=(unsigned char *) AcquireQuantumMemory(image->columns+1UL,image->rows*
-    sizeof(*luma));
+    10*sizeof(*luma));
   if ((chroma1 == (unsigned char *) NULL) ||
       (chroma2 == (unsigned char *) NULL) || (luma == (unsigned char *) NULL))
     ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
@@ -616,7 +606,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
     Advance to image data.
   */
   offset=93;
-  if (overview)
+  if (overview != 0)
     offset=2;
   else
     if (scene == 2)
@@ -624,9 +614,9 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
     else
       if (scene <= 1)
         offset=1;
-  for (i=0; i < (long) (offset*0x800); i++)
+  for (i=0; i < (ssize_t) (offset*0x800); i++)
     (void) ReadBlobByte(image);
-  if (overview)
+  if (overview != 0)
     {
       Image
         *overview_image;
@@ -634,28 +624,28 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
       MagickProgressMonitor
         progress_monitor;
 
-      register long
+      register ssize_t
         j;
 
       /*
         Read thumbnails from overview image.
       */
-      for (j=1; j <= (long) number_images; j++)
+      for (j=1; j <= (ssize_t) number_images; j++)
       {
         progress_monitor=SetImageProgressMonitor(image,
           (MagickProgressMonitor) NULL,image->client_data);
-        (void) FormatMagickString(image->filename,MaxTextExtent,
-          "images/img%04ld.pcd",j);
-        (void) FormatMagickString(image->magick_filename,MaxTextExtent,
-          "images/img%04ld.pcd",j);
-        image->scene=(unsigned long) j;
+        (void) FormatLocaleString(image->filename,MaxTextExtent,
+          "images/img%04ld.pcd",(long) j);
+        (void) FormatLocaleString(image->magick_filename,MaxTextExtent,
+          "images/img%04ld.pcd",(long) j);
+        image->scene=(size_t) j;
         image->columns=width;
         image->rows=height;
         image->depth=8;
         yy=luma;
         c1=chroma1;
         c2=chroma2;
-        for (y=0; y < (long) height; y+=2)
+        for (y=0; y < (ssize_t) height; y+=2)
         {
           count=ReadBlob(image,width,yy);
           yy+=image->columns;
@@ -674,30 +664,30 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
         yy=luma;
         c1=chroma1;
         c2=chroma2;
-        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(*yy++);
-            q->green=ScaleCharToQuantum(*c1++);
-            q->blue=ScaleCharToQuantum(*c2++);
-            q++;
+            SetPixelRed(image,ScaleCharToQuantum(*yy++),q);
+            SetPixelGreen(image,ScaleCharToQuantum(*c1++),q);
+            SetPixelBlue(image,ScaleCharToQuantum(*c2++),q);
+            q+=GetPixelChannels(image);
           }
           if (SyncAuthenticPixels(image,exception) == MagickFalse)
             break;
         }
         image->colorspace=YCCColorspace;
         if (LocaleCompare(image_info->magick,"PCDS") == 0)
-          image->colorspace=sRGBColorspace;
-        if (j < (long) number_images)
+          SetImageColorspace(image,sRGBColorspace,exception);
+        if (j < (ssize_t) number_images)
           {
             /*
               Allocate next image structure.
             */
-            AcquireNextImage(image_info,image);
+            AcquireNextImage(image_info,image,exception);
             if (GetNextImageInList(image) == (Image *) NULL)
               {
                 image=DestroyImageList(image);
@@ -727,7 +717,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   yy=luma;
   c1=chroma1;
   c2=chroma2;
-  for (y=0; y < (long) height; y+=2)
+  for (y=0; y < (ssize_t) height; y+=2)
   {
     count=ReadBlob(image,width,yy);
     yy+=image->columns;
@@ -749,7 +739,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
       image->rows=1024;
       for (i=0; i < (4*0x800); i++)
         (void) ReadBlobByte(image);
-      status=DecodeImage(image,luma,chroma1,chroma2);
+      status=DecodeImage(image,luma,chroma1,chroma2,exception);
       if ((scene >= 5) && status)
         {
           /*
@@ -761,7 +751,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
           image->rows=2048;
           offset=TellBlob(image)/0x800+12;
           offset=SeekBlob(image,offset*0x800,SEEK_SET);
-          status=DecodeImage(image,luma,chroma1,chroma2);
+          status=DecodeImage(image,luma,chroma1,chroma2,exception);
           if ((scene >= 6) && (status != MagickFalse))
             {
               /*
@@ -782,23 +772,24 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   yy=luma;
   c1=chroma1;
   c2=chroma2;
-  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(*yy++);
-      q->green=ScaleCharToQuantum(*c1++);
-      q->blue=ScaleCharToQuantum(*c2++);
-      q++;
+      SetPixelRed(image,ScaleCharToQuantum(*yy++),q);
+      SetPixelGreen(image,ScaleCharToQuantum(*c1++),q);
+      SetPixelBlue(image,ScaleCharToQuantum(*c2++),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;
       }
@@ -844,7 +835,7 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
   image->gamma=1.000f/2.200f;
   image->colorspace=YCCColorspace;
   if (LocaleCompare(image_info->magick,"PCDS") == 0)
-    image->colorspace=sRGBColorspace;
+    SetImageColorspace(image,sRGBColorspace,exception);
   return(GetFirstImageInList(image));
 }
 \f
@@ -868,10 +859,10 @@ static Image *ReadPCDImage(const ImageInfo *image_info,ExceptionInfo *exception)
 %
 %  The format of the RegisterPCDImage method is:
 %
-%      unsigned long RegisterPCDImage(void)
+%      size_t RegisterPCDImage(void)
 %
 */
-ModuleExport unsigned long RegisterPCDImage(void)
+ModuleExport size_t RegisterPCDImage(void)
 {
   MagickInfo
     *entry;
@@ -881,6 +872,7 @@ ModuleExport unsigned long RegisterPCDImage(void)
   entry->encoder=(EncodeImageHandler *) WritePCDImage;
   entry->magick=(IsImageFormatHandler *) IsPCD;
   entry->adjoin=MagickFalse;
+  entry->seekable_stream=MagickTrue;
   entry->description=ConstantString("Photo CD");
   entry->module=ConstantString("PCD");
   (void) RegisterMagickInfo(entry);
@@ -888,6 +880,7 @@ ModuleExport unsigned long RegisterPCDImage(void)
   entry->decoder=(DecodeImageHandler *) ReadPCDImage;
   entry->encoder=(EncodeImageHandler *) WritePCDImage;
   entry->adjoin=MagickFalse;
+  entry->seekable_stream=MagickTrue;
   entry->description=ConstantString("Photo CD");
   entry->module=ConstantString("PCD");
   (void) RegisterMagickInfo(entry);
@@ -934,7 +927,8 @@ ModuleExport void UnregisterPCDImage(void)
 %
 %  The format of the WritePCDImage method is:
 %
-%      MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
+%      MagickBooleanType WritePCDImage(const ImageInfo *image_info,
+%        Image *image,ExceptionInfo *exception)
 %
 %  A description of each parameter follows.
 %
@@ -942,10 +936,12 @@ ModuleExport void UnregisterPCDImage(void)
 %
 %    o image:  The image.
 %
+%    o exception: return any errors or warnings in this structure.
+%
 */
 
 static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
-  const char *tile_geometry)
+  const char *tile_geometry,ExceptionInfo *exception)
 {
   GeometryInfo
     geometry_info;
@@ -954,9 +950,6 @@ static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
     *downsample_image,
     *tile_image;
 
-  long
-    y;
-
   MagickBooleanType
     status;
 
@@ -966,14 +959,17 @@ static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
   RectangleInfo
     geometry;
 
-  register const PixelPacket
+  register const Quantum
     *p,
     *q;
 
-  register long
+  register ssize_t
     i,
     x;
 
+  ssize_t
+    y;
+
   /*
     Scale image to tile size.
   */
@@ -985,12 +981,12 @@ static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
   if ((geometry.height % 2) != 0)
     geometry.height--;
   tile_image=ResizeImage(image,geometry.width,geometry.height,TriangleFilter,
-    1.0,&image->exception);
+    exception);
   if (tile_image == (Image *) NULL)
     return(MagickFalse);
   flags=ParseGeometry(page_geometry,&geometry_info);
-  geometry.width=(unsigned long) geometry_info.rho;
-  geometry.height=(unsigned long) geometry_info.sigma;
+  geometry.width=(size_t) geometry_info.rho;
+  geometry.height=(size_t) geometry_info.sigma;
   if ((flags & SigmaValue) == 0)
     geometry.height=geometry.width;
   if ((tile_image->columns != geometry.width) ||
@@ -1007,49 +1003,51 @@ static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
       */
       border_info.width=(geometry.width-tile_image->columns+1) >> 1;
       border_info.height=(geometry.height-tile_image->rows+1) >> 1;
-      bordered_image=BorderImage(tile_image,&border_info,&image->exception);
+      bordered_image=BorderImage(tile_image,&border_info,image->compose,
+        exception);
       if (bordered_image == (Image *) NULL)
         return(MagickFalse);
       tile_image=DestroyImage(tile_image);
       tile_image=bordered_image;
     }
-  (void) TransformImage(&tile_image,(char *) NULL,tile_geometry);
-  if (image->colorspace != RGBColorspace)
-    (void) TransformImageColorspace(tile_image,YCCColorspace);
+  (void) TransformImage(&tile_image,(char *) NULL,tile_geometry,exception);
+  if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
+    (void) TransformImageColorspace(tile_image,YCCColorspace,exception);
   downsample_image=ResizeImage(tile_image,tile_image->columns/2,
-    tile_image->rows/2,TriangleFilter,1.0,&image->exception);
+    tile_image->rows/2,TriangleFilter,exception);
   if (downsample_image == (Image *) NULL)
     return(MagickFalse);
   /*
     Write tile to PCD file.
   */
-  for (y=0; y < (long) tile_image->rows; y+=2)
+  for (y=0; y < (ssize_t) tile_image->rows; y+=2)
   {
-    p=GetVirtualPixels(tile_image,0,y,tile_image->columns,2,
-      &tile_image->exception);
-    if (p == (const PixelPacket *) NULL)
+    p=GetVirtualPixels(tile_image,0,y,tile_image->columns,2,exception);
+    if (p == (const Quantum *) NULL)
       break;
-    for (x=0; x < (long) (tile_image->columns << 1); x++)
+    for (x=0; x < (ssize_t) (tile_image->columns << 1); x++)
     {
-      (void) WriteBlobByte(image,ScaleQuantumToChar(p->red));
-      p++;
+      (void) WriteBlobByte(image,ScaleQuantumToChar(GetPixelRed(tile_image,p)));
+      p+=GetPixelChannels(tile_image);
     }
-    q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns,
-      1,&downsample_image->exception);
-    if (q == (const PixelPacket *) NULL)
+    q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns,1,
+      exception);
+    if (q == (Quantum *) NULL)
       break;
-    for (x=0; x < (long) downsample_image->columns; x++)
+    for (x=0; x < (ssize_t) downsample_image->columns; x++)
     {
-      (void) WriteBlobByte(image,ScaleQuantumToChar(q->green));
+      (void) WriteBlobByte(image,ScaleQuantumToChar(
+        GetPixelGreen(tile_image,q)));
       q++;
     }
-    q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns,
-      1,&downsample_image->exception);
-    if (q == (const PixelPacket *) NULL)
+    q=GetVirtualPixels(downsample_image,0,y >> 1,downsample_image->columns,1,
+      exception);
+    if (q == (Quantum *) NULL)
       break;
-    for (x=0; x < (long) downsample_image->columns; x++)
+    for (x=0; x < (ssize_t) downsample_image->columns; x++)
     {
-      (void) WriteBlobByte(image,ScaleQuantumToChar(q->blue));
+      (void) WriteBlobByte(image,ScaleQuantumToChar(
+        GetPixelBlue(tile_image,q)));
       q++;
     }
     status=SetImageProgress(image,SaveImageTag,y,tile_image->rows);
@@ -1063,7 +1061,8 @@ static MagickBooleanType WritePCDTile(Image *image,const char *page_geometry,
   return(MagickTrue);
 }
 
-static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
+static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image,
+  ExceptionInfo *exception)
 {
   Image
     *pcd_image;
@@ -1071,7 +1070,7 @@ static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
   MagickBooleanType
     status;
 
-  register long
+  register ssize_t
     i;
 
   assert(image_info != (const ImageInfo *) NULL);
@@ -1089,7 +1088,7 @@ static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
       /*
         Rotate portrait to landscape.
       */
-      rotate_image=RotateImage(image,90.0,&image->exception);
+      rotate_image=RotateImage(image,90.0,exception);
       if (rotate_image == (Image *) NULL)
         return(MagickFalse);
       pcd_image=rotate_image;
@@ -1097,11 +1096,11 @@ static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
   /*
     Open output image file.
   */
-  status=OpenBlob(image_info,pcd_image,WriteBinaryBlobMode,&image->exception);
+  status=OpenBlob(image_info,pcd_image,WriteBinaryBlobMode,exception);
   if (status == MagickFalse)
     return(status);
-  if (image->colorspace != RGBColorspace)
-    (void) TransformImageColorspace(pcd_image,RGBColorspace);
+  if (IssRGBCompatibleColorspace(pcd_image->colorspace) == MagickFalse)
+    (void) TransformImageColorspace(pcd_image,sRGBColorspace,exception);
   /*
     Write PCD image header.
   */
@@ -1138,9 +1137,9 @@ static MagickBooleanType WritePCDImage(const ImageInfo *image_info,Image *image)
   /*
     Write PCD tiles.
   */
-  status=WritePCDTile(pcd_image,"768x512>","192x128");
-  status=WritePCDTile(pcd_image,"768x512>","384x256");
-  status=WritePCDTile(pcd_image,"768x512>","768x512");
+  status=WritePCDTile(pcd_image,"768x512>","192x128",exception);
+  status=WritePCDTile(pcd_image,"768x512>","384x256",exception);
+  status=WritePCDTile(pcd_image,"768x512>","768x512",exception);
   (void) CloseBlob(pcd_image);
   if (pcd_image != image)
     pcd_image=DestroyImage(pcd_image);