]> granicus.if.org Git - imagemagick/blobdiff - coders/ps2.c
(no commit message)
[imagemagick] / coders / ps2.c
index 7c2c5a6cba10aea2bd123dc90a669967a8c40c51..83351d0c62f9f62f71ba47943c41aa3859f9b804 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2009 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2010 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  %
@@ -59,6 +59,7 @@
 #include "magick/monitor.h"
 #include "magick/monitor-private.h"
 #include "magick/monitor-private.h"
+#include "magick/option.h"
 #include "magick/resource_.h"
 #include "magick/property.h"
 #include "magick/quantum-private.h"
 #include "magick/string_.h"
 #include "magick/module.h"
 #include "magick/utility.h"
+\f
+/*
+  Define declarations.
+*/
 #if defined(MAGICKCORE_TIFF_DELEGATE)
 #define CCITTParam  "-1"
 #else
@@ -98,10 +103,10 @@ static MagickBooleanType
 %
 %  The format of the RegisterPS2Image method is:
 %
-%      unsigned long RegisterPS2Image(void)
+%      size_t RegisterPS2Image(void)
 %
 */
-ModuleExport unsigned long RegisterPS2Image(void)
+ModuleExport size_t RegisterPS2Image(void)
 {
   MagickInfo
     *entry;
@@ -174,6 +179,44 @@ ModuleExport void UnregisterPS2Image(void)
 %    o image: the image.
 %
 */
+
+static MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info,
+  Image *image,Image *inject_image)
+{
+  Image
+    *group4_image;
+
+  ImageInfo
+    *write_info;
+
+  MagickBooleanType
+    status;
+
+  size_t
+    length;
+
+  unsigned char
+    *group4;
+
+  status=MagickTrue;
+  write_info=CloneImageInfo(image_info);
+  (void) CopyMagickString(write_info->filename,"GROUP4:",MaxTextExtent);
+  (void) CopyMagickString(write_info->magick,"GROUP4",MaxTextExtent);
+  group4_image=CloneImage(inject_image,0,0,MagickTrue,&image->exception);
+  if (group4_image == (Image *) NULL)
+    return(MagickFalse);
+  group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length,
+    &image->exception);
+  group4_image=DestroyImage(group4_image);
+  if (group4 == (unsigned char *) NULL)
+    return(MagickFalse);
+  write_info=DestroyImageInfo(write_info);
+  if (WriteBlob(image,length,group4) != (ssize_t) length)
+    status=MagickFalse;
+  group4=(unsigned char *) RelinquishMagickMemory(group4);
+  return(status);
+}
+
 static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
 {
   static const char
@@ -201,8 +244,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       "      /Decode [0 1 0 1 0 1]",
       "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
       "      compression 0 gt",
-      "      { /DataSource pixel_stream /%s filter }",
-      "      { /DataSource pixel_stream /%s filter } ifelse",
+      "      { /DataSource pixel_stream %s }",
+      "      { /DataSource pixel_stream %s } ifelse",
       "    >> image",
       "  }",
       "  {",
@@ -215,8 +258,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       "      /Decode [1 0 1 0 1 0 1 0]",
       "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
       "      compression 0 gt",
-      "      { /DataSource pixel_stream /%s filter }",
-      "      { /DataSource pixel_stream /%s filter } ifelse",
+      "      { /DataSource pixel_stream %s }",
+      "      { /DataSource pixel_stream %s } ifelse",
       "    >> image",
       "  } ifelse",
       "} bind def",
@@ -247,9 +290,9 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       "      /Decode [0 1]",
       "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
       "      compression 0 gt",
-      "      { /DataSource pixel_stream /%s filter }",
+      "      { /DataSource pixel_stream %s }",
       "      {",
-      "        /DataSource pixel_stream /%s filter",
+      "        /DataSource pixel_stream %s",
       "        <<",
       "           /K "CCITTParam,
       "           /Columns columns",
@@ -275,8 +318,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       "      /Decode [0 255]",
       "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
       "      compression 0 gt",
-      "      { /DataSource pixel_stream /%s filter }",
-      "      { /DataSource pixel_stream /%s filter } ifelse",
+      "      { /DataSource pixel_stream %s }",
+      "      { /DataSource pixel_stream %s } ifelse",
       "    >> image",
       "  } ifelse",
       "} bind def",
@@ -348,7 +391,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
   GeometryInfo
     geometry_info;
 
-  long
+  ssize_t
     j,
     y;
 
@@ -386,10 +429,10 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
   register const PixelPacket
     *p;
 
-  register long
+  register ssize_t
     x;
 
-  register long
+  register ssize_t
     i;
 
   SegmentInfo
@@ -404,7 +447,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
   unsigned char
     *pixels;
 
-  unsigned long
+  size_t
     page,
     text_size;
 
@@ -468,18 +511,19 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       }
     if (image->units == PixelsPerCentimeterResolution)
       {
-        resolution.x*=2.54;
-        resolution.y*=2.54;
+        resolution.x=(size_t) (100.0*2.54*resolution.x+0.5)/100.0;
+        resolution.y=(size_t) (100.0*2.54*resolution.y+0.5)/100.0;
       }
     SetGeometry(image,&geometry);
-    (void) FormatMagickString(page_geometry,MaxTextExtent,"%lux%lu",
-      image->columns,image->rows);
+    (void) FormatMagickString(page_geometry,MaxTextExtent,"%.20gx%.20g",
+      (double) image->columns,(double) image->rows);
     if (image_info->page != (char *) NULL)
       (void) CopyMagickString(page_geometry,image_info->page,MaxTextExtent);
     else
       if ((image->page.width != 0) && (image->page.height != 0))
-        (void) FormatMagickString(page_geometry,MaxTextExtent,"%lux%lu%+ld%+ld",
-          image->page.width,image->page.height,image->page.x,image->page.y);
+        (void) FormatMagickString(page_geometry,MaxTextExtent,
+          "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double)
+          image->page.height,(double) image->page.x,(double) image->page.y);
       else
         if ((image->gravity != UndefinedGravity) &&
             (LocaleCompare(image_info->magick,"PS") == 0))
@@ -488,16 +532,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
     (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y,
       &geometry.width,&geometry.height);
     scale.x=(double) (geometry.width*delta.x)/resolution.x;
-    geometry.width=(unsigned long) (scale.x+0.5);
+    geometry.width=(size_t) floor(scale.x+0.5);
     scale.y=(double) (geometry.height*delta.y)/resolution.y;
-    geometry.height=(unsigned long) (scale.y+0.5);
+    geometry.height=(size_t) floor(scale.y+0.5);
     (void) ParseAbsoluteGeometry(page_geometry,&media_info);
     (void) ParseGravityGeometry(image,page_geometry,&page_info,
       &image->exception);
     if (image->gravity != UndefinedGravity)
       {
         geometry.x=(-page_info.x);
-        geometry.y=(long) (media_info.height+page_info.y-image->rows);
+        geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows);
       }
     pointsize=12.0;
     if (image_info->pointsize != 0.0)
@@ -505,7 +549,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
     text_size=0;
     value=GetImageProperty(image,"label");
     if (value != (const char *) NULL)
-      text_size=(unsigned long) (MultilineCensus(value)*pointsize+12);
+      text_size=(size_t) (MultilineCensus(value)*pointsize+12);
     if (page == 1)
       {
         /*
@@ -537,13 +581,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
         else
           {
             (void) FormatMagickString(buffer,MaxTextExtent,
-              "%%%%BoundingBox: %ld %ld %ld %ld\n",(long) (bounds.x1+0.5),
-              (long) (bounds.y1+0.5),
-              (long) (bounds.x2+0.5),(long) (bounds.y2+0.5));
+              "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5),
+              ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5));
             (void) WriteBlobString(image,buffer);
             (void) FormatMagickString(buffer,MaxTextExtent,
-              "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,
-              bounds.x2,bounds.y2);
+              "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,
+              bounds.y1,bounds.x2,bounds.y2);
           }
         (void) WriteBlobString(image,buffer);
         value=GetImageProperty(image,"label");
@@ -560,8 +603,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
             if (image_info->adjoin == MagickFalse)
               (void) CopyMagickString(buffer,"%%Pages: 1\n",MaxTextExtent);
             else
-              (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Pages: %lu\n",
-                (unsigned long) GetImageListLength(image));
+              (void) FormatMagickString(buffer,MaxTextExtent,
+                "%%%%Pages: %.20g\n",(double) GetImageListLength(image));
             (void) WriteBlobString(image,buffer);
           }
         (void) WriteBlobString(image,"%%EndComments\n");
@@ -577,30 +620,31 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
             case NoCompression:
             {
               (void) FormatMagickString(buffer,MaxTextExtent,*q,
-                "ASCII85Decode");
+                "/ASCII85Decode filter");
               break;
             }
             case JPEGCompression:
             {
-              (void) FormatMagickString(buffer,MaxTextExtent,*q,"DCTDecode");
+              (void) FormatMagickString(buffer,MaxTextExtent,*q,
+                "/DCTDecode filter");
               break;
             }
             case LZWCompression:
             {
-              (void) FormatMagickString(buffer,MaxTextExtent,*q,"LZWDecode");
+              (void) FormatMagickString(buffer,MaxTextExtent,*q,
+                "/LZWDecode filter");
               break;
             }
             case FaxCompression:
             case Group4Compression:
             {
-              (void) FormatMagickString(buffer,MaxTextExtent,*q,
-                "ASCII85Decode");
+              (void) FormatMagickString(buffer,MaxTextExtent,*q," ");
               break;
             }
             default:
             {
               (void) FormatMagickString(buffer,MaxTextExtent,*q,
-                "RunLengthDecode");
+                "/RunLengthDecode filter");
               break;
             }
           }
@@ -609,7 +653,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
         }
         value=GetImageProperty(image,"label");
         if (value != (const char *) NULL)
-          for (j=(long) MultilineCensus(value)-1; j >= 0; j--)
+          for (j=(ssize_t) MultilineCensus(value)-1; j >= 0; j--)
           {
             (void) WriteBlobString(image,"  /label 512 string def\n");
             (void) WriteBlobString(image,"  currentfile label readline pop\n");
@@ -627,11 +671,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
         (void) WriteBlobString(image,"} bind def\n");
         (void) WriteBlobString(image,"%%EndProlog\n");
       }
-    (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Page:  1 %lu\n",page++);
+    (void) FormatMagickString(buffer,MaxTextExtent,"%%%%Page:  1 %.20g\n",
+      (double) page++);
     (void) WriteBlobString(image,buffer);
     (void) FormatMagickString(buffer,MaxTextExtent,
-      "%%%%PageBoundingBox: %ld %ld %ld %ld\n",geometry.x,geometry.y,
-      geometry.x+(long) geometry.width,geometry.y+(long)
+      "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x,
+      (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+(double)
       (geometry.height+text_size));
     (void) WriteBlobString(image,buffer);
     if ((double) geometry.x < bounds.x1)
@@ -657,8 +702,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
     /*
       Output image data.
     */
-    (void) FormatMagickString(buffer,MaxTextExtent,"%ld %ld\n%g %g\n%f\n",
-      geometry.x,geometry.y,scale.x,scale.y,pointsize);
+    (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n%g %g\n%g\n",
+      (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize);
     (void) WriteBlobString(image,buffer);
     labels=(char **) NULL;
     value=GetImageProperty(image,"label");
@@ -682,8 +727,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
         ((image_info->type != TrueColorType) &&
          (IsGrayImage(image,&image->exception) != MagickFalse)))
       {
-        (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n1\n%d\n",
-          image->columns,image->rows,(int)
+        (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n",
+          (double) image->columns,(double) image->rows,(int)
           (image->colorspace == CMYKColorspace));
         (void) WriteBlobString(image,buffer);
         (void) FormatMagickString(buffer,MaxTextExtent,"%d\n",
@@ -705,9 +750,7 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                 (void) HuffmanEncodeImage(image_info,image,image);
                 break;
               }
-#if defined(MAGICKCORE_TIFF_DELEGATE)
             (void) Huffman2DEncodeImage(image_info,image,image);
-#endif
             break;
           }
           case JPEGCompression:
@@ -736,18 +779,18 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
               Dump Runlength encoded pixels.
             */
             q=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)
                 break;
-              for (x=0; x < (long) image->columns; x++)
+              for (x=0; x < (ssize_t) image->columns; x++)
               {
                 *q++=ScaleQuantumToChar(PixelIntensityToQuantum(p));
                 p++;
               }
-              progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+              progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows);
               if (progress == MagickFalse)
                 break;
             }
@@ -770,19 +813,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
               Dump uncompressed PseudoColor packets.
             */
             Ascii85Initialize(image);
-            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)
                 break;
-              for (x=0; x < (long) image->columns; x++)
+              for (x=0; x < (ssize_t) image->columns; x++)
               {
                 Ascii85Encode(image,
                   ScaleQuantumToChar(PixelIntensityToQuantum(p)));
                 p++;
               }
-              progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+              progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
+                y,image->rows);
               if (progress == MagickFalse)
                 break;
             }
@@ -795,8 +839,8 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
       if ((image->storage_class == DirectClass) || (image->colors > 256) ||
           (compression == JPEGCompression) || (image->matte != MagickFalse))
         {
-          (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n0\n%d\n",
-            image->columns,image->rows,(int)
+          (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n0\n%d\n",
+            (double) image->columns,(double) image->rows,(int)
             (image->colorspace == CMYKColorspace));
           (void) WriteBlobString(image,buffer);
           (void) FormatMagickString(buffer,MaxTextExtent,"%d\n",
@@ -831,14 +875,14 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                 Dump Packbit encoded pixels.
               */
               q=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)
                   break;
                 indexes=GetVirtualIndexQueue(image);
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   if ((image->matte != MagickFalse) &&
                       (p->opacity == (Quantum) TransparentOpacity))
@@ -850,20 +894,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                   else
                     if (image->colorspace != CMYKColorspace)
                       {
-                        *q++=ScaleQuantumToChar(p->red);
-                        *q++=ScaleQuantumToChar(p->green);
-                        *q++=ScaleQuantumToChar(p->blue);
+                        *q++=ScaleQuantumToChar(GetRedPixelComponent(p));
+                        *q++=ScaleQuantumToChar(GetGreenPixelComponent(p));
+                        *q++=ScaleQuantumToChar(GetBluePixelComponent(p));
                       }
                     else
                       {
-                        *q++=ScaleQuantumToChar(p->red);
-                        *q++=ScaleQuantumToChar(p->green);
-                        *q++=ScaleQuantumToChar(p->blue);
+                        *q++=ScaleQuantumToChar(GetRedPixelComponent(p));
+                        *q++=ScaleQuantumToChar(GetGreenPixelComponent(p));
+                        *q++=ScaleQuantumToChar(GetBluePixelComponent(p));
                         *q++=ScaleQuantumToChar(indexes[x]);
                       }
                   p++;
                 }
-                progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows);
                 if (progress == MagickFalse)
                   break;
               }
@@ -886,14 +930,14 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                 Dump uncompressed DirectColor packets.
               */
               Ascii85Initialize(image);
-              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)
                   break;
                 indexes=GetVirtualIndexQueue(image);
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                 {
                   if ((image->matte != MagickFalse) &&
                       (p->opacity == (Quantum) TransparentOpacity))
@@ -908,20 +952,20 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                   else
                     if (image->colorspace != CMYKColorspace)
                       {
-                        Ascii85Encode(image,ScaleQuantumToChar(p->red));
-                        Ascii85Encode(image,ScaleQuantumToChar(p->green));
-                        Ascii85Encode(image,ScaleQuantumToChar(p->blue));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetRedPixelComponent(p)));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetGreenPixelComponent(p)));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetBluePixelComponent(p)));
                       }
                     else
                       {
-                        Ascii85Encode(image,ScaleQuantumToChar(p->red));
-                        Ascii85Encode(image,ScaleQuantumToChar(p->green));
-                        Ascii85Encode(image,ScaleQuantumToChar(p->blue));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetRedPixelComponent(p)));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetGreenPixelComponent(p)));
+                        Ascii85Encode(image,ScaleQuantumToChar(GetBluePixelComponent(p)));
                         Ascii85Encode(image,ScaleQuantumToChar(indexes[x]));
                       }
                   p++;
                 }
-                progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows);
                 if (progress == MagickFalse)
                   break;
               }
@@ -935,16 +979,17 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
           /*
             Dump number of colors and colormap.
           */
-          (void) FormatMagickString(buffer,MaxTextExtent,"%lu %lu\n1\n%d\n",
-            image->columns,image->rows,(int)
+          (void) FormatMagickString(buffer,MaxTextExtent,"%.20g %.20g\n1\n%d\n",
+            (double) image->columns,(double) image->rows,(int)
             (image->colorspace == CMYKColorspace));
           (void) WriteBlobString(image,buffer);
           (void) FormatMagickString(buffer,MaxTextExtent,"%d\n",
             (int) (compression == NoCompression));
           (void) WriteBlobString(image,buffer);
-          (void) FormatMagickString(buffer,MaxTextExtent,"%lu\n",image->colors);
+          (void) FormatMagickString(buffer,MaxTextExtent,"%.20g\n",(double)
+            image->colors);
           (void) WriteBlobString(image,buffer);
-          for (i=0; i < (long) image->colors; i++)
+          for (i=0; i < (ssize_t) image->colors; i++)
           {
             (void) FormatMagickString(buffer,MaxTextExtent,"%02X%02X%02X\n",
               ScaleQuantumToChar(image->colormap[i].red),
@@ -973,16 +1018,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                 Dump Runlength encoded pixels.
               */
               q=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)
                   break;
                 indexes=GetVirtualIndexQueue(image);
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                   *q++=(unsigned char) indexes[x];
-                progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows);
                 if (progress == MagickFalse)
                   break;
               }
@@ -1005,16 +1050,16 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
                 Dump uncompressed PseudoColor packets.
               */
               Ascii85Initialize(image);
-              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)
                   break;
                 indexes=GetVirtualIndexQueue(image);
-                for (x=0; x < (long) image->columns; x++)
+                for (x=0; x < (ssize_t) image->columns; x++)
                   Ascii85Encode(image,(unsigned char) indexes[x]);
-                progress=SetImageProgress(image,SaveImageTag,y,image->rows);
+                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,image->rows);
                 if (progress == MagickFalse)
                   break;
               }
@@ -1050,12 +1095,12 @@ static MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image)
   if (page > 1)
     {
       (void) FormatMagickString(buffer,MaxTextExtent,
-        "%%%%BoundingBox: %ld %ld %ld %ld\n",(long) (bounds.x1+0.5),
-        (long) (bounds.y1+0.5),(long) (bounds.x2+0.5),(long) (bounds.y2+0.5));
+        "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5),
+        ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5));
       (void) WriteBlobString(image,buffer);
       (void) FormatMagickString(buffer,MaxTextExtent,
-        "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,bounds.x2,
-        bounds.y2);
+        "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,
+        bounds.x2,bounds.y2);
       (void) WriteBlobString(image,buffer);
     }
   (void) WriteBlobString(image,"%%EOF\n");