]> granicus.if.org Git - imagemagick/blobdiff - coders/wpg.c
(no commit message)
[imagemagick] / coders / wpg.c
index ab8bb03239410cb984eb05465812e567f7c394ad..c9b4a645c3e47db1f5e1597d7eba387d2618b8c5 100644 (file)
@@ -16,7 +16,7 @@
 %                                 June 2000                                   %
 %                                                                             %
 %                                                                             %
-%  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  %
@@ -42,6 +42,8 @@
 #include "magick/blob.h"
 #include "magick/blob-private.h"
 #include "magick/color-private.h"
+#include "magick/colormap.h"
+#include "magick/colormap-private.h"
 #include "magick/constitute.h"
 #include "magick/exception.h"
 #include "magick/exception-private.h"
@@ -237,7 +239,7 @@ static unsigned int IsWPG(const unsigned char *magick,const size_t length)
 }
 \f
 
-static void Rd_WP_DWORD(Image *image,unsigned long *d)
+static void Rd_WP_DWORD(Image *image,size_t *d)
 {
   unsigned char
     b;
@@ -247,20 +249,20 @@ static void Rd_WP_DWORD(Image *image,unsigned long *d)
   if (b < 0xFFU)
     return;
   b=ReadBlobByte(image);
-  *d=(unsigned long) b;
+  *d=(size_t) b;
   b=ReadBlobByte(image);
-  *d+=(unsigned long) b*256l;
+  *d+=(size_t) b*256l;
   if (*d < 0x8000)
     return;
   *d=(*d & 0x7FFF) << 16;
   b=ReadBlobByte(image);
-  *d+=(unsigned long) b;
+  *d+=(size_t) b;
   b=ReadBlobByte(image);
-  *d+=(unsigned long) b*256l;
+  *d+=(size_t) b*256l;
   return;
 }
 
-static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
+static void InsertRow(unsigned char *p,ssize_t y,Image *image, int bpp)
 {
   ExceptionInfo
     *exception;
@@ -268,7 +270,7 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
   int
     bit;
 
-  long
+  ssize_t
     x;
 
   register PixelPacket
@@ -289,7 +291,7 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
         if (q == (PixelPacket *) 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++)
               {
@@ -301,7 +303,7 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
           }
         if ((image->columns % 8) != 0)
           {
-            for (bit=0; bit < (long) (image->columns % 8); bit++)
+            for (bit=0; bit < (ssize_t) (image->columns % 8); bit++)
               {
                 index=((*p) & (0x80 >> bit) ? 0x01 : 0x00);
                 indexes[x+bit]=index;
@@ -319,39 +321,39 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
         if (q == (PixelPacket *) NULL)
           break;
         indexes=GetAuthenticIndexQueue(image);
-        for (x=0; x < ((long) image->columns-1); x+=2)
+        for (x=0; x < ((ssize_t) image->columns-1); x+=2)
         {
             index=ConstrainColormapIndex(image,(*p >> 6) & 0x3);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             index=ConstrainColormapIndex(image,(*p >> 4) & 0x3);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             index=ConstrainColormapIndex(image,(*p >> 2) & 0x3);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             index=ConstrainColormapIndex(image,(*p) & 0x3);
             indexes[x+1]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             p++;
         }
        if ((image->columns % 4) != 0)
           {
             index=ConstrainColormapIndex(image,(*p >> 6) & 0x3);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             if ((image->columns % 4) >= 1)
 
               {
                 index=ConstrainColormapIndex(image,(*p >> 4) & 0x3);
                 indexes[x]=index;
-                *q++=image->colormap[(long) index];
+                *q++=image->colormap[(ssize_t) index];
                 if ((image->columns % 4) >= 2)
 
                   {
                     index=ConstrainColormapIndex(image,(*p >> 2) & 0x3);
                     indexes[x]=index;
-                    *q++=image->colormap[(long) index];
+                    *q++=image->colormap[(ssize_t) index];
                   }
               }
             p++;
@@ -367,21 +369,21 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
         if (q == (PixelPacket *) NULL)
           break;
         indexes=GetAuthenticIndexQueue(image);
-        for (x=0; x < ((long) image->columns-1); x+=2)
+        for (x=0; x < ((ssize_t) image->columns-1); x+=2)
           { 
             index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             index=ConstrainColormapIndex(image,(*p) & 0x0f);
             indexes[x+1]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             p++;
           }
         if ((image->columns % 2) != 0)
           {
             index=ConstrainColormapIndex(image,(*p >> 4) & 0x0f);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             p++;
           }
         if (SyncAuthenticPixels(image,exception) == MagickFalse)
@@ -394,11 +396,11 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
         if (q == (PixelPacket *) NULL) break;
         indexes=GetAuthenticIndexQueue(image);
 
-        for (x=0; x < (long) image->columns; x++)
+        for (x=0; x < (ssize_t) image->columns; x++)
           {
             index=ConstrainColormapIndex(image,*p);
             indexes[x]=index;
-            *q++=image->colormap[(long) index];
+            *q++=image->colormap[(ssize_t) index];
             p++;
           }
         if (SyncAuthenticPixels(image,exception) == MagickFalse)
@@ -410,7 +412,7 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
       q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
       if (q == (PixelPacket *) NULL)
         break;
-      for (x=0; x < (long) image->columns; x++)
+      for (x=0; x < (ssize_t) image->columns; x++)
         {
           q->red=ScaleCharToQuantum(*p++);
           q->green=ScaleCharToQuantum(*p++);
@@ -429,9 +431,9 @@ static void InsertRow(unsigned char *p,long y,Image *image, int bpp)
 { \
   BImgBuff[x]=b; \
   x++; \
-  if((long) x>=ldblk) \
+  if((ssize_t) x>=ldblk) \
   { \
-    InsertRow(BImgBuff,(long) y,image,bpp); \
+    InsertRow(BImgBuff,(ssize_t) y,image,bpp); \
     x=0; \
     y++; \
     } \
@@ -449,18 +451,18 @@ static int UnpackWPGRaster(Image *image,int bpp)
     *BImgBuff,
     RunCount;
 
-  long
+  ssize_t
     ldblk;
 
   x=0;
   y=0;
 
-  ldblk=(long) ((bpp*image->columns+7)/8);
+  ldblk=(ssize_t) ((bpp*image->columns+7)/8);
   BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk,
     sizeof(*BImgBuff));
   if(BImgBuff==NULL) return(-2);
 
-  while(y<(long) image->rows)
+  while(y<(ssize_t) image->rows)
     {
       bbuf=ReadBlobByte(image);
 
@@ -498,7 +500,7 @@ static int UnpackWPGRaster(Image *image,int bpp)
               x=0;
               y++;    /* Here I need to duplicate previous row RUNCOUNT* */
               if(y<2) continue;
-              if(y>(long) image->rows)
+              if(y>(ssize_t) image->rows)
                 {
                   BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);
                   return(-4);
@@ -521,9 +523,9 @@ static int UnpackWPGRaster(Image *image,int bpp)
   else\
     BImgBuff[x] = b;\
   x++; \
-  if((long) x >= ldblk) \
+  if((ssize_t) x >= ldblk) \
   { \
-    InsertRow(BImgBuff,(long) y,image,bpp); \
+    InsertRow(BImgBuff,(ssize_t) y,image,bpp); \
     x=0; \
     y++; \
    } \
@@ -540,21 +542,21 @@ static int UnpackWPG2Raster(Image *image,int bpp)
     RunCount,
     SampleBuffer[8];
 
-  unsigned long
+  size_t
     x,
     y;
 
   unsigned int
     i;
 
-  long
+  ssize_t
     ldblk;
 
   int XorMe = 0;
 
   x=0;
   y=0;
-  ldblk=(long) ((bpp*image->columns+7)/8);
+  ldblk=(ssize_t) ((bpp*image->columns+7)/8);
   BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk,
     sizeof(*BImgBuff));
   if(BImgBuff==NULL)
@@ -595,15 +597,15 @@ static int UnpackWPG2Raster(Image *image,int bpp)
           if(x!=0)
             {
               (void) fprintf(stderr,
-                             "\nUnsupported WPG2 unaligned token RST x=%lu, please report!\n"
-                             ,x);
+                             "\nUnsupported WPG2 unaligned token RST x=%.20g, please report!\n"
+                             ,(double) x);
               return(-3);
             }
           {
             /* duplicate the previous row RunCount x */
             for(i=0;i<=RunCount;i++)
               {      
-                InsertRow(BImgBuff,(long) (image->rows >= y ? y : image->rows-1),
+                InsertRow(BImgBuff,(ssize_t) (image->rows >= y ? y : image->rows-1),
                           image,bpp);
                 y++;
               }    
@@ -646,7 +648,7 @@ typedef float tCTM[3][3];
 static unsigned LoadWPG2Flags(Image *image,char Precision,float *Angle,tCTM *CTM)
 {
 const unsigned char TPR=1,TRN=2,SKW=4,SCL=8,ROT=0x10,OID=0x20,LCK=0x80;
-long x;
+ssize_t x;
 unsigned DenX;
 unsigned Flags;
 
@@ -705,7 +707,7 @@ unsigned Flags;
 
 
 static Image *ExtractPostscript(Image *image,const ImageInfo *image_info,
-  MagickOffsetType PS_Offset,long PS_Size,ExceptionInfo *exception)
+  MagickOffsetType PS_Offset,ssize_t PS_Size,ExceptionInfo *exception)
 {
   char
     postscript_file[MaxTextExtent];
@@ -823,7 +825,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
 {
   typedef struct
   {
-    unsigned long FileId;
+    size_t FileId;
     MagickOffsetType DataOffset;
     unsigned int ProductType;
     unsigned int FileType;
@@ -836,15 +838,15 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
   typedef struct
   {
     unsigned char RecType;
-    unsigned long RecordLength;
+    size_t RecordLength;
   } WPGRecord;
 
   typedef struct
   {
     unsigned char Class;
     unsigned char RecType;
-    unsigned long Extension;
-    unsigned long RecordLength;
+    size_t Extension;
+    size_t RecordLength;
   } WPG2Record;
 
   typedef struct
@@ -892,7 +894,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
   } WPGColorMapRec;
 
   typedef struct {
-    unsigned long PS_unknown1;
+    size_t PS_unknown1;
     unsigned int PS_unknown2;
     unsigned int PS_unknown3;
   } WPGPSl1Record;  
@@ -932,9 +934,12 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
     bpp,
     WPG2Flags;
 
-  long
+  ssize_t
     ldblk;
 
+  size_t
+    one;
+
   unsigned char
     *BImgBuff;
 
@@ -947,6 +952,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
   assert(image_info->signature == MagickSignature);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
+  one=1;
   image=AcquireImage(image_info);
   image->depth=8;
   status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
@@ -1040,7 +1046,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
               if(Rec.RecordLength > 8)
                 image=ExtractPostscript(image,image_info,
                   TellBlob(image)+8,   /* skip PS header in the wpg */
-                  (long) Rec.RecordLength-8,exception);
+                  (ssize_t) Rec.RecordLength-8,exception);
               break;     
 
             case 0x14:  /* bitmap type 2 */
@@ -1074,7 +1080,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
             UnpackRaster:      
               if ((image->colors == 0) && (bpp != 24))
                 {
-                  image->colors=1 << bpp;
+                  image->colors=one << bpp;
                   if (!AcquireImageColormap(image,image->colors))
                     {
                     NoMemory:
@@ -1092,9 +1098,9 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
               else
                 {
                   if (bpp < 24)
-                    if ( (image->colors < (1UL<<bpp)) && (bpp != 24) )
+                    if ( (image->colors < (one << bpp)) && (bpp != 24) )
                       image->colormap=(PixelPacket *) ResizeQuantumMemory(
-                        image->colormap,(size_t) (1UL << bpp),
+                        image->colormap,(size_t) (one << bpp),
                         sizeof(*image->colormap));
                 }
           
@@ -1166,7 +1172,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
               if(Rec.RecordLength>0x3C)
                 image=ExtractPostscript(image,image_info,
                   TellBlob(image)+0x3C,   /* skip PS l2 header in the wpg */
-                  (long) Rec.RecordLength-0x3C,exception);
+                  (ssize_t) Rec.RecordLength-0x3C,exception);
               break;
             }
         }
@@ -1254,16 +1260,20 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
 
               if ((image->colors == 0) && (bpp != 24))
                 {
-                  image->colors=1 << bpp;
+                  size_t
+                    one;
+
+                  one=1;
+                  image->colors=one << bpp;
                   if (!AcquireImageColormap(image,image->colors))
                     goto NoMemory;
                 }
               else
                 {
                   if(bpp < 24)
-                    if( image->colors<(1UL<<bpp) && bpp!=24 )
+                    if( image->colors<(one << bpp) && bpp!=24 )
                       image->colormap=(PixelPacket *) ResizeQuantumMemory(
-                       image->colormap,(size_t) (1UL << bpp),
+                       image->colormap,(size_t) (one << bpp),
                        sizeof(*image->colormap));
                 }
 
@@ -1272,13 +1282,13 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
                 {
                 case 0:    /*Uncompressed raster*/
                   {
-                    ldblk=(long) ((bpp*image->columns+7)/8);
+                    ldblk=(ssize_t) ((bpp*image->columns+7)/8);
                     BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t)
                       ldblk,sizeof(*BImgBuff));
                     if (BImgBuff == (unsigned char *) NULL)
                       goto NoMemory;
 
-                    for(i=0; i< (long) image->rows; i++)
+                    for(i=0; i< (ssize_t) image->rows; i++)
                       {
                         (void) ReadBlob(image,ldblk,BImgBuff);
                         InsertRow(BImgBuff,i,image,bpp);
@@ -1340,7 +1350,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
               if(Rec2.RecordLength > (unsigned int) i)
                 image=ExtractPostscript(image,image_info,
                   TellBlob(image)+i,    /*skip PS header in the wpg2*/
-                  (long) (Rec2.RecordLength-i-2),exception);
+                  (ssize_t) (Rec2.RecordLength-i-2),exception);
               break;
 
       case 0x1B:          /*bitmap rectangle*/
@@ -1364,7 +1374,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
     Image
       *p;
 
-    long
+    ssize_t
       scene=0;
 
     /*
@@ -1387,7 +1397,7 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
       Fix scene numbers.
     */
     for (p=image; p != (Image *) NULL; p=p->next)
-      p->scene=(unsigned long) scene++;
+      p->scene=(size_t) scene++;
   }
   if (image == (Image *) NULL)
     ThrowReaderException(CorruptImageError,
@@ -1415,10 +1425,10 @@ static Image *ReadWPGImage(const ImageInfo *image_info,
 %
 %  The format of the RegisterWPGImage method is:
 %
-%      unsigned long RegisterWPGImage(void)
+%      size_t RegisterWPGImage(void)
 %
 */
-ModuleExport unsigned long RegisterWPGImage(void)
+ModuleExport size_t RegisterWPGImage(void)
 {
   MagickInfo
     *entry;