From 641733d57df11b441146f89f9fb1929e999b5e1f Mon Sep 17 00:00:00 2001 From: cristy Date: Tue, 9 Jul 2013 00:38:21 +0000 Subject: [PATCH] --- Magick++/lib/Geometry.cpp | 32 +++++--- Magick++/lib/Magick++/Geometry.h | 36 ++++++--- Magick++/lib/Magick++/Include.h | 6 +- Magick++/lib/Magick++/STL.h | 122 ++++++++++++++++++++++++++++++- MagickCore/cache.c | 22 +----- MagickCore/nt-base.c | 7 ++ MagickCore/pixel-private.h | 15 ++++ 7 files changed, 194 insertions(+), 46 deletions(-) diff --git a/Magick++/lib/Geometry.cpp b/Magick++/lib/Geometry.cpp index 09e648375..05bfc0746 100644 --- a/Magick++/lib/Geometry.cpp +++ b/Magick++/lib/Geometry.cpp @@ -33,7 +33,8 @@ int Magick::operator == ( const Magick::Geometry& left_, ( left_.percent() == right_.percent() ) && ( left_.aspect() == right_.aspect() ) && ( left_.greater() == right_.greater() ) && - ( left_.less() == right_.less() ) + ( left_.less() == right_.less() ) && + ( left_.fillArea() == right_.fillArea() ) ); } int Magick::operator != ( const Magick::Geometry& left_, @@ -83,7 +84,8 @@ Magick::Geometry::Geometry ( size_t width_, _percent( false ), _aspect( false ), _greater( false ), - _less( false ) + _less( false ), + _fillArea( false ) { } @@ -99,7 +101,8 @@ Magick::Geometry::Geometry ( const std::string &geometry_ ) _percent( false ), _aspect( false ), _greater( false ), - _less( false ) + _less( false ), + _fillArea( false ) { *this = geometry_; // Use assignment operator } @@ -117,7 +120,8 @@ Magick::Geometry::Geometry ( const char *geometry_ ) _percent( false ), _aspect( false ), _greater( false ), - _less( false ) + _less( false ), + _fillArea( false ) { *this = geometry_; // Use assignment operator } @@ -134,7 +138,8 @@ Magick::Geometry::Geometry ( const Geometry &geometry_ ) _percent( geometry_._percent ), _aspect( geometry_._aspect ), _greater( geometry_._greater ), - _less( geometry_._less ) + _less( geometry_._less ), + _fillArea( geometry_._fillArea ) { } @@ -150,7 +155,8 @@ Magick::Geometry::Geometry ( void ) _percent( false ), _aspect( false ), _greater( false ), - _less( false ) + _less( false ), + _fillArea( false ) { } @@ -175,6 +181,7 @@ Magick::Geometry& Magick::Geometry::operator = ( const Geometry& geometry_ ) _aspect = geometry_._aspect; _greater = geometry_._greater; _less = geometry_._less; + _fillArea = geometry_._fillArea; } return *this; } @@ -241,7 +248,7 @@ Magick::Geometry::operator = ( const std::string &geometry_ ) isValid( true ); } - if ( ( flags & XNegative ) != 0 ) + if ( ( flags & XNegative ) != 0 ) _xNegative = true; if ( ( flags & YNegative ) != 0 ) @@ -259,6 +266,9 @@ Magick::Geometry::operator = ( const std::string &geometry_ ) if ( ( flags & GreaterValue ) != 0 ) _greater = true; + if ( ( flags & MinimumValue ) != 0 ) + _fillArea = true; + return *this; } @@ -325,6 +335,9 @@ Magick::Geometry::operator std::string() const if ( _less ) geometry += '<'; + if ( _fillArea ) + geometry += '^'; + return geometry; } @@ -340,8 +353,9 @@ Magick::Geometry::Geometry ( const MagickCore::RectangleInfo &rectangle_ ) _percent(false), _aspect(false), _greater(false), - _less(false) -{ + _less(false), + _fillArea(false) +{ } // Return an ImageMagick RectangleInfo struct diff --git a/Magick++/lib/Magick++/Geometry.h b/Magick++/lib/Magick++/Geometry.h index 7b6ad6f32..8e77bc34a 100644 --- a/Magick++/lib/Magick++/Geometry.h +++ b/Magick++/lib/Magick++/Geometry.h @@ -82,6 +82,10 @@ namespace Magick void less ( bool less_ ); bool less ( void ) const; + // Resize the image based on the smallest fitting dimension (^) + void fillArea ( bool fillArea_ ); + bool fillArea ( void ) const; + // Does object contain valid geometry? void isValid ( bool isValid_ ); bool isValid ( void ) const; @@ -107,17 +111,18 @@ namespace Magick operator MagickCore::RectangleInfo() const; private: - size_t _width; - size_t _height; - ::ssize_t _xOff; - ::ssize_t _yOff; - bool _xNegative; - bool _yNegative; - bool _isValid; - bool _percent; // Interpret width & height as percentages (%) - bool _aspect; // Force exact size (!) - bool _greater; // Re-size only if larger than geometry (>) - bool _less; // Re-size only if smaller than geometry (<) + size_t _width; + size_t _height; + ::ssize_t _xOff; + ::ssize_t _yOff; + bool _xNegative; + bool _yNegative; + bool _isValid; + bool _percent; // Interpret width & height as percentages (%) + bool _aspect; // Force exact size (!) + bool _greater; // Resize only if larger than geometry (>) + bool _less; // Resize only if smaller than geometry (<) + bool _fillArea; // Resize the image based on the smallest fitting dimension (^) }; } // namespace Magick @@ -237,5 +242,14 @@ inline bool Magick::Geometry::less ( void ) const return _less; } +// Resize the image based on the smallest fitting dimension (^) +inline void Magick::Geometry::fillArea ( bool fillArea_ ) +{ + _fillArea = fillArea_; +} +inline bool Magick::Geometry::fillArea ( void ) const +{ + return _fillArea; +} #endif // Magick_Geometry_header diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h index 628d62ab9..4d366d80c 100644 --- a/Magick++/lib/Magick++/Include.h +++ b/Magick++/lib/Magick++/Include.h @@ -585,7 +585,6 @@ namespace Magick using MagickCore::AdaptiveBlurImage; using MagickCore::AdaptiveThresholdImage; using MagickCore::AddNoiseImage; - using MagickCore::AddNoiseImage; using MagickCore::AffineMatrix; using MagickCore::AffineTransformImage; using MagickCore::AnnotateImage; @@ -598,7 +597,6 @@ namespace Magick using MagickCore::BlobToImage; using MagickCore::BlobWarning; using MagickCore::BlurImage; - using MagickCore::BlurImage; using MagickCore::BorderImage; using MagickCore::CacheError; using MagickCore::CacheFatalError; @@ -742,7 +740,6 @@ namespace Magick using MagickCore::EnhanceImage; using MagickCore::EqualizeImage; using MagickCore::EvaluateImage; - using MagickCore::EvaluateImage; using MagickCore::ExceptionInfo; using MagickCore::ExceptionType; using MagickCore::ExportImagePixels; @@ -760,7 +757,6 @@ namespace Magick using MagickCore::FrameInfo; using MagickCore::FxImage; using MagickCore::GammaImage; - using MagickCore::GammaImage; using MagickCore::GaussianBlurImage; using MagickCore::GaussianBlurImage; using MagickCore::GetAffineMatrix; @@ -822,7 +818,6 @@ namespace Magick using MagickCore::KernelInfo; using MagickCore::LessValue; using MagickCore::LevelImage; - using MagickCore::LevelImage; using MagickCore::LocaleCompare; using MagickCore::LogMagickEvent; using MagickCore::MagickCoreTerminus; @@ -833,6 +828,7 @@ namespace Magick using MagickCore::MagnifyImage; using MagickCore::MergeImageLayers; using MagickCore::MinifyImage; + using MagickCore::MinimumValue; using MagickCore::MissingDelegateError; using MagickCore::MissingDelegateFatalError; using MagickCore::MissingDelegateWarning; diff --git a/Magick++/lib/Magick++/STL.h b/Magick++/lib/Magick++/STL.h index 8dd6f4e22..b40c9b18e 100644 --- a/Magick++/lib/Magick++/STL.h +++ b/Magick++/lib/Magick++/STL.h @@ -2148,7 +2148,26 @@ namespace Magick histogram_array=(MagickCore::PixelInfo *) MagickCore::RelinquishMagickMemory(histogram_array); } - + + // Combines one or more images into a single image. The grayscale value of + // the pixels of each image in the sequence is assigned in order to the + // specified channels of the combined image. The typical ordering would be + // image 1 => Red, 2 => Green, 3 => Blue, etc. + template + void combineImages( Image *combinedImage_, + InputIterator first_, + InputIterator last_, + const ChannelType channel_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + linkImages( first_, last_ ); + MagickCore::Image* image = CombineImages( first_->image(), channel_, &exceptionInfo ); + unlinkImages( first_, last_ ); + combinedImage_->replaceImage( image ); + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + // Break down an image sequence into constituent parts. This is // useful for creating GIF or MNG animation sequences. template @@ -2191,6 +2210,25 @@ namespace Magick (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); } + // Applies a value to the image with an arithmetic, relational, + // or logical operator to an image. Use these operations to lighten or darken + // an image, to increase or decrease contrast in an image, or to produce the + // "negative" of an image. + template + void evaluateImages( Image *evaluatedImage_, + InputIterator first_, + InputIterator last_, + const MagickEvaluateOperator operator_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + linkImages( first_, last_ ); + MagickCore::Image* image = EvaluateImages( first_->image(), operator_, &exceptionInfo ); + unlinkImages( first_, last_ ); + evaluatedImage_->replaceImage( image ); + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + // Merge a sequence of image frames which represent image layers. // This is useful for combining Photoshop layers into a single image. template @@ -2308,6 +2346,23 @@ namespace Magick (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); } + // Composes all the image layers from the current given + // image onward to produce a single image of the merged layers. + template + void mergeImageLayers( Image *mergedImage_, + InputIterator first_, + InputIterator last_, + const LayerMethod method_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + linkImages( first_, last_ ); + MagickCore::Image* image = MergeImageLayers( first_->image(), method_, &exceptionInfo ); + unlinkImages( first_, last_ ); + mergedImage_->replaceImage( image ); + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + // Create a composite image by combining several separate images. template void montageImages( Container *montageImages_, @@ -2405,6 +2460,53 @@ namespace Magick (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); } + // Compares each image the GIF disposed forms of the previous image in + // the sequence. From this it attempts to select the smallest cropped + // image to replace each frame, while preserving the results of the + // GIF animation. + template + void optimizeImageLayers( Container *optimizedImages_, + InputIterator first_, + InputIterator last_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + + linkImages( first_, last_ ); + MagickCore::Image* images = OptimizeImageLayers( first_->image(), &exceptionInfo ); + + unlinkImages( first_, last_ ); + + optimizedImages_->clear(); + + insertImages( optimizedImages_, images ); + + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + + // optimizeImagePlusLayers is exactly as optimizeImageLayers, but may + // also add or even remove extra frames in the animation, if it improves + // the total number of pixels in the resulting GIF animation. + template + void optimizePlusImageLayers( Container *optimizedImages_, + InputIterator first_, + InputIterator last_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + + linkImages( first_, last_ ); + MagickCore::Image* images = OptimizePlusImageLayers( first_->image(), &exceptionInfo ); + + unlinkImages( first_, last_ ); + + optimizedImages_->clear(); + + insertImages( optimizedImages_, images ); + + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + // Quantize colors in images using current quantization settings // Set measureError_ to true in order to measure quantization error template @@ -2473,6 +2575,24 @@ namespace Magick (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); } + // Returns a separate grayscale image for each channel specified. + template + void separateImages( Container *separatedImages_, + const Image &image_, + const ChannelType channel_ ) { + MagickCore::ExceptionInfo exceptionInfo; + MagickCore::GetExceptionInfo( &exceptionInfo ); + + MagickCore::Image* images = MagickCore::SeparateImages( image_.constImage(), channel_, &exceptionInfo ); + + separatedImages_->clear(); + + insertImages( separatedImages_, images ); + + throwException( exceptionInfo ); + (void) MagickCore::DestroyExceptionInfo( &exceptionInfo ); + } + // Write Images template void writeImages( InputIterator first_, diff --git a/MagickCore/cache.c b/MagickCore/cache.c index 26ba6744e..1213f472e 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -516,26 +516,8 @@ static MagickBooleanType ClonePixelCacheRepository( (memcmp(cache_info->channel_map,clone_info->channel_map,length) == 0) && (cache_info->metacontent_extent == clone_info->metacontent_extent)) { - size_t - extent; - - /* - Identical pixel cache morphology. - */ - extent=cache_info->columns*cache_info->number_channels*cache_info->rows; -#if !defined(MAGICKCORE_OPENMP_SUPPORT) || (MAGICKCORE_QUANTUM_DEPTH <= 8) - (void) memcpy(clone_info->pixels,cache_info->pixels,extent* - sizeof(*cache_info->pixels)); -#else - { - register size_t - i; - - #pragma omp parallel for - for (i=0; i < extent; i++) - clone_info->pixels[i]=cache_info->pixels[i]; - } -#endif + CopyPixels(clone_info->pixels,cache_info->pixels,cache_info->columns* + cache_info->number_channels*cache_info->rows); if (cache_info->metacontent_extent != 0) (void) memcpy(clone_info->metacontent,cache_info->metacontent, cache_info->columns*cache_info->rows*clone_info->metacontent_extent* diff --git a/MagickCore/nt-base.c b/MagickCore/nt-base.c index 3f406807e..9cd5bff41 100644 --- a/MagickCore/nt-base.c +++ b/MagickCore/nt-base.c @@ -1828,8 +1828,11 @@ MagickPrivate MagickBooleanType NTReportEvent(const char *event, */ MagickPrivate unsigned char *NTResourceToBlob(const char *id) { + +#ifndef MAGICKCORE_LIBRARY_NAME char path[MaxTextExtent]; +#endif DWORD length; @@ -1849,12 +1852,16 @@ MagickPrivate unsigned char *NTResourceToBlob(const char *id) assert(id != (const char *) NULL); (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",id); +#ifdef MAGICKCORE_LIBRARY_NAME + handle=GetModuleHandle(MAGICKCORE_LIBRARY_NAME); +#else (void) FormatLocaleString(path,MaxTextExtent,"%s%s%s",GetClientPath(), DirectorySeparator,GetClientName()); if (IsPathAccessible(path) != MagickFalse) handle=GetModuleHandle(path); else handle=GetModuleHandle(0); +#endif if (!handle) return((unsigned char *) NULL); resource=FindResource(handle,id,"IMAGEMAGICK"); diff --git a/MagickCore/pixel-private.h b/MagickCore/pixel-private.h index 1f3831471..51a53ab3a 100644 --- a/MagickCore/pixel-private.h +++ b/MagickCore/pixel-private.h @@ -22,6 +22,21 @@ extern "C" { #endif +static inline void CopyPixels(Quantum *destination,const Quantum *source, + const MagickSizeType number_pixels) +{ +#if !defined(MAGICKCORE_OPENMP_SUPPORT) || (MAGICKCORE_QUANTUM_DEPTH <= 8) + (void) memcpy(destination,source,(size_t) number_pixels*sizeof(*source)); +#else + register MagickSizeType + i; + + #pragma omp parallel for + for (i=0; i < number_pixels; i++) + destination[i]=source[i]; +#endif +} + static inline double PerceptibleReciprocal(const double x) { double -- 2.40.0