From 490408a4252cd2a43d4038d1e71ae5369f56bca5 Mon Sep 17 00:00:00 2001 From: cristy Date: Thu, 7 Jul 2011 14:42:05 +0000 Subject: [PATCH] --- Magick++/lib/Image.cpp | 11 +- Magick++/lib/Magick++/Include.h | 8 +- MagickCore/effect.c | 18 +- MagickCore/enhance.c | 95 +++-- MagickCore/enhance.h | 4 +- MagickCore/feature.c | 12 +- MagickCore/feature.h | 2 +- MagickCore/fx.c | 31 +- MagickCore/fx.h | 3 - MagickCore/histogram.c | 75 ++-- MagickCore/histogram.h | 2 +- MagickCore/identify.c | 2 +- MagickCore/image.c | 2 +- MagickCore/image.h | 5 +- MagickCore/magick-config.h | 22 +- MagickCore/magick-type.h | 2 - MagickCore/methods.h | 8 +- MagickCore/pixel-accessor.h | 110 +++--- MagickCore/pixel.c | 156 ++++++-- MagickCore/pixel.h | 11 +- MagickCore/version.h | 2 +- MagickWand/magick-image.c | 47 +-- MagickWand/magick-image.h | 4 +- MagickWand/mogrify.c | 9 +- PerlMagick/Magick.xs | 103 +++--- coders/msl.c | 7 +- coders/xtrn.c | 637 ++++++++++++++++++++++++++++++++ 27 files changed, 1014 insertions(+), 374 deletions(-) diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index f1a74955e..81d9a7147 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -345,11 +345,12 @@ void Magick::Image::addNoiseChannel( const ChannelType channel_, { 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 @@ void Magick::Image::fx ( const std::string expression ) 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 @@ void Magick::Image::fx ( const std::string expression, { 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 dbf627534..9cc1e69f2 100644 --- a/Magick++/lib/Magick++/Include.h +++ b/Magick++/lib/Magick++/Include.h @@ -534,7 +534,7 @@ namespace Magick 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 @@ namespace Magick 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 @@ namespace Magick 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 46bb6a322..a48c64964 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -5128,7 +5128,8 @@ MagickExport Image *StatisticImageChannel(const Image *image, 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 @@ MagickExport Image *StatisticImageChannel(const Image *image, } } 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 3cee6dfb1..a5c32e7bd 100644 --- a/MagickCore/enhance.c +++ b/MagickCore/enhance.c @@ -107,9 +107,6 @@ MagickExport MagickBooleanType AutoGammaImage(Image *image) mean, sans; - Image - *level_image; - log_mean=log(0.5); if (image->sync != MagickFalse) { @@ -125,32 +122,32 @@ MagickExport MagickBooleanType AutoGammaImage(Image *image) 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 @@ MagickExport MagickBooleanType AutoGammaImage(Image *image) (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 @@ MagickExport MagickBooleanType AutoGammaImage(Image *image) (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 AutoGammaImage(Image *image) */ MagickExport MagickBooleanType AutoLevelImage(Image *image) { - return(MinMaxStretchImage(image,DefaultChannels,0.0,0.0)); + return(MinMaxStretchImage(image,0.0,0.0)); } /* @@ -2609,7 +2607,7 @@ MagickExport MagickBooleanType LevelizeImage(Image *image, % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% 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 @@ MagickExport MagickBooleanType LevelizeImage(Image *image, % 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,22 +2635,9 @@ MagickExport MagickBooleanType LevelizeImage(Image *image, % 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 @@ MagickExport MagickBooleanType LevelColorsImageChannel(Image *image, { 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 635902cb6..9965656c3 100644 --- a/MagickCore/enhance.h +++ b/MagickCore/enhance.h @@ -35,10 +35,8 @@ extern MagickExport MagickBooleanType 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 f2b54f4fe..bc1f0d0fe 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 @@ static inline ssize_t MagickAbsoluteValue(const ssize_t x) 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 7f8d1e57b..88eb3d49b 100644 --- a/MagickCore/feature.h +++ b/MagickCore/feature.h @@ -45,7 +45,7 @@ typedef struct _ChannelFeatures } 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 e209b57b9..8a962e31e 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -289,8 +289,6 @@ MagickExport FxInfo *AcquireFxInfo(const Image *image,const char *expression) % % 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 @@ MagickExport FxInfo *AcquireFxInfo(const Image *image,const char *expression) % 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 @@ MagickExport MagickBooleanType FxEvaluateChannelExpression(FxInfo *fx_info, % % 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. @@ -2916,16 +2899,6 @@ static FxInfo **AcquireFxThreadSet(const Image *image,const char *expression, 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" @@ -3056,7 +3029,7 @@ MagickExport Image *FxImageChannel(const Image *image,const ChannelType channel, 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 67f6e5598..9f978582c 100644 --- a/MagickCore/fx.h +++ b/MagickCore/fx.h @@ -38,14 +38,11 @@ typedef enum 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 f2877b84e..9cbb84d93 100644 --- a/MagickCore/histogram.c +++ b/MagickCore/histogram.c @@ -964,43 +964,37 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image, % % 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 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image, /* 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 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image, { (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 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image, { (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 a4151b5ce..a86f0fc7a 100644 --- a/MagickCore/histogram.h +++ b/MagickCore/histogram.h @@ -31,7 +31,7 @@ extern MagickExport Image 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 b5ebad694..cb5b45218 100644 --- a/MagickCore/identify.c +++ b/MagickCore/identify.c @@ -430,7 +430,7 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file, 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 b81304c6d..398d9558d 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -2672,7 +2672,7 @@ MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, */ 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 22e19c0fe..558d2c585 100644 --- a/MagickCore/image.h +++ b/MagickCore/image.h @@ -286,8 +286,11 @@ struct _Image 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 9002a55f6..53e983a1c 100644 --- a/MagickCore/magick-config.h +++ b/MagickCore/magick-config.h @@ -421,15 +421,15 @@ #endif /* Define if you have the header file. */ -/* #undef HAVE_LCMS2_H */ +#ifndef MAGICKCORE_HAVE_LCMS2_H +#define MAGICKCORE_HAVE_LCMS2_H 1 +#endif /* Define if you have the header file. */ /* #undef HAVE_LCMS2_LCMS2_H */ /* Define if you have the header file. */ -#ifndef MAGICKCORE_HAVE_LCMS_H -#define MAGICKCORE_HAVE_LCMS_H 1 -#endif +/* #undef HAVE_LCMS_H */ /* Define if you have the 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 4158da692..286626386 100644 --- a/MagickCore/magick-type.h +++ b/MagickCore/magick-type.h @@ -131,8 +131,6 @@ typedef MagickOffsetType QuantumAny; 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 fb8101fba..62d088c4b 100644 --- a/MagickCore/methods.h +++ b/MagickCore/methods.h @@ -87,7 +87,7 @@ extern "C" { #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 @@ extern "C" { #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 @@ extern "C" { #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 b685ac7a1..eb81c2058 100644 --- a/MagickCore/pixel-accessor.h +++ b/MagickCore/pixel-accessor.h @@ -29,42 +29,42 @@ extern "C" { 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 size_t GetPixelChannels(const Image *image) 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 GetPixelInfoLuminance(const PixelInfo *pixel_info) 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 size_t GetPixelMetacontentExtent(const Image *image) 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 Quantum GetPixelPacketIntensity(const PixelPacket *pixel) 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 SetPacketPixelInfo(const Image *image, 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 SetPixelChannels(Image *image,const size_t channels) 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 SetPixelInfoPacket(const Image *image, 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 SetPixelMetacontentExtent(Image *image,const size_t extent) 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 SetPixelPixelInfo(const Image *image, 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 325615c30..f0e5a061e 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 @@ MagickExport PixelComponentMap *AcquirePixelComponentMap(void) % % 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; + + register ssize_t + i; - assert(component_map != (const PixelComponentMap *) NULL); + 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 @@ MagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel) % % 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 @@ MagickExport MagickBooleanType IsFuzzyEquivalencePixelPacket(const Image *image, % % % % % % +% 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 @@ MagickExport MagickBooleanType IsFuzzyEquivalencePixelPacket(const Image *image, % % 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 b614ea9ae..bb10bf1a9 100644 --- a/MagickCore/pixel.h +++ b/MagickCore/pixel.h @@ -25,6 +25,9 @@ extern "C" { #include #include +#define MaxPixelComponents 16 +#define MaxPixelComponentMaps 16 + typedef enum { UndefinedInterpolatePixel, @@ -150,9 +153,9 @@ extern MagickExport MagickBooleanType 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 PixelInfo 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 fdb711ea0..50b9a5540 100644 --- a/MagickCore/version.h +++ b/MagickCore/version.h @@ -34,7 +34,7 @@ extern "C" { #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 bd4197bbe..48220b472 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -491,32 +491,17 @@ WandExport MagickBooleanType MagickAddImage(MagickWand *wand, % % 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 @@ WandExport MagickBooleanType MagickAddNoiseImageChannel(MagickWand *wand, (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,30 +3485,15 @@ WandExport MagickBooleanType MagickFunctionImageChannel(MagickWand *wand, % 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 @@ WandExport MagickWand *MagickFxImageChannel(MagickWand *wand, (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 @@ WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand, % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% 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 @@ WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand, % 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 @@ WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand, % 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 @@ WandExport ChannelFeatures *MagickGetImageChannelFeatures(MagickWand *wand, "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 96b5e96bc..002b9ddc0 100644 --- a/MagickWand/magick-image.h +++ b/MagickWand/magick-image.h @@ -24,7 +24,7 @@ extern "C" { #endif extern WandExport ChannelFeatures - *MagickGetImageChannelFeatures(MagickWand *,const size_t); + *MagickGetImageFeatures(MagickWand *,const size_t); extern WandExport ChannelStatistics *MagickGetImageChannelStatistics(MagickWand *); @@ -82,7 +82,6 @@ extern WandExport MagickBooleanType 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 @@ extern WandExport MagickWand *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 08f83ad9f..cd98ab47b 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -1922,8 +1922,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, 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 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, 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 @@ This has been merged completely into MogrifyImage() *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 8c7aafaf9..e72560f62 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -3852,7 +3852,7 @@ Features(ref,...) 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 @@ Fx(ref,...) } } } - 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 @@ Mogrify(ref,...) AutoLevel = 255 AutoLevelImage = 256 LevelColors = 257 - LevelColorsImage = 258 + LevelImageColors = 258 Clamp = 259 ClampImage = 260 Filter = 261 @@ -7491,8 +7493,10 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) 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 @@ Mogrify(ref,...) &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 @@ Mogrify(ref,...) 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 @@ SetPixel(ref,...) 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 @@ SetPixel(ref,...) } } (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 @@ SetPixel(ref,...) } (void) SyncAuthenticPixels(image,exception); } + PopPixelComponentMap(image); PerlException: InheritPerlException(exception,perl_exception); diff --git a/coders/msl.c b/coders/msl.c index 3a8fe622b..3d8e1bc94 100644 --- a/coders/msl.c +++ b/coders/msl.c @@ -736,8 +736,10 @@ static void MSLStartElement(void *context,const xmlChar *tag, } } } - 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 @@ static void MSLStartElement(void *context,const xmlChar *tag, } } } - 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 e69de29bb..30f2f938c 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 +#include + +/* + 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 -- 2.40.0