diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index f1a7495..81d9a71 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -345,11 +345,12 @@
{
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
+ PushPixelComponentMap( image(), channel_);
MagickCore::Image* newImage =
- AddNoiseImageChannel ( image(),
- channel_,
+ AddNoiseImage ( image(),
noiseType_,
&exceptionInfo );
+ PopPixelComponentMap( image() );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
@@ -1113,7 +1114,7 @@
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
- FxImageChannel ( image(), DefaultChannels, expression.c_str(), &exceptionInfo );
+ FxImage ( image(), expression.c_str(), &exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
@@ -1123,8 +1124,10 @@
{
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
+ PushPixelComponentMap( image(), channel );
MagickCore::Image* newImage =
- FxImageChannel ( image(), channel, expression.c_str(), &exceptionInfo );
+ FxImage ( image(), expression.c_str(), &exceptionInfo );
+ PopPixelComponentMap( image() );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h
index dbf6275..9cc1e69 100644
--- a/Magick++/lib/Magick++/Include.h
+++ b/Magick++/lib/Magick++/Include.h
@@ -534,7 +534,7 @@
using MagickCore::AdaptiveBlurImage;
using MagickCore::AdaptiveThresholdImage;
using MagickCore::AddNoiseImage;
- using MagickCore::AddNoiseImageChannel;
+ using MagickCore::AddNoiseImage;
using MagickCore::AffineMatrix;
using MagickCore::AffineTransformImage;
using MagickCore::AnnotateImage;
@@ -706,7 +706,7 @@
using MagickCore::ForwardFourierTransformImage;
using MagickCore::FrameImage;
using MagickCore::FrameInfo;
- using MagickCore::FxImageChannel;
+ using MagickCore::FxImage;
using MagickCore::GammaImage;
using MagickCore::GammaImage;
using MagickCore::GaussianBlurImage;
@@ -806,12 +806,14 @@
using MagickCore::PingBlob;
using MagickCore::PingImage;
using MagickCore::PixelSetQuantumPacket;
- using MagickCore::PixelWand;
+ using MagickCore::PixelWand;
using MagickCore::PointInfo;
using MagickCore::PopDrawingWand;
+ using MagickCore::PopPixelComponentMap;
using MagickCore::ProfileImage;
using MagickCore::ProfileInfo;
using MagickCore::PushDrawingWand;
+ using MagickCore::PushPixelComponentMap;
using MagickCore::QuantizeImage;
using MagickCore::QuantizeInfo;
using MagickCore::QuantumInfo;
diff --git a/MagickCore/effect.c b/MagickCore/effect.c
index 46bb6a3..a48c649 100644
--- a/MagickCore/effect.c
+++ b/MagickCore/effect.c
@@ -5128,7 +5128,8 @@
r+=(image->columns+StatisticWidth)*GetPixelChannels(image);
}
GetPixelInfo(image,&pixel);
- SetPixelInfo(image,p+StatisticWidth*StatisticHeight/2,&pixel);
+ SetPixelInfo(image,p+(StatisticWidth*StatisticHeight/2)*
+ GetPixelChannels(image),&pixel);
switch (type)
{
case GradientStatistic:
@@ -5185,22 +5186,17 @@
}
}
if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
- SetPixelRed(statistic_image,
- ClampToQuantum(pixel.red),q);
+ SetPixelRed(statistic_image,ClampToQuantum(pixel.red),q);
if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
- SetPixelGreen(statistic_image,
- ClampToQuantum(pixel.green),q);
+ SetPixelGreen(statistic_image,ClampToQuantum(pixel.green),q);
if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
- SetPixelBlue(statistic_image,
- ClampToQuantum(pixel.blue),q);
+ SetPixelBlue(statistic_image,ClampToQuantum(pixel.blue),q);
if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
(image->colorspace == CMYKColorspace))
- SetPixelBlack(statistic_image,
- ClampToQuantum(pixel.black),q);
+ SetPixelBlack(statistic_image,ClampToQuantum(pixel.black),q);
if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
(image->matte != MagickFalse))
- SetPixelAlpha(statistic_image,
- ClampToQuantum(pixel.alpha),q);
+ SetPixelAlpha(statistic_image,ClampToQuantum(pixel.alpha),q);
p+=GetPixelChannels(image);
q+=GetPixelChannels(statistic_image);
}
diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c
index 3cee6df..a5c32e7 100644
--- a/MagickCore/enhance.c
+++ b/MagickCore/enhance.c
@@ -107,9 +107,6 @@
mean,
sans;
- Image
- *level_image;
-
log_mean=log(0.5);
if (image->sync != MagickFalse)
{
@@ -125,32 +122,32 @@
Auto-gamma each channel separately.
*/
status=MagickTrue;
- level_image=CloneImage(image,0,0,MagickTrue,&image->exception);
- if (level_image == (Image *) NULL)
- return(MagickFalse);
if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelMean(image,RedChannel,&mean,&sans,
&image->exception);
gamma=log(mean*QuantumScale)/log_mean;
- SetPixelComponentMap(level_image,RedChannel);
- status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+ PushPixelComponentMap(image,RedChannel);
+ status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+ PopPixelComponentMap(image);
}
if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelMean(image,GreenChannel,&mean,&sans,
&image->exception);
gamma=log(mean*QuantumScale)/log_mean;
- SetPixelComponentMap(level_image,GreenChannel);
- status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+ PushPixelComponentMap(image,GreenChannel);
+ status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+ PopPixelComponentMap(image);
}
if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelMean(image,BlueChannel,&mean,&sans,
&image->exception);
gamma=log(mean*QuantumScale)/log_mean;
- SetPixelComponentMap(level_image,BlueChannel);
- status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+ PushPixelComponentMap(image,BlueChannel);
+ status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+ PopPixelComponentMap(image);
}
if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
(image->colorspace == CMYKColorspace))
@@ -158,8 +155,9 @@
(void) GetImageChannelMean(image,BlackChannel,&mean,&sans,
&image->exception);
gamma=log(mean*QuantumScale)/log_mean;
- SetPixelComponentMap(level_image,BlackChannel);
- status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+ PushPixelComponentMap(image,BlackChannel);
+ status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+ PopPixelComponentMap(image);
}
if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
(image->matte == MagickTrue))
@@ -167,10 +165,10 @@
(void) GetImageChannelMean(image,OpacityChannel,&mean,&sans,
&image->exception);
gamma=log(mean*QuantumScale)/log_mean;
- SetPixelComponentMap(level_image,AlphaChannel);
- status=status && LevelImage(level_image,0.0,(double) QuantumRange,gamma);
+ PushPixelComponentMap(image,AlphaChannel);
+ status=status && LevelImage(image,0.0,(double) QuantumRange,gamma);
+ PopPixelComponentMap(image);
}
- level_image=DestroyImage(level_image);
return(status != 0 ? MagickTrue : MagickFalse);
}
@@ -199,7 +197,7 @@
*/
MagickExport MagickBooleanType AutoLevelImage(Image *image)
{
- return(MinMaxStretchImage(image,DefaultChannels,0.0,0.0));
+ return(MinMaxStretchImage(image,0.0,0.0));
}
/*
@@ -2609,7 +2607,7 @@
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% LevelImageColor() maps the given color to "black" and "white" values,
+% LevelImageColors() maps the given color to "black" and "white" values,
% linearly spreading out the colors, and level values on a channel by channel
% bases, as per LevelImage(). The given colors allows you to specify
% different level ranges for each of the color channels separately.
@@ -2620,21 +2618,16 @@
% appropriatally. This effectivally maps a greyscale gradient into the given
% color gradient.
%
-% The format of the LevelColorsImageChannel method is:
+% The format of the LevelImageColors method is:
%
-% MagickBooleanType LevelColorsImage(Image *image,
-% const PixelInfo *black_color,
-% const PixelInfo *white_color,const MagickBooleanType invert)
-% MagickBooleanType LevelColorsImageChannel(Image *image,
-% const ChannelType channel,const PixelInfo *black_color,
-% const PixelInfo *white_color,const MagickBooleanType invert)
+% MagickBooleanType LevelImageColors(Image *image,
+% const PixelInfo *black_color,const PixelInfo *white_color,
+% const MagickBooleanType invert)
%
% A description of each parameter follows:
%
% o image: the image.
%
-% o channel: the channel.
-%
% o black_color: The color to map black to/from
%
% o white_point: The color to map white to/from
@@ -2642,23 +2635,10 @@
% o invert: if true map the colors (levelize), rather than from (level)
%
*/
-
-MagickExport MagickBooleanType LevelColorsImage(Image *image,
+MagickExport MagickBooleanType LevelImageColors(Image *image,
const PixelInfo *black_color,const PixelInfo *white_color,
const MagickBooleanType invert)
{
- MagickBooleanType
- status;
-
- status=LevelColorsImageChannel(image,DefaultChannels,black_color,white_color,
- invert);
- return(status);
-}
-
-MagickExport MagickBooleanType LevelColorsImageChannel(Image *image,
- const ChannelType channel,const PixelInfo *black_color,
- const PixelInfo *white_color,const MagickBooleanType invert)
-{
MagickStatusType
status;
@@ -2674,66 +2654,75 @@
{
if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,RedChannel);
+ PushPixelComponentMap(image,RedChannel);
status|=LevelImage(image,black_color->red,white_color->red,1.0);
+ PopPixelComponentMap(image);
}
if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,GreenChannel);
+ PushPixelComponentMap(image,GreenChannel);
status|=LevelImage(image,black_color->green,white_color->green,1.0);
+ PopPixelComponentMap(image);
}
if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,BlueChannel);
+ PushPixelComponentMap(image,BlueChannel);
status|=LevelImage(image,black_color->blue,white_color->blue,1.0);
+ PopPixelComponentMap(image);
}
if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
(image->colorspace == CMYKColorspace))
{
- SetPixelComponentMap(image,BlackChannel);
+ PushPixelComponentMap(image,BlackChannel);
status|=LevelImage(image,black_color->black,white_color->black,1.0);
+ PopPixelComponentMap(image);
}
if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
(image->matte == MagickTrue))
{
- SetPixelComponentMap(image,AlphaChannel);
+ PushPixelComponentMap(image,AlphaChannel);
status|=LevelImage(image,black_color->alpha,white_color->alpha,1.0);
+ PopPixelComponentMap(image);
}
}
else
{
if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,RedChannel);
+ PushPixelComponentMap(image,RedChannel);
status|=LevelizeImage(image,black_color->red,white_color->red,1.0);
+ PopPixelComponentMap(image);
}
if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,GreenChannel);
+ PushPixelComponentMap(image,GreenChannel);
status|=LevelizeImage(image,black_color->green,white_color->green,
1.0);
+ PopPixelComponentMap(image);
}
if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
{
- SetPixelComponentMap(image,BlueChannel);
+ PushPixelComponentMap(image,BlueChannel);
status|=LevelizeImage(image,black_color->blue,white_color->blue,1.0);
+ PopPixelComponentMap(image);
}
if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
(image->colorspace == CMYKColorspace))
{
- SetPixelComponentMap(image,BlackChannel);
+ PushPixelComponentMap(image,BlackChannel);
status|=LevelizeImage(image,black_color->black,white_color->black,
1.0);
+ PopPixelComponentMap(image);
}
if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
(image->matte == MagickTrue))
{
- SetPixelComponentMap(image,AlphaChannel);
+ PushPixelComponentMap(image,AlphaChannel);
status|=LevelizeImage(image,black_color->alpha,white_color->alpha,
1.0);
+ PopPixelComponentMap(image);
}
}
- SetPixelComponentMap(image,DefaultChannels);
return(status == 0 ? MagickFalse : MagickTrue);
}
diff --git a/MagickCore/enhance.h b/MagickCore/enhance.h
index 635902c..9965656 100644
--- a/MagickCore/enhance.h
+++ b/MagickCore/enhance.h
@@ -35,10 +35,8 @@
HaldClutImage(Image *,const Image *),
LevelImage(Image *,const double,const double,const double),
LevelizeImage(Image *,const double,const double,const double),
- LevelColorsImage(Image *,const PixelInfo *,const PixelInfo *,
+ LevelImageColors(Image *,const PixelInfo *,const PixelInfo *,
const MagickBooleanType),
- LevelColorsImageChannel(Image *,const ChannelType,const PixelInfo *,
- const PixelInfo *,const MagickBooleanType),
LinearStretchImage(Image *,const double,const double),
ModulateImage(Image *,const char *),
NegateImage(Image *,const MagickBooleanType),
diff --git a/MagickCore/feature.c b/MagickCore/feature.c
index f2b54f4..bc1f0d0 100644
--- a/MagickCore/feature.c
+++ b/MagickCore/feature.c
@@ -94,13 +94,13 @@
% %
% %
% %
-% G e t I m a g e C h a n n e l F e a t u r e s %
+% G e t I m a g e F e a t u r e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetImageChannelFeatures() returns features for each channel in the image in
+% GetImageFeatures() returns features for each channel in the image in
% each of four directions (horizontal, vertical, left and right diagonals)
% for the specified distance. The features include the angular second
% moment, contrast, correlation, sum of squares: variance, inverse difference
@@ -108,14 +108,14 @@
% measures of correlation 2, and maximum correlation coefficient. You can
% access the red channel contrast, for example, like this:
%
-% channel_features=GetImageChannelFeatures(image,1,exception);
+% channel_features=GetImageFeatures(image,1,exception);
% contrast=channel_features[RedChannel].contrast[0];
%
% Use MagickRelinquishMemory() to free the features buffer.
%
-% The format of the GetImageChannelFeatures method is:
+% The format of the GetImageFeatures method is:
%
-% ChannelFeatures *GetImageChannelFeatures(const Image *image,
+% ChannelFeatures *GetImageFeatures(const Image *image,
% const size_t distance,ExceptionInfo *exception)
%
% A description of each parameter follows:
@@ -135,7 +135,7 @@
return(x);
}
-MagickExport ChannelFeatures *GetImageChannelFeatures(const Image *image,
+MagickExport ChannelFeatures *GetImageFeatures(const Image *image,
const size_t distance,ExceptionInfo *exception)
{
typedef struct _ChannelStatistics
diff --git a/MagickCore/feature.h b/MagickCore/feature.h
index 7f8d1e5..88eb3d4 100644
--- a/MagickCore/feature.h
+++ b/MagickCore/feature.h
@@ -45,7 +45,7 @@
} ChannelFeatures;
extern MagickExport ChannelFeatures
- *GetImageChannelFeatures(const Image *,const size_t,ExceptionInfo *);
+ *GetImageFeatures(const Image *,const size_t,ExceptionInfo *);
#if defined(__cplusplus) || defined(c_plusplus)
}
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index e209b57..8a962e3 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -289,8 +289,6 @@
%
% Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
% ExceptionInfo *exception)
-% Image *AddNoiseImageChannel(const Image *image,const ChannelType channel,
-% const NoiseType noise_type,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
@@ -304,18 +302,7 @@
% o exception: return any errors or warnings in this structure.
%
*/
-MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
- ExceptionInfo *exception)
-{
- Image
- *noise_image;
-
- noise_image=AddNoiseImageChannel(image,DefaultChannels,noise_type,exception);
- return(noise_image);
-}
-
-MagickExport Image *AddNoiseImageChannel(const Image *image,
- const ChannelType channel,const NoiseType noise_type,ExceptionInfo *exception)
+MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, ExceptionInfo *exception)
{
#define AddNoiseImageTag "AddNoise/Image"
@@ -2848,15 +2835,11 @@
%
% Image *FxImage(const Image *image,const char *expression,
% ExceptionInfo *exception)
-% Image *FxImageChannel(const Image *image,const ChannelType channel,
-% const char *expression,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
% o image: the image.
%
-% o channel: the channel.
-%
% o expression: A mathematical expression.
%
% o exception: return any errors or warnings in this structure.
@@ -2917,16 +2900,6 @@
MagickExport Image *FxImage(const Image *image,const char *expression,
ExceptionInfo *exception)
{
- Image
- *fx_image;
-
- fx_image=FxImageChannel(image,GrayChannel,expression,exception);
- return(fx_image);
-}
-
-MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel,
- const char *expression,ExceptionInfo *exception)
-{
#define FxImageTag "Fx/Image"
CacheView
@@ -3056,7 +3029,7 @@
proceed;
#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickCore_FxImageChannel)
+ #pragma omp critical (MagickCore_FxImage)
#endif
proceed=SetImageProgress(image,FxImageTag,progress++,image->rows);
if (proceed == MagickFalse)
diff --git a/MagickCore/fx.h b/MagickCore/fx.h
index 67f6e55..9f97858 100644
--- a/MagickCore/fx.h
+++ b/MagickCore/fx.h
@@ -38,14 +38,11 @@
extern MagickExport Image
*AddNoiseImage(const Image *,const NoiseType,ExceptionInfo *),
- *AddNoiseImageChannel(const Image *,const ChannelType,const NoiseType,
- ExceptionInfo *),
*BlueShiftImage(const Image *,const double,ExceptionInfo *),
*CharcoalImage(const Image *,const double,const double,ExceptionInfo *),
*ColorizeImage(const Image *,const char *,const PixelPacket,ExceptionInfo *),
*ColorMatrixImage(const Image *,const KernelInfo *kernel,ExceptionInfo *),
*FxImage(const Image *,const char *,ExceptionInfo *),
- *FxImageChannel(const Image *,const ChannelType,const char *,ExceptionInfo *),
*ImplodeImage(const Image *,const double,ExceptionInfo *),
*MorphImages(const Image *,const size_t,ExceptionInfo *),
*PolaroidImage(const Image *,const DrawInfo *,const double,ExceptionInfo *),
diff --git a/MagickCore/histogram.c b/MagickCore/histogram.c
index f2877b8..9cbb84d 100644
--- a/MagickCore/histogram.c
+++ b/MagickCore/histogram.c
@@ -964,43 +964,37 @@
%
% The format of the MinMaxStretchImage method is:
%
-% MagickBooleanType MinMaxStretchImage(Image *image,
-% const ChannelType channel, const double black_adjust,
-% const double white_adjust)
+% MagickBooleanType MinMaxStretchImage(Image *image,const double black,
+% const double white)
%
% A description of each parameter follows:
%
% o image: The image to auto-level
%
-% o channel: The channels to auto-level. If the special 'SyncChannels'
-% flag is set, all the given channels are stretched by the same amount.
-%
-% o black_adjust, white_adjust: Move the Black/White Point inward
-% from the minimum and maximum points by this color value.
+% o black, white: move the black / white point inward from the minimum and
+% maximum points by this color value.
%
*/
MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
- const ChannelType channel,const double black_value,const double white_value)
+ const double black,const double white)
{
double
min,
max;
- Image
- *stretch_image;
-
MagickStatusType
status;
status=MagickTrue;
- if ((channel & SyncChannels) != 0)
+ if (image->sync != MagickFalse)
{
/*
Auto-level all channels equally.
*/
- (void) GetImageChannelRange(image,channel,&min,&max,&image->exception);
- min+=black_value;
- max-=white_value;
+ (void) GetImageChannelRange(image,DefaultChannels,&min,&max,
+ &image->exception);
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
status&=LevelImage(image,min,max,1.0);
return(status != 0 ? MagickTrue : MagickFalse);
@@ -1008,42 +1002,42 @@
/*
Auto-level each channel separately.
*/
- stretch_image=CloneImage(image,0,0,MagickTrue,&image->exception);
- if (stretch_image == (Image *) NULL)
- return(MagickFalse);
if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelRange(image,RedChannel,&min,&max,&image->exception);
- min+=black_value;
- max-=white_value;
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
{
- SetPixelComponentMap(stretch_image,RedChannel);
- status&=LevelImage(stretch_image,min,max,1.0);
+ PushPixelComponentMap(image,RedChannel);
+ status&=LevelImage(image,min,max,1.0);
+ PopPixelComponentMap(image);
}
}
if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelRange(image,GreenChannel,&min,&max,
&image->exception);
- min+=black_value;
- max-=white_value;
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
{
- SetPixelComponentMap(stretch_image,GreenChannel);
- status&=LevelImage(stretch_image,min,max,1.0);
+ PushPixelComponentMap(image,GreenChannel);
+ status&=LevelImage(image,min,max,1.0);
+ PopPixelComponentMap(image);
}
}
if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
{
(void) GetImageChannelRange(image,BlueChannel,&min,&max,
&image->exception);
- min+=black_value;
- max-=white_value;
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
{
- SetPixelComponentMap(stretch_image,BlueChannel);
- status&=LevelImage(stretch_image,min,max,1.0);
+ PushPixelComponentMap(image,BlueChannel);
+ status&=LevelImage(image,min,max,1.0);
+ PopPixelComponentMap(image);
}
}
if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
@@ -1051,12 +1045,13 @@
{
(void) GetImageChannelRange(image,BlackChannel,&min,&max,
&image->exception);
- min+=black_value;
- max-=white_value;
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
{
- SetPixelComponentMap(stretch_image,BlackChannel);
- status&=LevelImage(stretch_image,min,max,1.0);
+ PushPixelComponentMap(image,BlackChannel);
+ status&=LevelImage(image,min,max,1.0);
+ PopPixelComponentMap(image);
}
}
if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
@@ -1064,15 +1059,15 @@
{
(void) GetImageChannelRange(image,OpacityChannel,&min,&max,
&image->exception);
- min+=black_value;
- max-=white_value;
+ min+=black;
+ max-=white;
if (fabs(min-max) >= MagickEpsilon)
{
- SetPixelComponentMap(stretch_image,AlphaChannel);
- status&=LevelImage(stretch_image,min,max,1.0);
+ PushPixelComponentMap(image,AlphaChannel);
+ status&=LevelImage(image,min,max,1.0);
+ PopPixelComponentMap(image);
}
}
- stretch_image=DestroyImage(stretch_image);
return(status != 0 ? MagickTrue : MagickFalse);
}
diff --git a/MagickCore/histogram.h b/MagickCore/histogram.h
index a4151b5..a86f0fc 100644
--- a/MagickCore/histogram.h
+++ b/MagickCore/histogram.h
@@ -31,7 +31,7 @@
extern MagickExport MagickBooleanType
IsHistogramImage(const Image *,ExceptionInfo *),
IsPaletteImage(const Image *,ExceptionInfo *),
- MinMaxStretchImage(Image *,const ChannelType,const double,const double);
+ MinMaxStretchImage(Image *,const double,const double);
extern MagickExport size_t
GetNumberColors(const Image *,FILE *,ExceptionInfo *);
diff --git a/MagickCore/identify.c b/MagickCore/identify.c
index b5ebad6..cb5b452 100644
--- a/MagickCore/identify.c
+++ b/MagickCore/identify.c
@@ -430,7 +430,7 @@
if (artifact != (const char *) NULL)
{
distance=StringToUnsignedLong(artifact);
- channel_features=GetImageChannelFeatures(image,distance,
+ channel_features=GetImageFeatures(image,distance,
&image->exception);
}
depth=GetImageDepth(image,&image->exception);
diff --git a/MagickCore/image.c b/MagickCore/image.c
index b81304c..398d955 100644
--- a/MagickCore/image.c
+++ b/MagickCore/image.c
@@ -2672,7 +2672,7 @@
*/
GetPixelInfo(image,&background);
SetPixelInfoPacket(image,&(image->background_color),&background);
- (void) LevelColorsImage(image,&background,&background,MagickTrue);
+ (void) LevelImageColors(image,&background,&background,MagickTrue);
}
break;
}
diff --git a/MagickCore/image.h b/MagickCore/image.h
index 22e19c0..558d2c5 100644
--- a/MagickCore/image.h
+++ b/MagickCore/image.h
@@ -286,8 +286,11 @@
MagickBooleanType
sync;
+ size_t
+ map;
+
PixelComponentMap
- *component_map;
+ **component_map;
void
*cache;
diff --git a/MagickCore/magick-config.h b/MagickCore/magick-config.h
index 9002a55..53e983a 100644
--- a/MagickCore/magick-config.h
+++ b/MagickCore/magick-config.h
@@ -421,15 +421,15 @@
#endif
/* Define if you have the <lcms2.h> header file. */
-/* #undef HAVE_LCMS2_H */
+#ifndef MAGICKCORE_HAVE_LCMS2_H
+#define MAGICKCORE_HAVE_LCMS2_H 1
+#endif
/* Define if you have the <lcms2/lcms2.h> header file. */
/* #undef HAVE_LCMS2_LCMS2_H */
/* Define if you have the <lcms.h> header file. */
-#ifndef MAGICKCORE_HAVE_LCMS_H
-#define MAGICKCORE_HAVE_LCMS_H 1
-#endif
+/* #undef HAVE_LCMS_H */
/* Define if you have the <lcms/lcms.h> header file. */
/* #undef HAVE_LCMS_LCMS_H */
@@ -1152,9 +1152,7 @@
#endif
/* Define if you have JBIG library */
-#ifndef MAGICKCORE_JBIG_DELEGATE
-#define MAGICKCORE_JBIG_DELEGATE 1
-#endif
+/* #undef JBIG_DELEGATE */
/* Define if you have JPEG version 2 "Jasper" library */
#ifndef MAGICKCORE_JP2_DELEGATE
@@ -1183,9 +1181,7 @@
#endif
/* Define if you have LQR library */
-#ifndef MAGICKCORE_LQR_DELEGATE
-#define MAGICKCORE_LQR_DELEGATE 1
-#endif
+/* #undef LQR_DELEGATE */
/* Define if using libltdl to support dynamically loadable modules */
#ifndef MAGICKCORE_LTDL_DELEGATE
@@ -1197,7 +1193,7 @@
/* Define to the system default library search path. */
#ifndef MAGICKCORE_LT_DLSEARCH_PATH
-#define MAGICKCORE_LT_DLSEARCH_PATH "/lib64:/usr/lib64:/lib:/usr/lib:/usr/lib64/R/lib:/usr/lib64/atlas:/opt/modules/pkg/intel/f77/10.0.025/lib:/usr/local/lib:/usr/lib64/mysql:/usr/lib64/qt-3.3/lib:/usr/lib64/xulrunner-2"
+#define MAGICKCORE_LT_DLSEARCH_PATH "/lib64:/usr/lib64:/lib:/usr/lib:/usr/lib64/R/lib:/usr/lib64/alliance/lib:/usr/lib64/atlas:/opt/modules/pkg/intel/f77/10.0.025/lib:/usr/lib64/kicad:/usr/lib64/llvm:/usr/local/lib:/usr/lib64/mpich2/lib/:/usr/lib64/mysql:/usr/lib64/octave/3.4.0:/usr/lib64/openmotif:/usr/lib64/qt-3.3/lib:/usr/lib64/tcl8.5/tclx8.4:/usr/lib/wine/:/usr/lib64/wine/:/usr/lib64/xulrunner-2"
#endif
/* The archive extension */
@@ -1444,9 +1440,7 @@
/* Define if you have WEBP library */
-#ifndef MAGICKCORE_WEBP_DELEGATE
-#define MAGICKCORE_WEBP_DELEGATE 1
-#endif
+/* #undef WEBP_DELEGATE */
/* Define to use the Windows GDI32 library */
/* #undef WINGDI32_DELEGATE */
diff --git a/MagickCore/magick-type.h b/MagickCore/magick-type.h
index 4158da6..2866263 100644
--- a/MagickCore/magick-type.h
+++ b/MagickCore/magick-type.h
@@ -131,8 +131,6 @@
typedef MagickSizeType QuantumAny;
#endif
-#define MaxPixelComponents 4096
-
#if defined(macintosh)
#define ExceptionInfo MagickExceptionInfo
#endif
diff --git a/MagickCore/methods.h b/MagickCore/methods.h
index fb8101f..62d088c 100644
--- a/MagickCore/methods.h
+++ b/MagickCore/methods.h
@@ -87,7 +87,7 @@
#define AdaptiveSharpenImage PrependMagickMethod(AdaptiveSharpenImage)
#define AdaptiveThresholdImage PrependMagickMethod(AdaptiveThresholdImage)
#define AddChildToXMLTree PrependMagickMethod(AddChildToXMLTree)
-#define AddNoiseImageChannel PrependMagickMethod(AddNoiseImageChannel)
+#define AddNoiseImage PrependMagickMethod(AddNoiseImage)
#define AddNoiseImage PrependMagickMethod(AddNoiseImage)
#define AddPathToXMLTree PrependMagickMethod(AddPathToXMLTree)
#define AddValueToSplayTree PrependMagickMethod(AddValueToSplayTree)
@@ -350,7 +350,7 @@
#define FuzzyOpacityCompare PrependMagickMethod(FuzzyOpacityCompare)
#define FxEvaluateChannelExpression PrependMagickMethod(FxEvaluateChannelExpression)
#define FxEvaluateExpression PrependMagickMethod(FxEvaluateExpression)
-#define FxImageChannel PrependMagickMethod(FxImageChannel)
+#define FxImage PrependMagickMethod(FxImage)
#define FxImage PrependMagickMethod(FxImage)
#define FxPreprocessExpression PrependMagickMethod(FxPreprocessExpression)
#define GammaImage PrependMagickMethod(GammaImage)
@@ -682,8 +682,8 @@
#define KernelPrint PrependMagickMethod(KernelPrint)
#define KernelRotate PrependMagickMethod(KernelRotate)
#define LeastSquaresAddTerms PrependMagickMethod(LeastSquaresAddTerms)
-#define LevelColorsImageChannel PrependMagickMethod(LevelColorsImageChannel)
-#define LevelColorsImage PrependMagickMethod(LevelColorsImage)
+#define LevelImageColors PrependMagickMethod(LevelImageColors)
+#define LevelImageColors PrependMagickMethod(LevelImageColors)
#define LevelImage PrependMagickMethod(LevelImage)
#define LevelImageColors PrependMagickMethod(LevelImageColors)
#define LevelImage PrependMagickMethod(LevelImage)
diff --git a/MagickCore/pixel-accessor.h b/MagickCore/pixel-accessor.h
index b685ac7..eb81c20 100644
--- a/MagickCore/pixel-accessor.h
+++ b/MagickCore/pixel-accessor.h
@@ -29,42 +29,42 @@
static inline Quantum GetPixelAlpha(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[AlphaPixelComponent].component]);
+ return(pixel[image->component_map[image->map][AlphaPixelComponent].component]);
}
static inline PixelTrait GetPixelAlphaTraits(const Image *image)
{
- return(image->component_map[AlphaPixelComponent].traits);
+ return(image->component_map[image->map][AlphaPixelComponent].traits);
}
static inline Quantum GetPixelBlack(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[BlackPixelComponent].component]);
+ return(pixel[image->component_map[image->map][BlackPixelComponent].component]);
}
static inline PixelTrait GetPixelBlackTraits(const Image *image)
{
- return(image->component_map[BlackPixelComponent].traits);
+ return(image->component_map[image->map][BlackPixelComponent].traits);
}
static inline Quantum GetPixelBlue(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[BluePixelComponent].component]);
+ return(pixel[image->component_map[image->map][BluePixelComponent].component]);
}
static inline PixelTrait GetPixelBlueTraits(const Image *image)
{
- return(image->component_map[BluePixelComponent].traits);
+ return(image->component_map[image->map][BluePixelComponent].traits);
}
static inline Quantum GetPixelCb(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[CbPixelComponent].component]);
+ return(pixel[image->component_map[image->map][CbPixelComponent].component]);
}
static inline PixelTrait GetPixelCbTraits(const Image *image)
{
- return(image->component_map[CbPixelComponent].traits);
+ return(image->component_map[image->map][CbPixelComponent].traits);
}
static inline size_t GetPixelChannels(const Image *image)
@@ -75,57 +75,57 @@
static inline Quantum GetPixelComponent(const Image *image,
const PixelComponent component)
{
- return(image->component_map[component].component);
+ return(image->component_map[image->map][component].component);
}
static inline Quantum GetPixelCr(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[CrPixelComponent].component]);
+ return(pixel[image->component_map[image->map][CrPixelComponent].component]);
}
static inline PixelTrait GetPixelCrTraits(const Image *image)
{
- return(image->component_map[CrPixelComponent].traits);
+ return(image->component_map[image->map][CrPixelComponent].traits);
}
static inline Quantum GetPixelCyan(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[CyanPixelComponent].component]);
+ return(pixel[image->component_map[image->map][CyanPixelComponent].component]);
}
static inline PixelTrait GetPixelCyanTraits(const Image *image)
{
- return(image->component_map[CyanPixelComponent].traits);
+ return(image->component_map[image->map][CyanPixelComponent].traits);
}
static inline Quantum GetPixelGray(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[GrayPixelComponent].component]);
+ return(pixel[image->component_map[image->map][GrayPixelComponent].component]);
}
static inline PixelTrait GetPixelGrayTraits(const Image *image)
{
- return(image->component_map[GrayPixelComponent].traits);
+ return(image->component_map[image->map][GrayPixelComponent].traits);
}
static inline Quantum GetPixelGreen(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[GreenPixelComponent].component]);
+ return(pixel[image->component_map[image->map][GreenPixelComponent].component]);
}
static inline PixelTrait GetPixelGreenTraits(const Image *image)
{
- return(image->component_map[GreenPixelComponent].traits);
+ return(image->component_map[image->map][GreenPixelComponent].traits);
}
static inline Quantum GetPixelIndex(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[IndexPixelComponent].component]);
+ return(pixel[image->component_map[image->map][IndexPixelComponent].component]);
}
static inline PixelTrait GetPixelIndexTraits(const Image *image)
{
- return(image->component_map[IndexPixelComponent].traits);
+ return(image->component_map[image->map][IndexPixelComponent].traits);
}
static inline Quantum GetPixelInfoIntensity(const PixelInfo *pixel_info)
@@ -155,12 +155,12 @@
static inline Quantum GetPixelMagenta(const Image *image,
const Quantum *pixel)
{
- return(pixel[image->component_map[MagentaPixelComponent].component]);
+ return(pixel[image->component_map[image->map][MagentaPixelComponent].component]);
}
static inline PixelTrait GetPixelMagentaTraits(const Image *image)
{
- return(image->component_map[MagentaPixelComponent].traits);
+ return(image->component_map[image->map][MagentaPixelComponent].traits);
}
static inline size_t GetPixelMetacontentExtent(const Image *image)
@@ -170,12 +170,12 @@
static inline Quantum GetPixelRed(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[RedPixelComponent].component]);
+ return(pixel[image->component_map[image->map][RedPixelComponent].component]);
}
static inline PixelTrait GetPixelRedTraits(const Image *image)
{
- return(image->component_map[RedPixelComponent].traits);
+ return(image->component_map[image->map][RedPixelComponent].traits);
}
static inline void GetPixelPacket(const Image *image,const Quantum *pixel,
@@ -211,28 +211,28 @@
static inline PixelTrait GetPixelComponentTraits(const Image *image,
const PixelComponent component)
{
- return(image->component_map[component].traits);
+ return(image->component_map[image->map][component].traits);
}
static inline Quantum GetPixelY(const Image *image,const Quantum *pixel)
{
- return(pixel[image->component_map[YPixelComponent].component]);
+ return(pixel[image->component_map[image->map][YPixelComponent].component]);
}
static inline PixelTrait GetPixelYTraits(const Image *image)
{
- return(image->component_map[YPixelComponent].traits);
+ return(image->component_map[image->map][YPixelComponent].traits);
}
static inline Quantum GetPixelYellow(const Image *image,
const Quantum *pixel)
{
- return(pixel[image->component_map[YellowPixelComponent].component]);
+ return(pixel[image->component_map[image->map][YellowPixelComponent].component]);
}
static inline PixelTrait GetPixelYellowTraits(const Image *image)
{
- return(image->component_map[YellowPixelComponent].traits);
+ return(image->component_map[image->map][YellowPixelComponent].traits);
}
static inline MagickBooleanType IsPixelEquivalent(const Image *image,
@@ -412,45 +412,45 @@
static inline void SetPixelAlpha(const Image *image,const Quantum alpha,
Quantum *pixel)
{
- pixel[image->component_map[AlphaPixelComponent].component]=alpha;
+ pixel[image->component_map[image->map][AlphaPixelComponent].component]=alpha;
}
static inline void SetPixelAlphaTraits(Image *image,const PixelTrait traits)
{
- image->component_map[AlphaPixelComponent].traits=traits;
+ image->component_map[image->map][AlphaPixelComponent].traits=traits;
}
static inline void SetPixelBlack(const Image *image,const Quantum black,
Quantum *pixel)
{
- pixel[image->component_map[BlackPixelComponent].component]=black;
+ pixel[image->component_map[image->map][BlackPixelComponent].component]=black;
}
static inline void SetPixelBlackTraits(Image *image,const PixelTrait traits)
{
- image->component_map[BlackPixelComponent].traits=traits;
+ image->component_map[image->map][BlackPixelComponent].traits=traits;
}
static inline void SetPixelBlue(const Image *image,const Quantum blue,
Quantum *pixel)
{
- pixel[image->component_map[BluePixelComponent].component]=blue;
+ pixel[image->component_map[image->map][BluePixelComponent].component]=blue;
}
static inline void SetPixelBlueTraits(Image *image,const PixelTrait traits)
{
- image->component_map[BluePixelComponent].traits=traits;
+ image->component_map[image->map][BluePixelComponent].traits=traits;
}
static inline void SetPixelCb(const Image *image,const Quantum cb,
Quantum *pixel)
{
- pixel[image->component_map[CbPixelComponent].component]=cb;
+ pixel[image->component_map[image->map][CbPixelComponent].component]=cb;
}
static inline void SetPixelCbTraits(Image *image,const PixelTrait traits)
{
- image->component_map[CbPixelComponent].traits=traits;
+ image->component_map[image->map][CbPixelComponent].traits=traits;
}
static inline void SetPixelChannels(Image *image,const size_t channels)
@@ -461,63 +461,63 @@
static inline void SetPixelComponent(const Image *image,
const PixelComponent component,const PixelComponent components)
{
- image->component_map[component].component=components;
+ image->component_map[image->map][component].component=components;
}
static inline void SetPixelComponentTraits(Image *image,
const PixelComponent component,const PixelTrait traits)
{
- image->component_map[component].traits=traits;
+ image->component_map[image->map][component].traits=traits;
}
static inline void SetPixelCr(const Image *image,const Quantum cr,
Quantum *pixel)
{
- pixel[image->component_map[CrPixelComponent].component]=cr;
+ pixel[image->component_map[image->map][CrPixelComponent].component]=cr;
}
static inline void SetPixelCrTraits(Image *image,const PixelTrait traits)
{
- image->component_map[CrPixelComponent].traits=traits;
+ image->component_map[image->map][CrPixelComponent].traits=traits;
}
static inline void SetPixelCyan(const Image *image,const Quantum cyan,
Quantum *pixel)
{
- pixel[image->component_map[CyanPixelComponent].component]=cyan;
+ pixel[image->component_map[image->map][CyanPixelComponent].component]=cyan;
}
static inline void SetPixelGray(const Image *image,const Quantum gray,
Quantum *pixel)
{
- pixel[image->component_map[GrayPixelComponent].component]=gray;
+ pixel[image->component_map[image->map][GrayPixelComponent].component]=gray;
}
static inline void SetPixelGrayTraits(Image *image,const PixelTrait traits)
{
- image->component_map[GrayPixelComponent].traits=traits;
+ image->component_map[image->map][GrayPixelComponent].traits=traits;
}
static inline void SetPixelGreen(const Image *image,const Quantum green,
Quantum *pixel)
{
- pixel[image->component_map[GreenPixelComponent].component]=green;
+ pixel[image->component_map[image->map][GreenPixelComponent].component]=green;
}
static inline void SetPixelGreenTraits(Image *image,const PixelTrait traits)
{
- image->component_map[GreenPixelComponent].traits=traits;
+ image->component_map[image->map][GreenPixelComponent].traits=traits;
}
static inline void SetPixelIndex(const Image *image,const Quantum index,
Quantum *pixel)
{
- pixel[image->component_map[IndexPixelComponent].component]=index;
+ pixel[image->component_map[image->map][IndexPixelComponent].component]=index;
}
static inline void SetPixelIndexTraits(Image *image,const PixelTrait traits)
{
- image->component_map[IndexPixelComponent].traits=traits;
+ image->component_map[image->map][IndexPixelComponent].traits=traits;
}
static inline void SetPixelInfo(const Image *image,const Quantum *pixel,
@@ -562,12 +562,12 @@
static inline void SetPixelMagenta(const Image *image,const Quantum magenta,
Quantum *pixel)
{
- pixel[image->component_map[MagentaPixelComponent].component]=magenta;
+ pixel[image->component_map[image->map][MagentaPixelComponent].component]=magenta;
}
static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits)
{
- image->component_map[MagentaPixelComponent].traits=traits;
+ image->component_map[image->map][MagentaPixelComponent].traits=traits;
}
static inline void SetPixelMetacontentExtent(Image *image,const size_t extent)
@@ -578,12 +578,12 @@
static inline void SetPixelRed(const Image *image,const Quantum red,
Quantum *pixel)
{
- pixel[image->component_map[RedPixelComponent].component]=red;
+ pixel[image->component_map[image->map][RedPixelComponent].component]=red;
}
static inline void SetPixelRedTraits(Image *image,const PixelTrait traits)
{
- image->component_map[RedPixelComponent].traits=traits;
+ image->component_map[image->map][RedPixelComponent].traits=traits;
}
static inline void SetPixelPacket(const Image *image,const PixelPacket *packet,
@@ -609,23 +609,23 @@
static inline void SetPixelYellow(const Image *image,const Quantum yellow,
Quantum *pixel)
{
- pixel[image->component_map[YellowPixelComponent].component]=yellow;
+ pixel[image->component_map[image->map][YellowPixelComponent].component]=yellow;
}
static inline void SetPixelYellowTraits(Image *image,const PixelTrait traits)
{
- image->component_map[YellowPixelComponent].traits=traits;
+ image->component_map[image->map][YellowPixelComponent].traits=traits;
}
static inline void SetPixelY(const Image *image,const Quantum y,
Quantum *pixel)
{
- pixel[image->component_map[YPixelComponent].component]=y;
+ pixel[image->component_map[image->map][YPixelComponent].component]=y;
}
static inline void SetPixelYTraits(Image *image,const PixelTrait traits)
{
- image->component_map[YPixelComponent].traits=traits;
+ image->component_map[image->map][YPixelComponent].traits=traits;
}
static inline Quantum GetPixelIntensity(const Image *image,
diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c
index 325615c..f0e5a06 100644
--- a/MagickCore/pixel.c
+++ b/MagickCore/pixel.c
@@ -83,25 +83,35 @@
%
% The format of the AcquirePixelComponentMap() method is:
%
-% PixelComponentMap *AcquirePixelComponentMap(void)
+% PixelComponentMap **AcquirePixelComponentMap(void)
%
*/
-MagickExport PixelComponentMap *AcquirePixelComponentMap(void)
+MagickExport PixelComponentMap **AcquirePixelComponentMap(void)
{
PixelComponentMap
- *component_map;
+ **component_map;
register ssize_t
i;
- component_map=(PixelComponentMap *) AcquireAlignedMemory(MaxPixelComponents,
- sizeof(*component_map));
- if (component_map == (PixelComponentMap *) NULL)
+ component_map=(PixelComponentMap **) AcquireAlignedMemory(
+ MaxPixelComponentMaps,sizeof(**component_map));
+ if (component_map == (PixelComponentMap **) NULL)
ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
- (void) ResetMagickMemory(component_map,0,MaxPixelComponents*
- sizeof(*component_map));
- for (i=0; i < MaxPixelComponents; i++)
- component_map[i].component=(PixelComponent) i;
+ for (i=0; i < MaxPixelComponentMaps; i++)
+ {
+ register ssize_t
+ j;
+
+ component_map[i]=(PixelComponentMap *) AcquireQuantumMemory(
+ MaxPixelComponents,sizeof(*component_map[i]));
+ if (component_map[i] == (PixelComponentMap *) NULL)
+ ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+ (void) ResetMagickMemory(component_map[i],0,MaxPixelComponents*
+ sizeof(*component_map[i]));
+ for (j=0; j < MaxPixelComponents; j++)
+ component_map[i][j].component=(PixelComponent) j;
+ }
return(component_map);
}
@@ -120,26 +130,30 @@
%
% The format of the ClonePixelComponentMap() method is:
%
-% PixelComponentMap *ClonePixelComponentMap(
-% const PixelComponentMap *component_map)
+% PixelComponentMap **ClonePixelComponentMap(
+% PixelComponentMap **component_map)
%
% A description of each parameter follows:
%
% o component_map: the pixel component map.
%
*/
-MagickExport PixelComponentMap *ClonePixelComponentMap(
- const PixelComponentMap *component_map)
+MagickExport PixelComponentMap **ClonePixelComponentMap(
+ PixelComponentMap **component_map)
{
PixelComponentMap
- *clone_map;
+ **clone_map;
- assert(component_map != (const PixelComponentMap *) NULL);
+ register ssize_t
+ i;
+
+ assert(component_map != (PixelComponentMap **) NULL);
clone_map=AcquirePixelComponentMap();
- if (clone_map == (PixelComponentMap *) NULL)
- return((PixelComponentMap *) NULL);
- (void) CopyMagickMemory(clone_map,component_map,MaxPixelComponents*
- sizeof(*component_map));
+ if (clone_map == (PixelComponentMap **) NULL)
+ return((PixelComponentMap **) NULL);
+ for (i=0; i < MaxPixelComponentMaps; i++)
+ (void) CopyMagickMemory(clone_map[i],component_map[i],MaxPixelComponents*
+ sizeof(*component_map[i]));
return(clone_map);
}
@@ -194,19 +208,25 @@
%
% The format of the DestroyPixelComponentMap() method is:
%
-% PixelComponentMap *DestroyPixelComponentMap(
-% PixelComponentMap *component_map)
+% PixelComponentMap **DestroyPixelComponentMap(
+% PixelComponentMap **component_map)
%
% A description of each parameter follows:
%
% o component_map: the pixel component map.
%
*/
-MagickExport PixelComponentMap *DestroyPixelComponentMap(
- PixelComponentMap *component_map)
+MagickExport PixelComponentMap **DestroyPixelComponentMap(
+ PixelComponentMap **component_map)
{
- assert(component_map != (PixelComponentMap *) NULL);
- return((PixelComponentMap *) RelinquishMagickMemory(component_map));
+ register ssize_t
+ i;
+
+ assert(component_map != (PixelComponentMap **) NULL);
+ for (i=0; i < MaxPixelComponentMaps; i++)
+ component_map[i]=(PixelComponentMap *) RelinquishMagickMemory(
+ component_map[i]);
+ return((PixelComponentMap **) RelinquishMagickMemory(component_map));
}
/*
@@ -4428,6 +4448,69 @@
% %
% %
% %
+% P o p P i x e l C o m p o n e n t M a p %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PopPixelComponentMap() pops the pixel component map.
+%
+% The format of the PopPixelComponentMap method is:
+%
+% void PopPixelComponentMap(Image *image)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+*/
+MagickExport void PopPixelComponentMap(Image *image)
+{
+ if (image->map == 0)
+ ThrowFatalException(ResourceLimitFatalError,"PixelComponentMapStack");
+ image->map--;
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P u s h P i x e l C o m p o n e n t M a p %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PushPixelComponentMap() pushes the pixel component map from the specified
+% channel mask.
+%
+% The format of the PushPixelComponentMap method is:
+%
+% void PushPixelComponentMap(Image *image,const ChannelType channel_mask)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o channel_mask: the channel mask.
+%
+*/
+MagickExport void PushPixelComponentMap(Image *image,
+ const ChannelType channel_mask)
+{
+ if (image->map >= MaxPixelComponentMaps)
+ ThrowFatalException(ResourceLimitFatalError,"PixelComponentMapStack");
+ image->map++;
+ SetPixelComponentMap(image,channel_mask);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
% S e t P i x e l C o m p o n e n t M a p %
% %
% %
@@ -4439,32 +4522,33 @@
%
% The format of the SetPixelComponentMap method is:
%
-% void SetPixelComponentMap(Image *image,const ChannelType channel)
+% void SetPixelComponentMap(Image *image,const ChannelType channel_mask)
%
% A description of each parameter follows:
%
% o image: the image.
%
-% o channel: the channel mask.
+% o channel_mask: the channel mask.
%
*/
-MagickExport void SetPixelComponentMap(Image *image,const ChannelType channel)
+MagickExport void SetPixelComponentMap(Image *image,
+ const ChannelType channel_mask)
{
register ssize_t
i;
for (i=0; i < MaxPixelComponents; i++)
- image->component_map[i].traits=UndefinedPixelTrait;
- image->sync=(channel & SyncChannels) != 0 ? MagickTrue : MagickFalse;
- if ((channel & RedChannel) != 0)
+ SetPixelComponentTraits(image,(PixelComponent) i,UndefinedPixelTrait);
+ image->sync=(channel_mask & SyncChannels) != 0 ? MagickTrue : MagickFalse;
+ if ((channel_mask & RedChannel) != 0)
SetPixelRedTraits(image,ActivePixelTrait);
- if ((channel & GreenChannel) != 0)
+ if ((channel_mask & GreenChannel) != 0)
SetPixelGreenTraits(image,ActivePixelTrait);
- if ((channel & BlueChannel) != 0)
+ if ((channel_mask & BlueChannel) != 0)
SetPixelBlueTraits(image,ActivePixelTrait);
- if ((channel & BlackChannel) != 0)
+ if ((channel_mask & BlackChannel) != 0)
SetPixelBlackTraits(image,ActivePixelTrait);
- if ((channel & AlphaChannel) != 0)
+ if ((channel_mask & AlphaChannel) != 0)
SetPixelAlphaTraits(image,ActivePixelTrait);
}
diff --git a/MagickCore/pixel.h b/MagickCore/pixel.h
index b614ea9..bb10bf1 100644
--- a/MagickCore/pixel.h
+++ b/MagickCore/pixel.h
@@ -25,6 +25,9 @@
#include <MagickCore/colorspace.h>
#include <MagickCore/constitute.h>
+#define MaxPixelComponents 16
+#define MaxPixelComponentMaps 16
+
typedef enum
{
UndefinedInterpolatePixel,
@@ -150,9 +153,9 @@
const PixelPacket *);
extern MagickExport PixelComponentMap
- *AcquirePixelComponentMap(void),
- *ClonePixelComponentMap(const PixelComponentMap *),
- *DestroyPixelComponentMap(PixelComponentMap *);
+ **AcquirePixelComponentMap(void),
+ **ClonePixelComponentMap(PixelComponentMap **),
+ **DestroyPixelComponentMap(PixelComponentMap **);
extern MagickExport PixelInfo
*ClonePixelInfo(const PixelInfo *);
@@ -160,6 +163,8 @@
extern MagickExport void
StandardPixelComponentMap(Image *),
GetPixelInfo(const Image *,PixelInfo *),
+ PopPixelComponentMap(Image *),
+ PushPixelComponentMap(Image *,const ChannelType),
SetPixelComponentMap(Image *,const ChannelType);
#if defined(__cplusplus) || defined(c_plusplus)
diff --git a/MagickCore/version.h b/MagickCore/version.h
index fdb711e..50b9a55 100644
--- a/MagickCore/version.h
+++ b/MagickCore/version.h
@@ -34,7 +34,7 @@
#define MagickLibAddendum "-0"
#define MagickLibInterface 5
#define MagickLibMinInterface 5
-#define MagickReleaseDate "2011-07-06"
+#define MagickReleaseDate "2011-07-07"
#define MagickChangeDate "20110701"
#define MagickAuthoritativeURL "http://www.imagemagick.org"
#if defined(MAGICKCORE_OPENMP_SUPPORT)
diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c
index bd4197b..48220b4 100644
--- a/MagickWand/magick-image.c
+++ b/MagickWand/magick-image.c
@@ -491,33 +491,18 @@
%
% MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
% const NoiseType noise_type)
-% MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand,
-% const ChannelType channel,const NoiseType noise_type)
%
% A description of each parameter follows:
%
% o wand: the magick wand.
%
-% o channel: the image channel(s).
-%
% o noise_type: The type of noise: Uniform, Gaussian, Multiplicative,
% Impulse, Laplacian, or Poisson.
%
*/
-
WandExport MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
const NoiseType noise_type)
{
- MagickBooleanType
- status;
-
- status=MagickAddNoiseImageChannel(wand,DefaultChannels,noise_type);
- return(status);
-}
-
-WandExport MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand,
- const ChannelType channel,const NoiseType noise_type)
-{
Image
*noise_image;
@@ -527,8 +512,7 @@
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- noise_image=AddNoiseImageChannel(wand->images,channel,noise_type,
- wand->exception);
+ noise_image=AddNoiseImage(wand->images,noise_type,wand->exception);
if (noise_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,noise_image);
@@ -3501,31 +3485,16 @@
% The format of the MagickFxImage method is:
%
% MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
-% MagickWand *MagickFxImageChannel(MagickWand *wand,
-% const ChannelType channel,const char *expression)
%
% A description of each parameter follows:
%
% o wand: the magick wand.
%
-% o channel: the image channel(s).
-%
% o expression: the expression.
%
*/
-
WandExport MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
{
- MagickWand
- *fx_wand;
-
- fx_wand=MagickFxImageChannel(wand,DefaultChannels,expression);
- return(fx_wand);
-}
-
-WandExport MagickWand *MagickFxImageChannel(MagickWand *wand,
- const ChannelType channel,const char *expression)
-{
Image
*fx_image;
@@ -3535,7 +3504,7 @@
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
return((MagickWand *) NULL);
- fx_image=FxImageChannel(wand->images,channel,expression,wand->exception);
+ fx_image=FxImage(wand->images,expression,wand->exception);
if (fx_image == (Image *) NULL)
return((MagickWand *) NULL);
return(CloneMagickWandFromImages(wand,fx_image));
@@ -4004,7 +3973,7 @@
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageChannelFeatures() returns features for each channel in the
+% MagickGetImageFeatures() returns features for each channel in the
% image in each of four directions (horizontal, vertical, left and right
% diagonals) for the specified distance. The features include the angular
% second moment, contrast, correlation, sum of squares: variance, inverse
@@ -4014,14 +3983,14 @@
% correlation coefficient. You can access the red channel contrast, for
% example, like this:
%
-% channel_features=MagickGetImageChannelFeatures(wand,1);
+% channel_features=MagickGetImageFeatures(wand,1);
% contrast=channel_features[RedChannel].contrast[0];
%
% Use MagickRelinquishMemory() to free the statistics buffer.
%
-% The format of the MagickGetImageChannelFeatures method is:
+% The format of the MagickGetImageFeatures method is:
%
-% ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand,
+% ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
% const size_t distance)
%
% A description of each parameter follows:
@@ -4031,7 +4000,7 @@
% o distance: the distance.
%
*/
-WandExport ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand,
+WandExport ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
const size_t distance)
{
assert(wand != (MagickWand *) NULL);
@@ -4044,7 +4013,7 @@
"ContainsNoImages","`%s'",wand->name);
return((ChannelFeatures *) NULL);
}
- return(GetImageChannelFeatures(wand->images,distance,wand->exception));
+ return(GetImageFeatures(wand->images,distance,wand->exception));
}
/*
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 96b5e96..002b9dd 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -24,7 +24,7 @@
#endif
extern WandExport ChannelFeatures
- *MagickGetImageChannelFeatures(MagickWand *,const size_t);
+ *MagickGetImageFeatures(MagickWand *,const size_t);
extern WandExport ChannelStatistics
*MagickGetImageChannelStatistics(MagickWand *);
@@ -82,7 +82,6 @@
const ssize_t),
MagickAddImage(MagickWand *,const MagickWand *),
MagickAddNoiseImage(MagickWand *,const NoiseType),
- MagickAddNoiseImageChannel(MagickWand *,const ChannelType,const NoiseType),
MagickAffineTransformImage(MagickWand *,const DrawingWand *),
MagickAnnotateImage(MagickWand *,const DrawingWand *,const double,
const double,const double,const char *),
@@ -360,7 +359,6 @@
*MagickDeconstructImages(MagickWand *),
*MagickEvaluateImages(MagickWand *,const MagickEvaluateOperator),
*MagickFxImage(MagickWand *,const char *),
- *MagickFxImageChannel(MagickWand *,const ChannelType,const char *),
*MagickGetImage(MagickWand *),
*MagickGetImageClipMask(MagickWand *),
*MagickGetImageRegion(MagickWand *,const size_t,const size_t,const ssize_t,
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index 08f83ad..cd98ab4 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -1922,8 +1922,8 @@
else
(void) QueryMagickColor("#ffffff",&white_point,exception);
}
- (void) LevelColorsImageChannel(*image,channel,&black_point,
- &white_point,*option == '+' ? MagickTrue : MagickFalse);
+ (void) LevelImageColors(*image,&black_point,&white_point,
+ *option == '+' ? MagickTrue : MagickFalse);
break;
}
if (LocaleCompare("linear-stretch",option+1) == 0)
@@ -2169,8 +2169,7 @@
noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
MagickFalse,argv[i+1]);
- mogrify_image=AddNoiseImageChannel(*image,channel,noise,
- exception);
+ mogrify_image=AddNoiseImage(*image,noise,exception);
}
break;
}
@@ -7619,7 +7618,7 @@
*fx_image;
(void) SyncImagesSettings(mogrify_info,*images);
- fx_image=FxImageChannel(*images,channel,argv[i+1],exception);
+ fx_image=FxImage(*images,argv[i+1],exception);
if (fx_image == (Image *) NULL)
{
status=MagickFalse;
diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs
index 8c7aafa..e72560f 100644
--- a/PerlMagick/Magick.xs
+++ b/PerlMagick/Magick.xs
@@ -3852,7 +3852,7 @@
count=0;
for ( ; image; image=image->next)
{
- channel_features=GetImageChannelFeatures(image,distance,
+ channel_features=GetImageFeatures(image,distance,
&image->exception);
if (channel_features == (ChannelFeatures *) NULL)
continue;
@@ -4150,7 +4150,9 @@
}
}
}
- image=FxImageChannel(image,channel,expression,exception);
+ PushPixelComponentMap(image,channel);
+ image=FxImage(image,expression,exception);
+ PopPixelComponentMap(image);
if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
goto PerlException;
for ( ; image; image=image->next)
@@ -7175,7 +7177,7 @@
AutoLevel = 255
AutoLevelImage = 256
LevelColors = 257
- LevelColorsImage = 258
+ LevelImageColors = 258
Clamp = 259
ClampImage = 260
Filter = 261
@@ -7491,8 +7493,10 @@
argument_list[0].integer_reference=UniformNoise;
if (attribute_flag[1] != 0)
channel=(ChannelType) argument_list[1].integer_reference;
- image=AddNoiseImageChannel(image,channel,(NoiseType)
+ PushPixelComponentMap(image,channel);
+ image=AddNoiseImage(image,(NoiseType)
argument_list[0].integer_reference,exception);
+ PopPixelComponentMap(image);
break;
}
case 4: /* Colorize */
@@ -8624,11 +8628,10 @@
case 39: /* Equalize */
{
if (attribute_flag[0] != 0)
- {
- channel=(ChannelType) argument_list[0].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[0].integer_reference;
+ PushPixelComponentMap(image,channel);
EqualizeImage(image);
+ PopPixelComponentMap(image);
break;
}
case 40: /* Gamma */
@@ -8712,9 +8715,10 @@
invert=MagickFalse;
if (attribute_flag[6] != 0)
invert=(MagickBooleanType) argument_list[6].integer_reference;
- SetPixelComponentMap(image,AlphaChannel);
+ PushPixelComponentMap(image,AlphaChannel);
(void) FloodfillPaintImage(image,AlphaChannel,draw_info,&target,
geometry.x,geometry.y,invert);
+ PopPixelComponentMap(image);
StandardPixelComponentMap(image);
draw_info=DestroyDrawInfo(draw_info);
break;
@@ -8764,22 +8768,20 @@
if (attribute_flag[0] == 0)
argument_list[0].integer_reference=0;
if (attribute_flag[1] != 0)
- {
- channel=(ChannelType) argument_list[1].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[1].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) NegateImage(image,argument_list[0].integer_reference != 0 ?
MagickTrue : MagickFalse);
+ PopPixelComponentMap(image);
break;
}
case 45: /* Normalize */
{
if (attribute_flag[0] != 0)
- {
- channel=(ChannelType) argument_list[0].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[0].integer_reference;
+ PushPixelComponentMap(image,channel);
NormalizeImage(image);
+ PopPixelComponentMap(image);
break;
}
case 46: /* NumberColors */
@@ -9314,16 +9316,15 @@
if (attribute_flag[3] != 0)
gamma=argument_list[3].real_reference;
if (attribute_flag[4] != 0)
- {
- channel=(ChannelType) argument_list[4].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[4].integer_reference;
if (attribute_flag[5] != 0)
{
argument_list[0].real_reference=argument_list[5].real_reference;
attribute_flag[0]=attribute_flag[5];
}
+ PushPixelComponentMap(image,channel);
(void) LevelImage(image,black_point,white_point,gamma);
+ PopPixelComponentMap(image);
break;
}
case 74: /* Clip */
@@ -9715,16 +9716,15 @@
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
- {
- channel=(ChannelType) argument_list[3].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[3].integer_reference;
sharpen=MagickTrue;
if (attribute_flag[4] != 0)
sharpen=argument_list[4].integer_reference != 0 ? MagickTrue :
MagickFalse;
+ PushPixelComponentMap(image,channel);
(void) SigmoidalContrastImage(image,sharpen,geometry_info.rho,
geometry_info.sigma);
+ PopPixelComponentMap(image);
break;
}
case 93: /* Extent */
@@ -9818,11 +9818,10 @@
if (attribute_flag[2] != 0)
white_point=argument_list[2].real_reference;
if (attribute_flag[4] != 0)
- {
- channel=(ChannelType) argument_list[4].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[4].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) ContrastStretchImage(image,black_point,white_point);
+ PopPixelComponentMap(image);
break;
}
case 96: /* Sans0 */
@@ -10161,11 +10160,10 @@
goto PerlException;
}
if (attribute_flag[1] != 0)
- {
- channel=(ChannelType) argument_list[1].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[1].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) ClutImage(image,argument_list[0].image_reference);
+ PopPixelComponentMap(image);
break;
}
case 114: /* LiquidRescale */
@@ -10357,11 +10355,10 @@
goto PerlException;
}
if (attribute_flag[1] != 0)
- {
- channel=(ChannelType) argument_list[1].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[1].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) HaldClutImage(image,argument_list[0].image_reference);
+ PopPixelComponentMap(image);
break;
}
case 123: /* BlueShift */
@@ -10397,21 +10394,19 @@
case 127: /* AutoGamma */
{
if (attribute_flag[0] != 0)
- {
- channel=(ChannelType) argument_list[0].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[0].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) AutoGammaImage(image);
+ PopPixelComponentMap(image);
break;
}
case 128: /* AutoLevel */
{
if (attribute_flag[0] != 0)
- {
- channel=(ChannelType) argument_list[0].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[0].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) AutoLevelImage(image);
+ PopPixelComponentMap(image);
break;
}
case 129: /* LevelColors */
@@ -10430,9 +10425,10 @@
&white_point,exception);
if (attribute_flag[3] != 0)
channel=(ChannelType) argument_list[3].integer_reference;
- (void) LevelColorsImageChannel(image,channel,&black_point,
- &white_point,argument_list[0].integer_reference != 0 ? MagickTrue :
- MagickFalse);
+ PushPixelComponentMap(image,channel);
+ (void) LevelImageColors(image,&black_point,&white_point,
+ argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse);
+ PopPixelComponentMap(image);
break;
}
case 130: /* Clamp */
@@ -10482,11 +10478,10 @@
if (attribute_flag[2] != 0)
contrast=argument_list[2].real_reference;
if (attribute_flag[4] != 0)
- {
- channel=(ChannelType) argument_list[4].integer_reference;
- SetPixelComponentMap(image,channel);
- }
+ channel=(ChannelType) argument_list[4].integer_reference;
+ PushPixelComponentMap(image,channel);
(void) BrightnessContrastImage(image,brightness,contrast);
+ PopPixelComponentMap(image);
break;
}
case 133: /* Morphology */
@@ -13228,6 +13223,7 @@
region.height=1;
if (items == 1)
(void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
+ channel=DefaultChannels;
for (i=2; i < items; i+=2)
{
attribute=(char *) SvPV(ST(i-1),na);
@@ -13335,7 +13331,7 @@
}
}
(void) SetImageStorageClass(image,DirectClass);
- SetPixelComponentMap(image,channel);
+ PushPixelComponentMap(image,channel);
q=GetAuthenticPixels(image,region.x,region.y,1,1,exception);
if ((q == (const Quantum *) NULL) || (av == (AV *) NULL) ||
(SvTYPE(av) != SVt_PVAV))
@@ -13389,6 +13385,7 @@
}
(void) SyncAuthenticPixels(image,exception);
}
+ PopPixelComponentMap(image);
PerlException:
InheritPerlException(exception,perl_exception);
diff --git a/coders/msl.c b/coders/msl.c
index 3a8fe62..3d8e1bc 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -736,8 +736,10 @@
}
}
}
- noise_image=AddNoiseImageChannel(msl_info->image[n],channel,noise,
+ PushPixelComponentMap(msl_info->image[n],channel);
+ noise_image=AddNoiseImage(msl_info->image[n],noise,
&msl_info->image[n]->exception);
+ PopPixelComponentMap(msl_info->image[n]);
if (noise_image == (Image *) NULL)
break;
msl_info->image[n]=DestroyImage(msl_info->image[n]);
@@ -4031,8 +4033,9 @@
}
}
}
- SetPixelComponentMap(msl_info->image[n],channel);
+ PushPixelComponentMap(msl_info->image[n],channel);
(void) NegateImage(msl_info->image[n],gray);
+ PopPixelComponentMap(msl_info->image[n]);
break;
}
if (LocaleCompare((const char *) tag,"normalize") == 0)
diff --git a/coders/xtrn.c b/coders/xtrn.c
index e69de29..30f2f93 100644
--- a/coders/xtrn.c
+++ b/coders/xtrn.c
@@ -0,0 +1,637 @@
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% X X TTTTT RRRR N N %
+% X X T R R NN N %
+% X T RRRR N N N %
+% X X T R R N NN %
+% X X T R R N N %
+% %
+% %
+% ImageMagickObject BLOB Interface. %
+% %
+% Software Design %
+% William Radcliffe %
+% May 2001 %
+% %
+% %
+% Copyright 1999-2007 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 %
+% %
+% Unless required by applicable law or agreed to in writing, software %
+% distributed under the License is distributed on an "AS IS" BASIS, %
+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
+% See the License for the specific language governing permissions and %
+% limitations under the License. %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This coder is a kind of backdoor used by the COM object that allows it to %
+% pass blobs back and forth using the coder interface. It simply encodes and %
+% decodes the filename as a comma delimited string and extracts the info it %
+% needs. The five methods of passing images are: %
+% %
+% FILE - same thing as filename so it should be a NOP %
+% IMAGE - passes an image and image info structure %
+% BLOB - passes binary blob containining the image %
+% STREAM - passes pointers to stream hooks in and does the hooking %
+% ARRAY - passes a pointer to a Win32 smart array and streams to it %
+% %
+% Of all of these, the only one getting any real use at the moment is the %
+% ARRAY handler. It is the primary way that images are shuttled back and %
+% forth as blobs via COM since this is what VB and VBSCRIPT use internally %
+% for this purpose. %
+%
+%
+*/
+
+/*
+ Include declarations.
+*/
+#if defined(_VISUALC_)
+#include "magick/studio.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/constitute.h"
+#include "magick/delegate.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/magick.h"
+#include "magick/memory_.h"
+#include "magick/string_.h"
+#define WIN32_LEAN_AND_MEAN
+#define VC_EXTRALEAN
+#include <windows.h>
+#include <ole2.h>
+
+/*
+ Forward declarations.
+*/
+static MagickBooleanType
+ WriteXTRNImage(const ImageInfo *,Image *);
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e a d X T R N I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReadXTRNImage() reads a XTRN image file and returns it. It
+% allocates the memory necessary for the new Image structure and returns a
+% pointer to the new image.
+%
+% The format of the ReadXTRNImage method is:
+%
+% Image *ReadXTRNImage(const ImageInfo *image_info,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image_info: Specifies a pointer to an ImageInfo structure.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+static Image *ReadXTRNImage(const ImageInfo *image_info,
+ ExceptionInfo *exception)
+{
+ Image
+ *image;
+
+ ImageInfo
+ *clone_info;
+
+ void
+ *param1,
+ *param2,
+ *param3;
+
+ param1 = param2 = param3 = (void *) NULL;
+ image = (Image *) NULL;
+ clone_info=CloneImageInfo(image_info);
+ if (clone_info->filename == NULL)
+ {
+ clone_info=DestroyImageInfo(clone_info);
+ ThrowReaderException(FileOpenWarning,"No filename specified");
+ }
+ if (LocaleCompare(image_info->magick,"XTRNFILE") == 0)
+ {
+ image=ReadImage(clone_info,exception);
+ CatchException(exception);
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNIMAGE") == 0)
+ {
+ Image
+ **image_ptr;
+
+#ifdef ALL_IMAGEINFO
+ ImageInfo
+ **image_info_ptr;
+#endif
+
+ (void) sscanf(clone_info->filename,"%lx,%lx",¶m1,¶m2);
+ image_ptr=(Image **) param2;
+ if (*image_ptr != (Image *)NULL)
+ image=CloneImage(*image_ptr,0,0,MagickFalse,&(*image_ptr)->exception);
+#ifdef ALL_IMAGEINFO
+ image_info_ptr=(ImageInfo **) param1;
+ if (*image_info_ptr != (ImageInfo *)NULL)
+ image_info=*image_info_ptr;
+#endif
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNBLOB") == 0)
+ {
+ char
+ **blob_data;
+
+ size_t
+ *blob_length;
+
+ char
+ filename[MaxTextExtent];
+
+ (void) sscanf(clone_info->filename,"%lx,%lx,%s",¶m1,¶m2,&filename);
+ blob_data=(char **) param1;
+ blob_length=(size_t *) param2;
+ image=BlobToImage(clone_info,*blob_data,*blob_length,exception);
+ CatchException(exception);
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+ {
+#ifdef IMPLEMENT_THIS
+ MagickBooleanType
+ status;
+#endif
+
+ char
+ filename[MaxTextExtent];
+
+ size_t
+ (*fifo)(const Image *,const void *,const size_t);
+
+ (void) sscanf(clone_info->filename,"%lx,%lx,%s",¶m1,¶m2,&filename);
+ fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+ clone_info->client_data=param2;
+#ifdef IMPLEMENT_THIS
+ status=ReadStream(clone_info,fifo,exception);
+ CatchException(exception);
+#endif
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
+ {
+ SAFEARRAY
+ *pSafeArray;
+
+ char
+ *blob_data;
+
+ size_t
+ blob_length;
+
+ ssize_t
+ lBoundl,
+ lBoundu;
+
+ HRESULT
+ hr;
+
+ char
+ filename[MaxTextExtent];
+
+ filename[0] = '\0';
+ (void) sscanf(clone_info->filename,"%lx,%s",¶m1,&filename);
+ hr = S_OK;
+ pSafeArray = (SAFEARRAY *) param1;
+ if (pSafeArray)
+ {
+ hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
+ if (SUCCEEDED(hr))
+ hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
+ if (SUCCEEDED(hr))
+ {
+ blob_length = lBoundu - lBoundl + 1;
+ hr = SafeArrayAccessData(pSafeArray, (void**)&blob_data);
+ if(SUCCEEDED(hr))
+ {
+ if (filename[0] != '\0')
+ {
+ (void) CopyMagickString(clone_info->filename,filename,
+ MaxTextExtent);
+ (void) CopyMagickString(clone_info->magick,filename,
+ MaxTextExtent);
+ }
+ else
+ {
+ *clone_info->magick = '\0';
+ clone_info->filename[0] = '\0';
+ }
+ image=BlobToImage(clone_info,blob_data,blob_length,exception);
+ hr = SafeArrayUnaccessData(pSafeArray);
+ CatchException(exception);
+ }
+ }
+ }
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNBSTR") == 0)
+ {
+ BSTR
+ bstr;
+
+ char
+ *blob_data;
+
+ size_t
+ blob_length;
+
+ HRESULT
+ hr;
+
+ char
+ filename[MaxTextExtent];
+
+ filename[0] = '\0';
+ (void) sscanf(clone_info->filename,"%lx,%s",¶m1,&filename);
+ hr = S_OK;
+ bstr = (BSTR) param1;
+ blob_length = SysStringLen(bstr) * 2;
+ blob_data = (char *)bstr;
+ if ((blob_data != (char *)NULL) && (blob_length>0))
+ {
+ if (filename[0] != '\0')
+ {
+ (void) CopyMagickString(clone_info->filename,filename,
+ MaxTextExtent);
+ (void) CopyMagickString(clone_info->magick,filename,
+ MaxTextExtent);
+ }
+ else
+ {
+ *clone_info->magick = '\0';
+ clone_info->filename[0] = '\0';
+ }
+ image=BlobToImage(clone_info,blob_data,blob_length,exception);
+ CatchException(exception);
+ }
+ }
+ clone_info=DestroyImageInfo(clone_info);
+ return(image);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e g i s t e r X T R N I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RegisterXTRNImage() adds attributes for the XTRN image format to
+% the list of supported formats. The attributes include the image format
+% tag, a method to read and/or write the format, whether the format
+% supports the saving of more than one frame to the same file or blob,
+% whether the format supports native in-memory I/O, and a brief
+% description of the format.
+%
+% The format of the RegisterXTRNImage method is:
+%
+% RegisterXTRNImage(void)
+%
+*/
+ModuleExport void RegisterXTRNImage(void)
+{
+ MagickInfo
+ *entry;
+
+ entry=SetMagickInfo("XTRNFILE");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("External transfer of a file");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+
+ entry=SetMagickInfo("XTRNIMAGE");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("External transfer of a image in memory");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+
+ entry=SetMagickInfo("XTRNBLOB");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("IExternal transfer of a blob in memory");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+
+ entry=SetMagickInfo("XTRNSTREAM");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("External transfer via a streaming interface");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+
+ entry=SetMagickInfo("XTRNARRAY");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("External transfer via a smart array interface");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+
+ entry=SetMagickInfo("XTRNBSTR");
+ entry->decoder=ReadXTRNImage;
+ entry->encoder=WriteXTRNImage;
+ entry->adjoin=MagickFalse;
+ entry->stealth=MagickTrue;
+ entry->description=ConstantString("External transfer via a smart array interface");
+ entry->module=ConstantString("XTRN");
+ RegisterMagickInfo(entry);
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U n r e g i s t e r X T R N I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% UnregisterXTRNImage() removes format registrations made by the
+% XTRN module from the list of supported formats.
+%
+% The format of the UnregisterXTRNImage method is:
+%
+% UnregisterXTRNImage(void)
+%
+*/
+ModuleExport void UnregisterXTRNImage(void)
+{
+ UnregisterMagickInfo("XTRNFILE");
+ UnregisterMagickInfo("XTRNIMAGE");
+ UnregisterMagickInfo("XTRNBLOB");
+ UnregisterMagickInfo("XTRNSTREAM");
+ UnregisterMagickInfo("XTRNARRAY");
+ UnregisterMagickInfo("XTRNBSTR");
+}
+
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% W r i t e X T R N I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% WriteXTRNImage() writes an image in the XTRN encoded image format.
+% We use GIF because it is the only format that is compressed without
+% requiring addition optional delegates (TIFF, ZIP, etc).
+%
+% The format of the WriteXTRNImage method is:
+%
+% MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+%
+% A description of each parameter follows.
+%
+% o image_info: Specifies a pointer to an ImageInfo structure.
+%
+% o image: A pointer to a Image structure.
+%
+%
+*/
+
+size_t SafeArrayFifo(const Image *image,const void *data,const size_t length)
+{
+ SAFEARRAYBOUND NewArrayBounds[1]; /* 1 Dimension */
+ size_t tlen=length;
+ SAFEARRAY *pSafeArray = (SAFEARRAY *)image->client_data;
+ if (pSafeArray != NULL)
+ {
+ ssize_t lBoundl, lBoundu, lCount;
+ HRESULT hr = S_OK;
+ /* First see how big the buffer currently is */
+ hr = SafeArrayGetLBound(pSafeArray, 1, &lBoundl);
+ if (FAILED(hr))
+ return MagickFalse;
+ hr = SafeArrayGetUBound(pSafeArray, 1, &lBoundu);
+ if (FAILED(hr))
+ return MagickFalse;
+ lCount = lBoundu - lBoundl + 1;
+
+ if (length>0)
+ {
+ unsigned char *pReturnBuffer = NULL;
+ NewArrayBounds[0].lLbound = 0; /* Start-Index 0 */
+ NewArrayBounds[0].cElements = (size_t) (length+lCount); /* # Elemente */
+ hr = SafeArrayRedim(pSafeArray, NewArrayBounds);
+ if (FAILED(hr))
+ return 0;
+ hr = SafeArrayAccessData(pSafeArray, (void**)&pReturnBuffer);
+ if( FAILED(hr) )
+ return 0;
+ (void) CopyMagickMemory( pReturnBuffer+lCount, (unsigned char *)data, length );
+ hr = SafeArrayUnaccessData(pSafeArray);
+ if( FAILED(hr) )
+ return 0;
+ }
+ else
+ {
+ /* Adjust the length of the buffer to fit */
+ }
+ }
+ return(tlen);
+}
+
+static MagickBooleanType WriteXTRNImage(const ImageInfo *image_info,Image *image)
+{
+ Image *
+ p;
+
+ ImageInfo
+ *clone_info;
+
+ int
+ scene;
+
+ MagickBooleanType
+ status;
+
+ void
+ *param1,
+ *param2,
+ *param3;
+
+ param1 = param2 = param3 = (void *) NULL;
+ if (LocaleCompare(image_info->magick,"XTRNFILE") == 0)
+ {
+ clone_info=CloneImageInfo(image_info);
+ status=WriteImage(image_info,image);
+ if (status == MagickFalse)
+ CatchImageException(image);
+ clone_info=DestroyImageInfo(clone_info);
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNIMAGE") == 0)
+ {
+ Image
+ **image_ptr;
+
+ ImageInfo
+ **image_info_ptr;
+
+ clone_info=CloneImageInfo(image_info);
+ if (clone_info->filename[0])
+ {
+ (void) sscanf(clone_info->filename,"%lx,%lx",¶m1,¶m2);
+ image_info_ptr=(ImageInfo **) param1;
+ image_ptr=(Image **) param2;
+ if ((image_info_ptr != (ImageInfo **) NULL) &&
+ (image_ptr != (Image **) NULL))
+ {
+ *image_ptr=CloneImage(image,0,0,MagickFalse,&(image->exception));
+ *image_info_ptr=clone_info;
+ }
+ }
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNBLOB") == 0)
+ {
+ char
+ **blob_data;
+
+ ExceptionInfo
+ exception;
+
+ size_t
+ *blob_length;
+
+ char
+ filename[MaxTextExtent];
+
+ clone_info=CloneImageInfo(image_info);
+ if (clone_info->filename[0])
+ {
+ (void) sscanf(clone_info->filename,"%lx,%lx,%s",
+ ¶m1,¶m2,&filename);
+
+ blob_data=(char **) param1;
+ blob_length=(size_t *) param2;
+
+ scene = 0;
+ (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+ for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+ {
+ (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+ p->scene=scene++;
+ }
+ SetImageInfo(clone_info,1,&image->exception);
+ (void) CopyMagickString(image->magick,clone_info->magick,
+ MaxTextExtent);
+ GetExceptionInfo(&exception);
+ if (*blob_length == 0)
+ *blob_length=8192;
+ *blob_data=(char *) ImageToBlob(clone_info,image,blob_length,
+ &exception);
+ if (*blob_data == NULL)
+ status=MagickFalse;
+ if (status == MagickFalse)
+ CatchImageException(image);
+ }
+ clone_info=DestroyImageInfo(clone_info);
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNSTREAM") == 0)
+ {
+ size_t
+ (*fifo)(const Image *,const void *,const size_t);
+
+ char
+ filename[MaxTextExtent];
+
+ clone_info=CloneImageInfo(image_info);
+ if (clone_info->filename[0])
+ {
+ (void) sscanf(clone_info->filename,"%lx,%lx,%s",
+ ¶m1,¶m2,&filename);
+
+ fifo=(size_t (*)(const Image *,const void *,const size_t)) param1;
+ image->client_data=param2;
+
+ scene=0;
+ (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+ for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+ {
+ (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+ p->scene=scene++;
+ }
+ SetImageInfo(clone_info,1,&image->exception);
+ (void) CopyMagickString(image->magick,clone_info->magick,
+ MaxTextExtent);
+ status=WriteStream(clone_info,image,fifo);
+ if (status == MagickFalse)
+ CatchImageException(image);
+ }
+ clone_info=DestroyImageInfo(clone_info);
+ }
+ else if (LocaleCompare(image_info->magick,"XTRNARRAY") == 0)
+ {
+ char
+ filename[MaxTextExtent];
+
+ clone_info=CloneImageInfo(image_info);
+ if (clone_info->filename[0])
+ {
+ (void) sscanf(clone_info->filename,"%lx,%s",
+ ¶m1,&filename);
+
+ image->client_data=param1;
+
+ scene = 0;
+ (void) CopyMagickString(clone_info->filename,filename,MaxTextExtent);
+ for (p=image; p != (Image *) NULL; p=GetNextImageInList(p))
+ {
+ (void) CopyMagickString(p->filename,filename,MaxTextExtent);
+ p->scene=scene++;
+ }
+ SetImageInfo(clone_info,1,&image->exception);
+ (void) CopyMagickString(image->magick,clone_info->magick,
+ MaxTextExtent);
+ status=WriteStream(clone_info,image,SafeArrayFifo);
+ if (status == MagickFalse)
+ CatchImageException(image);
+ }
+ clone_info=DestroyImageInfo(clone_info);
+ }
+ return(MagickTrue);
+}
+#endif