2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % DDDD EEEEE PPPP RRRR EEEEE CCCC AAA TTTTT EEEEE %
7 % D D E P P R R E C A A T E %
8 % D D EEE PPPPP RRRR EEE C AAAAA T EEE %
9 % D D E P R R E C A A T E %
10 % DDDD EEEEE P R R EEEEE CCCC A A T EEEEE %
13 % MagickCore Deprecated Methods %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 #include "magick/studio.h"
44 #include "magick/property.h"
45 #include "magick/blob.h"
46 #include "magick/blob-private.h"
47 #include "magick/cache.h"
48 #include "magick/cache-view.h"
49 #include "magick/client.h"
50 #include "magick/color.h"
51 #include "magick/color-private.h"
52 #include "magick/colormap.h"
53 #include "magick/colormap-private.h"
54 #include "magick/colorspace.h"
55 #include "magick/composite.h"
56 #include "magick/composite-private.h"
57 #include "magick/constitute.h"
58 #include "magick/deprecate.h"
59 #include "magick/draw.h"
60 #include "magick/draw-private.h"
61 #include "magick/effect.h"
62 #include "magick/enhance.h"
63 #include "magick/exception.h"
64 #include "magick/exception-private.h"
65 #include "magick/fx.h"
66 #include "magick/geometry.h"
67 #include "magick/identify.h"
68 #include "magick/image.h"
69 #include "magick/image-private.h"
70 #include "magick/list.h"
71 #include "magick/log.h"
72 #include "magick/memory_.h"
73 #include "magick/magick.h"
74 #include "magick/monitor.h"
75 #include "magick/monitor-private.h"
76 #include "magick/morphology.h"
77 #include "magick/paint.h"
78 #include "magick/pixel.h"
79 #include "magick/pixel-private.h"
80 #include "magick/quantize.h"
81 #include "magick/random_.h"
82 #include "magick/resource_.h"
83 #include "magick/semaphore.h"
84 #include "magick/segment.h"
85 #include "magick/splay-tree.h"
86 #include "magick/statistic.h"
87 #include "magick/string_.h"
88 #include "magick/threshold.h"
89 #include "magick/transform.h"
90 #include "magick/utility.h"
92 #if !defined(MAGICKCORE_EXCLUDE_DEPRECATED)
97 monitor_handler = (MonitorHandler) NULL;
100 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104 % A c q u i r e C a c h e V i e w I n d e x e s %
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
110 % AcquireCacheViewIndexes() returns the indexes associated with the specified
113 % Deprecated, replace with:
115 % GetCacheViewVirtualIndexQueue(cache_view);
117 % The format of the AcquireCacheViewIndexes method is:
119 % const IndexPacket *AcquireCacheViewIndexes(const CacheView *cache_view)
121 % A description of each parameter follows:
123 % o cache_view: the cache view.
126 MagickExport const IndexPacket *AcquireCacheViewIndexes(
127 const CacheView *cache_view)
129 return(GetCacheViewVirtualIndexQueue(cache_view));
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
137 % A c q u i r e C a c h e V i e w P i x e l s %
141 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143 % AcquireCacheViewPixels() gets pixels from the in-memory or disk pixel cache
144 % as defined by the geometry parameters. A pointer to the pixels is returned
145 % if the pixels are transferred, otherwise a NULL is returned.
147 % Deprecated, replace with:
149 % GetCacheViewVirtualPixels(cache_view,x,y,columns,rows,exception);
151 % The format of the AcquireCacheViewPixels method is:
153 % const PixelPacket *AcquireCacheViewPixels(const CacheView *cache_view,
154 % const ssize_t x,const ssize_t y,const size_t columns,
155 % const size_t rows,ExceptionInfo *exception)
157 % A description of each parameter follows:
159 % o cache_view: the cache view.
161 % o x,y,columns,rows: These values define the perimeter of a region of
164 % o exception: return any errors or warnings in this structure.
167 MagickExport const PixelPacket *AcquireCacheViewPixels(
168 const CacheView *cache_view,const ssize_t x,const ssize_t y,
169 const size_t columns,const size_t rows,ExceptionInfo *exception)
171 return(GetCacheViewVirtualPixels(cache_view,x,y,columns,rows,exception));
175 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
179 % A c q u i r e I m a g e P i x e l s %
182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184 % AcquireImagePixels() returns an immutable pixel region. If the
185 % region is successfully accessed, a pointer to it is returned, otherwise
186 % NULL is returned. The returned pointer may point to a temporary working
187 % copy of the pixels or it may point to the original pixels in memory.
188 % Performance is maximized if the selected region is part of one row, or one
189 % or more full rows, since there is opportunity to access the pixels in-place
190 % (without a copy) if the image is in RAM, or in a memory-mapped file. The
191 % returned pointer should *never* be deallocated by the user.
193 % Pixels accessed via the returned pointer represent a simple array of type
194 % PixelPacket. If the image type is CMYK or the storage class is PseudoClass,
195 % call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to access
196 % the black color component or to obtain the colormap indexes (of type
197 % IndexPacket) corresponding to the region.
199 % If you plan to modify the pixels, use GetAuthenticPixels() instead.
201 % Note, the AcquireImagePixels() and GetAuthenticPixels() methods are not
202 % thread-safe. In a threaded environment, use GetCacheViewVirtualPixels() or
203 % GetCacheViewAuthenticPixels() instead.
205 % Deprecated, replace with:
207 % GetVirtualPixels(image,x,y,columns,rows,exception);
209 % The format of the AcquireImagePixels() method is:
211 % const PixelPacket *AcquireImagePixels(const Image *image,const ssize_t x,
212 % const ssize_t y,const size_t columns,const size_t rows,
213 % ExceptionInfo *exception)
215 % A description of each parameter follows:
217 % o image: the image.
219 % o x,y,columns,rows: These values define the perimeter of a region of
222 % o exception: return any errors or warnings in this structure.
225 MagickExport const PixelPacket *AcquireImagePixels(const Image *image,
226 const ssize_t x,const ssize_t y,const size_t columns,
227 const size_t rows,ExceptionInfo *exception)
229 return(GetVirtualPixels(image,x,y,columns,rows,exception));
233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
237 % A c q u i r e I n d e x e s %
241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
243 % AcquireIndexes() returns the black channel or the colormap indexes
244 % associated with the last call to QueueAuthenticPixels() or
245 % GetVirtualPixels(). NULL is returned if the black channel or colormap
246 % indexes are not available.
248 % Deprecated, replace with:
250 % GetVirtualIndexQueue(image);
252 % The format of the AcquireIndexes() method is:
254 % const IndexPacket *AcquireIndexes(const Image *image)
256 % A description of each parameter follows:
258 % o indexes: AcquireIndexes() returns the indexes associated with the last
259 % call to QueueAuthenticPixels() or GetVirtualPixels().
261 % o image: the image.
264 MagickExport const IndexPacket *AcquireIndexes(const Image *image)
266 return(GetVirtualIndexQueue(image));
270 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 % A c q u i r e M e m o r y %
278 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 % AcquireMemory() returns a pointer to a block of memory at least size bytes
281 % suitably aligned for any use.
283 % The format of the AcquireMemory method is:
285 % void *AcquireMemory(const size_t size)
287 % A description of each parameter follows:
289 % o size: the size of the memory in bytes to allocate.
292 MagickExport void *AcquireMemory(const size_t size)
298 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
299 allocation=malloc(size);
304 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
308 % A c q u i r e O n e C a c h e V i e w P i x e l %
312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
314 % AcquireOneCacheViewPixel() returns a single pixel at the specified (x,y)
315 % location. The image background color is returned if an error occurs. If
316 % you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
318 % Deprecated, replace with:
320 % GetOneCacheViewVirtualPixel(cache_view,x,y,pixel,exception);
322 % The format of the AcquireOneCacheViewPixel method is:
324 % MagickBooleanType AcquireOneCacheViewPixel(const CacheView *cache_view,
325 % const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
327 % A description of each parameter follows:
329 % o cache_view: the cache view.
331 % o x,y: These values define the offset of the pixel.
333 % o pixel: return a pixel at the specified (x,y) location.
335 % o exception: return any errors or warnings in this structure.
338 MagickExport MagickBooleanType AcquireOneCacheViewPixel(
339 const CacheView *cache_view,const ssize_t x,const ssize_t y,PixelPacket *pixel,
340 ExceptionInfo *exception)
342 return(GetOneCacheViewVirtualPixel(cache_view,x,y,pixel,exception));
346 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
350 % 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 %
354 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356 % AcquireOneCacheViewVirtualPixel() returns a single pixel at the specified
357 % (x,y) location. The image background color is returned if an error occurs.
358 % If you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead.
360 % Deprecated, replace with:
362 % GetOneCacheViewVirtualMethodPixel(cache_view,virtual_pixel_method,
363 % x,y,pixel,exception);
365 % The format of the AcquireOneCacheViewPixel method is:
367 % MagickBooleanType AcquireOneCacheViewVirtualPixel(
368 % const CacheView *cache_view,
369 % const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
370 % const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
372 % A description of each parameter follows:
374 % o cache_view: the cache view.
376 % o virtual_pixel_method: the virtual pixel method.
378 % o x,y: These values define the offset of the pixel.
380 % o pixel: return a pixel at the specified (x,y) location.
382 % o exception: return any errors or warnings in this structure.
385 MagickExport MagickBooleanType AcquireOneCacheViewVirtualPixel(
386 const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method,
387 const ssize_t x,const ssize_t y,PixelPacket *pixel,ExceptionInfo *exception)
392 status=GetOneCacheViewVirtualMethodPixel(cache_view,virtual_pixel_method,
393 x,y,pixel,exception);
398 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402 % A c q u i r e O n e M a g i c k P i x e l %
406 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
408 % AcquireOneMagickPixel() returns a single pixel at the specified (x,y)
409 % location. The image background color is returned if an error occurs. If
410 % you plan to modify the pixel, use GetOnePixel() instead.
412 % Deprecated, replace with:
414 % MagickPixelPacket pixel;
415 % GetOneVirtualMagickPixel(image,x,y,&pixel,exception);
417 % The format of the AcquireOneMagickPixel() method is:
419 % MagickPixelPacket AcquireOneMagickPixel(const Image image,const ssize_t x,
420 % const ssize_t y,ExceptionInfo exception)
422 % A description of each parameter follows:
424 % o image: the image.
426 % o x,y: These values define the location of the pixel to return.
428 % o exception: return any errors or warnings in this structure.
431 MagickExport MagickPixelPacket AcquireOneMagickPixel(const Image *image,
432 const ssize_t x,const ssize_t y,ExceptionInfo *exception)
437 (void) GetOneVirtualMagickPixel(image,x,y,&pixel,exception);
442 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
446 % A c q u i r e O n e P i x e l %
450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
452 % AcquireOnePixel() returns a single pixel at the specified (x,y) location.
453 % The image background color is returned if an error occurs. If you plan to
454 % modify the pixel, use GetOnePixel() instead.
456 % Deprecated, replace with:
459 % GetOneVirtualPixel(image,x,y,&pixel,exception);
461 % The format of the AcquireOnePixel() method is:
463 % PixelPacket AcquireOnePixel(const Image image,const ssize_t x,
464 % const ssize_t y,ExceptionInfo exception)
466 % A description of each parameter follows:
468 % o image: the image.
470 % o x,y: These values define the location of the pixel to return.
472 % o exception: return any errors or warnings in this structure.
475 MagickExport PixelPacket AcquireOnePixel(const Image *image,const ssize_t x,
476 const ssize_t y,ExceptionInfo *exception)
481 (void) GetOneVirtualPixel(image,x,y,&pixel,exception);
486 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
490 % A c q u i r e O n e V i r t u a l P i x e l %
494 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
496 % AcquireOneVirtualPixel() returns a single pixel at the specified (x,y)
497 % location as defined by specified pixel method. The image background color
498 % is returned if an error occurs. If you plan to modify the pixel, use
499 % GetOnePixel() instead.
501 % Deprecated, replace with:
504 % GetOneVirtualMethodPixel(image,virtual_pixel_method,x,y,&pixel,exception);
506 % The format of the AcquireOneVirtualPixel() method is:
508 % PixelPacket AcquireOneVirtualPixel(const Image image,
509 % const VirtualPixelMethod virtual_pixel_method,const ssize_t x,
510 % const ssize_t y,ExceptionInfo exception)
512 % A description of each parameter follows:
514 % o virtual_pixel_method: the virtual pixel method.
516 % o image: the image.
518 % o x,y: These values define the location of the pixel to return.
520 % o exception: return any errors or warnings in this structure.
523 MagickExport PixelPacket AcquireOneVirtualPixel(const Image *image,
524 const VirtualPixelMethod virtual_pixel_method,const ssize_t x,const ssize_t y,
525 ExceptionInfo *exception)
530 (void) GetOneVirtualMethodPixel(image,virtual_pixel_method,x,y,&pixel,
536 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
540 % A c q u i r e P i x e l s %
544 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
546 % AcquirePixels() returns the pixels associated with the last call to
547 % QueueAuthenticPixels() or GetVirtualPixels().
549 % Deprecated, replace with:
551 % GetVirtualPixelQueue(image);
553 % The format of the AcquirePixels() method is:
555 % const PixelPacket *AcquirePixels(const Image image)
557 % A description of each parameter follows:
559 % o image: the image.
562 MagickExport const PixelPacket *AcquirePixels(const Image *image)
564 return(GetVirtualPixelQueue(image));
568 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
572 % A f f i n i t y I m a g e %
576 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
578 % AffinityImage() replaces the colors of an image with the closest color from
581 % Deprecated, replace with:
583 % RemapImage(quantize_info,image,affinity_image);
585 % The format of the AffinityImage method is:
587 % MagickBooleanType AffinityImage(const QuantizeInfo *quantize_info,
588 % Image *image,const Image *affinity_image)
590 % A description of each parameter follows:
592 % o quantize_info: Specifies a pointer to an QuantizeInfo structure.
594 % o image: the image.
596 % o affinity_image: the reference image.
599 MagickExport MagickBooleanType AffinityImage(const QuantizeInfo *quantize_info,
600 Image *image,const Image *affinity_image)
602 return(RemapImage(quantize_info,image,affinity_image));
606 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
610 % A f f i n i t y I m a g e s %
614 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
616 % AffinityImages() replaces the colors of a sequence of images with the
617 % closest color from a reference image.
619 % Deprecated, replace with:
621 % RemapImages(quantize_info,images,affinity_image);
623 % The format of the AffinityImage method is:
625 % MagickBooleanType AffinityImages(const QuantizeInfo *quantize_info,
626 % Image *images,Image *affinity_image)
628 % A description of each parameter follows:
630 % o quantize_info: Specifies a pointer to an QuantizeInfo structure.
632 % o images: the image sequence.
634 % o affinity_image: the reference image.
637 MagickExport MagickBooleanType AffinityImages(const QuantizeInfo *quantize_info,
638 Image *images,const Image *affinity_image)
640 return(RemapImages(quantize_info,images,affinity_image));
644 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
648 % A l l o c a t e I m a g e %
652 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
654 % AllocateImage() returns a pointer to an image structure initialized to
657 % Deprecated, replace with:
659 % AcquireImage(image_info);
661 % The format of the AllocateImage method is:
663 % Image *AllocateImage(const ImageInfo *image_info)
665 % A description of each parameter follows:
667 % o image_info: Many of the image default values are set from this
668 % structure. For example, filename, compression, depth, background color,
672 MagickExport Image *AllocateImage(const ImageInfo *image_info)
674 return(AcquireImage(image_info));
678 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
682 % A l l o c a t e I m a g e C o l o r m a p %
686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
688 % AllocateImageColormap() allocates an image colormap and initializes
689 % it to a linear gray colorspace. If the image already has a colormap,
690 % it is replaced. AllocateImageColormap() returns MagickTrue if successful,
691 % otherwise MagickFalse if there is not enough memory.
693 % Deprecated, replace with:
695 % AcquireImageColormap(image,colors);
697 % The format of the AllocateImageColormap method is:
699 % MagickBooleanType AllocateImageColormap(Image *image,
700 % const size_t colors)
702 % A description of each parameter follows:
704 % o image: the image.
706 % o colors: the number of colors in the image colormap.
709 MagickExport MagickBooleanType AllocateImageColormap(Image *image,
712 return(AcquireImageColormap(image,colors));
716 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
720 % A l l o c a t e N e x t I m a g e %
724 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
726 % AllocateNextImage() initializes the next image in a sequence to
727 % default values. The next member of image points to the newly allocated
728 % image. If there is a memory shortage, next is assigned NULL.
730 % Deprecated, replace with:
732 % AcquireNextImage(image_info,image);
734 % The format of the AllocateNextImage method is:
736 % void AllocateNextImage(const ImageInfo *image_info,Image *image)
738 % A description of each parameter follows:
740 % o image_info: Many of the image default values are set from this
741 % structure. For example, filename, compression, depth, background color,
744 % o image: the image.
747 MagickExport void AllocateNextImage(const ImageInfo *image_info,Image *image)
749 AcquireNextImage(image_info,image);
753 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
757 % A l l o c a t e S t r i n g %
761 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
763 % AllocateString() allocates memory for a string and copies the source string
764 % to that memory location (and returns it).
766 % The format of the AllocateString method is:
768 % char *AllocateString(const char *source)
770 % A description of each parameter follows:
772 % o source: A character string.
775 MagickExport char *AllocateString(const char *source)
783 assert(source != (const char *) NULL);
784 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
785 length=strlen(source)+MaxTextExtent+1;
786 destination=(char *) AcquireQuantumMemory(length,sizeof(*destination));
787 if (destination == (char *) NULL)
788 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
790 if (source != (char *) NULL)
791 (void) CopyMagickString(destination,source,length);
796 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
800 % A v e r a g e I m a g e s %
804 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
806 % AverageImages() takes a set of images and averages them together. Each
807 % image in the set must have the same width and height. AverageImages()
808 % returns a single image with each corresponding pixel component of each
809 % image averaged. On failure, a NULL image is returned and exception
810 % describes the reason for the failure.
812 % Deprecated, replace with:
814 % EvaluateImages(images,MeanEvaluateOperator,exception);
816 % The format of the AverageImages method is:
818 % Image *AverageImages(Image *images,ExceptionInfo *exception)
820 % A description of each parameter follows:
822 % o image: the image sequence.
824 % o exception: return any errors or warnings in this structure.
827 MagickExport Image *AverageImages(const Image *images,ExceptionInfo *exception)
829 return(EvaluateImages(images,MeanEvaluateOperator,exception));
833 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
837 % C h a n n e l I m a g e %
841 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
843 % Extract a channel from the image. A channel is a particular color component
844 % of each pixel in the image.
846 % Deprecated, replace with:
848 % SeparateImageChannel(image,channel);
850 % The format of the ChannelImage method is:
852 % unsigned int ChannelImage(Image *image,const ChannelType channel)
854 % A description of each parameter follows:
856 % o image: the image.
858 % o channel: Identify which channel to extract: RedChannel, GreenChannel,
859 % BlueChannel, OpacityChannel, CyanChannel, MagentaChannel, YellowChannel,
863 MagickExport unsigned int ChannelImage(Image *image,const ChannelType channel)
865 return(SeparateImageChannel(image,channel));
869 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
873 % C h a n n e l T h r e s h o l d I m a g e %
877 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879 % ChannelThresholdImage() changes the value of individual pixels based on
880 % the intensity of each pixel channel. The result is a high-contrast image.
882 % The format of the ChannelThresholdImage method is:
884 % unsigned int ChannelThresholdImage(Image *image,const char *level)
886 % A description of each parameter follows:
888 % o image: the image.
890 % o level: define the threshold values.
893 MagickExport unsigned int ChannelThresholdImage(Image *image,const char *level)
905 assert(image != (Image *) NULL);
906 assert(image->signature == MagickSignature);
907 if (image->debug != MagickFalse)
908 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
909 if (image->debug != MagickFalse)
910 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
911 if (level == (char *) NULL)
913 flags=ParseGeometry(level,&geometry_info);
914 threshold.red=geometry_info.rho;
915 threshold.green=geometry_info.sigma;
916 if ((flags & SigmaValue) == 0)
917 threshold.green=threshold.red;
918 threshold.blue=geometry_info.xi;
919 if ((flags & XiValue) == 0)
920 threshold.blue=threshold.red;
921 status=BilevelImageChannel(image,RedChannel,threshold.red);
922 status|=BilevelImageChannel(image,GreenChannel,threshold.green);
923 status|=BilevelImageChannel(image,BlueChannel,threshold.blue);
928 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
932 % C l i p I m a g e P a t h %
936 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
938 % ClipPathImage() sets the image clip mask based any clipping path information
941 % Deprecated, replace with:
943 % ClipImagePath(image,pathname,inside);
945 % The format of the ClipImage method is:
947 % MagickBooleanType ClipPathImage(Image *image,const char *pathname,
948 % const MagickBooleanType inside)
950 % A description of each parameter follows:
952 % o image: the image.
954 % o pathname: name of clipping path resource. If name is preceded by #, use
955 % clipping path numbered by name.
957 % o inside: if non-zero, later operations take effect inside clipping path.
958 % Otherwise later operations take effect outside clipping path.
961 MagickExport MagickBooleanType ClipPathImage(Image *image,const char *pathname,
962 const MagickBooleanType inside)
964 return(ClipImagePath(image,pathname,inside));
968 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
972 % C l o n e I m a g e A t t r i b u t e s %
976 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
978 % CloneImageAttributes() clones one or more image attributes.
980 % Deprecated, replace with:
982 % CloneImageProperties(image,clone_image);
984 % The format of the CloneImageAttributes method is:
986 % MagickBooleanType CloneImageAttributes(Image *image,
987 % const Image *clone_image)
989 % A description of each parameter follows:
991 % o image: the image.
993 % o clone_image: the clone image.
996 MagickExport MagickBooleanType CloneImageAttributes(Image *image,
997 const Image *clone_image)
999 return(CloneImageProperties(image,clone_image));
1003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1007 % C l o n e M e m o r y %
1011 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1013 % CloneMemory() copies size bytes from memory area source to the destination.
1014 % Copying between objects that overlap will take place correctly. It returns
1017 % The format of the CloneMemory method is:
1019 % void *CloneMemory(void *destination,const void *source,
1020 % const size_t size)
1022 % A description of each parameter follows:
1024 % o destination: the destination.
1026 % o source: the source.
1028 % o size: the size of the memory in bytes to allocate.
1031 MagickExport void *CloneMemory(void *destination,const void *source,
1034 register const unsigned char
1037 register unsigned char
1043 assert(destination != (void *) NULL);
1044 assert(source != (const void *) NULL);
1045 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
1046 p=(const unsigned char *) source;
1047 q=(unsigned char *) destination;
1048 if ((p <= q) || ((p+size) >= q))
1049 return(CopyMagickMemory(destination,source,size));
1051 Overlap, copy backwards.
1055 for (i=(ssize_t) (size-1); i >= 0; i--)
1057 return(destination);
1061 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1065 % C l o s e C a c h e V i e w %
1069 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1071 % CloseCacheView() closes the specified view returned by a previous call to
1074 % Deprecated, replace with:
1076 % DestroyCacheView(view_info);
1078 % The format of the CloseCacheView method is:
1080 % CacheView *CloseCacheView(CacheView *view_info)
1082 % A description of each parameter follows:
1084 % o view_info: the address of a structure of type CacheView.
1087 MagickExport CacheView *CloseCacheView(CacheView *view_info)
1089 return(DestroyCacheView(view_info));
1093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1097 % C o l o r F l o o d f i l l I m a g e %
1101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1103 % ColorFloodfill() changes the color value of any pixel that matches
1104 % target and is an immediate neighbor. If the method FillToBorderMethod is
1105 % specified, the color value is changed for any neighbor pixel that does not
1106 % match the bordercolor member of image.
1108 % By default target must match a particular pixel color exactly.
1109 % However, in many cases two colors may differ by a small amount. The
1110 % fuzz member of image defines how much tolerance is acceptable to
1111 % consider two colors as the same. For example, set fuzz to 10 and the
1112 % color red at intensities of 100 and 102 respectively are now
1113 % interpreted as the same color for the purposes of the floodfill.
1115 % The format of the ColorFloodfillImage method is:
1117 % MagickBooleanType ColorFloodfillImage(Image *image,
1118 % const DrawInfo *draw_info,const PixelPacket target,
1119 % const ssize_t x_offset,const ssize_t y_offset,const PaintMethod method)
1121 % A description of each parameter follows:
1123 % o image: the image.
1125 % o draw_info: the draw info.
1127 % o target: the RGB value of the target color.
1129 % o x,y: the starting location of the operation.
1131 % o method: Choose either FloodfillMethod or FillToBorderMethod.
1135 #define MaxStacksize (1UL << 15)
1136 #define PushSegmentStack(up,left,right,delta) \
1138 if (s >= (segment_stack+MaxStacksize)) \
1139 ThrowBinaryException(DrawError,"SegmentStackOverflow",image->filename) \
1142 if ((((up)+(delta)) >= 0) && (((up)+(delta)) < (ssize_t) image->rows)) \
1144 s->x1=(double) (left); \
1145 s->y1=(double) (up); \
1146 s->x2=(double) (right); \
1147 s->y2=(double) (delta); \
1153 MagickExport MagickBooleanType ColorFloodfillImage(Image *image,
1154 const DrawInfo *draw_info,const PixelPacket target,const ssize_t x_offset,
1155 const ssize_t y_offset,const PaintMethod method)
1166 register SegmentInfo
1181 Check boundary conditions.
1183 assert(image != (Image *) NULL);
1184 assert(image->signature == MagickSignature);
1185 if (image->debug != MagickFalse)
1186 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1187 assert(draw_info != (DrawInfo *) NULL);
1188 assert(draw_info->signature == MagickSignature);
1189 if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
1190 return(MagickFalse);
1191 if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
1192 return(MagickFalse);
1193 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
1194 return(MagickFalse);
1195 if (image->matte == MagickFalse)
1196 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
1197 floodplane_image=CloneImage(image,image->columns,image->rows,MagickTrue,
1199 if (floodplane_image == (Image *) NULL)
1200 return(MagickFalse);
1201 (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
1203 Set floodfill color.
1205 segment_stack=(SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
1206 sizeof(*segment_stack));
1207 if (segment_stack == (SegmentInfo *) NULL)
1209 floodplane_image=DestroyImage(floodplane_image);
1210 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
1214 Push initial segment on stack.
1220 PushSegmentStack(y,x,x,1);
1221 PushSegmentStack(y+1,x,x,-1);
1222 while (s > segment_stack)
1224 register const PixelPacket
1230 register PixelPacket
1234 Pop segment off stack.
1239 offset=(ssize_t) s->y2;
1240 y=(ssize_t) s->y1+offset;
1242 Recolor neighboring pixels.
1244 p=GetVirtualPixels(image,0,y,(size_t) (x1+1),1,&image->exception);
1245 q=GetAuthenticPixels(floodplane_image,0,y,(size_t) (x1+1),1,
1247 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
1251 for (x=x1; x >= 0; x--)
1253 if (q->opacity == (Quantum) TransparentOpacity)
1255 if (method == FloodfillMethod)
1257 if (IsColorSimilar(image,p,&target) == MagickFalse)
1261 if (IsColorSimilar(image,p,&target) != MagickFalse)
1263 q->opacity=(Quantum) TransparentOpacity;
1267 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
1269 skip=x >= x1 ? MagickTrue : MagickFalse;
1270 if (skip == MagickFalse)
1274 PushSegmentStack(y,start,x1-1,-offset);
1279 if (skip == MagickFalse)
1281 if (x < (ssize_t) image->columns)
1283 p=GetVirtualPixels(image,x,y,image->columns-x,1,
1285 q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
1287 if ((p == (const PixelPacket *) NULL) ||
1288 (q == (PixelPacket *) NULL))
1290 for ( ; x < (ssize_t) image->columns; x++)
1292 if (q->opacity == (Quantum) TransparentOpacity)
1294 if (method == FloodfillMethod)
1296 if (IsColorSimilar(image,p,&target) == MagickFalse)
1300 if (IsColorSimilar(image,p,&target) != MagickFalse)
1302 q->opacity=(Quantum) TransparentOpacity;
1306 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
1309 PushSegmentStack(y,start,x-1,offset);
1311 PushSegmentStack(y,x2+1,x-1,-offset);
1317 p=GetVirtualPixels(image,x,y,(size_t) (x2-x+1),1,
1319 q=GetAuthenticPixels(floodplane_image,x,y,(size_t) (x2-x+1),1,
1321 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
1323 for ( ; x <= x2; x++)
1325 if (q->opacity == (Quantum) TransparentOpacity)
1327 if (method == FloodfillMethod)
1329 if (IsColorSimilar(image,p,&target) != MagickFalse)
1333 if (IsColorSimilar(image,p,&target) == MagickFalse)
1342 for (y=0; y < (ssize_t) image->rows; y++)
1344 register const PixelPacket
1350 register PixelPacket
1354 Tile fill color onto floodplane.
1356 p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
1358 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
1359 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
1361 for (x=0; x < (ssize_t) image->columns; x++)
1363 if (GetOpacityPixelComponent(p) != OpaqueOpacity)
1365 (void) GetFillColor(draw_info,x,y,&fill_color);
1366 MagickCompositeOver(&fill_color,(MagickRealType) fill_color.opacity,q,
1367 (MagickRealType) q->opacity,q);
1372 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
1375 segment_stack=(SegmentInfo *) RelinquishMagickMemory(segment_stack);
1376 floodplane_image=DestroyImage(floodplane_image);
1377 return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
1381 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1385 % D e l e t e I m a g e A t t r i b u t e %
1389 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1391 % DeleteImageAttribute() deletes an attribute from the image.
1393 % Deprecated, replace with:
1395 % DeleteImageProperty(image,key);
1397 % The format of the DeleteImageAttribute method is:
1399 % MagickBooleanType DeleteImageAttribute(Image *image,const char *key)
1401 % A description of each parameter follows:
1403 % o image: the image info.
1405 % o key: the image key.
1408 MagickExport MagickBooleanType DeleteImageAttribute(Image *image,
1411 return(DeleteImageProperty(image,key));
1415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1419 % D e l e t e I m a g e L i s t %
1423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1425 % DeleteImageList() deletes an image at the specified position in the list.
1427 % The format of the DeleteImageList method is:
1429 % unsigned int DeleteImageList(Image *images,const ssize_t offset)
1431 % A description of each parameter follows:
1433 % o images: the image list.
1435 % o offset: the position within the list.
1438 MagickExport unsigned int DeleteImageList(Image *images,const ssize_t offset)
1443 if (images->debug != MagickFalse)
1444 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
1445 while (GetPreviousImageInList(images) != (Image *) NULL)
1446 images=GetPreviousImageInList(images);
1447 for (i=0; i < offset; i++)
1449 if (GetNextImageInList(images) == (Image *) NULL)
1450 return(MagickFalse);
1451 images=GetNextImageInList(images);
1453 DeleteImageFromList(&images);
1458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1462 % D e l e t e M a g i c k R e g i s t r y %
1466 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1468 % DeleteMagickRegistry() deletes an entry in the registry as defined by the id.
1469 % It returns MagickTrue if the entry is deleted otherwise MagickFalse if no
1470 % entry is found in the registry that matches the id.
1472 % Deprecated, replace with:
1474 % char key[MaxTextExtent];
1475 % FormatLocaleString(key,MaxTextExtent,"%ld\n",id);
1476 % DeleteImageRegistry(key);
1478 % The format of the DeleteMagickRegistry method is:
1480 % MagickBooleanType DeleteMagickRegistry(const ssize_t id)
1482 % A description of each parameter follows:
1484 % o id: the registry id.
1487 MagickExport MagickBooleanType DeleteMagickRegistry(const ssize_t id)
1492 (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double) id);
1493 return(DeleteImageRegistry(key));
1497 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1501 + D e s t r o y C o n s t i t u t e %
1505 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1507 % DestroyConstitute() destroys the constitute component.
1509 % The format of the DestroyConstitute method is:
1511 % DestroyConstitute(void)
1514 MagickExport void DestroyConstitute(void)
1516 ConstituteComponentTerminus();
1520 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1524 + D e s t r o y M a g i c k R e g i s t r y %
1528 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1530 % DestroyMagickRegistry() deallocates memory associated the magick registry.
1532 % Deprecated, replace with:
1534 % RegistryComponentTerminus();
1536 % The format of the DestroyMagickRegistry method is:
1538 % void DestroyMagickRegistry(void)
1541 MagickExport void DestroyMagickRegistry(void)
1543 RegistryComponentTerminus();
1547 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1551 % D e s c r i b e I m a g e %
1555 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1557 % DescribeImage() describes an image by printing its attributes to the file.
1558 % Attributes include the image width, height, size, and others.
1560 % Deprecated, replace with:
1562 % IdentifyImage(image,file,verbose);
1564 % The format of the DescribeImage method is:
1566 % MagickBooleanType DescribeImage(Image *image,FILE *file,
1567 % const MagickBooleanType verbose)
1569 % A description of each parameter follows:
1571 % o image: the image.
1573 % o file: the file, typically stdout.
1575 % o verbose: A value other than zero prints more detailed information
1579 MagickExport MagickBooleanType DescribeImage(Image *image,FILE *file,
1580 const MagickBooleanType verbose)
1582 return(IdentifyImage(image,file,verbose));
1586 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1590 % D e s t r o y I m a g e A t t r i b u t e s %
1594 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1596 % DestroyImageAttributes() deallocates memory associated with the image
1599 % The format of the DestroyImageAttributes method is:
1601 % DestroyImageAttributes(Image *image)
1603 % A description of each parameter follows:
1605 % o image: the image.
1608 MagickExport void DestroyImageAttributes(Image *image)
1610 assert(image != (Image *) NULL);
1611 assert(image->signature == MagickSignature);
1612 if (image->debug != MagickFalse)
1613 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1614 if (image->attributes != (void *) NULL)
1615 image->attributes=(void *) DestroySplayTree((SplayTreeInfo *)
1620 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1624 % D e s t r o y I m a g e s %
1628 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1630 % DestroyImages() destroys an image list.
1632 % Deprecated, replace with:
1634 % DestroyImageList(image);
1636 % The format of the DestroyImages method is:
1638 % void DestroyImages(Image *image)
1640 % A description of each parameter follows:
1642 % o image: the image sequence.
1645 MagickExport void DestroyImages(Image *image)
1647 if (image == (Image *) NULL)
1649 if (image->debug != MagickFalse)
1650 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.3");
1651 image=DestroyImageList(image);
1655 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1659 % D e s t r o y M a g i c k %
1663 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1665 % DestroyMagick() destroys the ImageMagick environment.
1667 % Deprecated, replace with:
1669 % MagickCoreTerminus();
1671 % The format of the DestroyMagick function is:
1673 % DestroyMagick(void)
1676 MagickExport void DestroyMagick(void)
1678 MagickCoreTerminus();
1682 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1686 % D i s p a t c h I m a g e %
1690 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1692 % DispatchImage() extracts pixel data from an image and returns it to you.
1693 % The method returns MagickFalse on success otherwise MagickTrue if an error is
1694 % encountered. The data is returned as char, short int, int, ssize_t, float,
1695 % or double in the order specified by map.
1697 % Suppose you want to extract the first scanline of a 640x480 image as
1698 % character data in red-green-blue order:
1700 % DispatchImage(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
1702 % Deprecated, replace with:
1704 % ExportImagePixels(image,x_offset,y_offset,columns,rows,map,type,pixels,
1707 % The format of the DispatchImage method is:
1709 % unsigned int DispatchImage(const Image *image,const ssize_t x_offset,
1710 % const ssize_t y_offset,const size_t columns,
1711 % const size_t rows,const char *map,const StorageType type,
1712 % void *pixels,ExceptionInfo *exception)
1714 % A description of each parameter follows:
1716 % o image: the image.
1718 % o x_offset, y_offset, columns, rows: These values define the perimeter
1719 % of a region of pixels you want to extract.
1721 % o map: This string reflects the expected ordering of the pixel array.
1722 % It can be any combination or order of R = red, G = green, B = blue,
1723 % A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or
1724 % I = intensity (for grayscale).
1726 % o type: Define the data type of the pixels. Float and double types are
1727 % normalized to [0..1] otherwise [0..QuantumRange]. Choose from these
1728 % types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or
1731 % o pixels: This array of values contain the pixel components as defined by
1732 % map and type. You must preallocate this array where the expected
1733 % length varies depending on the values of width, height, map, and type.
1735 % o exception: return any errors or warnings in this structure.
1738 MagickExport unsigned int DispatchImage(const Image *image,const ssize_t x_offset,
1739 const ssize_t y_offset,const size_t columns,const size_t rows,
1740 const char *map,const StorageType type,void *pixels,ExceptionInfo *exception)
1745 if (image->debug != MagickFalse)
1746 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
1747 status=ExportImagePixels(image,x_offset,y_offset,columns,rows,map,type,pixels,
1753 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1757 % E x t r a c t S u b i m a g e F r o m I m a g e %
1761 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1763 % ExtractSubimageFromImageImage() extracts a region of the image that most
1764 % closely resembles the reference.
1766 % The format of the ExtractSubimageFromImageImage method is:
1768 % Image *ExtractSubimageFromImage(const Image *image,
1769 % const Image *reference,ExceptionInfo *exception)
1771 % A description of each parameter follows:
1773 % o image: the image.
1775 % o reference: find an area of the image that closely resembles this image.
1777 % o exception: return any errors or warnings in this structure.
1781 static double GetSimilarityMetric(const Image *image,const Image *reference,
1782 const ssize_t x_offset,const ssize_t y_offset,
1783 const double similarity_threshold,ExceptionInfo *exception)
1791 normalized_similarity,
1798 Compute the similarity in pixels between two images.
1800 normalized_similarity=1.0;
1803 if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
1805 if ((image->colorspace == CMYKColorspace) &&
1806 (reference->colorspace == CMYKColorspace))
1808 image_view=AcquireCacheView(image);
1809 reference_view=AcquireCacheView(reference);
1810 for (y=0; y < (ssize_t) reference->rows; y++)
1812 register const IndexPacket
1816 register const PixelPacket
1823 p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset+y,
1824 reference->columns,1,exception);
1825 q=GetCacheViewVirtualPixels(reference_view,0,y,reference->columns,1,
1827 if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL))
1829 indexes=GetCacheViewVirtualIndexQueue(image_view);
1830 reference_indexes=GetCacheViewVirtualIndexQueue(reference_view);
1831 for (x=0; x < (ssize_t) reference->columns; x++)
1836 pixel=QuantumScale*(GetRedPixelComponent(p)-(double)
1837 GetRedPixelComponent(q));
1838 similarity+=pixel*pixel;
1839 pixel=QuantumScale*(GetGreenPixelComponent(p)-(double)
1840 GetGreenPixelComponent(q));
1841 similarity+=pixel*pixel;
1842 pixel=QuantumScale*(GetBluePixelComponent(p)-(double)
1843 GetBluePixelComponent(q));
1844 similarity+=pixel*pixel;
1845 if ((image->matte != MagickFalse) && (reference->matte != MagickFalse))
1847 pixel=QuantumScale*(GetOpacityPixelComponent(p)-(double)
1848 GetOpacityPixelComponent(q));
1849 similarity+=pixel*pixel;
1851 if ((image->colorspace == CMYKColorspace) &&
1852 (reference->colorspace == CMYKColorspace))
1854 pixel=QuantumScale*(GetIndexPixelComponent(indexes+x)-(double)
1855 GetIndexPixelComponent(reference_indexes+x));
1856 similarity+=pixel*pixel;
1861 normalized_similarity=sqrt(similarity)/reference->columns/reference->rows/
1863 if (normalized_similarity > similarity_threshold)
1866 reference_view=DestroyCacheView(reference_view);
1867 image_view=DestroyCacheView(image_view);
1868 return(normalized_similarity);
1871 MagickExport Image *ExtractSubimageFromImage(Image *image,
1872 const Image *reference,ExceptionInfo *exception)
1875 similarity_threshold;
1884 Extract reference from image.
1886 if ((reference->columns > image->columns) || (reference->rows > image->rows))
1887 return((Image *) NULL);
1888 similarity_threshold=(double) image->columns*image->rows;
1889 SetGeometry(reference,&offset);
1890 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1891 #pragma omp parallel for schedule(dynamic,4)
1893 for (y=0; y < (ssize_t) (image->rows-reference->rows); y++)
1901 for (x=0; x < (ssize_t) (image->columns-reference->columns); x++)
1903 similarity=GetSimilarityMetric(image,reference,x,y,similarity_threshold,
1905 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1906 #pragma omp critical (MagickCore_ExtractSubimageFromImage)
1908 if (similarity < similarity_threshold)
1910 similarity_threshold=similarity;
1916 if (similarity_threshold > (QuantumScale*reference->fuzz/100.0))
1917 return((Image *) NULL);
1918 return(CropImage(image,&offset,exception));
1922 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1926 % F l a t t e n I m a g e %
1930 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1932 % FlattenImages() Obsolete Function: Use MergeImageLayers() instead.
1934 % Deprecated, replace with:
1936 % MergeImageLayers(image,FlattenLayer,exception);
1938 % The format of the FlattenImage method is:
1940 % Image *FlattenImage(Image *image,ExceptionInfo *exception)
1942 % A description of each parameter follows:
1944 % o image: the image sequence.
1946 % o exception: return any errors or warnings in this structure.
1949 MagickExport Image *FlattenImages(Image *image,ExceptionInfo *exception)
1951 return(MergeImageLayers(image,FlattenLayer,exception));
1955 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1959 % F o r m a t I m a g e A t t r i b u t e %
1963 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1965 % FormatImageAttribute() permits formatted key/value pairs to be saved as an
1968 % The format of the FormatImageAttribute method is:
1970 % MagickBooleanType FormatImageAttribute(Image *image,const char *key,
1971 % const char *format,...)
1973 % A description of each parameter follows.
1975 % o image: The image.
1977 % o key: The attribute key.
1979 % o format: A string describing the format to use to write the remaining
1983 MagickExport MagickBooleanType FormatImageAttribute(Image *image,
1984 const char *key,const char *format,...)
1987 value[MaxTextExtent];
1995 va_start(operands,format);
1996 n=FormatLocaleStringList(value,MaxTextExtent,format,operands);
1999 return(SetImageProperty(image,key,value));
2003 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2007 % F o r m a t M a g i c k S t r i n g %
2011 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2013 % FormatMagickString() prints formatted output of a variable argument list.
2015 % The format of the FormatMagickString method is:
2017 % ssize_t FormatMagickString(char *string,const size_t length,
2018 % const char *format,...)
2020 % A description of each parameter follows.
2022 % o string: FormatMagickString() returns the formatted string in this
2025 % o length: the maximum length of the string.
2027 % o format: A string describing the format to use to write the remaining
2032 MagickExport ssize_t FormatMagickStringList(char *string,const size_t length,
2033 const char *format,va_list operands)
2038 #if defined(MAGICKCORE_HAVE_VSNPRINTF)
2039 n=vsnprintf(string,length,format,operands);
2041 n=vsprintf(string,format,operands);
2044 string[length-1]='\0';
2045 return((ssize_t) n);
2048 MagickExport ssize_t FormatMagickString(char *string,const size_t length,
2049 const char *format,...)
2057 va_start(operands,format);
2058 n=(ssize_t) FormatMagickStringList(string,length,format,operands);
2064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2068 % F o r m a t S t r i n g %
2072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2074 % FormatString() prints formatted output of a variable argument list.
2076 % The format of the FormatString method is:
2078 % void FormatString(char *string,const char *format,...)
2080 % A description of each parameter follows.
2082 % o string: Method FormatString returns the formatted string in this
2085 % o format: A string describing the format to use to write the remaining
2090 MagickExport void FormatStringList(char *string,const char *format,
2096 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
2097 #if defined(MAGICKCORE_HAVE_VSNPRINTF)
2098 n=vsnprintf(string,MaxTextExtent,format,operands);
2100 n=vsprintf(string,format,operands);
2103 string[MaxTextExtent-1]='\0';
2106 MagickExport void FormatString(char *string,const char *format,...)
2111 va_start(operands,format);
2112 (void) FormatLocaleStringList(string,MaxTextExtent,format,operands);
2118 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2122 + F u z z y C o l o r M a t c h %
2126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2128 % FuzzyColorMatch() returns true if two pixels are identical in color.
2130 % The format of the ColorMatch method is:
2132 % void FuzzyColorMatch(const PixelPacket *p,const PixelPacket *q,
2133 % const double fuzz)
2135 % A description of each parameter follows:
2141 % o distance: Define how much tolerance is acceptable to consider
2142 % two colors as the same.
2145 MagickExport unsigned int FuzzyColorMatch(const PixelPacket *p,
2146 const PixelPacket *q,const double fuzz)
2151 register MagickRealType
2154 if ((fuzz == 0.0) && (GetRedPixelComponent(p) == GetRedPixelComponent(q)) &&
2155 (GetGreenPixelComponent(p) == GetGreenPixelComponent(q)) &&
2156 (GetBluePixelComponent(p) == GetBluePixelComponent(q)))
2158 pixel.red=GetRedPixelComponent(p)-(MagickRealType) GetRedPixelComponent(q);
2159 distance=pixel.red*pixel.red;
2160 if (distance > (fuzz*fuzz))
2161 return(MagickFalse);
2162 pixel.green=GetGreenPixelComponent(p)-(MagickRealType)
2163 GetGreenPixelComponent(q);
2164 distance+=pixel.green*pixel.green;
2165 if (distance > (fuzz*fuzz))
2166 return(MagickFalse);
2167 pixel.blue=GetBluePixelComponent(p)-(MagickRealType) GetBluePixelComponent(q);
2168 distance+=pixel.blue*pixel.blue;
2169 if (distance > (fuzz*fuzz))
2170 return(MagickFalse);
2175 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2179 + F u z z y C o l o r C o m p a r e %
2183 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2185 % FuzzyColorCompare() returns MagickTrue if the distance between two colors is
2186 % less than the specified distance in a linear three dimensional color space.
2187 % This method is used by ColorFloodFill() and other algorithms which
2188 % compare two colors.
2190 % The format of the FuzzyColorCompare method is:
2192 % void FuzzyColorCompare(const Image *image,const PixelPacket *p,
2193 % const PixelPacket *q)
2195 % A description of each parameter follows:
2197 % o image: the image.
2204 MagickExport MagickBooleanType FuzzyColorCompare(const Image *image,
2205 const PixelPacket *p,const PixelPacket *q)
2207 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.5");
2208 return(IsColorSimilar(image,p,q));
2212 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2216 + F u z z y O p a c i t y C o m p a r e %
2220 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2222 % FuzzyOpacityCompare() returns true if the distance between two opacity
2223 % values is less than the specified distance in a linear color space. This
2224 % method is used by MatteFloodFill() and other algorithms which compare
2225 % two opacity values.
2227 % Deprecated, replace with:
2229 % IsOpacitySimilar(image,p,q);
2231 % The format of the FuzzyOpacityCompare method is:
2233 % void FuzzyOpacityCompare(const Image *image,const PixelPacket *p,
2234 % const PixelPacket *q)
2236 % A description of each parameter follows:
2238 % o image: the image.
2245 MagickExport MagickBooleanType FuzzyOpacityCompare(const Image *image,
2246 const PixelPacket *p,const PixelPacket *q)
2248 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.5");
2249 return(IsOpacitySimilar(image,p,q));
2253 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2257 % G e t C o n f i g u r e B l o b %
2261 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2263 % GetConfigureBlob() returns the specified configure file as a blob.
2265 % The format of the GetConfigureBlob method is:
2267 % void *GetConfigureBlob(const char *filename,ExceptionInfo *exception)
2269 % A description of each parameter follows:
2271 % o filename: the configure file name.
2273 % o path: return the full path information of the configure file.
2275 % o length: This pointer to a size_t integer sets the initial length of the
2276 % blob. On return, it reflects the actual length of the blob.
2278 % o exception: return any errors or warnings in this structure.
2281 MagickExport void *GetConfigureBlob(const char *filename,char *path,
2282 size_t *length,ExceptionInfo *exception)
2287 assert(filename != (const char *) NULL);
2288 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",filename);
2289 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
2290 assert(path != (char *) NULL);
2291 assert(length != (size_t *) NULL);
2292 assert(exception != (ExceptionInfo *) NULL);
2294 (void) CopyMagickString(path,filename,MaxTextExtent);
2295 #if defined(MAGICKCORE_INSTALLED_SUPPORT)
2296 #if defined(MAGICKCORE_LIBRARY_PATH)
2297 if (blob == (void *) NULL)
2300 Search hard coded paths.
2302 (void) FormatLocaleString(path,MaxTextExtent,"%s%s",
2303 MAGICKCORE_LIBRARY_PATH,filename);
2304 if (IsPathAccessible(path) != MagickFalse)
2305 blob=FileToBlob(path,~0,length,exception);
2308 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && !(defined(MAGICKCORE_CONFIGURE_PATH) || defined(MAGICKCORE_SHARE_PATH))
2309 if (blob == (void *) NULL)
2315 Locate file via registry key.
2317 key_value=NTRegistryKeyLookup("ConfigurePath");
2318 if (key_value != (char *) NULL)
2320 (void) FormatLocaleString(path,MaxTextExtent,"%s%s%s",key_value,
2321 DirectorySeparator,filename);
2322 if (IsPathAccessible(path) != MagickFalse)
2323 blob=FileToBlob(path,~0,length,exception);
2328 if (blob == (void *) NULL)
2333 home=GetEnvironmentValue("MAGICK_HOME");
2334 if (home != (char *) NULL)
2339 #if !defined(MAGICKCORE_POSIX_SUPPORT)
2340 (void) FormatLocaleString(path,MaxTextExtent,"%s%s%s",home,
2341 DirectorySeparator,filename);
2343 (void) FormatLocaleString(path,MaxTextExtent,"%s/lib/%s/%s",home,
2344 MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
2346 if (IsPathAccessible(path) != MagickFalse)
2347 blob=FileToBlob(path,~0,length,exception);
2348 home=DestroyString(home);
2350 home=GetEnvironmentValue("HOME");
2351 if (home == (char *) NULL)
2352 home=GetEnvironmentValue("USERPROFILE");
2353 if (home != (char *) NULL)
2356 Search $HOME/.magick.
2358 (void) FormatLocaleString(path,MaxTextExtent,"%s%s.magick%s%s",home,
2359 DirectorySeparator,DirectorySeparator,filename);
2360 if ((IsPathAccessible(path) != MagickFalse) && (blob == (void *) NULL))
2361 blob=FileToBlob(path,~0,length,exception);
2362 home=DestroyString(home);
2365 if ((blob == (void *) NULL) && (*GetClientPath() != '\0'))
2367 #if !defined(MAGICKCORE_POSIX_SUPPORT)
2368 (void) FormatLocaleString(path,MaxTextExtent,"%s%s%s",GetClientPath(),
2369 DirectorySeparator,filename);
2372 prefix[MaxTextExtent];
2375 Search based on executable directory if directory is known.
2377 (void) CopyMagickString(prefix,GetClientPath(),
2379 ChopPathComponents(prefix,1);
2380 (void) FormatLocaleString(path,MaxTextExtent,"%s/lib/%s/%s",prefix,
2381 MAGICKCORE_LIBRARY_RELATIVE_PATH,filename);
2383 if (IsPathAccessible(path) != MagickFalse)
2384 blob=FileToBlob(path,~0,length,exception);
2387 Search current directory.
2389 if ((blob == (void *) NULL) && (IsPathAccessible(path) != MagickFalse))
2390 blob=FileToBlob(path,~0,length,exception);
2391 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
2393 Search Windows registry.
2395 if (blob == (void *) NULL)
2396 blob=NTResourceToBlob(filename);
2399 if (blob == (void *) NULL)
2400 (void) ThrowMagickException(exception,GetMagickModule(),ConfigureWarning,
2401 "UnableToOpenConfigureFile","`%s'",path);
2406 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2410 % G e t C a c h e V i e w %
2414 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2416 % GetCacheView() gets pixels from the in-memory or disk pixel cache as
2417 % defined by the geometry parameters. A pointer to the pixels is returned if
2418 % the pixels are transferred, otherwise a NULL is returned.
2420 % Deprecated, replace with:
2422 % GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2423 % GetCacheViewException(cache_view));
2425 % The format of the GetCacheView method is:
2427 % PixelPacket *GetCacheView(CacheView *cache_view,const ssize_t x,
2428 % const ssize_t y,const size_t columns,const size_t rows)
2430 % A description of each parameter follows:
2432 % o cache_view: the address of a structure of type CacheView.
2434 % o x,y,columns,rows: These values define the perimeter of a region of
2438 MagickExport PixelPacket *GetCacheView(CacheView *cache_view,const ssize_t x,
2439 const ssize_t y,const size_t columns,const size_t rows)
2444 pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2445 GetCacheViewException(cache_view));
2450 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2454 % G e t C a c h e V i e w I n d e x e s %
2458 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2460 % GetCacheViewIndexes() returns the indexes associated with the specified
2463 % Deprecated, replace with:
2465 % GetCacheViewAuthenticIndexQueue(cache_view);
2467 % The format of the GetCacheViewIndexes method is:
2469 % IndexPacket *GetCacheViewIndexes(CacheView *cache_view)
2471 % A description of each parameter follows:
2473 % o cache_view: the cache view.
2476 MagickExport IndexPacket *GetCacheViewIndexes(CacheView *cache_view)
2478 return(GetCacheViewAuthenticIndexQueue(cache_view));
2482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2486 % G e t C a c h e V i e w P i x e l s %
2490 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2492 % GetCacheViewPixels() gets pixels from the in-memory or disk pixel cache as
2493 % defined by the geometry parameters. A pointer to the pixels is returned if
2494 % the pixels are transferred, otherwise a NULL is returned.
2496 % Deprecated, replace with:
2498 % GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2499 % GetCacheViewException(cache_view));
2501 % The format of the GetCacheViewPixels method is:
2503 % PixelPacket *GetCacheViewPixels(CacheView *cache_view,const ssize_t x,
2504 % const ssize_t y,const size_t columns,const size_t rows)
2506 % A description of each parameter follows:
2508 % o cache_view: the cache view.
2510 % o x,y,columns,rows: These values define the perimeter of a region of
2514 MagickExport PixelPacket *GetCacheViewPixels(CacheView *cache_view,const ssize_t x,
2515 const ssize_t y,const size_t columns,const size_t rows)
2520 pixels=GetCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
2521 GetCacheViewException(cache_view));
2526 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2530 % G e t I m a g e A t t r i b u t e %
2534 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2536 % GetImageAttribute() searches the list of image attributes and returns
2537 % a pointer to the attribute if it exists otherwise NULL.
2539 % The format of the GetImageAttribute method is:
2541 % const ImageAttribute *GetImageAttribute(const Image *image,
2544 % A description of each parameter follows:
2546 % o image: the image.
2548 % o key: These character strings are the name of an image attribute to
2553 static void *DestroyAttribute(void *attribute)
2555 register ImageAttribute
2558 p=(ImageAttribute *) attribute;
2559 if (p->value != (char *) NULL)
2560 p->value=DestroyString(p->value);
2561 return(RelinquishMagickMemory(p));
2564 MagickExport const ImageAttribute *GetImageAttribute(const Image *image,
2573 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
2574 value=GetImageProperty(image,key);
2575 if (value == (const char *) NULL)
2576 return((const ImageAttribute *) NULL);
2577 if (image->attributes == (void *) NULL)
2578 ((Image *) image)->attributes=NewSplayTree(CompareSplayTreeString,
2579 RelinquishMagickMemory,DestroyAttribute);
2582 const ImageAttribute
2585 attribute=(const ImageAttribute *) GetValueFromSplayTree((SplayTreeInfo *)
2586 image->attributes,key);
2587 if (attribute != (const ImageAttribute *) NULL)
2590 attribute=(ImageAttribute *) AcquireMagickMemory(sizeof(*attribute));
2591 if (attribute == (ImageAttribute *) NULL)
2592 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2593 (void) ResetMagickMemory(attribute,0,sizeof(*attribute));
2594 attribute->key=ConstantString(key);
2595 attribute->value=ConstantString(value);
2596 (void) AddValueToSplayTree((SplayTreeInfo *) ((Image *) image)->attributes,
2597 attribute->key,attribute);
2598 return((const ImageAttribute *) attribute);
2602 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2606 % 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 %
2610 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2612 % GetImageClippingPathAttribute() searches the list of image attributes and
2613 % returns a pointer to a clipping path if it exists otherwise NULL.
2615 % Deprecated, replace with:
2617 % GetImageAttribute(image,"8BIM:1999,2998");
2619 % The format of the GetImageClippingPathAttribute method is:
2621 % const ImageAttribute *GetImageClippingPathAttribute(Image *image)
2623 % A description of each parameter follows:
2625 % o attribute: Method GetImageClippingPathAttribute returns the clipping
2626 % path if it exists otherwise NULL.
2628 % o image: the image.
2631 MagickExport const ImageAttribute *GetImageClippingPathAttribute(Image *image)
2633 return(GetImageAttribute(image,"8BIM:1999,2998"));
2637 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2641 % 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 %
2645 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2647 % GetImageFromMagickRegistry() gets an image from the registry as defined by
2648 % its name. If the image is not found, a NULL image is returned.
2650 % Deprecated, replace with:
2652 % GetImageRegistry(ImageRegistryType,name,exception);
2654 % The format of the GetImageFromMagickRegistry method is:
2656 % Image *GetImageFromMagickRegistry(const char *name,ssize_t *id,
2657 % ExceptionInfo *exception)
2659 % A description of each parameter follows:
2661 % o name: the name of the image to retrieve from the registry.
2663 % o id: the registry id.
2665 % o exception: return any errors or warnings in this structure.
2668 MagickExport Image *GetImageFromMagickRegistry(const char *name,ssize_t *id,
2669 ExceptionInfo *exception)
2672 return((Image *) GetImageRegistry(ImageRegistryType,name,exception));
2676 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2680 % G e t M a g i c k R e g i s t r y %
2684 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2686 % GetMagickRegistry() gets a blob from the registry as defined by the id. If
2687 % the blob that matches the id is not found, NULL is returned.
2689 % The format of the GetMagickRegistry method is:
2691 % const void *GetMagickRegistry(const ssize_t id,RegistryType *type,
2692 % size_t *length,ExceptionInfo *exception)
2694 % A description of each parameter follows:
2696 % o id: the registry id.
2698 % o type: the registry type.
2700 % o length: the blob length in number of bytes.
2702 % o exception: return any errors or warnings in this structure.
2705 MagickExport void *GetMagickRegistry(const ssize_t id,RegistryType *type,
2706 size_t *length,ExceptionInfo *exception)
2714 *type=UndefinedRegistryType;
2716 (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double) id);
2717 blob=(void *) GetImageRegistry(ImageRegistryType,key,exception);
2718 if (blob != (void *) NULL)
2720 blob=(void *) GetImageRegistry(ImageInfoRegistryType,key,exception);
2721 if (blob != (void *) NULL)
2723 return((void *) GetImageRegistry(UndefinedRegistryType,key,exception));
2727 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2731 % G e t I m a g e G e o m e t r y %
2735 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2737 % GetImageGeometry() returns a region as defined by the geometry string with
2738 % respect to the image and its gravity.
2740 % Deprecated, replace with:
2742 % if (size_to_fit != MagickFalse)
2743 % ParseRegionGeometry(image,geometry,region_info,&image->exception); else
2744 % ParsePageGeometry(image,geometry,region_info,&image->exception);
2746 % The format of the GetImageGeometry method is:
2748 % int GetImageGeometry(Image *image,const char *geometry,
2749 % const unsigned int size_to_fit,RectangeInfo *region_info)
2751 % A description of each parameter follows:
2753 % o flags: Method GetImageGeometry returns a bitmask that indicates
2754 % which of the four values were located in the geometry string.
2756 % o geometry: The geometry (e.g. 100x100+10+10).
2758 % o size_to_fit: A value other than 0 means to scale the region so it
2759 % fits within the specified width and height.
2761 % o region_info: the region as defined by the geometry string with
2762 % respect to the image and its gravity.
2765 MagickExport int GetImageGeometry(Image *image,const char *geometry,
2766 const unsigned int size_to_fit,RectangleInfo *region_info)
2768 if (image->debug != MagickFalse)
2769 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.4");
2770 if (size_to_fit != MagickFalse)
2771 return((int) ParseRegionGeometry(image,geometry,region_info,&image->exception));
2772 return((int) ParsePageGeometry(image,geometry,region_info,&image->exception));
2776 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2780 % G e t I m a g e L i s t %
2784 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2786 % GetImageList() returns an image at the specified position in the list.
2788 % Deprecated, replace with:
2790 % CloneImage(GetImageFromList(images,(ssize_t) offset),0,0,MagickTrue,
2793 % The format of the GetImageList method is:
2795 % Image *GetImageList(const Image *images,const ssize_t offset,
2796 % ExceptionInfo *exception)
2798 % A description of each parameter follows:
2800 % o images: the image list.
2802 % o offset: the position within the list.
2804 % o exception: return any errors or warnings in this structure.
2807 MagickExport Image *GetImageList(const Image *images,const ssize_t offset,
2808 ExceptionInfo *exception)
2813 if (images->debug != MagickFalse)
2814 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
2815 image=CloneImage(GetImageFromList(images,(ssize_t) offset),0,0,MagickTrue,
2821 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2825 % G e t I m a g e L i s t I n d e x %
2829 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2831 % GetImageListIndex() returns the position in the list of the specified
2834 % Deprecated, replace with:
2836 % GetImageIndexInList(images);
2838 % The format of the GetImageListIndex method is:
2840 % ssize_t GetImageListIndex(const Image *images)
2842 % A description of each parameter follows:
2844 % o images: the image list.
2847 MagickExport ssize_t GetImageListIndex(const Image *images)
2849 if (images->debug != MagickFalse)
2850 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
2851 return(GetImageIndexInList(images));
2855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2859 % G e t I m a g e L i s t S i z e %
2863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2865 % GetImageListSize() returns the number of images in the list.
2867 % Deprecated, replace with:
2869 % GetImageListLength(images);
2871 % The format of the GetImageListSize method is:
2873 % size_t GetImageListSize(const Image *images)
2875 % A description of each parameter follows:
2877 % o images: the image list.
2880 MagickExport size_t GetImageListSize(const Image *images)
2882 if (images->debug != MagickFalse)
2883 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
2884 return(GetImageListLength(images));
2888 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2892 % G e t I m a g e P i x e l s %
2896 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2898 % GetImagePixels() obtains a pixel region for read/write access. If the
2899 % region is successfully accessed, a pointer to a PixelPacket array
2900 % representing the region is returned, otherwise NULL is returned.
2902 % The returned pointer may point to a temporary working copy of the pixels
2903 % or it may point to the original pixels in memory. Performance is maximized
2904 % if the selected region is part of one row, or one or more full rows, since
2905 % then there is opportunity to access the pixels in-place (without a copy)
2906 % if the image is in RAM, or in a memory-mapped file. The returned pointer
2907 % should *never* be deallocated by the user.
2909 % Pixels accessed via the returned pointer represent a simple array of type
2910 % PixelPacket. If the image type is CMYK or if the storage class is
2911 % PseduoClass, call GetAuthenticIndexQueue() after invoking GetImagePixels()
2912 % to obtain the black color component or colormap indexes (of type IndexPacket)
2913 % corresponding to the region. Once the PixelPacket (and/or IndexPacket)
2914 % array has been updated, the changes must be saved back to the underlying
2915 % image using SyncAuthenticPixels() or they may be lost.
2917 % Deprecated, replace with:
2919 % GetAuthenticPixels(image,x,y,columns,rows,&image->exception);
2921 % The format of the GetImagePixels() method is:
2923 % PixelPacket *GetImagePixels(Image *image,const ssize_t x,const ssize_t y,
2924 % const size_t columns,const size_t rows)
2926 % A description of each parameter follows:
2928 % o image: the image.
2930 % o x,y,columns,rows: These values define the perimeter of a region of
2934 MagickExport PixelPacket *GetImagePixels(Image *image,const ssize_t x,const ssize_t y,
2935 const size_t columns,const size_t rows)
2937 return(GetAuthenticPixels(image,x,y,columns,rows,&image->exception));
2941 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2945 % G e t I n d e x e s %
2949 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2951 % GetIndexes() returns the black channel or the colormap indexes associated
2952 % with the last call to QueueAuthenticPixels() or GetVirtualPixels(). NULL is
2953 % returned if the black channel or colormap indexes are not available.
2955 % Deprecated, replace with:
2957 % GetAuthenticIndexQueue(image);
2959 % The format of the GetIndexes() method is:
2961 % IndexPacket *GetIndexes(const Image *image)
2963 % A description of each parameter follows:
2965 % o indexes: GetIndexes() returns the indexes associated with the last
2966 % call to QueueAuthenticPixels() or GetAuthenticPixels().
2968 % o image: the image.
2971 MagickExport IndexPacket *GetIndexes(const Image *image)
2973 return(GetAuthenticIndexQueue(image));
2977 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2981 + G e t M a g i c k G e o m e t r y %
2985 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2987 % GetMagickGeometry() is similar to GetGeometry() except the returned
2988 % geometry is modified as determined by the meta characters: %, !, <, >,
2991 % Deprecated, replace with:
2993 % ParseMetaGeometry(geometry,x,y,width,height);
2995 % The format of the GetMagickGeometry method is:
2997 % unsigned int GetMagickGeometry(const char *geometry,ssize_t *x,ssize_t *y,
2998 % size_t *width,size_t *height)
3000 % A description of each parameter follows:
3002 % o geometry: Specifies a character string representing the geometry
3005 % o x,y: A pointer to an integer. The x and y offset as determined by
3006 % the geometry specification is returned here.
3008 % o width,height: A pointer to an unsigned integer. The width and height
3009 % as determined by the geometry specification is returned here.
3012 MagickExport unsigned int GetMagickGeometry(const char *geometry,ssize_t *x,
3013 ssize_t *y,size_t *width,size_t *height)
3015 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.3");
3016 return(ParseMetaGeometry(geometry,x,y,width,height));
3020 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3024 % G e t N e x t I m a g e %
3028 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3030 % GetNextImage() returns the next image in a list.
3032 % Deprecated, replace with:
3034 % GetNextImageInList(images);
3036 % The format of the GetNextImage method is:
3038 % Image *GetNextImage(const Image *images)
3040 % A description of each parameter follows:
3042 % o images: the image list.
3045 MagickExport Image *GetNextImage(const Image *images)
3047 if (images->debug != MagickFalse)
3048 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
3049 return(GetNextImageInList(images));
3053 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3057 % G e t N e x t I m a g e A t t r i b u t e %
3061 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3063 % GetNextImageAttribute() gets the next image attribute.
3065 % Deprecated, replace with:
3067 % const char *property;
3068 % property=GetNextImageProperty(image);
3069 % if (property != (const char *) NULL)
3070 % GetImageAttribute(image,property);
3072 % The format of the GetNextImageAttribute method is:
3074 % const ImageAttribute *GetNextImageAttribute(const Image *image)
3076 % A description of each parameter follows:
3078 % o image: the image.
3081 MagickExport const ImageAttribute *GetNextImageAttribute(const Image *image)
3086 property=GetNextImageProperty(image);
3087 if (property == (const char *) NULL)
3088 return((const ImageAttribute *) NULL);
3089 return(GetImageAttribute(image,property));
3093 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3097 % G e t N u m b e r S c e n e s %
3101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3103 % GetNumberScenes() returns the number of images in the list.
3105 % Deprecated, replace with:
3107 % GetImageListLength(image);
3109 % The format of the GetNumberScenes method is:
3111 % unsigned int GetNumberScenes(const Image *images)
3113 % A description of each parameter follows:
3115 % o images: the image list.
3118 MagickExport unsigned int GetNumberScenes(const Image *image)
3120 if (image->debug != MagickFalse)
3121 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
3122 return((unsigned int) GetImageListLength(image));
3126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3130 % G e t O n e P i x e l %
3134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3136 % GetOnePixel() returns a single pixel at the specified (x,y) location.
3137 % The image background color is returned if an error occurs.
3139 % Deprecated, replace with:
3141 % GetOneAuthenticPixel(image,x,y,&pixel,&image->exception);
3143 % The format of the GetOnePixel() method is:
3145 % PixelPacket GetOnePixel(const Image image,const ssize_t x,const ssize_t y)
3147 % A description of each parameter follows:
3149 % o image: the image.
3151 % o x,y: These values define the location of the pixel to return.
3154 MagickExport PixelPacket GetOnePixel(Image *image,const ssize_t x,const ssize_t y)
3159 (void) GetOneAuthenticPixel(image,x,y,&pixel,&image->exception);
3164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3168 % G e t P i x e l s %
3172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3174 % GetPixels() returns the pixels associated with the last call to
3175 % QueueAuthenticPixels() or GetAuthenticPixels().
3177 % Deprecated, replace with:
3179 % GetAuthenticPixelQueue(image);
3181 % The format of the GetPixels() method is:
3183 % PixelPacket *GetPixels(const Image image)
3185 % A description of each parameter follows:
3187 % o pixels: GetPixels() returns the pixels associated with the last call
3188 % to QueueAuthenticPixels() or GetAuthenticPixels().
3190 % o image: the image.
3193 MagickExport PixelPacket *GetPixels(const Image *image)
3195 return(GetAuthenticPixelQueue(image));
3199 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3203 % G e t P r e v i o u s I m a g e %
3207 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3209 % GetPreviousImage() returns the previous image in a list.
3211 % Deprecated, replace with:
3213 % GetPreviousImageInList(images));
3215 % The format of the GetPreviousImage method is:
3217 % Image *GetPreviousImage(const Image *images)
3219 % A description of each parameter follows:
3221 % o images: the image list.
3224 MagickExport Image *GetPreviousImage(const Image *images)
3226 if (images->debug != MagickFalse)
3227 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
3228 return(GetPreviousImageInList(images));
3232 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3236 % H S L T r a n s f o r m %
3240 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3242 % HSLTransform() converts a (hue, saturation, lightness) to a (red, green,
3245 % The format of the HSLTransformImage method is:
3247 % void HSLTransform(const double hue,const double saturation,
3248 % const double lightness,Quantum *red,Quantum *green,Quantum *blue)
3250 % A description of each parameter follows:
3252 % o hue, saturation, lightness: A double value representing a
3253 % component of the HSL color space.
3255 % o red, green, blue: A pointer to a pixel component of type Quantum.
3259 static inline MagickRealType HueToRGB(MagickRealType m1,MagickRealType m2,
3266 if ((6.0*hue) < 1.0)
3267 return(m1+6.0*(m2-m1)*hue);
3268 if ((2.0*hue) < 1.0)
3270 if ((3.0*hue) < 2.0)
3271 return(m1+6.0*(m2-m1)*(2.0/3.0-hue));
3275 MagickExport void HSLTransform(const double hue,const double saturation,
3276 const double lightness,Quantum *red,Quantum *green,Quantum *blue)
3286 Convert HSL to RGB colorspace.
3288 assert(red != (Quantum *) NULL);
3289 assert(green != (Quantum *) NULL);
3290 assert(blue != (Quantum *) NULL);
3291 if (lightness <= 0.5)
3292 m2=lightness*(saturation+1.0);
3294 m2=lightness+saturation-lightness*saturation;
3295 m1=2.0*lightness-m2;
3296 r=HueToRGB(m1,m2,hue+1.0/3.0);
3297 g=HueToRGB(m1,m2,hue);
3298 b=HueToRGB(m1,m2,hue-1.0/3.0);
3299 *red=ClampToQuantum((MagickRealType) QuantumRange*r);
3300 *green=ClampToQuantum((MagickRealType) QuantumRange*g);
3301 *blue=ClampToQuantum((MagickRealType) QuantumRange*b);
3305 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3309 % I d e n t i t y A f f i n e %
3313 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3315 % IdentityAffine() initializes the affine transform to the identity matrix.
3317 % The format of the IdentityAffine method is:
3319 % IdentityAffine(AffineMatrix *affine)
3321 % A description of each parameter follows:
3323 % o affine: A pointer the affine transform of type AffineMatrix.
3326 MagickExport void IdentityAffine(AffineMatrix *affine)
3328 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3329 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
3330 assert(affine != (AffineMatrix *) NULL);
3331 (void) ResetMagickMemory(affine,0,sizeof(AffineMatrix));
3337 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3341 % I n i t i a l i z e M a g i c k %
3345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3347 % InitializeMagick() initializes the ImageMagick environment.
3349 % Deprecated, replace with:
3351 % MagickCoreGenesis(path,MagickFalse);
3353 % The format of the InitializeMagick function is:
3355 % InitializeMagick(const char *path)
3357 % A description of each parameter follows:
3359 % o path: the execution path of the current ImageMagick client.
3362 MagickExport void InitializeMagick(const char *path)
3364 MagickCoreGenesis(path,MagickFalse);
3368 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3372 % I n t e r p o l a t e P i x e l C o l o r %
3376 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3378 % InterpolatePixelColor() applies bi-linear or tri-linear interpolation
3379 % between a pixel and it's neighbors.
3381 % The format of the InterpolatePixelColor method is:
3383 % MagickPixelPacket InterpolatePixelColor(const Image *image,
3384 % CacheView *view_info,InterpolatePixelMethod method,const double x,
3385 % const double y,ExceptionInfo *exception)
3387 % A description of each parameter follows:
3389 % o image: the image.
3391 % o image_view: the image cache view.
3393 % o type: the type of pixel color interpolation.
3395 % o x,y: A double representing the current (x,y) position of the pixel.
3397 % o exception: return any errors or warnings in this structure.
3401 static inline double MagickMax(const double x,const double y)
3408 static void BicubicInterpolate(const MagickPixelPacket *pixels,const double dx,
3409 MagickPixelPacket *pixel)
3419 p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
3420 q=(pixels[0].red-pixels[1].red)-p;
3421 r=pixels[2].red-pixels[0].red;
3423 pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3424 p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
3425 q=(pixels[0].green-pixels[1].green)-p;
3426 r=pixels[2].green-pixels[0].green;
3428 pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3429 p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
3430 q=(pixels[0].blue-pixels[1].blue)-p;
3431 r=pixels[2].blue-pixels[0].blue;
3433 pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3434 p=(pixels[3].opacity-pixels[2].opacity)-(pixels[0].opacity-pixels[1].opacity);
3435 q=(pixels[0].opacity-pixels[1].opacity)-p;
3436 r=pixels[2].opacity-pixels[0].opacity;
3437 s=pixels[1].opacity;
3438 pixel->opacity=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3439 if (pixel->colorspace == CMYKColorspace)
3441 p=(pixels[3].index-pixels[2].index)-(pixels[0].index-pixels[1].index);
3442 q=(pixels[0].index-pixels[1].index)-p;
3443 r=pixels[2].index-pixels[0].index;
3445 pixel->index=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
3449 static inline MagickRealType CubicWeightingFunction(const MagickRealType x)
3455 alpha=MagickMax(x+2.0,0.0);
3456 gamma=1.0*alpha*alpha*alpha;
3457 alpha=MagickMax(x+1.0,0.0);
3458 gamma-=4.0*alpha*alpha*alpha;
3459 alpha=MagickMax(x+0.0,0.0);
3460 gamma+=6.0*alpha*alpha*alpha;
3461 alpha=MagickMax(x-1.0,0.0);
3462 gamma-=4.0*alpha*alpha*alpha;
3466 static inline double MeshInterpolate(const PointInfo *delta,const double p,
3467 const double x,const double y)
3469 return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
3472 static inline ssize_t NearestNeighbor(MagickRealType x)
3475 return((ssize_t) (x+0.5));
3476 return((ssize_t) (x-0.5));
3479 MagickExport MagickPixelPacket InterpolatePixelColor(const Image *image,
3480 CacheView *image_view,const InterpolatePixelMethod method,const double x,
3481 const double y,ExceptionInfo *exception)
3486 register const IndexPacket
3489 register const PixelPacket
3495 assert(image != (Image *) NULL);
3496 assert(image->signature == MagickSignature);
3497 assert(image_view != (CacheView *) NULL);
3498 GetMagickPixelPacket(image,&pixel);
3501 case AverageInterpolatePixel:
3510 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
3511 floor(y)-1,4,4,exception);
3512 if (p == (const PixelPacket *) NULL)
3514 indexes=GetCacheViewVirtualIndexQueue(image_view);
3515 for (i=0; i < 16L; i++)
3517 GetMagickPixelPacket(image,pixels+i);
3518 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
3520 if (image->matte != MagickFalse)
3522 alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
3523 pixels[i].red*=alpha[i];
3524 pixels[i].green*=alpha[i];
3525 pixels[i].blue*=alpha[i];
3526 if (image->colorspace == CMYKColorspace)
3527 pixels[i].index*=alpha[i];
3530 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3531 pixel.red+=gamma*0.0625*pixels[i].red;
3532 pixel.green+=gamma*0.0625*pixels[i].green;
3533 pixel.blue+=gamma*0.0625*pixels[i].blue;
3534 pixel.opacity+=0.0625*pixels[i].opacity;
3535 if (image->colorspace == CMYKColorspace)
3536 pixel.index+=gamma*0.0625*pixels[i].index;
3541 case BicubicInterpolatePixel:
3553 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
3554 floor(y)-1,4,4,exception);
3555 if (p == (const PixelPacket *) NULL)
3557 indexes=GetCacheViewVirtualIndexQueue(image_view);
3558 for (i=0; i < 16L; i++)
3560 GetMagickPixelPacket(image,pixels+i);
3561 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
3563 if (image->matte != MagickFalse)
3565 alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
3566 pixels[i].red*=alpha[i];
3567 pixels[i].green*=alpha[i];
3568 pixels[i].blue*=alpha[i];
3569 if (image->colorspace == CMYKColorspace)
3570 pixels[i].index*=alpha[i];
3575 for (i=0; i < 4L; i++)
3576 BicubicInterpolate(pixels+4*i,delta.x,u+i);
3578 BicubicInterpolate(u,delta.y,&pixel);
3581 case BilinearInterpolatePixel:
3594 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
3595 floor(y),2,2,exception);
3596 if (p == (const PixelPacket *) NULL)
3598 indexes=GetCacheViewVirtualIndexQueue(image_view);
3599 for (i=0; i < 4L; i++)
3601 GetMagickPixelPacket(image,pixels+i);
3602 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
3604 if (image->matte != MagickFalse)
3606 alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
3607 pixels[i].red*=alpha[i];
3608 pixels[i].green*=alpha[i];
3609 pixels[i].blue*=alpha[i];
3610 if (image->colorspace == CMYKColorspace)
3611 pixels[i].index*=alpha[i];
3617 gamma=(((1.0-delta.y)*((1.0-delta.x)*alpha[0]+delta.x*alpha[1])+delta.y*
3618 ((1.0-delta.x)*alpha[2]+delta.x*alpha[3])));
3619 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3620 pixel.red=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].red+delta.x*
3621 pixels[1].red)+delta.y*((1.0-delta.x)*pixels[2].red+delta.x*
3623 pixel.green=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].green+delta.x*
3624 pixels[1].green)+delta.y*((1.0-delta.x)*pixels[2].green+
3625 delta.x*pixels[3].green));
3626 pixel.blue=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].blue+delta.x*
3627 pixels[1].blue)+delta.y*((1.0-delta.x)*pixels[2].blue+delta.x*
3629 pixel.opacity=((1.0-delta.y)*((1.0-delta.x)*pixels[0].opacity+delta.x*
3630 pixels[1].opacity)+delta.y*((1.0-delta.x)*pixels[2].opacity+delta.x*
3631 pixels[3].opacity));
3632 if (image->colorspace == CMYKColorspace)
3633 pixel.index=gamma*((1.0-delta.y)*((1.0-delta.x)*pixels[0].index+delta.x*
3634 pixels[1].index)+delta.y*((1.0-delta.x)*pixels[2].index+delta.x*
3638 case FilterInterpolatePixel:
3652 geometry.x=(ssize_t) floor(x)-1L;
3653 geometry.y=(ssize_t) floor(y)-1L;
3654 excerpt_image=ExcerptImage(image,&geometry,exception);
3655 if (excerpt_image == (Image *) NULL)
3657 filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
3659 excerpt_image=DestroyImage(excerpt_image);
3660 if (filter_image == (Image *) NULL)
3662 p=GetVirtualPixels(filter_image,0,0,1,1,exception);
3663 if (p == (const PixelPacket *) NULL)
3665 filter_image=DestroyImage(filter_image);
3668 indexes=GetVirtualIndexQueue(filter_image);
3669 GetMagickPixelPacket(image,pixels);
3670 SetMagickPixelPacket(image,p,indexes,&pixel);
3671 filter_image=DestroyImage(filter_image);
3674 case IntegerInterpolatePixel:
3679 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
3680 floor(y),1,1,exception);
3681 if (p == (const PixelPacket *) NULL)
3683 indexes=GetCacheViewVirtualIndexQueue(image_view);
3684 GetMagickPixelPacket(image,pixels);
3685 SetMagickPixelPacket(image,p,indexes,&pixel);
3688 case MeshInterpolatePixel:
3701 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x),(ssize_t)
3702 floor(y),2,2,exception);
3703 if (p == (const PixelPacket *) NULL)
3705 indexes=GetCacheViewVirtualIndexQueue(image_view);
3706 for (i=0; i < 4L; i++)
3708 GetMagickPixelPacket(image,pixels+i);
3709 SetMagickPixelPacket(image,p,indexes+i,pixels+i);
3711 if (image->matte != MagickFalse)
3713 alpha[i]=QuantumScale*((MagickRealType) GetAlphaPixelComponent(p));
3714 pixels[i].red*=alpha[i];
3715 pixels[i].green*=alpha[i];
3716 pixels[i].blue*=alpha[i];
3717 if (image->colorspace == CMYKColorspace)
3718 pixels[i].index*=alpha[i];
3724 luminance.x=MagickPixelLuminance(pixels+0)-MagickPixelLuminance(pixels+3);
3725 luminance.y=MagickPixelLuminance(pixels+1)-MagickPixelLuminance(pixels+2);
3726 if (fabs(luminance.x) < fabs(luminance.y))
3731 if (delta.x <= delta.y)
3734 Bottom-left triangle (pixel:2, diagonal: 0-3).
3736 delta.y=1.0-delta.y;
3737 gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
3738 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3739 pixel.red=gamma*MeshInterpolate(&delta,pixels[2].red,
3740 pixels[3].red,pixels[0].red);
3741 pixel.green=gamma*MeshInterpolate(&delta,pixels[2].green,
3742 pixels[3].green,pixels[0].green);
3743 pixel.blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
3744 pixels[3].blue,pixels[0].blue);
3745 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[2].opacity,
3746 pixels[3].opacity,pixels[0].opacity);
3747 if (image->colorspace == CMYKColorspace)
3748 pixel.index=gamma*MeshInterpolate(&delta,pixels[2].index,
3749 pixels[3].index,pixels[0].index);
3754 Top-right triangle (pixel:1, diagonal: 0-3).
3756 delta.x=1.0-delta.x;
3757 gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
3758 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3759 pixel.red=gamma*MeshInterpolate(&delta,pixels[1].red,
3760 pixels[0].red,pixels[3].red);
3761 pixel.green=gamma*MeshInterpolate(&delta,pixels[1].green,
3762 pixels[0].green,pixels[3].green);
3763 pixel.blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
3764 pixels[0].blue,pixels[3].blue);
3765 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[1].opacity,
3766 pixels[0].opacity,pixels[3].opacity);
3767 if (image->colorspace == CMYKColorspace)
3768 pixel.index=gamma*MeshInterpolate(&delta,pixels[1].index,
3769 pixels[0].index,pixels[3].index);
3777 if (delta.x <= (1.0-delta.y))
3780 Top-left triangle (pixel 0, diagonal: 1-2).
3782 gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
3783 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3784 pixel.red=gamma*MeshInterpolate(&delta,pixels[0].red,
3785 pixels[1].red,pixels[2].red);
3786 pixel.green=gamma*MeshInterpolate(&delta,pixels[0].green,
3787 pixels[1].green,pixels[2].green);
3788 pixel.blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
3789 pixels[1].blue,pixels[2].blue);
3790 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[0].opacity,
3791 pixels[1].opacity,pixels[2].opacity);
3792 if (image->colorspace == CMYKColorspace)
3793 pixel.index=gamma*MeshInterpolate(&delta,pixels[0].index,
3794 pixels[1].index,pixels[2].index);
3799 Bottom-right triangle (pixel: 3, diagonal: 1-2).
3801 delta.x=1.0-delta.x;
3802 delta.y=1.0-delta.y;
3803 gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
3804 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3805 pixel.red=gamma*MeshInterpolate(&delta,pixels[3].red,
3806 pixels[2].red,pixels[1].red);
3807 pixel.green=gamma*MeshInterpolate(&delta,pixels[3].green,
3808 pixels[2].green,pixels[1].green);
3809 pixel.blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
3810 pixels[2].blue,pixels[1].blue);
3811 pixel.opacity=gamma*MeshInterpolate(&delta,pixels[3].opacity,
3812 pixels[2].opacity,pixels[1].opacity);
3813 if (image->colorspace == CMYKColorspace)
3814 pixel.index=gamma*MeshInterpolate(&delta,pixels[3].index,
3815 pixels[2].index,pixels[1].index);
3820 case NearestNeighborInterpolatePixel:
3825 p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
3826 NearestNeighbor(y),1,1,exception);
3827 if (p == (const PixelPacket *) NULL)
3829 indexes=GetCacheViewVirtualIndexQueue(image_view);
3830 GetMagickPixelPacket(image,pixels);
3831 SetMagickPixelPacket(image,p,indexes,&pixel);
3834 case SplineInterpolatePixel:
3852 p=GetCacheViewVirtualPixels(image_view,(ssize_t) floor(x)-1,(ssize_t)
3853 floor(y)-1,4,4,exception);
3854 if (p == (const PixelPacket *) NULL)
3856 indexes=GetCacheViewVirtualIndexQueue(image_view);
3860 for (i=(-1); i < 3L; i++)
3862 dy=CubicWeightingFunction((MagickRealType) i-delta.y);
3863 for (j=(-1); j < 3L; j++)
3865 GetMagickPixelPacket(image,pixels+n);
3866 SetMagickPixelPacket(image,p,indexes+n,pixels+n);
3868 if (image->matte != MagickFalse)
3870 alpha[n]=QuantumScale*((MagickRealType)
3871 GetAlphaPixelComponent(p));
3872 pixels[n].red*=alpha[n];
3873 pixels[n].green*=alpha[n];
3874 pixels[n].blue*=alpha[n];
3875 if (image->colorspace == CMYKColorspace)
3876 pixels[n].index*=alpha[n];
3878 dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
3880 gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3881 pixel.red+=gamma*dx*dy*pixels[n].red;
3882 pixel.green+=gamma*dx*dy*pixels[n].green;
3883 pixel.blue+=gamma*dx*dy*pixels[n].blue;
3884 if (image->matte != MagickFalse)
3885 pixel.opacity+=dx*dy*pixels[n].opacity;
3886 if (image->colorspace == CMYKColorspace)
3887 pixel.index+=gamma*dx*dy*pixels[n].index;
3899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3903 % I n t e r p r e t I m a g e A t t r i b u t e s %
3907 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3909 % InterpretImageAttributes() replaces any embedded formatting characters with
3910 % the appropriate image attribute and returns the translated text.
3912 % Deprecated, replace with:
3914 % InterpretImageProperties(image_info,image,embed_text);
3916 % The format of the InterpretImageAttributes method is:
3918 % char *InterpretImageAttributes(const ImageInfo *image_info,Image *image,
3919 % const char *embed_text)
3921 % A description of each parameter follows:
3923 % o image_info: the image info.
3925 % o image: the image.
3927 % o embed_text: the address of a character string containing the embedded
3928 % formatting characters.
3931 MagickExport char *InterpretImageAttributes(const ImageInfo *image_info,
3932 Image *image,const char *embed_text)
3934 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
3935 return(InterpretImageProperties(image_info,image,embed_text));
3939 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3943 + I s S u b i m a g e %
3947 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3949 % IsSubimage() returns MagickTrue if the geometry is a valid subimage
3950 % specification (e.g. [1], [1-9], [1,7,4]).
3952 % The format of the IsSubimage method is:
3954 % unsigned int IsSubimage(const char *geometry,const unsigned int pedantic)
3956 % A description of each parameter follows:
3958 % o geometry: This string is the geometry specification.
3960 % o pedantic: A value other than 0 invokes a more restrictive set of
3961 % conditions for a valid specification (e.g. [1], [1-4], [4-1]).
3964 MagickExport unsigned int IsSubimage(const char *geometry,
3965 const unsigned int pedantic)
3967 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
3968 if (geometry == (const char *) NULL)
3969 return(MagickFalse);
3970 if ((strchr(geometry,'x') != (char *) NULL) ||
3971 (strchr(geometry,'X') != (char *) NULL))
3972 return(MagickFalse);
3973 if ((pedantic != MagickFalse) && (strchr(geometry,',') != (char *) NULL))
3974 return(MagickFalse);
3979 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3983 % L e v e l I m a g e C o l o r s %
3987 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3989 % LevelImageColor() will map the given color to "black" and "white"
3990 % values, limearly spreading out the colors, and level values on a channel by
3991 % channel bases, as per LevelImage(). The given colors allows you to specify
3992 % different level ranges for each of the color channels separately.
3994 % If the boolean 'invert' is set true the image values will modifyed in the
3995 % reverse direction. That is any existing "black" and "white" colors in the
3996 % image will become the color values given, with all other values compressed
3997 % appropriatally. This effectivally maps a greyscale gradient into the given
4000 % Deprecated, replace with:
4002 % LevelColorsImageChannel(image,channel,black_color,white_color,invert);
4004 % The format of the LevelImageColors method is:
4006 % MagickBooleanType LevelImageColors(Image *image,const ChannelType channel,
4007 % const MagickPixelPacket *black_color,const MagickPixelPacket *white_color,
4008 % const MagickBooleanType invert)
4010 % A description of each parameter follows:
4012 % o image: the image.
4014 % o channel: the channel.
4016 % o black_color: The color to map black to/from
4018 % o white_point: The color to map white to/from
4020 % o invert: if true map the colors (levelize), rather than from (level)
4023 MagickBooleanType LevelImageColors(Image *image,const ChannelType channel,
4024 const MagickPixelPacket *black_color,const MagickPixelPacket *white_color,
4025 const MagickBooleanType invert)
4027 return(LevelColorsImageChannel(image,channel,black_color,white_color,invert));
4031 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4035 % L i b e r a t e M e m o r y %
4039 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4041 % LiberateMemory() frees memory that has already been allocated, and NULL's
4042 % the pointer to it.
4044 % The format of the LiberateMemory method is:
4046 % void LiberateMemory(void **memory)
4048 % A description of each parameter follows:
4050 % o memory: A pointer to a block of memory to free for reuse.
4053 MagickExport void LiberateMemory(void **memory)
4055 assert(memory != (void **) NULL);
4056 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
4057 if (*memory == (void *) NULL)
4060 *memory=(void *) NULL;
4064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4068 % L i b e r a t e S e m a p h o r e I n f o %
4072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4074 % LiberateSemaphoreInfo() relinquishes a semaphore.
4076 % Deprecated, replace with:
4078 % UnlockSemaphoreInfo(*semaphore_info);
4080 % The format of the LiberateSemaphoreInfo method is:
4082 % LiberateSemaphoreInfo(void **semaphore_info)
4084 % A description of each parameter follows:
4086 % o semaphore_info: Specifies a pointer to an SemaphoreInfo structure.
4089 MagickExport void LiberateSemaphoreInfo(SemaphoreInfo **semaphore_info)
4091 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
4092 UnlockSemaphoreInfo(*semaphore_info);
4096 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4100 % M a g i c k I n c a r n a t e %
4104 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4106 % MagickIncarnate() initializes the ImageMagick environment.
4108 % Deprecated, replace with:
4110 % MagickCoreGenesis(path,MagickFalse);
4112 % The format of the MagickIncarnate function is:
4114 % MagickIncarnate(const char *path)
4116 % A description of each parameter follows:
4118 % o path: the execution path of the current ImageMagick client.
4122 MagickExport void MagickIncarnate(const char *path)
4124 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
4125 MagickCoreGenesis(path,MagickFalse);
4129 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4133 % M a g i c k M o n i t o r %
4137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4139 % MagickMonitor() calls the monitor handler method with a text string that
4140 % describes the task and a measure of completion. The method returns
4141 % MagickTrue on success otherwise MagickFalse if an error is encountered, e.g.
4142 % if there was a user interrupt.
4144 % The format of the MagickMonitor method is:
4146 % MagickBooleanType MagickMonitor(const char *text,
4147 % const MagickOffsetType offset,const MagickSizeType span,
4148 % void *client_data)
4150 % A description of each parameter follows:
4152 % o offset: the position relative to the span parameter which represents
4153 % how much progress has been made toward completing a task.
4155 % o span: the span relative to completing a task.
4157 % o client_data: the client data.
4160 MagickExport MagickBooleanType MagickMonitor(const char *text,
4161 const MagickOffsetType offset,const MagickSizeType span,
4162 void *magick_unused(client_data))
4170 assert(text != (const char *) NULL);
4171 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",text);
4172 ProcessPendingEvents(text);
4174 exception=AcquireExceptionInfo();
4175 if (monitor_handler != (MonitorHandler) NULL)
4176 status=(*monitor_handler)(text,offset,span,exception);
4177 exception=DestroyExceptionInfo(exception);
4182 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4192 % MapImage() replaces the colors of an image with the closest color from a
4195 % Deprecated, replace with:
4197 % QuantizeInfo quantize_info;
4198 % GetQuantizeInfo(&quantize_info);
4199 % quantize_info.dither=dither;
4200 % RemapImage(&quantize_info,image,map_image);
4202 % The format of the MapImage method is:
4204 % MagickBooleanType MapImage(Image *image,const Image *map_image,
4205 % const MagickBooleanType dither)
4207 % A description of each parameter follows:
4209 % o image: Specifies a pointer to an Image structure.
4211 % o map_image: the image. Reduce image to a set of colors represented by
4214 % o dither: Set this integer value to something other than zero to
4215 % dither the mapped image.
4218 MagickExport MagickBooleanType MapImage(Image *image,const Image *map_image,
4219 const MagickBooleanType dither)
4225 Initialize color cube.
4227 assert(image != (Image *) NULL);
4228 assert(image->signature == MagickSignature);
4229 if (image->debug != MagickFalse)
4230 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
4231 assert(map_image != (Image *) NULL);
4232 assert(map_image->signature == MagickSignature);
4233 GetQuantizeInfo(&quantize_info);
4234 quantize_info.dither=dither;
4235 return(RemapImage(&quantize_info,image,map_image));
4239 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4243 % M a p I m a g e s %
4247 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4249 % MapImages() replaces the colors of a sequence of images with the closest
4250 % color from a reference image.
4252 % Deprecated, replace with:
4254 % QuantizeInfo quantize_info;
4255 % GetQuantizeInfo(&quantize_info);
4256 % quantize_info.dither=dither;
4257 % RemapImages(&quantize_info,images,map_image);
4259 % The format of the MapImage method is:
4261 % MagickBooleanType MapImages(Image *images,Image *map_image,
4262 % const MagickBooleanType dither)
4264 % A description of each parameter follows:
4266 % o image: Specifies a pointer to a set of Image structures.
4268 % o map_image: the image. Reduce image to a set of colors represented by
4271 % o dither: Set this integer value to something other than zero to
4272 % dither the quantized image.
4275 MagickExport MagickBooleanType MapImages(Image *images,const Image *map_image,
4276 const MagickBooleanType dither)
4281 assert(images != (Image *) NULL);
4282 assert(images->signature == MagickSignature);
4283 if (images->debug != MagickFalse)
4284 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
4285 GetQuantizeInfo(&quantize_info);
4286 quantize_info.dither=dither;
4287 return(RemapImages(&quantize_info,images,map_image));
4291 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4295 % M a t t e F l o o d f i l l I m a g e %
4299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4301 % MatteFloodfill() changes the transparency value of any pixel that matches
4302 % target and is an immediate neighbor. If the method FillToBorderMethod
4303 % is specified, the transparency value is changed for any neighbor pixel
4304 % that does not match the bordercolor member of image.
4306 % By default target must match a particular pixel transparency exactly.
4307 % However, in many cases two transparency values may differ by a
4308 % small amount. The fuzz member of image defines how much tolerance is
4309 % acceptable to consider two transparency values as the same. For example,
4310 % set fuzz to 10 and the opacity values of 100 and 102 respectively are
4311 % now interpreted as the same value for the purposes of the floodfill.
4313 % The format of the MatteFloodfillImage method is:
4315 % MagickBooleanType MatteFloodfillImage(Image *image,
4316 % const PixelPacket target,const Quantum opacity,const ssize_t x_offset,
4317 % const ssize_t y_offset,const PaintMethod method)
4319 % A description of each parameter follows:
4321 % o image: the image.
4323 % o target: the RGB value of the target color.
4325 % o opacity: the level of transparency: 0 is fully opaque and QuantumRange is
4326 % fully transparent.
4328 % o x,y: the starting location of the operation.
4330 % o method: Choose either FloodfillMethod or FillToBorderMethod.
4333 MagickExport MagickBooleanType MatteFloodfillImage(Image *image,
4334 const PixelPacket target,const Quantum opacity,const ssize_t x_offset,
4335 const ssize_t y_offset,const PaintMethod method)
4343 register SegmentInfo
4358 Check boundary conditions.
4360 assert(image != (Image *) NULL);
4361 assert(image->signature == MagickSignature);
4362 if (image->debug != MagickFalse)
4363 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
4364 if ((x_offset < 0) || (x_offset >= (ssize_t) image->columns))
4365 return(MagickFalse);
4366 if ((y_offset < 0) || (y_offset >= (ssize_t) image->rows))
4367 return(MagickFalse);
4368 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
4369 return(MagickFalse);
4370 if (image->matte == MagickFalse)
4371 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
4372 floodplane_image=CloneImage(image,image->columns,image->rows,MagickTrue,
4374 if (floodplane_image == (Image *) NULL)
4375 return(MagickFalse);
4376 (void) SetImageAlphaChannel(floodplane_image,OpaqueAlphaChannel);
4378 Set floodfill color.
4380 segment_stack=(SegmentInfo *) AcquireQuantumMemory(MaxStacksize,
4381 sizeof(*segment_stack));
4382 if (segment_stack == (SegmentInfo *) NULL)
4384 floodplane_image=DestroyImage(floodplane_image);
4385 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
4389 Push initial segment on stack.
4395 PushSegmentStack(y,x,x,1);
4396 PushSegmentStack(y+1,x,x,-1);
4397 while (s > segment_stack)
4399 register const PixelPacket
4405 register PixelPacket
4409 Pop segment off stack.
4414 offset=(ssize_t) s->y2;
4415 y=(ssize_t) s->y1+offset;
4417 Recolor neighboring pixels.
4419 p=GetVirtualPixels(image,0,y,(size_t) (x1+1),1,&image->exception);
4420 q=GetAuthenticPixels(floodplane_image,0,y,(size_t) (x1+1),1,
4422 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
4426 for (x=x1; x >= 0; x--)
4428 if (q->opacity == (Quantum) TransparentOpacity)
4430 if (method == FloodfillMethod)
4432 if (IsColorSimilar(image,p,&target) == MagickFalse)
4436 if (IsColorSimilar(image,p,&target) != MagickFalse)
4438 q->opacity=(Quantum) TransparentOpacity;
4442 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
4444 skip=x >= x1 ? MagickTrue : MagickFalse;
4445 if (skip == MagickFalse)
4449 PushSegmentStack(y,start,x1-1,-offset);
4454 if (skip == MagickFalse)
4456 if (x < (ssize_t) image->columns)
4458 p=GetVirtualPixels(image,x,y,image->columns-x,1,
4460 q=GetAuthenticPixels(floodplane_image,x,y,image->columns-x,1,
4462 if ((p == (const PixelPacket *) NULL) ||
4463 (q == (PixelPacket *) NULL))
4465 for ( ; x < (ssize_t) image->columns; x++)
4467 if (q->opacity == (Quantum) TransparentOpacity)
4469 if (method == FloodfillMethod)
4471 if (IsColorSimilar(image,p,&target) == MagickFalse)
4475 if (IsColorSimilar(image,p,&target) != MagickFalse)
4477 q->opacity=(Quantum) TransparentOpacity;
4481 if (SyncAuthenticPixels(floodplane_image,&image->exception) == MagickFalse)
4484 PushSegmentStack(y,start,x-1,offset);
4486 PushSegmentStack(y,x2+1,x-1,-offset);
4492 p=GetVirtualPixels(image,x,y,(size_t) (x2-x+1),1,
4494 q=GetAuthenticPixels(floodplane_image,x,y,(size_t) (x2-x+1),1,
4496 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
4498 for ( ; x <= x2; x++)
4500 if (q->opacity == (Quantum) TransparentOpacity)
4502 if (method == FloodfillMethod)
4504 if (IsColorSimilar(image,p,&target) != MagickFalse)
4508 if (IsColorSimilar(image,p,&target) == MagickFalse)
4517 for (y=0; y < (ssize_t) image->rows; y++)
4519 register const PixelPacket
4525 register PixelPacket
4529 Tile fill color onto floodplane.
4531 p=GetVirtualPixels(floodplane_image,0,y,image->columns,1,
4533 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
4534 if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL))
4536 for (x=0; x < (ssize_t) image->columns; x++)
4538 if (GetOpacityPixelComponent(p) != OpaqueOpacity)
4543 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
4546 segment_stack=(SegmentInfo *) RelinquishMagickMemory(segment_stack);
4547 floodplane_image=DestroyImage(floodplane_image);
4548 return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
4552 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4556 % M a x i m u m I m a g e s %
4560 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4562 % MaximumImages() returns the maximum intensity of an image sequence.
4564 % Deprecated, replace with:
4566 % EvaluateImages(images,MinEvaluateOperator,exception);
4568 % The format of the MaxImages method is:
4570 % Image *MaximumImages(Image *images,ExceptionInfo *exception)
4572 % A description of each parameter follows:
4574 % o images: the image sequence.
4576 % o exception: return any errors or warnings in this structure.
4579 MagickExport Image *MaximumImages(const Image *images,ExceptionInfo *exception)
4581 return(EvaluateImages(images,MinEvaluateOperator,exception));
4585 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4589 % M i n i m u m I m a g e s %
4593 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4595 % MinimumImages() returns the minimum intensity of an image sequence.
4597 % Deprecated, replace with:
4599 % EvaluateImages(images,MinEvaluateOperator,exception);
4601 % The format of the MinimumImages method is:
4603 % Image *MinimumImages(Image *images,ExceptionInfo *exception)
4605 % A description of each parameter follows:
4607 % o images: the image sequence.
4609 % o exception: return any errors or warnings in this structure.
4612 MagickExport Image *MinimumImages(const Image *images,ExceptionInfo *exception)
4614 return(EvaluateImages(images,MinEvaluateOperator,exception));
4618 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4622 % M e d i a n F i l t e r I m a g e %
4626 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4628 % MedianFilterImage() applies a digital filter that improves the quality
4629 % of a noisy image. Each pixel is replaced by the median in a set of
4630 % neighboring pixels as defined by radius.
4632 % The algorithm was contributed by Mike Edmonds and implements an insertion
4633 % sort for selecting median color-channel values. For more on this algorithm
4634 % see "Skip Lists: A probabilistic Alternative to Balanced Trees" by William
4635 % Pugh in the June 1990 of Communications of the ACM.
4637 % The format of the MedianFilterImage method is:
4639 % Image *MedianFilterImage(const Image *image,const double radius,
4640 % ExceptionInfo *exception)
4642 % A description of each parameter follows:
4644 % o image: the image.
4646 % o radius: the radius of the pixel neighborhood.
4648 % o exception: return any errors or warnings in this structure.
4651 MagickExport Image *MedianFilterImage(const Image *image,const double radius,
4652 ExceptionInfo *exception)
4657 median_image=StatisticImage(image,MedianStatistic,(size_t) radius,(size_t)
4659 return(median_image);
4663 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4667 % M o d e I m a g e %
4671 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4673 % ModeImage() makes each pixel the 'predominate color' of the neighborhood
4674 % of the specified radius.
4676 % The format of the ModeImage method is:
4678 % Image *ModeImage(const Image *image,const double radius,
4679 % ExceptionInfo *exception)
4681 % A description of each parameter follows:
4683 % o image: the image.
4685 % o radius: the radius of the pixel neighborhood.
4687 % o exception: return any errors or warnings in this structure.
4690 MagickExport Image *ModeImage(const Image *image,const double radius,
4691 ExceptionInfo *exception)
4696 mode_image=StatisticImage(image,ModeStatistic,(size_t) radius,(size_t) radius,
4702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4706 % M o s a i c I m a g e s %
4710 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4712 % MosaicImages() Obsolete Function: Use MergeImageLayers() instead.
4714 % Deprecated, replace with:
4716 % MergeImageLayers(image,MosaicLayer,exception);
4718 % The format of the MosaicImage method is:
4720 % Image *MosaicImages(const Image *image,ExceptionInfo *exception)
4722 % A description of each parameter follows:
4724 % o image: the image list to be composited together
4726 % o exception: return any errors or warnings in this structure.
4729 MagickExport Image *MosaicImages(Image *image,ExceptionInfo *exception)
4731 return(MergeImageLayers(image,MosaicLayer,exception));
4735 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4739 % O p a q u e I m a g e %
4743 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4745 % OpaqueImage() changes any pixel that matches color with the color
4748 % By default color must match a particular pixel color exactly. However,
4749 % in many cases two colors may differ by a small amount. Fuzz defines
4750 % how much tolerance is acceptable to consider two colors as the same.
4751 % For example, set fuzz to 10 and the color red at intensities of 100 and
4752 % 102 respectively are now interpreted as the same color.
4754 % The format of the OpaqueImage method is:
4756 % MagickBooleanType OpaqueImage(Image *image,
4757 % const PixelPacket *target,const PixelPacket fill)
4759 % A description of each parameter follows:
4761 % o image: the image.
4763 % o target: the RGB value of the target color.
4765 % o fill: the replacement color.
4768 MagickExport MagickBooleanType OpaqueImage(Image *image,
4769 const PixelPacket target,const PixelPacket fill)
4771 #define OpaqueImageTag "Opaque/Image"
4783 Make image color opaque.
4785 assert(image != (Image *) NULL);
4786 assert(image->signature == MagickSignature);
4787 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.1.0");
4788 if (image->debug != MagickFalse)
4789 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
4790 switch (image->storage_class)
4796 Make DirectClass image opaque.
4798 for (y=0; y < (ssize_t) image->rows; y++)
4803 register PixelPacket
4806 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
4807 if (q == (PixelPacket *) NULL)
4809 for (x=0; x < (ssize_t) image->columns; x++)
4811 if (IsColorSimilar(image,q,&target) != MagickFalse)
4815 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
4817 proceed=SetImageProgress(image,OpaqueImageTag,(MagickOffsetType) y,
4819 if (proceed == MagickFalse)
4827 Make PseudoClass image opaque.
4829 for (i=0; i < (ssize_t) image->colors; i++)
4831 if (IsColorSimilar(image,&image->colormap[i],&target) != MagickFalse)
4832 image->colormap[i]=fill;
4834 if (fill.opacity != OpaqueOpacity)
4836 for (y=0; y < (ssize_t) image->rows; y++)
4841 register PixelPacket
4844 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
4845 if (q == (PixelPacket *) NULL)
4847 for (x=0; x < (ssize_t) image->columns; x++)
4849 if (IsColorSimilar(image,q,&target) != MagickFalse)
4850 q->opacity=fill.opacity;
4853 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
4857 (void) SyncImage(image);
4861 if (fill.opacity != OpaqueOpacity)
4862 image->matte=MagickTrue;
4867 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4871 % O p e n C a c h e V i e w %
4875 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4877 % OpenCacheView() opens a view into the pixel cache, using the
4878 % VirtualPixelMethod that is defined within the given image itself.
4880 % Deprecated, replace with:
4882 % AcquireCacheView(image);
4884 % The format of the OpenCacheView method is:
4886 % CacheView *OpenCacheView(const Image *image)
4888 % A description of each parameter follows:
4890 % o image: the image.
4893 MagickExport CacheView *OpenCacheView(const Image *image)
4895 return(AcquireCacheView(image));
4899 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4903 % P a i n t F l o o d f i l l I m a g e %
4907 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4909 % PaintFloodfill() changes the color value of any pixel that matches
4910 % target and is an immediate neighbor. If the method FillToBorderMethod is
4911 % specified, the color value is changed for any neighbor pixel that does not
4912 % match the bordercolor member of image.
4914 % By default target must match a particular pixel color exactly.
4915 % However, in many cases two colors may differ by a small amount. The
4916 % fuzz member of image defines how much tolerance is acceptable to
4917 % consider two colors as the same. For example, set fuzz to 10 and the
4918 % color red at intensities of 100 and 102 respectively are now
4919 % interpreted as the same color for the purposes of the floodfill.
4921 % Deprecated, replace with:
4923 % FloodfillPaintImage(image,channel,draw_info,target,x,y,
4924 % method == FloodfillMethod ? MagickFalse : MagickTrue);
4926 % The format of the PaintFloodfillImage method is:
4928 % MagickBooleanType PaintFloodfillImage(Image *image,
4929 % const ChannelType channel,const MagickPixelPacket target,const ssize_t x,
4930 % const ssize_t y,const DrawInfo *draw_info,const PaintMethod method)
4932 % A description of each parameter follows:
4934 % o image: the image.
4936 % o channel: the channel(s).
4938 % o target: the RGB value of the target color.
4940 % o x,y: the starting location of the operation.
4942 % o draw_info: the draw info.
4944 % o method: Choose either FloodfillMethod or FillToBorderMethod.
4947 MagickExport MagickBooleanType PaintFloodfillImage(Image *image,
4948 const ChannelType channel,const MagickPixelPacket *target,const ssize_t x,
4949 const ssize_t y,const DrawInfo *draw_info,const PaintMethod method)
4954 status=FloodfillPaintImage(image,channel,draw_info,target,x,y,
4955 method == FloodfillMethod ? MagickFalse : MagickTrue);
4960 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4963 % P a i n t O p a q u e I m a g e %
4966 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4968 % PaintOpaqueImage() changes any pixel that matches color with the color
4971 % By default color must match a particular pixel color exactly. However,
4972 % in many cases two colors may differ by a small amount. Fuzz defines
4973 % how much tolerance is acceptable to consider two colors as the same.
4974 % For example, set fuzz to 10 and the color red at intensities of 100 and
4975 % 102 respectively are now interpreted as the same color.
4977 % Deprecated, replace with:
4979 % OpaquePaintImageChannel(image,DefaultChannels,target,fill,MagickFalse);
4980 % OpaquePaintImageChannel(image,channel,target,fill,MagickFalse);
4982 % The format of the PaintOpaqueImage method is:
4984 % MagickBooleanType PaintOpaqueImage(Image *image,
4985 % const PixelPacket *target,const PixelPacket *fill)
4986 % MagickBooleanType PaintOpaqueImageChannel(Image *image,
4987 % const ChannelType channel,const PixelPacket *target,
4988 % const PixelPacket *fill)
4990 % A description of each parameter follows:
4992 % o image: the image.
4994 % o channel: the channel(s).
4996 % o target: the RGB value of the target color.
4998 % o fill: the replacement color.
5002 MagickExport MagickBooleanType PaintOpaqueImage(Image *image,
5003 const MagickPixelPacket *target,const MagickPixelPacket *fill)
5008 status=OpaquePaintImageChannel(image,DefaultChannels,target,fill,MagickFalse);
5012 MagickExport MagickBooleanType PaintOpaqueImageChannel(Image *image,
5013 const ChannelType channel,const MagickPixelPacket *target,
5014 const MagickPixelPacket *fill)
5016 return(OpaquePaintImageChannel(image,channel,target,fill,MagickFalse));
5020 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5024 % P a i n t T r a n s p a r e n t I m a g e %
5028 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5030 % PaintTransparentImage() changes the opacity value associated with any pixel
5031 % that matches color to the value defined by opacity.
5033 % By default color must match a particular pixel color exactly. However,
5034 % in many cases two colors may differ by a small amount. Fuzz defines
5035 % how much tolerance is acceptable to consider two colors as the same.
5036 % For example, set fuzz to 10 and the color red at intensities of 100 and
5037 % 102 respectively are now interpreted as the same color.
5039 % Deprecated, replace with:
5041 % TransparentPaintImage(image,target,opacity,MagickFalse);
5043 % The format of the PaintTransparentImage method is:
5045 % MagickBooleanType PaintTransparentImage(Image *image,
5046 % const MagickPixelPacket *target,const Quantum opacity)
5048 % A description of each parameter follows:
5050 % o image: the image.
5052 % o target: the RGB value of the target color.
5054 % o opacity: the replacement opacity value.
5057 MagickExport MagickBooleanType PaintTransparentImage(Image *image,
5058 const MagickPixelPacket *target,const Quantum opacity)
5060 return(TransparentPaintImage(image,target,opacity,MagickFalse));
5064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5068 + P a r s e I m a g e G e o m e t r y %
5072 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5074 % ParseImageGeometry() is similar to GetGeometry() except the returned
5075 % geometry is modified as determined by the meta characters: %, !, <,
5078 % Deprecated, replace with:
5080 % ParseMetaGeometry(geometry,x,y,width,height);
5082 % The format of the ParseImageGeometry method is:
5084 % int ParseImageGeometry(char *geometry,ssize_t *x,ssize_t *y,
5085 % size_t *width,size_t *height)
5087 % A description of each parameter follows:
5089 % o flags: Method ParseImageGeometry returns a bitmask that indicates
5090 % which of the four values were located in the geometry string.
5092 % o image_geometry: Specifies a character string representing the geometry
5095 % o x,y: A pointer to an integer. The x and y offset as determined by
5096 % the geometry specification is returned here.
5098 % o width,height: A pointer to an unsigned integer. The width and height
5099 % as determined by the geometry specification is returned here.
5102 MagickExport int ParseImageGeometry(const char *geometry,ssize_t *x,ssize_t *y,
5103 size_t *width,size_t *height)
5105 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
5106 return((int) ParseMetaGeometry(geometry,x,y,width,height));
5110 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5114 % P a r s e S i z e G e o m e t r y %
5118 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5120 % ParseSizeGeometry() returns a region as defined by the geometry string with
5121 % respect to the image dimensions and aspect ratio.
5123 % Deprecated, replace with:
5125 % ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y,
5126 % ®ion_info->width,®ion_info->height);
5128 % The format of the ParseSizeGeometry method is:
5130 % MagickStatusType ParseSizeGeometry(const Image *image,
5131 % const char *geometry,RectangeInfo *region_info)
5133 % A description of each parameter follows:
5135 % o geometry: The geometry (e.g. 100x100+10+10).
5137 % o region_info: the region as defined by the geometry string.
5140 MagickExport MagickStatusType ParseSizeGeometry(const Image *image,
5141 const char *geometry,RectangleInfo *region_info)
5146 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.4.7");
5147 SetGeometry(image,region_info);
5148 flags=ParseMetaGeometry(geometry,®ion_info->x,®ion_info->y,
5149 ®ion_info->width,®ion_info->height);
5154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5158 % P o p I m a g e L i s t %
5162 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5164 % PopImageList() removes the last image in the list.
5166 % Deprecated, replace with:
5168 % RemoveLastImageFromList(images);
5170 % The format of the PopImageList method is:
5172 % Image *PopImageList(Image **images)
5174 % A description of each parameter follows:
5176 % o images: the image list.
5179 MagickExport Image *PopImageList(Image **images)
5181 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
5182 return(RemoveLastImageFromList(images));
5186 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5190 % P o p I m a g e P i x e l s %
5194 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5196 % PopImagePixels() transfers one or more pixel components from the image pixel
5197 % cache to a user supplied buffer. The pixels are returned in network byte
5198 % order. MagickTrue is returned if the pixels are successfully transferred,
5199 % otherwise MagickFalse.
5201 % The format of the PopImagePixels method is:
5203 % size_t PopImagePixels(Image *,const QuantumType quantum,
5204 % unsigned char *destination)
5206 % A description of each parameter follows:
5208 % o image: the image.
5210 % o quantum: Declare which pixel components to transfer (RGB, RGBA, etc).
5212 % o destination: The components are transferred to this buffer.
5215 MagickExport size_t PopImagePixels(Image *image,const QuantumType quantum,
5216 unsigned char *destination)
5224 quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
5225 if (quantum_info == (QuantumInfo *) NULL)
5227 length=ExportQuantumPixels(image,(const CacheView *) NULL,quantum_info,
5228 quantum,destination,&image->exception);
5229 quantum_info=DestroyQuantumInfo(quantum_info);
5234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5238 % P o s t s c r i p t G e o m e t r y %
5242 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5244 % PostscriptGeometry() replaces any page mneumonic with the equivalent size in
5247 % Deprecated, replace with:
5249 % GetPageGeometry(page);
5251 % The format of the PostscriptGeometry method is:
5253 % char *PostscriptGeometry(const char *page)
5255 % A description of each parameter follows.
5257 % o page: Specifies a pointer to an array of characters.
5258 % The string is either a Postscript page name (e.g. A4) or a postscript
5259 % page geometry (e.g. 612x792+36+36).
5262 MagickExport char *PostscriptGeometry(const char *page)
5264 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
5265 return(GetPageGeometry(page));
5269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5273 % P u s h I m a g e L i s t %
5277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5279 % PushImageList() adds an image to the end of the list.
5281 % Deprecated, replace with:
5283 % AppendImageToList(images,CloneImageList(image,exception));
5285 % The format of the PushImageList method is:
5287 % unsigned int PushImageList(Image *images,const Image *image,
5288 % ExceptionInfo *exception)
5290 % A description of each parameter follows:
5292 % o images: the image list.
5294 % o image: the image.
5296 % o exception: return any errors or warnings in this structure.
5299 MagickExport unsigned int PushImageList(Image **images,const Image *image,
5300 ExceptionInfo *exception)
5302 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
5303 AppendImageToList(images,CloneImageList(image,exception));
5308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5312 % P u s h I m a g e P i x e l s %
5316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5318 % PushImagePixels() transfers one or more pixel components from a user
5319 % supplied buffer into the image pixel cache of an image. The pixels are
5320 % expected in network byte order. It returns MagickTrue if the pixels are
5321 % successfully transferred, otherwise MagickFalse.
5323 % The format of the PushImagePixels method is:
5325 % size_t PushImagePixels(Image *image,const QuantumType quantum,
5326 % const unsigned char *source)
5328 % A description of each parameter follows:
5330 % o image: the image.
5332 % o quantum: Declare which pixel components to transfer (red, green, blue,
5333 % opacity, RGB, or RGBA).
5335 % o source: The pixel components are transferred from this buffer.
5338 MagickExport size_t PushImagePixels(Image *image,const QuantumType quantum,
5339 const unsigned char *source)
5347 quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
5348 if (quantum_info == (QuantumInfo *) NULL)
5350 length=ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,quantum,
5351 source,&image->exception);
5352 quantum_info=DestroyQuantumInfo(quantum_info);
5357 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5361 % Q u a n t i z a t i o n E r r o r %
5365 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5367 % QuantizationError() measures the difference between the original and
5368 % quantized images. This difference is the total quantization error. The
5369 % error is computed by summing over all pixels in an image the distance
5370 % squared in RGB space between each reference pixel value and its quantized
5371 % value. These values are computed:
5373 % o mean_error_per_pixel: This value is the mean error for any single
5374 % pixel in the image.
5376 % o normalized_mean_square_error: This value is the normalized mean
5377 % quantization error for any single pixel in the image. This distance
5378 % measure is normalized to a range between 0 and 1. It is independent
5379 % of the range of red, green, and blue values in the image.
5381 % o normalized_maximum_square_error: Thsi value is the normalized
5382 % maximum quantization error for any single pixel in the image. This
5383 % distance measure is normalized to a range between 0 and 1. It is
5384 % independent of the range of red, green, and blue values in your image.
5386 % Deprecated, replace with:
5388 % GetImageQuantizeError(image);
5390 % The format of the QuantizationError method is:
5392 % unsigned int QuantizationError(Image *image)
5394 % A description of each parameter follows.
5396 % o image: Specifies a pointer to an Image structure; returned from
5400 MagickExport unsigned int QuantizationError(Image *image)
5402 if (image->debug != MagickFalse)
5403 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.3");
5404 return(GetImageQuantizeError(image));
5408 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5411 % 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 %
5415 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5417 % RandomChannelThresholdImage() changes the value of individual pixels based
5418 % on the intensity of each pixel compared to a random threshold. The result
5419 % is a low-contrast, two color image.
5421 % The format of the RandomChannelThresholdImage method is:
5423 % unsigned int RandomChannelThresholdImage(Image *image,
5424 % const char *channel, const char *thresholds,
5425 % ExceptionInfo *exception)
5427 % A description of each parameter follows:
5429 % o image: the image.
5431 % o channel: the channel or channels to be thresholded.
5433 % o thresholds: a geometry string containing LOWxHIGH thresholds.
5434 % If the string contains 2x2, 3x3, or 4x4, then an ordered
5435 % dither of order 2, 3, or 4 will be performed instead.
5437 % o exception: return any errors or warnings in this structure.
5440 MagickExport unsigned int RandomChannelThresholdImage(Image *image,const char
5441 *channel,const char *thresholds,ExceptionInfo *exception)
5443 #define RandomChannelThresholdImageText " RandomChannelThreshold image... "
5456 static MagickRealType
5457 o2[4]={0.2f, 0.6f, 0.8f, 0.4f},
5458 o3[9]={0.1f, 0.6f, 0.3f, 0.7f, 0.5f, 0.8f, 0.4f, 0.9f, 0.2f},
5459 o4[16]={0.1f, 0.7f, 1.1f, 0.3f, 1.0f, 0.5f, 1.5f, 0.8f, 1.4f, 1.6f, 0.6f,
5460 1.2f, 0.4f, 0.9f, 1.3f, 0.2f},
5469 assert(image != (Image *) NULL);
5470 assert(image->signature == MagickSignature);
5471 if (image->debug != MagickFalse)
5472 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5473 assert(exception != (ExceptionInfo *) NULL);
5474 assert(exception->signature == MagickSignature);
5475 if (image->debug != MagickFalse)
5476 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
5477 if (thresholds == (const char *) NULL)
5479 if (LocaleCompare(thresholds,"2x2") == 0)
5482 if (LocaleCompare(thresholds,"3x3") == 0)
5485 if (LocaleCompare(thresholds,"4x4") == 0)
5492 count=(ssize_t) sscanf(thresholds,"%lf[/x%%]%lf",&lower_threshold,
5494 if (strchr(thresholds,'%') != (char *) NULL)
5496 upper_threshold*=(.01*QuantumRange);
5497 lower_threshold*=(.01*QuantumRange);
5500 upper_threshold=(MagickRealType) QuantumRange-lower_threshold;
5502 if (image->debug != MagickFalse)
5503 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
5504 " RandomChannelThresholdImage: channel type=%s",channel);
5505 if (image->debug != MagickFalse)
5506 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
5507 " Thresholds: %s (%fx%f)",thresholds,lower_threshold,upper_threshold);
5508 if (LocaleCompare(channel,"all") == 0 ||
5509 LocaleCompare(channel,"intensity") == 0)
5510 if (AcquireImageColormap(image,2) == MagickFalse)
5511 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
5513 random_info=AcquireRandomInfo();
5514 for (y=0; y < (ssize_t) image->rows; y++)
5519 register IndexPacket
5523 register PixelPacket
5526 q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
5527 if (q == (PixelPacket *) NULL)
5529 if (LocaleCompare(channel,"all") == 0 ||
5530 LocaleCompare(channel,"intensity") == 0)
5532 indexes=GetAuthenticIndexQueue(image);
5533 for (x=0; x < (ssize_t) image->columns; x++)
5538 intensity=(MagickRealType) PixelIntensityToQuantum(q);
5541 if (intensity < lower_threshold)
5542 threshold=lower_threshold;
5543 else if (intensity > upper_threshold)
5544 threshold=upper_threshold;
5546 threshold=(MagickRealType) (QuantumRange*
5547 GetPseudoRandomValue(random_info));
5549 else if (order == 2)
5550 threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
5551 else if (order == 3)
5552 threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
5553 else if (order == 4)
5554 threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)];
5555 index=(IndexPacket) (intensity <= threshold ? 0 : 1);
5556 SetIndexPixelComponent(indexes+x,index);
5557 SetRGBOPixelComponents(q,image->colormap+(ssize_t) index);
5561 if (LocaleCompare(channel,"opacity") == 0 ||
5562 LocaleCompare(channel,"all") == 0 ||
5563 LocaleCompare(channel,"matte") == 0)
5565 if (image->matte != MagickFalse)
5566 for (x=0; x < (ssize_t) image->columns; x++)
5570 if ((MagickRealType) q->opacity < lower_threshold)
5571 threshold=lower_threshold;
5572 else if ((MagickRealType) q->opacity > upper_threshold)
5573 threshold=upper_threshold;
5575 threshold=(MagickRealType) (QuantumRange*
5576 GetPseudoRandomValue(random_info));
5578 else if (order == 2)
5579 threshold=(MagickRealType) QuantumRange*o2[(x%2)+2*(y%2)];
5580 else if (order == 3)
5581 threshold=(MagickRealType) QuantumRange*o3[(x%3)+3*(y%3)];
5582 else if (order == 4)
5583 threshold=(MagickRealType) QuantumRange*o4[(x%4)+4*(y%4)]/1.7;
5584 SetOpacityPixelComponent(q,(MagickRealType) q->opacity <=
5585 threshold ? 0 : QuantumRange);
5591 /* To Do: red, green, blue, cyan, magenta, yellow, black */
5592 if (LocaleCompare(channel,"intensity") != 0)
5593 ThrowBinaryException(OptionError,"UnrecognizedChannelType",
5596 if (SyncAuthenticPixels(image,exception) == MagickFalse)
5599 random_info=DestroyRandomInfo(random_info);
5604 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5608 % R e a c q u i r e M e m o r y %
5612 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5614 % ReacquireMemory() changes the size of the memory and returns a pointer to
5615 % the (possibly moved) block. The contents will be unchanged up to the
5616 % lesser of the new and old sizes.
5618 % The format of the ReacquireMemory method is:
5620 % void ReacquireMemory(void **memory,const size_t size)
5622 % A description of each parameter follows:
5624 % o memory: A pointer to a memory allocation. On return the pointer
5625 % may change but the contents of the original allocation will not.
5627 % o size: the new size of the allocated memory.
5630 MagickExport void ReacquireMemory(void **memory,const size_t size)
5635 assert(memory != (void **) NULL);
5636 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
5637 if (*memory == (void *) NULL)
5639 *memory=AcquireMagickMemory(size);
5642 allocation=realloc(*memory,size);
5643 if (allocation == (void *) NULL)
5644 *memory=RelinquishMagickMemory(*memory);
5649 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5653 % R e c o l o r I m a g e %
5657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5659 % RecolorImage() apply color transformation to an image. The method permits
5660 % saturation changes, hue rotation, luminance to alpha, and various other
5661 % effects. Although variable-sized transformation matrices can be used,
5662 % typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA
5663 % (or RGBA with offsets). The matrix is similar to those used by Adobe Flash
5664 % except offsets are in column 6 rather than 5 (in support of CMYKA images)
5665 % and offsets are normalized (divide Flash offset by 255).
5667 % The format of the RecolorImage method is:
5669 % Image *RecolorImage(const Image *image,const size_t order,
5670 % const double *color_matrix,ExceptionInfo *exception)
5672 % A description of each parameter follows:
5674 % o image: the image.
5676 % o order: the number of columns and rows in the recolor matrix.
5678 % o color_matrix: An array of double representing the recolor matrix.
5680 % o exception: return any errors or warnings in this structure.
5683 MagickExport Image *RecolorImage(const Image *image,const size_t order,
5684 const double *color_matrix,ExceptionInfo *exception)
5692 kernel_info=AcquireKernelInfo("1");
5693 if (kernel_info == (KernelInfo *) NULL)
5694 return((Image *) NULL);
5695 kernel_info->width=order;
5696 kernel_info->height=order;
5697 kernel_info->values=(double *) color_matrix;
5698 recolor_image=ColorMatrixImage(image,kernel_info,exception);
5699 kernel_info->values=(double *) NULL;
5700 kernel_info=DestroyKernelInfo(kernel_info);
5701 return(recolor_image);
5705 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5709 % R e d u c e N o i s e I m a g e %
5713 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5715 % ReduceNoiseImage() smooths the contours of an image while still preserving
5716 % edge information. The algorithm works by replacing each pixel with its
5717 % neighbor closest in value. A neighbor is defined by radius. Use a radius
5718 % of 0 and ReduceNoise() selects a suitable radius for you.
5720 % The format of the ReduceNoiseImage method is:
5722 % Image *ReduceNoiseImage(const Image *image,const double radius,
5723 % ExceptionInfo *exception)
5725 % A description of each parameter follows:
5727 % o image: the image.
5729 % o radius: the radius of the pixel neighborhood.
5731 % o exception: return any errors or warnings in this structure.
5734 MagickExport Image *ReduceNoiseImage(const Image *image,const double radius,
5735 ExceptionInfo *exception)
5740 reduce_image=StatisticImage(image,NonpeakStatistic,(size_t) radius,(size_t)
5742 return(reduce_image);
5746 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5750 % 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 %
5754 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5756 % ResetImageAttributeIterator() resets the image attributes iterator. Use it
5757 % in conjunction with GetNextImageAttribute() to iterate over all the values
5758 % associated with an image.
5760 % Deprecated, replace with:
5762 % ResetImagePropertyIterator(image);
5764 % The format of the ResetImageAttributeIterator method is:
5766 % ResetImageAttributeIterator(const ImageInfo *image)
5768 % A description of each parameter follows:
5770 % o image: the image.
5773 MagickExport void ResetImageAttributeIterator(const Image *image)
5775 ResetImagePropertyIterator(image);
5779 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5783 % S e t C a c h e V i e w P i x e l s %
5787 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5789 % SetCacheViewPixels() gets pixels from the in-memory or disk pixel cache as
5790 % defined by the geometry parameters. A pointer to the pixels is returned
5791 % if the pixels are transferred, otherwise a NULL is returned.
5793 % Deprecated, replace with:
5795 % QueueCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
5796 % GetCacheViewException(cache_view));
5798 % The format of the SetCacheViewPixels method is:
5800 % PixelPacket *SetCacheViewPixels(CacheView *cache_view,const ssize_t x,
5801 % const ssize_t y,const size_t columns,const size_t rows)
5803 % A description of each parameter follows:
5805 % o cache_view: the cache view.
5807 % o x,y,columns,rows: These values define the perimeter of a region of
5811 MagickExport PixelPacket *SetCacheViewPixels(CacheView *cache_view,const ssize_t x,
5812 const ssize_t y,const size_t columns,const size_t rows)
5817 pixels=QueueCacheViewAuthenticPixels(cache_view,x,y,columns,rows,
5818 GetCacheViewException(cache_view));
5823 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5827 + S e t C a c h e T h e s h o l d %
5831 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5833 % SetCacheThreshold() sets the amount of free memory allocated for the pixel
5834 % cache. Once this threshold is exceeded, all subsequent pixels cache
5835 % operations are to/from disk.
5837 % The format of the SetCacheThreshold() method is:
5839 % void SetCacheThreshold(const size_t threshold)
5841 % A description of each parameter follows:
5843 % o threshold: the number of megabytes of memory available to the pixel
5847 MagickExport void SetCacheThreshold(const size_t size)
5849 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.1");
5850 (void) SetMagickResourceLimit(MemoryResource,size*1024*1024);
5851 (void) SetMagickResourceLimit(MapResource,2*size*1024*1024);
5855 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5859 % S e t E x c e p t i o n I n f o %
5863 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5865 % SetExceptionInfo() sets the exception severity.
5867 % The format of the SetExceptionInfo method is:
5869 % MagickBooleanType SetExceptionInfo(ExceptionInfo *exception,
5870 % ExceptionType severity)
5872 % A description of each parameter follows:
5874 % o exception: the exception info.
5876 % o severity: the exception severity.
5879 MagickExport MagickBooleanType SetExceptionInfo(ExceptionInfo *exception,
5880 ExceptionType severity)
5882 assert(exception != (ExceptionInfo *) NULL);
5883 ClearMagickException(exception);
5884 exception->severity=severity;
5889 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5897 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5899 % SetImage() sets the red, green, and blue components of each pixel to
5900 % the image background color and the opacity component to the specified
5901 % level of transparency. The background color is defined by the
5902 % background_color member of the image.
5904 % The format of the SetImage method is:
5906 % void SetImage(Image *image,const Quantum opacity)
5908 % A description of each parameter follows:
5910 % o image: the image.
5912 % o opacity: Set each pixel to this level of transparency.
5915 MagickExport void SetImage(Image *image,const Quantum opacity)
5923 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.0");
5924 assert(image != (Image *) NULL);
5925 if (image->debug != MagickFalse)
5926 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
5927 assert(image->signature == MagickSignature);
5928 background_color=image->background_color;
5929 if (opacity != OpaqueOpacity)
5930 background_color.opacity=opacity;
5931 if (background_color.opacity != OpaqueOpacity)
5933 (void) SetImageStorageClass(image,DirectClass);
5934 image->matte=MagickTrue;
5936 if ((image->storage_class == PseudoClass) ||
5937 (image->colorspace == CMYKColorspace))
5940 Set colormapped or CMYK image.
5942 for (y=0; y < (ssize_t) image->rows; y++)
5944 register IndexPacket
5950 register PixelPacket
5953 q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
5954 if (q == (PixelPacket *) NULL)
5956 for (x=0; x < (ssize_t) image->columns; x++)
5958 SetRGBOPixelComponents(q,&background_color);
5961 indexes=GetAuthenticIndexQueue(image);
5962 for (x=0; x < (ssize_t) image->columns; x++)
5963 SetIndexPixelComponent(indexes+x,0);
5964 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
5970 Set DirectClass image.
5972 for (y=0; y < (ssize_t) image->rows; y++)
5977 register PixelPacket
5980 q=QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
5981 if (q == (PixelPacket *) NULL)
5983 for (x=0; x < (ssize_t) image->columns; x++)
5985 SetRGBOPixelComponents(q,&background_color);
5988 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
5994 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5998 % S e t I m a g e A t t r i b u t e %
6002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6004 % SetImageAttribute() searches the list of image attributes and replaces the
6005 % attribute value. If it is not found in the list, the attribute name
6006 % and value is added to the list.
6008 % Deprecated, replace with:
6010 % SetImageProperty(image,key,value);
6012 % The format of the SetImageAttribute method is:
6014 % MagickBooleanType SetImageAttribute(Image *image,const char *key,
6015 % const char *value)
6017 % A description of each parameter follows:
6019 % o image: the image.
6023 % o value: the value.
6026 MagickExport MagickBooleanType SetImageAttribute(Image *image,const char *key,
6029 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.3.1");
6030 return(SetImageProperty(image,key,value));
6034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6038 % S e t I m a g e L i s t %
6042 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6044 % SetImageList() inserts an image into the list at the specified position.
6046 % The format of the SetImageList method is:
6048 % unsigned int SetImageList(Image *images,const Image *image,
6049 % const ssize_t offset,ExceptionInfo *exception)
6051 % A description of each parameter follows:
6053 % o images: the image list.
6055 % o image: the image.
6057 % o offset: the position within the list.
6059 % o exception: return any errors or warnings in this structure.
6062 MagickExport unsigned int SetImageList(Image **images,const Image *image,
6063 const ssize_t offset,ExceptionInfo *exception)
6071 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
6072 clone=CloneImageList(image,exception);
6073 while (GetPreviousImageInList(*images) != (Image *) NULL)
6074 (*images)=GetPreviousImageInList(*images);
6075 for (i=0; i < offset; i++)
6077 if (GetNextImageInList(*images) == (Image *) NULL)
6078 return(MagickFalse);
6079 (*images)=GetNextImageInList(*images);
6081 InsertImageInList(images,clone);
6086 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6090 % S e t I m a g e P i x e l s %
6094 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6096 % SetImagePixels() queues a mutable pixel region.
6097 % If the region is successfully intialized a pointer to a PixelPacket
6098 % array representing the region is returned, otherwise NULL is returned.
6099 % The returned pointer may point to a temporary working buffer for the
6100 % pixels or it may point to the final location of the pixels in memory.
6102 % Write-only access means that any existing pixel values corresponding to
6103 % the region are ignored. This useful while the initial image is being
6104 % created from scratch, or if the existing pixel values are to be
6105 % completely replaced without need to refer to their pre-existing values.
6106 % The application is free to read and write the pixel buffer returned by
6107 % SetImagePixels() any way it pleases. SetImagePixels() does not initialize
6108 % the pixel array values. Initializing pixel array values is the
6109 % application's responsibility.
6111 % Performance is maximized if the selected region is part of one row, or
6112 % one or more full rows, since then there is opportunity to access the
6113 % pixels in-place (without a copy) if the image is in RAM, or in a
6114 % memory-mapped file. The returned pointer should *never* be deallocated
6117 % Pixels accessed via the returned pointer represent a simple array of type
6118 % PixelPacket. If the image type is CMYK or the storage class is PseudoClass,
6119 % call GetAuthenticIndexQueue() after invoking GetAuthenticPixels() to obtain
6120 % the black color component or the colormap indexes (of type IndexPacket)
6121 % corresponding to the region. Once the PixelPacket (and/or IndexPacket)
6122 % array has been updated, the changes must be saved back to the underlying
6123 % image using SyncAuthenticPixels() or they may be lost.
6125 % Deprecated, replace with:
6127 % QueueAuthenticPixels(image,x,y,columns,rows,&image->exception);
6129 % The format of the SetImagePixels() method is:
6131 % PixelPacket *SetImagePixels(Image *image,const ssize_t x,const ssize_t y,
6132 % const size_t columns,const size_t rows)
6134 % A description of each parameter follows:
6136 % o pixels: SetImagePixels returns a pointer to the pixels if they are
6137 % transferred, otherwise a NULL is returned.
6139 % o image: the image.
6141 % o x,y,columns,rows: These values define the perimeter of a region of
6145 MagickExport PixelPacket *SetImagePixels(Image *image,const ssize_t x,const ssize_t y,
6146 const size_t columns,const size_t rows)
6148 return(QueueAuthenticPixels(image,x,y,columns,rows,&image->exception));
6152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6156 % S e t M a g i c k R e g i s t r y %
6160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6162 % SetMagickRegistry() sets a blob into the registry and returns a unique ID.
6163 % If an error occurs, -1 is returned.
6165 % The format of the SetMagickRegistry method is:
6167 % ssize_t SetMagickRegistry(const RegistryType type,const void *blob,
6168 % const size_t length,ExceptionInfo *exception)
6170 % A description of each parameter follows:
6172 % o type: the registry type.
6174 % o blob: the address of a Binary Large OBject.
6176 % o length: For a registry type of ImageRegistryType use sizeof(Image)
6177 % otherise the blob length in number of bytes.
6179 % o exception: return any errors or warnings in this structure.
6182 MagickExport ssize_t SetMagickRegistry(const RegistryType type,const void *blob,
6183 const size_t magick_unused(length),ExceptionInfo *exception)
6194 (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double) id);
6195 status=SetImageRegistry(type,key,blob,exception);
6196 if (status == MagickFalse)
6202 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6206 % S e t M o n i t o r H a n d l e r %
6210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6212 % SetMonitorHandler() sets the monitor handler to the specified method
6213 % and returns the previous monitor handler.
6215 % The format of the SetMonitorHandler method is:
6217 % MonitorHandler SetMonitorHandler(MonitorHandler handler)
6219 % A description of each parameter follows:
6221 % o handler: Specifies a pointer to a method to handle monitors.
6225 MagickExport MonitorHandler GetMonitorHandler(void)
6227 return(monitor_handler);
6230 MagickExport MonitorHandler SetMonitorHandler(MonitorHandler handler)
6235 previous_handler=monitor_handler;
6236 monitor_handler=handler;
6237 return(previous_handler);
6241 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6245 % S h i f t I m a g e L i s t %
6249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6251 % ShiftImageList() removes an image from the beginning of the list.
6253 % Deprecated, replace with:
6255 % RemoveFirstImageFromList(images);
6257 % The format of the ShiftImageList method is:
6259 % Image *ShiftImageList(Image **images)
6261 % A description of each parameter follows:
6263 % o images: the image list.
6266 MagickExport Image *ShiftImageList(Image **images)
6268 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
6269 return(RemoveFirstImageFromList(images));
6273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6283 % SizeBlob() returns the current length of the image file or blob.
6285 % Deprecated, replace with:
6287 % GetBlobSize(image);
6289 % The format of the SizeBlob method is:
6291 % off_t SizeBlob(Image *image)
6293 % A description of each parameter follows:
6295 % o size: Method SizeBlob returns the current length of the image file
6298 % o image: the image.
6301 MagickExport MagickOffsetType SizeBlob(Image *image)
6303 if (image->debug != MagickFalse)
6304 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.3");
6305 return((MagickOffsetType) GetBlobSize(image));
6309 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6313 % S p l i c e I m a g e L i s t %
6317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6319 % SpliceImageList() removes the images designated by offset and length from
6320 % the list and replaces them with the specified list.
6322 % The format of the SpliceImageList method is:
6324 % Image *SpliceImageList(Image *images,const ssize_t offset,
6325 % const size_t length,const Image *splices,
6326 % ExceptionInfo *exception)
6328 % A description of each parameter follows:
6330 % o images: the image list.
6332 % o offset: the position within the list.
6334 % o length: the length of the image list to remove.
6336 % o splice: Replace the removed image list with this list.
6338 % o exception: return any errors or warnings in this structure.
6341 MagickExport Image *SpliceImageList(Image *images,const ssize_t offset,
6342 const size_t length,const Image *splices,ExceptionInfo *exception)
6350 if (images->debug != MagickFalse)
6351 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
6352 clone=CloneImageList(splices,exception);
6353 while (GetPreviousImageInList(images) != (Image *) NULL)
6354 images=GetPreviousImageInList(images);
6355 for (i=0; i < offset; i++)
6357 if (GetNextImageInList(images) == (Image *) NULL)
6358 return((Image *) NULL);
6359 images=GetNextImageInList(images);
6361 (void) SpliceImageIntoList(&images,length,clone);
6366 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6374 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6376 % Strip() strips any whitespace or quotes from the beginning and end of a
6377 % string of characters.
6379 % The format of the Strip method is:
6381 % void Strip(char *message)
6383 % A description of each parameter follows:
6385 % o message: Specifies an array of characters.
6388 MagickExport void Strip(char *message)
6394 assert(message != (char *) NULL);
6395 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
6396 if (*message == '\0')
6398 if (strlen(message) == 1)
6401 while (isspace((int) ((unsigned char) *p)) != 0)
6403 if ((*p == '\'') || (*p == '"'))
6405 q=message+strlen(message)-1;
6406 while ((isspace((int) ((unsigned char) *q)) != 0) && (q > p))
6409 if ((*q == '\'') || (*q == '"'))
6411 (void) CopyMagickMemory(message,p,(size_t) (q-p+1));
6412 message[q-p+1]='\0';
6416 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6420 % S y n c C a c h e V i e w %
6424 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6426 % SyncCacheView() saves the cache view pixels to the in-memory or disk
6427 % cache. It returns MagickTrue if the pixel region is synced, otherwise
6430 % Deprecated, replace with:
6432 % SyncCacheViewAuthenticPixels(cache_view,GetCacheViewException(cache_view));
6434 % The format of the SyncCacheView method is:
6436 % MagickBooleanType SyncCacheView(CacheView *cache_view)
6438 % A description of each parameter follows:
6440 % o cache_view: the cache view.
6443 MagickExport MagickBooleanType SyncCacheView(CacheView *cache_view)
6448 status=SyncCacheViewAuthenticPixels(cache_view,
6449 GetCacheViewException(cache_view));
6454 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6458 % S y n c C a c h e V i e w P i x e l s %
6462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6464 % SyncCacheViewPixels() saves the cache view pixels to the in-memory
6465 % or disk cache. It returns MagickTrue if the pixel region is flushed,
6466 % otherwise MagickFalse.
6468 % Deprecated, replace with:
6470 % SyncCacheViewAuthenticPixels(cache_view,GetCacheViewException(cache_view));
6472 % The format of the SyncCacheViewPixels method is:
6474 % MagickBooleanType SyncCacheViewPixels(CacheView *cache_view)
6476 % A description of each parameter follows:
6478 % o cache_view: the cache view.
6480 % o exception: return any errors or warnings in this structure.
6483 MagickExport MagickBooleanType SyncCacheViewPixels(CacheView *cache_view)
6488 status=SyncCacheViewAuthenticPixels(cache_view,
6489 GetCacheViewException(cache_view));
6494 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6498 % S y n c I m a g e P i x e l s %
6502 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6504 % SyncImagePixels() saves the image pixels to the in-memory or disk cache.
6505 % The method returns MagickTrue if the pixel region is synced, otherwise
6508 % Deprecated, replace with:
6510 % SyncAuthenticPixels(image,&image->exception);
6512 % The format of the SyncImagePixels() method is:
6514 % MagickBooleanType SyncImagePixels(Image *image)
6516 % A description of each parameter follows:
6518 % o image: the image.
6521 MagickExport MagickBooleanType SyncImagePixels(Image *image)
6523 return(SyncAuthenticPixels(image,&image->exception));
6527 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6531 % T e m p o r a r y F i l e n a m e %
6535 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6537 % TemporaryFilename() replaces the contents of path by a unique path name.
6539 % The format of the TemporaryFilename method is:
6541 % void TemporaryFilename(char *path)
6543 % A description of each parameter follows.
6545 % o path: Specifies a pointer to an array of characters. The unique path
6546 % name is returned in this array.
6549 MagickExport void TemporaryFilename(char *path)
6551 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
6552 (void) AcquireUniqueFilename(path);
6553 (void) RelinquishUniqueFileResource(path);
6557 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6561 % T h r e s h o l d I m a g e %
6565 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6567 % ThresholdImage() changes the value of individual pixels based on
6568 % the intensity of each pixel compared to threshold. The result is a
6569 % high-contrast, two color image.
6571 % The format of the ThresholdImage method is:
6573 % unsigned int ThresholdImage(Image *image,const double threshold)
6575 % A description of each parameter follows:
6577 % o image: the image.
6579 % o threshold: Define the threshold value
6582 MagickExport unsigned int ThresholdImage(Image *image,const double threshold)
6584 #define ThresholdImageTag "Threshold/Image"
6595 assert(image != (Image *) NULL);
6596 assert(image->signature == MagickSignature);
6597 if (image->debug != MagickFalse)
6598 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6599 if (image->debug != MagickFalse)
6600 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.7");
6601 if (!AcquireImageColormap(image,2))
6602 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
6603 "UnableToThresholdImage");
6604 for (y=0; y < (ssize_t) image->rows; y++)
6606 register IndexPacket
6612 register PixelPacket
6615 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
6616 if (q == (PixelPacket *) NULL)
6618 indexes=GetAuthenticIndexQueue(image);
6619 for (x=0; x < (ssize_t) image->columns; x++)
6621 index=(IndexPacket) ((MagickRealType) PixelIntensityToQuantum(q) <=
6623 SetIndexPixelComponent(indexes+x,index);
6624 SetRGBOPixelComponents(q,image->colormap+(ssize_t) index);
6627 if (!SyncAuthenticPixels(image,&image->exception))
6634 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6638 % T h r e s h o l d I m a g e C h a n n e l %
6642 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6644 % ThresholdImageChannel() changes the value of individual pixels based on
6645 % the intensity of each pixel channel. The result is a high-contrast image.
6647 % The format of the ThresholdImageChannel method is:
6649 % unsigned int ThresholdImageChannel(Image *image,const char *threshold)
6651 % A description of each parameter follows:
6653 % o image: the image.
6655 % o threshold: define the threshold values.
6658 MagickExport unsigned int ThresholdImageChannel(Image *image,
6659 const char *threshold)
6661 #define ThresholdImageTag "Threshold/Image"
6681 assert(image != (Image *) NULL);
6682 assert(image->signature == MagickSignature);
6683 if (image->debug != MagickFalse)
6684 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6685 if (threshold == (const char *) NULL)
6687 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
6688 return(MagickFalse);
6689 flags=ParseGeometry(threshold,&geometry_info);
6690 pixel.red=geometry_info.rho;
6691 if (flags & SigmaValue)
6692 pixel.green=geometry_info.sigma;
6694 pixel.green=pixel.red;
6695 if (flags & XiValue)
6696 pixel.blue=geometry_info.xi;
6698 pixel.blue=pixel.red;
6699 if (flags & PsiValue)
6700 pixel.opacity=geometry_info.psi;
6702 pixel.opacity=(MagickRealType) OpaqueOpacity;
6703 if (flags & PercentValue)
6705 pixel.red*=QuantumRange/100.0f;
6706 pixel.green*=QuantumRange/100.0f;
6707 pixel.blue*=QuantumRange/100.0f;
6708 pixel.opacity*=QuantumRange/100.0f;
6710 if (!(flags & SigmaValue))
6712 if (!AcquireImageColormap(image,2))
6713 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
6714 "UnableToThresholdImage");
6716 (void) GetImageDynamicThreshold(image,2.0,2.0,&pixel,&image->exception);
6718 for (y=0; y < (ssize_t) image->rows; y++)
6720 register IndexPacket
6726 register PixelPacket
6729 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
6730 if (q == (PixelPacket *) NULL)
6732 indexes=GetAuthenticIndexQueue(image);
6733 if (IsMagickGray(&pixel) != MagickFalse)
6734 for (x=0; x < (ssize_t) image->columns; x++)
6736 index=(IndexPacket) ((MagickRealType)
6737 PixelIntensityToQuantum(q) <= pixel.red ? 0 : 1);
6738 SetIndexPixelComponent(indexes+x,index);
6739 SetRedPixelComponent(q,image->colormap[(ssize_t) index].red);
6740 SetGreenPixelComponent(q,image->colormap[(ssize_t) index].green);
6741 SetBluePixelComponent(q,image->colormap[(ssize_t) index].blue);
6745 for (x=0; x < (ssize_t) image->columns; x++)
6747 SetRedPixelComponent(q,(MagickRealType) q->red <= pixel.red
6748 ? 0 : QuantumRange);
6749 SetGreenPixelComponent(q,(MagickRealType) q->green <= pixel.green
6750 ? 0 : QuantumRange);
6751 SetBluePixelComponent(q,(MagickRealType) q->blue <= pixel.blue
6752 ? 0 : QuantumRange);
6753 SetOpacityPixelComponent(q,(MagickRealType) q->opacity <= pixel.opacity
6754 ? 0 : QuantumRange);
6757 if (!SyncAuthenticPixels(image,&image->exception))
6764 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6768 + T r a n s f o r m C o l o r s p a c e %
6772 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6774 % TransformColorspace() converts the image to a specified colorspace.
6775 % If the image is already in the requested colorspace, no work is performed.
6776 % Note that the current colorspace is stored in the image colorspace member.
6777 % The transformation matrices are not necessarily the standard ones: the
6778 % weights are rescaled to normalize the range of the transformed values to
6779 % be [0..QuantumRange].
6781 % Deprecated, replace with:
6783 % TransformImageColorspace(image,colorspace);
6785 % The format of the TransformColorspace method is:
6787 % unsigned int (void) TransformColorspace(Image *image,
6788 % const ColorspaceType colorspace)
6790 % A description of each parameter follows:
6792 % o image: the image to transform
6794 % o colorspace: the desired colorspace.
6797 MagickExport unsigned int TransformColorspace(Image *image,
6798 const ColorspaceType colorspace)
6800 assert(image != (Image *) NULL);
6801 assert(image->signature == MagickSignature);
6802 if (image->debug != MagickFalse)
6803 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.6");
6804 return(TransformImageColorspace(image,colorspace));
6808 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6812 % T r a n s f o r m H S L %
6816 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6818 % TransformHSL() converts a (red, green, blue) to a (hue, saturation,
6819 % lightness) triple.
6821 % The format of the TransformHSL method is:
6823 % void TransformHSL(const Quantum red,const Quantum green,
6824 % const Quantum blue,double *hue,double *saturation,double *lightness)
6826 % A description of each parameter follows:
6828 % o red, green, blue: A Quantum value representing the red, green, and
6829 % blue component of a pixel..
6831 % o hue, saturation, lightness: A pointer to a double value representing a
6832 % component of the HSL color space.
6836 static inline double MagickMin(const double x,const double y)
6843 MagickExport void TransformHSL(const Quantum red,const Quantum green,
6844 const Quantum blue,double *hue,double *saturation,double *lightness)
6855 Convert RGB to HSL colorspace.
6857 assert(hue != (double *) NULL);
6858 assert(saturation != (double *) NULL);
6859 assert(lightness != (double *) NULL);
6861 g=QuantumScale*green;
6862 b=QuantumScale*blue;
6863 max=MagickMax(r,MagickMax(g,b));
6864 min=MagickMin(r,MagickMin(g,b));
6867 *lightness=(double) ((min+max)/2.0);
6871 *saturation=(double) (delta/((*lightness < 0.5) ? (min+max) :
6874 *hue=(double) (g == min ? 5.0+(max-b)/delta : 1.0-(max-g)/delta);
6877 *hue=(double) (b == min ? 1.0+(max-r)/delta : 3.0-(max-b)/delta);
6879 *hue=(double) (r == min ? 3.0+(max-g)/delta : 5.0-(max-r)/delta);
6884 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6888 % T r a n s l a t e T e x t %
6892 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6894 % TranslateText() replaces any embedded formatting characters with the
6895 % appropriate image attribute and returns the translated text.
6897 % Deprecated, replace with:
6899 % InterpretImageProperties(image_info,image,embed_text);
6901 % The format of the TranslateText method is:
6903 % char *TranslateText(const ImageInfo *image_info,Image *image,
6904 % const char *embed_text)
6906 % A description of each parameter follows:
6908 % o image_info: the image info.
6910 % o image: the image.
6912 % o embed_text: the address of a character string containing the embedded
6913 % formatting characters.
6916 MagickExport char *TranslateText(const ImageInfo *image_info,Image *image,
6917 const char *embed_text)
6919 assert(image != (Image *) NULL);
6920 assert(image->signature == MagickSignature);
6921 if (image->debug != MagickFalse)
6922 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.2.6");
6923 return(InterpretImageProperties(image_info,image,embed_text));
6927 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6931 % T r a n s p a r e n t I m a g e %
6935 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6937 % TransparentImage() changes the opacity value associated with any pixel
6938 % that matches color to the value defined by opacity.
6940 % By default color must match a particular pixel color exactly. However,
6941 % in many cases two colors may differ by a small amount. Fuzz defines
6942 % how much tolerance is acceptable to consider two colors as the same.
6943 % For example, set fuzz to 10 and the color red at intensities of 100 and
6944 % 102 respectively are now interpreted as the same color.
6946 % The format of the TransparentImage method is:
6948 % MagickBooleanType TransparentImage(Image *image,
6949 % const PixelPacket target,const Quantum opacity)
6951 % A description of each parameter follows:
6953 % o image: the image.
6955 % o target: the RGB value of the target color.
6957 % o opacity: the replacement opacity value.
6960 MagickExport MagickBooleanType TransparentImage(Image *image,
6961 const PixelPacket target,const Quantum opacity)
6963 #define TransparentImageTag "Transparent/Image"
6972 Make image color transparent.
6974 assert(image != (Image *) NULL);
6975 assert(image->signature == MagickSignature);
6976 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v6.1.0");
6977 if (image->debug != MagickFalse)
6978 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6979 if (image->matte == MagickFalse)
6980 (void) SetImageAlphaChannel(image,OpaqueAlphaChannel);
6981 for (y=0; y < (ssize_t) image->rows; y++)
6986 register PixelPacket
6989 q=GetAuthenticPixels(image,0,y,image->columns,1,&image->exception);
6990 if (q == (PixelPacket *) NULL)
6992 for (x=0; x < (ssize_t) image->columns; x++)
6994 if (IsColorSimilar(image,q,&target) != MagickFalse)
6998 if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
7000 proceed=SetImageProgress(image,TransparentImageTag,(MagickOffsetType) y,
7002 if (proceed == MagickFalse)
7009 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7013 % U n s h i f t I m a g e L i s t %
7017 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7019 % UnshiftImageList() adds the image to the beginning of the list.
7021 % Deprecated, replace with:
7023 % PrependImageToList(images,CloneImageList(image,exception));
7025 % The format of the UnshiftImageList method is:
7027 % unsigned int UnshiftImageList(Image *images,const Image *image,
7028 % ExceptionInfo *exception)
7030 % A description of each parameter follows:
7032 % o images: the image list.
7034 % o image: the image.
7036 % o exception: return any errors or warnings in this structure.
7039 MagickExport unsigned int UnshiftImageList(Image **images,const Image *image,
7040 ExceptionInfo *exception)
7042 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.5.2");
7043 PrependImageToList(images,CloneImageList(image,exception));
7048 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7052 + V a l i d a t e C o l o r m a p I n d e x %
7056 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7058 % ValidateColormapIndex() validates the colormap index. If the index does
7059 % not range from 0 to the number of colors in the colormap an exception
7060 % issued and 0 is returned.
7062 % Deprecated, replace with:
7064 % ConstrainColormapIndex(image,index);
7066 % The format of the ValidateColormapIndex method is:
7068 % IndexPacket ValidateColormapIndex(Image *image,const unsigned int index)
7070 % A description of each parameter follows:
7072 % o index: Method ValidateColormapIndex returns colormap index if it is
7073 % valid other an exception issued and 0 is returned.
7075 % o image: the image.
7077 % o index: This integer is the colormap index.
7080 MagickExport IndexPacket ValidateColormapIndex(Image *image,
7083 if (image->debug != MagickFalse)
7084 (void) LogMagickEvent(DeprecateEvent,GetMagickModule(),"last use: v5.4.4");
7085 return(ConstrainColormapIndex(image,index));
7089 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7093 % Z o o m I m a g e %
7097 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7099 % ZoomImage() creates a new image that is a scaled size of an existing one.
7100 % It allocates the memory necessary for the new Image structure and returns a
7101 % pointer to the new image. The Point filter gives fast pixel replication,
7102 % Triangle is equivalent to bi-linear interpolation, and Mitchel giver slower,
7103 % very high-quality results. See Graphic Gems III for details on this
7106 % The filter member of the Image structure specifies which image filter to
7107 % use. Blur specifies the blur factor where > 1 is blurry, < 1 is sharp.
7109 % The format of the ZoomImage method is:
7111 % Image *ZoomImage(const Image *image,const size_t columns,
7112 % const size_t rows,ExceptionInfo *exception)
7114 % A description of each parameter follows:
7116 % o image: the image.
7118 % o columns: An integer that specifies the number of columns in the zoom
7121 % o rows: An integer that specifies the number of rows in the scaled
7124 % o exception: return any errors or warnings in this structure.
7127 MagickExport Image *ZoomImage(const Image *image,const size_t columns,
7128 const size_t rows,ExceptionInfo *exception)
7133 assert(image != (const Image *) NULL);
7134 assert(image->signature == MagickSignature);
7135 if (image->debug != MagickFalse)
7136 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
7137 assert(exception != (ExceptionInfo *) NULL);
7138 assert(exception->signature == MagickSignature);
7139 zoom_image=ResizeImage(image,columns,rows,image->filter,image->blur,