]> granicus.if.org Git - imagemagick/blobdiff - coders/icon.c
(no commit message)
[imagemagick] / coders / icon.c
index 2e715b3bd77faa2eb65286c6df673b8b1308f41e..783ed5b963955b2eea8ddcbf239347c7c78a0dd3 100644 (file)
@@ -205,10 +205,9 @@ static Image *ReadICONImage(const ImageInfo *image_info,
 
   size_t
     bit,
-    byte;
-
-  size_t
+    byte,
     bytes_per_line,
+    one,
     scanline_pad;
 
   /*
@@ -245,6 +244,7 @@ static Image *ReadICONImage(const ImageInfo *image_info,
     icon_file.directory[i].size=ReadBlobLSBLong(image);
     icon_file.directory[i].offset=ReadBlobLSBLong(image);
   }
+  one=1;
   for (i=0; i < icon_file.count; i++)
   {
     /*
@@ -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,30 +320,30 @@ 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    = %ld",i);
+              " scene    = %.20g",(double) i);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   size   = %ld",icon_info.size);
+              "   size   = %.20g",(double) icon_info.size);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   width  = %d",icon_file.directory[i].width);
+              "   width  = %.20g",(double) icon_file.directory[i].width);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   height = %d",icon_file.directory[i].height);
+              "   height = %.20g",(double) icon_file.directory[i].height);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   colors = %ld",icon_info.number_colors);
+              "   colors = %.20g",(double ) icon_info.number_colors);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   planes = %d",icon_info.planes);
+              "   planes = %.20g",(double) icon_info.planes);
             (void) LogMagickEvent(CoderEvent,GetMagickModule(),
-              "   bpp    = %d",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))
         {
           image->storage_class=PseudoClass;
           image->colors=icon_info.number_colors;
           if (image->colors == 0)
-            image->colors=1 << icon_info.bits_per_pixel;
+            image->colors=one << icon_info.bits_per_pixel;
         }
       if (image->storage_class == PseudoClass)
         {
@@ -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)
@@ -569,7 +571,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 +830,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 +903,9 @@ static MagickBooleanType WriteICONImage(const ImageInfo *image_info,
           }
         else
           {
+            size_t
+              one;
+
             /*
               Colormapped ICON raster.
             */
@@ -908,7 +916,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 +927,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 +1131,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
@@ -1217,8 +1230,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));