}
for (x=0; x < (ssize_t) image->columns; x++)
{
- SetPixelRed(append_image,GetPixelRed(image,p),q);
- SetPixelGreen(append_image,GetPixelGreen(image,p),q);
- SetPixelBlue(append_image,GetPixelBlue(image,p),q);
- if ((image->colorspace == CMYKColorspace) &&
- (append_image->colorspace == CMYKColorspace))
- SetPixelBlack(append_image,GetPixelBlack(image,p),q);
- SetPixelAlpha(append_image,OpaqueAlpha,q);
- if (image->matte != MagickFalse)
- SetPixelAlpha(append_image,GetPixelAlpha(image,p),q);
+ register ssize_t
+ i;
+
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ PixelChannel
+ channel;
+
+ PixelTrait
+ append_traits,
+ traits;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ append_traits=GetPixelChannelMapTraits(append_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (append_traits == UndefinedPixelTrait))
+ continue;
+ q[channel]=p[i];
+ }
p+=GetPixelChannels(image);
q+=GetPixelChannels(append_image);
}
% o exception: return any errors or warnings in this structure.
%
*/
+
+static inline size_t MagickMin(const size_t x,const size_t y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
MagickExport Image *CombineImages(const Image *image,ExceptionInfo *exception)
{
#define CombineImageTag "Combine/Image"
CacheView
*combine_view;
- const Image
- *next;
-
Image
*combine_image;
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
- for (next=image; next != (Image *) NULL; next=GetNextImageInList(next))
- {
- if ((next->columns != image->columns) || (next->rows != image->rows))
- ThrowImageException(OptionError,"ImagesAreNotTheSameSize");
- }
combine_image=CloneImage(image,0,0,MagickTrue,exception);
if (combine_image == (Image *) NULL)
return((Image *) NULL);
}
if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
combine_image->matte=MagickTrue;
- (void) SetImageBackgroundColor(combine_image);
/*
Combine images.
*/
*restrict q;
register ssize_t
- x;
+ i;
if (status == MagickFalse)
continue;
continue;
}
next=image;
- if (((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) &&
- (next != (Image *) NULL))
- {
- image_view=AcquireCacheView(next);
- p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
- if (p == (const Quantum *) NULL)
- continue;
- q=pixels;
- for (x=0; x < (ssize_t) combine_image->columns; x++)
- {
- SetPixelRed(image,GetPixelIntensity(image,p),q);
- p+=GetPixelChannels(image);
- q+=GetPixelChannels(combine_image);
- }
- image_view=DestroyCacheView(image_view);
- next=GetNextImageInList(next);
- }
- if (((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) &&
- (next != (Image *) NULL))
- {
- image_view=AcquireCacheView(next);
- p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
- if (p == (const Quantum *) NULL)
- continue;
- q=pixels;
- for (x=0; x < (ssize_t) combine_image->columns; x++)
- {
- SetPixelGreen(image,GetPixelIntensity(image,p),q);
- p+=GetPixelChannels(image);
- q+=GetPixelChannels(combine_image);
- }
- image_view=DestroyCacheView(image_view);
- next=GetNextImageInList(next);
- }
- if (((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) &&
- (next != (Image *) NULL))
- {
- image_view=AcquireCacheView(next);
- p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
- if (p == (const Quantum *) NULL)
- continue;
- q=pixels;
- for (x=0; x < (ssize_t) combine_image->columns; x++)
- {
- SetPixelBlue(image,GetPixelIntensity(image,p),q);
- p+=GetPixelChannels(image);
- q+=GetPixelChannels(combine_image);
- }
- image_view=DestroyCacheView(image_view);
- next=GetNextImageInList(next);
- }
- if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
- (image->colorspace == CMYKColorspace) && (next != (Image *) NULL))
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ PixelChannel
+ channel;
+
+ PixelTrait
+ combine_traits,
+ traits;
+
+ register ssize_t
+ x;
+
+ if (next == (Image *) NULL)
+ continue;
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ combine_traits=GetPixelChannelMapTraits(combine_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (combine_traits == UndefinedPixelTrait))
+ continue;
+ image_view=AcquireCacheView(next);
+ p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
+ if (p == (const Quantum *) NULL)
+ continue;
+ q=pixels;
+ for (x=0; x < (ssize_t) combine_image->columns; x++)
{
- image_view=AcquireCacheView(next);
- p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
- if (p == (const Quantum *) NULL)
- continue;
- q=pixels;
- for (x=0; x < (ssize_t) combine_image->columns; x++)
- {
- SetPixelBlack(image,GetPixelIntensity(image,p),q);
- p+=GetPixelChannels(image);
- q+=GetPixelChannels(combine_image);
- }
- image_view=DestroyCacheView(image_view);
- next=GetNextImageInList(next);
+ if (x < (ssize_t) image->columns)
+ {
+ q[i]=p[i];
+ p+=GetPixelChannels(image);
+ }
+ q+=GetPixelChannels(combine_image);
}
- if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) &&
- (next != (Image *) NULL))
- {
- image_view=AcquireCacheView(next);
- p=GetCacheViewVirtualPixels(image_view,0,y,next->columns,1,exception);
- if (p == (const Quantum *) NULL)
- continue;
- q=pixels;
- for (x=0; x < (ssize_t) combine_image->columns; x++)
+ image_view=DestroyCacheView(image_view);
+ next=GetNextImageInList(next);
+ if (SyncCacheViewAuthenticPixels(combine_view,exception) == MagickFalse)
+ status=MagickFalse;
+ if (image->progress_monitor != (MagickProgressMonitor) NULL)
{
- SetPixelAlpha(image,GetPixelIntensity(image,p),q);
- p+=GetPixelChannels(image);
- q+=GetPixelChannels(combine_image);
- }
- image_view=DestroyCacheView(image_view);
- next=GetNextImageInList(next);
- }
- if (SyncCacheViewAuthenticPixels(combine_view,exception) == MagickFalse)
- status=MagickFalse;
- if (image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
+ MagickBooleanType
+ proceed;
- proceed=SetImageProgress(image,CombineImageTag,progress++,
- combine_image->rows);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
+ proceed=SetImageProgress(image,CombineImageTag,progress++,
+ combine_image->rows);
+ if (proceed == MagickFalse)
+ status=MagickFalse;
+ }
+ }
}
combine_view=DestroyCacheView(combine_view);
if (status == MagickFalse)
MagickBooleanType
status;
- PixelInfo
- zero;
-
ssize_t
y;
pixel=zero;
for (x=0; x < (ssize_t) image->columns; x++)
{
- SetPixelInfo(image,p,&pixel);
- if ((pixel.red < 0.0) || (pixel.red > QuantumRange) ||
- (pixel.red != (QuantumAny) pixel.red))
- break;
- if ((pixel.green < 0.0) || (pixel.green > QuantumRange) ||
- (pixel.green != (QuantumAny) pixel.green))
- break;
- if ((pixel.blue < 0.0) || (pixel.blue > QuantumRange) ||
- (pixel.blue != (QuantumAny) pixel.blue))
- break;
- if (pixel.colorspace == CMYKColorspace)
- {
- if ((pixel.black < 0.0) || (pixel.black > QuantumRange) ||
- (pixel.black != (QuantumAny) pixel.black))
- break;
- }
- if (pixel.matte != MagickFalse)
- {
- if ((pixel.alpha < 0.0) || (pixel.alpha > QuantumRange) ||
- (pixel.alpha != (QuantumAny) pixel.alpha))
- break;
- }
+ PixelTrait
+ traits;
+
+ register ssize_t
+ i;
+
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ MagickRealType
+ pixel;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ if (traits == UndefinedPixelTrait)
+ continue;
+ pixel=(MagickRealType) p[i];
+ if ((pixel < 0.0) || (pixel > QuantumRange) ||
+ (pixel != (QuantumAny) pixel))
+ break;
+ }
p+=GetPixelChannels(image);
+ if (i < (ssize_t) GetPixelChannels(image))
+ status=MagickFalse;
}
if (x < (ssize_t) image->columns)
status=MagickFalse;
% The format of the NewMagickImage method is:
%
% Image *NewMagickImage(const ImageInfo *image_info,
-% const size_t width,const size_t height,
-% const PixelInfo *background)
+% const size_t width,const size_t height,const PixelInfo *background)
%
% A description of each parameter follows:
%
%
*/
MagickExport Image *NewMagickImage(const ImageInfo *image_info,
- const size_t width,const size_t height,
- const PixelInfo *background)
+ const size_t width,const size_t height,const PixelInfo *background)
{
CacheView
*image_view;
Image
*image;
- ssize_t
- y;
-
MagickBooleanType
status;
+ ssize_t
+ y;
+
assert(image_info != (const ImageInfo *) NULL);
if (image_info->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");