% DDDD EEEEE P R R EEEEE CCCC A A T EEEEE %
% %
% %
-% MagickWand Deprecated Methods %
+% MagickCore Deprecated Methods %
% %
% Software Design %
% John Cristy %
/*
Include declarations.
*/
-#include "wand/studio.h"
-#include "wand/MagickWand.h"
-#include "wand/magick-wand-private.h"
-#include "wand/wand.h"
+#include "magick/studio.h"
+#include "magick/property.h"
+#include "magick/blob.h"
+#include "magick/blob-private.h"
+#include "magick/cache.h"
+#include "magick/cache-view.h"
+#include "magick/client.h"
+#include "magick/color.h"
+#include "magick/color-private.h"
+#include "magick/colormap.h"
+#include "magick/colormap-private.h"
+#include "magick/colorspace.h"
+#include "magick/composite.h"
+#include "magick/composite-private.h"
+#include "magick/constitute.h"
+#include "magick/deprecate.h"
+#include "magick/draw.h"
+#include "magick/draw-private.h"
+#include "magick/effect.h"
+#include "magick/enhance.h"
+#include "magick/exception.h"
+#include "magick/exception-private.h"
+#include "magick/fx.h"
+#include "magick/geometry.h"
+#include "magick/identify.h"
+#include "magick/image.h"
+#include "magick/image-private.h"
+#include "magick/list.h"
+#include "magick/log.h"
+#include "magick/memory_.h"
+#include "magick/magick.h"
+#include "magick/monitor.h"
#include "magick/monitor-private.h"
-#include "magick/thread-private.h"
-\f
-/*
- Define declarations.
-*/
-#define PixelViewId "PixelView"
-#define ThrowWandException(severity,tag,context) \
-{ \
- (void) ThrowMagickException(wand->exception,GetMagickModule(),severity, \
- tag,"`%s'",context); \
- return(MagickFalse); \
-}
+#include "magick/morphology.h"
+#include "magick/paint.h"
+#include "magick/pixel.h"
+#include "magick/pixel-private.h"
+#include "magick/quantize.h"
+#include "magick/random_.h"
+#include "magick/resource_.h"
+#include "magick/semaphore.h"
+#include "magick/segment.h"
+#include "magick/splay-tree.h"
+#include "magick/statistic.h"
+#include "magick/string_.h"
+#include "magick/threshold.h"
+#include "magick/transform.h"
+#include "magick/utility.h"
\f
+#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED)
/*
- Typedef declarations.
+ Global declarations.
*/
-struct _PixelView
-{
- size_t
- id;
-
- char
- name[MaxTextExtent];
-
- ExceptionInfo
- *exception;
-
- MagickWand
- *wand;
-
- CacheView
- *view;
-
- RectangleInfo
- region;
-
- size_t
- number_threads;
-
- PixelWand
- ***pixel_wands;
-
- MagickBooleanType
- debug;
-
- size_t
- signature;
-};
-\f
-#if !defined(MAGICKCORE_EXCLUDE_DEPRECATED)
+static MonitorHandler
+ monitor_handler = (MonitorHandler) NULL;
\f
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
-% M a g i c k A v e r a g e I m a g e s %
+% A c q u i r e C a c h e V i e w I n d e x e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickAverageImages() average a set of images.
+% AcquireCacheViewIndexes() returns the indexes associated with the specified
+% view.
+%
+% Deprecated, replace with:
%
-% The format of the MagickAverageImages method is:
+% GetCacheViewVirtualIndexQueue(cache_view);
%
-% MagickWand *MagickAverageImages(MagickWand *wand)
+% The format of the AcquireCacheViewIndexes method is:
+%
+% const IndexPacket *AcquireCacheViewIndexes(const CacheView *cache_view)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o cache_view: the cache view.
%
*/
-
-static MagickWand *CloneMagickWandFromImages(const MagickWand *wand,
- Image *images)
-{
- MagickWand
- *clone_wand;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- clone_wand=(MagickWand *) AcquireMagickMemory(sizeof(*clone_wand));
- if (clone_wand == (MagickWand *) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- images->filename);
- (void) ResetMagickMemory(clone_wand,0,sizeof(*clone_wand));
- clone_wand->id=AcquireWandId();
- (void) FormatMagickString(clone_wand->name,MaxTextExtent,"%s-%.20g",
- MagickWandId,(double) clone_wand->id);
- clone_wand->exception=AcquireExceptionInfo();
- InheritException(clone_wand->exception,wand->exception);
- clone_wand->image_info=CloneImageInfo(wand->image_info);
- clone_wand->quantize_info=CloneQuantizeInfo(wand->quantize_info);
- clone_wand->images=images;
- clone_wand->debug=IsEventLogging();
- if (clone_wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name);
- clone_wand->signature=WandSignature;
- return(clone_wand);
-}
-
-WandExport MagickWand *MagickAverageImages(MagickWand *wand)
+MagickExport const IndexPacket *AcquireCacheViewIndexes(
+ const CacheView *cache_view)
{
- Image
- *average_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- return((MagickWand *) NULL);
- average_image=EvaluateImages(wand->images,MeanEvaluateOperator,
- wand->exception);
- if (average_image == (Image *) NULL)
- return((MagickWand *) NULL);
- return(CloneMagickWandFromImages(wand,average_image));
+ return(GetCacheViewVirtualIndexQueue(cache_view));
}
\f
/*
% %
% %
% %
-% C l o n e P i x e l V i e w %
+% A c q u i r e C a c h e V i e w P i x e l s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% ClonePixelView() makes a copy of the specified pixel view.
+% AcquireCacheViewPixels() gets pixels from the in-memory or disk pixel cache
+% as defined by the geometry parameters. A pointer to the pixels is returned
+% if the pixels are transferred, otherwise a NULL is returned.
%
-% The format of the ClonePixelView method is:
+% Deprecated, replace with:
%
-% PixelView *ClonePixelView(const PixelView *pixel_view)
+% GetCacheViewVirtualPixels(cache_view,x,y,columns,rows,exception);
+%
+% The format of the AcquireCacheViewPixels method is:
+%
+% const PixelPacket *AcquireCacheViewPixels(const CacheView *cache_view,
+% const ssize_t x,const ssize_t y,const size_t columns,
+% const size_t rows,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o cache_view: the cache view.
+%
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport PixelView *ClonePixelView(const PixelView *pixel_view)
+MagickExport const PixelPacket *AcquireCacheViewPixels(
+ const CacheView *cache_view,const ssize_t x,const ssize_t y,
+ const size_t columns,const size_t rows,ExceptionInfo *exception)
{
- PixelView
- *clone_view;
-
- register ssize_t
- i;
-
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- if (pixel_view->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",pixel_view->name);
- clone_view=(PixelView *) AcquireMagickMemory(sizeof(*clone_view));
- if (clone_view == (PixelView *) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- pixel_view->name);
- (void) ResetMagickMemory(clone_view,0,sizeof(*clone_view));
- clone_view->id=AcquireWandId();
- (void) FormatMagickString(clone_view->name,MaxTextExtent,"%s-%.20g",
- PixelViewId,(double) clone_view->id);
- clone_view->exception=AcquireExceptionInfo();
- InheritException(clone_view->exception,pixel_view->exception);
- clone_view->view=CloneCacheView(pixel_view->view);
- clone_view->region=pixel_view->region;
- clone_view->number_threads=pixel_view->number_threads;
- for (i=0; i < (ssize_t) pixel_view->number_threads; i++)
- clone_view->pixel_wands[i]=ClonePixelWands((const PixelWand **)
- pixel_view->pixel_wands[i],pixel_view->region.width);
- clone_view->debug=pixel_view->debug;
- if (clone_view->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_view->name);
- clone_view->signature=WandSignature;
- return(clone_view);
+ return(GetCacheViewVirtualPixels(cache_view,x,y,columns,rows,exception));
}
\f
/*
% %
% %
% %
-% D e s t r o y P i x e l V i e w %
-% %
-% %
+% A c q u i r e I m a g e P i x e l s %
+% % % %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DestroyPixelView() deallocates memory associated with a pixel view.
+% AcquireImagePixels() returns an immutable pixel region. If the
+% region is successfully accessed, a pointer to it is returned, otherwise
+% NULL is returned. The returned pointer may point to a temporary working
+% copy of the pixels or it may point to the original pixels in memory.
+% Performance is maximized if the selected region is part of one row, or one
+% or more full rows, since there is opportunity to access the pixels in-place
+% (without a copy) if the image is in RAM, or in a memory-mapped file. The
+% returned pointer should *never* be deallocated by the user.
%
-% The format of the DestroyPixelView method is:
+% Pixels accessed via the returned pointer represent a simple array of type
+% PixelPacket. If the image type is CMYK or the storage class is PseudoClass,
+% call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to access
+% the black color component or to obtain the colormap indexes (of type
+% IndexPacket) corresponding to the region.
%
-% PixelView *DestroyPixelView(PixelView *pixel_view,
-% const size_t number_wands,const size_t number_threads)
+% If you plan to modify the pixels, use GetAuthenticPixels() instead.
+%
+% Note, the AcquireImagePixels() and GetAuthenticPixels() methods are not
+% thread-safe. In a threaded environment, use GetCacheViewVirtualPixels() or
+% GetCacheViewAuthenticPixels() instead.
+%
+% Deprecated, replace with:
+%
+% GetVirtualPixels(image,x,y,columns,rows,exception);
+%
+% The format of the AcquireImagePixels() method is:
+%
+% const PixelPacket *AcquireImagePixels(const Image *image,const ssize_t x,
+% const ssize_t y,const size_t columns,const size_t rows,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o image: the image.
%
-% o number_wand: the number of pixel wands.
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
%
-% o number_threads: number of threads.
+% o exception: return any errors or warnings in this structure.
%
*/
-
-static PixelWand ***DestroyPixelsThreadSet(PixelWand ***pixel_wands,
- const size_t number_wands,const size_t number_threads)
-{
- register ssize_t
- i;
-
- assert(pixel_wands != (PixelWand ***) NULL);
- for (i=0; i < (ssize_t) number_threads; i++)
- if (pixel_wands[i] != (PixelWand **) NULL)
- pixel_wands[i]=DestroyPixelWands(pixel_wands[i],number_wands);
- pixel_wands=(PixelWand ***) RelinquishMagickMemory(pixel_wands);
- return(pixel_wands);
-}
-
-WandExport PixelView *DestroyPixelView(PixelView *pixel_view)
+MagickExport const PixelPacket *AcquireImagePixels(const Image *image,
+ const ssize_t x,const ssize_t y,const size_t columns,
+ const size_t rows,ExceptionInfo *exception)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- pixel_view->pixel_wands=DestroyPixelsThreadSet(pixel_view->pixel_wands,
- pixel_view->region.width,pixel_view->number_threads);
- pixel_view->view=DestroyCacheView(pixel_view->view);
- pixel_view->exception=DestroyExceptionInfo(pixel_view->exception);
- pixel_view->signature=(~WandSignature);
- RelinquishWandId(pixel_view->id);
- pixel_view=(PixelView *) RelinquishMagickMemory(pixel_view);
- return(pixel_view);
+ return(GetVirtualPixels(image,x,y,columns,rows,exception));
}
\f
/*
% %
% %
% %
-% D u p l e x T r a n s f e r P i x e l V i e w I t e r a t o r %
+% A c q u i r e I n d e x e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DuplexTransferPixelViewIterator() iterates over three pixel views in
-% parallel and calls your transfer method for each scanline of the view. The
-% source and duplex pixel region is not confined to the image canvas-- that is
-% you can include negative offsets or widths or heights that exceed the image
-% dimension. However, the destination pixel view is confined to the image
-% canvas-- that is no negative offsets or widths or heights that exceed the
-% image dimension are permitted.
+% AcquireIndexes() returns the black channel or the colormap indexes
+% associated with the last call to QueueAuthenticPixels() or
+% GetVirtualPixels(). NULL is returned if the black channel or colormap
+% indexes are not available.
%
-% Use this pragma:
+% Deprecated, replace with:
%
-% #pragma omp critical
+% GetVirtualIndexQueue(image);
%
-% to define a section of code in your callback transfer method that must be
-% executed by a single thread at a time.
+% The format of the AcquireIndexes() method is:
%
-% The format of the DuplexTransferPixelViewIterator method is:
-%
-% MagickBooleanType DuplexTransferPixelViewIterator(PixelView *source,
-% PixelView *duplex,PixelView *destination,
-% DuplexTransferPixelViewMethod transfer,void *context)
+% const IndexPacket *AcquireIndexes(const Image *image)
%
% A description of each parameter follows:
%
-% o source: the source pixel view.
-%
-% o duplex: the duplex pixel view.
+% o indexes: AcquireIndexes() returns the indexes associated with the last
+% call to QueueAuthenticPixels() or GetVirtualPixels().
%
-% o destination: the destination pixel view.
-%
-% o transfer: the transfer callback method.
-%
-% o context: the user defined context.
+% o image: the image.
%
*/
-WandExport MagickBooleanType DuplexTransferPixelViewIterator(
- PixelView *source,PixelView *duplex,PixelView *destination,
- DuplexTransferPixelViewMethod transfer,void *context)
+MagickExport const IndexPacket *AcquireIndexes(const Image *image)
{
-#define DuplexTransferPixelViewTag "PixelView/DuplexTransfer"
-
- ExceptionInfo
- *exception;
-
- Image
- *destination_image,
- *duplex_image,
- *source_image;
-
- MagickBooleanType
- status;
-
- MagickOffsetType
- progress;
-
- ssize_t
- y;
-
- assert(source != (PixelView *) NULL);
- assert(source->signature == WandSignature);
- if (transfer == (DuplexTransferPixelViewMethod) NULL)
- return(MagickFalse);
- source_image=source->wand->images;
- duplex_image=duplex->wand->images;
- destination_image=destination->wand->images;
- if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse)
- return(MagickFalse);
- status=MagickTrue;
- progress=0;
- exception=destination->exception;
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,1) shared(progress,status)
-#endif
- for (y=source->region.y; y < (ssize_t) source->region.height; y++)
- {
- const int
- id = GetOpenMPThreadId();
-
- MagickBooleanType
- sync;
-
- register const IndexPacket
- *restrict duplex_indexes,
- *restrict indexes;
-
- register const PixelPacket
- *restrict duplex_pixels,
- *restrict pixels;
-
- register IndexPacket
- *restrict destination_indexes;
-
- register ssize_t
- x;
-
- register PixelPacket
- *restrict destination_pixels;
-
- if (status == MagickFalse)
- continue;
- pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y,
- source->region.width,1,source->exception);
- if (pixels == (const PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- indexes=GetCacheViewVirtualIndexQueue(source->view);
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x);
- if (source_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetBlackQuantum(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (source_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetIndex(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- duplex_pixels=GetCacheViewVirtualPixels(duplex->view,duplex->region.x,y,
- duplex->region.width,1,duplex->exception);
- if (duplex_pixels == (const PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- duplex_indexes=GetCacheViewVirtualIndexQueue(duplex->view);
- for (x=0; x < (ssize_t) duplex->region.width; x++)
- PixelSetQuantumColor(duplex->pixel_wands[id][x],duplex_pixels+x);
- if (duplex_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) duplex->region.width; x++)
- PixelSetBlackQuantum(duplex->pixel_wands[id][x],
- GetIndexPixelComponent(duplex_indexes+x));
- if (duplex_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) duplex->region.width; x++)
- PixelSetIndex(duplex->pixel_wands[id][x],
- GetIndexPixelComponent(duplex_indexes+x));
- destination_pixels=GetCacheViewAuthenticPixels(destination->view,
- destination->region.x,y,destination->region.width,1,exception);
- if (destination_pixels == (PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view);
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetQuantumColor(destination->pixel_wands[id][x],
- destination_pixels+x);
- if (destination_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetBlackQuantum(destination->pixel_wands[id][x],
- GetIndexPixelComponent(destination_indexes+x));
- if (destination_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetIndex(destination->pixel_wands[id][x],
- GetIndexPixelComponent(destination_indexes+x));
- if (transfer(source,duplex,destination,context) == MagickFalse)
- status=MagickFalse;
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelGetQuantumColor(destination->pixel_wands[id][x],
- destination_pixels+x);
- if (destination_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- SetIndexPixelComponent(destination_indexes+x,PixelGetBlackQuantum(
- destination->pixel_wands[id][x]));
- sync=SyncCacheViewAuthenticPixels(destination->view,exception);
- if (sync == MagickFalse)
- {
- InheritException(destination->exception,GetCacheViewException(
- source->view));
- status=MagickFalse;
- }
- if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
-
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickWand_DuplexTransferPixelViewIterator)
-#endif
- proceed=SetImageProgress(source_image,DuplexTransferPixelViewTag,
- progress++,source->region.height);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
- }
- return(status);
+ return(GetVirtualIndexQueue(image));
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w E x c e p t i o n %
+% A c q u i r e M e m o r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewException() returns the severity, reason, and description of any
-% error that occurs when utilizing a pixel view.
+% AcquireMemory() returns a pointer to a block of memory at least size bytes
+% suitably aligned for any use.
%
-% The format of the GetPixelViewException method is:
+% The format of the AcquireMemory method is:
%
-% char *GetPixelViewException(const PixelWand *pixel_view,
-% ExceptionType *severity)
+% void *AcquireMemory(const size_t size)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel pixel_view.
-%
-% o severity: the severity of the error is returned here.
+% o size: the size of the memory in bytes to allocate.
%
*/
-WandExport char *GetPixelViewException(const PixelView *pixel_view,
- ExceptionType *severity)
+MagickExport void *AcquireMemory(const size_t size)
{
- char
- *description;
-
- assert(pixel_view != (const PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- if (pixel_view->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",pixel_view->name);
- assert(severity != (ExceptionType *) NULL);
- *severity=pixel_view->exception->severity;
- description=(char *) AcquireQuantumMemory(2UL*MaxTextExtent,
- sizeof(*description));
- if (description == (char *) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- pixel_view->name);
- *description='\0';
- if (pixel_view->exception->reason != (char *) NULL)
- (void) CopyMagickString(description,GetLocaleExceptionMessage(
- pixel_view->exception->severity,pixel_view->exception->reason),
- MaxTextExtent);
- if (pixel_view->exception->description != (char *) NULL)
- {
- (void) ConcatenateMagickString(description," (",MaxTextExtent);
- (void) ConcatenateMagickString(description,GetLocaleExceptionMessage(
- pixel_view->exception->severity,pixel_view->exception->description),
- MaxTextExtent);
- (void) ConcatenateMagickString(description,")",MaxTextExtent);
- }
- return(description);
+ void
+ *allocation;
+
+ assert(size != 0);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ allocation=malloc(size);
+ return(allocation);
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w H e i g h t %
+% A c q u i r e O n e C a c h e V i e w P i x e l %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewHeight() returns the pixel view height.
+% AcquireOneCacheViewPixel() returns a single pixel at the specified (x,y)
+% location. The image background color is returned if an error occurs. If
+% you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
+%
+% Deprecated, replace with:
%
-% The format of the GetPixelViewHeight method is:
+% GetOneCacheViewVirtualPixel(cache_view,x,y,pixel,exception);
%
-% size_t GetPixelViewHeight(const PixelView *pixel_view)
+% The format of the AcquireOneCacheViewPixel method is:
+%
+% MagickBooleanType AcquireOneCacheViewPixel(const CacheView *cache_view,
+% const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o cache_view: the cache view.
+%
+% o x,y: These values define the offset of the pixel.
+%
+% o pixel: return a pixel at the specified (x,y) location.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport size_t GetPixelViewHeight(const PixelView *pixel_view)
+MagickExport MagickBooleanType AcquireOneCacheViewPixel(
+ const CacheView *cache_view,const ssize_t x,const ssize_t y,PixelPacket *pixel,
+ ExceptionInfo *exception)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->region.height);
+ return(GetOneCacheViewVirtualPixel(cache_view,x,y,pixel,exception));
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w I t e r a t o r %
+% A c q u i r e O n e C a c h e V i e w V i r t u a l P i x e l %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewIterator() iterates over the pixel view in parallel and calls
-% your get method for each scanline of the view. The pixel region is
-% not confined to the image canvas-- that is you can include negative offsets
-% or widths or heights that exceed the image dimension. Any updates to
-% the pixels in your callback are ignored.
+% AcquireOneCacheViewVirtualPixel() returns a single pixel at the specified
+% (x,y) location. The image background color is returned if an error occurs.
+% If you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
%
-% Use this pragma:
+% Deprecated, replace with:
%
-% #pragma omp critical
+% GetOneCacheViewVirtualMethodPixel(cache_view,virtual_pixel_method,
+% x,y,pixel,exception);
%
-% to define a section of code in your callback get method that must be
-% executed by a single thread at a time.
+% The format of the AcquireOneCacheViewPixel method is:
%
-% The format of the GetPixelViewIterator method is:
-%
-% MagickBooleanType GetPixelViewIterator(PixelView *source,
-% GetPixelViewMethod get,void *context)
+% MagickBooleanType AcquireOneCacheViewVirtualPixel(
+% const CacheView *cache_view,
+% const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
+% const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o source: the source pixel view.
+% o cache_view: the cache view.
+%
+% o virtual_pixel_method: the virtual pixel method.
%
-% o get: the get callback method.
+% o x,y: These values define the offset of the pixel.
%
-% o context: the user defined context.
+% o pixel: return a pixel at the specified (x,y) location.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickBooleanType GetPixelViewIterator(PixelView *source,
- GetPixelViewMethod get,void *context)
+MagickExport MagickBooleanType AcquireOneCacheViewVirtualPixel(
+ const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method,
+ const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
{
-#define GetPixelViewTag "PixelView/Get"
-
- Image
- *source_image;
-
MagickBooleanType
status;
- MagickOffsetType
- progress;
-
- ssize_t
- y;
-
- assert(source != (PixelView *) NULL);
- assert(source->signature == WandSignature);
- if (get == (GetPixelViewMethod) NULL)
- return(MagickFalse);
- source_image=source->wand->images;
- status=MagickTrue;
- progress=0;
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,1) shared(progress,status)
-#endif
- for (y=source->region.y; y < (ssize_t) source->region.height; y++)
- {
- const int
- id = GetOpenMPThreadId();
-
- register const IndexPacket
- *indexes;
-
- register const PixelPacket
- *pixels;
-
- register ssize_t
- x;
-
- if (status == MagickFalse)
- continue;
- pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y,
- source->region.width,1,source->exception);
- if (pixels == (const PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- indexes=GetCacheViewVirtualIndexQueue(source->view);
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x);
- if (source_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetBlackQuantum(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (source_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetIndex(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (get(source,context) == MagickFalse)
- status=MagickFalse;
- if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
-
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickWand_GetPixelViewIterator)
-#endif
- proceed=SetImageProgress(source_image,GetPixelViewTag,progress++,
- source->region.height);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
- }
+ status=GetOneCacheViewVirtualMethodPixel(cache_view,virtual_pixel_method,
+ x,y,pixel,exception);
return(status);
}
\f
% %
% %
% %
-% G e t P i x e l V i e w P i x e l s %
+% A c q u i r e O n e M a g i c k P i x e l %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewPixels() returns the pixel view pixel_wands.
+% AcquireOneMagickPixel() returns a single pixel at the specified (x,y)
+% location. The image background color is returned if an error occurs. If
+% you plan to modify the pixel, use GetOnePixel() instead.
+%
+% Deprecated, replace with:
%
-% The format of the GetPixelViewPixels method is:
+% MagickPixelPacket pixel;
+% GetOneVirtualMagickPixel(image,x,y,&pixel,exception);
%
-% PixelWand *GetPixelViewPixels(const PixelView *pixel_view)
+% The format of the AcquireOneMagickPixel() method is:
+%
+% MagickPixelPacket AcquireOneMagickPixel(const Image image,const ssize_t x,
+% const ssize_t y,ExceptionInfo exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o image: the image.
+%
+% o x,y: These values define the location of the pixel to return.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport PixelWand **GetPixelViewPixels(const PixelView *pixel_view)
+MagickExport MagickPixelPacket AcquireOneMagickPixel(const Image *image,
+ const ssize_t x,const ssize_t y,ExceptionInfo *exception)
{
- const int
- id = GetOpenMPThreadId();
+ MagickPixelPacket
+ pixel;
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->pixel_wands[id]);
+ (void) GetOneVirtualMagickPixel(image,x,y,&pixel,exception);
+ return(pixel);
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w W a n d %
+% A c q u i r e O n e P i x e l %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewWand() returns the magick wand associated with the pixel view.
+% AcquireOnePixel() returns a single pixel at the specified (x,y) location.
+% The image background color is returned if an error occurs. If you plan to
+% modify the pixel, use GetOnePixel() instead.
+%
+% Deprecated, replace with:
%
-% The format of the GetPixelViewWand method is:
+% PixelPacket pixel;
+% GetOneVirtualPixel(image,x,y,&pixel,exception);
%
-% MagickWand *GetPixelViewWand(const PixelView *pixel_view)
+% The format of the AcquireOnePixel() method is:
+%
+% PixelPacket AcquireOnePixel(const Image image,const ssize_t x,
+% const ssize_t y,ExceptionInfo exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o image: the image.
+%
+% o x,y: These values define the location of the pixel to return.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickWand *GetPixelViewWand(const PixelView *pixel_view)
+MagickExport PixelPacket AcquireOnePixel(const Image *image,const ssize_t x,
+ const ssize_t y,ExceptionInfo *exception)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->wand);
+ PixelPacket
+ pixel;
+
+ (void) GetOneVirtualPixel(image,x,y,&pixel,exception);
+ return(pixel);
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w W i d t h %
+% A c q u i r e O n e V i r t u a l P i x e l %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewWidth() returns the pixel view width.
+% AcquireOneVirtualPixel() returns a single pixel at the specified (x,y)
+% location as defined by specified pixel method. The image background color
+% is returned if an error occurs. If you plan to modify the pixel, use
+% GetOnePixel() instead.
+%
+% Deprecated, replace with:
%
-% The format of the GetPixelViewWidth method is:
+% PixelPacket pixel;
+% GetOneVirtualMethodPixel(image,virtual_pixel_method,x,y,&pixel,exception);
%
-% size_t GetPixelViewWidth(const PixelView *pixel_view)
+% The format of the AcquireOneVirtualPixel() method is:
+%
+% PixelPacket AcquireOneVirtualPixel(const Image image,
+% const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
+% const ssize_t y,ExceptionInfo exception)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o virtual_pixel_method: the virtual pixel method.
+%
+% o image: the image.
+%
+% o x,y: These values define the location of the pixel to return.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport size_t GetPixelViewWidth(const PixelView *pixel_view)
+MagickExport PixelPacket AcquireOneVirtualPixel(const Image *image,
+ const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y,
+ ExceptionInfo *exception)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->region.width);
+ PixelPacket
+ pixel;
+
+ (void) GetOneVirtualMethodPixel(image,virtual_pixel_method,x,y,&pixel,
+ exception);
+ return(pixel);
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w X %
+% A c q u i r e P i x e l s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewX() returns the pixel view x offset.
+% AcquirePixels() returns the pixels associated with the last call to
+% QueueAuthenticPixels() or GetVirtualPixels().
+%
+% Deprecated, replace with:
+%
+% GetVirtualPixelQueue(image);
%
-% The format of the GetPixelViewX method is:
+% The format of the AcquirePixels() method is:
%
-% ssize_t GetPixelViewX(const PixelView *pixel_view)
+% const PixelPacket *AcquirePixels(const Image image)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o image: the image.
%
*/
-WandExport ssize_t GetPixelViewX(const PixelView *pixel_view)
+MagickExport const PixelPacket *AcquirePixels(const Image *image)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->region.x);
+ return(GetVirtualPixelQueue(image));
}
\f
/*
% %
% %
% %
-% G e t P i x e l V i e w Y %
+% A f f i n i t y I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% GetPixelViewY() returns the pixel view y offset.
+% AffinityImage() replaces the colors of an image with the closest color from
+% a reference image.
%
-% The format of the GetPixelViewY method is:
+% Deprecated, replace with:
%
-% ssize_t GetPixelViewY(const PixelView *pixel_view)
+% RemapImage(quantize_info,image,affinity_image);
+%
+% The format of the AffinityImage method is:
+%
+% MagickBooleanType AffinityImage(const QuantizeInfo *quantize_info,
+% Image *image,const Image *affinity_image)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o quantize_info: Specifies a pointer to an QuantizeInfo structure.
+%
+% o image: the image.
+%
+% o affinity_image: the reference image.
%
*/
-WandExport ssize_t GetPixelViewY(const PixelView *pixel_view)
+MagickExport MagickBooleanType AffinityImage(const QuantizeInfo *quantize_info,
+ Image *image,const Image *affinity_image)
{
- assert(pixel_view != (PixelView *) NULL);
- assert(pixel_view->signature == WandSignature);
- return(pixel_view->region.y);
+ return(RemapImage(quantize_info,image,affinity_image));
}
\f
/*
% %
% %
% %
-% I s P i x e l V i e w %
+% A f f i n i t y I m a g e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% IsPixelView() returns MagickTrue if the the parameter is verified as a pixel
-% view container.
+% AffinityImages() replaces the colors of a sequence of images with the
+% closest color from a reference image.
%
-% The format of the IsPixelView method is:
+% Deprecated, replace with:
%
-% MagickBooleanType IsPixelView(const PixelView *pixel_view)
+% RemapImages(quantize_info,images,affinity_image);
+%
+% The format of the AffinityImage method is:
+%
+% MagickBooleanType AffinityImages(const QuantizeInfo *quantize_info,
+% Image *images,Image *affinity_image)
%
% A description of each parameter follows:
%
-% o pixel_view: the pixel view.
+% o quantize_info: Specifies a pointer to an QuantizeInfo structure.
+%
+% o images: the image sequence.
+%
+% o affinity_image: the reference image.
%
*/
-WandExport MagickBooleanType IsPixelView(const PixelView *pixel_view)
+MagickExport MagickBooleanType AffinityImages(const QuantizeInfo *quantize_info,
+ Image *images,const Image *affinity_image)
{
- size_t
- length;
-
- if (pixel_view == (const PixelView *) NULL)
- return(MagickFalse);
- if (pixel_view->signature != WandSignature)
- return(MagickFalse);
- length=strlen(PixelViewId);
- if (LocaleNCompare(pixel_view->name,PixelViewId,length) != 0)
- return(MagickFalse);
- return(MagickTrue);
+ return(RemapImages(quantize_info,images,affinity_image));
}
\f
/*
% %
% %
% %
-% M a g i c k C l i p P a t h I m a g e %
+% A l l o c a t e I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickClipPathImage() clips along the named paths from the 8BIM profile, if
-% present. Later operations take effect inside the path. Id may be a number
-% if preceded with #, to work on a numbered path, e.g., "#1" to use the first
-% path.
+% AllocateImage() returns a pointer to an image structure initialized to
+% default values.
%
-% The format of the MagickClipPathImage method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickClipPathImage(MagickWand *wand,
-% const char *pathname,const MagickBooleanType inside)
+% AcquireImage(image_info);
%
-% A description of each parameter follows:
+% The format of the AllocateImage method is:
%
-% o wand: the magick wand.
+% Image *AllocateImage(const ImageInfo *image_info)
%
-% o pathname: name of clipping path resource. If name is preceded by #, use
-% clipping path numbered by name.
+% A description of each parameter follows:
%
-% o inside: if non-zero, later operations take effect inside clipping path.
-% Otherwise later operations take effect outside clipping path.
+% o image_info: Many of the image default values are set from this
+% structure. For example, filename, compression, depth, background color,
+% and others.
%
*/
-WandExport MagickBooleanType MagickClipPathImage(MagickWand *wand,
- const char *pathname,const MagickBooleanType inside)
+MagickExport Image *AllocateImage(const ImageInfo *image_info)
{
- return(MagickClipImagePath(wand,pathname,inside));
+ return(AcquireImage(image_info));
}
+\f
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
-% D r a w G e t F i l l A l p h a %
+% A l l o c a t e I m a g e C o l o r m a p %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawGetFillAlpha() returns the alpha used when drawing using the fill
-% color or fill texture. Fully opaque is 1.0.
+% AllocateImageColormap() allocates an image colormap and initializes
+% it to a linear gray colorspace. If the image already has a colormap,
+% it is replaced. AllocateImageColormap() returns MagickTrue if successful,
+% otherwise MagickFalse if there is not enough memory.
+%
+% Deprecated, replace with:
+%
+% AcquireImageColormap(image,colors);
%
-% The format of the DrawGetFillAlpha method is:
+% The format of the AllocateImageColormap method is:
%
-% double DrawGetFillAlpha(const DrawingWand *wand)
+% MagickBooleanType AllocateImageColormap(Image *image,
+% const size_t colors)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image: the image.
+%
+% o colors: the number of colors in the image colormap.
%
*/
-WandExport double DrawGetFillAlpha(const DrawingWand *wand)
+MagickExport MagickBooleanType AllocateImageColormap(Image *image,
+ const size_t colors)
{
- return(DrawGetFillOpacity(wand));
+ return(AcquireImageColormap(image,colors));
}
\f
/*
% %
% %
% %
-% D r a w G e t S t r o k e A l p h a %
+% A l l o c a t e N e x t I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawGetStrokeAlpha() returns the alpha of stroked object outlines.
+% AllocateNextImage() initializes the next image in a sequence to
+% default values. The next member of image points to the newly allocated
+% image. If there is a memory shortage, next is assigned NULL.
+%
+% Deprecated, replace with:
%
-% The format of the DrawGetStrokeAlpha method is:
+% AcquireNextImage(image_info,image);
%
-% double DrawGetStrokeAlpha(const DrawingWand *wand)
+% The format of the AllocateNextImage method is:
+%
+% void AllocateNextImage(const ImageInfo *image_info,Image *image)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image_info: Many of the image default values are set from this
+% structure. For example, filename, compression, depth, background color,
+% and others.
+%
+% o image: the image.
+%
*/
-WandExport double DrawGetStrokeAlpha(const DrawingWand *wand)
+MagickExport void AllocateNextImage(const ImageInfo *image_info,Image *image)
{
- return(DrawGetStrokeOpacity(wand));
+ AcquireNextImage(image_info,image);
}
\f
/*
% %
% %
% %
-% D r a w P e e k G r a p h i c W a n d %
+% A l l o c a t e S t r i n g %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawPeekGraphicWand() returns the current drawing wand.
+% AllocateString() allocates memory for a string and copies the source string
+% to that memory location (and returns it).
%
-% The format of the PeekDrawingWand method is:
+% The format of the AllocateString method is:
%
-% DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand)
+% char *AllocateString(const char *source)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o source: A character string.
%
*/
-WandExport DrawInfo *DrawPeekGraphicWand(const DrawingWand *wand)
+MagickExport char *AllocateString(const char *source)
{
- return(PeekDrawingWand(wand));
+ char
+ *destination;
+
+ size_t
+ length;
+
+ assert(source != (const char *) NULL);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ length=strlen(source)+MaxTextExtent+1;
+ destination=(char *) AcquireQuantumMemory(length,sizeof(*destination));
+ if (destination == (char *) NULL)
+ ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+ *destination='\0';
+ if (source != (char *) NULL)
+ (void) CopyMagickString(destination,source,length);
+ return(destination);
}
\f
/*
% %
% %
% %
-% D r a w P o p G r a p h i c C o n t e x t %
+% A v e r a g e I m a g e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawPopGraphicContext() destroys the current drawing wand and returns to the
-% previously pushed drawing wand. Multiple drawing wands may exist. It is an
-% error to attempt to pop more drawing wands than have been pushed, and it is
-% proper form to pop all drawing wands which have been pushed.
+% AverageImages() takes a set of images and averages them together. Each
+% image in the set must have the same width and height. AverageImages()
+% returns a single image with each corresponding pixel component of each
+% image averaged. On failure, a NULL image is returned and exception
+% describes the reason for the failure.
+%
+% Deprecated, replace with:
+%
+% EvaluateImages(images,MeanEvaluateOperator,exception);
%
-% The format of the DrawPopGraphicContext method is:
+% The format of the AverageImages method is:
%
-% MagickBooleanType DrawPopGraphicContext(DrawingWand *wand)
+% Image *AverageImages(Image *images,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image: the image sequence.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport void DrawPopGraphicContext(DrawingWand *wand)
+MagickExport Image *AverageImages(const Image *images,ExceptionInfo *exception)
{
- (void) PopDrawingWand(wand);
+ return(EvaluateImages(images,MeanEvaluateOperator,exception));
}
\f
/*
% %
% %
% %
-% D r a w P u s h G r a p h i c C o n t e x t %
+% C h a n n e l I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawPushGraphicContext() clones the current drawing wand to create a new
-% drawing wand. The original drawing wand(s) may be returned to by
-% invoking PopDrawingWand(). The drawing wands are stored on a drawing wand
-% stack. For every Pop there must have already been an equivalent Push.
+% Extract a channel from the image. A channel is a particular color component
+% of each pixel in the image.
+%
+% Deprecated, replace with:
%
-% The format of the DrawPushGraphicContext method is:
+% SeparateImageChannel(image,channel);
%
-% MagickBooleanType DrawPushGraphicContext(DrawingWand *wand)
+% The format of the ChannelImage method is:
+%
+% unsigned int ChannelImage(Image *image,const ChannelType channel)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image: the image.
+%
+% o channel: Identify which channel to extract: RedChannel, GreenChannel,
+% BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, YellowChannel,
+% or BlackChannel.
%
*/
-WandExport void DrawPushGraphicContext(DrawingWand *wand)
+MagickExport unsigned int ChannelImage(Image *image,const ChannelType channel)
{
- (void) PushDrawingWand(wand);
+ return(SeparateImageChannel(image,channel));
}
\f
/*
% %
% %
% %
-% D r a w S e t F i l l A l p h a %
+% C h a n n e l T h r e s h o l d I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawSetFillAlpha() sets the alpha to use when drawing using the fill
-% color or fill texture. Fully opaque is 1.0.
+% ChannelThresholdImage() changes the value of individual pixels based on
+% the intensity of each pixel channel. The result is a high-contrast image.
%
-% The format of the DrawSetFillAlpha method is:
+% The format of the ChannelThresholdImage method is:
%
-% void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha)
+% unsigned int ChannelThresholdImage(Image *image,const char *level)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image: the image.
%
-% o fill_alpha: fill alpha
+% o level: define the threshold values.
%
*/
-WandExport void DrawSetFillAlpha(DrawingWand *wand,const double fill_alpha)
+MagickExport unsigned int ChannelThresholdImage(Image *image,const char *level)
{
- DrawSetFillOpacity(wand,fill_alpha);
+ MagickPixelPacket
+ threshold;
+
+ GeometryInfo
+ geometry_info;
+
+ unsigned int
+ flags,
+ status;
+
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (level == (char *) NULL)
+ return(MagickFalse);
+ flags=ParseGeometry(level,&geometry_info);
+ threshold.red=geometry_info.rho;
+ threshold.green=geometry_info.sigma;
+ if ((flags & SigmaValue) == 0)
+ threshold.green=threshold.red;
+ threshold.blue=geometry_info.xi;
+ if ((flags & XiValue) == 0)
+ threshold.blue=threshold.red;
+ status=BilevelImageChannel(image,RedChannel,threshold.red);
+ status|=BilevelImageChannel(image,GreenChannel,threshold.green);
+ status|=BilevelImageChannel(image,BlueChannel,threshold.blue);
+ return(status);
}
\f
/*
% %
% %
% %
-% D r a w S e t S t r o k e A l p h a %
+% C l i p I m a g e P a t h %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% DrawSetStrokeAlpha() specifies the alpha of stroked object outlines.
+% ClipPathImage() sets the image clip mask based any clipping path information
+% if it exists.
+%
+% Deprecated, replace with:
+%
+% ClipImagePath(image,pathname,inside);
%
-% The format of the DrawSetStrokeAlpha method is:
+% The format of the ClipImage method is:
%
-% void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha)
+% MagickBooleanType ClipPathImage(Image *image,const char *pathname,
+% const MagickBooleanType inside)
%
% A description of each parameter follows:
%
-% o wand: the drawing wand.
+% o image: the image.
%
-% o stroke_alpha: stroke alpha. The value 1.0 is opaque.
+% o pathname: name of clipping path resource. If name is preceded by #, use
+% clipping path numbered by name.
+%
+% o inside: if non-zero, later operations take effect inside clipping path.
+% Otherwise later operations take effect outside clipping path.
%
*/
-WandExport void DrawSetStrokeAlpha(DrawingWand *wand,const double stroke_alpha)
+MagickExport MagickBooleanType ClipPathImage(Image *image,const char *pathname,
+ const MagickBooleanType inside)
{
- DrawSetStrokeOpacity(wand,stroke_alpha);
+ return(ClipImagePath(image,pathname,inside));
}
\f
/*
% %
% %
% %
-% M a g i c k C o l o r F l o o d f i l l I m a g e %
+% C l o n e I m a g e A t t r i b u t e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickColorFloodfillImage() changes the color value of any pixel that matches
-% target and is an immediate neighbor. If the method FillToBorderMethod is
-% specified, the color value is changed for any neighbor pixel that does not
-% match the bordercolor member of image.
-%
-% The format of the MagickColorFloodfillImage method is:
+% CloneImageAttributes() clones one or more image attributes.
%
-% MagickBooleanType MagickColorFloodfillImage(MagickWand *wand,
-% const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
-% const ssize_t x,const ssize_t y)
+% Deprecated, replace with:
%
-% A description of each parameter follows:
+% CloneImageProperties(image,clone_image);
%
-% o wand: the magick wand.
+% The format of the CloneImageAttributes method is:
%
-% o fill: the floodfill color pixel wand.
+% MagickBooleanType CloneImageAttributes(Image *image,
+% const Image *clone_image)
%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% A description of each parameter follows:
%
-% o bordercolor: the border color pixel wand.
+% o image: the image.
%
-% o x,y: the starting location of the operation.
+% o clone_image: the clone image.
%
*/
-WandExport MagickBooleanType MagickColorFloodfillImage(MagickWand *wand,
- const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
- const ssize_t x,const ssize_t y)
+MagickExport MagickBooleanType CloneImageAttributes(Image *image,
+ const Image *clone_image)
{
- DrawInfo
- *draw_info;
-
- MagickBooleanType
- status;
-
- PixelPacket
- target;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
- PixelGetQuantumColor(fill,&draw_info->fill);
- (void) GetOneVirtualPixel(wand->images,x % wand->images->columns,
- y % wand->images->rows,&target,wand->exception);
- if (bordercolor != (PixelWand *) NULL)
- PixelGetQuantumColor(bordercolor,&target);
- wand->images->fuzz=fuzz;
- status=ColorFloodfillImage(wand->images,draw_info,target,x,y,
- bordercolor != (PixelWand *) NULL ? FillToBorderMethod : FloodfillMethod);
- if (status == MagickFalse)
- InheritException(wand->exception,&wand->images->exception);
- draw_info=DestroyDrawInfo(draw_info);
- return(status);
+ return(CloneImageProperties(image,clone_image));
}
\f
/*
% %
% %
% %
-% M a g i c k D e s c r i b e I m a g e %
+% C l o n e M e m o r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickDescribeImage() identifies an image by printing its attributes to the
-% file. Attributes include the image width, height, size, and others.
+% CloneMemory() copies size bytes from memory area source to the destination.
+% Copying between objects that overlap will take place correctly. It returns
+% destination.
%
-% The format of the MagickDescribeImage method is:
+% The format of the CloneMemory method is:
%
-% const char *MagickDescribeImage(MagickWand *wand)
+% void *CloneMemory(void *destination,const void *source,
+% const size_t size)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o destination: the destination.
+%
+% o source: the source.
+%
+% o size: the size of the memory in bytes to allocate.
%
*/
-WandExport char *MagickDescribeImage(MagickWand *wand)
+MagickExport void *CloneMemory(void *destination,const void *source,
+ const size_t size)
{
- return(MagickIdentifyImage(wand));
+ register const unsigned char
+ *p;
+
+ register unsigned char
+ *q;
+
+ register ssize_t
+ i;
+
+ assert(destination != (void *) NULL);
+ assert(source != (const void *) NULL);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ p=(const unsigned char *) source;
+ q=(unsigned char *) destination;
+ if ((p <= q) || ((p+size) >= q))
+ return(CopyMagickMemory(destination,source,size));
+ /*
+ Overlap, copy backwards.
+ */
+ p+=size;
+ q+=size;
+ for (i=(ssize_t) (size-1); i >= 0; i--)
+ *--q=(*--p);
+ return(destination);
}
\f
/*
% %
% %
% %
-% M a g i c k F l a t t e n I m a g e s %
+% C l o s e C a c h e V i e w %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickFlattenImages() merges a sequence of images. This useful for
-% combining Photoshop layers into a single image.
+% CloseCacheView() closes the specified view returned by a previous call to
+% OpenCacheView().
+%
+% Deprecated, replace with:
+%
+% DestroyCacheView(view_info);
%
-% The format of the MagickFlattenImages method is:
+% The format of the CloseCacheView method is:
%
-% MagickWand *MagickFlattenImages(MagickWand *wand)
+% CacheView *CloseCacheView(CacheView *view_info)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o view_info: the address of a structure of type CacheView.
%
*/
-WandExport MagickWand *MagickFlattenImages(MagickWand *wand)
+MagickExport CacheView *CloseCacheView(CacheView *view_info)
{
- Image
- *flatten_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- return((MagickWand *) NULL);
- flatten_image=FlattenImages(wand->images,wand->exception);
- if (flatten_image == (Image *) NULL)
- return((MagickWand *) NULL);
- return(CloneMagickWandFromImages(wand,flatten_image));
+ return(DestroyCacheView(view_info));
}
\f
/*
% %
% %
% %
-% M a g i c k G e t I m a g e A t t r i b u t e %
+% C o l o r F l o o d f i l l I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageAttribute() returns a value associated with the specified
-% property. Use MagickRelinquishMemory() to free the value when you are
-% finished with it.
+% ColorFloodfill() changes the color value of any pixel that matches
+% target and is an immediate neighbor. If the method FillToBorderMethod is
+% specified, the color value is changed for any neighbor pixel that does not
+% match the bordercolor member of image.
+%
+% By default target must match a particular pixel color exactly.
+% However, in many cases two colors may differ by a small amount. The
+% fuzz member of image defines how much tolerance is acceptable to
+% consider two colors as the same. For example, set fuzz to 10 and the
+% color red at intensities of 100 and 102 respectively are now
+% interpreted as the same color for the purposes of the floodfill.
%
-% The format of the MagickGetImageAttribute method is:
+% The format of the ColorFloodfillImage method is:
%
-% char *MagickGetImageAttribute(MagickWand *wand,const char *property)
+% MagickBooleanType ColorFloodfillImage(Image *image,
+% const DrawInfo *draw_info,const PixelPacket target,
+% const ssize_t x_offset,const ssize_t y_offset,const PaintMethod method)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
+%
+% o draw_info: the draw info.
+%
+% o target: the RGB value of the target color.
%
-% o property: the property.
+% o x,y: the starting location of the operation.
+%
+% o method: Choose either FloodfillMethod or FillToBorderMethod.
%
*/
-WandExport char *MagickGetImageAttribute(MagickWand *wand,const char *property)
+
+#define MaxStacksize (1UL << 15)
+#define PushSegmentStack(up,left,right,delta) \
+{ \
+ if (s >= (segment_stack+MaxStacksize)) \
+ ThrowBinaryException(DrawError,"SegmentStackOverflow",image->filename) \
+ else \
+ { \
+ if ((((up)+(delta)) >= 0) && (((up)+(delta)) < (ssize_t) image->rows)) \
+ { \
+ s->x1=(double) (left); \
+ s->y1=(double) (up); \
+ s->x2=(double) (right); \
+ s->y2=(double) (delta); \
+ s++; \
+ } \
+ } \
+}
+
+MagickExport MagickBooleanType ColorFloodfillImage(Image *image,
+ const DrawInfo *draw_info,const PixelPacket target,const ssize_t x_offset,
+ const ssize_t y_offset,const PaintMethod method)
{
- return(MagickGetImageProperty(wand,property));
+ Image
+ *floodplane_image;
+
+ MagickBooleanType
+ skip;
+
+ PixelPacket
+ fill_color;
+
+ register SegmentInfo
+ *s;
+
+ SegmentInfo
+ *segment_stack;
+
+ ssize_t
+ offset,
+ start,
+ x,
+ x1,
+ x2,
+ y;
+
+ /*
+ Check boundary conditions.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(draw_info != (DrawInfo *) NULL);
+ assert(draw_info->signature == MagickSignature);
+ if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
+ return(MagickFalse);
+ if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
+ return(MagickFalse);
+ if (SetImageStorageClass(image,DirectClass) == MagickFalse)
+ return(MagickFalse);
+ if (image->matte == MagickFalse)
+ (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
+ floodplane_image=CloneImage(image,image->columns,image->rows,MagickTrue,
+ &image->exception);
+ if (floodplane_image == (Image *) NULL)
+ return(MagickFalse);
+ (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
+ /*
+ Set floodfill color.
+ */
+ segment_stack=(SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
+ sizeof(*segment_stack));
+ if (segment_stack == (SegmentInfo *) NULL)
+ {
+ floodplane_image=DestroyImage(floodplane_image);
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ image->filename);
+ }
+ /*
+ Push initial segment on stack.
+ */
+ x=x_offset;
+ y=y_offset;
+ start=0;
+ s=segment_stack;
+ PushSegmentStack(y,x,x,1);
+ PushSegmentStack(y+1,x,x,-1);
+ while (s > segment_stack)
+ {
+ register const PixelPacket
+ *restrict p;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ /*
+ Pop segment off stack.
+ */
+ s--;
+ x1=(ssize_t) s->x1;
+ x2=(ssize_t) s->x2;
+ offset=(ssize_t) s->y2;
+ y=(ssize_t) s->y1+offset;
+ /*
+ Recolor neighboring pixels.
+ */
+ p=GetVirtualPixels(image,0,y,(size_t) (x1+1),1,&image->exception);
+ q=GetAuthenticPixels(floodplane_image,0,y,(size_t) (x1+1),1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ p+=x1;
+ q+=x1;
+ for (x=x1; x >= 0; x--)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ q->opacity=(Quantum) TransparentOpacity;
+ p--;
+ q--;
+ }
+ if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
+ break;
+ skip=x >= x1 ? MagickTrue : MagickFalse;
+ if (skip == MagickFalse)
+ {
+ start=x+1;
+ if (start < x1)
+ PushSegmentStack(y,start,x1-1,-offset);
+ x=x1+1;
+ }
+ do
+ {
+ if (skip == MagickFalse)
+ {
+ if (x < (ssize_t) image->columns)
+ {
+ p=GetVirtualPixels(image,x,y,image->columns-x,1,
+ &image->exception);
+ q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) ||
+ (q == (PixelPacket *) NULL))
+ break;
+ for ( ; x < (ssize_t) image->columns; x++)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ q->opacity=(Quantum) TransparentOpacity;
+ p++;
+ q++;
+ }
+ if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
+ break;
+ }
+ PushSegmentStack(y,start,x-1,offset);
+ if (x > (x2+1))
+ PushSegmentStack(y,x2+1,x-1,-offset);
+ }
+ skip=MagickFalse;
+ x++;
+ if (x <= x2)
+ {
+ p=GetVirtualPixels(image,x,y,(size_t) (x2-x+1),1,
+ &image->exception);
+ q=GetAuthenticPixels(floodplane_image,x,y,(size_t) (x2-x+1),1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ for ( ; x <= x2; x++)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ p++;
+ q++;
+ }
+ }
+ start=x;
+ } while (x <= x2);
+ }
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register const PixelPacket
+ *restrict p;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ /*
+ Tile fill color onto floodplane.
+ */
+ p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
+ &image->exception);
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (GetOpacityPixelComponent(p) != OpaqueOpacity)
+ {
+ (void) GetFillColor(draw_info,x,y,&fill_color);
+ MagickCompositeOver(&fill_color,(MagickRealType) fill_color.opacity,q,
+ (MagickRealType) q->opacity,q);
+ }
+ p++;
+ q++;
+ }
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ }
+ segment_stack=(SegmentInfo *) RelinquishMagickMemory(segment_stack);
+ floodplane_image=DestroyImage(floodplane_image);
+ return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
}
\f
/*
% %
% %
% %
-+ M a g i c k G e t I m a g e I n d e x %
+% D e l e t e I m a g e A t t r i b u t e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageIndex() returns the index of the current image.
+% DeleteImageAttribute() deletes an attribute from the image.
%
-% The format of the MagickGetImageIndex method is:
+% Deprecated, replace with:
%
-% ssize_t MagickGetImageIndex(MagickWand *wand)
+% DeleteImageProperty(image,key);
+%
+% The format of the DeleteImageAttribute method is:
+%
+% MagickBooleanType DeleteImageAttribute(Image *image,const char *key)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image info.
+%
+% o key: the image key.
%
*/
-WandExport ssize_t MagickGetImageIndex(MagickWand *wand)
+MagickExport MagickBooleanType DeleteImageAttribute(Image *image,
+ const char *key)
{
- return(MagickGetIteratorIndex(wand));
+ return(DeleteImageProperty(image,key));
}
\f
/*
% %
% %
% %
-+ M a g i c k G e t I m a g e C h a n n e l E x t r e m a %
+% D e l e t e I m a g e L i s t %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageChannelExtrema() gets the extrema for one or more image
-% channels.
+% DeleteImageList() deletes an image at the specified position in the list.
%
-% The format of the MagickGetImageChannelExtrema method is:
+% The format of the DeleteImageList method is:
%
-% MagickBooleanType MagickGetImageChannelExtrema(MagickWand *wand,
-% const ChannelType channel,size_t *minima,size_t *maxima)
+% unsigned int DeleteImageList(Image *images,const ssize_t offset)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
-%
-% o channel: the image channel(s).
+% o images: the image list.
%
-% o minima: The minimum pixel value for the specified channel(s).
-%
-% o maxima: The maximum pixel value for the specified channel(s).
+% o offset: the position within the list.
%
*/
-WandExport MagickBooleanType MagickGetImageChannelExtrema(MagickWand *wand,
- const ChannelType channel,size_t *minima,size_t *maxima)
+MagickExport unsigned int DeleteImageList(Image *images,const ssize_t offset)
{
- MagickBooleanType
- status;
+ register ssize_t
+ i;
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- status=GetImageChannelExtrema(wand->images,channel,minima,maxima,
- wand->exception);
- return(status);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ while (GetPreviousImageInList(images) != (Image *) NULL)
+ images=GetPreviousImageInList(images);
+ for (i=0; i < offset; i++)
+ {
+ if (GetNextImageInList(images) == (Image *) NULL)
+ return(MagickFalse);
+ images=GetNextImageInList(images);
+ }
+ DeleteImageFromList(&images);
+ return(MagickTrue);
}
\f
/*
% %
% %
% %
-+ M a g i c k G e t I m a g e E x t r e m a %
+% D e l e t e M a g i c k R e g i s t r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageExtrema() gets the extrema for the image.
+% DeleteMagickRegistry() deletes an entry in the registry as defined by the id.
+% It returns MagickTrue if the entry is deleted otherwise MagickFalse if no
+% entry is found in the registry that matches the id.
%
-% The format of the MagickGetImageExtrema method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickGetImageExtrema(MagickWand *wand,
-% size_t *minima,size_t *maxima)
+% char key[MaxTextExtent];
+% FormatMagickString(key,MaxTextExtent,"%ld\n",id);
+% DeleteImageRegistry(key);
%
-% A description of each parameter follows:
+% The format of the DeleteMagickRegistry method is:
%
-% o wand: the magick wand.
+% MagickBooleanType DeleteMagickRegistry(const ssize_t id)
%
-% o minima: The minimum pixel value for the specified channel(s).
+% A description of each parameter follows:
%
-% o maxima: The maximum pixel value for the specified channel(s).
+% o id: the registry id.
%
*/
-WandExport MagickBooleanType MagickGetImageExtrema(MagickWand *wand,
- size_t *minima,size_t *maxima)
+MagickExport MagickBooleanType DeleteMagickRegistry(const ssize_t id)
{
- MagickBooleanType
- status;
+ char
+ key[MaxTextExtent];
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- status=GetImageExtrema(wand->images,minima,maxima,wand->exception);
- return(status);
+ (void) FormatMagickString(key,MaxTextExtent,"%.20g\n",(double) id);
+ return(DeleteImageRegistry(key));
}
\f
/*
% %
% %
% %
-% M a g i c k G e t I m a g e M a t t e %
++ D e s t r o y C o n s t i t u t e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageMatte() returns MagickTrue if the image has a matte channel
-% otherwise MagickFalse.
-%
-% The format of the MagickGetImageMatte method is:
-%
-% size_t MagickGetImageMatte(MagickWand *wand)
+% DestroyConstitute() destroys the constitute component.
%
-% A description of each parameter follows:
+% The format of the DestroyConstitute method is:
%
-% o wand: the magick wand.
+% DestroyConstitute(void)
%
*/
-WandExport MagickBooleanType MagickGetImageMatte(MagickWand *wand)
+MagickExport void DestroyConstitute(void)
{
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- return(wand->images->matte);
+ ConstituteComponentTerminus();
}
\f
/*
% %
% %
% %
-% M a g i c k G e t I m a g e P i x e l s %
++ D e s t r o y M a g i c k R e g i s t r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImagePixels() extracts pixel data from an image and returns it to
-% you. The method returns MagickTrue on success otherwise MagickFalse if an
-% error is encountered. The data is returned as char, short int, int, ssize_t,
-% float, or double in the order specified by map.
-%
-% Suppose you want to extract the first scanline of a 640x480 image as
-% character data in red-green-blue order:
-%
-% MagickGetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
-%
-% The format of the MagickGetImagePixels method is:
-%
-% MagickBooleanType MagickGetImagePixels(MagickWand *wand,
-% const ssize_t x,const ssize_t y,const size_t columns,
-% const size_t rows,const char *map,const StorageType storage,
-% void *pixels)
-%
-% A description of each parameter follows:
+% DestroyMagickRegistry() deallocates memory associated the magick registry.
%
-% o wand: the magick wand.
+% Deprecated, replace with:
%
-% o x, y, columns, rows: These values define the perimeter
-% of a region of pixels you want to extract.
-%
-% o map: This string reflects the expected ordering of the pixel array.
-% It can be any combination or order of R = red, G = green, B = blue,
-% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
-% Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
-% P = pad.
+% RegistryComponentTerminus();
%
-% o storage: Define the data type of the pixels. Float and double types are
-% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from
-% these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel,
-% LongPixel, QuantumPixel, or ShortPixel.
+% The format of the DestroyMagickRegistry method is:
%
-% o pixels: This array of values contain the pixel components as defined by
-% map and type. You must preallocate this array where the expected
-% length varies depending on the values of width, height, map, and type.
+% void DestroyMagickRegistry(void)
%
*/
-WandExport MagickBooleanType MagickGetImagePixels(MagickWand *wand,
- const ssize_t x,const ssize_t y,const size_t columns,
- const size_t rows,const char *map,const StorageType storage,
- void *pixels)
+MagickExport void DestroyMagickRegistry(void)
{
- return(MagickExportImagePixels(wand,x,y,columns,rows,map,storage,pixels));
+ RegistryComponentTerminus();
}
\f
/*
% %
% %
% %
-% M a g i c k G e t I m a g e S i z e %
+% D e s c r i b e I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickGetImageSize() returns the image length in bytes.
+% DescribeImage() describes an image by printing its attributes to the file.
+% Attributes include the image width, height, size, and others.
%
-% The format of the MagickGetImageSize method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickGetImageSize(MagickWand *wand,
-% MagickSizeType *length)
+% IdentifyImage(image,file,verbose);
+%
+% The format of the DescribeImage method is:
+%
+% MagickBooleanType DescribeImage(Image *image,FILE *file,
+% const MagickBooleanType verbose)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
%
-% o length: the image length in bytes.
+% o file: the file, typically stdout.
+%
+% o verbose: A value other than zero prints more detailed information
+% about the image.
%
*/
-WandExport MagickSizeType MagickGetImageSize(MagickWand *wand)
+MagickExport MagickBooleanType DescribeImage(Image *image,FILE *file,
+ const MagickBooleanType verbose)
{
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- return(GetBlobSize(wand->images));
+ return(IdentifyImage(image,file,verbose));
}
\f
/*
% %
% %
% %
-% M a g i c k M a p I m a g e %
+% D e s t r o y I m a g e A t t r i b u t e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMapImage() replaces the colors of an image with the closest color
-% from a reference image.
+% DestroyImageAttributes() deallocates memory associated with the image
+% attribute list.
%
-% The format of the MagickMapImage method is:
+% The format of the DestroyImageAttributes method is:
%
-% MagickBooleanType MagickMapImage(MagickWand *wand,
-% const MagickWand *map_wand,const MagickBooleanType dither)
+% DestroyImageAttributes(Image *image)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
-%
-% o map: the map wand.
-%
-% o dither: Set this integer value to something other than zero to dither
-% the mapped image.
+% o image: the image.
%
*/
-WandExport MagickBooleanType MagickMapImage(MagickWand *wand,
- const MagickWand *map_wand,const MagickBooleanType dither)
+MagickExport void DestroyImageAttributes(Image *image)
{
- MagickBooleanType
- status;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if ((wand->images == (Image *) NULL) || (map_wand->images == (Image *) NULL))
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- status=MapImage(wand->images,map_wand->images,dither);
- if (status == MagickFalse)
- InheritException(wand->exception,&wand->images->exception);
- return(status);
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if (image->attributes != (void *) NULL)
+ image->attributes=(void *) DestroySplayTree((SplayTreeInfo *)
+ image->attributes);
}
\f
/*
% %
% %
% %
-% M a g i c k M a t t e F l o o d f i l l I m a g e %
+% D e s t r o y I m a g e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMatteFloodfillImage() changes the transparency value of any pixel that
-% matches target and is an immediate neighbor. If the method
-% FillToBorderMethod is specified, the transparency value is changed for any
-% neighbor pixel that does not match the bordercolor member of image.
-%
-% The format of the MagickMatteFloodfillImage method is:
-%
-% MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand,
-% const double alpha,const double fuzz,const PixelWand *bordercolor,
-% const ssize_t x,const ssize_t y)
+% DestroyImages() destroys an image list.
%
-% A description of each parameter follows:
+% Deprecated, replace with:
%
-% o wand: the magick wand.
+% DestroyImageList(image);
%
-% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
-% transparent.
+% The format of the DestroyImages method is:
%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% void DestroyImages(Image *image)
%
-% o bordercolor: the border color pixel wand.
+% A description of each parameter follows:
%
-% o x,y: the starting location of the operation.
+% o image: the image sequence.
%
*/
-WandExport MagickBooleanType MagickMatteFloodfillImage(MagickWand *wand,
- const double alpha,const double fuzz,const PixelWand *bordercolor,
- const ssize_t x,const ssize_t y)
+MagickExport void DestroyImages(Image *image)
{
- DrawInfo
- *draw_info;
-
- MagickBooleanType
- status;
-
- PixelPacket
- target;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
- (void) GetOneVirtualPixel(wand->images,x % wand->images->columns,
- y % wand->images->rows,&target,wand->exception);
- if (bordercolor != (PixelWand *) NULL)
- PixelGetQuantumColor(bordercolor,&target);
- wand->images->fuzz=fuzz;
- status=MatteFloodfillImage(wand->images,target,ClampToQuantum(
- (MagickRealType) QuantumRange-QuantumRange*alpha),x,y,bordercolor !=
- (PixelWand *) NULL ? FillToBorderMethod : FloodfillMethod);
- if (status == MagickFalse)
- InheritException(wand->exception,&wand->images->exception);
- draw_info=DestroyDrawInfo(draw_info);
- return(status);
+ if (image == (Image *) NULL)
+ return;
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.3");
+ image=DestroyImageList(image);
}
\f
/*
% %
% %
% %
-% M a g i c k M e d i a n F i l t e r I m a g e %
+% D e s t r o y M a g i c k %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMedianFilterImage() applies a digital filter that improves the quality
-% of a noisy image. Each pixel is replaced by the median in a set of
-% neighboring pixels as defined by radius.
-%
-% The format of the MagickMedianFilterImage method is:
+% DestroyMagick() destroys the ImageMagick environment.
%
-% MagickBooleanType MagickMedianFilterImage(MagickWand *wand,
-% const double radius)
+% Deprecated, replace with:
%
-% A description of each parameter follows:
+% MagickCoreTerminus();
%
-% o wand: the magick wand.
+% The format of the DestroyMagick function is:
%
-% o radius: the radius of the pixel neighborhood.
+% DestroyMagick(void)
%
*/
-WandExport MagickBooleanType MagickMedianFilterImage(MagickWand *wand,
- const double radius)
+MagickExport void DestroyMagick(void)
{
- Image
- *median_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- median_image=MedianFilterImage(wand->images,radius,wand->exception);
- if (median_image == (Image *) NULL)
- return(MagickFalse);
- ReplaceImageInList(&wand->images,median_image);
- return(MagickTrue);
+ MagickCoreTerminus();
}
\f
/*
% %
% %
% %
-% M a g i c k M i n i m u m I m a g e s %
+% D i s p a t c h I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMinimumImages() returns the minimum intensity of an image sequence.
+% DispatchImage() extracts pixel data from an image and returns it to you.
+% The method returns MagickFalse on success otherwise MagickTrue if an error is
+% encountered. The data is returned as char, short int, int, ssize_t, float,
+% or double in the order specified by map.
%
-% The format of the MagickMinimumImages method is:
+% Suppose you want to extract the first scanline of a 640x480 image as
+% character data in red-green-blue order:
%
-% MagickWand *MagickMinimumImages(MagickWand *wand)
+% DispatchImage(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
%
-% A description of each parameter follows:
+% Deprecated, replace with:
%
-% o wand: the magick wand.
+% ExportImagePixels(image,x_offset,y_offset,columns,rows,map,type,pixels,
+% exception);
%
-*/
-WandExport MagickWand *MagickMinimumImages(MagickWand *wand)
-{
- Image
- *minimum_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- return((MagickWand *) NULL);
- minimum_image=EvaluateImages(wand->images,MinEvaluateOperator,
- wand->exception);
- if (minimum_image == (Image *) NULL)
- return((MagickWand *) NULL);
- return(CloneMagickWandFromImages(wand,minimum_image));
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-% %
-% %
-% M a g i c k M o d e I m a g e %
-% %
-% %
-% %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The format of the DispatchImage method is:
%
-% MagickModeImage() makes each pixel the 'predominate color' of the
-% neighborhood of the specified radius.
+% unsigned int DispatchImage(const Image *image,const ssize_t x_offset,
+% const ssize_t y_offset,const size_t columns,
+% const size_t rows,const char *map,const StorageType type,
+% void *pixels,ExceptionInfo *exception)
%
-% The format of the MagickModeImage method is:
+% A description of each parameter follows:
%
-% MagickBooleanType MagickModeImage(MagickWand *wand,
-% const double radius)
+% o image: the image.
%
-% A description of each parameter follows:
+% o x_offset, y_offset, columns, rows: These values define the perimeter
+% of a region of pixels you want to extract.
%
-% o wand: the magick wand.
+% o map: This string reflects the expected ordering of the pixel array.
+% It can be any combination or order of R = red, G = green, B = blue,
+% A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or
+% I = intensity (for grayscale).
%
-% o radius: the radius of the pixel neighborhood.
+% o type: Define the data type of the pixels. Float and double types are
+% normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
+% types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or
+% DoublePixel.
+%
+% o pixels: This array of values contain the pixel components as defined by
+% map and type. You must preallocate this array where the expected
+% length varies depending on the values of width, height, map, and type.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickBooleanType MagickModeImage(MagickWand *wand,
- const double radius)
+MagickExport unsigned int DispatchImage(const Image *image,const ssize_t x_offset,
+ const ssize_t y_offset,const size_t columns,const size_t rows,
+ const char *map,const StorageType type,void *pixels,ExceptionInfo *exception)
{
- Image
- *mode_image;
+ unsigned int
+ status;
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- mode_image=ModeImage(wand->images,radius,wand->exception);
- if (mode_image == (Image *) NULL)
- return(MagickFalse);
- ReplaceImageInList(&wand->images,mode_image);
- return(MagickTrue);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
+ status=ExportImagePixels(image,x_offset,y_offset,columns,rows,map,type,pixels,
+ exception);
+ return(status);
}
\f
/*
% %
% %
% %
-% M a g i c k M o s a i c I m a g e s %
+% E x t r a c t S u b i m a g e F r o m I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMosaicImages() inlays an image sequence to form a single coherent
-% picture. It returns a wand with each image in the sequence composited at
-% the location defined by the page offset of the image.
+% ExtractSubimageFromImageImage() extracts a region of the image that most
+% closely resembles the reference.
%
-% The format of the MagickMosaicImages method is:
+% The format of the ExtractSubimageFromImageImage method is:
%
-% MagickWand *MagickMosaicImages(MagickWand *wand)
+% Image *ExtractSubimageFromImage(const Image *image,
+% const Image *reference,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
+%
+% o reference: find an area of the image that closely resembles this image.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickWand *MagickMosaicImages(MagickWand *wand)
+
+static double GetSimilarityMetric(const Image *image,const Image *reference,
+ const ssize_t x_offset,const ssize_t y_offset,
+ const double similarity_threshold,ExceptionInfo *exception)
{
- Image
- *mosaic_image;
+ CacheView
+ *image_view,
+ *reference_view;
+
+ double
+ channels,
+ normalized_similarity,
+ similarity;
+
+ ssize_t
+ y;
+
+ /*
+ Compute the similarity in pixels between two images.
+ */
+ normalized_similarity=1.0;
+ similarity=0.0;
+ channels=3;
+ if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
+ channels++;
+ if ((image->colorspace == CMYKColorspace) &&
+ (reference->colorspace == CMYKColorspace))
+ channels++;
+ image_view=AcquireCacheView(image);
+ reference_view=AcquireCacheView(reference);
+ for (y=0; y < (ssize_t) reference->rows; y++)
+ {
+ register const IndexPacket
+ *indexes,
+ *reference_indexes;
+
+ register const PixelPacket
+ *p,
+ *q;
+
+ register ssize_t
+ x;
+
+ p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset+y,
+ reference->columns,1,exception);
+ q=GetCacheViewVirtualPixels(reference_view,0,y,reference->columns,1,
+ exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL))
+ continue;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ reference_indexes=GetCacheViewVirtualIndexQueue(reference_view);
+ for (x=0; x < (ssize_t) reference->columns; x++)
+ {
+ MagickRealType
+ pixel;
+
+ pixel=QuantumScale*(GetRedPixelComponent(p)-(double)
+ GetRedPixelComponent(q));
+ similarity+=pixel*pixel;
+ pixel=QuantumScale*(GetGreenPixelComponent(p)-(double)
+ GetGreenPixelComponent(q));
+ similarity+=pixel*pixel;
+ pixel=QuantumScale*(GetBluePixelComponent(p)-(double)
+ GetBluePixelComponent(q));
+ similarity+=pixel*pixel;
+ if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
+ {
+ pixel=QuantumScale*(GetOpacityPixelComponent(p)-(double)
+ GetOpacityPixelComponent(q));
+ similarity+=pixel*pixel;
+ }
+ if ((image->colorspace == CMYKColorspace) &&
+ (reference->colorspace == CMYKColorspace))
+ {
+ pixel=QuantumScale*(GetIndexPixelComponent(indexes+x)-(double)
+ GetIndexPixelComponent(reference_indexes+x));
+ similarity+=pixel*pixel;
+ }
+ p++;
+ q++;
+ }
+ normalized_similarity=sqrt(similarity)/reference->columns/reference->rows/
+ channels;
+ if (normalized_similarity > similarity_threshold)
+ break;
+ }
+ reference_view=DestroyCacheView(reference_view);
+ image_view=DestroyCacheView(image_view);
+ return(normalized_similarity);
+}
+
+MagickExport Image *ExtractSubimageFromImage(Image *image,
+ const Image *reference,ExceptionInfo *exception)
+{
+ double
+ similarity_threshold;
+
+ RectangleInfo
+ offset;
+
+ ssize_t
+ y;
+
+ /*
+ Extract reference from image.
+ */
+ if ((reference->columns > image->columns) || (reference->rows > image->rows))
+ return((Image *) NULL);
+ similarity_threshold=(double) image->columns*image->rows;
+ SetGeometry(reference,&offset);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp parallel for schedule(dynamic,4)
+#endif
+ for (y=0; y < (ssize_t) (image->rows-reference->rows); y++)
+ {
+ double
+ similarity;
+
+ register ssize_t
+ x;
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- return((MagickWand *) NULL);
- mosaic_image=MosaicImages(wand->images,wand->exception);
- if (mosaic_image == (Image *) NULL)
- return((MagickWand *) NULL);
- return(CloneMagickWandFromImages(wand,mosaic_image));
+ for (x=0; x < (ssize_t) (image->columns-reference->columns); x++)
+ {
+ similarity=GetSimilarityMetric(image,reference,x,y,similarity_threshold,
+ exception);
+#if defined(MAGICKCORE_OPENMP_SUPPORT)
+ #pragma omp critical (MagickCore_ExtractSubimageFromImage)
+#endif
+ if (similarity < similarity_threshold)
+ {
+ similarity_threshold=similarity;
+ offset.x=x;
+ offset.y=y;
+ }
+ }
+ }
+ if (similarity_threshold > (QuantumScale*reference->fuzz/100.0))
+ return((Image *) NULL);
+ return(CropImage(image,&offset,exception));
}
\f
/*
% %
% %
% %
-% M a g i c k O p a q u e I m a g e %
+% F l a t t e n I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickOpaqueImage() changes any pixel that matches color with the color
-% defined by fill.
-%
-% The format of the MagickOpaqueImage method is:
+% FlattenImages() Obsolete Function: Use MergeImageLayers() instead.
%
-% MagickBooleanType MagickOpaqueImage(MagickWand *wand,
-% const PixelWand *target,const PixelWand *fill,const double fuzz)
+% Deprecated, replace with:
%
-% A description of each parameter follows:
+% MergeImageLayers(image,FlattenLayer,exception);
%
-% o wand: the magick wand.
+% The format of the FlattenImage method is:
%
-% o channel: the channel(s).
+% Image *FlattenImage(Image *image,ExceptionInfo *exception)
%
-% o target: Change this target color to the fill color within the image.
+% A description of each parameter follows:
%
-% o fill: the fill pixel wand.
+% o image: the image sequence.
%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickBooleanType MagickOpaqueImage(MagickWand *wand,
- const PixelWand *target,const PixelWand *fill,const double fuzz)
+MagickExport Image *FlattenImages(Image *image,ExceptionInfo *exception)
{
- return(MagickPaintOpaqueImage(wand,target,fill,fuzz));
+ return(MergeImageLayers(image,FlattenLayer,exception));
}
\f
/*
% %
% %
% %
-% M a g i c k P a i n t F l o o d f i l l I m a g e %
+% F o r m a t I m a g e A t t r i b u t e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickPaintFloodfillImage() changes the color value of any pixel that matches
-% target and is an immediate neighbor. If the method FillToBorderMethod is
-% specified, the color value is changed for any neighbor pixel that does not
-% match the bordercolor member of image.
-%
-% The format of the MagickPaintFloodfillImage method is:
-%
-% MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand,
-% const ChannelType channel,const PixelWand *fill,const double fuzz,
-% const PixelWand *bordercolor,const ssize_t x,const ssize_t y)
+% FormatImageAttribute() permits formatted key/value pairs to be saved as an
+% image attribute.
%
-% A description of each parameter follows:
-%
-% o wand: the magick wand.
+% The format of the FormatImageAttribute method is:
%
-% o channel: the channel(s).
+% MagickBooleanType FormatImageAttribute(Image *image,const char *key,
+% const char *format,...)
%
-% o fill: the floodfill color pixel wand.
+% A description of each parameter follows.
%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% o image: The image.
%
-% o bordercolor: the border color pixel wand.
+% o key: The attribute key.
%
-% o x,y: the starting location of the operation.
+% o format: A string describing the format to use to write the remaining
+% arguments.
%
*/
-WandExport MagickBooleanType MagickPaintFloodfillImage(MagickWand *wand,
- const ChannelType channel,const PixelWand *fill,const double fuzz,
- const PixelWand *bordercolor,const ssize_t x,const ssize_t y)
+
+MagickExport MagickBooleanType FormatImageAttributeList(Image *image,
+ const char *key,const char *format,va_list operands)
+{
+ char
+ value[MaxTextExtent];
+
+ int
+ n;
+
+#if defined(MAGICKCORE_HAVE_VSNPRINTF)
+ n=vsnprintf(value,MaxTextExtent,format,operands);
+#else
+ n=vsprintf(value,format,operands);
+#endif
+ if (n < 0)
+ value[MaxTextExtent-1]='\0';
+ return(SetImageProperty(image,key,value));
+}
+
+MagickExport MagickBooleanType FormatImageAttribute(Image *image,
+ const char *key,const char *format,...)
{
MagickBooleanType
status;
- status=MagickFloodfillPaintImage(wand,channel,fill,fuzz,bordercolor,x,y,
- MagickFalse);
+ va_list
+ operands;
+
+ va_start(operands,format);
+ status=FormatImagePropertyList(image,key,format,operands);
+ va_end(operands);
return(status);
}
\f
% %
% %
% %
-% M a g i c k P a i n t O p a q u e I m a g e %
+% F o r m a t S t r i n g %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickPaintOpaqueImage() changes any pixel that matches color with the color
-% defined by fill.
-%
-% The format of the MagickPaintOpaqueImage method is:
-%
-% MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand,
-% const PixelWand *target,const PixelWand *fill,const double fuzz)
-% MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand,
-% const ChannelType channel,const PixelWand *target,
-% const PixelWand *fill,const double fuzz)
+% FormatString() prints formatted output of a variable argument list.
%
-% A description of each parameter follows:
-%
-% o wand: the magick wand.
+% The format of the FormatString method is:
%
-% o channel: the channel(s).
+% void FormatString(char *string,const char *format,...)
%
-% o target: Change this target color to the fill color within the image.
+% A description of each parameter follows.
%
-% o fill: the fill pixel wand.
+% o string: Method FormatString returns the formatted string in this
+% character buffer.
%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% o format: A string describing the format to use to write the remaining
+% arguments.
%
*/
-WandExport MagickBooleanType MagickPaintOpaqueImage(MagickWand *wand,
- const PixelWand *target,const PixelWand *fill,const double fuzz)
+MagickExport void FormatStringList(char *string,const char *format,
+ va_list operands)
{
- return(MagickPaintOpaqueImageChannel(wand,DefaultChannels,target,fill,fuzz));
+ int
+ n;
+
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+#if defined(MAGICKCORE_HAVE_VSNPRINTF)
+ n=vsnprintf(string,MaxTextExtent,format,operands);
+#else
+ n=vsprintf(string,format,operands);
+#endif
+ if (n < 0)
+ string[MaxTextExtent-1]='\0';
}
-WandExport MagickBooleanType MagickPaintOpaqueImageChannel(MagickWand *wand,
- const ChannelType channel,const PixelWand *target,const PixelWand *fill,
- const double fuzz)
+MagickExport void FormatString(char *string,const char *format,...)
{
- MagickBooleanType
- status;
+ va_list
+ operands;
- status=MagickOpaquePaintImageChannel(wand,channel,target,fill,fuzz,
- MagickFalse);
- return(status);
+ va_start(operands,format);
+ (void) FormatMagickStringList(string,MaxTextExtent,format,operands);
+ va_end(operands);
+ return;
}
\f
/*
% %
% %
% %
-% M a g i c k P a i n t T r a n s p a r e n t I m a g e %
++ F u z z y C o l o r M a t c h %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickPaintTransparentImage() changes any pixel that matches color with the
-% color defined by fill.
+% FuzzyColorMatch() returns true if two pixels are identical in color.
%
-% The format of the MagickPaintTransparentImage method is:
+% The format of the ColorMatch method is:
%
-% MagickBooleanType MagickPaintTransparentImage(MagickWand *wand,
-% const PixelWand *target,const double alpha,const double fuzz)
+% void FuzzyColorMatch(const PixelPacket *p,const PixelPacket *q,
+% const double fuzz)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o p: Pixel p.
%
-% o target: Change this target color to specified opacity value within
-% the image.
+% o q: Pixel q.
%
-% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
-% transparent.
-%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% o distance: Define how much tolerance is acceptable to consider
+% two colors as the same.
%
*/
-WandExport MagickBooleanType MagickPaintTransparentImage(MagickWand *wand,
- const PixelWand *target,const double alpha,const double fuzz)
+MagickExport unsigned int FuzzyColorMatch(const PixelPacket *p,
+ const PixelPacket *q,const double fuzz)
{
- return(MagickTransparentPaintImage(wand,target,alpha,fuzz,MagickFalse));
+ MagickPixelPacket
+ pixel;
+
+ register MagickRealType
+ distance;
+
+ if ((fuzz == 0.0) && (GetRedPixelComponent(p) == GetRedPixelComponent(q)) &&
+ (GetGreenPixelComponent(p) == GetGreenPixelComponent(q)) &&
+ (GetBluePixelComponent(p) == GetBluePixelComponent(q)))
+ return(MagickTrue);
+ pixel.red=GetRedPixelComponent(p)-(MagickRealType) GetRedPixelComponent(q);
+ distance=pixel.red*pixel.red;
+ if (distance > (fuzz*fuzz))
+ return(MagickFalse);
+ pixel.green=GetGreenPixelComponent(p)-(MagickRealType)
+ GetGreenPixelComponent(q);
+ distance+=pixel.green*pixel.green;
+ if (distance > (fuzz*fuzz))
+ return(MagickFalse);
+ pixel.blue=GetBluePixelComponent(p)-(MagickRealType) GetBluePixelComponent(q);
+ distance+=pixel.blue*pixel.blue;
+ if (distance > (fuzz*fuzz))
+ return(MagickFalse);
+ return(MagickTrue);
}
\f
/*
% %
% %
% %
-% M a g i c k R e c o l o r I m a g e %
++ F u z z y C o l o r C o m p a r e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickRecolorImage() apply color transformation to an image. The method
-% permits saturation changes, hue rotation, luminance to alpha, and various
-% other effects. Although variable-sized transformation matrices can be used,
-% typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA
-% (or RGBA with offsets). The matrix is similar to those used by Adobe Flash
-% except offsets are in column 6 rather than 5 (in support of CMYKA images)
-% and offsets are normalized (divide Flash offset by 255).
+% FuzzyColorCompare() returns MagickTrue if the distance between two colors is
+% less than the specified distance in a linear three dimensional color space.
+% This method is used by ColorFloodFill() and other algorithms which
+% compare two colors.
%
-% The format of the MagickRecolorImage method is:
+% The format of the FuzzyColorCompare method is:
%
-% MagickBooleanType MagickRecolorImage(MagickWand *wand,
-% const size_t order,const double *color_matrix)
+% void FuzzyColorCompare(const Image *image,const PixelPacket *p,
+% const PixelPacket *q)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
%
-% o order: the number of columns and rows in the color matrix.
+% o p: Pixel p.
%
-% o color_matrix: An array of doubles representing the color matrix.
+% o q: Pixel q.
%
*/
-WandExport MagickBooleanType MagickRecolorImage(MagickWand *wand,
- const size_t order,const double *color_matrix)
+MagickExport MagickBooleanType FuzzyColorCompare(const Image *image,
+ const PixelPacket *p,const PixelPacket *q)
{
- Image
- *transform_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (color_matrix == (const double *) NULL)
- return(MagickFalse);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- transform_image=RecolorImage(wand->images,order,color_matrix,
- wand->exception);
- if (transform_image == (Image *) NULL)
- return(MagickFalse);
- ReplaceImageInList(&wand->images,transform_image);
- return(MagickTrue);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.5");
+ return(IsColorSimilar(image,p,q));
}
\f
/*
% %
% %
% %
-% M a g i c k R e d u c e N o i s e I m a g e %
++ F u z z y O p a c i t y C o m p a r e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickReduceNoiseImage() smooths the contours of an image while still
-% preserving edge information. The algorithm works by replacing each pixel
-% with its neighbor closest in value. A neighbor is defined by radius. Use
-% a radius of 0 and ReduceNoise() selects a suitable radius for you.
+% FuzzyOpacityCompare() returns true if the distance between two opacity
+% values is less than the specified distance in a linear color space. This
+% method is used by MatteFloodFill() and other algorithms which compare
+% two opacity values.
%
-% The format of the MagickReduceNoiseImage method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickReduceNoiseImage(MagickWand *wand,
-% const double radius)
+% IsOpacitySimilar(image,p,q);
+%
+% The format of the FuzzyOpacityCompare method is:
+%
+% void FuzzyOpacityCompare(const Image *image,const PixelPacket *p,
+% const PixelPacket *q)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
%
-% o radius: the radius of the pixel neighborhood.
+% o p: Pixel p.
+%
+% o q: Pixel q.
%
*/
-WandExport MagickBooleanType MagickReduceNoiseImage(MagickWand *wand,
- const double radius)
+MagickExport MagickBooleanType FuzzyOpacityCompare(const Image *image,
+ const PixelPacket *p,const PixelPacket *q)
{
- Image
- *noise_image;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- ThrowWandException(WandError,"ContainsNoImages",wand->name);
- noise_image=ReduceNoiseImage(wand->images,radius,wand->exception);
- if (noise_image == (Image *) NULL)
- return(MagickFalse);
- ReplaceImageInList(&wand->images,noise_image);
- return(MagickTrue);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.5");
+ return(IsOpacitySimilar(image,p,q));
}
\f
/*
% %
% %
% %
-% M a g i c k M a x i m u m I m a g e s %
+% G e t C o n f i g u r e B l o b %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickMaximumImages() returns the maximum intensity of an image sequence.
+% GetConfigureBlob() returns the specified configure file as a blob.
%
-% The format of the MagickMaximumImages method is:
+% The format of the GetConfigureBlob method is:
%
-% MagickWand *MagickMaximumImages(MagickWand *wand)
+% void *GetConfigureBlob(const char *filename,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o filename: the configure file name.
+%
+% o path: return the full path information of the configure file.
+%
+% o length: This pointer to a size_t integer sets the initial length of the
+% blob. On return, it reflects the actual length of the blob.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickWand *MagickMaximumImages(MagickWand *wand)
+MagickExport void *GetConfigureBlob(const char *filename,char *path,
+ size_t *length,ExceptionInfo *exception)
{
- Image
- *maximum_image;
+ void
+ *blob;
+
+ assert(filename != (const char *) NULL);
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ assert(path != (char *) NULL);
+ assert(length != (size_t *) NULL);
+ assert(exception != (ExceptionInfo *) NULL);
+ blob=(void *) NULL;
+ (void) CopyMagickString(path,filename,MaxTextExtent);
+#if defined(MAGICKCORE_INSTALLED_SUPPORT)
+#if defined(MAGICKCORE_LIBRARY_PATH)
+ if (blob == (void *) NULL)
+ {
+ /*
+ Search hard coded paths.
+ */
+ (void) FormatMagickString(path,MaxTextExtent,"%s%s",
+ MAGICKCORE_LIBRARY_PATH,filename);
+ if (IsPathAccessible(path) != MagickFalse)
+ blob=FileToBlob(path,~0,length,exception);
+ }
+#endif
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !(defined(MAGICKCORE_CONFIGURE_PATH) || defined(MAGICKCORE_SHARE_PATH))
+ if (blob == (void *) NULL)
+ {
+ char
+ *key_value;
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- if (wand->images == (Image *) NULL)
- return((MagickWand *) NULL);
- maximum_image=EvaluateImages(wand->images,MaxEvaluateOperator,
- wand->exception);
- if (maximum_image == (Image *) NULL)
- return((MagickWand *) NULL);
- return(CloneMagickWandFromImages(wand,maximum_image));
+ /*
+ Locate file via registry key.
+ */
+ key_value=NTRegistryKeyLookup("ConfigurePath");
+ if (key_value != (char *) NULL)
+ {
+ (void) FormatMagickString(path,MaxTextExtent,"%s%s%s",key_value,
+ DirectorySeparator,filename);
+ if (IsPathAccessible(path) != MagickFalse)
+ blob=FileToBlob(path,~0,length,exception);
+ }
+ }
+#endif
+#else
+ if (blob == (void *) NULL)
+ {
+ char
+ *home;
+
+ home=GetEnvironmentValue("MAGICK_HOME");
+ if (home != (char *) NULL)
+ {
+ /*
+ Search MAGICK_HOME.
+ */
+#if !defined(MAGICKCORE_POSIX_SUPPORT)
+ (void) FormatMagickString(path,MaxTextExtent,"%s%s%s",home,
+ DirectorySeparator,filename);
+#else
+ (void) FormatMagickString(path,MaxTextExtent,"%s/lib/%s/%s",home,
+ MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
+#endif
+ if (IsPathAccessible(path) != MagickFalse)
+ blob=FileToBlob(path,~0,length,exception);
+ home=DestroyString(home);
+ }
+ home=GetEnvironmentValue("HOME");
+ if (home == (char *) NULL)
+ home=GetEnvironmentValue("USERPROFILE");
+ if (home != (char *) NULL)
+ {
+ /*
+ Search $HOME/.magick.
+ */
+ (void) FormatMagickString(path,MaxTextExtent,"%s%s.magick%s%s",home,
+ DirectorySeparator,DirectorySeparator,filename);
+ if ((IsPathAccessible(path) != MagickFalse) && (blob == (void *) NULL))
+ blob=FileToBlob(path,~0,length,exception);
+ home=DestroyString(home);
+ }
+ }
+ if ((blob == (void *) NULL) && (*GetClientPath() != '\0'))
+ {
+#if !defined(MAGICKCORE_POSIX_SUPPORT)
+ (void) FormatMagickString(path,MaxTextExtent,"%s%s%s",GetClientPath(),
+ DirectorySeparator,filename);
+#else
+ char
+ prefix[MaxTextExtent];
+
+ /*
+ Search based on executable directory if directory is known.
+ */
+ (void) CopyMagickString(prefix,GetClientPath(),
+ MaxTextExtent);
+ ChopPathComponents(prefix,1);
+ (void) FormatMagickString(path,MaxTextExtent,"%s/lib/%s/%s",prefix,
+ MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
+#endif
+ if (IsPathAccessible(path) != MagickFalse)
+ blob=FileToBlob(path,~0,length,exception);
+ }
+ /*
+ Search current directory.
+ */
+ if ((blob == (void *) NULL) && (IsPathAccessible(path) != MagickFalse))
+ blob=FileToBlob(path,~0,length,exception);
+#if defined(MAGICKCORE_WINDOWS_SUPPORT)
+ /*
+ Search Windows registry.
+ */
+ if (blob == (void *) NULL)
+ blob=NTResourceToBlob(filename);
+#endif
+#endif
+ if (blob == (void *) NULL)
+ (void) ThrowMagickException(exception,GetMagickModule(),ConfigureWarning,
+ "UnableToOpenConfigureFile","`%s'",path);
+ return(blob);
}
\f
/*
% %
% %
% %
-% M a g i c k S e t I m a g e A t t r i b u t e %
+% G e t C a c h e V i e w %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickSetImageAttribute() associates a property with an image.
+% GetCacheView() gets pixels from the in-memory or disk pixel cache as
+% defined by the geometry parameters. A pointer to the pixels is returned if
+% the pixels are transferred, otherwise a NULL is returned.
%
-% The format of the MagickSetImageAttribute method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickSetImageAttribute(MagickWand *wand,
-% const char *property,const char *value)
+% GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+% GetCacheViewException(cache_view));
%
-% A description of each parameter follows:
+% The format of the GetCacheView method is:
%
-% o wand: the magick wand.
+% PixelPacket *GetCacheView(CacheView *cache_view,const ssize_t x,
+% const ssize_t y,const size_t columns,const size_t rows)
%
-% o property: the property.
+% A description of each parameter follows:
%
-% o value: the value.
+% o cache_view: the address of a structure of type CacheView.
+%
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
%
*/
-WandExport MagickBooleanType MagickSetImageAttribute(MagickWand *wand,
- const char *property,const char *value)
+MagickExport PixelPacket *GetCacheView(CacheView *cache_view,const ssize_t x,
+ const ssize_t y,const size_t columns,const size_t rows)
{
- return(SetImageProperty(wand->images,property,value));
+ PixelPacket
+ *pixels;
+
+ pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+ GetCacheViewException(cache_view));
+ return(pixels);
}
\f
/*
% %
% %
% %
-% M a g i c k S e t I m a g e I n d e x %
+% G e t C a c h e V i e w I n d e x e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickSetImageIndex() set the current image to the position of the list
-% specified with the index parameter.
+% GetCacheViewIndexes() returns the indexes associated with the specified
+% view.
%
-% The format of the MagickSetImageIndex method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickSetImageIndex(MagickWand *wand,
-% const ssize_t index)
+% GetCacheViewAuthenticIndexQueue(cache_view);
%
-% A description of each parameter follows:
+% The format of the GetCacheViewIndexes method is:
+%
+% IndexPacket *GetCacheViewIndexes(CacheView *cache_view)
%
-% o wand: the magick wand.
+% A description of each parameter follows:
%
-% o index: the scene number.
+% o cache_view: the cache view.
%
*/
-WandExport MagickBooleanType MagickSetImageIndex(MagickWand *wand,
- const ssize_t index)
+MagickExport IndexPacket *GetCacheViewIndexes(CacheView *cache_view)
{
- return(MagickSetIteratorIndex(wand,index));
+ return(GetCacheViewAuthenticIndexQueue(cache_view));
}
\f
/*
% %
% %
% %
-+ M a g i c k S e t I m a g e O p t i o n %
+% G e t C a c h e V i e w P i x e l s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickSetImageOption() associates one or options with a particular image
-% format (.e.g MagickSetImageOption(wand,"jpeg","perserve","yes").
+% GetCacheViewPixels() gets pixels from the in-memory or disk pixel cache as
+% defined by the geometry parameters. A pointer to the pixels is returned if
+% the pixels are transferred, otherwise a NULL is returned.
%
-% The format of the MagickSetImageOption method is:
+% Deprecated, replace with:
%
-% MagickBooleanType MagickSetImageOption(MagickWand *wand,
-% const char *format,const char *key,const char *value)
+% GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+% GetCacheViewException(cache_view));
%
-% A description of each parameter follows:
+% The format of the GetCacheViewPixels method is:
%
-% o wand: the magick wand.
+% PixelPacket *GetCacheViewPixels(CacheView *cache_view,const ssize_t x,
+% const ssize_t y,const size_t columns,const size_t rows)
%
-% o format: the image format.
+% A description of each parameter follows:
%
-% o key: The key.
+% o cache_view: the cache view.
%
-% o value: The value.
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
%
*/
-WandExport MagickBooleanType MagickSetImageOption(MagickWand *wand,
- const char *format,const char *key,const char *value)
+MagickExport PixelPacket *GetCacheViewPixels(CacheView *cache_view,const ssize_t x,
+ const ssize_t y,const size_t columns,const size_t rows)
{
- char
- option[MaxTextExtent];
+ PixelPacket
+ *pixels;
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == WandSignature);
- if (wand->debug != MagickFalse)
- (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
- (void) FormatMagickString(option,MaxTextExtent,"%s:%s=%s",format,key,value);
- return(DefineImageOption(wand->image_info,option));
+ pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+ GetCacheViewException(cache_view));
+ return(pixels);
}
\f
/*
% %
% %
% %
-% M a g i c k T r a n s p a r e n t I m a g e %
+% G e t I m a g e A t t r i b u t e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickTransparentImage() changes any pixel that matches color with the
-% color defined by fill.
+% GetImageAttribute() searches the list of image attributes and returns
+% a pointer to the attribute if it exists otherwise NULL.
%
-% The format of the MagickTransparentImage method is:
+% The format of the GetImageAttribute method is:
%
-% MagickBooleanType MagickTransparentImage(MagickWand *wand,
-% const PixelWand *target,const double alpha,const double fuzz)
+% const ImageAttribute *GetImageAttribute(const Image *image,
+% const char *key)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o image: the image.
%
-% o target: Change this target color to specified opacity value within
-% the image.
-%
-% o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
-% transparent.
-%
-% o fuzz: By default target must match a particular pixel color
-% exactly. However, in many cases two colors may differ by a small amount.
-% The fuzz member of image defines how much tolerance is acceptable to
-% consider two colors as the same. For example, set fuzz to 10 and the
-% color red at intensities of 100 and 102 respectively are now interpreted
-% as the same color for the purposes of the floodfill.
+% o key: These character strings are the name of an image attribute to
+% return.
%
*/
-WandExport MagickBooleanType MagickTransparentImage(MagickWand *wand,
- const PixelWand *target,const double alpha,const double fuzz)
+
+static void *DestroyAttribute(void *attribute)
+{
+ register ImageAttribute
+ *p;
+
+ p=(ImageAttribute *) attribute;
+ if (p->value != (char *) NULL)
+ p->value=DestroyString(p->value);
+ return(RelinquishMagickMemory(p));
+}
+
+MagickExport const ImageAttribute *GetImageAttribute(const Image *image,
+ const char *key)
{
- return(MagickPaintTransparentImage(wand,target,alpha,fuzz));
+ const char
+ *value;
+
+ ImageAttribute
+ *attribute;
+
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
+ value=GetImageProperty(image,key);
+ if (value == (const char *) NULL)
+ return((const ImageAttribute *) NULL);
+ if (image->attributes == (void *) NULL)
+ ((Image *) image)->attributes=NewSplayTree(CompareSplayTreeString,
+ RelinquishMagickMemory,DestroyAttribute);
+ else
+ {
+ const ImageAttribute
+ *attribute;
+
+ attribute=(const ImageAttribute *) GetValueFromSplayTree((SplayTreeInfo *)
+ image->attributes,key);
+ if (attribute != (const ImageAttribute *) NULL)
+ return(attribute);
+ }
+ attribute=(ImageAttribute *) AcquireMagickMemory(sizeof(*attribute));
+ if (attribute == (ImageAttribute *) NULL)
+ ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+ (void) ResetMagickMemory(attribute,0,sizeof(*attribute));
+ attribute->key=ConstantString(key);
+ attribute->value=ConstantString(value);
+ (void) AddValueToSplayTree((SplayTreeInfo *) ((Image *) image)->attributes,
+ attribute->key,attribute);
+ return((const ImageAttribute *) attribute);
}
\f
/*
% %
% %
% %
-% M a g i c k R e g i o n O f I n t e r e s t I m a g e %
+% G e t I m a g e C l i p p i n g P a t h A t t r i b u t e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickRegionOfInterestImage() extracts a region of the image and returns it
-% as a new wand.
+% GetImageClippingPathAttribute() searches the list of image attributes and
+% returns a pointer to a clipping path if it exists otherwise NULL.
%
-% The format of the MagickRegionOfInterestImage method is:
+% Deprecated, replace with:
%
-% MagickWand *MagickRegionOfInterestImage(MagickWand *wand,
-% const size_t width,const size_t height,const ssize_t x,
-% const ssize_t y)
+% GetImageAttribute(image,"8BIM:1999,2998");
%
-% A description of each parameter follows:
-%
-% o wand: the magick wand.
+% The format of the GetImageClippingPathAttribute method is:
%
-% o width: the region width.
+% const ImageAttribute *GetImageClippingPathAttribute(Image *image)
%
-% o height: the region height.
+% A description of each parameter follows:
%
-% o x: the region x offset.
+% o attribute: Method GetImageClippingPathAttribute returns the clipping
+% path if it exists otherwise NULL.
%
-% o y: the region y offset.
+% o image: the image.
%
*/
-WandExport MagickWand *MagickRegionOfInterestImage(MagickWand *wand,
- const size_t width,const size_t height,const ssize_t x,
- const ssize_t y)
+MagickExport const ImageAttribute *GetImageClippingPathAttribute(Image *image)
{
- return(MagickGetImageRegion(wand,width,height,x,y));
+ return(GetImageAttribute(image,"8BIM:1999,2998"));
}
\f
/*
% %
% %
% %
-% M a g i c k S e t I m a g e P i x e l s %
+% G e t I m a g e F r o m M a g i c k R e g i s t r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickSetImagePixels() accepts pixel datand stores it in the image at the
-% location you specify. The method returns MagickFalse on success otherwise
-% MagickTrue if an error is encountered. The pixel data can be either char,
-% short int, int, ssize_t, float, or double in the order specified by map.
+% GetImageFromMagickRegistry() gets an image from the registry as defined by
+% its name. If the image is not found, a NULL image is returned.
%
-% Suppose your want to upload the first scanline of a 640x480 image from
-% character data in red-green-blue order:
+% Deprecated, replace with:
%
-% MagickSetImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
+% GetImageRegistry(ImageRegistryType,name,exception);
%
-% The format of the MagickSetImagePixels method is:
+% The format of the GetImageFromMagickRegistry method is:
%
-% MagickBooleanType MagickSetImagePixels(MagickWand *wand,
-% const ssize_t x,const ssize_t y,const size_t columns,
-% const size_t rows,const char *map,const StorageType storage,
-% const void *pixels)
+% Image *GetImageFromMagickRegistry(const char *name,ssize_t *id,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o name: the name of the image to retrieve from the registry.
%
-% o x, y, columns, rows: These values define the perimeter of a region
-% of pixels you want to define.
+% o id: the registry id.
%
-% o map: This string reflects the expected ordering of the pixel array.
-% It can be any combination or order of R = red, G = green, B = blue,
-% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
-% Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
-% P = pad.
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *GetImageFromMagickRegistry(const char *name,ssize_t *id,
+ ExceptionInfo *exception)
+{
+ *id=0L;
+ return((Image *) GetImageRegistry(ImageRegistryType,name,exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t M a g i c k R e g i s t r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% o storage: Define the data type of the pixels. Float and double types are
-% expected to be normalized [0..1] otherwise [0..QuantumRange]. Choose from
-% these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel,
-% or DoublePixel.
+% GetMagickRegistry() gets a blob from the registry as defined by the id. If
+% the blob that matches the id is not found, NULL is returned.
%
-% o pixels: This array of values contain the pixel components as defined by
-% map and type. You must preallocate this array where the expected
-% length varies depending on the values of width, height, map, and type.
+% The format of the GetMagickRegistry method is:
+%
+% const void *GetMagickRegistry(const ssize_t id,RegistryType *type,
+% size_t *length,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o id: the registry id.
+%
+% o type: the registry type.
+%
+% o length: the blob length in number of bytes.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-WandExport MagickBooleanType MagickSetImagePixels(MagickWand *wand,
- const ssize_t x,const ssize_t y,const size_t columns,
- const size_t rows,const char *map,const StorageType storage,
- const void *pixels)
+MagickExport void *GetMagickRegistry(const ssize_t id,RegistryType *type,
+ size_t *length,ExceptionInfo *exception)
{
- return(MagickImportImagePixels(wand,x,y,columns,rows,map,storage,pixels));
+ char
+ key[MaxTextExtent];
+
+ void
+ *blob;
+
+ *type=UndefinedRegistryType;
+ *length=0;
+ (void) FormatMagickString(key,MaxTextExtent,"%.20g\n",(double) id);
+ blob=(void *) GetImageRegistry(ImageRegistryType,key,exception);
+ if (blob != (void *) NULL)
+ return(blob);
+ blob=(void *) GetImageRegistry(ImageInfoRegistryType,key,exception);
+ if (blob != (void *) NULL)
+ return(blob);
+ return((void *) GetImageRegistry(UndefinedRegistryType,key,exception));
}
\f
/*
% %
% %
% %
-% M a g i c k W r i t e I m a g e B l o b %
+% G e t I m a g e G e o m e t r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% MagickWriteImageBlob() implements direct to memory image formats. It
-% returns the image as a blob and its length. Use MagickSetFormat() to
-% set the format of the returned blob (GIF, JPEG, PNG, etc.).
+% GetImageGeometry() returns a region as defined by the geometry string with
+% respect to the image and its gravity.
+%
+% Deprecated, replace with:
%
-% Use MagickRelinquishMemory() to free the blob when you are done with it.
+% if (size_to_fit != MagickFalse)
+% ParseRegionGeometry(image,geometry,region_info,&image->exception); else
+% ParsePageGeometry(image,geometry,region_info,&image->exception);
%
-% The format of the MagickWriteImageBlob method is:
+% The format of the GetImageGeometry method is:
%
-% unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length)
+% int GetImageGeometry(Image *image,const char *geometry,
+% const unsigned int size_to_fit,RectangeInfo *region_info)
%
% A description of each parameter follows:
%
-% o wand: the magick wand.
+% o flags: Method GetImageGeometry returns a bitmask that indicates
+% which of the four values were located in the geometry string.
%
-% o length: the length of the blob.
+% o geometry: The geometry (e.g. 100x100+10+10).
+%
+% o size_to_fit: A value other than 0 means to scale the region so it
+% fits within the specified width and height.
+%
+% o region_info: the region as defined by the geometry string with
+% respect to the image and its gravity.
%
*/
-WandExport unsigned char *MagickWriteImageBlob(MagickWand *wand,size_t *length)
+MagickExport int GetImageGeometry(Image *image,const char *geometry,
+ const unsigned int size_to_fit,RectangleInfo *region_info)
{
- return(MagickGetImageBlob(wand,length));
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.4");
+ if (size_to_fit != MagickFalse)
+ return((int) ParseRegionGeometry(image,geometry,region_info,&image->exception));
+ return((int) ParsePageGeometry(image,geometry,region_info,&image->exception));
}
\f
/*
% %
% %
% %
-% N e w P i x e l V i e w %
+% G e t I m a g e L i s t %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% NewPixelView() returns a pixel view required for all other methods in the
-% Pixel View API.
+% GetImageList() returns an image at the specified position in the list.
+%
+% Deprecated, replace with:
+%
+% CloneImage(GetImageFromList(images,(ssize_t) offset),0,0,MagickTrue,
+% exception);
%
-% The format of the NewPixelView method is:
+% The format of the GetImageList method is:
%
-% PixelView *NewPixelView(MagickWand *wand)
+% Image *GetImageList(const Image *images,const ssize_t offset,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
-% o wand: the wand.
+% o images: the image list.
+%
+% o offset: the position within the list.
+%
+% o exception: return any errors or warnings in this structure.
%
*/
-
-static PixelWand ***AcquirePixelsThreadSet(const size_t number_wands,
- const size_t number_threads)
+MagickExport Image *GetImageList(const Image *images,const ssize_t offset,
+ ExceptionInfo *exception)
{
- PixelWand
- ***pixel_wands;
-
- register ssize_t
- i;
+ Image
+ *image;
- pixel_wands=(PixelWand ***) AcquireQuantumMemory(number_threads,
- sizeof(*pixel_wands));
- if (pixel_wands == (PixelWand ***) NULL)
- return((PixelWand ***) NULL);
- (void) ResetMagickMemory(pixel_wands,0,number_threads*sizeof(*pixel_wands));
- for (i=0; i < (ssize_t) number_threads; i++)
- {
- pixel_wands[i]=NewPixelWands(number_wands);
- if (pixel_wands[i] == (PixelWand **) NULL)
- return(DestroyPixelsThreadSet(pixel_wands,number_wands,number_threads));
- }
- return(pixel_wands);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ image=CloneImage(GetImageFromList(images,(ssize_t) offset),0,0,MagickTrue,
+ exception);
+ return(image);
}
-
-WandExport PixelView *NewPixelView(MagickWand *wand)
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t I m a g e L i s t I n d e x %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetImageListIndex() returns the position in the list of the specified
+% image.
+%
+% Deprecated, replace with:
+%
+% GetImageIndexInList(images);
+%
+% The format of the GetImageListIndex method is:
+%
+% ssize_t GetImageListIndex(const Image *images)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+*/
+MagickExport ssize_t GetImageListIndex(const Image *images)
{
- PixelView
- *pixel_view;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == MagickSignature);
- pixel_view=(PixelView *) AcquireMagickMemory(sizeof(*pixel_view));
- if (pixel_view == (PixelView *) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- GetExceptionMessage(errno));
- (void) ResetMagickMemory(pixel_view,0,sizeof(*pixel_view));
- pixel_view->id=AcquireWandId();
- (void) FormatMagickString(pixel_view->name,MaxTextExtent,"%s-%.20g",
- PixelViewId,(double) pixel_view->id);
- pixel_view->exception=AcquireExceptionInfo();
- pixel_view->wand=wand;
- pixel_view->view=AcquireCacheView(pixel_view->wand->images);
- pixel_view->region.width=wand->images->columns;
- pixel_view->region.height=wand->images->rows;
- pixel_view->number_threads=GetOpenMPMaximumThreads();
- pixel_view->pixel_wands=AcquirePixelsThreadSet(pixel_view->region.width,
- pixel_view->number_threads);
- if (pixel_view->pixel_wands == (PixelWand ***) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- GetExceptionMessage(errno));
- pixel_view->debug=IsEventLogging();
- pixel_view->signature=WandSignature;
- return(pixel_view);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(GetImageIndexInList(images));
}
\f
/*
% %
% %
% %
-% N e w P i x e l V i e w R e g i o n %
+% G e t I m a g e L i s t S i z e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% NewPixelViewRegion() returns a pixel view required for all other methods
-% in the Pixel View API.
+% GetImageListSize() returns the number of images in the list.
%
-% The format of the NewPixelViewRegion method is:
+% Deprecated, replace with:
%
-% PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x,
-% const ssize_t y,const size_t width,const size_t height)
+% GetImageListLength(images);
%
-% A description of each parameter follows:
+% The format of the GetImageListSize method is:
%
-% o wand: the magick wand.
+% size_t GetImageListSize(const Image *images)
%
-% o x,y,columns,rows: These values define the perimeter of a region of
-% pixel_wands view.
+% A description of each parameter follows:
+%
+% o images: the image list.
%
*/
-WandExport PixelView *NewPixelViewRegion(MagickWand *wand,const ssize_t x,
- const ssize_t y,const size_t width,const size_t height)
+MagickExport size_t GetImageListSize(const Image *images)
{
- PixelView
- *pixel_view;
-
- assert(wand != (MagickWand *) NULL);
- assert(wand->signature == MagickSignature);
- pixel_view=(PixelView *) AcquireMagickMemory(sizeof(*pixel_view));
- if (pixel_view == (PixelView *) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- GetExceptionMessage(errno));
- (void) ResetMagickMemory(pixel_view,0,sizeof(*pixel_view));
- pixel_view->id=AcquireWandId();
- (void) FormatMagickString(pixel_view->name,MaxTextExtent,"%s-%.20g",
- PixelViewId,(double) pixel_view->id);
- pixel_view->exception=AcquireExceptionInfo();
- pixel_view->view=AcquireCacheView(pixel_view->wand->images);
- pixel_view->wand=wand;
- pixel_view->region.width=width;
- pixel_view->region.height=height;
- pixel_view->region.x=x;
- pixel_view->region.y=y;
- pixel_view->number_threads=GetOpenMPMaximumThreads();
- pixel_view->pixel_wands=AcquirePixelsThreadSet(pixel_view->region.width,
- pixel_view->number_threads);
- if (pixel_view->pixel_wands == (PixelWand ***) NULL)
- ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
- GetExceptionMessage(errno));
- pixel_view->debug=IsEventLogging();
- pixel_view->signature=WandSignature;
- return(pixel_view);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(GetImageListLength(images));
}
\f
/*
% %
% %
% %
-% P i x e l G e t N e x t R o w %
+% G e t I m a g e P i x e l s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% PixelGetNextRow() returns the next row as an array of pixel wands from the
-% pixel iterator.
+% GetImagePixels() obtains a pixel region for read/write access. If the
+% region is successfully accessed, a pointer to a PixelPacket array
+% representing the region is returned, otherwise NULL is returned.
+%
+% The returned pointer may point to a temporary working copy of the pixels
+% or it may point to the original pixels in memory. Performance is maximized
+% if the selected region is part of one row, or one or more full rows, since
+% then there is opportunity to access the pixels in-place (without a copy)
+% if the image is in RAM, or in a memory-mapped file. The returned pointer
+% should *never* be deallocated by the user.
+%
+% Pixels accessed via the returned pointer represent a simple array of type
+% PixelPacket. If the image type is CMYK or if the storage class is
+% PseduoClass, call GetAuthenticIndexQueue() after invoking GetImagePixels()
+% to obtain the black color component or colormap indexes (of type IndexPacket)
+% corresponding to the region. Once the PixelPacket (and/or IndexPacket)
+% array has been updated, the changes must be saved back to the underlying
+% image using SyncAuthenticPixels() or they may be lost.
+%
+% Deprecated, replace with:
+%
+% GetAuthenticPixels(image,x,y,columns,rows,&image->exception);
%
-% The format of the PixelGetNextRow method is:
+% The format of the GetImagePixels() method is:
%
-% PixelWand **PixelGetNextRow(PixelIterator *iterator,
-% size_t *number_wands)
+% PixelPacket *GetImagePixels(Image *image,const ssize_t x,const ssize_t y,
+% const size_t columns,const size_t rows)
%
% A description of each parameter follows:
%
-% o iterator: the pixel iterator.
+% o image: the image.
%
-% o number_wands: the number of pixel wands.
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
%
*/
-WandExport PixelWand **PixelGetNextRow(PixelIterator *iterator)
+MagickExport PixelPacket *GetImagePixels(Image *image,const ssize_t x,const ssize_t y,
+ const size_t columns,const size_t rows)
{
- size_t
- number_wands;
-
- return(PixelGetNextIteratorRow(iterator,&number_wands));
+ return(GetAuthenticPixels(image,x,y,columns,rows,&image->exception));
}
\f
/*
% %
% %
% %
-% P i x e l I t e r a t o r G e t E x c e p t i o n %
+% G e t I n d e x e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% PixelIteratorGetException() returns the severity, reason, and description of
-% any error that occurs when using other methods in this API.
+% GetIndexes() returns the black channel or the colormap indexes associated
+% with the last call to QueueAuthenticPixels() or GetVirtualPixels(). NULL is
+% returned if the black channel or colormap indexes are not available.
+%
+% Deprecated, replace with:
%
-% The format of the PixelIteratorGetException method is:
+% GetAuthenticIndexQueue(image);
%
-% char *PixelIteratorGetException(const Pixeliterator *iterator,
-% ExceptionType *severity)
+% The format of the GetIndexes() method is:
+%
+% IndexPacket *GetIndexes(const Image *image)
%
% A description of each parameter follows:
%
-% o iterator: the pixel iterator.
+% o indexes: GetIndexes() returns the indexes associated with the last
+% call to QueueAuthenticPixels() or GetAuthenticPixels().
%
-% o severity: the severity of the error is returned here.
+% o image: the image.
%
*/
-WandExport char *PixelIteratorGetException(const PixelIterator *iterator,
- ExceptionType *severity)
+MagickExport IndexPacket *GetIndexes(const Image *image)
{
- return(PixelGetIteratorException(iterator,severity));
+ return(GetAuthenticIndexQueue(image));
}
\f
/*
% %
% %
% %
-% S e t P i x e l V i e w I t e r a t o r %
++ G e t M a g i c k G e o m e t r y %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% SetPixelViewIterator() iterates over the pixel view in parallel and calls
-% your set method for each scanline of the view. The pixel region is
-% confined to the image canvas-- that is no negative offsets or widths or
-% heights that exceed the image dimension. The pixels are initiallly
-% undefined and any settings you make in the callback method are automagically
-% synced back to your image.
-%
-% Use this pragma:
+% GetMagickGeometry() is similar to GetGeometry() except the returned
+% geometry is modified as determined by the meta characters: %, !, <, >,
+% and ~.
%
-% #pragma omp critical
+% Deprecated, replace with:
%
-% to define a section of code in your callback set method that must be
-% executed by a single thread at a time.
+% ParseMetaGeometry(geometry,x,y,width,height);
%
-% The format of the SetPixelViewIterator method is:
+% The format of the GetMagickGeometry method is:
%
-% MagickBooleanType SetPixelViewIterator(PixelView *destination,
-% SetPixelViewMethod set,void *context)
+% unsigned int GetMagickGeometry(const char *geometry,ssize_t *x,ssize_t *y,
+% size_t *width,size_t *height)
%
% A description of each parameter follows:
%
-% o destination: the pixel view.
+% o geometry: Specifies a character string representing the geometry
+% specification.
%
-% o set: the set callback method.
+% o x,y: A pointer to an integer. The x and y offset as determined by
+% the geometry specification is returned here.
%
-% o context: the user defined context.
+% o width,height: A pointer to an unsigned integer. The width and height
+% as determined by the geometry specification is returned here.
%
*/
-WandExport MagickBooleanType SetPixelViewIterator(PixelView *destination,
- SetPixelViewMethod set,void *context)
+MagickExport unsigned int GetMagickGeometry(const char *geometry,ssize_t *x,
+ ssize_t *y,size_t *width,size_t *height)
{
-#define SetPixelViewTag "PixelView/Set"
-
- ExceptionInfo
- *exception;
-
- Image
- *destination_image;
-
- MagickBooleanType
- status;
-
- MagickOffsetType
- progress;
-
- ssize_t
- y;
-
- assert(destination != (PixelView *) NULL);
- assert(destination->signature == WandSignature);
- if (set == (SetPixelViewMethod) NULL)
- return(MagickFalse);
- destination_image=destination->wand->images;
- if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse)
- return(MagickFalse);
- status=MagickTrue;
- progress=0;
- exception=destination->exception;
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,1) shared(progress,status)
-#endif
- for (y=destination->region.y; y < (ssize_t) destination->region.height; y++)
- {
- const int
- id = GetOpenMPThreadId();
-
- MagickBooleanType
- sync;
-
- register IndexPacket
- *restrict indexes;
-
- register ssize_t
- x;
-
- register PixelPacket
- *restrict pixels;
-
- if (status == MagickFalse)
- continue;
- pixels=GetCacheViewAuthenticPixels(destination->view,destination->region.x,
- y,destination->region.width,1,exception);
- if (pixels == (PixelPacket *) NULL)
- {
- InheritException(destination->exception,GetCacheViewException(
- destination->view));
- status=MagickFalse;
- continue;
- }
- indexes=GetCacheViewAuthenticIndexQueue(destination->view);
- if (set(destination,context) == MagickFalse)
- status=MagickFalse;
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelGetQuantumColor(destination->pixel_wands[id][x],pixels+x);
- if (destination_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- SetIndexPixelComponent(indexes+x,PixelGetBlackQuantum(
- destination->pixel_wands[id][x]));
- sync=SyncCacheViewAuthenticPixels(destination->view,exception);
- if (sync == MagickFalse)
- {
- InheritException(destination->exception,GetCacheViewException(
- destination->view));
- status=MagickFalse;
- }
- if (destination_image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
-
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickWand_SetPixelViewIterator)
-#endif
- proceed=SetImageProgress(destination_image,SetPixelViewTag,progress++,
- destination->region.height);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
- }
- return(status);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.3");
+ return(ParseMetaGeometry(geometry,x,y,width,height));
}
\f
/*
% %
% %
% %
-% T r a n s f e r P i x e l V i e w I t e r a t o r %
+% G e t N e x t I m a g e %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% TransferPixelViewIterator() iterates over two pixel views in parallel and
-% calls your transfer method for each scanline of the view. The source pixel
-% region is not confined to the image canvas-- that is you can include
-% negative offsets or widths or heights that exceed the image dimension.
-% However, the destination pixel view is confined to the image canvas-- that
-% is no negative offsets or widths or heights that exceed the image dimension
-% are permitted.
+% GetNextImage() returns the next image in a list.
%
-% Use this pragma:
+% Deprecated, replace with:
%
-% #pragma omp critical
+% GetNextImageInList(images);
%
-% to define a section of code in your callback transfer method that must be
-% executed by a single thread at a time.
+% The format of the GetNextImage method is:
%
-% The format of the TransferPixelViewIterator method is:
-%
-% MagickBooleanType TransferPixelViewIterator(PixelView *source,
-% PixelView *destination,TransferPixelViewMethod transfer,void *context)
+% Image *GetNextImage(const Image *images)
%
% A description of each parameter follows:
%
-% o source: the source pixel view.
+% o images: the image list.
+%
+*/
+MagickExport Image *GetNextImage(const Image *images)
+{
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(GetNextImageInList(images));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t N e x t I m a g e A t t r i b u t e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetNextImageAttribute() gets the next image attribute.
%
-% o destination: the destination pixel view.
+% Deprecated, replace with:
%
-% o transfer: the transfer callback method.
+% const char *property;
+% property=GetNextImageProperty(image);
+% if (property != (const char *) NULL)
+% GetImageAttribute(image,property);
%
-% o context: the user defined context.
+% The format of the GetNextImageAttribute method is:
+%
+% const ImageAttribute *GetNextImageAttribute(const Image *image)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
%
*/
-WandExport MagickBooleanType TransferPixelViewIterator(PixelView *source,
- PixelView *destination,TransferPixelViewMethod transfer,void *context)
+MagickExport const ImageAttribute *GetNextImageAttribute(const Image *image)
{
-#define TransferPixelViewTag "PixelView/Transfer"
-
- ExceptionInfo
- *exception;
-
- Image
- *destination_image,
- *source_image;
-
- MagickBooleanType
- status;
-
- MagickOffsetType
- progress;
-
- ssize_t
- y;
-
- assert(source != (PixelView *) NULL);
- assert(source->signature == WandSignature);
- if (transfer == (TransferPixelViewMethod) NULL)
- return(MagickFalse);
- source_image=source->wand->images;
- destination_image=destination->wand->images;
- if (SetImageStorageClass(destination_image,DirectClass) == MagickFalse)
- return(MagickFalse);
- status=MagickTrue;
- progress=0;
- exception=destination->exception;
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,1) shared(progress,status)
-#endif
- for (y=source->region.y; y < (ssize_t) source->region.height; y++)
- {
- const int
- id = GetOpenMPThreadId();
-
- MagickBooleanType
- sync;
+ const char
+ *property;
- register const IndexPacket
- *restrict indexes;
-
- register const PixelPacket
- *restrict pixels;
-
- register IndexPacket
- *restrict destination_indexes;
-
- register ssize_t
- x;
-
- register PixelPacket
- *restrict destination_pixels;
-
- if (status == MagickFalse)
- continue;
- pixels=GetCacheViewVirtualPixels(source->view,source->region.x,y,
- source->region.width,1,source->exception);
- if (pixels == (const PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- indexes=GetCacheViewVirtualIndexQueue(source->view);
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x);
- if (source_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetBlackQuantum(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (source_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetIndex(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- destination_pixels=GetCacheViewAuthenticPixels(destination->view,
- destination->region.x,y,destination->region.width,1,exception);
- if (destination_pixels == (PixelPacket *) NULL)
- {
- status=MagickFalse;
- continue;
- }
- destination_indexes=GetCacheViewAuthenticIndexQueue(destination->view);
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetQuantumColor(destination->pixel_wands[id][x],pixels+x);
- if (destination_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetBlackQuantum(destination->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (destination_image->storage_class == PseudoClass)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelSetIndex(destination->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (transfer(source,destination,context) == MagickFalse)
- status=MagickFalse;
- for (x=0; x < (ssize_t) destination->region.width; x++)
- PixelGetQuantumColor(destination->pixel_wands[id][x],
- destination_pixels+x);
- if (destination_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) destination->region.width; x++)
- SetIndexPixelComponent(destination_indexes+x,PixelGetBlackQuantum(
- destination->pixel_wands[id][x]));
- sync=SyncCacheViewAuthenticPixels(destination->view,exception);
- if (sync == MagickFalse)
- {
- InheritException(destination->exception,GetCacheViewException(
- source->view));
- status=MagickFalse;
- }
- if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
-
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickWand_TransferPixelViewIterator)
-#endif
- proceed=SetImageProgress(source_image,TransferPixelViewTag,progress++,
- source->region.height);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
- }
- return(status);
+ property=GetNextImageProperty(image);
+ if (property == (const char *) NULL)
+ return((const ImageAttribute *) NULL);
+ return(GetImageAttribute(image,property));
}
\f
/*
% %
% %
% %
-% U p d a t e P i x e l V i e w I t e r a t o r %
+% G e t N u m b e r S c e n e s %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% UpdatePixelViewIterator() iterates over the pixel view in parallel and calls
-% your update method for each scanline of the view. The pixel region is
-% confined to the image canvas-- that is no negative offsets or widths or
-% heights that exceed the image dimension are permitted. Updates to pixels
-% in your callback are automagically synced back to the image.
-%
-% Use this pragma:
+% GetNumberScenes() returns the number of images in the list.
%
-% #pragma omp critical
+% Deprecated, replace with:
%
-% to define a section of code in your callback update method that must be
-% executed by a single thread at a time.
+% GetImageListLength(image);
%
-% The format of the UpdatePixelViewIterator method is:
+% The format of the GetNumberScenes method is:
%
-% MagickBooleanType UpdatePixelViewIterator(PixelView *source,
-% UpdatePixelViewMethod update,void *context)
+% unsigned int GetNumberScenes(const Image *images)
%
% A description of each parameter follows:
%
-% o source: the source pixel view.
-%
-% o update: the update callback method.
-%
-% o context: the user defined context.
+% o images: the image list.
%
*/
-WandExport MagickBooleanType UpdatePixelViewIterator(PixelView *source,
- UpdatePixelViewMethod update,void *context)
+MagickExport unsigned int GetNumberScenes(const Image *image)
{
-#define UpdatePixelViewTag "PixelView/Update"
-
- ExceptionInfo
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return((unsigned int) GetImageListLength(image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t O n e P i x e l %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetOnePixel() returns a single pixel at the specified (x,y) location.
+% The image background color is returned if an error occurs.
+%
+% Deprecated, replace with:
+%
+% GetOneAuthenticPixel(image,x,y,&pixel,&image->exception);
+%
+% The format of the GetOnePixel() method is:
+%
+% PixelPacket GetOnePixel(const Image image,const ssize_t x,const ssize_t y)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o x,y: These values define the location of the pixel to return.
+%
+*/
+MagickExport PixelPacket GetOnePixel(Image *image,const ssize_t x,const ssize_t y)
+{
+ PixelPacket
+ pixel;
+
+ (void) GetOneAuthenticPixel(image,x,y,&pixel,&image->exception);
+ return(pixel);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetPixels() returns the pixels associated with the last call to
+% QueueAuthenticPixels() or GetAuthenticPixels().
+%
+% Deprecated, replace with:
+%
+% GetAuthenticPixelQueue(image);
+%
+% The format of the GetPixels() method is:
+%
+% PixelPacket *GetPixels(const Image image)
+%
+% A description of each parameter follows:
+%
+% o pixels: GetPixels() returns the pixels associated with the last call
+% to QueueAuthenticPixels() or GetAuthenticPixels().
+%
+% o image: the image.
+%
+*/
+MagickExport PixelPacket *GetPixels(const Image *image)
+{
+ return(GetAuthenticPixelQueue(image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% G e t P r e v i o u s I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% GetPreviousImage() returns the previous image in a list.
+%
+% Deprecated, replace with:
+%
+% GetPreviousImageInList(images));
+%
+% The format of the GetPreviousImage method is:
+%
+% Image *GetPreviousImage(const Image *images)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+*/
+MagickExport Image *GetPreviousImage(const Image *images)
+{
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(GetPreviousImageInList(images));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% H S L T r a n s f o r m %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% HSLTransform() converts a (hue, saturation, lightness) to a (red, green,
+% blue) triple.
+%
+% The format of the HSLTransformImage method is:
+%
+% void HSLTransform(const double hue,const double saturation,
+% const double lightness,Quantum *red,Quantum *green,Quantum *blue)
+%
+% A description of each parameter follows:
+%
+% o hue, saturation, lightness: A double value representing a
+% component of the HSL color space.
+%
+% o red, green, blue: A pointer to a pixel component of type Quantum.
+%
+*/
+
+static inline MagickRealType HueToRGB(MagickRealType m1,MagickRealType m2,
+ MagickRealType hue)
+{
+ if (hue < 0.0)
+ hue+=1.0;
+ if (hue > 1.0)
+ hue-=1.0;
+ if ((6.0*hue) < 1.0)
+ return(m1+6.0*(m2-m1)*hue);
+ if ((2.0*hue) < 1.0)
+ return(m2);
+ if ((3.0*hue) < 2.0)
+ return(m1+6.0*(m2-m1)*(2.0/3.0-hue));
+ return(m1);
+}
+
+MagickExport void HSLTransform(const double hue,const double saturation,
+ const double lightness,Quantum *red,Quantum *green,Quantum *blue)
+{
+ MagickRealType
+ b,
+ g,
+ r,
+ m1,
+ m2;
+
+ /*
+ Convert HSL to RGB colorspace.
+ */
+ assert(red != (Quantum *) NULL);
+ assert(green != (Quantum *) NULL);
+ assert(blue != (Quantum *) NULL);
+ if (lightness <= 0.5)
+ m2=lightness*(saturation+1.0);
+ else
+ m2=lightness+saturation-lightness*saturation;
+ m1=2.0*lightness-m2;
+ r=HueToRGB(m1,m2,hue+1.0/3.0);
+ g=HueToRGB(m1,m2,hue);
+ b=HueToRGB(m1,m2,hue-1.0/3.0);
+ *red=ClampToQuantum((MagickRealType) QuantumRange*r);
+ *green=ClampToQuantum((MagickRealType) QuantumRange*g);
+ *blue=ClampToQuantum((MagickRealType) QuantumRange*b);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I d e n t i t y A f f i n e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IdentityAffine() initializes the affine transform to the identity matrix.
+%
+% The format of the IdentityAffine method is:
+%
+% IdentityAffine(AffineMatrix *affine)
+%
+% A description of each parameter follows:
+%
+% o affine: A pointer the affine transform of type AffineMatrix.
+%
+*/
+MagickExport void IdentityAffine(AffineMatrix *affine)
+{
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ assert(affine != (AffineMatrix *) NULL);
+ (void) ResetMagickMemory(affine,0,sizeof(AffineMatrix));
+ affine->sx=1.0;
+ affine->sy=1.0;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I n i t i a l i z e M a g i c k %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% InitializeMagick() initializes the ImageMagick environment.
+%
+% Deprecated, replace with:
+%
+% MagickCoreGenesis(path,MagickFalse);
+%
+% The format of the InitializeMagick function is:
+%
+% InitializeMagick(const char *path)
+%
+% A description of each parameter follows:
+%
+% o path: the execution path of the current ImageMagick client.
+%
+*/
+MagickExport void InitializeMagick(const char *path)
+{
+ MagickCoreGenesis(path,MagickFalse);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I n t e r p o l a t e P i x e l C o l o r %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% InterpolatePixelColor() applies bi-linear or tri-linear interpolation
+% between a pixel and it's neighbors.
+%
+% The format of the InterpolatePixelColor method is:
+%
+% MagickPixelPacket InterpolatePixelColor(const Image *image,
+% CacheView *view_info,InterpolatePixelMethod method,const double x,
+% const double y,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o image_view: the image cache view.
+%
+% o type: the type of pixel color interpolation.
+%
+% o x,y: A double representing the current (x,y) position of the pixel.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+
+static inline double MagickMax(const double x,const double y)
+{
+ if (x > y)
+ return(x);
+ return(y);
+}
+
+static void BicubicInterpolate(const MagickPixelPacket *pixels,const double dx,
+ MagickPixelPacket *pixel)
+{
+ MagickRealType
+ dx2,
+ p,
+ q,
+ r,
+ s;
+
+ dx2=dx*dx;
+ p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
+ q=(pixels[0].red-pixels[1].red)-p;
+ r=pixels[2].red-pixels[0].red;
+ s=pixels[1].red;
+ pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
+ p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
+ q=(pixels[0].green-pixels[1].green)-p;
+ r=pixels[2].green-pixels[0].green;
+ s=pixels[1].green;
+ pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
+ p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
+ q=(pixels[0].blue-pixels[1].blue)-p;
+ r=pixels[2].blue-pixels[0].blue;
+ s=pixels[1].blue;
+ pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
+ p=(pixels[3].opacity-pixels[2].opacity)-(pixels[0].opacity-pixels[1].opacity);
+ q=(pixels[0].opacity-pixels[1].opacity)-p;
+ r=pixels[2].opacity-pixels[0].opacity;
+ s=pixels[1].opacity;
+ pixel->opacity=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
+ if (pixel->colorspace == CMYKColorspace)
+ {
+ p=(pixels[3].index-pixels[2].index)-(pixels[0].index-pixels[1].index);
+ q=(pixels[0].index-pixels[1].index)-p;
+ r=pixels[2].index-pixels[0].index;
+ s=pixels[1].index;
+ pixel->index=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
+ }
+}
+
+static inline MagickRealType CubicWeightingFunction(const MagickRealType x)
+{
+ MagickRealType
+ alpha,
+ gamma;
+
+ alpha=MagickMax(x+2.0,0.0);
+ gamma=1.0*alpha*alpha*alpha;
+ alpha=MagickMax(x+1.0,0.0);
+ gamma-=4.0*alpha*alpha*alpha;
+ alpha=MagickMax(x+0.0,0.0);
+ gamma+=6.0*alpha*alpha*alpha;
+ alpha=MagickMax(x-1.0,0.0);
+ gamma-=4.0*alpha*alpha*alpha;
+ return(gamma/6.0);
+}
+
+static inline double MeshInterpolate(const PointInfo *delta,const double p,
+ const double x,const double y)
+{
+ return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
+}
+
+static inline ssize_t NearestNeighbor(MagickRealType x)
+{
+ if (x >= 0.0)
+ return((ssize_t) (x+0.5));
+ return((ssize_t) (x-0.5));
+}
+
+MagickExport MagickPixelPacket InterpolatePixelColor(const Image *image,
+ CacheView *image_view,const InterpolatePixelMethod method,const double x,
+ const double y,ExceptionInfo *exception)
+{
+ MagickPixelPacket
+ pixel;
+
+ register const IndexPacket
+ *indexes;
+
+ register const PixelPacket
+ *p;
+
+ register ssize_t
+ i;
+
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ assert(image_view != (CacheView *) NULL);
+ GetMagickPixelPacket(image,&pixel);
+ switch (method)
+ {
+ case AverageInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[16];
+
+ MagickRealType
+ alpha[16],
+ gamma;
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
+ floor(y)-1,4,4,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ for (i=0; i < 16L; i++)
+ {
+ GetMagickPixelPacket(image,pixels+i);
+ SetMagickPixelPacket(image,p,indexes+i,pixels+i);
+ alpha[i]=1.0;
+ if (image->matte != MagickFalse)
+ {
+ alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
+ pixels[i].red*=alpha[i];
+ pixels[i].green*=alpha[i];
+ pixels[i].blue*=alpha[i];
+ if (image->colorspace == CMYKColorspace)
+ pixels[i].index*=alpha[i];
+ }
+ gamma=alpha[i];
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red+=gamma*0.0625*pixels[i].red;
+ pixel.green+=gamma*0.0625*pixels[i].green;
+ pixel.blue+=gamma*0.0625*pixels[i].blue;
+ pixel.opacity+=0.0625*pixels[i].opacity;
+ if (image->colorspace == CMYKColorspace)
+ pixel.index+=gamma*0.0625*pixels[i].index;
+ p++;
+ }
+ break;
+ }
+ case BicubicInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[16],
+ u[4];
+
+ MagickRealType
+ alpha[16];
+
+ PointInfo
+ delta;
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
+ floor(y)-1,4,4,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ for (i=0; i < 16L; i++)
+ {
+ GetMagickPixelPacket(image,pixels+i);
+ SetMagickPixelPacket(image,p,indexes+i,pixels+i);
+ alpha[i]=1.0;
+ if (image->matte != MagickFalse)
+ {
+ alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
+ pixels[i].red*=alpha[i];
+ pixels[i].green*=alpha[i];
+ pixels[i].blue*=alpha[i];
+ if (image->colorspace == CMYKColorspace)
+ pixels[i].index*=alpha[i];
+ }
+ p++;
+ }
+ delta.x=x-floor(x);
+ for (i=0; i < 4L; i++)
+ BicubicInterpolate(pixels+4*i,delta.x,u+i);
+ delta.y=y-floor(y);
+ BicubicInterpolate(u,delta.y,&pixel);
+ break;
+ }
+ case BilinearInterpolatePixel:
+ default:
+ {
+ MagickPixelPacket
+ pixels[16];
+
+ MagickRealType
+ alpha[16],
+ gamma;
+
+ PointInfo
+ delta;
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
+ floor(y),2,2,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ for (i=0; i < 4L; i++)
+ {
+ GetMagickPixelPacket(image,pixels+i);
+ SetMagickPixelPacket(image,p,indexes+i,pixels+i);
+ alpha[i]=1.0;
+ if (image->matte != MagickFalse)
+ {
+ alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
+ pixels[i].red*=alpha[i];
+ pixels[i].green*=alpha[i];
+ pixels[i].blue*=alpha[i];
+ if (image->colorspace == CMYKColorspace)
+ pixels[i].index*=alpha[i];
+ }
+ p++;
+ }
+ delta.x=x-floor(x);
+ delta.y=y-floor(y);
+ gamma=(((1.0-delta.y)*((1.0-delta.x)*alpha[0]+delta.x*alpha[1])+delta.y*
+ ((1.0-delta.x)*alpha[2]+delta.x*alpha[3])));
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].red+delta.x*
+ pixels[1].red)+delta.y*((1.0-delta.x)*pixels[2].red+delta.x*
+ pixels[3].red));
+ pixel.green=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].green+delta.x*
+ pixels[1].green)+delta.y*((1.0-delta.x)*pixels[2].green+
+ delta.x*pixels[3].green));
+ pixel.blue=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].blue+delta.x*
+ pixels[1].blue)+delta.y*((1.0-delta.x)*pixels[2].blue+delta.x*
+ pixels[3].blue));
+ pixel.opacity=((1.0-delta.y)*((1.0-delta.x)*pixels[0].opacity+delta.x*
+ pixels[1].opacity)+delta.y*((1.0-delta.x)*pixels[2].opacity+delta.x*
+ pixels[3].opacity));
+ if (image->colorspace == CMYKColorspace)
+ pixel.index=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].index+delta.x*
+ pixels[1].index)+delta.y*((1.0-delta.x)*pixels[2].index+delta.x*
+ pixels[3].index));
+ break;
+ }
+ case FilterInterpolatePixel:
+ {
+ Image
+ *excerpt_image,
+ *filter_image;
+
+ MagickPixelPacket
+ pixels[1];
+
+ RectangleInfo
+ geometry;
+
+ geometry.width=4L;
+ geometry.height=4L;
+ geometry.x=(ssize_t) floor(x)-1L;
+ geometry.y=(ssize_t) floor(y)-1L;
+ excerpt_image=ExcerptImage(image,&geometry,exception);
+ if (excerpt_image == (Image *) NULL)
+ break;
+ filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
+ exception);
+ excerpt_image=DestroyImage(excerpt_image);
+ if (filter_image == (Image *) NULL)
+ break;
+ p=GetVirtualPixels(filter_image,0,0,1,1,exception);
+ if (p == (const PixelPacket *) NULL)
+ {
+ filter_image=DestroyImage(filter_image);
+ break;
+ }
+ indexes=GetVirtualIndexQueue(filter_image);
+ GetMagickPixelPacket(image,pixels);
+ SetMagickPixelPacket(image,p,indexes,&pixel);
+ filter_image=DestroyImage(filter_image);
+ break;
+ }
+ case IntegerInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[1];
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
+ floor(y),1,1,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ GetMagickPixelPacket(image,pixels);
+ SetMagickPixelPacket(image,p,indexes,&pixel);
+ break;
+ }
+ case MeshInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[4];
+
+ MagickRealType
+ alpha[4],
+ gamma;
+
+ PointInfo
+ delta,
+ luminance;
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
+ floor(y),2,2,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ for (i=0; i < 4L; i++)
+ {
+ GetMagickPixelPacket(image,pixels+i);
+ SetMagickPixelPacket(image,p,indexes+i,pixels+i);
+ alpha[i]=1.0;
+ if (image->matte != MagickFalse)
+ {
+ alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
+ pixels[i].red*=alpha[i];
+ pixels[i].green*=alpha[i];
+ pixels[i].blue*=alpha[i];
+ if (image->colorspace == CMYKColorspace)
+ pixels[i].index*=alpha[i];
+ }
+ p++;
+ }
+ delta.x=x-floor(x);
+ delta.y=y-floor(y);
+ luminance.x=MagickPixelLuminance(pixels+0)-MagickPixelLuminance(pixels+3);
+ luminance.y=MagickPixelLuminance(pixels+1)-MagickPixelLuminance(pixels+2);
+ if (fabs(luminance.x) < fabs(luminance.y))
+ {
+ /*
+ Diagonal 0-3 NW-SE.
+ */
+ if (delta.x <= delta.y)
+ {
+ /*
+ Bottom-left triangle (pixel:2, diagonal: 0-3).
+ */
+ delta.y=1.0-delta.y;
+ gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red=gamma*MeshInterpolate(&delta,pixels[2].red,
+ pixels[3].red,pixels[0].red);
+ pixel.green=gamma*MeshInterpolate(&delta,pixels[2].green,
+ pixels[3].green,pixels[0].green);
+ pixel.blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
+ pixels[3].blue,pixels[0].blue);
+ pixel.opacity=gamma*MeshInterpolate(&delta,pixels[2].opacity,
+ pixels[3].opacity,pixels[0].opacity);
+ if (image->colorspace == CMYKColorspace)
+ pixel.index=gamma*MeshInterpolate(&delta,pixels[2].index,
+ pixels[3].index,pixels[0].index);
+ }
+ else
+ {
+ /*
+ Top-right triangle (pixel:1, diagonal: 0-3).
+ */
+ delta.x=1.0-delta.x;
+ gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red=gamma*MeshInterpolate(&delta,pixels[1].red,
+ pixels[0].red,pixels[3].red);
+ pixel.green=gamma*MeshInterpolate(&delta,pixels[1].green,
+ pixels[0].green,pixels[3].green);
+ pixel.blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
+ pixels[0].blue,pixels[3].blue);
+ pixel.opacity=gamma*MeshInterpolate(&delta,pixels[1].opacity,
+ pixels[0].opacity,pixels[3].opacity);
+ if (image->colorspace == CMYKColorspace)
+ pixel.index=gamma*MeshInterpolate(&delta,pixels[1].index,
+ pixels[0].index,pixels[3].index);
+ }
+ }
+ else
+ {
+ /*
+ Diagonal 1-2 NE-SW.
+ */
+ if (delta.x <= (1.0-delta.y))
+ {
+ /*
+ Top-left triangle (pixel 0, diagonal: 1-2).
+ */
+ gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red=gamma*MeshInterpolate(&delta,pixels[0].red,
+ pixels[1].red,pixels[2].red);
+ pixel.green=gamma*MeshInterpolate(&delta,pixels[0].green,
+ pixels[1].green,pixels[2].green);
+ pixel.blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
+ pixels[1].blue,pixels[2].blue);
+ pixel.opacity=gamma*MeshInterpolate(&delta,pixels[0].opacity,
+ pixels[1].opacity,pixels[2].opacity);
+ if (image->colorspace == CMYKColorspace)
+ pixel.index=gamma*MeshInterpolate(&delta,pixels[0].index,
+ pixels[1].index,pixels[2].index);
+ }
+ else
+ {
+ /*
+ Bottom-right triangle (pixel: 3, diagonal: 1-2).
+ */
+ delta.x=1.0-delta.x;
+ delta.y=1.0-delta.y;
+ gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red=gamma*MeshInterpolate(&delta,pixels[3].red,
+ pixels[2].red,pixels[1].red);
+ pixel.green=gamma*MeshInterpolate(&delta,pixels[3].green,
+ pixels[2].green,pixels[1].green);
+ pixel.blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
+ pixels[2].blue,pixels[1].blue);
+ pixel.opacity=gamma*MeshInterpolate(&delta,pixels[3].opacity,
+ pixels[2].opacity,pixels[1].opacity);
+ if (image->colorspace == CMYKColorspace)
+ pixel.index=gamma*MeshInterpolate(&delta,pixels[3].index,
+ pixels[2].index,pixels[1].index);
+ }
+ }
+ break;
+ }
+ case NearestNeighborInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[1];
+
+ p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
+ NearestNeighbor(y),1,1,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ GetMagickPixelPacket(image,pixels);
+ SetMagickPixelPacket(image,p,indexes,&pixel);
+ break;
+ }
+ case SplineInterpolatePixel:
+ {
+ MagickPixelPacket
+ pixels[16];
+
+ MagickRealType
+ alpha[16],
+ dx,
+ dy,
+ gamma;
+
+ PointInfo
+ delta;
+
+ ssize_t
+ j,
+ n;
+
+ p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
+ floor(y)-1,4,4,exception);
+ if (p == (const PixelPacket *) NULL)
+ break;
+ indexes=GetCacheViewVirtualIndexQueue(image_view);
+ n=0;
+ delta.x=x-floor(x);
+ delta.y=y-floor(y);
+ for (i=(-1); i < 3L; i++)
+ {
+ dy=CubicWeightingFunction((MagickRealType) i-delta.y);
+ for (j=(-1); j < 3L; j++)
+ {
+ GetMagickPixelPacket(image,pixels+n);
+ SetMagickPixelPacket(image,p,indexes+n,pixels+n);
+ alpha[n]=1.0;
+ if (image->matte != MagickFalse)
+ {
+ alpha[n]=QuantumScale*((MagickRealType)
+ GetAlphaPixelComponent(p));
+ pixels[n].red*=alpha[n];
+ pixels[n].green*=alpha[n];
+ pixels[n].blue*=alpha[n];
+ if (image->colorspace == CMYKColorspace)
+ pixels[n].index*=alpha[n];
+ }
+ dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
+ gamma=alpha[n];
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ pixel.red+=gamma*dx*dy*pixels[n].red;
+ pixel.green+=gamma*dx*dy*pixels[n].green;
+ pixel.blue+=gamma*dx*dy*pixels[n].blue;
+ if (image->matte != MagickFalse)
+ pixel.opacity+=dx*dy*pixels[n].opacity;
+ if (image->colorspace == CMYKColorspace)
+ pixel.index+=gamma*dx*dy*pixels[n].index;
+ n++;
+ p++;
+ }
+ }
+ break;
+ }
+ }
+ return(pixel);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% I n t e r p r e t I m a g e A t t r i b u t e s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% InterpretImageAttributes() replaces any embedded formatting characters with
+% the appropriate image attribute and returns the translated text.
+%
+% Deprecated, replace with:
+%
+% InterpretImageProperties(image_info,image,embed_text);
+%
+% The format of the InterpretImageAttributes method is:
+%
+% char *InterpretImageAttributes(const ImageInfo *image_info,Image *image,
+% const char *embed_text)
+%
+% A description of each parameter follows:
+%
+% o image_info: the image info.
+%
+% o image: the image.
+%
+% o embed_text: the address of a character string containing the embedded
+% formatting characters.
+%
+*/
+MagickExport char *InterpretImageAttributes(const ImageInfo *image_info,
+ Image *image,const char *embed_text)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
+ return(InterpretImageProperties(image_info,image,embed_text));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ I s S u b i m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% IsSubimage() returns MagickTrue if the geometry is a valid subimage
+% specification (e.g. [1], [1-9], [1,7,4]).
+%
+% The format of the IsSubimage method is:
+%
+% unsigned int IsSubimage(const char *geometry,const unsigned int pedantic)
+%
+% A description of each parameter follows:
+%
+% o geometry: This string is the geometry specification.
+%
+% o pedantic: A value other than 0 invokes a more restrictive set of
+% conditions for a valid specification (e.g. [1], [1-4], [4-1]).
+%
+*/
+MagickExport unsigned int IsSubimage(const char *geometry,
+ const unsigned int pedantic)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (geometry == (const char *) NULL)
+ return(MagickFalse);
+ if ((strchr(geometry,'x') != (char *) NULL) ||
+ (strchr(geometry,'X') != (char *) NULL))
+ return(MagickFalse);
+ if ((pedantic != MagickFalse) && (strchr(geometry,',') != (char *) NULL))
+ return(MagickFalse);
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% L e v e l I m a g e C o l o r s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LevelImageColor() will map the given color to "black" and "white"
+% values, limearly spreading out the colors, and level values on a channel by
+% channel bases, as per LevelImage(). The given colors allows you to specify
+% different level ranges for each of the color channels separately.
+%
+% If the boolean 'invert' is set true the image values will modifyed in the
+% reverse direction. That is any existing "black" and "white" colors in the
+% image will become the color values given, with all other values compressed
+% appropriatally. This effectivally maps a greyscale gradient into the given
+% color gradient.
+%
+% Deprecated, replace with:
+%
+% LevelColorsImageChannel(image,channel,black_color,white_color,invert);
+%
+% The format of the LevelImageColors method is:
+%
+% MagickBooleanType LevelImageColors(Image *image,const ChannelType channel,
+% const MagickPixelPacket *black_color,const MagickPixelPacket *white_color,
+% const MagickBooleanType invert)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o channel: the channel.
+%
+% o black_color: The color to map black to/from
+%
+% o white_point: The color to map white to/from
+%
+% o invert: if true map the colors (levelize), rather than from (level)
+%
+*/
+MagickBooleanType LevelImageColors(Image *image,const ChannelType channel,
+ const MagickPixelPacket *black_color,const MagickPixelPacket *white_color,
+ const MagickBooleanType invert)
+{
+ return(LevelColorsImageChannel(image,channel,black_color,white_color,invert));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% L i b e r a t e M e m o r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LiberateMemory() frees memory that has already been allocated, and NULL's
+% the pointer to it.
+%
+% The format of the LiberateMemory method is:
+%
+% void LiberateMemory(void **memory)
+%
+% A description of each parameter follows:
+%
+% o memory: A pointer to a block of memory to free for reuse.
+%
+*/
+MagickExport void LiberateMemory(void **memory)
+{
+ assert(memory != (void **) NULL);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (*memory == (void *) NULL)
+ return;
+ free(*memory);
+ *memory=(void *) NULL;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% L i b e r a t e S e m a p h o r e I n f o %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% LiberateSemaphoreInfo() relinquishes a semaphore.
+%
+% Deprecated, replace with:
+%
+% UnlockSemaphoreInfo(*semaphore_info);
+%
+% The format of the LiberateSemaphoreInfo method is:
+%
+% LiberateSemaphoreInfo(void **semaphore_info)
+%
+% A description of each parameter follows:
+%
+% o semaphore_info: Specifies a pointer to an SemaphoreInfo structure.
+%
+*/
+MagickExport void LiberateSemaphoreInfo(SemaphoreInfo **semaphore_info)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ UnlockSemaphoreInfo(*semaphore_info);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a g i c k I n c a r n a t e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MagickIncarnate() initializes the ImageMagick environment.
+%
+% Deprecated, replace with:
+%
+% MagickCoreGenesis(path,MagickFalse);
+%
+% The format of the MagickIncarnate function is:
+%
+% MagickIncarnate(const char *path)
+%
+% A description of each parameter follows:
+%
+% o path: the execution path of the current ImageMagick client.
+%
+*/
+
+MagickExport void MagickIncarnate(const char *path)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
+ MagickCoreGenesis(path,MagickFalse);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a g i c k M o n i t o r %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MagickMonitor() calls the monitor handler method with a text string that
+% describes the task and a measure of completion. The method returns
+% MagickTrue on success otherwise MagickFalse if an error is encountered, e.g.
+% if there was a user interrupt.
+%
+% The format of the MagickMonitor method is:
+%
+% MagickBooleanType MagickMonitor(const char *text,
+% const MagickOffsetType offset,const MagickSizeType span,
+% void *client_data)
+%
+% A description of each parameter follows:
+%
+% o offset: the position relative to the span parameter which represents
+% how much progress has been made toward completing a task.
+%
+% o span: the span relative to completing a task.
+%
+% o client_data: the client data.
+%
+*/
+MagickExport MagickBooleanType MagickMonitor(const char *text,
+ const MagickOffsetType offset,const MagickSizeType span,
+ void *magick_unused(client_data))
+{
+ ExceptionInfo
*exception;
- Image
- *source_image;
+ MagickBooleanType
+ status;
+
+ assert(text != (const char *) NULL);
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",text);
+ ProcessPendingEvents(text);
+ status=MagickTrue;
+ exception=AcquireExceptionInfo();
+ if (monitor_handler != (MonitorHandler) NULL)
+ status=(*monitor_handler)(text,offset,span,exception);
+ exception=DestroyExceptionInfo(exception);
+ return(status);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a p I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MapImage() replaces the colors of an image with the closest color from a
+% reference image.
+%
+% Deprecated, replace with:
+%
+% QuantizeInfo quantize_info;
+% GetQuantizeInfo(&quantize_info);
+% quantize_info.dither=dither;
+% RemapImage(&quantize_info,image,map_image);
+%
+% The format of the MapImage method is:
+%
+% MagickBooleanType MapImage(Image *image,const Image *map_image,
+% const MagickBooleanType dither)
+%
+% A description of each parameter follows:
+%
+% o image: Specifies a pointer to an Image structure.
+%
+% o map_image: the image. Reduce image to a set of colors represented by
+% this image.
+%
+% o dither: Set this integer value to something other than zero to
+% dither the mapped image.
+%
+*/
+MagickExport MagickBooleanType MapImage(Image *image,const Image *map_image,
+ const MagickBooleanType dither)
+{
+ QuantizeInfo
+ quantize_info;
+
+ /*
+ Initialize color cube.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(map_image != (Image *) NULL);
+ assert(map_image->signature == MagickSignature);
+ GetQuantizeInfo(&quantize_info);
+ quantize_info.dither=dither;
+ return(RemapImage(&quantize_info,image,map_image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a p I m a g e s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MapImages() replaces the colors of a sequence of images with the closest
+% color from a reference image.
+%
+% Deprecated, replace with:
+%
+% QuantizeInfo quantize_info;
+% GetQuantizeInfo(&quantize_info);
+% quantize_info.dither=dither;
+% RemapImages(&quantize_info,images,map_image);
+%
+% The format of the MapImage method is:
+%
+% MagickBooleanType MapImages(Image *images,Image *map_image,
+% const MagickBooleanType dither)
+%
+% A description of each parameter follows:
+%
+% o image: Specifies a pointer to a set of Image structures.
+%
+% o map_image: the image. Reduce image to a set of colors represented by
+% this image.
+%
+% o dither: Set this integer value to something other than zero to
+% dither the quantized image.
+%
+*/
+MagickExport MagickBooleanType MapImages(Image *images,const Image *map_image,
+ const MagickBooleanType dither)
+{
+ QuantizeInfo
+ quantize_info;
+
+ assert(images != (Image *) NULL);
+ assert(images->signature == MagickSignature);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
+ GetQuantizeInfo(&quantize_info);
+ quantize_info.dither=dither;
+ return(RemapImages(&quantize_info,images,map_image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a t t e F l o o d f i l l I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MatteFloodfill() changes the transparency value of any pixel that matches
+% target and is an immediate neighbor. If the method FillToBorderMethod
+% is specified, the transparency value is changed for any neighbor pixel
+% that does not match the bordercolor member of image.
+%
+% By default target must match a particular pixel transparency exactly.
+% However, in many cases two transparency values may differ by a
+% small amount. The fuzz member of image defines how much tolerance is
+% acceptable to consider two transparency values as the same. For example,
+% set fuzz to 10 and the opacity values of 100 and 102 respectively are
+% now interpreted as the same value for the purposes of the floodfill.
+%
+% The format of the MatteFloodfillImage method is:
+%
+% MagickBooleanType MatteFloodfillImage(Image *image,
+% const PixelPacket target,const Quantum opacity,const ssize_t x_offset,
+% const ssize_t y_offset,const PaintMethod method)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o target: the RGB value of the target color.
+%
+% o opacity: the level of transparency: 0 is fully opaque and QuantumRange is
+% fully transparent.
+%
+% o x,y: the starting location of the operation.
+%
+% o method: Choose either FloodfillMethod or FillToBorderMethod.
+%
+*/
+MagickExport MagickBooleanType MatteFloodfillImage(Image *image,
+ const PixelPacket target,const Quantum opacity,const ssize_t x_offset,
+ const ssize_t y_offset,const PaintMethod method)
+{
+ Image
+ *floodplane_image;
+
+ MagickBooleanType
+ skip;
+
+ register SegmentInfo
+ *s;
+
+ SegmentInfo
+ *segment_stack;
+
+ ssize_t
+ offset,
+ start,
+ x,
+ x1,
+ x2,
+ y;
+
+ /*
+ Check boundary conditions.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
+ return(MagickFalse);
+ if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
+ return(MagickFalse);
+ if (SetImageStorageClass(image,DirectClass) == MagickFalse)
+ return(MagickFalse);
+ if (image->matte == MagickFalse)
+ (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
+ floodplane_image=CloneImage(image,image->columns,image->rows,MagickTrue,
+ &image->exception);
+ if (floodplane_image == (Image *) NULL)
+ return(MagickFalse);
+ (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
+ /*
+ Set floodfill color.
+ */
+ segment_stack=(SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
+ sizeof(*segment_stack));
+ if (segment_stack == (SegmentInfo *) NULL)
+ {
+ floodplane_image=DestroyImage(floodplane_image);
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ image->filename);
+ }
+ /*
+ Push initial segment on stack.
+ */
+ x=x_offset;
+ y=y_offset;
+ start=0;
+ s=segment_stack;
+ PushSegmentStack(y,x,x,1);
+ PushSegmentStack(y+1,x,x,-1);
+ while (s > segment_stack)
+ {
+ register const PixelPacket
+ *restrict p;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ /*
+ Pop segment off stack.
+ */
+ s--;
+ x1=(ssize_t) s->x1;
+ x2=(ssize_t) s->x2;
+ offset=(ssize_t) s->y2;
+ y=(ssize_t) s->y1+offset;
+ /*
+ Recolor neighboring pixels.
+ */
+ p=GetVirtualPixels(image,0,y,(size_t) (x1+1),1,&image->exception);
+ q=GetAuthenticPixels(floodplane_image,0,y,(size_t) (x1+1),1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ p+=x1;
+ q+=x1;
+ for (x=x1; x >= 0; x--)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ q->opacity=(Quantum) TransparentOpacity;
+ q--;
+ p--;
+ }
+ if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
+ break;
+ skip=x >= x1 ? MagickTrue : MagickFalse;
+ if (skip == MagickFalse)
+ {
+ start=x+1;
+ if (start < x1)
+ PushSegmentStack(y,start,x1-1,-offset);
+ x=x1+1;
+ }
+ do
+ {
+ if (skip == MagickFalse)
+ {
+ if (x < (ssize_t) image->columns)
+ {
+ p=GetVirtualPixels(image,x,y,image->columns-x,1,
+ &image->exception);
+ q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) ||
+ (q == (PixelPacket *) NULL))
+ break;
+ for ( ; x < (ssize_t) image->columns; x++)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ q->opacity=(Quantum) TransparentOpacity;
+ q++;
+ p++;
+ }
+ if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
+ break;
+ }
+ PushSegmentStack(y,start,x-1,offset);
+ if (x > (x2+1))
+ PushSegmentStack(y,x2+1,x-1,-offset);
+ }
+ skip=MagickFalse;
+ x++;
+ if (x <= x2)
+ {
+ p=GetVirtualPixels(image,x,y,(size_t) (x2-x+1),1,
+ &image->exception);
+ q=GetAuthenticPixels(floodplane_image,x,y,(size_t) (x2-x+1),1,
+ &image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ for ( ; x <= x2; x++)
+ {
+ if (q->opacity == (Quantum) TransparentOpacity)
+ break;
+ if (method == FloodfillMethod)
+ {
+ if (IsColorSimilar(image,p,&target) != MagickFalse)
+ break;
+ }
+ else
+ if (IsColorSimilar(image,p,&target) == MagickFalse)
+ break;
+ p++;
+ q++;
+ }
+ }
+ start=x;
+ } while (x <= x2);
+ }
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register const PixelPacket
+ *restrict p;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ /*
+ Tile fill color onto floodplane.
+ */
+ p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
+ &image->exception);
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (GetOpacityPixelComponent(p) != OpaqueOpacity)
+ q->opacity=opacity;
+ p++;
+ q++;
+ }
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ }
+ segment_stack=(SegmentInfo *) RelinquishMagickMemory(segment_stack);
+ floodplane_image=DestroyImage(floodplane_image);
+ return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M a x i m u m I m a g e s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MaximumImages() returns the maximum intensity of an image sequence.
+%
+% Deprecated, replace with:
+%
+% EvaluateImages(images,MinEvaluateOperator,exception);
+%
+% The format of the MaxImages method is:
+%
+% Image *MaximumImages(Image *images,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image sequence.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *MaximumImages(const Image *images,ExceptionInfo *exception)
+{
+ return(EvaluateImages(images,MinEvaluateOperator,exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M i n i m u m I m a g e s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MinimumImages() returns the minimum intensity of an image sequence.
+%
+% Deprecated, replace with:
+%
+% EvaluateImages(images,MinEvaluateOperator,exception);
+%
+% The format of the MinimumImages method is:
+%
+% Image *MinimumImages(Image *images,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image sequence.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *MinimumImages(const Image *images,ExceptionInfo *exception)
+{
+ return(EvaluateImages(images,MinEvaluateOperator,exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M e d i a n F i l t e r I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MedianFilterImage() applies a digital filter that improves the quality
+% of a noisy image. Each pixel is replaced by the median in a set of
+% neighboring pixels as defined by radius.
+%
+% The algorithm was contributed by Mike Edmonds and implements an insertion
+% sort for selecting median color-channel values. For more on this algorithm
+% see "Skip Lists: A probabilistic Alternative to Balanced Trees" by William
+% Pugh in the June 1990 of Communications of the ACM.
+%
+% The format of the MedianFilterImage method is:
+%
+% Image *MedianFilterImage(const Image *image,const double radius,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o radius: the radius of the pixel neighborhood.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *MedianFilterImage(const Image *image,const double radius,
+ ExceptionInfo *exception)
+{
+ Image
+ *median_image;
+
+ median_image=StatisticImage(image,MedianStatistic,(size_t) radius,(size_t)
+ radius,exception);
+ return(median_image);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M o d e I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ModeImage() makes each pixel the 'predominate color' of the neighborhood
+% of the specified radius.
+%
+% The format of the ModeImage method is:
+%
+% Image *ModeImage(const Image *image,const double radius,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o radius: the radius of the pixel neighborhood.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *ModeImage(const Image *image,const double radius,
+ ExceptionInfo *exception)
+{
+ Image
+ *mode_image;
+
+ mode_image=StatisticImage(image,ModeStatistic,(size_t) radius,(size_t) radius,
+ exception);
+ return(mode_image);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% M o s a i c I m a g e s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% MosaicImages() Obsolete Function: Use MergeImageLayers() instead.
+%
+% Deprecated, replace with:
+%
+% MergeImageLayers(image,MosaicLayer,exception);
+%
+% The format of the MosaicImage method is:
+%
+% Image *MosaicImages(const Image *image,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image list to be composited together
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *MosaicImages(Image *image,ExceptionInfo *exception)
+{
+ return(MergeImageLayers(image,MosaicLayer,exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% O p a q u e I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% OpaqueImage() changes any pixel that matches color with the color
+% defined by fill.
+%
+% By default color must match a particular pixel color exactly. However,
+% in many cases two colors may differ by a small amount. Fuzz defines
+% how much tolerance is acceptable to consider two colors as the same.
+% For example, set fuzz to 10 and the color red at intensities of 100 and
+% 102 respectively are now interpreted as the same color.
+%
+% The format of the OpaqueImage method is:
+%
+% MagickBooleanType OpaqueImage(Image *image,
+% const PixelPacket *target,const PixelPacket fill)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o target: the RGB value of the target color.
+%
+% o fill: the replacement color.
+%
+*/
+MagickExport MagickBooleanType OpaqueImage(Image *image,
+ const PixelPacket target,const PixelPacket fill)
+{
+#define OpaqueImageTag "Opaque/Image"
+
+ MagickBooleanType
+ proceed;
+
+ register ssize_t
+ i;
+
+ ssize_t
+ y;
+
+ /*
+ Make image color opaque.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.1.0");
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ switch (image->storage_class)
+ {
+ case DirectClass:
+ default:
+ {
+ /*
+ Make DirectClass image opaque.
+ */
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (IsColorSimilar(image,q,&target) != MagickFalse)
+ *q=fill;
+ q++;
+ }
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ proceed=SetImageProgress(image,OpaqueImageTag,(MagickOffsetType) y,
+ image->rows);
+ if (proceed == MagickFalse)
+ break;
+ }
+ break;
+ }
+ case PseudoClass:
+ {
+ /*
+ Make PseudoClass image opaque.
+ */
+ for (i=0; i < (ssize_t) image->colors; i++)
+ {
+ if (IsColorSimilar(image,&image->colormap[i],&target) != MagickFalse)
+ image->colormap[i]=fill;
+ }
+ if (fill.opacity != OpaqueOpacity)
+ {
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (IsColorSimilar(image,q,&target) != MagickFalse)
+ q->opacity=fill.opacity;
+ q++;
+ }
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ }
+ }
+ (void) SyncImage(image);
+ break;
+ }
+ }
+ if (fill.opacity != OpaqueOpacity)
+ image->matte=MagickTrue;
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% O p e n C a c h e V i e w %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% OpenCacheView() opens a view into the pixel cache, using the
+% VirtualPixelMethod that is defined within the given image itself.
+%
+% Deprecated, replace with:
+%
+% AcquireCacheView(image);
+%
+% The format of the OpenCacheView method is:
+%
+% CacheView *OpenCacheView(const Image *image)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+*/
+MagickExport CacheView *OpenCacheView(const Image *image)
+{
+ return(AcquireCacheView(image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P a i n t F l o o d f i l l I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PaintFloodfill() changes the color value of any pixel that matches
+% target and is an immediate neighbor. If the method FillToBorderMethod is
+% specified, the color value is changed for any neighbor pixel that does not
+% match the bordercolor member of image.
+%
+% By default target must match a particular pixel color exactly.
+% However, in many cases two colors may differ by a small amount. The
+% fuzz member of image defines how much tolerance is acceptable to
+% consider two colors as the same. For example, set fuzz to 10 and the
+% color red at intensities of 100 and 102 respectively are now
+% interpreted as the same color for the purposes of the floodfill.
+%
+% Deprecated, replace with:
+%
+% FloodfillPaintImage(image,channel,draw_info,target,x,y,
+% method == FloodfillMethod ? MagickFalse : MagickTrue);
+%
+% The format of the PaintFloodfillImage method is:
+%
+% MagickBooleanType PaintFloodfillImage(Image *image,
+% const ChannelType channel,const MagickPixelPacket target,const ssize_t x,
+% const ssize_t y,const DrawInfo *draw_info,const PaintMethod method)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o channel: the channel(s).
+%
+% o target: the RGB value of the target color.
+%
+% o x,y: the starting location of the operation.
+%
+% o draw_info: the draw info.
+%
+% o method: Choose either FloodfillMethod or FillToBorderMethod.
+%
+*/
+MagickExport MagickBooleanType PaintFloodfillImage(Image *image,
+ const ChannelType channel,const MagickPixelPacket *target,const ssize_t x,
+ const ssize_t y,const DrawInfo *draw_info,const PaintMethod method)
+{
+ MagickBooleanType
+ status;
+
+ status=FloodfillPaintImage(image,channel,draw_info,target,x,y,
+ method == FloodfillMethod ? MagickFalse : MagickTrue);
+ return(status);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% P a i n t O p a q u e I m a g e %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PaintOpaqueImage() changes any pixel that matches color with the color
+% defined by fill.
+%
+% By default color must match a particular pixel color exactly. However,
+% in many cases two colors may differ by a small amount. Fuzz defines
+% how much tolerance is acceptable to consider two colors as the same.
+% For example, set fuzz to 10 and the color red at intensities of 100 and
+% 102 respectively are now interpreted as the same color.
+%
+% Deprecated, replace with:
+%
+% OpaquePaintImageChannel(image,DefaultChannels,target,fill,MagickFalse);
+% OpaquePaintImageChannel(image,channel,target,fill,MagickFalse);
+%
+% The format of the PaintOpaqueImage method is:
+%
+% MagickBooleanType PaintOpaqueImage(Image *image,
+% const PixelPacket *target,const PixelPacket *fill)
+% MagickBooleanType PaintOpaqueImageChannel(Image *image,
+% const ChannelType channel,const PixelPacket *target,
+% const PixelPacket *fill)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o channel: the channel(s).
+%
+% o target: the RGB value of the target color.
+%
+% o fill: the replacement color.
+%
+*/
+
+MagickExport MagickBooleanType PaintOpaqueImage(Image *image,
+ const MagickPixelPacket *target,const MagickPixelPacket *fill)
+{
+ MagickBooleanType
+ status;
+
+ status=OpaquePaintImageChannel(image,DefaultChannels,target,fill,MagickFalse);
+ return(status);
+}
+
+MagickExport MagickBooleanType PaintOpaqueImageChannel(Image *image,
+ const ChannelType channel,const MagickPixelPacket *target,
+ const MagickPixelPacket *fill)
+{
+ return(OpaquePaintImageChannel(image,channel,target,fill,MagickFalse));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P a i n t T r a n s p a r e n t I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PaintTransparentImage() changes the opacity value associated with any pixel
+% that matches color to the value defined by opacity.
+%
+% By default color must match a particular pixel color exactly. However,
+% in many cases two colors may differ by a small amount. Fuzz defines
+% how much tolerance is acceptable to consider two colors as the same.
+% For example, set fuzz to 10 and the color red at intensities of 100 and
+% 102 respectively are now interpreted as the same color.
+%
+% Deprecated, replace with:
+%
+% TransparentPaintImage(image,target,opacity,MagickFalse);
+%
+% The format of the PaintTransparentImage method is:
+%
+% MagickBooleanType PaintTransparentImage(Image *image,
+% const MagickPixelPacket *target,const Quantum opacity)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o target: the RGB value of the target color.
+%
+% o opacity: the replacement opacity value.
+%
+*/
+MagickExport MagickBooleanType PaintTransparentImage(Image *image,
+ const MagickPixelPacket *target,const Quantum opacity)
+{
+ return(TransparentPaintImage(image,target,opacity,MagickFalse));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ P a r s e I m a g e G e o m e t r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ParseImageGeometry() is similar to GetGeometry() except the returned
+% geometry is modified as determined by the meta characters: %, !, <,
+% and >.
+%
+% Deprecated, replace with:
+%
+% ParseMetaGeometry(geometry,x,y,width,height);
+%
+% The format of the ParseImageGeometry method is:
+%
+% int ParseImageGeometry(char *geometry,ssize_t *x,ssize_t *y,
+% size_t *width,size_t *height)
+%
+% A description of each parameter follows:
+%
+% o flags: Method ParseImageGeometry returns a bitmask that indicates
+% which of the four values were located in the geometry string.
+%
+% o image_geometry: Specifies a character string representing the geometry
+% specification.
+%
+% o x,y: A pointer to an integer. The x and y offset as determined by
+% the geometry specification is returned here.
+%
+% o width,height: A pointer to an unsigned integer. The width and height
+% as determined by the geometry specification is returned here.
+%
+*/
+MagickExport int ParseImageGeometry(const char *geometry,ssize_t *x,ssize_t *y,
+ size_t *width,size_t *height)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
+ return((int) ParseMetaGeometry(geometry,x,y,width,height));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P a r s e S i z e G e o m e t r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ParseSizeGeometry() returns a region as defined by the geometry string with
+% respect to the image dimensions and aspect ratio.
+%
+% Deprecated, replace with:
+%
+% ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y,
+% ®ion_info->width,®ion_info->height);
+%
+% The format of the ParseSizeGeometry method is:
+%
+% MagickStatusType ParseSizeGeometry(const Image *image,
+% const char *geometry,RectangeInfo *region_info)
+%
+% A description of each parameter follows:
+%
+% o geometry: The geometry (e.g. 100x100+10+10).
+%
+% o region_info: the region as defined by the geometry string.
+%
+*/
+MagickExport MagickStatusType ParseSizeGeometry(const Image *image,
+ const char *geometry,RectangleInfo *region_info)
+{
+ MagickStatusType
+ flags;
+
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.4.7");
+ SetGeometry(image,region_info);
+ flags=ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y,
+ ®ion_info->width,®ion_info->height);
+ return(flags);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P o p I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PopImageList() removes the last image in the list.
+%
+% Deprecated, replace with:
+%
+% RemoveLastImageFromList(images);
+%
+% The format of the PopImageList method is:
+%
+% Image *PopImageList(Image **images)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+*/
+MagickExport Image *PopImageList(Image **images)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(RemoveLastImageFromList(images));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P o p I m a g e P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PopImagePixels() transfers one or more pixel components from the image pixel
+% cache to a user supplied buffer. The pixels are returned in network byte
+% order. MagickTrue is returned if the pixels are successfully transferred,
+% otherwise MagickFalse.
+%
+% The format of the PopImagePixels method is:
+%
+% size_t PopImagePixels(Image *,const QuantumType quantum,
+% unsigned char *destination)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o quantum: Declare which pixel components to transfer (RGB, RGBA, etc).
+%
+% o destination: The components are transferred to this buffer.
+%
+*/
+MagickExport size_t PopImagePixels(Image *image,const QuantumType quantum,
+ unsigned char *destination)
+{
+ QuantumInfo
+ *quantum_info;
+
+ size_t
+ length;
+
+ quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
+ if (quantum_info == (QuantumInfo *) NULL)
+ return(0);
+ length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
+ quantum,destination,&image->exception);
+ quantum_info=DestroyQuantumInfo(quantum_info);
+ return(length);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P o s t s c r i p t G e o m e t r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PostscriptGeometry() replaces any page mneumonic with the equivalent size in
+% picas.
+%
+% Deprecated, replace with:
+%
+% GetPageGeometry(page);
+%
+% The format of the PostscriptGeometry method is:
+%
+% char *PostscriptGeometry(const char *page)
+%
+% A description of each parameter follows.
+%
+% o page: Specifies a pointer to an array of characters.
+% The string is either a Postscript page name (e.g. A4) or a postscript
+% page geometry (e.g. 612x792+36+36).
+%
+*/
+MagickExport char *PostscriptGeometry(const char *page)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
+ return(GetPageGeometry(page));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P u s h I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PushImageList() adds an image to the end of the list.
+%
+% Deprecated, replace with:
+%
+% AppendImageToList(images,CloneImageList(image,exception));
+%
+% The format of the PushImageList method is:
+%
+% unsigned int PushImageList(Image *images,const Image *image,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+% o image: the image.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport unsigned int PushImageList(Image **images,const Image *image,
+ ExceptionInfo *exception)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ AppendImageToList(images,CloneImageList(image,exception));
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% P u s h I m a g e P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% PushImagePixels() transfers one or more pixel components from a user
+% supplied buffer into the image pixel cache of an image. The pixels are
+% expected in network byte order. It returns MagickTrue if the pixels are
+% successfully transferred, otherwise MagickFalse.
+%
+% The format of the PushImagePixels method is:
+%
+% size_t PushImagePixels(Image *image,const QuantumType quantum,
+% const unsigned char *source)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o quantum: Declare which pixel components to transfer (red, green, blue,
+% opacity, RGB, or RGBA).
+%
+% o source: The pixel components are transferred from this buffer.
+%
+*/
+MagickExport size_t PushImagePixels(Image *image,const QuantumType quantum,
+ const unsigned char *source)
+{
+ QuantumInfo
+ *quantum_info;
+
+ size_t
+ length;
+
+ quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
+ if (quantum_info == (QuantumInfo *) NULL)
+ return(0);
+ length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,quantum,
+ source,&image->exception);
+ quantum_info=DestroyQuantumInfo(quantum_info);
+ return(length);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% Q u a n t i z a t i o n E r r o r %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% QuantizationError() measures the difference between the original and
+% quantized images. This difference is the total quantization error. The
+% error is computed by summing over all pixels in an image the distance
+% squared in RGB space between each reference pixel value and its quantized
+% value. These values are computed:
+%
+% o mean_error_per_pixel: This value is the mean error for any single
+% pixel in the image.
+%
+% o normalized_mean_square_error: This value is the normalized mean
+% quantization error for any single pixel in the image. This distance
+% measure is normalized to a range between 0 and 1. It is independent
+% of the range of red, green, and blue values in the image.
+%
+% o normalized_maximum_square_error: Thsi value is the normalized
+% maximum quantization error for any single pixel in the image. This
+% distance measure is normalized to a range between 0 and 1. It is
+% independent of the range of red, green, and blue values in your image.
+%
+% Deprecated, replace with:
+%
+% GetImageQuantizeError(image);
+%
+% The format of the QuantizationError method is:
+%
+% unsigned int QuantizationError(Image *image)
+%
+% A description of each parameter follows.
+%
+% o image: Specifies a pointer to an Image structure; returned from
+% ReadImage.
+%
+*/
+MagickExport unsigned int QuantizationError(Image *image)
+{
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.3");
+ return(GetImageQuantizeError(image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% R a n d o m C h a n n e l T h r e s h o l d I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RandomChannelThresholdImage() changes the value of individual pixels based
+% on the intensity of each pixel compared to a random threshold. The result
+% is a low-contrast, two color image.
+%
+% The format of the RandomChannelThresholdImage method is:
+%
+% unsigned int RandomChannelThresholdImage(Image *image,
+% const char *channel, const char *thresholds,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o channel: the channel or channels to be thresholded.
+%
+% o thresholds: a geometry string containing LOWxHIGH thresholds.
+% If the string contains 2x2, 3x3, or 4x4, then an ordered
+% dither of order 2, 3, or 4 will be performed instead.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport unsigned int RandomChannelThresholdImage(Image *image,const char
+ *channel,const char *thresholds,ExceptionInfo *exception)
+{
+#define RandomChannelThresholdImageText " RandomChannelThreshold image... "
+
+ double
+ lower_threshold,
+ upper_threshold;
+
+ RandomInfo
+ *random_info;
+
+ ssize_t
+ count,
+ y;
+
+ static MagickRealType
+ o2[4]={0.2f, 0.6f, 0.8f, 0.4f},
+ o3[9]={0.1f, 0.6f, 0.3f, 0.7f, 0.5f, 0.8f, 0.4f, 0.9f, 0.2f},
+ o4[16]={0.1f, 0.7f, 1.1f, 0.3f, 1.0f, 0.5f, 1.5f, 0.8f, 1.4f, 1.6f, 0.6f,
+ 1.2f, 0.4f, 0.9f, 1.3f, 0.2f},
+ threshold=128;
+
+ size_t
+ order;
+
+ /*
+ Threshold image.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (thresholds == (const char *) NULL)
+ return(MagickTrue);
+ if (LocaleCompare(thresholds,"2x2") == 0)
+ order=2;
+ else
+ if (LocaleCompare(thresholds,"3x3") == 0)
+ order=3;
+ else
+ if (LocaleCompare(thresholds,"4x4") == 0)
+ order=4;
+ else
+ {
+ order=1;
+ lower_threshold=0;
+ upper_threshold=0;
+ count=(ssize_t) sscanf(thresholds,"%lf[/x%%]%lf",&lower_threshold,
+ &upper_threshold);
+ if (strchr(thresholds,'%') != (char *) NULL)
+ {
+ upper_threshold*=(.01*QuantumRange);
+ lower_threshold*=(.01*QuantumRange);
+ }
+ if (count == 1)
+ upper_threshold=(MagickRealType) QuantumRange-lower_threshold;
+ }
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TransformEvent,GetMagickModule(),
+ " RandomChannelThresholdImage: channel type=%s",channel);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TransformEvent,GetMagickModule(),
+ " Thresholds: %s (%fx%f)",thresholds,lower_threshold,upper_threshold);
+ if (LocaleCompare(channel,"all") == 0 ||
+ LocaleCompare(channel,"intensity") == 0)
+ if (AcquireImageColormap(image,2) == MagickFalse)
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ image->filename);
+ random_info=AcquireRandomInfo();
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register ssize_t
+ x;
+
+ register IndexPacket
+ index,
+ *restrict indexes;
+
+ register PixelPacket
+ *restrict q;
+
+ q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ if (LocaleCompare(channel,"all") == 0 ||
+ LocaleCompare(channel,"intensity") == 0)
+ {
+ indexes=GetAuthenticIndexQueue(image);
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ MagickRealType
+ intensity;
+
+ intensity=(MagickRealType) PixelIntensityToQuantum(q);
+ if (order == 1)
+ {
+ if (intensity < lower_threshold)
+ threshold=lower_threshold;
+ else if (intensity > upper_threshold)
+ threshold=upper_threshold;
+ else
+ threshold=(MagickRealType) (QuantumRange*
+ GetPseudoRandomValue(random_info));
+ }
+ else if (order == 2)
+ threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
+ else if (order == 3)
+ threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
+ else if (order == 4)
+ threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)];
+ index=(IndexPacket) (intensity <= threshold ? 0 : 1);
+ SetIndexPixelComponent(indexes+x,index);
+ SetRedPixelComponent(q,image->colormap[(ssize_t) index].red);
+ SetGreenPixelComponent(q,image->colormap[(ssize_t) index].green);
+ SetBluePixelComponent(q,image->colormap[(ssize_t) index].blue);
+ q++;
+ }
+ }
+ if (LocaleCompare(channel,"opacity") == 0 ||
+ LocaleCompare(channel,"all") == 0 ||
+ LocaleCompare(channel,"matte") == 0)
+ {
+ if (image->matte != MagickFalse)
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (order == 1)
+ {
+ if ((MagickRealType) q->opacity < lower_threshold)
+ threshold=lower_threshold;
+ else if ((MagickRealType) q->opacity > upper_threshold)
+ threshold=upper_threshold;
+ else
+ threshold=(MagickRealType) (QuantumRange*
+ GetPseudoRandomValue(random_info));
+ }
+ else if (order == 2)
+ threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
+ else if (order == 3)
+ threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
+ else if (order == 4)
+ threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)]/1.7;
+ SetOpacityPixelComponent(q,(MagickRealType) q->opacity <=
+ threshold ? 0 : QuantumRange);
+ q++;
+ }
+ }
+ else
+ {
+ /* To Do: red, green, blue, cyan, magenta, yellow, black */
+ if (LocaleCompare(channel,"intensity") != 0)
+ ThrowBinaryException(OptionError,"UnrecognizedChannelType",
+ image->filename);
+ }
+ if (SyncAuthenticPixels(image,exception) == MagickFalse)
+ break;
+ }
+ random_info=DestroyRandomInfo(random_info);
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e a c q u i r e M e m o r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReacquireMemory() changes the size of the memory and returns a pointer to
+% the (possibly moved) block. The contents will be unchanged up to the
+% lesser of the new and old sizes.
+%
+% The format of the ReacquireMemory method is:
+%
+% void ReacquireMemory(void **memory,const size_t size)
+%
+% A description of each parameter follows:
+%
+% o memory: A pointer to a memory allocation. On return the pointer
+% may change but the contents of the original allocation will not.
+%
+% o size: the new size of the allocated memory.
+%
+*/
+MagickExport void ReacquireMemory(void **memory,const size_t size)
+{
+ void
+ *allocation;
+
+ assert(memory != (void **) NULL);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (*memory == (void *) NULL)
+ {
+ *memory=AcquireMagickMemory(size);
+ return;
+ }
+ allocation=realloc(*memory,size);
+ if (allocation == (void *) NULL)
+ *memory=RelinquishMagickMemory(*memory);
+ *memory=allocation;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e c o l o r I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% RecolorImage() apply color transformation to an image. The method permits
+% saturation changes, hue rotation, luminance to alpha, and various other
+% effects. Although variable-sized transformation matrices can be used,
+% typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA
+% (or RGBA with offsets). The matrix is similar to those used by Adobe Flash
+% except offsets are in column 6 rather than 5 (in support of CMYKA images)
+% and offsets are normalized (divide Flash offset by 255).
+%
+% The format of the RecolorImage method is:
+%
+% Image *RecolorImage(const Image *image,const size_t order,
+% const double *color_matrix,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o order: the number of columns and rows in the recolor matrix.
+%
+% o color_matrix: An array of double representing the recolor matrix.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *RecolorImage(const Image *image,const size_t order,
+ const double *color_matrix,ExceptionInfo *exception)
+{
+ KernelInfo
+ *kernel_info;
+
+ Image
+ *recolor_image;
+
+ kernel_info=AcquireKernelInfo("1");
+ if (kernel_info == (KernelInfo *) NULL)
+ return((Image *) NULL);
+ kernel_info->width=order;
+ kernel_info->height=order;
+ kernel_info->values=(double *) color_matrix;
+ recolor_image=ColorMatrixImage(image,kernel_info,exception);
+ kernel_info->values=(double *) NULL;
+ kernel_info=DestroyKernelInfo(kernel_info);
+ return(recolor_image);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e d u c e N o i s e I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ReduceNoiseImage() smooths the contours of an image while still preserving
+% edge information. The algorithm works by replacing each pixel with its
+% neighbor closest in value. A neighbor is defined by radius. Use a radius
+% of 0 and ReduceNoise() selects a suitable radius for you.
+%
+% The format of the ReduceNoiseImage method is:
+%
+% Image *ReduceNoiseImage(const Image *image,const double radius,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o radius: the radius of the pixel neighborhood.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *ReduceNoiseImage(const Image *image,const double radius,
+ ExceptionInfo *exception)
+{
+ Image
+ *reduce_image;
+
+ reduce_image=StatisticImage(image,NonpeakStatistic,(size_t) radius,(size_t)
+ radius,exception);
+ return(reduce_image);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% R e s e t I m a g e A t t r i b u t e I t e r a t o r %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ResetImageAttributeIterator() resets the image attributes iterator. Use it
+% in conjunction with GetNextImageAttribute() to iterate over all the values
+% associated with an image.
+%
+% Deprecated, replace with:
+%
+% ResetImagePropertyIterator(image);
+%
+% The format of the ResetImageAttributeIterator method is:
+%
+% ResetImageAttributeIterator(const ImageInfo *image)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+*/
+MagickExport void ResetImageAttributeIterator(const Image *image)
+{
+ ResetImagePropertyIterator(image);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t C a c h e V i e w P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetCacheViewPixels() gets pixels from the in-memory or disk pixel cache as
+% defined by the geometry parameters. A pointer to the pixels is returned
+% if the pixels are transferred, otherwise a NULL is returned.
+%
+% Deprecated, replace with:
+%
+% QueueCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+% GetCacheViewException(cache_view));
+%
+% The format of the SetCacheViewPixels method is:
+%
+% PixelPacket *SetCacheViewPixels(CacheView *cache_view,const ssize_t x,
+% const ssize_t y,const size_t columns,const size_t rows)
+%
+% A description of each parameter follows:
+%
+% o cache_view: the cache view.
+%
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
+%
+*/
+MagickExport PixelPacket *SetCacheViewPixels(CacheView *cache_view,const ssize_t x,
+ const ssize_t y,const size_t columns,const size_t rows)
+{
+ PixelPacket
+ *pixels;
+
+ pixels=QueueCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
+ GetCacheViewException(cache_view));
+ return(pixels);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ S e t C a c h e T h e s h o l d %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetCacheThreshold() sets the amount of free memory allocated for the pixel
+% cache. Once this threshold is exceeded, all subsequent pixels cache
+% operations are to/from disk.
+%
+% The format of the SetCacheThreshold() method is:
+%
+% void SetCacheThreshold(const size_t threshold)
+%
+% A description of each parameter follows:
+%
+% o threshold: the number of megabytes of memory available to the pixel
+% cache.
+%
+*/
+MagickExport void SetCacheThreshold(const size_t size)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
+ (void) SetMagickResourceLimit(MemoryResource,size*1024*1024);
+ (void) SetMagickResourceLimit(MapResource,2*size*1024*1024);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t E x c e p t i o n I n f o %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetExceptionInfo() sets the exception severity.
+%
+% The format of the SetExceptionInfo method is:
+%
+% MagickBooleanType SetExceptionInfo(ExceptionInfo *exception,
+% ExceptionType severity)
+%
+% A description of each parameter follows:
+%
+% o exception: the exception info.
+%
+% o severity: the exception severity.
+%
+*/
+MagickExport MagickBooleanType SetExceptionInfo(ExceptionInfo *exception,
+ ExceptionType severity)
+{
+ assert(exception != (ExceptionInfo *) NULL);
+ ClearMagickException(exception);
+ exception->severity=severity;
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetImage() sets the red, green, and blue components of each pixel to
+% the image background color and the opacity component to the specified
+% level of transparency. The background color is defined by the
+% background_color member of the image.
+%
+% The format of the SetImage method is:
+%
+% void SetImage(Image *image,const Quantum opacity)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o opacity: Set each pixel to this level of transparency.
+%
+*/
+MagickExport void SetImage(Image *image,const Quantum opacity)
+{
+ PixelPacket
+ background_color;
+
+ ssize_t
+ y;
+
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.0");
+ assert(image != (Image *) NULL);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
+ assert(image->signature == MagickSignature);
+ background_color=image->background_color;
+ if (opacity != OpaqueOpacity)
+ background_color.opacity=opacity;
+ if (background_color.opacity != OpaqueOpacity)
+ {
+ (void) SetImageStorageClass(image,DirectClass);
+ image->matte=MagickTrue;
+ }
+ if ((image->storage_class == PseudoClass) ||
+ (image->colorspace == CMYKColorspace))
+ {
+ /*
+ Set colormapped or CMYK image.
+ */
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register IndexPacket
+ *restrict indexes;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ *q++=background_color;
+ indexes=GetAuthenticIndexQueue(image);
+ for (x=0; x < (ssize_t) image->columns; x++)
+ SetIndexPixelComponent(indexes+x,0);
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ }
+ return;
+ }
+ /*
+ Set DirectClass image.
+ */
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ *q++=background_color;
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ }
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t I m a g e A t t r i b u t e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetImageAttribute() searches the list of image attributes and replaces the
+% attribute value. If it is not found in the list, the attribute name
+% and value is added to the list.
+%
+% Deprecated, replace with:
+%
+% SetImageProperty(image,key,value);
+%
+% The format of the SetImageAttribute method is:
+%
+% MagickBooleanType SetImageAttribute(Image *image,const char *key,
+% const char *value)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o key: the key.
+%
+% o value: the value.
+%
+*/
+MagickExport MagickBooleanType SetImageAttribute(Image *image,const char *key,
+ const char *value)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
+ return(SetImageProperty(image,key,value));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetImageList() inserts an image into the list at the specified position.
+%
+% The format of the SetImageList method is:
+%
+% unsigned int SetImageList(Image *images,const Image *image,
+% const ssize_t offset,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+% o image: the image.
+%
+% o offset: the position within the list.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport unsigned int SetImageList(Image **images,const Image *image,
+ const ssize_t offset,ExceptionInfo *exception)
+{
+ Image
+ *clone;
+
+ register ssize_t
+ i;
+
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ clone=CloneImageList(image,exception);
+ while (GetPreviousImageInList(*images) != (Image *) NULL)
+ (*images)=GetPreviousImageInList(*images);
+ for (i=0; i < offset; i++)
+ {
+ if (GetNextImageInList(*images) == (Image *) NULL)
+ return(MagickFalse);
+ (*images)=GetNextImageInList(*images);
+ }
+ InsertImageInList(images,clone);
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t I m a g e P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetImagePixels() queues a mutable pixel region.
+% If the region is successfully intialized a pointer to a PixelPacket
+% array representing the region is returned, otherwise NULL is returned.
+% The returned pointer may point to a temporary working buffer for the
+% pixels or it may point to the final location of the pixels in memory.
+%
+% Write-only access means that any existing pixel values corresponding to
+% the region are ignored. This useful while the initial image is being
+% created from scratch, or if the existing pixel values are to be
+% completely replaced without need to refer to their pre-existing values.
+% The application is free to read and write the pixel buffer returned by
+% SetImagePixels() any way it pleases. SetImagePixels() does not initialize
+% the pixel array values. Initializing pixel array values is the
+% application's responsibility.
+%
+% Performance is maximized if the selected region is part of one row, or
+% one or more full rows, since then there is opportunity to access the
+% pixels in-place (without a copy) if the image is in RAM, or in a
+% memory-mapped file. The returned pointer should *never* be deallocated
+% by the user.
+%
+% Pixels accessed via the returned pointer represent a simple array of type
+% PixelPacket. If the image type is CMYK or the storage class is PseudoClass,
+% call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to obtain
+% the black color component or the colormap indexes (of type IndexPacket)
+% corresponding to the region. Once the PixelPacket (and/or IndexPacket)
+% array has been updated, the changes must be saved back to the underlying
+% image using SyncAuthenticPixels() or they may be lost.
+%
+% Deprecated, replace with:
+%
+% QueueAuthenticPixels(image,x,y,columns,rows,&image->exception);
+%
+% The format of the SetImagePixels() method is:
+%
+% PixelPacket *SetImagePixels(Image *image,const ssize_t x,const ssize_t y,
+% const size_t columns,const size_t rows)
+%
+% A description of each parameter follows:
+%
+% o pixels: SetImagePixels returns a pointer to the pixels if they are
+% transferred, otherwise a NULL is returned.
+%
+% o image: the image.
+%
+% o x,y,columns,rows: These values define the perimeter of a region of
+% pixels.
+%
+*/
+MagickExport PixelPacket *SetImagePixels(Image *image,const ssize_t x,const ssize_t y,
+ const size_t columns,const size_t rows)
+{
+ return(QueueAuthenticPixels(image,x,y,columns,rows,&image->exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t M a g i c k R e g i s t r y %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetMagickRegistry() sets a blob into the registry and returns a unique ID.
+% If an error occurs, -1 is returned.
+%
+% The format of the SetMagickRegistry method is:
+%
+% ssize_t SetMagickRegistry(const RegistryType type,const void *blob,
+% const size_t length,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o type: the registry type.
+%
+% o blob: the address of a Binary Large OBject.
+%
+% o length: For a registry type of ImageRegistryType use sizeof(Image)
+% otherise the blob length in number of bytes.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport ssize_t SetMagickRegistry(const RegistryType type,const void *blob,
+ const size_t magick_unused(length),ExceptionInfo *exception)
+{
+ char
+ key[MaxTextExtent];
+
+ MagickBooleanType
+ status;
+
+ static ssize_t
+ id = 0;
+
+ (void) FormatMagickString(key,MaxTextExtent,"%.20g\n",(double) id);
+ status=SetImageRegistry(type,key,blob,exception);
+ if (status == MagickFalse)
+ return(-1);
+ return(id++);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S e t M o n i t o r H a n d l e r %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SetMonitorHandler() sets the monitor handler to the specified method
+% and returns the previous monitor handler.
+%
+% The format of the SetMonitorHandler method is:
+%
+% MonitorHandler SetMonitorHandler(MonitorHandler handler)
+%
+% A description of each parameter follows:
+%
+% o handler: Specifies a pointer to a method to handle monitors.
+%
+*/
+
+MagickExport MonitorHandler GetMonitorHandler(void)
+{
+ return(monitor_handler);
+}
+
+MagickExport MonitorHandler SetMonitorHandler(MonitorHandler handler)
+{
+ MonitorHandler
+ previous_handler;
+
+ previous_handler=monitor_handler;
+ monitor_handler=handler;
+ return(previous_handler);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S h i f t I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ShiftImageList() removes an image from the beginning of the list.
+%
+% Deprecated, replace with:
+%
+% RemoveFirstImageFromList(images);
+%
+% The format of the ShiftImageList method is:
+%
+% Image *ShiftImageList(Image **images)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+*/
+MagickExport Image *ShiftImageList(Image **images)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ return(RemoveFirstImageFromList(images));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ S i z e B l o b %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SizeBlob() returns the current length of the image file or blob.
+%
+% Deprecated, replace with:
+%
+% GetBlobSize(image);
+%
+% The format of the SizeBlob method is:
+%
+% off_t SizeBlob(Image *image)
+%
+% A description of each parameter follows:
+%
+% o size: Method SizeBlob returns the current length of the image file
+% or blob.
+%
+% o image: the image.
+%
+*/
+MagickExport MagickOffsetType SizeBlob(Image *image)
+{
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.3");
+ return((MagickOffsetType) GetBlobSize(image));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S p l i c e I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SpliceImageList() removes the images designated by offset and length from
+% the list and replaces them with the specified list.
+%
+% The format of the SpliceImageList method is:
+%
+% Image *SpliceImageList(Image *images,const ssize_t offset,
+% const size_t length,const Image *splices,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+% o offset: the position within the list.
+%
+% o length: the length of the image list to remove.
+%
+% o splice: Replace the removed image list with this list.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *SpliceImageList(Image *images,const ssize_t offset,
+ const size_t length,const Image *splices,ExceptionInfo *exception)
+{
+ Image
+ *clone;
+
+ register ssize_t
+ i;
+
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ clone=CloneImageList(splices,exception);
+ while (GetPreviousImageInList(images) != (Image *) NULL)
+ images=GetPreviousImageInList(images);
+ for (i=0; i < offset; i++)
+ {
+ if (GetNextImageInList(images) == (Image *) NULL)
+ return((Image *) NULL);
+ images=GetNextImageInList(images);
+ }
+ (void) SpliceImageIntoList(&images,length,clone);
+ return(images);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S t r i p %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Strip() strips any whitespace or quotes from the beginning and end of a
+% string of characters.
+%
+% The format of the Strip method is:
+%
+% void Strip(char *message)
+%
+% A description of each parameter follows:
+%
+% o message: Specifies an array of characters.
+%
+*/
+MagickExport void Strip(char *message)
+{
+ register char
+ *p,
+ *q;
+
+ assert(message != (char *) NULL);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (*message == '\0')
+ return;
+ if (strlen(message) == 1)
+ return;
+ p=message;
+ while (isspace((int) ((unsigned char) *p)) != 0)
+ p++;
+ if ((*p == '\'') || (*p == '"'))
+ p++;
+ q=message+strlen(message)-1;
+ while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
+ q--;
+ if (q > p)
+ if ((*q == '\'') || (*q == '"'))
+ q--;
+ (void) CopyMagickMemory(message,p,(size_t) (q-p+1));
+ message[q-p+1]='\0';
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S y n c C a c h e V i e w %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SyncCacheView() saves the cache view pixels to the in-memory or disk
+% cache. It returns MagickTrue if the pixel region is synced, otherwise
+% MagickFalse.
+%
+% Deprecated, replace with:
+%
+% SyncCacheViewAuthenticPixels(cache_view,GetCacheViewException(cache_view));
+%
+% The format of the SyncCacheView method is:
+%
+% MagickBooleanType SyncCacheView(CacheView *cache_view)
+%
+% A description of each parameter follows:
+%
+% o cache_view: the cache view.
+%
+*/
+MagickExport MagickBooleanType SyncCacheView(CacheView *cache_view)
+{
+ MagickBooleanType
+ status;
+
+ status=SyncCacheViewAuthenticPixels(cache_view,
+ GetCacheViewException(cache_view));
+ return(status);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S y n c C a c h e V i e w P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SyncCacheViewPixels() saves the cache view pixels to the in-memory
+% or disk cache. It returns MagickTrue if the pixel region is flushed,
+% otherwise MagickFalse.
+%
+% Deprecated, replace with:
+%
+% SyncCacheViewAuthenticPixels(cache_view,GetCacheViewException(cache_view));
+%
+% The format of the SyncCacheViewPixels method is:
+%
+% MagickBooleanType SyncCacheViewPixels(CacheView *cache_view)
+%
+% A description of each parameter follows:
+%
+% o cache_view: the cache view.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport MagickBooleanType SyncCacheViewPixels(CacheView *cache_view)
+{
+ MagickBooleanType
+ status;
+
+ status=SyncCacheViewAuthenticPixels(cache_view,
+ GetCacheViewException(cache_view));
+ return(status);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% S y n c I m a g e P i x e l s %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% SyncImagePixels() saves the image pixels to the in-memory or disk cache.
+% The method returns MagickTrue if the pixel region is synced, otherwise
+% MagickFalse.
+%
+% Deprecated, replace with:
+%
+% SyncAuthenticPixels(image,&image->exception);
+%
+% The format of the SyncImagePixels() method is:
+%
+% MagickBooleanType SyncImagePixels(Image *image)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+*/
+MagickExport MagickBooleanType SyncImagePixels(Image *image)
+{
+ return(SyncAuthenticPixels(image,&image->exception));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T e m p o r a r y F i l e n a m e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TemporaryFilename() replaces the contents of path by a unique path name.
+%
+% The format of the TemporaryFilename method is:
+%
+% void TemporaryFilename(char *path)
+%
+% A description of each parameter follows.
+%
+% o path: Specifies a pointer to an array of characters. The unique path
+% name is returned in this array.
+%
+*/
+MagickExport void TemporaryFilename(char *path)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
+ (void) AcquireUniqueFilename(path);
+ (void) RelinquishUniqueFileResource(path);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T h r e s h o l d I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ThresholdImage() changes the value of individual pixels based on
+% the intensity of each pixel compared to threshold. The result is a
+% high-contrast, two color image.
+%
+% The format of the ThresholdImage method is:
+%
+% unsigned int ThresholdImage(Image *image,const double threshold)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o threshold: Define the threshold value
+%
+*/
+MagickExport unsigned int ThresholdImage(Image *image,const double threshold)
+{
+#define ThresholdImageTag "Threshold/Image"
+
+ IndexPacket
+ index;
- MagickBooleanType
- status;
+ ssize_t
+ y;
+
+ /*
+ Threshold image.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
+ if (!AcquireImageColormap(image,2))
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ "UnableToThresholdImage");
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register IndexPacket
+ *restrict indexes;
+
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
- MagickOffsetType
- progress;
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ indexes=GetAuthenticIndexQueue(image);
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ index=(IndexPacket) ((MagickRealType) PixelIntensityToQuantum(q) <=
+ threshold ? 0 : 1);
+ SetIndexPixelComponent(indexes+x,index);
+ SetRedPixelComponent(q,image->colormap[(ssize_t) index].red);
+ SetGreenPixelComponent(q,image->colormap[(ssize_t) index].green);
+ SetBluePixelComponent(q,image->colormap[(ssize_t) index].blue);
+ q++;
+ }
+ if (!SyncAuthenticPixels(image,&image->exception))
+ break;
+ }
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T h r e s h o l d I m a g e C h a n n e l %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ThresholdImageChannel() changes the value of individual pixels based on
+% the intensity of each pixel channel. The result is a high-contrast image.
+%
+% The format of the ThresholdImageChannel method is:
+%
+% unsigned int ThresholdImageChannel(Image *image,const char *threshold)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o threshold: define the threshold values.
+%
+*/
+MagickExport unsigned int ThresholdImageChannel(Image *image,
+ const char *threshold)
+{
+#define ThresholdImageTag "Threshold/Image"
+
+ MagickPixelPacket
+ pixel;
+
+ GeometryInfo
+ geometry_info;
+
+ IndexPacket
+ index;
ssize_t
y;
- assert(source != (PixelView *) NULL);
- assert(source->signature == WandSignature);
- if (update == (UpdatePixelViewMethod) NULL)
- return(MagickFalse);
- source_image=source->wand->images;
- if (SetImageStorageClass(source_image,DirectClass) == MagickFalse)
+ unsigned int
+ flags;
+
+ /*
+ Threshold image.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if (threshold == (const char *) NULL)
+ return(MagickTrue);
+ if (SetImageStorageClass(image,DirectClass) == MagickFalse)
return(MagickFalse);
- status=MagickTrue;
- progress=0;
- exception=source->exception;
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp parallel for schedule(static,1) shared(progress,status)
-#endif
- for (y=source->region.y; y < (ssize_t) source->region.height; y++)
+ flags=ParseGeometry(threshold,&geometry_info);
+ pixel.red=geometry_info.rho;
+ if (flags & SigmaValue)
+ pixel.green=geometry_info.sigma;
+ else
+ pixel.green=pixel.red;
+ if (flags & XiValue)
+ pixel.blue=geometry_info.xi;
+ else
+ pixel.blue=pixel.red;
+ if (flags & PsiValue)
+ pixel.opacity=geometry_info.psi;
+ else
+ pixel.opacity=(MagickRealType) OpaqueOpacity;
+ if (flags & PercentValue)
+ {
+ pixel.red*=QuantumRange/100.0f;
+ pixel.green*=QuantumRange/100.0f;
+ pixel.blue*=QuantumRange/100.0f;
+ pixel.opacity*=QuantumRange/100.0f;
+ }
+ if (!(flags & SigmaValue))
+ {
+ if (!AcquireImageColormap(image,2))
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ "UnableToThresholdImage");
+ if (pixel.red == 0)
+ (void) GetImageDynamicThreshold(image,2.0,2.0,&pixel,&image->exception);
+ }
+ for (y=0; y < (ssize_t) image->rows; y++)
{
- const int
- id = GetOpenMPThreadId();
-
register IndexPacket
*restrict indexes;
x;
register PixelPacket
- *restrict pixels;
+ *restrict q;
- if (status == MagickFalse)
- continue;
- pixels=GetCacheViewAuthenticPixels(source->view,source->region.x,y,
- source->region.width,1,exception);
- if (pixels == (PixelPacket *) NULL)
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ indexes=GetAuthenticIndexQueue(image);
+ if (IsMagickGray(&pixel) != MagickFalse)
+ for (x=0; x < (ssize_t) image->columns; x++)
{
- InheritException(source->exception,GetCacheViewException(
- source->view));
- status=MagickFalse;
- continue;
+ index=(IndexPacket) ((MagickRealType)
+ PixelIntensityToQuantum(q) <= pixel.red ? 0 : 1);
+ SetIndexPixelComponent(indexes+x,index);
+ SetRedPixelComponent(q,image->colormap[(ssize_t) index].red);
+ SetGreenPixelComponent(q,image->colormap[(ssize_t) index].green);
+ SetBluePixelComponent(q,image->colormap[(ssize_t) index].blue);
+ q++;
}
- indexes=GetCacheViewAuthenticIndexQueue(source->view);
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetQuantumColor(source->pixel_wands[id][x],pixels+x);
- if (source_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelSetBlackQuantum(source->pixel_wands[id][x],
- GetIndexPixelComponent(indexes+x));
- if (update(source,context) == MagickFalse)
- status=MagickFalse;
- for (x=0; x < (ssize_t) source->region.width; x++)
- PixelGetQuantumColor(source->pixel_wands[id][x],pixels+x);
- if (source_image->colorspace == CMYKColorspace)
- for (x=0; x < (ssize_t) source->region.width; x++)
- SetIndexPixelComponent(indexes+x,PixelGetBlackQuantum(
- source->pixel_wands[id][x]));
- if (SyncCacheViewAuthenticPixels(source->view,exception) == MagickFalse)
+ else
+ for (x=0; x < (ssize_t) image->columns; x++)
{
- InheritException(source->exception,GetCacheViewException(source->view));
- status=MagickFalse;
+ SetRedPixelComponent(q,q->red <= pixel.red ? 0 : QuantumRange);
+ SetGreenPixelComponent(q,q->green <= pixel.green ? 0 : QuantumRange);
+ SetBluePixelComponent(q,q->blue <= pixel.blue ? 0 : QuantumRange);
+ SetOpacityPixelComponent(q,q->opacity <= pixel.opacity ? 0 :
+ QuantumRange);
+ q++;
}
- if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
- {
- MagickBooleanType
- proceed;
+ if (!SyncAuthenticPixels(image,&image->exception))
+ break;
+ }
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ T r a n s f o r m C o l o r s p a c e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TransformColorspace() converts the image to a specified colorspace.
+% If the image is already in the requested colorspace, no work is performed.
+% Note that the current colorspace is stored in the image colorspace member.
+% The transformation matrices are not necessarily the standard ones: the
+% weights are rescaled to normalize the range of the transformed values to
+% be [0..QuantumRange].
+%
+% Deprecated, replace with:
+%
+% TransformImageColorspace(image,colorspace);
+%
+% The format of the TransformColorspace method is:
+%
+% unsigned int (void) TransformColorspace(Image *image,
+% const ColorspaceType colorspace)
+%
+% A description of each parameter follows:
+%
+% o image: the image to transform
+%
+% o colorspace: the desired colorspace.
+%
+*/
+MagickExport unsigned int TransformColorspace(Image *image,
+ const ColorspaceType colorspace)
+{
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
+ return(TransformImageColorspace(image,colorspace));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T r a n s f o r m H S L %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TransformHSL() converts a (red, green, blue) to a (hue, saturation,
+% lightness) triple.
+%
+% The format of the TransformHSL method is:
+%
+% void TransformHSL(const Quantum red,const Quantum green,
+% const Quantum blue,double *hue,double *saturation,double *lightness)
+%
+% A description of each parameter follows:
+%
+% o red, green, blue: A Quantum value representing the red, green, and
+% blue component of a pixel..
+%
+% o hue, saturation, lightness: A pointer to a double value representing a
+% component of the HSL color space.
+%
+*/
-#if defined(MAGICKCORE_OPENMP_SUPPORT)
- #pragma omp critical (MagickWand_UpdatePixelViewIterator)
-#endif
- proceed=SetImageProgress(source_image,UpdatePixelViewTag,progress++,
- source->region.height);
- if (proceed == MagickFalse)
- status=MagickFalse;
- }
+static inline double MagickMin(const double x,const double y)
+{
+ if (x < y)
+ return(x);
+ return(y);
+}
+
+MagickExport void TransformHSL(const Quantum red,const Quantum green,
+ const Quantum blue,double *hue,double *saturation,double *lightness)
+{
+ MagickRealType
+ b,
+ delta,
+ g,
+ max,
+ min,
+ r;
+
+ /*
+ Convert RGB to HSL colorspace.
+ */
+ assert(hue != (double *) NULL);
+ assert(saturation != (double *) NULL);
+ assert(lightness != (double *) NULL);
+ r=QuantumScale*red;
+ g=QuantumScale*green;
+ b=QuantumScale*blue;
+ max=MagickMax(r,MagickMax(g,b));
+ min=MagickMin(r,MagickMin(g,b));
+ *hue=0.0;
+ *saturation=0.0;
+ *lightness=(double) ((min+max)/2.0);
+ delta=max-min;
+ if (delta == 0.0)
+ return;
+ *saturation=(double) (delta/((*lightness < 0.5) ? (min+max) :
+ (2.0-max-min)));
+ if (r == max)
+ *hue=(double) (g == min ? 5.0+(max-b)/delta : 1.0-(max-g)/delta);
+ else
+ if (g == max)
+ *hue=(double) (b == min ? 1.0+(max-r)/delta : 3.0-(max-b)/delta);
+ else
+ *hue=(double) (r == min ? 3.0+(max-g)/delta : 5.0-(max-r)/delta);
+ *hue/=6.0;
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T r a n s l a t e T e x t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TranslateText() replaces any embedded formatting characters with the
+% appropriate image attribute and returns the translated text.
+%
+% Deprecated, replace with:
+%
+% InterpretImageProperties(image_info,image,embed_text);
+%
+% The format of the TranslateText method is:
+%
+% char *TranslateText(const ImageInfo *image_info,Image *image,
+% const char *embed_text)
+%
+% A description of each parameter follows:
+%
+% o image_info: the image info.
+%
+% o image: the image.
+%
+% o embed_text: the address of a character string containing the embedded
+% formatting characters.
+%
+*/
+MagickExport char *TranslateText(const ImageInfo *image_info,Image *image,
+ const char *embed_text)
+{
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.6");
+ return(InterpretImageProperties(image_info,image,embed_text));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% T r a n s p a r e n t I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% TransparentImage() changes the opacity value associated with any pixel
+% that matches color to the value defined by opacity.
+%
+% By default color must match a particular pixel color exactly. However,
+% in many cases two colors may differ by a small amount. Fuzz defines
+% how much tolerance is acceptable to consider two colors as the same.
+% For example, set fuzz to 10 and the color red at intensities of 100 and
+% 102 respectively are now interpreted as the same color.
+%
+% The format of the TransparentImage method is:
+%
+% MagickBooleanType TransparentImage(Image *image,
+% const PixelPacket target,const Quantum opacity)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o target: the RGB value of the target color.
+%
+% o opacity: the replacement opacity value.
+%
+*/
+MagickExport MagickBooleanType TransparentImage(Image *image,
+ const PixelPacket target,const Quantum opacity)
+{
+#define TransparentImageTag "Transparent/Image"
+
+ MagickBooleanType
+ proceed;
+
+ ssize_t
+ y;
+
+ /*
+ Make image color transparent.
+ */
+ assert(image != (Image *) NULL);
+ assert(image->signature == MagickSignature);
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.1.0");
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ if (image->matte == MagickFalse)
+ (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
+ for (y=0; y < (ssize_t) image->rows; y++)
+ {
+ register ssize_t
+ x;
+
+ register PixelPacket
+ *restrict q;
+
+ q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
+ if (q == (PixelPacket *) NULL)
+ break;
+ for (x=0; x < (ssize_t) image->columns; x++)
+ {
+ if (IsColorSimilar(image,q,&target) != MagickFalse)
+ q->opacity=opacity;
+ q++;
+ }
+ if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
+ break;
+ proceed=SetImageProgress(image,TransparentImageTag,(MagickOffsetType) y,
+ image->rows);
+ if (proceed == MagickFalse)
+ break;
}
- return(status);
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% U n s h i f t I m a g e L i s t %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% UnshiftImageList() adds the image to the beginning of the list.
+%
+% Deprecated, replace with:
+%
+% PrependImageToList(images,CloneImageList(image,exception));
+%
+% The format of the UnshiftImageList method is:
+%
+% unsigned int UnshiftImageList(Image *images,const Image *image,
+% ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o images: the image list.
+%
+% o image: the image.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport unsigned int UnshiftImageList(Image **images,const Image *image,
+ ExceptionInfo *exception)
+{
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
+ PrependImageToList(images,CloneImageList(image,exception));
+ return(MagickTrue);
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
++ V a l i d a t e C o l o r m a p I n d e x %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ValidateColormapIndex() validates the colormap index. If the index does
+% not range from 0 to the number of colors in the colormap an exception
+% issued and 0 is returned.
+%
+% Deprecated, replace with:
+%
+% ConstrainColormapIndex(image,index);
+%
+% The format of the ValidateColormapIndex method is:
+%
+% IndexPacket ValidateColormapIndex(Image *image,const unsigned int index)
+%
+% A description of each parameter follows:
+%
+% o index: Method ValidateColormapIndex returns colormap index if it is
+% valid other an exception issued and 0 is returned.
+%
+% o image: the image.
+%
+% o index: This integer is the colormap index.
+%
+*/
+MagickExport IndexPacket ValidateColormapIndex(Image *image,
+ const size_t index)
+{
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.4");
+ return(ConstrainColormapIndex(image,index));
+}
+\f
+/*
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% %
+% %
+% Z o o m I m a g e %
+% %
+% %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% ZoomImage() creates a new image that is a scaled size of an existing one.
+% It allocates the memory necessary for the new Image structure and returns a
+% pointer to the new image. The Point filter gives fast pixel replication,
+% Triangle is equivalent to bi-linear interpolation, and Mitchel giver slower,
+% very high-quality results. See Graphic Gems III for details on this
+% algorithm.
+%
+% The filter member of the Image structure specifies which image filter to
+% use. Blur specifies the blur factor where > 1 is blurry, < 1 is sharp.
+%
+% The format of the ZoomImage method is:
+%
+% Image *ZoomImage(const Image *image,const size_t columns,
+% const size_t rows,ExceptionInfo *exception)
+%
+% A description of each parameter follows:
+%
+% o image: the image.
+%
+% o columns: An integer that specifies the number of columns in the zoom
+% image.
+%
+% o rows: An integer that specifies the number of rows in the scaled
+% image.
+%
+% o exception: return any errors or warnings in this structure.
+%
+*/
+MagickExport Image *ZoomImage(const Image *image,const size_t columns,
+ const size_t rows,ExceptionInfo *exception)
+{
+ Image
+ *zoom_image;
+
+ assert(image != (const Image *) NULL);
+ assert(image->signature == MagickSignature);
+ if (image->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(exception != (ExceptionInfo *) NULL);
+ assert(exception->signature == MagickSignature);
+ zoom_image=ResizeImage(image,columns,rows,image->filter,image->blur,
+ exception);
+ return(zoom_image);
}
#endif