% July 1992 %
% %
% %
-% Copyright 1999-2011 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 "MagickCore/studio.h"
+#include "MagickCore/artifact.h"
#include "MagickCore/blob.h"
#include "MagickCore/blob-private.h"
#include "MagickCore/cache.h"
#include "MagickCore/memory_.h"
#include "MagickCore/monitor.h"
#include "MagickCore/monitor-private.h"
-#include "MagickCore/nt-feature.h"
+#include "MagickCore/nt-base-private.h"
#include "MagickCore/pixel-accessor.h"
#include "MagickCore/quantize.h"
#include "MagickCore/quantum-private.h"
(void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",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)
{
icon_info.size=ReadBlobLSBLong(image);
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))
+ icon_info.planes=ReadBlobLSBShort(image);
+ icon_info.bits_per_pixel=ReadBlobLSBShort(image);
+ if ((icon_info.planes == 18505) && (icon_info.bits_per_pixel == 21060))
{
Image
*icon_image;
Icon image encoded as a compressed PNG image.
*/
length=icon_file.directory[i].size;
- png=(unsigned char *) AcquireQuantumMemory(length+12,sizeof(*png));
+ png=(unsigned char *) AcquireQuantumMemory(length+16,sizeof(*png));
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-12,png+12);
- if (count != (ssize_t) (length-12))
+ png[12]=(unsigned char) icon_info.planes;
+ png[13]=(unsigned char) (icon_info.planes >> 8);
+ png[14]=(unsigned char) icon_info.bits_per_pixel;
+ png[15]=(unsigned char) (icon_info.bits_per_pixel >> 8);
+ count=ReadBlob(image,length-16,png+16);
+ if (count != (ssize_t) (length-16))
{
png=(unsigned char *) RelinquishMagickMemory(png);
ThrowReaderException(CorruptImageError,
}
read_info=CloneImageInfo(image_info);
(void) CopyMagickString(read_info->magick,"PNG",MaxTextExtent);
- icon_image=BlobToImage(read_info,png,length+12,exception);
+ icon_image=BlobToImage(read_info,png,length+16,exception);
read_info=DestroyImageInfo(read_info);
png=(unsigned char *) RelinquishMagickMemory(png);
if (icon_image == (Image *) NULL)
}
else
{
- icon_info.planes=ReadBlobLSBShort(image);
- icon_info.bits_per_pixel=ReadBlobLSBShort(image);
if (icon_info.bits_per_pixel > 32)
ThrowReaderException(CorruptImageError,"ImproperImageHeader");
icon_info.compression=ReadBlobLSBLong(image);
image->columns=(size_t) icon_file.directory[i].width;
if ((ssize_t) image->columns > icon_info.width)
image->columns=(size_t) icon_info.width;
+ if (image->columns == 0)
+ image->columns=256;
image->rows=(size_t) icon_file.directory[i].height;
if ((ssize_t) image->rows > icon_info.height)
image->rows=(size_t) icon_info.height;
+ if (image->rows == 0)
+ image->rows=256;
image->depth=icon_info.bits_per_pixel;
if (image->debug != MagickFalse)
{
ThrowReaderException(CorruptImageError,"ImproperImageHeader");
}
if (image_info->ping == MagickFalse)
- (void) SyncImage(image);
+ (void) SyncImage(image,exception);
if (icon_info.bits_per_pixel != 32)
{
/*
/*
Allocate next image structure.
*/
- AcquireNextImage(image_info,image);
+ AcquireNextImage(image_info,image,exception);
if (GetNextImageInList(image) == (Image *) NULL)
{
image=DestroyImageList(image);
next=image;
do
{
- if ((next->columns == 256) && (next->rows == 256))
+ if ((next->columns > 256L) && (next->rows > 256L) &&
+ (next->compression == ZipCompression))
{
Image
*write_image;
return(MagickFalse);
write_info=CloneImageInfo(image_info);
(void) CopyMagickString(write_info->filename,"PNG:",MaxTextExtent);
+ /*
+ Don't write any ancillary chunks except for gAMA and tRNS.
+ */
+ (void) SetImageArtifact(write_image,"png:include-chunk",
+ "none,trns,gama");
png=(unsigned char *) ImageToBlob(write_info,write_image,&length,
exception);
write_image=DestroyImage(write_image);
Initialize ICON raster file header.
*/
if (next->colorspace != RGBColorspace)
- (void) TransformImageColorspace(next,RGBColorspace);
+ (void) TransformImageColorspace(next,sRGBColorspace,exception);
icon_info.file_size=14+12+28;
icon_info.offset_bits=icon_info.file_size;
icon_info.compression=BI_RGB;
case UndefinedResolution:
case PixelsPerInchResolution:
{
- icon_info.x_pixels=(size_t) (100.0*next->x_resolution/2.54);
- icon_info.y_pixels=(size_t) (100.0*next->y_resolution/2.54);
+ icon_info.x_pixels=(size_t) (100.0*next->resolution.x/2.54);
+ icon_info.y_pixels=(size_t) (100.0*next->resolution.y/2.54);
break;
}
case PixelsPerCentimeterResolution:
{
- icon_info.x_pixels=(size_t) (100.0*next->x_resolution);
- icon_info.y_pixels=(size_t) (100.0*next->y_resolution);
+ icon_info.x_pixels=(size_t) (100.0*next->resolution.x);
+ icon_info.y_pixels=(size_t) (100.0*next->resolution.y);
break;
}
}