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-2014 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 "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/random-private.h"
69 #include "MagickCore/registry.h"
70 #include "MagickCore/registry-private.h"
71 #include "MagickCore/resource_.h"
72 #include "MagickCore/resource-private.h"
73 #include "MagickCore/policy.h"
74 #include "MagickCore/policy-private.h"
75 #include "MagickCore/semaphore.h"
76 #include "MagickCore/semaphore-private.h"
77 #include "MagickCore/signature-private.h"
78 #include "MagickCore/splay-tree.h"
79 #include "MagickCore/string_.h"
80 #include "MagickCore/string-private.h"
81 #include "MagickCore/thread_.h"
82 #include "MagickCore/thread-private.h"
83 #include "MagickCore/type-private.h"
84 #include "MagickCore/token.h"
85 #include "MagickCore/utility.h"
86 #include "MagickCore/utility-private.h"
87 #include "MagickCore/xwindow-private.h"
92 #if !defined(MAGICKCORE_RETSIGTYPE)
93 # define MAGICKCORE_RETSIGTYPE void
96 # define SIG_DFL ((SignalHandler *) 0)
99 # define SIG_ERR ((SignalHandler *) -1)
106 Typedef declarations.
108 typedef MAGICKCORE_RETSIGTYPE
115 *magick_semaphore = (SemaphoreInfo *) NULL;
118 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
121 *magick_list = (SplayTreeInfo *) NULL;
123 static volatile MagickBooleanType
124 instantiate_magick = MagickFalse,
125 instantiate_magickcore = MagickFalse;
128 Forward declarations.
130 static MagickBooleanType
131 InitializeMagickList(ExceptionInfo *);
134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
138 + G e t I m a g e D e c o d e r %
142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
144 % GetImageDecoder() returns the image decoder.
146 % The format of the GetImageDecoder method is:
148 % DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
150 % A description of each parameter follows:
152 % o magick_info: The magick info.
155 MagickExport DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info)
157 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
158 assert(magick_info != (MagickInfo *) NULL);
159 assert(magick_info->signature == MagickSignature);
160 return(magick_info->decoder);
164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
168 + G e t I m a g e E n c o d e r %
172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
174 % GetImageEncoder() returns the image encoder.
176 % The format of the GetImageEncoder method is:
178 % EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
180 % A description of each parameter follows:
182 % o magick_info: The magick info.
185 MagickExport EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info)
187 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
188 assert(magick_info != (MagickInfo *) NULL);
189 assert(magick_info->signature == MagickSignature);
190 return(magick_info->encoder);
194 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
198 + G e t I m a g e M a g i c k %
202 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
204 % GetImageMagick() searches for an image format that matches the specified
205 % magick string. If one is found, MagickTrue is returned otherwise
208 % The format of the GetImageMagick method is:
210 % MagickBooleanType GetImageMagick(const unsigned char *magick,
211 % const size_t length,char *format)
213 % A description of each parameter follows:
215 % o magick: the image format we are searching for.
217 % o length: the length of the binary string.
219 % o format: the image format as determined by the magick bytes.
222 MagickExport MagickBooleanType GetImageMagick(const unsigned char *magick,
223 const size_t length,char *format)
231 register const MagickInfo
234 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
235 assert(magick != (const unsigned char *) NULL);
236 exception=AcquireExceptionInfo();
237 p=GetMagickInfo("*",exception);
238 exception=DestroyExceptionInfo(exception);
239 if (p == (const MagickInfo *) NULL)
242 LockSemaphoreInfo(magick_semaphore);
243 ResetSplayTreeIterator(magick_list);
244 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
245 while (p != (const MagickInfo *) NULL)
247 if ((p->magick != (IsImageFormatHandler *) NULL) &&
248 (p->magick(magick,length) != 0))
251 (void) CopyMagickString(format,p->name,MaxTextExtent);
254 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
256 UnlockSemaphoreInfo(magick_semaphore);
261 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
265 + G e t M a g i c k A d j o i n %
269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
271 % GetMagickAdjoin() returns MagickTrue if the magick adjoin is MagickTrue.
273 % The format of the GetMagickAdjoin method is:
275 % MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
277 % A description of each parameter follows:
279 % o magick_info: The magick info.
282 MagickExport MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info)
284 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
285 assert(magick_info != (MagickInfo *) NULL);
286 assert(magick_info->signature == MagickSignature);
287 return(magick_info->adjoin);
291 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
295 + G e t M a g i c k B l o b S u p p o r t %
299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
301 % GetMagickBlobSupport() returns MagickTrue if the magick supports blobs.
303 % The format of the GetMagickBlobSupport method is:
305 % MagickBooleanType GetMagickBlobSupport(const MagickInfo *magick_info)
307 % A description of each parameter follows:
309 % o magick_info: The magick info.
312 MagickExport MagickBooleanType GetMagickBlobSupport(
313 const MagickInfo *magick_info)
315 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
316 assert(magick_info != (MagickInfo *) NULL);
317 assert(magick_info->signature == MagickSignature);
318 return(magick_info->blob_support);
322 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326 + G e t M a g i c k D e s c r i p t i o n %
330 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
332 % GetMagickDescription() returns the magick description.
334 % The format of the GetMagickDescription method is:
336 % const char *GetMagickDescription(const MagickInfo *magick_info)
338 % A description of each parameter follows:
340 % o magick_info: The magick info.
343 MagickExport const char *GetMagickDescription(const MagickInfo *magick_info)
345 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
346 assert(magick_info != (MagickInfo *) NULL);
347 assert(magick_info->signature == MagickSignature);
348 return(magick_info->description);
352 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356 + G e t M a g i c k E n d i a n S u p p o r t %
360 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
362 % GetMagickEndianSupport() returns the MagickTrue if the coder respects
363 % endianness other than MSBEndian.
365 % The format of the GetMagickEndianSupport method is:
367 % MagickBooleanType GetMagickEndianSupport(const MagickInfo *magick_info)
369 % A description of each parameter follows:
371 % o magick_info: The magick info.
374 MagickExport MagickBooleanType GetMagickEndianSupport(
375 const MagickInfo *magick_info)
377 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
378 assert(magick_info != (MagickInfo *) NULL);
379 assert(magick_info->signature == MagickSignature);
380 return(magick_info->endian_support);
384 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388 + G e t M a g i c k I n f o %
392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
394 % GetMagickInfo() returns a pointer MagickInfo structure that matches
395 % the specified name. If name is NULL, the head of the image format list
398 % The format of the GetMagickInfo method is:
400 % const MagickInfo *GetMagickInfo(const char *name,Exception *exception)
402 % A description of each parameter follows:
404 % o name: the image format we are looking for.
406 % o exception: return any errors or warnings in this structure.
409 MagickExport const MagickInfo *GetMagickInfo(const char *name,
410 ExceptionInfo *exception)
412 register const MagickInfo
415 assert(exception != (ExceptionInfo *) NULL);
416 if ((magick_list == (SplayTreeInfo *) NULL) ||
417 (instantiate_magick == MagickFalse))
418 if (InitializeMagickList(exception) == MagickFalse)
419 return((const MagickInfo *) NULL);
420 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0))
422 #if defined(MAGICKCORE_MODULES_SUPPORT)
423 if (LocaleCompare(name,"*") == 0)
424 (void) OpenModules(exception);
426 LockSemaphoreInfo(magick_semaphore);
427 ResetSplayTreeIterator(magick_list);
428 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
429 UnlockSemaphoreInfo(magick_semaphore);
435 LockSemaphoreInfo(magick_semaphore);
436 ResetSplayTreeIterator(magick_list);
437 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
438 while (p != (const MagickInfo *) NULL)
440 if (LocaleCompare(p->name,name) == 0)
442 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
444 #if defined(MAGICKCORE_MODULES_SUPPORT)
445 if (p == (const MagickInfo *) NULL)
448 (void) OpenModule(name,exception);
449 ResetSplayTreeIterator(magick_list);
450 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
451 while (p != (const MagickInfo *) NULL)
453 if (LocaleCompare(p->name,name) == 0)
455 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
459 UnlockSemaphoreInfo(magick_semaphore);
464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
468 + G e t M a g i c k I n f o L i s t %
472 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
474 % GetMagickInfoList() returns any image formats that match the specified
477 % The format of the GetMagickInfoList function is:
479 % const MagickInfo **GetMagickInfoList(const char *pattern,
480 % size_t *number_formats,ExceptionInfo *exception)
482 % A description of each parameter follows:
484 % o pattern: Specifies a pointer to a text string containing a pattern.
486 % o number_formats: This integer returns the number of formats in the list.
488 % o exception: return any errors or warnings in this structure.
492 #if defined(__cplusplus) || defined(c_plusplus)
496 static int MagickInfoCompare(const void *x,const void *y)
502 p=(const MagickInfo **) x,
503 q=(const MagickInfo **) y;
504 return(LocaleCompare((*p)->name,(*q)->name));
507 #if defined(__cplusplus) || defined(c_plusplus)
511 MagickExport const MagickInfo **GetMagickInfoList(const char *pattern,
512 size_t *number_formats,ExceptionInfo *exception)
517 register const MagickInfo
524 Allocate magick list.
526 assert(pattern != (char *) NULL);
527 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
528 assert(number_formats != (size_t *) NULL);
530 p=GetMagickInfo("*",exception);
531 if (p == (const MagickInfo *) NULL)
532 return((const MagickInfo **) NULL);
533 formats=(const MagickInfo **) AcquireQuantumMemory((size_t)
534 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
535 if (formats == (const MagickInfo **) NULL)
536 return((const MagickInfo **) NULL);
538 Generate magick list.
540 LockSemaphoreInfo(magick_semaphore);
541 ResetSplayTreeIterator(magick_list);
542 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
543 for (i=0; p != (const MagickInfo *) NULL; )
545 if ((p->stealth == MagickFalse) &&
546 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
548 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
550 UnlockSemaphoreInfo(magick_semaphore);
551 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare);
552 formats[i]=(MagickInfo *) NULL;
553 *number_formats=(size_t) i;
558 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
562 + G e t M a g i c k L i s t %
566 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
568 % GetMagickList() returns any image formats that match the specified pattern.
570 % The format of the GetMagickList function is:
572 % char **GetMagickList(const char *pattern,size_t *number_formats,
573 % ExceptionInfo *exception)
575 % A description of each parameter follows:
577 % o pattern: Specifies a pointer to a text string containing a pattern.
579 % o number_formats: This integer returns the number of formats in the list.
581 % o exception: return any errors or warnings in this structure.
585 #if defined(__cplusplus) || defined(c_plusplus)
589 static int MagickCompare(const void *x,const void *y)
597 return(LocaleCompare(*p,*q));
600 #if defined(__cplusplus) || defined(c_plusplus)
604 MagickExport char **GetMagickList(const char *pattern,
605 size_t *number_formats,ExceptionInfo *exception)
610 register const MagickInfo
617 Allocate magick list.
619 assert(pattern != (char *) NULL);
620 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern);
621 assert(number_formats != (size_t *) NULL);
623 p=GetMagickInfo("*",exception);
624 if (p == (const MagickInfo *) NULL)
625 return((char **) NULL);
626 formats=(char **) AcquireQuantumMemory((size_t)
627 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats));
628 if (formats == (char **) NULL)
629 return((char **) NULL);
630 LockSemaphoreInfo(magick_semaphore);
631 ResetSplayTreeIterator(magick_list);
632 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
633 for (i=0; p != (const MagickInfo *) NULL; )
635 if ((p->stealth == MagickFalse) &&
636 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
637 formats[i++]=ConstantString(p->name);
638 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
640 UnlockSemaphoreInfo(magick_semaphore);
641 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare);
642 formats[i]=(char *) NULL;
643 *number_formats=(size_t) i;
648 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
652 + G e t M a g i c k M i m e T y p e %
656 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
658 % GetMagickMimeType() returns the magick mime type.
660 % The format of the GetMagickMimeType method is:
662 % const char *GetMagickMimeType(const MagickInfo *magick_info)
664 % A description of each parameter follows:
666 % o magick_info: The magick info.
669 MagickExport const char *GetMagickMimeType(const MagickInfo *magick_info)
671 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
672 assert(magick_info != (MagickInfo *) NULL);
673 assert(magick_info->signature == MagickSignature);
674 return(magick_info->mime_type);
678 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
682 % G e t M a g i c k P r e c i s i o n %
686 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
688 % GetMagickPrecision() returns the maximum number of significant digits to be
691 % The format of the GetMagickPrecision method is:
693 % int GetMagickPrecision(void)
696 MagickExport int GetMagickPrecision(void)
698 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
699 return(SetMagickPrecision(0));
703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
707 + G e t M a g i c k R a w S u p p o r t %
711 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
713 % GetMagickRawSupport() returns the MagickTrue if the coder is a raw format.
715 % The format of the GetMagickRawSupport method is:
717 % MagickBooleanType GetMagickRawSupport(const MagickInfo *magick_info)
719 % A description of each parameter follows:
721 % o magick_info: The magick info.
724 MagickExport MagickBooleanType GetMagickRawSupport(
725 const MagickInfo *magick_info)
727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
728 assert(magick_info != (MagickInfo *) NULL);
729 assert(magick_info->signature == MagickSignature);
730 return(magick_info->raw);
734 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
738 + G e t M a g i c k S e e k a b l e S t r e a m %
742 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
744 % GetMagickSeekableStream() returns MagickTrue if the magick supports a
747 % The format of the GetMagickSeekableStream method is:
749 % MagickBooleanType GetMagickSeekableStream(const MagickInfo *magick_info)
751 % A description of each parameter follows:
753 % o magick_info: The magick info.
756 MagickExport MagickBooleanType GetMagickSeekableStream(
757 const MagickInfo *magick_info)
759 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
760 assert(magick_info != (MagickInfo *) NULL);
761 assert(magick_info->signature == MagickSignature);
762 return(magick_info->seekable_stream);
766 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
770 + G e t M a g i c k T h r e a d S u p p o r t %
774 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
776 % GetMagickThreadSupport() returns MagickTrue if the magick supports threads.
778 % The format of the GetMagickThreadSupport method is:
780 % MagickStatusType GetMagickThreadSupport(const MagickInfo *magick_info)
782 % A description of each parameter follows:
784 % o magick_info: The magick info.
787 MagickExport MagickStatusType GetMagickThreadSupport(
788 const MagickInfo *magick_info)
790 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
791 assert(magick_info != (MagickInfo *) NULL);
792 assert(magick_info->signature == MagickSignature);
793 return(magick_info->thread_support);
797 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
801 + I n i t i a l i z e M a g i c k L i s t %
805 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
807 % InitializeMagickList() initializes the magick list.
809 % The format of the InitializeMagickList() method is:
811 % InitializeMagickList(Exceptioninfo *exception)
813 % A description of each parameter follows.
815 % o exception: return any errors or warnings in this structure.
819 static void *DestroyMagickNode(void *magick_info)
824 p=(MagickInfo *) magick_info;
825 if (p->module != (char *) NULL)
826 p->module=DestroyString(p->module);
827 if (p->note != (char *) NULL)
828 p->note=DestroyString(p->note);
829 if (p->mime_type != (char *) NULL)
830 p->mime_type=DestroyString(p->mime_type);
831 if (p->version != (char *) NULL)
832 p->version=DestroyString(p->version);
833 if (p->description != (char *) NULL)
834 p->description=DestroyString(p->description);
835 if (p->name != (char *) NULL)
836 p->name=DestroyString(p->name);
837 return(RelinquishMagickMemory(p));
840 static MagickBooleanType InitializeMagickList(ExceptionInfo *exception)
843 if ((magick_list == (SplayTreeInfo *) NULL) &&
844 (instantiate_magick == MagickFalse))
846 if (magick_semaphore == (SemaphoreInfo *) NULL)
847 AcquireSemaphoreInfo(&magick_semaphore);
848 LockSemaphoreInfo(magick_semaphore);
849 if ((magick_list == (SplayTreeInfo *) NULL) &&
850 (instantiate_magick == MagickFalse))
858 magick_list=NewSplayTree(CompareSplayTreeString,
859 (void *(*)(void *)) NULL,DestroyMagickNode);
860 if (magick_list == (SplayTreeInfo *) NULL)
861 ThrowFatalException(ResourceLimitFatalError,
862 "MemoryAllocationFailed");
863 magick_info=SetMagickInfo("ephemeral");
864 magick_info->stealth=MagickTrue;
865 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
866 if (status == MagickFalse)
867 ThrowFatalException(ResourceLimitFatalError,
868 "MemoryAllocationFailed");
869 magick_info=SetMagickInfo("clipmask");
870 magick_info->stealth=MagickTrue;
871 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
872 if (status == MagickFalse)
873 ThrowFatalException(ResourceLimitFatalError,
874 "MemoryAllocationFailed");
875 #if defined(MAGICKCORE_MODULES_SUPPORT)
876 (void) GetModuleInfo((char *) NULL,exception);
878 #if !defined(MAGICKCORE_BUILD_MODULES)
879 RegisterStaticModules();
881 instantiate_magick=MagickTrue;
883 UnlockSemaphoreInfo(magick_semaphore);
885 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
889 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
893 + I s M a g i c k C o n f l i c t %
897 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
899 % IsMagickConflict() returns MagickTrue if the image format conflicts with a
900 % logical drive (.e.g. X:).
902 % The format of the IsMagickConflict method is:
904 % MagickBooleanType IsMagickConflict(const char *magick)
906 % A description of each parameter follows:
908 % o magick: Specifies the image format.
911 MagickPrivate MagickBooleanType IsMagickConflict(const char *magick)
913 assert(magick != (char *) NULL);
914 #if defined(macintosh)
915 return(MACIsMagickConflict(magick));
917 return(VMSIsMagickConflict(magick));
918 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
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) FormatLocaleFile(file," Format Mode Description\n");
973 (void) FormatLocaleFile(file," Format Module Mode Description\n");
975 (void) FormatLocaleFile(file,
976 "--------------------------------------------------------"
977 "-----------------------\n");
978 for (i=0; i < (ssize_t) number_formats; i++)
980 if (magick_info[i]->stealth != MagickFalse)
982 (void) FormatLocaleFile(file,"%9s%c ",
983 magick_info[i]->name != (char *) NULL ? magick_info[i]->name : "",
984 magick_info[i]->blob_support != MagickFalse ? '*' : ' ');
985 #if defined(MAGICKCORE_MODULES_SUPPORT)
988 module[MaxTextExtent];
991 if (magick_info[i]->module != (char *) NULL)
992 (void) CopyMagickString(module,magick_info[i]->module,MaxTextExtent);
993 (void) ConcatenateMagickString(module," ",MaxTextExtent);
995 (void) FormatLocaleFile(file,"%9s ",module);
998 (void) FormatLocaleFile(file,"%c%c%c ",magick_info[i]->decoder ? 'r' : '-',
999 magick_info[i]->encoder ? 'w' : '-',magick_info[i]->encoder != NULL &&
1000 magick_info[i]->adjoin != MagickFalse ? '+' : '-');
1001 if (magick_info[i]->description != (char *) NULL)
1002 (void) FormatLocaleFile(file," %s",magick_info[i]->description);
1003 if (magick_info[i]->version != (char *) NULL)
1004 (void) FormatLocaleFile(file," (%s)",magick_info[i]->version);
1005 (void) FormatLocaleFile(file,"\n");
1006 if (magick_info[i]->note != (char *) NULL)
1011 text=StringToList(magick_info[i]->note);
1012 if (text != (char **) NULL)
1014 for (j=0; text[j] != (char *) NULL; j++)
1016 (void) FormatLocaleFile(file," %s\n",text[j]);
1017 text[j]=DestroyString(text[j]);
1019 text=(char **) RelinquishMagickMemory(text);
1023 (void) FormatLocaleFile(file,"\n* native blob support\n");
1024 (void) FormatLocaleFile(file,"r read support\n");
1025 (void) FormatLocaleFile(file,"w write support\n");
1026 (void) FormatLocaleFile(file,"+ support for multiple images\n");
1027 (void) fflush(file);
1028 magick_info=(const MagickInfo **) RelinquishMagickMemory((void *)
1034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1038 % I s M a g i c k C o r e I n s t a n t i a t e d %
1042 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1044 % IsMagickCoreInstantiated() returns MagickTrue if the ImageMagick environment
1045 % is currently instantiated: MagickCoreGenesis() has been called but
1046 % MagickDestroy() has not.
1048 % The format of the IsMagickCoreInstantiated method is:
1050 % MagickBooleanType IsMagickCoreInstantiated(void)
1053 MagickExport MagickBooleanType IsMagickCoreInstantiated(void)
1055 return(instantiate_magickcore);
1059 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1063 + M a g i c k C o m p o n e n t G e n e s i s %
1067 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1069 % MagickComponentGenesis() instantiates the magick component.
1071 % The format of the MagickComponentGenesis method is:
1073 % MagickBooleanType MagickComponentGenesis(void)
1076 MagickPrivate MagickBooleanType MagickComponentGenesis(void)
1078 AcquireSemaphoreInfo(&magick_semaphore);
1083 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1087 + M a g i c k C o m p o n e n t T e r m i n u s %
1091 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1093 % MagickComponentTerminus() destroys the magick component.
1095 % The format of the MagickComponentTerminus method is:
1097 % void MagickComponentTerminus(void)
1100 MagickPrivate void MagickComponentTerminus(void)
1102 if (magick_semaphore == (SemaphoreInfo *) NULL)
1103 AcquireSemaphoreInfo(&magick_semaphore);
1104 LockSemaphoreInfo(magick_semaphore);
1105 if (magick_list != (SplayTreeInfo *) NULL)
1106 magick_list=DestroySplayTree(magick_list);
1107 instantiate_magick=MagickFalse;
1108 UnlockSemaphoreInfo(magick_semaphore);
1109 DestroySemaphoreInfo(&magick_semaphore);
1113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1117 % M a g i c k C o r e G e n e s i s %
1121 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1123 % MagickCoreGenesis() initializes the MagickCore environment.
1125 % The format of the MagickCoreGenesis function is:
1127 % MagickCoreGenesis(const char *path,
1128 % const MagickBooleanType establish_signal_handlers)
1130 % A description of each parameter follows:
1132 % o path: the execution path of the current ImageMagick client.
1134 % o establish_signal_handlers: set to MagickTrue to use MagickCore's own
1135 % signal handlers for common signals.
1139 static SignalHandler *SetMagickSignalHandler(int signal_number,
1140 SignalHandler *handler)
1142 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1154 sigaddset(&mask,signal_number);
1155 sigprocmask(SIG_BLOCK,&mask,NULL);
1156 action.sa_mask=mask;
1157 action.sa_handler=handler;
1159 #if defined(SA_INTERRUPT)
1160 action.sa_flags|=SA_INTERRUPT;
1162 status=sigaction(signal_number,&action,&previous_action);
1165 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1166 return(previous_action.sa_handler);
1168 return(signal(signal_number,handler));
1172 static void MagickSignalHandler(int signal_number)
1174 #if !defined(MAGICKCORE_HAVE_SIGACTION)
1175 (void) signal(signal_number,SIG_IGN);
1177 AsynchronousResourceComponentTerminus();
1178 instantiate_magick=MagickFalse;
1179 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1180 #if defined(SIGQUIT)
1181 if (signal_number == SIGQUIT)
1184 #if defined(SIGABRT)
1185 if (signal_number == SIGABRT)
1189 if (signal_number == SIGFPE)
1192 #if defined(SIGXCPU)
1193 if (signal_number == SIGXCPU)
1196 #if defined(SIGXFSZ)
1197 if (signal_number == SIGXFSZ)
1200 #if defined(SIGSEGV)
1201 if (signal_number == SIGSEGV)
1204 #if !defined(MAGICKCORE_HAVE__EXIT)
1205 exit(signal_number);
1208 if (signal_number == SIGHUP)
1209 exit(signal_number);
1211 #if defined(SIGINT) && !defined(MAGICKCORE_WINDOWS_SUPPORT)
1212 if (signal_number == SIGINT)
1213 exit(signal_number);
1215 #if defined(SIGTERM)
1216 if (signal_number == SIGTERM)
1217 exit(signal_number);
1219 #if defined(MAGICKCORE_HAVE_RAISE)
1220 if (signal_handlers[signal_number] != MagickSignalHandler)
1221 raise(signal_number);
1223 _exit(signal_number); /* do not invoke registered atexit() methods */
1227 static SignalHandler *RegisterMagickSignalHandler(int signal_number)
1232 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1233 if (handler == SIG_ERR)
1235 if (handler != SIG_DFL)
1236 handler=SetMagickSignalHandler(signal_number,handler);
1238 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1239 "Register handler for signal: %d",signal_number);
1243 MagickExport void MagickCoreGenesis(const char *path,
1244 const MagickBooleanType establish_signal_handlers)
1248 execution_path[MaxTextExtent],
1249 filename[MaxTextExtent];
1252 Initialize the Magick environment.
1254 InitializeMagickMutex();
1256 if (instantiate_magickcore != MagickFalse)
1258 UnlockMagickMutex();
1261 (void) SemaphoreComponentGenesis();
1262 (void) LogComponentGenesis();
1263 (void) LocaleComponentGenesis();
1264 (void) RandomComponentGenesis();
1265 events=GetEnvironmentValue("MAGICK_DEBUG");
1266 if (events != (char *) NULL)
1268 (void) SetLogEventMask(events);
1269 events=DestroyString(events);
1271 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1272 #if defined(_DEBUG) && !defined(__BORLANDC__) && !defined(__MINGW32__) && !defined(__MINGW64__)
1273 if (IsEventLogging() != MagickFalse)
1278 debug=_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
1279 debug|=_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF;
1280 debug=_CrtSetDbgFlag(debug);
1281 _ASSERTE(_CrtCheckMemory());
1286 Set client name and execution path.
1288 (void) GetExecutionPath(execution_path,MaxTextExtent);
1289 if ((path != (const char *) NULL) && (*path == *DirectorySeparator) &&
1290 (IsPathAccessible(path) != MagickFalse))
1291 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1292 GetPathComponent(execution_path,TailPath,filename);
1293 (void) SetClientName(filename);
1294 GetPathComponent(execution_path,HeadPath,execution_path);
1295 (void) SetClientPath(execution_path);
1296 if (establish_signal_handlers != MagickFalse)
1299 Set signal handlers.
1301 #if defined(SIGABRT)
1302 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1303 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1305 #if defined(SIGSEGV)
1306 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1307 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1310 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1311 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1314 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1315 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1317 #if defined(SIGINT) && !defined(MAGICKCORE_WINDOWS_SUPPORT)
1318 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1319 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1321 #if defined(SIGQUIT)
1322 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1323 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1325 #if defined(SIGTERM)
1326 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1327 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1329 #if defined(SIGXCPU)
1330 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1331 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1333 #if defined(SIGXFSZ)
1334 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1335 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1339 Instantiate magick resources.
1341 (void) ConfigureComponentGenesis();
1342 (void) PolicyComponentGenesis();
1343 (void) CacheComponentGenesis();
1344 (void) RegistryComponentGenesis();
1345 (void) ResourceComponentGenesis();
1346 (void) CoderComponentGenesis();
1347 (void) MagickComponentGenesis();
1348 #if defined(MAGICKCORE_MODULES_SUPPORT)
1349 (void) ModuleComponentGenesis();
1351 (void) DelegateComponentGenesis();
1352 (void) MagicComponentGenesis();
1353 (void) ColorComponentGenesis();
1354 (void) TypeComponentGenesis();
1355 (void) MimeComponentGenesis();
1356 (void) ConstituteComponentGenesis();
1357 (void) AnnotateComponentGenesis();
1358 #if defined(MAGICKCORE_X11_DELEGATE)
1359 (void) XComponentGenesis();
1361 instantiate_magickcore=MagickTrue;
1362 UnlockMagickMutex();
1366 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1370 % M a g i c k C o r e T e r m i n u s %
1374 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1376 % MagickCoreTerminus() destroys the MagickCore environment.
1378 % The format of the MagickCoreTerminus function is:
1380 % MagickCoreTerminus(void)
1383 MagickExport void MagickCoreTerminus(void)
1385 InitializeMagickMutex();
1387 if (instantiate_magickcore == MagickFalse)
1389 UnlockMagickMutex();
1392 #if defined(MAGICKCORE_X11_DELEGATE)
1393 XComponentTerminus();
1395 AnnotateComponentTerminus();
1396 ConstituteComponentTerminus();
1397 MimeComponentTerminus();
1398 TypeComponentTerminus();
1399 ColorComponentTerminus();
1400 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1401 NTGhostscriptUnLoadDLL();
1403 MagicComponentTerminus();
1404 DelegateComponentTerminus();
1405 MagickComponentTerminus();
1406 #if !defined(MAGICKCORE_BUILD_MODULES)
1407 UnregisterStaticModules();
1409 #if defined(MAGICKCORE_MODULES_SUPPORT)
1410 ModuleComponentTerminus();
1412 CoderComponentTerminus();
1413 ResourceComponentTerminus();
1414 RegistryComponentTerminus();
1415 CacheComponentTerminus();
1416 PolicyComponentTerminus();
1417 ConfigureComponentTerminus();
1418 RandomComponentTerminus();
1419 LocaleComponentTerminus();
1420 LogComponentTerminus();
1421 SemaphoreComponentTerminus();
1422 instantiate_magickcore=MagickFalse;
1423 UnlockMagickMutex();
1424 DestroyMagickMutex();
1428 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1432 + R e g i s t e r M a g i c k I n f o %
1436 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1438 % RegisterMagickInfo() adds attributes for a particular image format to the
1439 % list of supported formats. The attributes include the image format name,
1440 % a method to read and/or write the format, whether the format supports the
1441 % saving of more than one frame to the same file or blob, whether the format
1442 % supports native in-memory I/O, and a brief description of the format.
1444 % The format of the RegisterMagickInfo method is:
1446 % MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1448 % A description of each parameter follows:
1450 % o magick_info: the magick info.
1453 MagickExport MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1459 Delete any existing name.
1461 assert(magick_info != (MagickInfo *) NULL);
1462 assert(magick_info->signature == MagickSignature);
1463 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",magick_info->name);
1464 if (magick_list == (SplayTreeInfo *) NULL)
1465 return((MagickInfo *) NULL);
1466 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1467 if (status == MagickFalse)
1468 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1469 return(magick_info);
1473 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1477 + S e t M a g i c k I n f o %
1481 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1483 % SetMagickInfo() allocates a MagickInfo structure and initializes the members
1484 % to default values.
1486 % The format of the SetMagickInfo method is:
1488 % MagickInfo *SetMagickInfo(const char *name)
1490 % A description of each parameter follows:
1492 % o magick_info: Method SetMagickInfo returns the allocated and initialized
1493 % MagickInfo structure.
1495 % o name: a character string that represents the image format associated
1496 % with the MagickInfo structure.
1499 MagickExport MagickInfo *SetMagickInfo(const char *name)
1504 assert(name != (const char *) NULL);
1505 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name);
1506 magick_info=(MagickInfo *) AcquireMagickMemory(sizeof(*magick_info));
1507 if (magick_info == (MagickInfo *) NULL)
1508 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1509 (void) ResetMagickMemory(magick_info,0,sizeof(*magick_info));
1510 magick_info->name=ConstantString(name);
1511 magick_info->adjoin=MagickTrue;
1512 magick_info->blob_support=MagickTrue;
1513 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1514 EncoderThreadSupport);
1515 magick_info->signature=MagickSignature;
1516 return(magick_info);
1520 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1524 % S e t M a g i c k P r e c i s i o n %
1528 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1530 % SetMagickPrecision() sets the maximum number of significant digits to be
1533 % An input argument of 0 returns the current precision setting.
1535 % A negative value forces the precision to reset to a default value according
1536 % to the environment variable "MAGICK_PRECISION", the current 'policy'
1537 % configuration setting, or the default value of '6', in that order.
1539 % The format of the SetMagickPrecision method is:
1541 % int SetMagickPrecision(const int precision)
1543 % A description of each parameter follows:
1545 % o precision: set the maximum number of significant digits to be printed.
1548 MagickExport int SetMagickPrecision(const int precision)
1550 #define MagickPrecision 6
1553 magick_precision = 0;
1555 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
1557 magick_precision=precision;
1558 if ((precision < 0) || (magick_precision == 0))
1564 Precision reset, or it has not been set yet
1566 magick_precision = MagickPrecision;
1567 limit=GetEnvironmentValue("MAGICK_PRECISION");
1568 if (limit == (char *) NULL)
1569 limit=GetPolicyValue("precision");
1570 if (limit != (char *) NULL)
1572 magick_precision=StringToInteger(limit);
1573 limit=DestroyString(limit);
1576 return(magick_precision);
1580 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1584 + U n r e g i s t e r M a g i c k I n f o %
1588 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1590 % UnregisterMagickInfo() removes a name from the magick info list. It returns
1591 % MagickFalse if the name does not exist in the list otherwise MagickTrue.
1593 % The format of the UnregisterMagickInfo method is:
1595 % MagickBooleanType UnregisterMagickInfo(const char *name)
1597 % A description of each parameter follows:
1599 % o name: a character string that represents the image format we are
1603 MagickExport MagickBooleanType UnregisterMagickInfo(const char *name)
1605 register const MagickInfo
1611 assert(name != (const char *) NULL);
1612 if (magick_list == (SplayTreeInfo *) NULL)
1613 return(MagickFalse);
1614 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1615 return(MagickFalse);
1616 LockSemaphoreInfo(magick_semaphore);
1617 ResetSplayTreeIterator(magick_list);
1618 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1619 while (p != (const MagickInfo *) NULL)
1621 if (LocaleCompare(p->name,name) == 0)
1623 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list);
1625 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1626 UnlockSemaphoreInfo(magick_semaphore);