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-2017 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 % https://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 "MagickCore/studio.h"
44 #include "MagickCore/annotate-private.h"
45 #include "MagickCore/blob.h"
46 #include "MagickCore/blob-private.h"
47 #include "MagickCore/cache.h"
48 #include "MagickCore/cache-private.h"
49 #include "MagickCore/coder-private.h"
50 #include "MagickCore/client.h"
51 #include "MagickCore/color-private.h"
52 #include "MagickCore/configure-private.h"
53 #include "MagickCore/constitute-private.h"
54 #include "MagickCore/delegate-private.h"
55 #include "MagickCore/draw.h"
56 #include "MagickCore/exception.h"
57 #include "MagickCore/exception-private.h"
58 #include "MagickCore/locale-private.h"
59 #include "MagickCore/log-private.h"
60 #include "MagickCore/magic-private.h"
61 #include "MagickCore/magick.h"
62 #include "MagickCore/magick-private.h"
63 #include "MagickCore/memory_.h"
64 #include "MagickCore/mime-private.h"
65 #include "MagickCore/module.h"
66 #include "MagickCore/module-private.h"
67 #include "MagickCore/nt-base-private.h"
68 #include "MagickCore/nt-feature.h"
69 #include "MagickCore/opencl-private.h"
70 #include "MagickCore/option-private.h"
71 #include "MagickCore/random-private.h"
72 #include "MagickCore/registry.h"
73 #include "MagickCore/registry-private.h"
74 #include "MagickCore/resource_.h"
75 #include "MagickCore/resource-private.h"
76 #include "MagickCore/policy.h"
77 #include "MagickCore/policy-private.h"
78 #include "MagickCore/semaphore.h"
79 #include "MagickCore/semaphore-private.h"
80 #include "MagickCore/signature-private.h"
81 #include "MagickCore/splay-tree.h"
82 #include "MagickCore/string_.h"
83 #include "MagickCore/string-private.h"
84 #include "MagickCore/thread_.h"
85 #include "MagickCore/thread-private.h"
86 #include "MagickCore/type-private.h"
87 #include "MagickCore/token.h"
88 #include "MagickCore/utility.h"
89 #include "MagickCore/utility-private.h"
90 #include "MagickCore/xwindow-private.h"
95 #if !defined(MAGICKCORE_RETSIGTYPE)
96 # define MAGICKCORE_RETSIGTYPE void
99 # define SIG_DFL ((SignalHandler *) 0)
101 #if !defined(SIG_ERR)
102 # define SIG_ERR ((SignalHandler *) -1)
109 Typedef declarations.
111 typedef MAGICKCORE_RETSIGTYPE
118 *magick_semaphore = (SemaphoreInfo *) NULL;
121 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
124 *magick_list = (SplayTreeInfo *) NULL;
126 static volatile MagickBooleanType
127 instantiate_magickcore = MagickFalse,
128 magickcore_signal_in_progress = MagickFalse;
131 Forward declarations.
133 static MagickBooleanType
134 IsMagickTreeInstantiated(ExceptionInfo *);
137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141 % A c q u i r e M a g i c k I n f o %
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
147 % AcquireMagickInfo() allocates a MagickInfo structure and initializes the
148 % members to default values.
150 % The format of the AcquireMagickInfo method is:
152 % MagickInfo *AcquireMagickInfo(const char *module, const char *name,)
154 % A description of each parameter follows:
156 % o module: a character string that represents the module associated
157 % with the MagickInfo structure.
159 % o name: a character string that represents the image format associated
160 % with the MagickInfo structure.
162 % o description: a character string that represents the image format
163 % associated with the MagickInfo structure.
166 MagickExport MagickInfo *AcquireMagickInfo(const char *module,
167 const char *name, const char *description)
172 assert(module != (const char *) NULL);
173 assert(name != (const char *) NULL);
174 assert(description != (const char *) NULL);
175 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
176 magick_info=(MagickInfo *) AcquireMagickMemory(sizeof(*magick_info));
177 if (magick_info == (MagickInfo *) NULL)
178 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
179 (void) ResetMagickMemory(magick_info,0,sizeof(*magick_info));
180 magick_info->module=ConstantString(module);
181 magick_info->name=ConstantString(name);
182 magick_info->description=ConstantString(description);
183 magick_info->flags=CoderAdjoinFlag | CoderBlobSupportFlag |
184 CoderDecoderThreadSupportFlag | CoderEncoderThreadSupportFlag |
185 CoderUseExtensionFlag;
186 magick_info->signature=MagickCoreSignature;
191 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
195 + G e t I m a g e D e c o d e r %
199 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
201 % GetImageDecoder() returns the image decoder.
203 % The format of the GetImageDecoder method is:
205 % DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
207 % A description of each parameter follows:
209 % o magick_info: The magick info.
212 MagickExport DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
214 assert(magick_info != (MagickInfo *) NULL);
215 assert(magick_info->signature == MagickCoreSignature);
216 return(magick_info->decoder);
220 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
224 + G e t I m a g e E n c o d e r %
228 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
230 % GetImageEncoder() returns the image encoder.
232 % The format of the GetImageEncoder method is:
234 % EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
236 % A description of each parameter follows:
238 % o magick_info: The magick info.
241 MagickExport EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
243 assert(magick_info != (MagickInfo *) NULL);
244 assert(magick_info->signature == MagickCoreSignature);
245 return(magick_info->encoder);
249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
253 + G e t I m a g e M a g i c k %
257 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
259 % GetImageMagick() searches for an image format that matches the specified
260 % magick string. If one is found, MagickTrue is returned otherwise
263 % The format of the GetImageMagick method is:
265 % MagickBooleanType GetImageMagick(const unsigned char *magick,
266 % const size_t length,char *format)
268 % A description of each parameter follows:
270 % o magick: the image format we are searching for.
272 % o length: the length of the binary string.
274 % o format: the image format as determined by the magick bytes.
277 MagickExport MagickBooleanType GetImageMagick(const unsigned char *magick,
278 const size_t length,char *format)
286 register const MagickInfo
289 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
290 assert(magick != (const unsigned char *) NULL);
291 exception=AcquireExceptionInfo();
292 p=GetMagickInfo("*",exception);
293 exception=DestroyExceptionInfo(exception);
294 if (p == (const MagickInfo *) NULL)
297 LockSemaphoreInfo(magick_semaphore);
298 ResetSplayTreeIterator(magick_list);
299 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
300 while (p != (const MagickInfo *) NULL)
302 if ((p->magick != (IsImageFormatHandler *) NULL) &&
303 (p->magick(magick,length) != 0))
306 (void) CopyMagickString(format,p->name,MagickPathExtent);
309 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
311 UnlockSemaphoreInfo(magick_semaphore);
316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
320 + G e t M a g i c k A d j o i n %
324 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326 % GetMagickAdjoin() returns MagickTrue if the magick adjoin is MagickTrue.
328 % The format of the GetMagickAdjoin method is:
330 % MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
332 % A description of each parameter follows:
334 % o magick_info: The magick info.
337 MagickExport MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
339 assert(magick_info != (MagickInfo *) NULL);
340 assert(magick_info->signature == MagickCoreSignature);
341 return(((magick_info->flags & CoderAdjoinFlag) == 0) ? MagickFalse :
346 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
350 + G e t M a g i c k B l o b S u p p o r t %
354 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356 % GetMagickBlobSupport() returns MagickTrue if the magick supports blobs.
358 % The format of the GetMagickBlobSupport method is:
360 % MagickBooleanType GetMagickBlobSupport(const MagickInfo *magick_info)
362 % A description of each parameter follows:
364 % o magick_info: The magick info.
367 MagickExport MagickBooleanType GetMagickBlobSupport(
368 const MagickInfo *magick_info)
370 assert(magick_info != (MagickInfo *) NULL);
371 assert(magick_info->signature == MagickCoreSignature);
372 return(((magick_info->flags & CoderBlobSupportFlag) == 0) ? MagickFalse :
377 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
381 + G e t M a g i c k D e c o d e r S e e k a b l e S t r e a m %
385 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
387 % GetMagickDecoderSeekableStream() returns MagickTrue if the magick supports a
388 % seekable stream in the decoder.
390 % The format of the GetMagickDecoderSeekableStream method is:
392 % MagickBooleanType GetMagickDecoderSeekableStream(
393 % const MagickInfo *magick_info)
395 % A description of each parameter follows:
397 % o magick_info: The magick info.
400 MagickExport MagickBooleanType GetMagickDecoderSeekableStream(
401 const MagickInfo *magick_info)
403 assert(magick_info != (MagickInfo *) NULL);
404 assert(magick_info->signature == MagickCoreSignature);
405 if ((magick_info->flags & CoderDecoderSeekableStreamFlag) == 0)
411 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
415 + G e t M a g i c k D e c o d e r T h r e a d S u p p o r t %
419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
421 % GetMagickDecoderThreadSupport() returns MagickTrue if the decoder supports
424 % The format of the GetMagickDecoderThreadSupport method is:
426 % MagickStatusType GetMagickDecoderThreadSupport(
427 % const MagickInfo *magick_info)
429 % A description of each parameter follows:
431 % o magick_info: The magick info.
434 MagickExport MagickBooleanType GetMagickDecoderThreadSupport(
435 const MagickInfo *magick_info)
437 assert(magick_info != (MagickInfo *) NULL);
438 assert(magick_info->signature == MagickCoreSignature);
439 return(((magick_info->flags & CoderDecoderThreadSupportFlag) == 0) ?
440 MagickFalse : MagickTrue);
444 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
448 + G e t M a g i c k D e s c r i p t i o n %
452 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
454 % GetMagickDescription() returns the magick description.
456 % The format of the GetMagickDescription method is:
458 % const char *GetMagickDescription(const MagickInfo *magick_info)
460 % A description of each parameter follows:
462 % o magick_info: The magick info.
465 MagickExport const char *GetMagickDescription(const MagickInfo *magick_info)
467 assert(magick_info != (MagickInfo *) NULL);
468 assert(magick_info->signature == MagickCoreSignature);
469 return(magick_info->description);
473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
477 + G e t M a g i c k E n c o d e r S e e k a b l e S t r e a m %
481 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
483 % GetMagickEncoderSeekableStream() returns MagickTrue if the magick supports a
484 % seekable stream in the encoder.
486 % The format of the GetMagickEncoderSeekableStream method is:
488 % MagickBooleanType GetMagickEncoderSeekableStream(
489 % const MagickInfo *magick_info)
491 % A description of each parameter follows:
493 % o magick_info: The magick info.
496 MagickExport MagickBooleanType GetMagickEncoderSeekableStream(
497 const MagickInfo *magick_info)
499 assert(magick_info != (MagickInfo *) NULL);
500 assert(magick_info->signature == MagickCoreSignature);
501 if ((magick_info->flags & CoderEncoderSeekableStreamFlag) == 0)
507 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
511 + G e t M a g i c k E n c o d e r T h r e a d S u p p o r t %
515 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
517 % GetMagickEncoderThreadSupport() returns MagickTrue if the encoder supports
520 % The format of the GetMagickEncoderThreadSupport method is:
522 % MagickStatusType GetMagickEncoderThreadSupport(
523 % const MagickInfo *magick_info)
525 % A description of each parameter follows:
527 % o magick_info: The magick info.
530 MagickExport MagickBooleanType GetMagickEncoderThreadSupport(
531 const MagickInfo *magick_info)
533 assert(magick_info != (MagickInfo *) NULL);
534 assert(magick_info->signature == MagickCoreSignature);
535 return(((magick_info->flags & CoderDecoderThreadSupportFlag) == 0) ?
536 MagickFalse : MagickTrue);
540 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
544 + G e t M a g i c k E n d i a n S u p p o r t %
548 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
550 % GetMagickEndianSupport() returns the MagickTrue if the coder respects
551 % endianness other than MSBEndian.
553 % The format of the GetMagickEndianSupport method is:
555 % MagickBooleanType GetMagickEndianSupport(const MagickInfo *magick_info)
557 % A description of each parameter follows:
559 % o magick_info: The magick info.
562 MagickExport MagickBooleanType GetMagickEndianSupport(
563 const MagickInfo *magick_info)
565 assert(magick_info != (MagickInfo *) NULL);
566 assert(magick_info->signature == MagickCoreSignature);
567 return(((magick_info->flags & CoderEndianSupportFlag) == 0) ? MagickFalse :
572 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
576 + G e t M a g i c k I n f o %
580 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
582 % GetMagickInfo() returns a pointer MagickInfo structure that matches
583 % the specified name. If name is NULL, the head of the image format list
586 % The format of the GetMagickInfo method is:
588 % const MagickInfo *GetMagickInfo(const char *name,Exception *exception)
590 % A description of each parameter follows:
592 % o name: the image format we are looking for.
594 % o exception: return any errors or warnings in this structure.
597 MagickExport const MagickInfo *GetMagickInfo(const char *name,
598 ExceptionInfo *exception)
600 register const MagickInfo
603 assert(exception != (ExceptionInfo *) NULL);
604 if (IsMagickTreeInstantiated(exception) == MagickFalse)
605 return((const MagickInfo *) NULL);
606 #if defined(MAGICKCORE_MODULES_SUPPORT)
607 if ((name != (const char *) NULL) && (LocaleCompare(name,"*") == 0))
608 (void) OpenModules(exception);
613 LockSemaphoreInfo(magick_semaphore);
614 ResetSplayTreeIterator(magick_list);
615 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
616 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
618 ResetSplayTreeIterator(magick_list);
619 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
620 UnlockSemaphoreInfo(magick_semaphore);
623 while (p != (const MagickInfo *) NULL)
625 if (LocaleCompare(p->name,name) == 0)
627 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
629 #if defined(MAGICKCORE_MODULES_SUPPORT)
630 if (p == (const MagickInfo *) NULL)
633 (void) OpenModule(name,exception);
634 ResetSplayTreeIterator(magick_list);
635 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
636 while (p != (const MagickInfo *) NULL)
638 if (LocaleCompare(p->name,name) == 0)
640 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
644 UnlockSemaphoreInfo(magick_semaphore);
649 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
653 + G e t M a g i c k I n f o L i s t %
657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
659 % GetMagickInfoList() returns any image formats that match the specified
662 % The format of the GetMagickInfoList function is:
664 % const MagickInfo **GetMagickInfoList(const char *pattern,
665 % size_t *number_formats,ExceptionInfo *exception)
667 % A description of each parameter follows:
669 % o pattern: Specifies a pointer to a text string containing a pattern.
671 % o number_formats: This integer returns the number of formats in the list.
673 % o exception: return any errors or warnings in this structure.
677 #if defined(__cplusplus) || defined(c_plusplus)
681 static int MagickInfoCompare(const void *x,const void *y)
687 p=(const MagickInfo **) x,
688 q=(const MagickInfo **) y;
689 return(LocaleCompare((*p)->name,(*q)->name));
692 #if defined(__cplusplus) || defined(c_plusplus)
696 MagickExport const MagickInfo **GetMagickInfoList(const char *pattern,
697 size_t *number_formats,ExceptionInfo *exception)
702 register const MagickInfo
709 Allocate magick list.
711 assert(pattern != (char *) NULL);
712 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
713 assert(number_formats != (size_t *) NULL);
715 p=GetMagickInfo("*",exception);
716 if (p == (const MagickInfo *) NULL)
717 return((const MagickInfo **) NULL);
718 formats=(const MagickInfo **) AcquireQuantumMemory((size_t)
719 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
720 if (formats == (const MagickInfo **) NULL)
721 return((const MagickInfo **) NULL);
723 Generate magick list.
725 LockSemaphoreInfo(magick_semaphore);
726 ResetSplayTreeIterator(magick_list);
727 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
728 for (i=0; p != (const MagickInfo *) NULL; )
730 if ((GetMagickStealth(p) == MagickFalse) &&
731 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
733 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
735 UnlockSemaphoreInfo(magick_semaphore);
736 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare);
737 formats[i]=(MagickInfo *) NULL;
738 *number_formats=(size_t) i;
743 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
747 + G e t M a g i c k L i s t %
751 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
753 % GetMagickList() returns any image formats that match the specified pattern.
755 % The format of the GetMagickList function is:
757 % char **GetMagickList(const char *pattern,size_t *number_formats,
758 % ExceptionInfo *exception)
760 % A description of each parameter follows:
762 % o pattern: Specifies a pointer to a text string containing a pattern.
764 % o number_formats: This integer returns the number of formats in the list.
766 % o exception: return any errors or warnings in this structure.
770 #if defined(__cplusplus) || defined(c_plusplus)
774 static int MagickCompare(const void *x,const void *y)
782 return(LocaleCompare(*p,*q));
785 #if defined(__cplusplus) || defined(c_plusplus)
789 MagickExport char **GetMagickList(const char *pattern,
790 size_t *number_formats,ExceptionInfo *exception)
795 register const MagickInfo
802 Allocate magick list.
804 assert(pattern != (char *) NULL);
805 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
806 assert(number_formats != (size_t *) NULL);
808 p=GetMagickInfo("*",exception);
809 if (p == (const MagickInfo *) NULL)
810 return((char **) NULL);
811 formats=(char **) AcquireQuantumMemory((size_t)
812 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
813 if (formats == (char **) NULL)
814 return((char **) NULL);
815 LockSemaphoreInfo(magick_semaphore);
816 ResetSplayTreeIterator(magick_list);
817 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
818 for (i=0; p != (const MagickInfo *) NULL; )
820 if ((GetMagickStealth(p) == MagickFalse) &&
821 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
822 formats[i++]=ConstantString(p->name);
823 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
825 UnlockSemaphoreInfo(magick_semaphore);
826 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare);
827 formats[i]=(char *) NULL;
828 *number_formats=(size_t) i;
833 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
837 + G e t M a g i c k M i m e T y p e %
841 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
843 % GetMagickMimeType() returns the magick mime type.
845 % The format of the GetMagickMimeType method is:
847 % const char *GetMagickMimeType(const MagickInfo *magick_info)
849 % A description of each parameter follows:
851 % o magick_info: The magick info.
854 MagickExport const char *GetMagickMimeType(const MagickInfo *magick_info)
856 assert(magick_info != (MagickInfo *) NULL);
857 assert(magick_info->signature == MagickCoreSignature);
858 return(magick_info->mime_type);
862 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
866 % G e t M a g i c k P r e c i s i o n %
870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
872 % GetMagickPrecision() returns the maximum number of significant digits to be
875 % The format of the GetMagickPrecision method is:
877 % int GetMagickPrecision(void)
880 MagickExport int GetMagickPrecision(void)
882 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
883 return(SetMagickPrecision(0));
887 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
891 + G e t M a g i c k R a w S u p p o r t %
895 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
897 % GetMagickRawSupport() returns the MagickTrue if the coder is a raw format.
899 % The format of the GetMagickRawSupport method is:
901 % MagickBooleanType GetMagickRawSupport(const MagickInfo *magick_info)
903 % A description of each parameter follows:
905 % o magick_info: The magick info.
908 MagickExport MagickBooleanType GetMagickRawSupport(
909 const MagickInfo *magick_info)
911 assert(magick_info != (MagickInfo *) NULL);
912 assert(magick_info->signature == MagickCoreSignature);
913 return(((magick_info->flags & CoderRawSupportFlag) == 0) ? MagickFalse :
919 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
923 + G e t M a g i c k S t e a l t h %
927 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
929 % GetMagickStealth() returns MagickTrue if the magick is a stealth coder.
931 % The format of the GetMagickStealth method is:
933 % MagickBooleanType GetMagickStealth(const MagickInfo *magick_info)
935 % A description of each parameter follows:
937 % o magick_info: The magick info.
940 MagickExport MagickBooleanType GetMagickStealth(const MagickInfo *magick_info)
942 assert(magick_info != (MagickInfo *) NULL);
943 assert(magick_info->signature == MagickCoreSignature);
944 return(((magick_info->flags & CoderStealthFlag) == 0) ? MagickFalse :
950 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
954 + G e t M a g i c k U s e E x t e n s i o n %
958 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
960 % GetMagickUseExtension() returns MagickTrue if the magick can use the
961 % extension of the format if the format return by IsImageFormatHandler uses
964 % The format of the GetMagickUseExtension method is:
966 % MagickBooleanType GetMagickUseExtension(const MagickInfo *magick_info)
968 % A description of each parameter follows:
970 % o magick_info: The magick info.
973 MagickExport MagickBooleanType GetMagickUseExtension(
974 const MagickInfo *magick_info)
976 assert(magick_info != (MagickInfo *) NULL);
977 assert(magick_info->signature == MagickCoreSignature);
978 return(((magick_info->flags & CoderUseExtensionFlag) == 0) ? MagickFalse :
983 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
987 + I s M a g i c k T r e e I n s t a n t i a t e d %
991 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
993 % IsMagickTreeInstantiated() determines if the magick tree is instantiated.
994 % If not, it instantiates the tree and returns it.
996 % The format of the IsMagickTreeInstantiated() method is:
998 % IsMagickTreeInstantiated(Exceptioninfo *exception)
1000 % A description of each parameter follows.
1002 % o exception: return any errors or warnings in this structure.
1006 static void *DestroyMagickNode(void *magick_info)
1011 p=(MagickInfo *) magick_info;
1012 if (p->module != (char *) NULL)
1013 p->module=DestroyString(p->module);
1014 if (p->note != (char *) NULL)
1015 p->note=DestroyString(p->note);
1016 if (p->mime_type != (char *) NULL)
1017 p->mime_type=DestroyString(p->mime_type);
1018 if (p->version != (char *) NULL)
1019 p->version=DestroyString(p->version);
1020 if (p->description != (char *) NULL)
1021 p->description=DestroyString(p->description);
1022 if (p->name != (char *) NULL)
1023 p->name=DestroyString(p->name);
1024 if (p->semaphore != (SemaphoreInfo *) NULL)
1025 RelinquishSemaphoreInfo(&p->semaphore);
1026 return(RelinquishMagickMemory(p));
1029 static MagickBooleanType IsMagickTreeInstantiated(ExceptionInfo *exception)
1032 if (magick_list == (SplayTreeInfo *) NULL)
1034 if (magick_semaphore == (SemaphoreInfo *) NULL)
1035 ActivateSemaphoreInfo(&magick_semaphore);
1036 LockSemaphoreInfo(magick_semaphore);
1037 if (magick_list == (SplayTreeInfo *) NULL)
1039 magick_list=NewSplayTree(CompareSplayTreeString,(void *(*)(void *))
1040 NULL,DestroyMagickNode);
1041 if (magick_list == (SplayTreeInfo *) NULL)
1042 ThrowFatalException(ResourceLimitFatalError,
1043 "MemoryAllocationFailed");
1044 #if defined(MAGICKCORE_MODULES_SUPPORT)
1045 (void) GetModuleInfo((char *) NULL,exception);
1047 #if !defined(MAGICKCORE_BUILD_MODULES)
1048 RegisterStaticModules();
1051 UnlockSemaphoreInfo(magick_semaphore);
1053 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
1057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1061 + I s M a g i c k C o n f l i c t %
1065 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1067 % IsMagickConflict() returns MagickTrue if the image format conflicts with a
1068 % logical drive (.e.g. X:).
1070 % The format of the IsMagickConflict method is:
1072 % MagickBooleanType IsMagickConflict(const char *magick)
1074 % A description of each parameter follows:
1076 % o magick: Specifies the image format.
1079 MagickPrivate MagickBooleanType IsMagickConflict(const char *magick)
1081 assert(magick != (char *) NULL);
1082 #if defined(macintosh)
1083 return(MACIsMagickConflict(magick));
1085 return(VMSIsMagickConflict(magick));
1086 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
1087 return(NTIsMagickConflict(magick));
1089 return(MagickFalse);
1094 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1098 + L i s t M a g i c k I n f o %
1102 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1104 % ListMagickInfo() lists the image formats to a file.
1106 % The format of the ListMagickInfo method is:
1108 % MagickBooleanType ListMagickInfo(FILE *file,ExceptionInfo *exception)
1110 % A description of each parameter follows.
1112 % o file: A file handle.
1114 % o exception: return any errors or warnings in this structure.
1117 MagickExport MagickBooleanType ListMagickInfo(FILE *file,
1118 ExceptionInfo *exception)
1132 if (file == (FILE *) NULL)
1134 magick_info=GetMagickInfoList("*",&number_formats,exception);
1135 if (magick_info == (const MagickInfo **) NULL)
1136 return(MagickFalse);
1137 ClearMagickException(exception);
1138 #if !defined(MAGICKCORE_MODULES_SUPPORT)
1139 (void) FormatLocaleFile(file," Format Mode Description\n");
1141 (void) FormatLocaleFile(file," Format Module Mode Description\n");
1143 (void) FormatLocaleFile(file,
1144 "--------------------------------------------------------"
1145 "-----------------------\n");
1146 for (i=0; i < (ssize_t) number_formats; i++)
1148 if (GetMagickStealth(magick_info[i]) != MagickFalse)
1150 (void) FormatLocaleFile(file,"%9s%c ",
1151 magick_info[i]->name != (char *) NULL ? magick_info[i]->name : "",
1152 GetMagickBlobSupport(magick_info[i]) != MagickFalse ? '*' : ' ');
1153 #if defined(MAGICKCORE_MODULES_SUPPORT)
1156 module[MagickPathExtent];
1159 if (magick_info[i]->module != (char *) NULL)
1160 (void) CopyMagickString(module,magick_info[i]->module,MagickPathExtent);
1161 (void) ConcatenateMagickString(module," ",MagickPathExtent);
1163 (void) FormatLocaleFile(file,"%9s ",module);
1166 (void) FormatLocaleFile(file,"%c%c%c ",magick_info[i]->decoder ? 'r' : '-',
1167 magick_info[i]->encoder ? 'w' : '-',magick_info[i]->encoder != NULL &&
1168 GetMagickAdjoin(magick_info[i]) != MagickFalse ? '+' : '-');
1169 if (magick_info[i]->description != (char *) NULL)
1170 (void) FormatLocaleFile(file," %s",magick_info[i]->description);
1171 if (magick_info[i]->version != (char *) NULL)
1172 (void) FormatLocaleFile(file," (%s)",magick_info[i]->version);
1173 (void) FormatLocaleFile(file,"\n");
1174 if (magick_info[i]->note != (char *) NULL)
1179 text=StringToList(magick_info[i]->note);
1180 if (text != (char **) NULL)
1182 for (j=0; text[j] != (char *) NULL; j++)
1184 (void) FormatLocaleFile(file," %s\n",text[j]);
1185 text[j]=DestroyString(text[j]);
1187 text=(char **) RelinquishMagickMemory(text);
1191 (void) FormatLocaleFile(file,"\n* native blob support\n");
1192 (void) FormatLocaleFile(file,"r read support\n");
1193 (void) FormatLocaleFile(file,"w write support\n");
1194 (void) FormatLocaleFile(file,"+ support for multiple images\n");
1195 (void) fflush(file);
1196 magick_info=(const MagickInfo **) RelinquishMagickMemory((void *)
1202 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1206 % I s M a g i c k C o r e I n s t a n t i a t e d %
1210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1212 % IsMagickCoreInstantiated() returns MagickTrue if the ImageMagick environment
1213 % is currently instantiated: MagickCoreGenesis() has been called but
1214 % MagickDestroy() has not.
1216 % The format of the IsMagickCoreInstantiated method is:
1218 % MagickBooleanType IsMagickCoreInstantiated(void)
1221 MagickExport MagickBooleanType IsMagickCoreInstantiated(void)
1223 return(instantiate_magickcore);
1227 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1231 + M a g i c k C o m p o n e n t G e n e s i s %
1235 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1237 % MagickComponentGenesis() instantiates the magick component.
1239 % The format of the MagickComponentGenesis method is:
1241 % MagickBooleanType MagickComponentGenesis(void)
1244 MagickPrivate MagickBooleanType MagickComponentGenesis(void)
1246 if (magick_semaphore == (SemaphoreInfo *) NULL)
1247 magick_semaphore=AcquireSemaphoreInfo();
1252 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1256 + M a g i c k C o m p o n e n t T e r m i n u s %
1260 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1262 % MagickComponentTerminus() destroys the magick component.
1264 % The format of the MagickComponentTerminus method is:
1266 % void MagickComponentTerminus(void)
1269 MagickPrivate void MagickComponentTerminus(void)
1271 if (magick_semaphore == (SemaphoreInfo *) NULL)
1272 ActivateSemaphoreInfo(&magick_semaphore);
1273 LockSemaphoreInfo(magick_semaphore);
1274 if (magick_list != (SplayTreeInfo *) NULL)
1275 magick_list=DestroySplayTree(magick_list);
1276 UnlockSemaphoreInfo(magick_semaphore);
1277 RelinquishSemaphoreInfo(&magick_semaphore);
1281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1285 % M a g i c k C o r e G e n e s i s %
1289 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1291 % MagickCoreGenesis() initializes the MagickCore environment.
1293 % The format of the MagickCoreGenesis function is:
1295 % MagickCoreGenesis(const char *path,
1296 % const MagickBooleanType establish_signal_handlers)
1298 % A description of each parameter follows:
1300 % o path: the execution path of the current ImageMagick client.
1302 % o establish_signal_handlers: set to MagickTrue to use MagickCore's own
1303 % signal handlers for common signals.
1307 static SignalHandler *SetMagickSignalHandler(int signal_number,
1308 SignalHandler *handler)
1310 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1322 sigaddset(&mask,signal_number);
1323 sigprocmask(SIG_BLOCK,&mask,NULL);
1324 action.sa_mask=mask;
1325 action.sa_handler=handler;
1327 #if defined(SA_INTERRUPT)
1328 action.sa_flags|=SA_INTERRUPT;
1330 status=sigaction(signal_number,&action,&previous_action);
1333 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1334 return(previous_action.sa_handler);
1336 return(signal(signal_number,handler));
1340 static void MagickSignalHandler(int signal_number)
1342 if (magickcore_signal_in_progress != MagickFalse)
1343 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1344 magickcore_signal_in_progress=MagickTrue;
1345 AsynchronousResourceComponentTerminus();
1346 #if defined(SIGQUIT)
1347 if (signal_number == SIGQUIT)
1350 #if defined(SIGABRT)
1351 if (signal_number == SIGABRT)
1355 if (signal_number == SIGFPE)
1358 #if defined(SIGXCPU)
1359 if (signal_number == SIGXCPU)
1362 #if defined(SIGXFSZ)
1363 if (signal_number == SIGXFSZ)
1366 #if defined(SIGSEGV)
1367 if (signal_number == SIGSEGV)
1370 #if !defined(MAGICKCORE_HAVE__EXIT)
1371 exit(signal_number);
1374 if (signal_number == SIGHUP)
1375 _exit(signal_number);
1378 if (signal_number == SIGINT)
1379 _exit(signal_number);
1381 #if defined(SIGTERM)
1382 if (signal_number == SIGTERM)
1383 _exit(signal_number);
1385 #if defined(MAGICKCORE_HAVE_RAISE)
1386 if (signal_handlers[signal_number] != MagickSignalHandler)
1387 raise(signal_number);
1389 _exit(signal_number); /* do not invoke registered atexit() methods */
1393 static SignalHandler *RegisterMagickSignalHandler(int signal_number)
1398 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1399 if (handler == SIG_ERR)
1401 if (handler != SIG_DFL)
1402 handler=SetMagickSignalHandler(signal_number,handler);
1404 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1405 "Register handler for signal: %d",signal_number);
1409 MagickExport void MagickCoreGenesis(const char *path,
1410 const MagickBooleanType establish_signal_handlers)
1414 execution_path[MagickPathExtent],
1415 filename[MagickPathExtent];
1418 Initialize the Magick environment.
1420 InitializeMagickMutex();
1422 if (instantiate_magickcore != MagickFalse)
1424 UnlockMagickMutex();
1427 (void) SemaphoreComponentGenesis();
1428 (void) LogComponentGenesis();
1429 (void) LocaleComponentGenesis();
1430 (void) RandomComponentGenesis();
1431 events=GetEnvironmentValue("MAGICK_DEBUG");
1432 if (events != (char *) NULL)
1434 (void) SetLogEventMask(events);
1435 events=DestroyString(events);
1437 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1441 Set client name and execution path.
1443 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1444 if ((path != (const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1446 if ((path != (const char *) NULL) && (*path == *DirectorySeparator) &&
1447 (IsPathAccessible(path) != MagickFalse))
1449 (void) CopyMagickString(execution_path,path,MagickPathExtent);
1451 (void) GetExecutionPath(execution_path,MagickPathExtent);
1452 GetPathComponent(execution_path,TailPath,filename);
1453 (void) SetClientName(filename);
1454 GetPathComponent(execution_path,HeadPath,execution_path);
1455 (void) SetClientPath(execution_path);
1456 if (establish_signal_handlers != MagickFalse)
1459 Set signal handlers.
1461 #if defined(SIGABRT)
1462 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1463 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1465 #if defined(SIGSEGV)
1466 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1467 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1470 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1471 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1474 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1475 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1478 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1479 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1481 #if defined(SIGQUIT)
1482 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1483 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1485 #if defined(SIGTERM)
1486 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1487 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1489 #if defined(SIGXCPU)
1490 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1491 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1493 #if defined(SIGXFSZ)
1494 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1495 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1499 Instantiate magick resources.
1501 (void) ConfigureComponentGenesis();
1502 (void) PolicyComponentGenesis();
1503 #if defined(MAGICKCORE_ZERO_CONFIGURATION_SUPPORT)
1504 (void) ZeroConfigurationPolicy;
1506 (void) CacheComponentGenesis();
1507 (void) ResourceComponentGenesis();
1508 (void) CoderComponentGenesis();
1509 (void) MagickComponentGenesis();
1510 #if defined(MAGICKCORE_MODULES_SUPPORT)
1511 (void) ModuleComponentGenesis();
1513 (void) DelegateComponentGenesis();
1514 (void) MagicComponentGenesis();
1515 (void) ColorComponentGenesis();
1516 (void) TypeComponentGenesis();
1517 (void) MimeComponentGenesis();
1518 (void) AnnotateComponentGenesis();
1519 #if defined(MAGICKCORE_X11_DELEGATE)
1520 (void) XComponentGenesis();
1522 (void) RegistryComponentGenesis();
1523 instantiate_magickcore=MagickTrue;
1524 UnlockMagickMutex();
1528 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1532 % M a g i c k C o r e T e r m i n u s %
1536 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1538 % MagickCoreTerminus() destroys the MagickCore environment.
1540 % The format of the MagickCoreTerminus function is:
1542 % MagickCoreTerminus(void)
1545 MagickExport void MagickCoreTerminus(void)
1547 InitializeMagickMutex();
1549 if (instantiate_magickcore == MagickFalse)
1551 UnlockMagickMutex();
1554 RegistryComponentTerminus();
1555 #if defined(MAGICKCORE_X11_DELEGATE)
1556 XComponentTerminus();
1558 AnnotateComponentTerminus();
1559 MimeComponentTerminus();
1560 TypeComponentTerminus();
1561 #if defined(MAGICKCORE_OPENCL_SUPPORT)
1564 ColorComponentTerminus();
1565 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1566 NTWindowsTerminus();
1568 MagicComponentTerminus();
1569 DelegateComponentTerminus();
1570 MagickComponentTerminus();
1571 #if !defined(MAGICKCORE_BUILD_MODULES)
1572 UnregisterStaticModules();
1574 #if defined(MAGICKCORE_MODULES_SUPPORT)
1575 ModuleComponentTerminus();
1577 CoderComponentTerminus();
1578 ResourceComponentTerminus();
1579 CacheComponentTerminus();
1580 PolicyComponentTerminus();
1581 ConfigureComponentTerminus();
1582 RandomComponentTerminus();
1583 LocaleComponentTerminus();
1584 LogComponentTerminus();
1585 instantiate_magickcore=MagickFalse;
1586 UnlockMagickMutex();
1587 SemaphoreComponentTerminus();
1591 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1595 + R e g i s t e r M a g i c k I n f o %
1599 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1601 % RegisterMagickInfo() adds attributes for a particular image format to the
1602 % list of supported formats. The attributes include the image format name,
1603 % a method to read and/or write the format, whether the format supports the
1604 % saving of more than one frame to the same file or blob, whether the format
1605 % supports native in-memory I/O, and a brief description of the format.
1607 % The format of the RegisterMagickInfo method is:
1609 % MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1611 % A description of each parameter follows:
1613 % o magick_info: the magick info.
1616 MagickExport MagickBooleanType RegisterMagickInfo(MagickInfo *magick_info)
1622 Register a new image format.
1624 assert(magick_info != (MagickInfo *) NULL);
1625 assert(magick_info->signature == MagickCoreSignature);
1626 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",magick_info->name);
1627 if (magick_list == (SplayTreeInfo *) NULL)
1628 return(MagickFalse);
1629 if ((GetMagickDecoderThreadSupport(magick_info) == MagickFalse) ||
1630 (GetMagickEncoderThreadSupport(magick_info) == MagickFalse))
1631 magick_info->semaphore=AcquireSemaphoreInfo();
1632 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1637 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1641 % S e t M a g i c k P r e c i s i o n %
1645 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1647 % SetMagickPrecision() sets the maximum number of significant digits to be
1650 % An input argument of 0 returns the current precision setting.
1652 % A negative value forces the precision to reset to a default value according
1653 % to the environment variable "MAGICK_PRECISION", the current 'policy'
1654 % configuration setting, or the default value of '6', in that order.
1656 % The format of the SetMagickPrecision method is:
1658 % int SetMagickPrecision(const int precision)
1660 % A description of each parameter follows:
1662 % o precision: set the maximum number of significant digits to be printed.
1665 MagickExport int SetMagickPrecision(const int precision)
1667 #define MagickPrecision 6
1670 magick_precision = 0;
1672 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1674 magick_precision=precision;
1675 if ((precision < 0) || (magick_precision == 0))
1681 Precision reset, or it has not been set yet
1683 magick_precision=MagickPrecision;
1684 limit=GetEnvironmentValue("MAGICK_PRECISION");
1685 if (limit == (char *) NULL)
1686 limit=GetPolicyValue("system:precision");
1687 if (limit != (char *) NULL)
1689 magick_precision=StringToInteger(limit);
1690 limit=DestroyString(limit);
1693 return(magick_precision);
1697 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1701 + U n r e g i s t e r M a g i c k I n f o %
1705 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1707 % UnregisterMagickInfo() removes a name from the magick info list. It returns
1708 % MagickFalse if the name does not exist in the list otherwise MagickTrue.
1710 % The format of the UnregisterMagickInfo method is:
1712 % MagickBooleanType UnregisterMagickInfo(const char *name)
1714 % A description of each parameter follows:
1716 % o name: a character string that represents the image format we are
1720 MagickExport MagickBooleanType UnregisterMagickInfo(const char *name)
1722 register const MagickInfo
1728 assert(name != (const char *) NULL);
1729 if (magick_list == (SplayTreeInfo *) NULL)
1730 return(MagickFalse);
1731 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1732 return(MagickFalse);
1733 LockSemaphoreInfo(magick_semaphore);
1734 ResetSplayTreeIterator(magick_list);
1735 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1736 while (p != (const MagickInfo *) NULL)
1738 if (LocaleCompare(p->name,name) == 0)
1740 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1742 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1743 UnlockSemaphoreInfo(magick_semaphore);