X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=coders%2Fsun.c;h=e33e0f3b3cdaec4324ef464e30c22023f41ceda8;hb=de984cdc3631106b1cbbb8d3972b76a0fc27e8e8;hp=630668c7a4c328ddbeaeb05f3c034b6ba40d9079;hpb=4c08aed51c5899665ade97263692328eea4af106;p=imagemagick diff --git a/coders/sun.c b/coders/sun.c index 630668c7a..e33e0f3b3 100644 --- a/coders/sun.c +++ b/coders/sun.c @@ -13,11 +13,11 @@ % Read/Write Sun Rasterfile Image Format % % % % Software Design % -% John Cristy % +% Cristy % % July 1992 % % % % % -% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % +% Copyright 1999-2014 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 % @@ -48,6 +48,7 @@ #include "MagickCore/color-private.h" #include "MagickCore/colormap.h" #include "MagickCore/colorspace.h" +#include "MagickCore/colorspace-private.h" #include "MagickCore/exception.h" #include "MagickCore/exception-private.h" #include "MagickCore/image.h" @@ -67,7 +68,7 @@ Forward declarations. */ static MagickBooleanType - WriteSUNImage(const ImageInfo *,Image *); + WriteSUNImage(const ImageInfo *,Image *,ExceptionInfo *); /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -278,7 +279,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) 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) { @@ -332,7 +333,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) /* Create linear color ramp. */ - if (AcquireImageColormap(image,image->colors) == MagickFalse) + if (AcquireImageColormap(image,image->colors,exception) == MagickFalse) ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); } break; @@ -345,7 +346,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) /* Read SUN raster colormap. */ - if (AcquireImageColormap(image,image->colors) == MagickFalse) + if (AcquireImageColormap(image,image->colors,exception) == MagickFalse) ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); sun_colormap=(unsigned char *) AcquireQuantumMemory(image->colors, sizeof(*sun_colormap)); @@ -382,7 +383,8 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) default: ThrowReaderException(CoderError,"ColormapTypeNotSupported"); } - image->matte=sun_info.depth == 32 ? MagickTrue : MagickFalse; + image->alpha_trait=sun_info.depth == 32 ? BlendPixelTrait : + UndefinedPixelTrait; image->columns=sun_info.width; image->rows=sun_info.height; if (image_info->ping != MagickFalse) @@ -394,7 +396,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) sun_info.length || !sun_info.length) ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); number_pixels=(MagickSizeType) image->columns*image->rows; - if ((sun_info.depth >= 8) && + if ((sun_info.type != RT_ENCODED) && (sun_info.depth >= 8) && ((number_pixels*((sun_info.depth+7)/8)) > sun_info.length)) ThrowReaderException(CorruptImageError,"ImproperImageHeader"); sun_data=(unsigned char *) AcquireQuantumMemory((size_t) sun_info.length, @@ -440,7 +442,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) for (y=0; y < (ssize_t) image->rows; y++) { q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); - if (q == (const Quantum *) NULL) + if (q == (Quantum *) NULL) break; for (x=0; x < ((ssize_t) image->columns-7); x+=8) { @@ -483,7 +485,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) for (y=0; y < (ssize_t) image->rows; y++) { q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); - if (q == (const Quantum *) NULL) + if (q == (Quantum *) NULL) break; for (x=0; x < (ssize_t) image->columns; x++) { @@ -509,7 +511,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) bytes_per_pixel; bytes_per_pixel=3; - if (image->matte != MagickFalse) + if (image->alpha_trait == BlendPixelTrait) bytes_per_pixel++; length=image->rows*((bytes_per_line*image->columns)+ image->columns % 2); @@ -520,11 +522,11 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) for (y=0; y < (ssize_t) image->rows; y++) { q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); - if (q == (const Quantum *) NULL) + if (q == (Quantum *) NULL) break; for (x=0; x < (ssize_t) image->columns; x++) { - if (image->matte != MagickFalse) + if (image->alpha_trait == BlendPixelTrait) SetPixelAlpha(image,ScaleCharToQuantum(*p++),q); if (sun_info.type == RT_STANDARD) { @@ -563,7 +565,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) } } if (image->storage_class == PseudoClass) - (void) SyncImage(image); + (void) SyncImage(image,exception); sun_pixels=(unsigned char *) RelinquishMagickMemory(sun_pixels); if (EOFBlob(image) != MagickFalse) { @@ -583,7 +585,7 @@ static Image *ReadSUNImage(const ImageInfo *image_info,ExceptionInfo *exception) /* Allocate next image structure. */ - AcquireNextImage(image_info,image); + AcquireNextImage(image_info,image,exception); if (GetNextImageInList(image) == (Image *) NULL) { image=DestroyImageList(image); @@ -684,7 +686,8 @@ ModuleExport void UnregisterSUNImage(void) % % The format of the WriteSUNImage method is: % -% MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) +% MagickBooleanType WriteSUNImage(const ImageInfo *image_info, +% Image *image,ExceptionInfo *exception) % % A description of each parameter follows. % @@ -692,8 +695,11 @@ ModuleExport void UnregisterSUNImage(void) % % o image: The image. % +% o exception: return any errors or warnings in this structure. +% */ -static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) +static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image, + ExceptionInfo *exception) { #define RMT_EQUAL_RGB 1 #define RMT_NONE 0 @@ -745,7 +751,9 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); + assert(exception != (ExceptionInfo *) NULL); + assert(exception->signature == MagickSignature); + status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); if (status == MagickFalse) return(status); scene=0; @@ -754,8 +762,8 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) /* Initialize SUN raster file header. */ - if (image->colorspace != RGBColorspace) - (void) TransformImageColorspace(image,RGBColorspace); + if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) + (void) TransformImageColorspace(image,sRGBColorspace,exception); sun_info.magic=0x59a66a95; if ((image->columns != (unsigned int) image->columns) || (image->rows != (unsigned int) image->rows)) @@ -774,13 +782,15 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) /* Full color SUN raster. */ - sun_info.depth=(unsigned int) image->matte ? 32U : 24U; - sun_info.length=(unsigned int) ((image->matte ? 4 : 3)*number_pixels); + sun_info.depth=(unsigned int) image->alpha_trait == BlendPixelTrait ? + 32U : 24U; + sun_info.length=(unsigned int) ((image->alpha_trait == BlendPixelTrait ? + 4 : 3)*number_pixels); sun_info.length+=sun_info.length & 0x01 ? (unsigned int) image->rows : 0; } else - if (IsImageMonochrome(image,&image->exception)) + if (IsImageMonochrome(image,exception) != MagickFalse) { /* Monochrome SUN raster. @@ -835,7 +845,7 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) Allocate memory for pixels. */ bytes_per_pixel=3; - if (image->matte != MagickFalse) + if (image->alpha_trait == BlendPixelTrait) bytes_per_pixel++; length=image->columns; pixels=(unsigned char *) AcquireQuantumMemory(length,4*sizeof(*pixels)); @@ -846,13 +856,13 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) */ for (y=0; y < (ssize_t) image->rows; y++) { - p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + p=GetVirtualPixels(image,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) break; q=pixels; for (x=0; x < (ssize_t) image->columns; x++) { - if (image->matte != MagickFalse) + if (image->alpha_trait == BlendPixelTrait) *q++=ScaleQuantumToChar(GetPixelAlpha(image,p)); *q++=ScaleQuantumToChar(GetPixelRed(image,p)); *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); @@ -873,7 +883,7 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) pixels=(unsigned char *) RelinquishMagickMemory(pixels); } else - if (IsImageMonochrome(image,&image->exception)) + if (IsImageMonochrome(image,exception) != MagickFalse) { register unsigned char bit, @@ -882,10 +892,10 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) /* Convert PseudoClass image to a SUN monochrome image. */ - (void) SetImageType(image,BilevelType); + (void) SetImageType(image,BilevelType,exception); for (y=0; y < (ssize_t) image->rows; y++) { - p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + p=GetVirtualPixels(image,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) break; bit=0; @@ -893,7 +903,7 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) for (x=0; x < (ssize_t) image->columns; x++) { byte<<=1; - if (GetPixelIntensity(image,p) < (MagickRealType) (QuantumRange/2.0)) + if (GetPixelLuma(image,p) < (QuantumRange/2.0)) byte|=0x01; bit++; if (bit == 8) @@ -937,7 +947,7 @@ static MagickBooleanType WriteSUNImage(const ImageInfo *image_info,Image *image) */ for (y=0; y < (ssize_t) image->rows; y++) { - p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); + p=GetVirtualPixels(image,0,y,image->columns,1,exception); if (p == (const Quantum *) NULL) break; for (x=0; x < (ssize_t) image->columns; x++)