From: cristy Date: Sun, 29 Jan 2012 21:41:05 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~6303 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10a6c61544fb48d72f29ec8f9573bdcd52abf1b7;p=imagemagick --- diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index 5dcc942a7..ae0f1c4c3 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -2678,12 +2678,12 @@ void Magick::Image::clipMask ( const Magick::Image & clipMask_ ) if( clipMask_.isValid() ) { // Set clip mask - SetImageClipMask( image(), clipMask_.constImage(), &exceptionInfo ); + SetImageMask( image(), clipMask_.constImage(), &exceptionInfo ); } else { // Unset existing clip mask - SetImageClipMask( image(), 0, &exceptionInfo ); + SetImageMask( image(), 0, &exceptionInfo ); } throwException( exceptionInfo ); (void) DestroyExceptionInfo( &exceptionInfo ); diff --git a/Magick++/lib/Magick++/Include.h b/Magick++/lib/Magick++/Include.h index 19d75f685..1d592ba0f 100644 --- a/Magick++/lib/Magick++/Include.h +++ b/Magick++/lib/Magick++/Include.h @@ -873,14 +873,13 @@ namespace Magick using MagickCore::SeparateImage; using MagickCore::SetClientName; using MagickCore::SetGeometry; + using MagickCore::SetImageAlpha; using MagickCore::SetImageBackgroundColor; using MagickCore::SetImageDepth; - using MagickCore::SetImageClipMask; - using MagickCore::SetImageDepth; using MagickCore::SetImageExtent; using MagickCore::SetImageInfo; using MagickCore::SetImageInfoFile; - using MagickCore::SetImageAlpha; + using MagickCore::SetImageMask; using MagickCore::SetImageOption; using MagickCore::SetImageProfile; using MagickCore::SetImageProperty; diff --git a/MagickCore/attribute.c b/MagickCore/attribute.c index b00697e27..5bb0989e0 100644 --- a/MagickCore/attribute.c +++ b/MagickCore/attribute.c @@ -407,6 +407,11 @@ MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -418,7 +423,7 @@ MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception) channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); if ((traits == UndefinedPixelTrait) || - (channel == IndexPixelChannel)) + (channel == IndexPixelChannel) || (channel == MaskPixelChannel)) continue; if (depth_map[ScaleQuantumToMap(p[i])] > current_depth[id]) current_depth[id]=depth_map[ScaleQuantumToMap(p[i])]; @@ -465,6 +470,11 @@ MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -475,8 +485,8 @@ MagickExport size_t GetImageDepth(const Image *image,ExceptionInfo *exception) channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); - if ((traits == UndefinedPixelTrait) || - (channel == IndexPixelChannel)) + if ((traits == UndefinedPixelTrait) || (channel == IndexPixelChannel) || + (channel == MaskPixelChannel)) continue; while (current_depth[id] < MAGICKCORE_QUANTUM_DEPTH) { @@ -982,6 +992,11 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -993,7 +1008,7 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); if ((traits == UndefinedPixelTrait) || - (channel == IndexPixelChannel)) + (channel == IndexPixelChannel) || (channel == MaskPixelChannel)) continue; q[i]=depth_map[ScaleQuantumToMap(q[i])]; } @@ -1039,6 +1054,11 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1049,7 +1069,8 @@ MagickExport MagickBooleanType SetImageDepth(Image *image, channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); - if ((traits == UndefinedPixelTrait) || (channel == IndexPixelChannel)) + if ((traits == UndefinedPixelTrait) || (channel == IndexPixelChannel) || + (channel == MaskPixelChannel)) continue; q[i]=ScaleAnyToQuantum(ScaleQuantumToAny(q[i],range),range); } diff --git a/MagickCore/cache-private.h b/MagickCore/cache-private.h index bfceb8ce0..92fc0f069 100644 --- a/MagickCore/cache-private.h +++ b/MagickCore/cache-private.h @@ -119,7 +119,8 @@ typedef struct _CacheInfo colorspace; MagickBooleanType - matte; + matte, + masky; size_t columns, diff --git a/MagickCore/cache.c b/MagickCore/cache.c index c6185d48f..60008442e 100644 --- a/MagickCore/cache.c +++ b/MagickCore/cache.c @@ -358,115 +358,6 @@ MagickPrivate void CacheComponentTerminus(void) % % % % % % -+ C l i p P i x e l C a c h e N e x u s % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% ClipPixelCacheNexus() clips the cache nexus as defined by the image clip -% mask. It returns MagickTrue if the pixel region is clipped, otherwise -% MagickFalse. -% -% The format of the ClipPixelCacheNexus() method is: -% -% MagickBooleanType ClipPixelCacheNexus(Image *image,NexusInfo *nexus_info, -% ExceptionInfo *exception) -% -% A description of each parameter follows: -% -% o image: the image. -% -% o nexus_info: the cache nexus to clip. -% -% o exception: return any errors or warnings in this structure. -% -*/ -static MagickBooleanType ClipPixelCacheNexus(Image *image, - NexusInfo *nexus_info,ExceptionInfo *exception) -{ - CacheInfo - *cache_info; - - MagickSizeType - number_pixels; - - NexusInfo - **clip_nexus, - **image_nexus; - - register const Quantum - *restrict p, - *restrict r; - - register Quantum - *restrict q; - - register ssize_t - x; - - /* - Clip the image as defined by the clipping mask. - */ - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - if (image->clip_mask == (Image *) NULL) - return(MagickFalse); - cache_info=(CacheInfo *) image->cache; - if (cache_info == (Cache) NULL) - return(MagickFalse); - image_nexus=AcquirePixelCacheNexus(1); - clip_nexus=AcquirePixelCacheNexus(1); - if ((image_nexus == (NexusInfo **) NULL) || - (clip_nexus == (NexusInfo **) NULL)) - ThrowBinaryException(CacheError,"UnableToGetCacheNexus",image->filename); - p=(const Quantum *) GetAuthenticPixelCacheNexus(image,nexus_info->region.x, - nexus_info->region.y,nexus_info->region.width,nexus_info->region.height, - image_nexus[0],exception); - q=nexus_info->pixels; - r=GetVirtualPixelsFromNexus(image->clip_mask,MaskVirtualPixelMethod, - nexus_info->region.x,nexus_info->region.y,nexus_info->region.width, - nexus_info->region.height,clip_nexus[0],exception); - number_pixels=(MagickSizeType) nexus_info->region.width* - nexus_info->region.height; - for (x=0; x < (ssize_t) number_pixels; x++) - { - register ssize_t - i; - - if ((p == (const Quantum *) NULL) || (r == (const Quantum *) NULL)) - break; - if (GetPixelIntensity(image->clip_mask,r) > ((Quantum) QuantumRange/2)) - for (i=0; i < (ssize_t) image->number_channels; i++) - { - PixelChannel - channel; - - PixelTrait - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - if (traits == UndefinedPixelTrait) - continue; - q[i]=p[i]; - } - p+=GetPixelChannels(image); - q+=GetPixelChannels(image); - r+=GetPixelChannels(image->clip_mask); - } - clip_nexus=DestroyPixelCacheNexus(clip_nexus,1); - image_nexus=DestroyPixelCacheNexus(image_nexus,1); - if (x < (ssize_t) number_pixels) - return(MagickFalse); - return(MagickTrue); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % + C l o n e P i x e l C a c h e % % % % % @@ -1944,6 +1835,7 @@ static inline MagickBooleanType ValidatePixelCacheMorphology(const Image *image) if ((image->storage_class != cache_info->storage_class) || (image->colorspace != cache_info->colorspace) || (image->matte != cache_info->matte) || + (image->masky != cache_info->masky) || (image->columns != cache_info->columns) || (image->rows != cache_info->rows) || (image->number_channels != cache_info->number_channels) || @@ -3745,132 +3637,6 @@ MagickPrivate const Quantum *GetVirtualPixelsNexus(const Cache cache, % % % % % % -+ M a s k P i x e l C a c h e N e x u s % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% MaskPixelCacheNexus() masks the cache nexus as defined by the image mask. -% The method returns MagickTrue if the pixel region is masked, otherwise -% MagickFalse. -% -% The format of the MaskPixelCacheNexus() method is: -% -% MagickBooleanType MaskPixelCacheNexus(Image *image, -% NexusInfo *nexus_info,ExceptionInfo *exception) -% -% A description of each parameter follows: -% -% o image: the image. -% -% o nexus_info: the cache nexus to clip. -% -% o exception: return any errors or warnings in this structure. -% -*/ -static MagickBooleanType MaskPixelCacheNexus(Image *image,NexusInfo *nexus_info, - ExceptionInfo *exception) -{ - CacheInfo - *cache_info; - - MagickSizeType - number_pixels; - - NexusInfo - **clip_nexus, - **image_nexus; - - register const Quantum - *restrict p, - *restrict r; - - register Quantum - *restrict q; - - register ssize_t - x; - - /* - Prevent updates to image pixels specified by the mask. - */ - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - if (image->mask == (Image *) NULL) - return(MagickFalse); - cache_info=(CacheInfo *) image->cache; - if (cache_info == (Cache) NULL) - return(MagickFalse); - image_nexus=AcquirePixelCacheNexus(1); - clip_nexus=AcquirePixelCacheNexus(1); - if ((image_nexus == (NexusInfo **) NULL) || - (clip_nexus == (NexusInfo **) NULL)) - ThrowBinaryException(CacheError,"UnableToGetCacheNexus",image->filename); - p=(const Quantum *) GetAuthenticPixelCacheNexus(image, - nexus_info->region.x,nexus_info->region.y,nexus_info->region.width, - nexus_info->region.height,image_nexus[0],exception); - q=nexus_info->pixels; - r=GetVirtualPixelsFromNexus(image->mask,MaskVirtualPixelMethod, - nexus_info->region.x,nexus_info->region.y,nexus_info->region.width, - nexus_info->region.height,clip_nexus[0],exception); - number_pixels=(MagickSizeType) nexus_info->region.width* - nexus_info->region.height; - for (x=0; x < (ssize_t) number_pixels; x++) - { - MagickRealType - alpha, - Da, - gamma, - Sa; - - register ssize_t - i; - - if ((p == (const Quantum *) NULL) || (r == (const Quantum *) NULL)) - break; - Sa=QuantumScale*GetPixelIntensity(image->mask,r); - Da=QuantumScale*GetPixelAlpha(image,q); - alpha=Sa*(-Da)+Sa+Da; - gamma=1.0/(fabs(alpha) <= MagickEpsilon ? 1.0 : alpha); - for (i=0; i < (ssize_t) image->number_channels; i++) - { - MagickRealType - Dc, - pixel, - Sc; - - PixelChannel - channel; - - PixelTrait - traits; - - channel=GetPixelChannelMapChannel(image,i); - traits=GetPixelChannelMapTraits(image,channel); - if (traits == UndefinedPixelTrait) - continue; - Sc=(MagickRealType) p[i]; - Dc=(MagickRealType) q[i]; - pixel=gamma*(Sa*Sc-Sa*Da*Dc+Da*Dc); - q[i]=ClampToQuantum(pixel); - } - p+=GetPixelChannels(image); - q+=GetPixelChannels(image); - r+=GetPixelChannels(image->mask); - } - clip_nexus=DestroyPixelCacheNexus(clip_nexus,1); - image_nexus=DestroyPixelCacheNexus(image_nexus,1); - if (x < (ssize_t) number_pixels) - return(MagickFalse); - return(MagickTrue); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % + O p e n P i x e l C a c h e % % % % % @@ -3987,6 +3753,7 @@ static MagickBooleanType OpenPixelCache(Image *image,const MapMode mode, cache_info->storage_class=image->storage_class; cache_info->colorspace=image->colorspace; cache_info->matte=image->matte; + cache_info->masky=image->masky; cache_info->rows=image->rows; cache_info->columns=image->columns; InitializePixelChannelMap(image); @@ -5021,8 +4788,7 @@ static Quantum *SetPixelCacheNexusPixels(const Image *image, if (cache_info->type == UndefinedCache) return((Quantum *) NULL); nexus_info->region=(*region); - if ((cache_info->type != DiskCache) && (cache_info->type != PingCache) && - (image->clip_mask == (Image *) NULL) && (image->mask == (Image *) NULL)) + if ((cache_info->type != DiskCache) && (cache_info->type != PingCache)) { ssize_t x, @@ -5188,12 +4954,6 @@ MagickPrivate MagickBooleanType SyncAuthenticPixelCacheNexus(Image *image, assert(cache_info->signature == MagickSignature); if (cache_info->type == UndefinedCache) return(MagickFalse); - if ((image->clip_mask != (Image *) NULL) && - (ClipPixelCacheNexus(image,nexus_info,exception) == MagickFalse)) - return(MagickFalse); - if ((image->mask != (Image *) NULL) && - (MaskPixelCacheNexus(image,nexus_info,exception) == MagickFalse)) - return(MagickFalse); if (IsPixelAuthentic(cache_info,nexus_info) != MagickFalse) return(MagickTrue); assert(cache_info->signature == MagickSignature); diff --git a/MagickCore/compare.c b/MagickCore/compare.c index 265c5eeb6..6d638e040 100644 --- a/MagickCore/compare.c +++ b/MagickCore/compare.c @@ -216,6 +216,13 @@ MagickExport Image *CompareImages(Image *image,const Image *reconstruct_image, i; difference=MagickFalse; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + r+=GetPixelChannels(highlight_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -353,6 +360,12 @@ static MagickBooleanType GetAbsoluteDistortion(const Image *image, i; difference=MagickFalse; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -468,6 +481,12 @@ static MagickBooleanType GetFuzzDistortion(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -563,6 +582,12 @@ static MagickBooleanType GetMeanAbsoluteDistortion(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -655,6 +680,12 @@ static MagickBooleanType GetMeanErrorPerPixel(Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -747,6 +778,12 @@ static MagickBooleanType GetMeanSquaredDistortion(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -855,6 +892,12 @@ static MagickBooleanType GetNormalizedCrossCorrelationDistortion( register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -877,7 +920,7 @@ static MagickBooleanType GetNormalizedCrossCorrelationDistortion( reconstruct_statistics[channel].mean); } p+=GetPixelChannels(image); - q+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); } if (image->progress_monitor != (MagickProgressMonitor) NULL) { @@ -958,8 +1001,8 @@ static MagickBooleanType GetPeakAbsoluteDistortion(const Image *image, if (status == MagickFalse) continue; p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); - q=GetCacheViewVirtualPixels(reconstruct_view,0,y, - reconstruct_image->columns,1,exception); + q=GetCacheViewVirtualPixels(reconstruct_view,0,y,reconstruct_image->columns, + 1,exception); if ((p == (const Quantum *) NULL) || (q == (const Quantum *) NULL)) { status=MagickFalse; @@ -971,6 +1014,12 @@ static MagickBooleanType GetPeakAbsoluteDistortion(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -999,7 +1048,7 @@ static MagickBooleanType GetPeakAbsoluteDistortion(const Image *image, channel_distortion[CompositePixelChannel]=distance; } p+=GetPixelChannels(image); - q+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); } #if defined(MAGICKCORE_OPENMP_SUPPORT) #pragma omp critical (MagickCore_GetPeakAbsoluteError) @@ -1379,6 +1428,12 @@ MagickExport MagickBooleanType IsImagesEqual(Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(reconstruct_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -1576,6 +1631,11 @@ MagickExport Image *SimilarityImage(Image *image,const Image *reference, offset->x=x; offset->y=y; } + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/composite.c b/MagickCore/composite.c index 7532102a0..b12212d18 100644 --- a/MagickCore/composite.c +++ b/MagickCore/composite.c @@ -394,6 +394,11 @@ static MagickBooleanType CompositeOverImage(Image *image, */ (void) GetOneVirtualPixel(composite_image,x-x_offset,y-y_offset, source,exception); + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -405,8 +410,7 @@ static MagickBooleanType CompositeOverImage(Image *image, channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); - composite_traits=GetPixelChannelMapTraits(composite_image, - channel); + composite_traits=GetPixelChannelMapTraits(composite_image,channel); if ((traits == UndefinedPixelTrait) || (composite_traits == UndefinedPixelTrait)) continue; @@ -661,6 +665,12 @@ MagickExport MagickBooleanType CompositeImage(Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(composite_image); + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(composite_image); i++) { PixelChannel @@ -1234,6 +1244,11 @@ MagickExport MagickBooleanType CompositeImage(Image *image, */ (void) GetOneVirtualPixel(composite_image,x-x_offset,y-y_offset, source,exception); + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -1402,6 +1417,12 @@ MagickExport MagickBooleanType CompositeImage(Image *image, break; } } + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(composite_image); + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { double @@ -2390,6 +2411,12 @@ MagickExport MagickBooleanType TextureImage(Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(texture_image); + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(texture_image); i++) { PixelChannel diff --git a/MagickCore/constitute.c b/MagickCore/constitute.c index c9a35eb5c..6014519cc 100644 --- a/MagickCore/constitute.c +++ b/MagickCore/constitute.c @@ -1033,17 +1033,6 @@ MagickExport MagickBooleanType WriteImage(const ImageInfo *image_info, if (*write_info->magick == '\0') (void) CopyMagickString(write_info->magick,image->magick,MaxTextExtent); (void) SetImageInfo(write_info,1,sans_exception); - if (LocaleCompare(write_info->magick,"clipmask") == 0) - { - if (image->clip_mask == (Image *) NULL) - { - (void) ThrowMagickException(exception,GetMagickModule(), - OptionError,"NoClipPathDefined","`%s'",image->filename); - return(MagickFalse); - } - image=image->clip_mask; - (void) SetImageInfo(write_info,1,sans_exception); - } (void) CopyMagickString(filename,image->filename,MaxTextExtent); (void) CopyMagickString(image->filename,write_info->filename,MaxTextExtent); domain=CoderPolicyDomain; diff --git a/MagickCore/decorate.c b/MagickCore/decorate.c index 018f32006..d0b30bfa3 100644 --- a/MagickCore/decorate.c +++ b/MagickCore/decorate.c @@ -703,6 +703,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for (x=0; x < y; x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -722,6 +727,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for ( ; x < (ssize_t) (image->columns-y); x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -741,6 +751,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for ( ; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -792,6 +807,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for (x=0; x < (ssize_t) raise_info->width; x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -813,6 +833,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, q+=GetPixelChannels(image); for ( ; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -864,6 +889,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for (x=0; x < (ssize_t) (image->rows-y); x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -902,6 +932,11 @@ MagickExport MagickBooleanType RaiseImage(Image *image, } for ( ; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/draw.c b/MagickCore/draw.c index 7177eadda..f431d0e31 100644 --- a/MagickCore/draw.c +++ b/MagickCore/draw.c @@ -1392,7 +1392,10 @@ MagickExport MagickBooleanType DrawClipPath(Image *image, const DrawInfo *draw_info,const char *name,ExceptionInfo *exception) { char - clip_mask[MaxTextExtent]; + filename[MaxTextExtent]; + + Image + *clip_mask; const char *value; @@ -1408,26 +1411,17 @@ MagickExport MagickBooleanType DrawClipPath(Image *image, if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(draw_info != (const DrawInfo *) NULL); - (void) FormatLocaleString(clip_mask,MaxTextExtent,"%s",name); - value=GetImageArtifact(image,clip_mask); + (void) FormatLocaleString(filename,MaxTextExtent,"%s",name); + value=GetImageArtifact(image,filename); if (value == (const char *) NULL) return(MagickFalse); - if (image->clip_mask == (Image *) NULL) - { - Image - *clip_mask; - - clip_mask=CloneImage(image,image->columns,image->rows,MagickTrue, - exception); - if (clip_mask == (Image *) NULL) - return(MagickFalse); - (void) SetImageClipMask(image,clip_mask,exception); - clip_mask=DestroyImage(clip_mask); - } + clip_mask=CloneImage(image,image->columns,image->rows,MagickTrue,exception); + if (clip_mask == (Image *) NULL) + return(MagickFalse); (void) QueryColorCompliance("#0000",AllCompliance, - &image->clip_mask->background_color,exception); - image->clip_mask->background_color.alpha=(Quantum) TransparentAlpha; - (void) SetImageBackgroundColor(image->clip_mask,exception); + &clip_mask->background_color,exception); + clip_mask->background_color.alpha=(Quantum) TransparentAlpha; + (void) SetImageBackgroundColor(clip_mask,exception); if (image->debug != MagickFalse) (void) LogMagickEvent(DrawEvent,GetMagickModule(),"\nbegin clip-path %s", draw_info->clip_mask); @@ -1436,9 +1430,11 @@ MagickExport MagickBooleanType DrawClipPath(Image *image, (void) QueryColorCompliance("#ffffff",AllCompliance,&clone_info->fill, exception); clone_info->clip_mask=(char *) NULL; - status=DrawImage(image->clip_mask,clone_info,exception); - status|=NegateImage(image->clip_mask,MagickFalse,exception); + status|=NegateImage(clip_mask,MagickFalse,exception); + (void) SetImageMask(image,clip_mask,exception); + clip_mask=DestroyImage(clip_mask); clone_info=DestroyDrawInfo(clone_info); + status=DrawImage(image,clone_info,exception); if (image->debug != MagickFalse) (void) LogMagickEvent(DrawEvent,GetMagickModule(),"end clip-path"); return(status != 0 ? MagickTrue : MagickFalse); @@ -2250,7 +2246,7 @@ MagickExport MagickBooleanType DrawImage(Image *image,const DrawInfo *draw_info, if (graphic_context[n]->clip_mask != (char *) NULL) if (LocaleCompare(graphic_context[n]->clip_mask, graphic_context[n-1]->clip_mask) != 0) - (void) SetImageClipMask(image,(Image *) NULL,exception); + image->masky=MagickFalse; graphic_context[n]=DestroyDrawInfo(graphic_context[n]); n--; break; diff --git a/MagickCore/effect.c b/MagickCore/effect.c index e0072b87d..6459f39be 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -346,6 +346,12 @@ MagickExport Image *AdaptiveBlurImage(const Image *image,const double radius, break; center=(ssize_t) GetPixelChannels(image)*(width-j)* ((width-j)/2L)+GetPixelChannels(image)*((width-j)/2L); + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(blur_image); + r+=GetPixelChannels(edge_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -668,6 +674,12 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, break; center=(ssize_t) GetPixelChannels(image)*(width-j)* ((width-j)/2L)+GetPixelChannels(image)*((width-j)/2); + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(sharp_image); + r+=GetPixelChannels(edge_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -972,6 +984,12 @@ MagickExport Image *BlurImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(blur_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -1094,6 +1112,12 @@ MagickExport Image *BlurImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(blur_image,p) != 0) + { + p+=GetPixelChannels(blur_image); + q+=GetPixelChannels(blur_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(blur_image); i++) { MagickRealType @@ -1336,6 +1360,12 @@ MagickExport Image *ConvolveImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(convolve_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -2182,6 +2212,12 @@ MagickExport Image *MotionBlurImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(blur_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -2980,6 +3016,12 @@ MagickExport Image *RadialBlurImage(const Image *image,const double angle, if (step >= n) step=n-1; } + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(blur_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -3256,6 +3298,12 @@ MagickExport Image *SelectiveBlurImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(blur_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -3542,6 +3590,14 @@ MagickExport Image *ShadeImage(const Image *image,const MagickBooleanType gray, shade=distance/sqrt((double) normal_distance); } } + if (GetPixelMask(image,pre) != 0) + { + pre+=GetPixelChannels(image); + center+=GetPixelChannels(image); + post+=GetPixelChannels(image); + q+=GetPixelChannels(shade_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3953,6 +4009,12 @@ MagickExport Image *UnsharpMaskImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(unsharp_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType diff --git a/MagickCore/enhance.c b/MagickCore/enhance.c index 2b54d699c..a574ee91e 100644 --- a/MagickCore/enhance.c +++ b/MagickCore/enhance.c @@ -379,6 +379,11 @@ MagickExport MagickBooleanType ClutImage(Image *image,const Image *clut_image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(clut_image); i++) { PixelChannel @@ -1225,6 +1230,11 @@ MagickExport MagickBooleanType ContrastStretchImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1380,6 +1390,12 @@ MagickExport Image *EnhanceImage(const Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(enhance_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -1688,6 +1704,11 @@ MagickExport MagickBooleanType EqualizeImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1856,6 +1877,11 @@ MagickExport MagickBooleanType GammaImage(Image *image,const double gamma, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -2228,6 +2254,11 @@ MagickExport MagickBooleanType LevelImage(Image *image,const double black_point, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -2389,6 +2420,11 @@ MagickExport MagickBooleanType LevelizeImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3068,7 +3104,8 @@ MagickExport MagickBooleanType NegateImage(Image *image, register ssize_t i; - if (IsPixelGray(image,q) != MagickFalse) + if ((GetPixelMask(image,q) != 0) || + (IsPixelGray(image,q) != MagickFalse)) { q+=GetPixelChannels(image); continue; @@ -3135,6 +3172,11 @@ MagickExport MagickBooleanType NegateImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3361,6 +3403,11 @@ MagickExport MagickBooleanType SigmoidalContrastImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/fx.c b/MagickCore/fx.c index ff252abfe..d0989a647 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -335,6 +335,12 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(noise_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -751,6 +757,12 @@ MagickExport Image *ColorizeImage(const Image *image,const char *blend, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(colorize_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3098,6 +3110,12 @@ MagickExport Image *FxImage(const Image *image,const char *expression, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(fx_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -3298,6 +3316,12 @@ MagickExport Image *ImplodeImage(const Image *image,const double amount, /* Determine if the pixel is within an ellipse. */ + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(implode_image); + continue; + } delta.x=scale.x*(double) (x-center.x); distance=delta.x*delta.x+delta.y*delta.y; if (distance >= (radius*radius)) @@ -3532,7 +3556,12 @@ MagickExport Image *MorphImages(const Image *image, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + if (GetPixelMask(morph_image,p) != 0) + { + p+=GetPixelChannels(morph_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(morph_image); i++) { PixelChannel channel; @@ -4468,6 +4497,11 @@ MagickExport Image *SketchImage(const Image *image,const double radius, register ssize_t i; + if (GetPixelMask(random_image,q) != 0) + { + q+=GetPixelChannels(random_image); + continue; + } value=GetPseudoRandomValue(random_info[id]); for (i=0; i < (ssize_t) GetPixelChannels(random_image); i++) { @@ -4629,6 +4663,11 @@ MagickExport MagickBooleanType SolarizeImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -5129,6 +5168,12 @@ MagickExport Image *SwirlImage(const Image *image,double degrees, /* Determine if the pixel is within an ellipse. */ + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(swirl_image); + continue; + } delta.x=scale.x*(double) (x-center.x); distance=delta.x*delta.x+delta.y*delta.y; if (distance >= (radius*radius)) @@ -5355,6 +5400,12 @@ MagickExport Image *TintImage(const Image *image,const char *blend, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(tint_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/image.c b/MagickCore/image.c index da9bda095..ddc5cbe82 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -189,7 +189,6 @@ MagickExport Image *AcquireImage(const ImageInfo *image_info, image->resolution.y=DefaultResolution; image->units=PixelsPerInchResolution; GetTimerInfo(&image->timer); - image->ping=MagickFalse; image->cache=AcquirePixelCache(0); image->channel_mask=DefaultChannels; image->channel_map=AcquirePixelChannelMap(); @@ -546,6 +545,12 @@ MagickExport Image *AppendImages(const Image *images, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(append_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -723,7 +728,7 @@ MagickExport MagickBooleanType ClipImagePath(Image *image,const char *pathname, (void) NegateImage(clip_mask,MagickFalse,exception); (void) FormatLocaleString(clip_mask->magick_filename,MaxTextExtent, "8BIM:1999,2998:%s\nPS",pathname); - (void) SetImageClipMask(image,clip_mask,exception); + (void) SetImageMask(image,clip_mask,exception); clip_mask=DestroyImage(clip_mask); return(MagickTrue); } @@ -798,6 +803,7 @@ MagickExport Image *CloneImage(const Image *image,const size_t columns, clone_image->number_meta_channels=image->number_meta_channels; clone_image->metacontent_extent=image->metacontent_extent; clone_image->colorspace=image->colorspace; + clone_image->masky=image->masky; clone_image->matte=image->matte; clone_image->columns=image->columns; clone_image->rows=image->rows; @@ -837,8 +843,6 @@ MagickExport Image *CloneImage(const Image *image,const size_t columns, clone_image->next=image->next; clone_image->previous=image->previous; clone_image->list=NewImageList(); - clone_image->clip_mask=NewImageList(); - clone_image->mask=NewImageList(); if (detach == MagickFalse) clone_image->blob=ReferenceBlob(image->blob); else @@ -856,22 +860,9 @@ MagickExport Image *CloneImage(const Image *image,const size_t columns, (void) CloneString(&clone_image->montage,image->montage); if (image->directory != (char *) NULL) (void) CloneString(&clone_image->directory,image->directory); - if (image->clip_mask != (Image *) NULL) - clone_image->clip_mask=CloneImage(image->clip_mask,0,0,MagickTrue, - exception); - if (image->mask != (Image *) NULL) - clone_image->mask=CloneImage(image->mask,0,0,MagickTrue,exception); clone_image->cache=ReferencePixelCache(image->cache); return(clone_image); } - if ((columns == image->columns) && (rows == image->rows)) - { - if (image->clip_mask != (Image *) NULL) - clone_image->clip_mask=CloneImage(image->clip_mask,0,0,MagickTrue, - exception); - if (image->mask != (Image *) NULL) - clone_image->mask=CloneImage(image->mask,0,0,MagickTrue,exception); - } scale=(MagickRealType) columns/(MagickRealType) image->columns; clone_image->page.width=(size_t) floor(scale*image->page.width+0.5); clone_image->page.x=(ssize_t) ceil(scale*image->page.x-0.5); @@ -1190,10 +1181,6 @@ MagickExport Image *DestroyImage(Image *image) */ DestroyImagePixels(image); image->channel_map=DestroyPixelChannelMap(image->channel_map); - if (image->clip_mask != (Image *) NULL) - image->clip_mask=DestroyImage(image->clip_mask); - if (image->mask != (Image *) NULL) - image->mask=DestroyImage(image->mask); if (image->montage != (char *) NULL) image->montage=DestroyString(image->montage); if (image->directory != (char *) NULL) @@ -1347,40 +1334,6 @@ MagickExport MagickBooleanType GetImageAlphaChannel(const Image *image) % % % % % % -% G e t I m a g e C l i p M a s k % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% GetImageClipMask() returns the clip path associated with the image. -% -% The format of the GetImageClipMask method is: -% -% Image *GetImageClipMask(const Image *image,ExceptionInfo *exception) -% -% A description of each parameter follows: -% -% o image: the image. -% -*/ -MagickExport Image *GetImageClipMask(const Image *image, - ExceptionInfo *exception) -{ - assert(image != (const Image *) NULL); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); - assert(image->signature == MagickSignature); - if (image->clip_mask == (Image *) NULL) - return((Image *) NULL); - return(CloneImage(image->clip_mask,0,0,MagickTrue,exception)); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % % G e t I m a g e I n f o % % % % % @@ -1486,13 +1439,67 @@ MagickExport FILE *GetImageInfoFile(const ImageInfo *image_info) */ MagickExport Image *GetImageMask(const Image *image,ExceptionInfo *exception) { - assert(image != (const Image *) NULL); + CacheView + *mask_view, + *image_view; + + Image + *mask_image; + + MagickBooleanType + status; + + ssize_t + y; + + /* + Get image mask. + */ + assert(image != (Image *) NULL); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); assert(image->signature == MagickSignature); - if (image->mask == (Image *) NULL) + mask_image=CloneImage(image,image->columns,image->rows,MagickTrue,exception); + if (mask_image == (Image *) NULL) return((Image *) NULL); - return(CloneImage(image->mask,0,0,MagickTrue,exception)); + status=MagickTrue; + mask_image->colorspace=GRAYColorspace; + mask_image->masky=MagickFalse; + image_view=AcquireCacheView(image); + mask_view=AcquireCacheView(mask_image); + for (y=0; y < (ssize_t) image->rows; y++) + { + register const Quantum + *restrict p; + + register Quantum + *restrict q; + + register ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception); + q=GetCacheViewAuthenticPixels(mask_view,0,y,mask_image->columns,1, + exception); + if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelGray(mask_image,GetPixelMask(image,p),q); + p+=GetPixelChannels(image); + q+=GetPixelChannels(mask_image); + } + if (SyncCacheViewAuthenticPixels(mask_view,exception) == MagickFalse) + status=MagickFalse; + } + mask_view=DestroyCacheView(mask_view); + image_view=DestroyCacheView(image_view); + return(mask_image); } /* @@ -1816,6 +1823,11 @@ MagickExport MagickBooleanType IsHighDynamicRangeImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -2280,6 +2292,12 @@ MagickExport Image *SeparateImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(separate_image); + continue; + } SetPixelChannel(separate_image,GrayPixelChannel,0,q); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { @@ -2288,7 +2306,7 @@ MagickExport Image *SeparateImage(const Image *image, PixelTrait traits; - + channel=GetPixelChannelMapChannel(image,i); traits=GetPixelChannelMapTraits(image,channel); if ((traits == UndefinedPixelTrait) || @@ -2840,60 +2858,6 @@ MagickExport MagickBooleanType SetImageStorageClass(Image *image, % % % % % % -% S e t I m a g e C l i p M a s k % -% % -% % -% % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% SetImageClipMask() associates a clip path with the image. The clip path -% must be the same dimensions as the image. Set any pixel component of -% the clip path to TransparentAlpha to prevent that corresponding image -% pixel component from being updated when SyncAuthenticPixels() is applied. -% -% The format of the SetImageClipMask method is: -% -% MagickBooleanType SetImageClipMask(Image *image,const Image *clip_mask, -% ExceptionInfo *exception) -% -% A description of each parameter follows: -% -% o image: the image. -% -% o clip_mask: the image clip mask, NULL undefines. -% -% o exception: return any errors or warnings in this structure. -% -*/ -MagickExport MagickBooleanType SetImageClipMask(Image *image, - const Image *clip_mask,ExceptionInfo *exception) -{ - assert(image != (Image *) NULL); - if (image->debug != MagickFalse) - (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); - assert(image->signature == MagickSignature); - if (clip_mask != (const Image *) NULL) - if ((clip_mask->columns != image->columns) || - (clip_mask->rows != image->rows)) - ThrowBinaryException(ImageError,"ImageSizeDiffers",image->filename); - if (image->clip_mask != (Image *) NULL) - image->clip_mask=DestroyImage(image->clip_mask); - image->clip_mask=NewImageList(); - if (clip_mask == (Image *) NULL) - return(MagickTrue); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - image->clip_mask=CloneImage(clip_mask,0,0,MagickTrue,exception); - if (image->clip_mask == (Image *) NULL) - return(MagickFalse); - return(MagickTrue); -} - -/* -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% % -% % -% % % S e t I m a g e E x t e n t % % % % % @@ -3367,27 +3331,69 @@ MagickExport void SetImageInfoFile(ImageInfo *image_info,FILE *file) % o exception: return any errors or warnings in this structure. % */ -MagickExport MagickBooleanType SetImageMask(Image *image, - const Image *mask,ExceptionInfo *exception) +MagickExport MagickBooleanType SetImageMask(Image *image,const Image *mask, + ExceptionInfo *exception) { + CacheView + *mask_view, + *image_view; + + MagickBooleanType + status; + + ssize_t + y; + + /* + Set image mask. + */ assert(image != (Image *) NULL); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); assert(image->signature == MagickSignature); - if (mask != (const Image *) NULL) - if ((mask->columns != image->columns) || (mask->rows != image->rows)) - ThrowBinaryException(ImageError,"ImageSizeDiffers",image->filename); - if (image->mask != (Image *) NULL) - image->mask=DestroyImage(image->mask); - image->mask=NewImageList(); - if (mask == (Image *) NULL) - return(MagickTrue); - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); - image->mask=CloneImage(mask,0,0,MagickTrue,exception); - if (image->mask == (Image *) NULL) - return(MagickFalse); - return(MagickTrue); + if (mask == (const Image *) NULL) + { + image->masky=MagickFalse; + return(MagickTrue); + } + if ((mask->columns != image->columns) || (mask->rows != image->rows)) + ThrowBinaryException(ImageError,"ImageSizeDiffers",image->filename); + status=MagickTrue; + image->masky=MagickTrue; + image_view=AcquireCacheView(image); + mask_view=AcquireCacheView(mask); + for (y=0; y < (ssize_t) image->rows; y++) + { + register const Quantum + *restrict p; + + register Quantum + *restrict q; + + register ssize_t + x; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(mask_view,0,y,mask->columns,1,exception); + q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception); + if ((p == (const Quantum *) NULL) || (q == (Quantum *) NULL)) + { + status=MagickFalse; + continue; + } + for (x=0; x < (ssize_t) image->columns; x++) + { + SetPixelMask(image,GetPixelGray(mask,p),q); + p+=GetPixelChannels(mask); + q+=GetPixelChannels(image); + } + if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse) + status=MagickFalse; + } + mask_view=DestroyCacheView(mask_view); + image_view=DestroyCacheView(image_view); + return(status); } /* diff --git a/MagickCore/image.h b/MagickCore/image.h index d4403b8bb..5fdd1bcad 100644 --- a/MagickCore/image.h +++ b/MagickCore/image.h @@ -233,9 +233,6 @@ struct _Image DisposeType dispose; /* GIF animation disposal method */ - struct _Image - *clip_mask; - size_t scene, /* index of image in multi-image file */ delay; /* Animation delay time */ @@ -256,9 +253,6 @@ struct _Image MagickBooleanType black_point_compensation; - struct _Image - *mask; - RectangleInfo tile_offset; @@ -278,6 +272,9 @@ struct _Image MagickBooleanType ping; + MagickBooleanType + masky; + size_t number_channels, number_meta_channels, @@ -520,7 +517,6 @@ extern MagickExport MagickBooleanType SetImageAlpha(Image *,const Quantum,ExceptionInfo *), SetImageAlphaChannel(Image *,const AlphaChannelType,ExceptionInfo *), SetImageBackgroundColor(Image *,ExceptionInfo *), - SetImageClipMask(Image *,const Image *,ExceptionInfo *), SetImageColor(Image *,const PixelInfo *,ExceptionInfo *), SetImageExtent(Image *,const size_t,const size_t,ExceptionInfo *), SetImageInfo(ImageInfo *,const unsigned int,ExceptionInfo *), diff --git a/MagickCore/magick-config.h b/MagickCore/magick-config.h index 3db76f669..df87e50c3 100644 --- a/MagickCore/magick-config.h +++ b/MagickCore/magick-config.h @@ -12,7 +12,9 @@ /* #undef AUTOTRACE_DELEGATE */ /* Define if coders and filters are to be built as modules. */ -/* #undef BUILD_MODULES */ +#ifndef MAGICKCORE_BUILD_MODULES +#define MAGICKCORE_BUILD_MODULES 1 +#endif /* Define if you have the bzip2 library */ #ifndef MAGICKCORE_BZLIB_DELEGATE @@ -95,7 +97,9 @@ #endif /* Define if you have FlashPIX library */ -/* #undef FPX_DELEGATE */ +#ifndef MAGICKCORE_FPX_DELEGATE +#define MAGICKCORE_FPX_DELEGATE 1 +#endif /* Define if you have FreeType (TrueType font) library */ #ifndef MAGICKCORE_FREETYPE_DELEGATE @@ -219,7 +223,9 @@ #endif /* Define to 1 if you have the header file. */ -/* #undef HAVE_CL_CL_H */ +#ifndef MAGICKCORE_HAVE_CL_CL_H +#define MAGICKCORE_HAVE_CL_CL_H 1 +#endif /* Define to 1 if you have the header file. */ #ifndef MAGICKCORE_HAVE_COMPLEX_H @@ -442,15 +448,15 @@ #endif /* Define if you have the header file. */ -#ifndef MAGICKCORE_HAVE_LCMS2_H -#define MAGICKCORE_HAVE_LCMS2_H 1 -#endif +/* #undef HAVE_LCMS2_H */ /* Define if you have the header file. */ /* #undef HAVE_LCMS2_LCMS2_H */ /* Define if you have the header file. */ -/* #undef HAVE_LCMS_H */ +#ifndef MAGICKCORE_HAVE_LCMS_H +#define MAGICKCORE_HAVE_LCMS_H 1 +#endif /* Define if you have the header file. */ /* #undef HAVE_LCMS_LCMS_H */ @@ -1188,7 +1194,9 @@ #endif /* Define if you have JBIG library */ -/* #undef JBIG_DELEGATE */ +#ifndef MAGICKCORE_JBIG_DELEGATE +#define MAGICKCORE_JBIG_DELEGATE 1 +#endif /* Define if you have JPEG version 2 "Jasper" library */ #ifndef MAGICKCORE_JP2_DELEGATE @@ -1217,7 +1225,9 @@ #endif /* Define if you have LQR library */ -/* #undef LQR_DELEGATE */ +#ifndef MAGICKCORE_LQR_DELEGATE +#define MAGICKCORE_LQR_DELEGATE 1 +#endif /* Define if using libltdl to support dynamically loadable modules */ #ifndef MAGICKCORE_LTDL_DELEGATE @@ -1229,7 +1239,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/atlas:/usr/lib/llvm:/usr/lib64/llvm:/usr/local/lib:/usr/lib64/mysql:/usr/lib64/qt-3.3/lib:/usr/lib64/tcl8.5/tclx8.4:/usr/lib64/tcl8.5:/usr/lib64/tracker-0.12:/usr/lib/wine/:/usr/lib64/wine/:/usr/lib64/xulrunner-2" +#define MAGICKCORE_LT_DLSEARCH_PATH "/lib64:/usr/lib64:/lib:/usr/lib:/usr/lib64/R/lib:/usr/lib64/atlas:/usr/lib64/freetype-freeworld:/opt/modules/pkg/intel/f77/10.0.025/lib:/opt/intel/lib/intel64:/usr/lib/llvm:/usr/lib64/llvm:/usr/local/lib:/usr/lib64/mysql:/usr/lib64/nvidia:/usr/lib64/openmotif:/usr/lib64/qt-3.3/lib:/usr/lib64/tracker-0.12:/usr/lib64/xulrunner-2" #endif /* The archive extension */ @@ -1283,7 +1293,9 @@ /* #undef NO_MINUS_C_MINUS_O */ /* Define if you have OPENEXR library */ -/* #undef OPENEXR_DELEGATE */ +#ifndef MAGICKCORE_OPENEXR_DELEGATE +#define MAGICKCORE_OPENEXR_DELEGATE 1 +#endif /* Name of package */ #ifndef MAGICKCORE_PACKAGE @@ -1511,7 +1523,9 @@ #endif /* Define if you have WEBP library */ -/* #undef WEBP_DELEGATE */ +#ifndef MAGICKCORE_WEBP_DELEGATE +#define MAGICKCORE_WEBP_DELEGATE 1 +#endif /* Define to use the Windows GDI32 library */ /* #undef WINGDI32_DELEGATE */ @@ -1581,7 +1595,9 @@ /* #undef _MINIX */ /* Define this for the OpenCL Accelerator */ -/* #undef _OPENCL */ +#ifndef MAGICKCORE__OPENCL +#define MAGICKCORE__OPENCL 1 +#endif /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ diff --git a/MagickCore/paint.c b/MagickCore/paint.c index 27c60d23c..db11cb9de 100644 --- a/MagickCore/paint.c +++ b/MagickCore/paint.c @@ -653,6 +653,12 @@ MagickExport Image *OilPaintImage(const Image *image,const double radius, } k+=(ssize_t) (image->columns+width); } + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(paint_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/pixel-accessor.h b/MagickCore/pixel-accessor.h index c5f4bcb36..4e64e45f8 100644 --- a/MagickCore/pixel-accessor.h +++ b/MagickCore/pixel-accessor.h @@ -246,6 +246,19 @@ static inline PixelTrait GetPixelMagentaTraits(const Image *restrict image) return(image->channel_map[MagentaPixelChannel].traits); } +static inline Quantum GetPixelMask(const Image *restrict image, + const Quantum *restrict pixel) +{ + if (image->channel_map[MaskPixelChannel].traits == UndefinedPixelTrait) + return(0); + return(pixel[image->channel_map[MaskPixelChannel].offset]); +} + +static inline PixelTrait GetPixelMaskTraits(const Image *restrict image) +{ + return(image->channel_map[MaskPixelChannel].traits); +} + static inline size_t GetPixelMetaChannels(const Image *restrict image) { return(image->number_meta_channels); @@ -630,6 +643,13 @@ static inline void SetPixelMagentaTraits(Image *image,const PixelTrait traits) image->channel_map[MagentaPixelChannel].traits=traits; } +static inline void SetPixelMask(const Image *restrict image, + const Quantum mask,Quantum *restrict pixel) +{ + if (image->channel_map[MaskPixelChannel].traits != UndefinedPixelTrait) + pixel[image->channel_map[MaskPixelChannel].offset]=mask; +} + static inline void SetPixelMetaChannels(Image *image, const size_t number_meta_channels) { diff --git a/MagickCore/pixel.c b/MagickCore/pixel.c index 00a73d4bd..6b99c6b73 100644 --- a/MagickCore/pixel.c +++ b/MagickCore/pixel.c @@ -3922,6 +3922,8 @@ MagickExport void InitializePixelChannelMap(Image *image) SetPixelChannelMap(image,AlphaPixelChannel,CopyPixelTrait,n++); if (image->storage_class == PseudoClass) SetPixelChannelMap(image,IndexPixelChannel,CopyPixelTrait,n++); + if (image->masky != MagickFalse) + SetPixelChannelMap(image,MaskPixelChannel,CopyPixelTrait,n++); assert((n+image->number_meta_channels) < MaxPixelChannels); for (i=0; i < (ssize_t) image->number_meta_channels; i++) SetPixelChannelMap(image,(PixelChannel) (MetaPixelChannel+i),CopyPixelTrait, @@ -5666,6 +5668,8 @@ MagickExport void SetPixelChannelMapMask(Image *image, } if (image->storage_class == PseudoClass) SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait); + if (image->masky != MagickFalse) + SetPixelChannelMapTraits(image,MaskPixelChannel,CopyPixelTrait); if (image->debug != MagickFalse) LogPixelChannels(image); } diff --git a/MagickCore/quantum-export.c b/MagickCore/quantum-export.c index 1f307ebb6..f8141166c 100644 --- a/MagickCore/quantum-export.c +++ b/MagickCore/quantum-export.c @@ -3237,6 +3237,11 @@ MagickExport size_t ExportQuantumPixels(const Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } Sa=QuantumScale*GetPixelAlpha(image,q); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { diff --git a/MagickCore/quantum-import.c b/MagickCore/quantum-import.c index 39a592399..f9d311fb1 100644 --- a/MagickCore/quantum-import.c +++ b/MagickCore/quantum-import.c @@ -3603,6 +3603,11 @@ MagickExport size_t ImportQuantumPixels(const Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } Sa=QuantumScale*GetPixelAlpha(image,q); gamma=1.0/(fabs(Sa) <= MagickEpsilon ? 1.0 : Sa); for (i=0; i < (ssize_t) GetPixelChannels(image); i++) diff --git a/MagickCore/resize.c b/MagickCore/resize.c index 358e573ae..1f665fe7c 100644 --- a/MagickCore/resize.c +++ b/MagickCore/resize.c @@ -1604,7 +1604,12 @@ MagickExport Image *InterpolativeResizeImage(const Image *image, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + if (GetPixelMask(resize_image,q) != 0) + { + q+=GetPixelChannels(resize_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(resize_image); i++) { PixelChannel channel; @@ -2249,7 +2254,12 @@ static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + if (GetPixelMask(resize_image,q) != 0) + { + q+=GetPixelChannels(resize_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(resize_image); i++) { MagickRealType alpha, @@ -2462,7 +2472,12 @@ static MagickBooleanType VerticalFilter(const ResizeFilter *resize_filter, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + if (GetPixelMask(resize_image,q) != 0) + { + q+=GetPixelChannels(resize_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(resize_image); i++) { MagickRealType alpha, @@ -2783,7 +2798,12 @@ MagickExport Image *SampleImage(const Image *image,const size_t columns, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(image); i++) + if (GetPixelMask(sample_image,q) != 0) + { + q+=GetPixelChannels(sample_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(sample_image); i++) { PixelChannel channel; @@ -2980,6 +3000,11 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns, break; for (x=0; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3020,6 +3045,11 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns, break; for (x=0; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3062,6 +3092,11 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns, break; for (x=0; x < (ssize_t) image->columns; x++) { + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -3111,6 +3146,11 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns, */ for (x=0; x < (ssize_t) scale_image->columns; x++) { + if (GetPixelMask(scale_image,q) != 0) + { + q+=GetPixelChannels(scale_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(scale_image); i++) { ssize_t @@ -3212,6 +3252,11 @@ MagickExport Image *ScaleImage(const Image *image,const size_t columns, */ for (x=0; x < (ssize_t) scale_image->columns; x++) { + if (GetPixelMask(scale_image,q) != 0) + { + q+=GetPixelChannels(scale_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(scale_image); i++) { channel=GetPixelChannelMapChannel(scale_image,i); diff --git a/MagickCore/shear.c b/MagickCore/shear.c index 43bfe5854..c22e8aaa9 100644 --- a/MagickCore/shear.c +++ b/MagickCore/shear.c @@ -1087,6 +1087,12 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, register ssize_t i; + if (GetPixelMask(image,tile_pixels) != 0) + { + tile_pixels-=width*GetPixelChannels(image); + q+=GetPixelChannels(rotate_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1173,6 +1179,11 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, i; q-=GetPixelChannels(rotate_image); + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1295,6 +1306,12 @@ MagickExport Image *IntegralRotateImage(const Image *image,size_t rotations, register ssize_t i; + if (GetPixelMask(image,tile_pixels) != 0) + { + tile_pixels+=width*GetPixelChannels(image); + q+=GetPixelChannels(rotate_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/signature.c b/MagickCore/signature.c index e44529023..4489d4391 100644 --- a/MagickCore/signature.c +++ b/MagickCore/signature.c @@ -524,6 +524,11 @@ MagickExport MagickBooleanType SignatureImage(Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index a06f38bf5..b9c7150d2 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -659,7 +659,12 @@ MagickExport Image *EvaluateImages(const Image *images, register ssize_t i; - for (i=0; i < (ssize_t) GetPixelChannels(evaluate_image); i++) + if (GetPixelMask(evaluate_image,p) != 0) + { + p+=GetPixelChannels(evaluate_image); + continue; + } + for (i=0; i < (ssize_t) GetPixelChannels(next); i++) { PixelChannel channel; @@ -719,6 +724,11 @@ MagickExport Image *EvaluateImages(const Image *images, register ssize_t i; + if (GetPixelMask(evaluate_image,q) != 0) + { + q+=GetPixelChannels(evaluate_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(evaluate_image); i++) { PixelChannel @@ -819,6 +829,11 @@ MagickExport MagickBooleanType EvaluateImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1041,6 +1056,11 @@ MagickExport MagickBooleanType FunctionImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1299,6 +1319,11 @@ MagickExport MagickBooleanType GetImageKurtosis(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1422,6 +1447,11 @@ MagickExport MagickBooleanType GetImageRange(const Image *image,double *minima, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1569,6 +1599,11 @@ MagickExport ChannelStatistics *GetImageStatistics(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -2242,6 +2277,12 @@ MagickExport Image *StatisticImage(const Image *image,const StatisticType type, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(statistic_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/threshold.c b/MagickCore/threshold.c index af8514013..535559c1d 100644 --- a/MagickCore/threshold.c +++ b/MagickCore/threshold.c @@ -238,6 +238,12 @@ MagickExport Image *AdaptiveThresholdImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(threshold_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -407,6 +413,11 @@ MagickExport MagickBooleanType BilevelImage(Image *image,const double threshold, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -557,6 +568,11 @@ MagickExport MagickBooleanType BlackThresholdImage(Image *image, n; n=0; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -701,6 +717,11 @@ MagickExport MagickBooleanType ClampImage(Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1323,6 +1344,11 @@ MagickExport MagickBooleanType OrderedPosterizeImage(Image *image, n; n=0; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1491,6 +1517,11 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { MagickRealType @@ -1654,6 +1685,11 @@ MagickExport MagickBooleanType WhiteThresholdImage(Image *image, n; n=0; + if (GetPixelMask(image,q) != 0) + { + q+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/transform.c b/MagickCore/transform.c index ec327c892..fa99fce76 100644 --- a/MagickCore/transform.c +++ b/MagickCore/transform.c @@ -190,6 +190,11 @@ MagickExport Image *ChopImage(const Image *image,const RectangleInfo *chop_info, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + q+=GetPixelChannels(chop_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -261,6 +266,12 @@ MagickExport Image *ChopImage(const Image *image,const RectangleInfo *chop_info, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(chop_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -278,6 +289,7 @@ MagickExport Image *ChopImage(const Image *image,const RectangleInfo *chop_info, continue; SetPixelChannel(chop_image,channel,p[i],q); } + p+=GetPixelChannels(chop_image); q+=GetPixelChannels(chop_image); } p+=GetPixelChannels(image); @@ -614,6 +626,12 @@ MagickExport Image *CropImage(const Image *image,const RectangleInfo *geometry, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(crop_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -968,6 +986,12 @@ MagickExport Image *ExcerptImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(excerpt_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1168,6 +1192,12 @@ MagickExport Image *FlipImage(const Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(flip_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1310,6 +1340,11 @@ MagickExport Image *FlopImage(const Image *image,ExceptionInfo *exception) i; q-=GetPixelChannels(flop_image); + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1437,6 +1472,12 @@ static inline MagickBooleanType CopyImageRegion(Image *destination, register ssize_t i; + if (GetPixelMask(source,p) != 0) + { + p+=GetPixelChannels(source); + q+=GetPixelChannels(destination); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(source); i++) { PixelChannel @@ -1755,6 +1796,12 @@ MagickExport Image *SpliceImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(splice_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1782,6 +1829,12 @@ MagickExport Image *SpliceImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(splice_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1851,6 +1904,12 @@ MagickExport Image *SpliceImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(splice_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -1878,6 +1937,12 @@ MagickExport Image *SpliceImage(const Image *image, register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(splice_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -2187,6 +2252,12 @@ MagickExport Image *TransposeImage(const Image *image,ExceptionInfo *exception) register ssize_t i; + if (GetPixelMask(image,q) != 0) + { + p+=GetPixelChannels(image); + q+=GetPixelChannels(transpose_image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel @@ -2334,6 +2405,11 @@ MagickExport Image *TransverseImage(const Image *image,ExceptionInfo *exception) i; q-=GetPixelChannels(transverse_image); + if (GetPixelMask(image,p) != 0) + { + p+=GetPixelChannels(image); + continue; + } for (i=0; i < (ssize_t) GetPixelChannels(image); i++) { PixelChannel diff --git a/MagickCore/version.h b/MagickCore/version.h index 718cdea6d..c01b83d52 100644 --- a/MagickCore/version.h +++ b/MagickCore/version.h @@ -27,14 +27,14 @@ extern "C" { */ #define MagickPackageName "ImageMagick" #define MagickCopyright "Copyright (C) 1999-2012 ImageMagick Studio LLC" -#define MagickSVNRevision "6592" +#define MagickSVNRevision "exported" #define MagickLibVersion 0x700 #define MagickLibVersionText "7.0.0" #define MagickLibVersionNumber 7,0,0 #define MagickLibAddendum "-0" #define MagickLibInterface 7 #define MagickLibMinInterface 7 -#define MagickReleaseDate "2012-01-25" +#define MagickReleaseDate "2012-01-29" #define MagickChangeDate "20110801" #define MagickAuthoritativeURL "http://www.imagemagick.org" #if defined(MAGICKCORE_OPENMP_SUPPORT) diff --git a/MagickWand/composite.c b/MagickWand/composite.c index b6d488613..4649c3054 100644 --- a/MagickWand/composite.c +++ b/MagickWand/composite.c @@ -1647,8 +1647,8 @@ WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info, /* Set a blending mask for the composition. */ - images->mask=mask_image; - (void) NegateImage(images->mask,MagickFalse,exception); + (void) NegateImage(mask_image,MagickFalse,exception); + (void) SetImageMask(image,mask_image,exception); } } status&=CompositeImageList(image_info,&images,composite_image, diff --git a/MagickWand/drawing-wand.c b/MagickWand/drawing-wand.c index caaaedaeb..661a840c3 100644 --- a/MagickWand/drawing-wand.c +++ b/MagickWand/drawing-wand.c @@ -6737,7 +6737,7 @@ WandExport MagickBooleanType PopDrawingWand(DrawingWand *wand) if (CurrentContext->clip_mask != (char *) NULL) if (LocaleCompare(CurrentContext->clip_mask, wand->graphic_context[wand->index-1]->clip_mask) != 0) - (void) SetImageClipMask(wand->image,(Image *) NULL); + (void) SetImageMask(wand->image,(Image *) NULL); #endif CurrentContext=DestroyDrawInfo(CurrentContext); wand->index--; diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c index 78a5d7bd1..989821825 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -3490,18 +3490,18 @@ WandExport MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand) % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% MagickGetImageClipMask() gets the image clip mask at the current image index. +% MagickGetImageMask() gets the image clip mask at the current image index. % -% The format of the MagickGetImageClipMask method is: +% The format of the MagickGetImageMask method is: % -% MagickWand *MagickGetImageClipMask(MagickWand *wand) +% MagickWand *MagickGetImageMask(MagickWand *wand) % % A description of each parameter follows: % % o wand: the magick wand. % */ -WandExport MagickWand *MagickGetImageClipMask(MagickWand *wand) +WandExport MagickWand *MagickGetImageMask(MagickWand *wand) { Image *image; @@ -3516,7 +3516,7 @@ WandExport MagickWand *MagickGetImageClipMask(MagickWand *wand) "ContainsNoImages","`%s'",wand->name); return((MagickWand *) NULL); } - image=GetImageClipMask(wand->images,wand->exception); + image=GetImageMask(wand->images,wand->exception); if (image == (Image *) NULL) return((MagickWand *) NULL); return(CloneMagickWandFromImages(wand,image)); @@ -8781,11 +8781,11 @@ WandExport MagickBooleanType MagickSetImageBorderColor(MagickWand *wand, % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % -% MagickSetImageClipMask() sets image clip mask. +% MagickSetImageMask() sets image clip mask. % -% The format of the MagickSetImageClipMask method is: +% The format of the MagickSetImageMask method is: % -% MagickBooleanType MagickSetImageClipMask(MagickWand *wand, +% MagickBooleanType MagickSetImageMask(MagickWand *wand, % const MagickWand *clip_mask) % % A description of each parameter follows: @@ -8795,7 +8795,7 @@ WandExport MagickBooleanType MagickSetImageBorderColor(MagickWand *wand, % o clip_mask: the clip_mask wand. % */ -WandExport MagickBooleanType MagickSetImageClipMask(MagickWand *wand, +WandExport MagickBooleanType MagickSetImageMask(MagickWand *wand, const MagickWand *clip_mask) { assert(wand != (MagickWand *) NULL); @@ -8808,7 +8808,7 @@ WandExport MagickBooleanType MagickSetImageClipMask(MagickWand *wand, (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clip_mask->name); if (clip_mask->images == (Image *) NULL) ThrowWandException(WandError,"ContainsNoImages",clip_mask->name); - return(SetImageClipMask(wand->images,clip_mask->images,wand->exception)); + return(SetImageMask(wand->images,clip_mask->images,wand->exception)); } /* diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index 2847f1e3c..6744c3ff2 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -1074,7 +1074,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, (void) SyncImageSettings(mogrify_info,*image,exception); if (*option == '+') { - (void) SetImageClipMask(*image,(Image *) NULL,exception); + (void) SetImageMask(*image,(Image *) NULL,exception); break; } (void) ClipImage(*image,exception); @@ -1136,7 +1136,7 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, } mask_view=DestroyCacheView(mask_view); mask_image->matte=MagickTrue; - (void) SetImageClipMask(*image,mask_image,exception); + (void) SetImageMask(*image,mask_image,exception); break; } if (LocaleCompare("clip-path",option+1) == 0) @@ -7426,17 +7426,14 @@ WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info, Set a blending mask for the composition. Possible problem, what if image->mask already set. */ - image->mask=mask_image; - (void) NegateImage(image->mask,MagickFalse,exception); + (void) NegateImage(mask_image,MagickFalse,exception); + (void) SetImageMask(image,mask_image,exception); + mask_image=DestroyImage(mask_image); } } (void) CompositeImage(image,image->compose,composite_image, geometry.x,geometry.y,exception); - if (mask_image != (Image *) NULL) - { - image->mask=DestroyImage(image->mask); - mask_image=(Image *) NULL; - } + (void) SetImageMask(image,(Image *) NULL,exception); composite_image=DestroyImage(composite_image); *images=DestroyImageList(*images); *images=image; diff --git a/MagickWand/operation.c b/MagickWand/operation.c index c9c73724b..40e6efd21 100644 --- a/MagickWand/operation.c +++ b/MagickWand/operation.c @@ -1813,7 +1813,7 @@ WandExport MagickBooleanType WandSimpleOperatorImage(MagickWand *wand, if (plus_alt_op == MagickFalse) (void) ClipImage(*image,exception); else /* "+clip" remove the write mask */ - (void) SetImageClipMask(*image,(Image *) NULL,exception); + (void) SetImageMask(*image,(Image *) NULL,exception); break; } if (LocaleCompare("clip-mask",option) == 0) @@ -1868,7 +1868,7 @@ WandExport MagickBooleanType WandSimpleOperatorImage(MagickWand *wand, /* clean up and set the write mask */ mask_view=DestroyCacheView(mask_view); mask_image->matte=MagickTrue; - (void) SetImageClipMask(*image,mask_image,exception); + (void) SetImageMask(*image,mask_image,exception); mask_image=DestroyImage(mask_image); break; } diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index 4af4f238c..76737498e 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -1234,7 +1234,7 @@ static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image, if (SvPOK(sval)) clip_mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception); for ( ; image; image=image->next) - SetImageClipMask(image,clip_mask,exception); + SetImageMask(image,clip_mask,exception); break; } if (LocaleNCompare(attribute,"colormap",8) == 0) @@ -4433,15 +4433,19 @@ Get(ref,...) { if (image != (Image *) NULL) { + Image + *mask_image; + SV *sv; sv=NULL; - if (image->mask == (Image *) NULL) + if (image->masky == MagickFalse) ClipImage(image,exception); - if (image->mask != (Image *) NULL) + mask_image=GetImageMask(image,exception); + if (mask_image != (Image *) NULL) { - AddImageToRegistry(sv,image->mask); + AddImageToRegistry(sv,mask_image); s=sv_bless(newRV(sv),SvSTASH(reference)); } } @@ -4452,15 +4456,19 @@ Get(ref,...) { if (image != (Image *) NULL) { + Image + *mask_image; + SV *sv; sv=NULL; - if (image->clip_mask == (Image *) NULL) + if (image->masky != MagickFalse) ClipImage(image,exception); - if (image->clip_mask != (Image *) NULL) + mask_image=GetImageMask(image,exception); + if (mask_image != (Image *) NULL) { - AddImageToRegistry(sv,image->clip_mask); + AddImageToRegistry(sv,mask_image); s=sv_bless(newRV(sv),SvSTASH(reference)); } } @@ -8402,12 +8410,17 @@ Mogrify(ref,...) } else { + Image + *mask_image; + /* Set a blending mask for the composition. */ - image->mask=CloneImage(argument_list[10].image_reference,0,0, + mask_image=CloneImage(argument_list[10].image_reference,0,0, MagickTrue,exception); - (void) NegateImage(image->mask,MagickFalse,exception); + (void) NegateImage(mask_image,MagickFalse,exception); + (void) SetImageMask(image,mask_image,exception); + mask_image=DestroyImage(mask_image); } } if (attribute_flag[11] != 0) /* channel */ @@ -8444,7 +8457,7 @@ Mogrify(ref,...) (image->compose == DistortCompositeOp)) composite_image=DestroyImage(composite_image); else - image->mask=DestroyImage(image->mask); + (void) SetImageMask(image,(Image *) NULL,exception); } (void) SetPixelChannelMask(image,channel_mask); break; @@ -10134,15 +10147,20 @@ Mogrify(ref,...) } case 106: /* ClipMask */ { + Image + *mask_image; + if (attribute_flag[0] == 0) { ThrowPerlException(exception,OptionError,"MaskImageRequired", PackageName); goto PerlException; } - image->clip_mask=CloneImage(argument_list[0].image_reference,0,0, - MagickTrue,exception); - (void) NegateImage(image->clip_mask,MagickFalse,exception); + mask_image=CloneImage(argument_list[0].image_reference,0,0,MagickTrue, + exception); + (void) NegateImage(mask_image,MagickFalse,exception); + (void) SetImageMask(image,mask_image,exception); + mask_image=DestroyImage(mask_image); break; } case 107: /* LinearStretch */ @@ -10218,15 +10236,20 @@ Mogrify(ref,...) } case 109: /* Mask */ { + Image + *mask_image; + if (attribute_flag[0] == 0) { ThrowPerlException(exception,OptionError,"MaskImageRequired", PackageName); goto PerlException; } - image->mask=CloneImage(argument_list[0].image_reference,0,0, + mask_image=CloneImage(argument_list[0].image_reference,0,0, MagickTrue,exception); - (void) NegateImage(image->mask,MagickFalse,exception); + (void) NegateImage(mask_image,MagickFalse,exception); + (void) SetImageMask(image,mask_image,exception); + mask_image=DestroyImage(mask_image); break; } case 110: /* Polaroid */ diff --git a/coders/clip.c b/coders/clip.c index 9f4076afa..3e779f3b0 100644 --- a/coders/clip.c +++ b/coders/clip.c @@ -160,14 +160,13 @@ static MagickBooleanType WriteCLIPImage(const ImageInfo *image_info, MagickBooleanType status; - if (image->clip_mask == (Image *) NULL) + if (image->masky == MagickFalse) (void) ClipImage(image,exception); - if (image->clip_mask == (Image *) NULL) + if (image->masky == MagickFalse) ThrowWriterException(CoderError,"ImageDoesNotHaveAClipMask"); - clip_image=CloneImage(image->clip_mask,0,0,MagickTrue,exception); + clip_image=GetImageMask(image,exception); if (clip_image == (Image *) NULL) return(MagickFalse); - (void) SetImageType(clip_image,TrueColorType,exception); (void) CopyMagickString(clip_image->filename,image->filename,MaxTextExtent); write_info=CloneImageInfo(image_info); (void) SetImageInfo(write_info,1,exception); diff --git a/coders/msl.c b/coders/msl.c index 3fa0a3b1a..5e8f8af30 100644 --- a/coders/msl.c +++ b/coders/msl.c @@ -6061,7 +6061,7 @@ static void MSLStartElement(void *context,const xmlChar *tag, &exception); if (LocaleCompare(property,value) == 0) { - SetImageClipMask(msl_info->image[n],msl_info->image[j], + SetImageMask(msl_info->image[n],msl_info->image[j], &exception); break; } diff --git a/coders/ps3.c b/coders/ps3.c index 55573586c..81badfdce 100644 --- a/coders/ps3.c +++ b/coders/ps3.c @@ -1125,16 +1125,15 @@ static MagickBooleanType WritePS3Image(const ImageInfo *image_info,Image *image, /* PS clipping path from Photoshop clipping path. */ - if ((image->clip_mask == (Image *) NULL) || - (LocaleNCompare("8BIM:",image->clip_mask->magick_filename,5) != 0)) + if ((image->masky != MagickFalse) || + (LocaleNCompare("8BIM:",image->magick_filename,5) != 0)) (void) WriteBlobString(image,"/ClipImage {} def\n"); else { const char *value; - value=GetImageProperty(image,image->clip_mask->magick_filename, - exception); + value=GetImageProperty(image,image->magick_filename,exception); if (value == (const char *) NULL) return(MagickFalse); (void) WriteBlobString(image,value); @@ -1202,8 +1201,8 @@ static MagickBooleanType WritePS3Image(const ImageInfo *image_info,Image *image, /* Photoshop clipping path active? */ - if ((image->clip_mask != (Image *) NULL) && - (LocaleNCompare("8BIM:",image->clip_mask->magick_filename,5) == 0)) + if ((image->masky != MagickFalse) && + (LocaleNCompare("8BIM:",image->magick_filename,5) == 0)) (void) WriteBlobString(image,"true\n"); else (void) WriteBlobString(image,"false\n");