2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % M M AAA GGGG IIIII CCCC K K %
7 % MM MM A A G I C K K %
8 % M M M AAAAA G GGG I C KKK %
9 % M M A A G G I C K K %
10 % M M A A GGGG IIIII CCCC K K %
13 % Methods to Read or List ImageMagick Image formats %
21 % Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization %
22 % dedicated to making software imaging solutions freely available. %
24 % You may not use this file except in compliance with the License. You may %
25 % obtain a copy of the License at %
27 % http://www.imagemagick.org/script/license.php %
29 % Unless required by applicable law or agreed to in writing, software %
30 % distributed under the License is distributed on an "AS IS" BASIS, %
31 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
32 % See the License for the specific language governing permissions and %
33 % limitations under the License. %
35 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 #include "magick/studio.h"
44 #include "magick/blob.h"
45 #include "magick/cache.h"
46 #include "magick/coder.h"
47 #include "magick/client.h"
48 #include "magick/coder.h"
49 #include "magick/configure.h"
50 #include "magick/constitute.h"
51 #include "magick/delegate.h"
52 #include "magick/draw.h"
53 #include "magick/exception.h"
54 #include "magick/exception-private.h"
55 #include "magick/locale_.h"
56 #include "magick/log.h"
57 #include "magick/magic.h"
58 #include "magick/magick.h"
59 #include "magick/memory_.h"
60 #include "magick/mime.h"
61 #include "magick/module.h"
62 #if defined(__WINDOWS__)
63 # include "magick/nt-feature.h"
65 #include "magick/random_.h"
66 #include "magick/registry.h"
67 #include "magick/resource_.h"
68 #include "magick/policy.h"
69 #include "magick/semaphore.h"
70 #include "magick/signature-private.h"
71 #include "magick/splay-tree.h"
72 #include "magick/string_.h"
73 #include "magick/string-private.h"
74 #include "magick/thread_.h"
75 #include "magick/thread-private.h"
76 #include "magick/token.h"
77 #include "magick/utility.h"
78 #include "magick/xwindow-private.h"
83 #if !defined(MAGICKCORE_RETSIGTYPE)
84 # define MAGICKCORE_RETSIGTYPE void
87 # define SIG_DFL ((SignalHandler *) 0)
90 # define SIG_ERR ((SignalHandler *) -1)
99 typedef MAGICKCORE_RETSIGTYPE
106 *magick_semaphore = (SemaphoreInfo *) NULL;
109 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
112 *magick_list = (SplayTreeInfo *) NULL;
114 static volatile MagickBooleanType
115 instantiate_magick = MagickFalse; /* double-checked locking pattern */
118 Forward declarations.
120 static MagickBooleanType
121 InitializeMagickList(ExceptionInfo *);
124 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
128 + G e t I m a g e D e c o d e r %
132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
134 % GetImageDecoder() returns the image decoder.
136 % The format of the GetImageDecoder method is:
138 % DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
140 % A description of each parameter follows:
142 % o magick_info: The magick info.
145 MagickExport DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
147 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
148 assert(magick_info != (MagickInfo *) NULL);
149 assert(magick_info->signature == MagickSignature);
150 return(magick_info->decoder);
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
158 + G e t I m a g e E n c o d e r %
162 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164 % GetImageEncoder() returns the image encoder.
166 % The format of the GetImageEncoder method is:
168 % EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
170 % A description of each parameter follows:
172 % o magick_info: The magick info.
175 MagickExport EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
177 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
178 assert(magick_info != (MagickInfo *) NULL);
179 assert(magick_info->signature == MagickSignature);
180 return(magick_info->encoder);
184 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
188 + G e t I m a g e M a g i c k %
192 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
194 % GetImageMagick() searches for an image format that matches the specified
195 % magick string. If one is found, MagickTrue is returned otherwise
198 % The format of the GetImageMagick method is:
200 % MagickBooleanType GetImageMagick(const unsigned char *magick,
201 % const size_t length,char *format)
203 % A description of each parameter follows:
205 % o magick: the image format we are searching for.
207 % o length: the length of the binary string.
209 % o format: the image format as determined by the magick bytes.
212 MagickExport MagickBooleanType GetImageMagick(const unsigned char *magick,
213 const size_t length,char *format)
221 register const MagickInfo
224 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
225 assert(magick != (const unsigned char *) NULL);
226 exception=AcquireExceptionInfo();
227 p=GetMagickInfo("*",exception);
228 exception=DestroyExceptionInfo(exception);
229 if (p == (const MagickInfo *) NULL)
232 LockSemaphoreInfo(magick_semaphore);
233 ResetSplayTreeIterator(magick_list);
234 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
235 while (p != (const MagickInfo *) NULL)
237 if ((p->magick != (IsImageFormatHandler *) NULL) &&
238 (p->magick(magick,length) != 0))
241 (void) CopyMagickString(format,p->name,MaxTextExtent);
244 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
246 UnlockSemaphoreInfo(magick_semaphore);
251 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
255 + G e t M a g i c k A d j o i n %
259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
261 % GetMagickAdjoin() returns MagickTrue if the magick adjoin is MagickTrue.
263 % The format of the GetMagickAdjoin method is:
265 % MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
267 % A description of each parameter follows:
269 % o magick_info: The magick info.
272 MagickExport MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
274 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
275 assert(magick_info != (MagickInfo *) NULL);
276 assert(magick_info->signature == MagickSignature);
277 return(magick_info->adjoin);
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
285 + G e t M a g i c k B l o b S u p p o r t %
289 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
291 % GetMagickBlobSupport() returns MagickTrue if the magick supports blobs.
293 % The format of the GetMagickBlobSupport method is:
295 % MagickBooleanType GetMagickBlobSupport(const MagickInfo *magick_info)
297 % A description of each parameter follows:
299 % o magick_info: The magick info.
302 MagickExport MagickBooleanType GetMagickBlobSupport(
303 const MagickInfo *magick_info)
305 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
306 assert(magick_info != (MagickInfo *) NULL);
307 assert(magick_info->signature == MagickSignature);
308 return(magick_info->blob_support);
312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
316 + G e t M a g i c k D e s c r i p t i o n %
320 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
322 % GetMagickDescription() returns the magick description.
324 % The format of the GetMagickDescription method is:
326 % const char *GetMagickDescription(const MagickInfo *magick_info)
328 % A description of each parameter follows:
330 % o magick_info: The magick info.
333 MagickExport const char *GetMagickDescription(const MagickInfo *magick_info)
335 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
336 assert(magick_info != (MagickInfo *) NULL);
337 assert(magick_info->signature == MagickSignature);
338 return(magick_info->description);
342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
346 + G e t M a g i c k E n d i a n S u p p o r t %
350 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352 % GetMagickEndianSupport() returns the MagickTrue if the coder respects
353 % endianness other than MSBEndian.
355 % The format of the GetMagickEndianSupport method is:
357 % MagickBooleanType GetMagickEndianSupport(const MagickInfo *magick_info)
359 % A description of each parameter follows:
361 % o magick_info: The magick info.
364 MagickExport MagickBooleanType GetMagickEndianSupport(
365 const MagickInfo *magick_info)
367 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
368 assert(magick_info != (MagickInfo *) NULL);
369 assert(magick_info->signature == MagickSignature);
370 return(magick_info->endian_support);
374 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
378 + G e t M a g i c k I n f o %
382 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
384 % GetMagickInfo() returns a pointer MagickInfo structure that matches
385 % the specified name. If name is NULL, the head of the image format list
388 % The format of the GetMagickInfo method is:
390 % const MagickInfo *GetMagickInfo(const char *name,Exception *exception)
392 % A description of each parameter follows:
394 % o name: the image format we are looking for.
396 % o exception: return any errors or warnings in this structure.
399 MagickExport const MagickInfo *GetMagickInfo(const char *name,
400 ExceptionInfo *exception)
402 register const MagickInfo
405 assert(exception != (ExceptionInfo *) NULL);
406 if ((magick_list == (SplayTreeInfo *) NULL) ||
407 (instantiate_magick == MagickFalse))
408 if (InitializeMagickList(exception) == MagickFalse)
409 return((const MagickInfo *) NULL);
410 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
412 #if defined(MAGICKCORE_MODULES_SUPPORT)
413 if (LocaleCompare(name,"*") == 0)
414 (void) OpenModules(exception);
416 LockSemaphoreInfo(magick_semaphore);
417 ResetSplayTreeIterator(magick_list);
418 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
419 UnlockSemaphoreInfo(magick_semaphore);
425 LockSemaphoreInfo(magick_semaphore);
426 ResetSplayTreeIterator(magick_list);
427 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
428 while (p != (const MagickInfo *) NULL)
430 if (LocaleCompare(p->name,name) == 0)
432 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
434 #if defined(MAGICKCORE_MODULES_SUPPORT)
435 if (p == (const MagickInfo *) NULL)
438 (void) OpenModule(name,exception);
439 ResetSplayTreeIterator(magick_list);
440 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
441 while (p != (const MagickInfo *) NULL)
443 if (LocaleCompare(p->name,name) == 0)
445 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
449 UnlockSemaphoreInfo(magick_semaphore);
454 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
458 + G e t M a g i c k I n f o L i s t %
462 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
464 % GetMagickInfoList() returns any image formats that match the specified
467 % The format of the GetMagickInfoList function is:
469 % const MagickInfo **GetMagickInfoList(const char *pattern,
470 % unsigned long *number_formats,ExceptionInfo *exception)
472 % A description of each parameter follows:
474 % o pattern: Specifies a pointer to a text string containing a pattern.
476 % o number_formats: This integer returns the number of formats in the list.
478 % o exception: return any errors or warnings in this structure.
482 #if defined(__cplusplus) || defined(c_plusplus)
486 static int MagickInfoCompare(const void *x,const void *y)
492 p=(const MagickInfo **) x,
493 q=(const MagickInfo **) y;
494 return(LocaleCompare((*p)->name,(*q)->name));
497 #if defined(__cplusplus) || defined(c_plusplus)
501 MagickExport const MagickInfo **GetMagickInfoList(const char *pattern,
502 unsigned long *number_formats,ExceptionInfo *exception)
507 register const MagickInfo
514 Allocate magick list.
516 assert(pattern != (char *) NULL);
517 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
518 assert(number_formats != (unsigned long *) NULL);
520 p=GetMagickInfo("*",exception);
521 if (p == (const MagickInfo *) NULL)
522 return((const MagickInfo **) NULL);
523 formats=(const MagickInfo **) AcquireQuantumMemory((size_t)
524 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
525 if (formats == (const MagickInfo **) NULL)
526 return((const MagickInfo **) NULL);
528 Generate magick list.
530 LockSemaphoreInfo(magick_semaphore);
531 ResetSplayTreeIterator(magick_list);
532 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
533 for (i=0; p != (const MagickInfo *) NULL; )
535 if ((p->stealth == MagickFalse) &&
536 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
538 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
540 UnlockSemaphoreInfo(magick_semaphore);
541 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare);
542 formats[i]=(MagickInfo *) NULL;
543 *number_formats=(unsigned long) i;
548 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
552 + G e t M a g i c k L i s t %
556 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
558 % GetMagickList() returns any image formats that match the specified pattern.
560 % The format of the GetMagickList function is:
562 % char **GetMagickList(const char *pattern,unsigned long *number_formats,
563 % ExceptionInfo *exception)
565 % A description of each parameter follows:
567 % o pattern: Specifies a pointer to a text string containing a pattern.
569 % o number_formats: This integer returns the number of formats in the list.
571 % o exception: return any errors or warnings in this structure.
575 #if defined(__cplusplus) || defined(c_plusplus)
579 static int MagickCompare(const void *x,const void *y)
587 return(LocaleCompare(*p,*q));
590 #if defined(__cplusplus) || defined(c_plusplus)
594 MagickExport char **GetMagickList(const char *pattern,
595 unsigned long *number_formats,ExceptionInfo *exception)
600 register const MagickInfo
607 Allocate magick list.
609 assert(pattern != (char *) NULL);
610 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
611 assert(number_formats != (unsigned long *) NULL);
613 p=GetMagickInfo("*",exception);
614 if (p == (const MagickInfo *) NULL)
615 return((char **) NULL);
616 formats=(char **) AcquireQuantumMemory((size_t)
617 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
618 if (formats == (char **) NULL)
619 return((char **) NULL);
620 LockSemaphoreInfo(magick_semaphore);
621 ResetSplayTreeIterator(magick_list);
622 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
623 for (i=0; p != (const MagickInfo *) NULL; )
625 if ((p->stealth == MagickFalse) &&
626 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
627 formats[i++]=ConstantString(p->name);
628 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
630 UnlockSemaphoreInfo(magick_semaphore);
631 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare);
632 formats[i]=(char *) NULL;
633 *number_formats=(unsigned long) i;
638 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
642 % G e t M a g i c k P r e c i s i o n %
646 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
648 % GetMagickPrecision() returns the maximum number of significant digits to be
651 % The format of the GetMagickPrecision method is:
653 % int GetMagickPrecision(void)
656 MagickExport int GetMagickPrecision(void)
658 #define MagickPrecision 6
660 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
661 if (SetMagickPrecision(0) == 0)
666 (void) SetMagickPrecision(MagickPrecision);
667 limit=GetEnvironmentValue("MAGICK_PRECISION");
668 if (limit == (char *) NULL)
669 limit=GetPolicyValue("precision");
670 if (limit != (char *) NULL)
672 (void) SetMagickPrecision(StringToInteger(limit));
673 limit=DestroyString(limit);
676 return(SetMagickPrecision(0));
680 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
684 + G e t M a g i c k R a w S u p p o r t %
688 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
690 % GetMagickRawSupport() returns the MagickTrue if the coder is a raw format.
692 % The format of the GetMagickRawSupport method is:
694 % MagickBooleanType GetMagickRawSupport(const MagickInfo *magick_info)
696 % A description of each parameter follows:
698 % o magick_info: The magick info.
701 MagickExport MagickBooleanType GetMagickRawSupport(
702 const MagickInfo *magick_info)
704 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
705 assert(magick_info != (MagickInfo *) NULL);
706 assert(magick_info->signature == MagickSignature);
707 return(magick_info->raw);
711 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
715 + G e t M a g i c k S e e k a b l e S t r e a m %
719 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
721 % GetMagickSeekableStream() returns MagickTrue if the magick supports a
724 % The format of the GetMagickSeekableStream method is:
726 % MagickBooleanType GetMagickSeekableStream(const MagickInfo *magick_info)
728 % A description of each parameter follows:
730 % o magick_info: The magick info.
733 MagickExport MagickBooleanType GetMagickSeekableStream(
734 const MagickInfo *magick_info)
736 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
737 assert(magick_info != (MagickInfo *) NULL);
738 assert(magick_info->signature == MagickSignature);
739 return(magick_info->seekable_stream);
743 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
747 + G e t M a g i c k T h r e a d S u p p o r t %
751 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
753 % GetMagickThreadSupport() returns MagickTrue if the magick supports threads.
755 % The format of the GetMagickThreadSupport method is:
757 % MagickStatusType GetMagickThreadSupport(const MagickInfo *magick_info)
759 % A description of each parameter follows:
761 % o magick_info: The magick info.
764 MagickExport MagickStatusType GetMagickThreadSupport(
765 const MagickInfo *magick_info)
767 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
768 assert(magick_info != (MagickInfo *) NULL);
769 assert(magick_info->signature == MagickSignature);
770 return(magick_info->thread_support);
774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
778 + I n i t i a l i z e M a g i c k L i s t %
782 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
784 % InitializeMagickList() initializes the magick list.
786 % The format of the InitializeMagickList() method is:
788 % InitializeMagickList(Exceptioninfo *exception)
790 % A description of each parameter follows.
792 % o exception: return any errors or warnings in this structure.
796 static void *DestroyMagickNode(void *magick_info)
801 p=(MagickInfo *) magick_info;
802 if (p->name != (char *) NULL)
803 p->name=DestroyString(p->name);
804 if (p->description != (char *) NULL)
805 p->description=DestroyString(p->description);
806 if (p->version != (char *) NULL)
807 p->version=DestroyString(p->version);
808 if (p->note != (char *) NULL)
809 p->note=DestroyString(p->note);
810 if (p->module != (char *) NULL)
811 p->module=DestroyString(p->module);
812 return(RelinquishMagickMemory(p));
815 static MagickBooleanType InitializeMagickList(ExceptionInfo *exception)
818 if ((magick_list == (SplayTreeInfo *) NULL) &&
819 (instantiate_magick == MagickFalse))
821 if (magick_semaphore == (SemaphoreInfo *) NULL)
822 AcquireSemaphoreInfo(&magick_semaphore);
823 LockSemaphoreInfo(magick_semaphore);
824 if ((magick_list == (SplayTreeInfo *) NULL) &&
825 (instantiate_magick == MagickFalse))
833 magick_list=NewSplayTree(CompareSplayTreeString,
834 (void *(*)(void *)) NULL,DestroyMagickNode);
835 if (magick_list == (SplayTreeInfo *) NULL)
836 ThrowFatalException(ResourceLimitFatalError,
837 "MemoryAllocationFailed");
838 magick_info=SetMagickInfo("ephemeral");
839 magick_info->stealth=MagickTrue;
840 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
841 if (status == MagickFalse)
842 ThrowFatalException(ResourceLimitFatalError,
843 "MemoryAllocationFailed");
844 magick_info=SetMagickInfo("clipmask");
845 magick_info->stealth=MagickTrue;
846 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
847 if (status == MagickFalse)
852 message=GetExceptionMessage(errno);
853 ThrowFatalException(ResourceLimitFatalError,
854 "MemoryAllocationFailed");
855 message=DestroyString(message);
857 #if defined(MAGICKCORE_MODULES_SUPPORT)
858 (void) GetModuleInfo((char *) NULL,exception);
860 #if !defined(MAGICKCORE_BUILD_MODULES)
861 RegisterStaticModules();
863 instantiate_magick=MagickTrue;
865 UnlockSemaphoreInfo(magick_semaphore);
867 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
871 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
875 + I s M a g i c k C o n f l i c t %
879 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
881 % IsMagickConflict() returns MagickTrue if the image format is not a valid
882 % image format or conflicts with a logical drive (.e.g. X:).
884 % The format of the IsMagickConflict method is:
886 % MagickBooleanType IsMagickConflict(const char *magick)
888 % A description of each parameter follows:
890 % o magick: Specifies the image format.
893 MagickExport MagickBooleanType IsMagickConflict(const char *magick)
904 assert(magick != (char *) NULL);
905 exception=AcquireExceptionInfo();
906 magick_info=GetMagickInfo(magick,exception);
907 delegate_info=GetDelegateInfo(magick,(char *) NULL,exception);
908 if (delegate_info == (const DelegateInfo *) NULL)
909 delegate_info=GetDelegateInfo((char *) NULL,magick,exception);
910 exception=DestroyExceptionInfo(exception);
911 if ((magick_info == (const MagickInfo *) NULL) &&
912 (delegate_info == (const DelegateInfo *) NULL))
914 #if defined(macintosh)
915 return(MACIsMagickConflict(magick));
917 return(VMSIsMagickConflict(magick));
918 #elif defined(__WINDOWS__)
919 return(NTIsMagickConflict(magick));
926 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
930 + L i s t M a g i c k I n f o %
934 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
936 % ListMagickInfo() lists the image formats to a file.
938 % The format of the ListMagickInfo method is:
940 % MagickBooleanType ListMagickInfo(FILE *file,ExceptionInfo *exception)
942 % A description of each parameter follows.
944 % o file: A file handle.
946 % o exception: return any errors or warnings in this structure.
949 MagickExport MagickBooleanType ListMagickInfo(FILE *file,
950 ExceptionInfo *exception)
964 if (file == (FILE *) NULL)
966 magick_info=GetMagickInfoList("*",&number_formats,exception);
967 if (magick_info == (const MagickInfo **) NULL)
969 ClearMagickException(exception);
970 #if !defined(MAGICKCORE_MODULES_SUPPORT)
971 (void) fprintf(file," Format Mode Description\n");
973 (void) fprintf(file," Format Module Mode Description\n");
975 (void) fprintf(file,"--------------------------------------------------------"
976 "-----------------------\n");
977 for (i=0; i < (long) number_formats; i++)
979 if (magick_info[i]->stealth != MagickFalse)
981 (void) fprintf(file,"%9s%c ",magick_info[i]->name != (char *) NULL ?
982 magick_info[i]->name : "",
983 magick_info[i]->blob_support != MagickFalse ? '*' : ' ');
984 #if defined(MAGICKCORE_MODULES_SUPPORT)
987 module[MaxTextExtent];
990 if (magick_info[i]->module != (char *) NULL)
991 (void) CopyMagickString(module,magick_info[i]->module,MaxTextExtent);
992 (void) ConcatenateMagickString(module," ",MaxTextExtent);
994 (void) fprintf(file,"%9s ",module);
997 (void) fprintf(file,"%c%c%c ",magick_info[i]->decoder ? 'r' : '-',
998 magick_info[i]->encoder ? 'w' : '-',magick_info[i]->encoder != NULL &&
999 magick_info[i]->adjoin != MagickFalse ? '+' : '-');
1000 if (magick_info[i]->description != (char *) NULL)
1001 (void) fprintf(file," %s",magick_info[i]->description);
1002 if (magick_info[i]->version != (char *) NULL)
1003 (void) fprintf(file," (%s)",magick_info[i]->version);
1004 (void) fprintf(file,"\n");
1005 if (magick_info[i]->note != (char *) NULL)
1010 text=StringToList(magick_info[i]->note);
1011 if (text != (char **) NULL)
1013 for (j=0; text[j] != (char *) NULL; j++)
1015 (void) fprintf(file," %s\n",text[j]);
1016 text[j]=DestroyString(text[j]);
1018 text=(char **) RelinquishMagickMemory(text);
1022 (void) fprintf(file,"\n* native blob support\n");
1023 (void) fprintf(file,"r read support\n");
1024 (void) fprintf(file,"w write support\n");
1025 (void) fprintf(file,"+ support for multiple images\n");
1026 (void) fflush(file);
1027 magick_info=(const MagickInfo **) RelinquishMagickMemory((void *)
1033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1037 % I s M a g i c k I n s t a n t i a t e d %
1041 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1043 % IsMagickInstantiated() returns MagickTrue if the ImageMagick environment
1044 % is currently instantiated: MagickCoreGenesis() has been called but
1045 % MagickDestroy() has not.
1047 % The format of the IsMagickInstantiated method is:
1049 % MagickBooleanType IsMagickInstantiated(void)
1052 MagickExport MagickBooleanType IsMagickInstantiated(void)
1054 return(instantiate_magick);
1058 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1062 + M a g i c k C o m p o n e n t G e n e s i s %
1066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1068 % MagickComponentGenesis() instantiates the magick component.
1070 % The format of the MagickComponentGenesis method is:
1072 % MagickBooleanType MagickComponentGenesis(void)
1075 MagickExport MagickBooleanType MagickComponentGenesis(void)
1077 AcquireSemaphoreInfo(&magick_semaphore);
1082 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1086 + M a g i c k C o m p o n e n t T e r m i n u s %
1090 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1092 % MagickComponentTerminus() destroys the magick component.
1094 % The format of the MagickComponentTerminus method is:
1096 % void MagickComponentTerminus(void)
1099 MagickExport void MagickComponentTerminus(void)
1101 if (magick_semaphore == (SemaphoreInfo *) NULL)
1102 AcquireSemaphoreInfo(&magick_semaphore);
1103 LockSemaphoreInfo(magick_semaphore);
1104 if (magick_list != (SplayTreeInfo *) NULL)
1105 magick_list=DestroySplayTree(magick_list);
1106 instantiate_magick=MagickFalse;
1107 UnlockSemaphoreInfo(magick_semaphore);
1108 DestroySemaphoreInfo(&magick_semaphore);
1112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1116 % M a g i c k C o r e G e n e s i s %
1120 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1122 % MagickCoreGenesis() initializes the MagickCore environment.
1124 % The format of the MagickCoreGenesis function is:
1126 % MagickCoreGenesis(const char *path,
1127 % const MagickBooleanType establish_signal_handlers)
1129 % A description of each parameter follows:
1131 % o path: the execution path of the current ImageMagick client.
1133 % o establish_signal_handlers: set to MagickTrue to use MagickCore's own
1134 % signal handlers for common signals.
1138 static SignalHandler *SetMagickSignalHandler(int signal_number,
1139 SignalHandler *handler)
1141 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1153 sigaddset(&mask,signal_number);
1154 sigprocmask(SIG_BLOCK,&mask,NULL);
1155 action.sa_mask=mask;
1156 action.sa_handler=handler;
1158 #if defined(SA_INTERRUPT)
1159 action.sa_flags|=SA_INTERRUPT;
1161 status=sigaction(signal_number,&action,&previous_action);
1164 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1165 return(previous_action.sa_handler);
1167 return(signal(signal_number,handler));
1171 static void MagickSignalHandler(int signal_number)
1173 #if !defined(MAGICKCORE_HAVE_SIGACTION)
1174 (void) signal(signal_number,SIG_IGN);
1176 AsynchronousResourceComponentTerminus();
1177 instantiate_magick=MagickFalse;
1178 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1179 #if defined(MAGICKCORE_HAVE_RAISE)
1180 if (signal_handlers[signal_number] != MagickSignalHandler)
1181 raise(signal_number);
1183 #if !defined(MAGICKCORE_HAVE__EXIT)
1184 exit(signal_number);
1187 if (signal_number == SIGHUP)
1188 exit(signal_number);
1190 #if defined(SIGINT) && !defined(__WINDOWS__)
1191 if (signal_number == SIGINT)
1192 exit(signal_number);
1194 #if defined(SIGTERM)
1195 if (signal_number == SIGTERM)
1196 exit(signal_number);
1198 _exit(signal_number);
1202 static SignalHandler *RegisterMagickSignalHandler(int signal_number)
1207 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1208 if (handler == SIG_ERR)
1210 if (handler != SIG_DFL)
1211 handler=SetMagickSignalHandler(signal_number,handler);
1213 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1214 "Register handler for signal: %d",signal_number);
1218 MagickExport void MagickCoreGenesis(const char *path,
1219 const MagickBooleanType establish_signal_handlers)
1223 execution_path[MaxTextExtent],
1224 filename[MaxTextExtent];
1227 Initialize the Magick environment.
1229 (void) setlocale(LC_ALL,"");
1230 (void) setlocale(LC_NUMERIC,"C");
1231 (void) SemaphoreComponentGenesis();
1232 (void) LogComponentGenesis();
1233 (void) LocaleComponentGenesis();
1234 (void) RandomComponentGenesis();
1235 events=GetEnvironmentValue("MAGICK_DEBUG");
1236 if (events != (char *) NULL)
1238 (void) SetLogEventMask(events);
1239 events=DestroyString(events);
1241 #if defined(__WINDOWS__)
1242 #if defined(_DEBUG) && !defined(__BORLANDC__) && !defined(__MINGW32__)
1243 if (IsEventLogging() != MagickFalse)
1248 debug=_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
1249 debug|=_CRTDBG_CHECK_ALWAYS_DF |_CRTDBG_DELAY_FREE_MEM_DF |
1250 _CRTDBG_LEAK_CHECK_DF;
1253 debug=_CrtSetDbgFlag(debug);
1254 _ASSERTE(_CrtCheckMemory());
1260 Set client name and execution path.
1262 (void) GetExecutionPath(execution_path,MaxTextExtent);
1263 if ((path != (const char *) NULL) && (*path != '\0'))
1264 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1265 GetPathComponent(execution_path,TailPath,filename);
1266 (void) SetClientName(filename);
1267 GetPathComponent(execution_path,HeadPath,execution_path);
1268 (void) SetClientPath(execution_path);
1269 if (establish_signal_handlers != MagickFalse)
1272 Set signal handlers.
1274 #if defined(SIGABRT)
1275 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1276 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1279 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1280 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1283 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1284 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1286 #if defined(SIGINT) && !defined(__WINDOWS__)
1287 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1288 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1290 #if defined(SIGQUIT)
1291 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1292 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1294 #if defined(SIGTERM)
1295 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1296 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1298 #if defined(SIGXCPU)
1299 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1300 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1302 #if defined(SIGXFSZ)
1303 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1304 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1308 Instantiate magick resources.
1310 (void) ConfigureComponentGenesis();
1311 (void) PolicyComponentGenesis();
1312 (void) CacheComponentGenesis();
1313 (void) RegistryComponentGenesis();
1314 (void) ResourceComponentGenesis();
1315 (void) CoderComponentGenesis();
1316 (void) MagickComponentGenesis();
1317 #if defined(MAGICKCORE_MODULES_SUPPORT)
1318 (void) ModuleComponentGenesis();
1320 (void) DelegateComponentGenesis();
1321 (void) MagicComponentGenesis();
1322 (void) ColorComponentGenesis();
1323 (void) TypeComponentGenesis();
1324 (void) MimeComponentGenesis();
1325 (void) ConstituteComponentGenesis();
1326 (void) XComponentGenesis();
1330 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1334 % M a g i c k C o r e T e r m i n u s %
1338 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1340 % MagickCoreTerminus() destroys the MagickCore environment.
1342 % The format of the MagickCoreTerminus function is:
1344 % MagickCoreTerminus(void)
1347 MagickExport void MagickCoreTerminus(void)
1349 #if defined(MAGICKCORE_X11_DELEGATE)
1350 XComponentTerminus();
1352 ConstituteComponentTerminus();
1353 MimeComponentTerminus();
1354 TypeComponentTerminus();
1355 ColorComponentTerminus();
1356 #if defined(__WINDOWS__)
1357 NTGhostscriptUnLoadDLL();
1359 MagicComponentTerminus();
1360 DelegateComponentTerminus();
1361 MagickComponentTerminus();
1362 #if !defined(MAGICKCORE_BUILD_MODULES)
1363 UnregisterStaticModules();
1365 #if defined(MAGICKCORE_MODULES_SUPPORT)
1366 ModuleComponentTerminus();
1368 CoderComponentTerminus();
1369 ResourceComponentTerminus();
1370 RegistryComponentTerminus();
1371 CacheComponentTerminus();
1372 PolicyComponentTerminus();
1373 ConfigureComponentTerminus();
1374 RandomComponentTerminus();
1375 LocaleComponentTerminus();
1376 LogComponentTerminus();
1377 SemaphoreComponentTerminus();
1378 instantiate_magick=MagickFalse;
1382 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1386 + R e g i s t e r M a g i c k I n f o %
1390 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1392 % RegisterMagickInfo() adds attributes for a particular image format to the
1393 % list of supported formats. The attributes include the image format name,
1394 % a method to read and/or write the format, whether the format supports the
1395 % saving of more than one frame to the same file or blob, whether the format
1396 % supports native in-memory I/O, and a brief description of the format.
1398 % The format of the RegisterMagickInfo method is:
1400 % MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1402 % A description of each parameter follows:
1404 % o magick_info: the magick info.
1407 MagickExport MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1413 Delete any existing name.
1415 assert(magick_info != (MagickInfo *) NULL);
1416 assert(magick_info->signature == MagickSignature);
1417 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",magick_info->name);
1418 if (magick_list == (SplayTreeInfo *) NULL)
1419 return((MagickInfo *) NULL);
1420 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1421 if (status == MagickFalse)
1422 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1423 return(magick_info);
1427 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1431 + S e t M a g i c k I n f o %
1435 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1437 % SetMagickInfo() allocates a MagickInfo structure and initializes the members
1438 % to default values.
1440 % The format of the SetMagickInfo method is:
1442 % MagickInfo *SetMagickInfo(const char *name)
1444 % A description of each parameter follows:
1446 % o magick_info: Method SetMagickInfo returns the allocated and initialized
1447 % MagickInfo structure.
1449 % o name: a character string that represents the image format associated
1450 % with the MagickInfo structure.
1453 MagickExport MagickInfo *SetMagickInfo(const char *name)
1458 assert(name != (const char *) NULL);
1459 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
1460 magick_info=(MagickInfo *) AcquireAlignedMemory(1,sizeof(*magick_info));
1461 if (magick_info == (MagickInfo *) NULL)
1462 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1463 (void) ResetMagickMemory(magick_info,0,sizeof(*magick_info));
1464 magick_info->name=ConstantString(name);
1465 magick_info->adjoin=MagickTrue;
1466 magick_info->blob_support=MagickTrue;
1467 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1468 EncoderThreadSupport);
1469 magick_info->signature=MagickSignature;
1470 return(magick_info);
1474 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1478 % S e t M a g i c k P r e c i s i o n %
1482 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1484 % SetMagickPrecision() sets the maximum number of significant digits to be
1485 % printed and returns it.
1487 % The format of the SetMagickPrecision method is:
1489 % int SetMagickPrecision(const int precision)
1491 % A description of each parameter follows:
1493 % o precision: set the maximum number of significant digits to be printed.
1496 MagickExport int SetMagickPrecision(const int precision)
1499 magick_precision = 0;
1501 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1503 magick_precision=precision;
1504 return(magick_precision);
1508 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1512 + U n r e g i s t e r M a g i c k I n f o %
1516 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1518 % UnregisterMagickInfo() removes a name from the magick info list. It returns
1519 % MagickFalse if the name does not exist in the list otherwise MagickTrue.
1521 % The format of the UnregisterMagickInfo method is:
1523 % MagickBooleanType UnregisterMagickInfo(const char *name)
1525 % A description of each parameter follows:
1527 % o name: a character string that represents the image format we are
1531 MagickExport MagickBooleanType UnregisterMagickInfo(const char *name)
1533 register const MagickInfo
1539 assert(name != (const char *) NULL);
1540 if (magick_list == (SplayTreeInfo *) NULL)
1541 return(MagickFalse);
1542 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1543 return(MagickFalse);
1544 LockSemaphoreInfo(magick_semaphore);
1545 ResetSplayTreeIterator(magick_list);
1546 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1547 while (p != (const MagickInfo *) NULL)
1549 if (LocaleCompare(p->name,name) == 0)
1551 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1553 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1554 UnlockSemaphoreInfo(magick_semaphore);