]> granicus.if.org Git - imagemagick/blobdiff - coders/icon.c
(no commit message)
[imagemagick] / coders / icon.c
index ad0e87db1104a312de01b58ba66a66f200d6bb16..68b36d962777ae42ea64687ffd671f6c7606ec4c 100644 (file)
@@ -17,7 +17,7 @@
 %                                 July 1992                                   %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 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  %
@@ -255,8 +255,8 @@ static Image *ReadICONImage(const ImageInfo *image_info,
     if (offset < 0)
       ThrowReaderException(CorruptImageError,"ImproperImageHeader");
     icon_info.size=ReadBlobLSBLong(image);
-    icon_info.width=(unsigned char) ReadBlobLSBLong(image);
-    icon_info.height=(unsigned char) ReadBlobLSBLong(image)/2;
+    icon_info.width=(unsigned char) ((int) ReadBlobLSBLong(image));
+    icon_info.height=(unsigned char) ((int) ReadBlobLSBLong(image)/2);
     if ((icon_file.directory[i].width == 0) && 
         (icon_file.directory[i].height == 0))
       {
@@ -280,8 +280,8 @@ static Image *ReadICONImage(const ImageInfo *image_info,
         if (png == (unsigned char *) NULL)
           ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
         (void) CopyMagickMemory(png,"\211PNG\r\n\032\n\000\000\000\015",12);
-        count=ReadBlob(image,length,png+12);
-        if (count != (ssize_t) length)
+        count=ReadBlob(image,length-12,png+12);
+        if (count != (ssize_t) (length-12))
           {
             png=(unsigned char *) RelinquishMagickMemory(png);
             ThrowReaderException(CorruptImageError,
@@ -320,23 +320,23 @@ static Image *ReadICONImage(const ImageInfo *image_info,
         image->rows=(size_t) icon_file.directory[i].height;
         if ((ssize_t) image->rows > icon_info.height)
           image->rows=(size_t) icon_info.height;
-        image->depth=8;
+        image->depth=icon_info.bits_per_pixel;
         if (image->debug != MagickFalse)
           {
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              " scene    = %lu",(unsigned long) i);
+              " scene    = %.20g",(double) i);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   size   = %lu",(unsigned long) icon_info.size);
+              "   size   = %.20g",(double) icon_info.size);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   width  = %lu",(unsigned long) icon_file.directory[i].width);
+              "   width  = %.20g",(double) icon_file.directory[i].width);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   height = %lu",(unsigned long) icon_file.directory[i].height);
+              "   height = %.20g",(double) icon_file.directory[i].height);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   colors = %lu",(unsigned long ) icon_info.number_colors);
+              "   colors = %.20g",(double ) icon_info.number_colors);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   planes = %lu",(unsigned long) icon_info.planes);
+              "   planes = %.20g",(double) icon_info.planes);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   bpp    = %lu",(unsigned long) icon_info.bits_per_pixel);
+              "   bpp    = %.20g",(double) icon_info.bits_per_pixel);
           }
       if ((icon_info.number_colors != 0) || (icon_info.bits_per_pixel <= 16))
         {
@@ -354,12 +354,14 @@ static Image *ReadICONImage(const ImageInfo *image_info,
             *icon_colormap;
 
           size_t
-            number_colors;
+            number_colors,
+            one;
 
           /*
             Read Icon raster colormap.
           */
-          number_colors=1UL << icon_info.bits_per_pixel;
+          one=1;
+          number_colors=one << icon_info.bits_per_pixel;
           if (AcquireImageColormap(image,number_colors) == MagickFalse)
             ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
           icon_colormap=(unsigned char *) AcquireQuantumMemory((size_t)
@@ -389,6 +391,7 @@ static Image *ReadICONImage(const ImageInfo *image_info,
             break;
         bytes_per_line=(((image->columns*icon_info.bits_per_pixel)+31) &
           ~31) >> 3;
+        (void) bytes_per_line;
         scanline_pad=((((image->columns*icon_info.bits_per_pixel)+31) & ~31)-
           (image->columns*icon_info.bits_per_pixel)) >> 3;
         switch (icon_info.bits_per_pixel)
@@ -569,7 +572,8 @@ static Image *ReadICONImage(const ImageInfo *image_info,
           default:
             ThrowReaderException(CorruptImageError,"ImproperImageHeader");
         }
-        (void) SyncImage(image);
+        if (image_info->ping == MagickFalse)
+          (void) SyncImage(image);
         if (icon_info.bits_per_pixel != 32)
           {
             /*
@@ -827,8 +831,10 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
     (void) WriteBlobByte(image,icon_file.directory[scene].reserved);
     (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes);
     (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel);
-    (void) WriteBlobLSBLong(image,icon_file.directory[scene].size);
-    (void) WriteBlobLSBLong(image,icon_file.directory[scene].offset);
+    (void) WriteBlobLSBLong(image,(unsigned int)
+      icon_file.directory[scene].size);
+    (void) WriteBlobLSBLong(image,(unsigned int)
+      icon_file.directory[scene].offset);
     scene++;
     next=SyncNextImageInList(next);
   } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse));
@@ -898,6 +904,9 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
           }
         else
           {
+            size_t
+              one;
+
             /*
               Colormapped ICON raster.
             */
@@ -908,7 +917,8 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
               icon_info.bits_per_pixel=4;
             if (next->colors <= 2)
               icon_info.bits_per_pixel=1;
-            icon_info.number_colors=1 << icon_info.bits_per_pixel;
+            one=1;
+            icon_info.number_colors=one << icon_info.bits_per_pixel;
             if (icon_info.number_colors < next->colors)
               {
                 (void) SetImageStorageClass(next,DirectClass);
@@ -918,10 +928,14 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
               }
             else
               {
-                icon_info.file_size+=3*(1UL << icon_info.bits_per_pixel);
-                icon_info.offset_bits+=3*(1UL << icon_info.bits_per_pixel);
-                icon_info.file_size+=(1UL << icon_info.bits_per_pixel);
-                icon_info.offset_bits+=(1UL << icon_info.bits_per_pixel);
+                size_t
+                  one;
+
+                one=1;
+                icon_info.file_size+=3*(one << icon_info.bits_per_pixel);
+                icon_info.offset_bits+=3*(one << icon_info.bits_per_pixel);
+                icon_info.file_size+=(one << icon_info.bits_per_pixel);
+                icon_info.offset_bits+=(one << icon_info.bits_per_pixel);
               }
           }
         bytes_per_line=(((next->columns*icon_info.bits_per_pixel)+31) &
@@ -1118,17 +1132,17 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
         icon_file.directory[scene].bits_per_pixel=icon_info.bits_per_pixel;
         icon_file.directory[scene].size=icon_info.size;
         icon_file.directory[scene].offset=(size_t) TellBlob(image);
-        (void) WriteBlobLSBLong(image,(size_t) 40);
-        (void) WriteBlobLSBLong(image,(size_t) icon_info.width);
-        (void) WriteBlobLSBLong(image,(size_t) icon_info.height*2);
+        (void) WriteBlobLSBLong(image,(unsigned int) 40);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.width);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.height*2);
         (void) WriteBlobLSBShort(image,icon_info.planes);
         (void) WriteBlobLSBShort(image,icon_info.bits_per_pixel);
-        (void) WriteBlobLSBLong(image,icon_info.compression);
-        (void) WriteBlobLSBLong(image,icon_info.image_size);
-        (void) WriteBlobLSBLong(image,icon_info.x_pixels);
-        (void) WriteBlobLSBLong(image,icon_info.y_pixels);
-        (void) WriteBlobLSBLong(image,icon_info.number_colors);
-        (void) WriteBlobLSBLong(image,icon_info.colors_important);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.compression);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.image_size);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.x_pixels);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.y_pixels);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.number_colors);
+        (void) WriteBlobLSBLong(image,(unsigned int) icon_info.colors_important);
         if (next->storage_class == PseudoClass)
           {
             unsigned char
@@ -1204,6 +1218,7 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
       break;
   } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse));
   offset=SeekBlob(image,0,SEEK_SET);
+  (void) offset;
   (void) WriteBlobLSBShort(image,0);
   (void) WriteBlobLSBShort(image,1);
   (void) WriteBlobLSBShort(image,(unsigned short) (scene+1));
@@ -1217,8 +1232,10 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
     (void) WriteBlobByte(image,icon_file.directory[scene].reserved);
     (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes);
     (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel);
-    (void) WriteBlobLSBLong(image,icon_file.directory[scene].size);
-    (void) WriteBlobLSBLong(image,icon_file.directory[scene].offset);
+    (void) WriteBlobLSBLong(image,(unsigned int)
+      icon_file.directory[scene].size);
+    (void) WriteBlobLSBLong(image,(unsigned int)
+      icon_file.directory[scene].offset);
     scene++;
     next=SyncNextImageInList(next);
   } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse));