% July 1992 %
% %
% %
-% Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2018 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 %
% obtain a copy of the License at %
% %
-% http://www.imagemagick.org/script/license.php %
+% https://imagemagick.org/script/license.php %
% %
% Unless required by applicable law or agreed to in writing, software %
% distributed under the License is distributed on an "AS IS" BASIS, %
% o exception: return any errors or warnings in this structure.
%
*/
+
+static Image *ReadXCImage(const ImageInfo *image_info,ExceptionInfo *exception)
+{
+ Image
+ *image;
+
+ MagickBooleanType
+ status;
+
+ PixelInfo
+ pixel;
+
+ register ssize_t
+ x;
+
+ register Quantum
+ *q;
+
+ ssize_t
+ y;
+
+ /*
+ Initialize Image structure.
+ */
+ assert(image_info != (const ImageInfo *) NULL);
+ assert(image_info->signature == MagickCoreSignature);
+ if (image_info->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
+ image_info->filename);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickCoreSignature);
+ image=AcquireImage(image_info,exception);
+ if (image->columns == 0)
+ image->columns=1;
+ if (image->rows == 0)
+ image->rows=1;
+ status=SetImageExtent(image,image->columns,image->rows,exception);
+ if (status == MagickFalse)
+ return(DestroyImageList(image));
+ (void) CopyMagickString(image->filename,image_info->filename,
+ MagickPathExtent);
+ if (*image_info->filename == '\0')
+ pixel=image->background_color;
+ else
+ {
+ status=QueryColorCompliance((char *) image_info->filename,AllCompliance,
+ &pixel,exception);
+ if (status == MagickFalse)
+ {
+ image=DestroyImage(image);
+ return((Image *) NULL);
+ }
+ }
+ (void) SetImageColorspace(image,pixel.colorspace,exception);
+ image->alpha_trait=pixel.alpha_trait;
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
+ if (q == (Quantum *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ SetPixelViaPixelInfo(image,&pixel,q);
+ q+=GetPixelChannels(image);
+ }
+ if (SyncAuthenticPixels(image,exception) == MagickFalse)
+ break;
+ }
+ return(GetFirstImageInList(image));
+}
+
static Image *ReadGRADIENTImage(const ImageInfo *image_info,
ExceptionInfo *exception)
{
char
- colorname[MaxTextExtent];
+ colorname[MagickPathExtent+4];
Image
*image;
icc_color,
status;
- PixelInfo
- start_color,
- stop_color;
+ StopInfo
+ *stops;
/*
Initialize Image structure.
*/
assert(image_info != (const ImageInfo *) NULL);
- assert(image_info->signature == MagickSignature);
+ assert(image_info->signature == MagickCoreSignature);
if (image_info->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
image_info->filename);
assert(exception != (ExceptionInfo *) NULL);
- assert(exception->signature == MagickSignature);
+ assert(exception->signature == MagickCoreSignature);
read_info=CloneImageInfo(image_info);
SetImageInfoBlob(read_info,(void *) NULL,0);
- (void) CopyMagickString(colorname,image_info->filename,MaxTextExtent);
+ (void) CopyMagickString(colorname,image_info->filename,MagickPathExtent);
(void) sscanf(image_info->filename,"%[^-]",colorname);
- (void) FormatLocaleString(read_info->filename,MaxTextExtent,"xc:%s",
- colorname);
- image=ReadImage(read_info,exception);
+ (void) CopyMagickString(read_info->filename,colorname,MagickPathExtent);
+ image=ReadXCImage(read_info,exception);
read_info=DestroyImageInfo(read_info);
if (image == (Image *) NULL)
return((Image *) NULL);
(void) SetImageAlpha(image,(Quantum) TransparentAlpha,exception);
- (void) CopyMagickString(image->filename,image_info->filename,MaxTextExtent);
+ (void) CopyMagickString(image->filename,image_info->filename,
+ MagickPathExtent);
icc_color=MagickFalse;
if (LocaleCompare(colorname,"icc") == 0)
{
- (void) ConcatenateMagickString(colorname,"-",MaxTextExtent);
+ (void) ConcatenateMagickString(colorname,"-",MagickPathExtent);
(void) sscanf(image_info->filename,"%*[^-]-%[^-]",colorname+4);
icc_color=MagickTrue;
}
- status=QueryColorCompliance(colorname,AllCompliance,&start_color,exception);
+ stops=(StopInfo *) AcquireQuantumMemory(2,sizeof(*stops));
+ if (stops == (StopInfo *) NULL)
+ ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
+ stops[0].offset=0.0;
+ stops[1].offset=1.0;
+ status=QueryColorCompliance(colorname,AllCompliance,&stops[0].color,
+ exception);
if (status == MagickFalse)
{
+ stops=(StopInfo *) RelinquishMagickMemory(stops);
image=DestroyImage(image);
return((Image *) NULL);
}
- (void) SetImageColorspace(image,start_color.colorspace,exception);
- (void) CopyMagickString(colorname,"white",MaxTextExtent);
- if (GetPixelInfoIntensity(image,&start_color) > (QuantumRange/2.0))
- (void) CopyMagickString(colorname,"black",MaxTextExtent);
+ (void) SetImageColorspace(image,stops[0].color.colorspace,exception);
+ (void) CopyMagickString(colorname,"white",MagickPathExtent);
+ if (GetPixelInfoIntensity(image,&stops[0].color) > (QuantumRange/2.0))
+ (void) CopyMagickString(colorname,"black",MagickPathExtent);
if (icc_color == MagickFalse)
(void) sscanf(image_info->filename,"%*[^-]-%[^-]",colorname);
else
(void) sscanf(image_info->filename,"%*[^-]-%*[^-]-%[^-]",colorname);
- status=QueryColorCompliance(colorname,AllCompliance,&stop_color,exception);
+ status=QueryColorCompliance(colorname,AllCompliance,&stops[1].color,
+ exception);
if (status == MagickFalse)
{
+ stops=(StopInfo *) RelinquishMagickMemory(stops);
image=DestroyImage(image);
return((Image *) NULL);
}
- image->alpha_trait=start_color.alpha_trait;
- if (stop_color.alpha_trait != UndefinedPixelTrait)
- image->alpha_trait=stop_color.alpha_trait;
+ image->alpha_trait=stops[0].color.alpha_trait;
+ if (stops[1].color.alpha_trait != UndefinedPixelTrait)
+ image->alpha_trait=stops[1].color.alpha_trait;
status=GradientImage(image,LocaleCompare(image_info->magick,"GRADIENT") == 0 ?
- LinearGradient : RadialGradient,PadSpread,&start_color,&stop_color,
- exception);
+ LinearGradient : RadialGradient,PadSpread,stops,2,exception);
+ stops=(StopInfo *) RelinquishMagickMemory(stops);
if (status == MagickFalse)
{
image=DestroyImageList(image);