43#include "magick/studio.h"
44#include "magick/annotate.h"
45#include "magick/blob.h"
46#include "magick/blob-private.h"
47#include "magick/cache.h"
48#include "magick/coder.h"
49#include "magick/client.h"
50#include "magick/coder.h"
51#include "magick/configure.h"
52#include "magick/constitute.h"
53#include "magick/delegate.h"
54#include "magick/draw.h"
55#include "magick/exception.h"
56#include "magick/exception-private.h"
57#include "magick/locale_.h"
58#include "magick/log.h"
59#include "magick/magic.h"
60#include "magick/magick.h"
61#include "magick/memory_.h"
62#include "magick/mime.h"
63#include "magick/module.h"
64#include "magick/monitor-private.h"
65#include "magick/mutex.h"
66#include "magick/nt-base-private.h"
67#include "magick/nt-feature.h"
68#include "magick/opencl-private.h"
69#include "magick/random_.h"
70#include "magick/registry.h"
71#include "magick/resource_.h"
72#include "magick/policy.h"
73#include "magick/semaphore.h"
74#include "magick/semaphore-private.h"
75#include "magick/signature-private.h"
76#include "magick/splay-tree.h"
77#include "magick/static.h"
78#include "magick/string_.h"
79#include "magick/string-private.h"
80#include "magick/thread_.h"
81#include "magick/thread-private.h"
82#include "magick/timer-private.h"
83#include "magick/token.h"
84#include "magick/utility.h"
85#include "magick/xwindow-private.h"
91# define SIG_DFL ((SignalHandler *) 0)
94# define SIG_ERR ((SignalHandler *) -1)
103typedef void SignalHandler(
int);
112 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
115 *magick_list = (SplayTreeInfo *) NULL;
117static volatile MagickBooleanType
118 instantiate_magickcore = MagickFalse,
119 magickcore_signal_in_progress = MagickFalse,
120 magick_list_initialized = MagickFalse;
123 magick_precision = 0;
128static MagickBooleanType
129 IsMagickTreeInstantiated(ExceptionInfo *);
153MagickExport DecodeImageHandler *GetImageDecoder(
const MagickInfo *magick_info)
155 assert(magick_info != (MagickInfo *) NULL);
156 assert(magick_info->signature == MagickCoreSignature);
157 if (IsEventLogging() != MagickFalse)
158 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
159 return(magick_info->decoder);
184MagickExport EncodeImageHandler *GetImageEncoder(
const MagickInfo *magick_info)
186 assert(magick_info != (MagickInfo *) NULL);
187 assert(magick_info->signature == MagickCoreSignature);
188 if (IsEventLogging() != MagickFalse)
189 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
190 return(magick_info->encoder);
222MagickExport MagickBooleanType GetImageMagick(
const unsigned char *magick,
223 const size_t length,
char *format)
234 assert(magick != (
const unsigned char *) NULL);
235 if (IsEventLogging() != MagickFalse)
236 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
237 exception=AcquireExceptionInfo();
238 p=GetMagickInfo(
"*",exception);
239 exception=DestroyExceptionInfo(exception);
240 if (p == (
const MagickInfo *) NULL)
243 LockSemaphoreInfo(magick_semaphore);
244 ResetSplayTreeIterator(magick_list);
245 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
246 while (p != (
const MagickInfo *) NULL)
248 if ((p->magick != (IsImageFormatHandler *) NULL) &&
249 (p->magick(magick,length) != 0))
252 (void) CopyMagickString(format,p->name,MaxTextExtent);
255 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
257 UnlockSemaphoreInfo(magick_semaphore);
283MagickExport MagickBooleanType GetMagickAdjoin(
const MagickInfo *magick_info)
285 assert(magick_info != (MagickInfo *) NULL);
286 assert(magick_info->signature == MagickCoreSignature);
287 if (IsEventLogging() != MagickFalse)
288 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
289 return(magick_info->adjoin);
314MagickExport MagickBooleanType GetMagickBlobSupport(
315 const MagickInfo *magick_info)
317 assert(magick_info != (MagickInfo *) NULL);
318 assert(magick_info->signature == MagickCoreSignature);
319 if (IsEventLogging() != MagickFalse)
320 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
321 return(magick_info->blob_support);
346MagickExport
const char *GetMagickDescription(
const MagickInfo *magick_info)
348 assert(magick_info != (MagickInfo *) NULL);
349 assert(magick_info->signature == MagickCoreSignature);
350 if (IsEventLogging() != MagickFalse)
351 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
352 return(magick_info->description);
378MagickExport MagickBooleanType GetMagickEndianSupport(
379 const MagickInfo *magick_info)
381 assert(magick_info != (MagickInfo *) NULL);
382 assert(magick_info->signature == MagickCoreSignature);
383 if (IsEventLogging() != MagickFalse)
384 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
385 return(magick_info->endian_support);
414MagickExport
const MagickInfo *GetMagickInfo(
const char *name,
415 ExceptionInfo *exception)
423 assert(exception != (ExceptionInfo *) NULL);
424 if (IsMagickTreeInstantiated(exception) == MagickFalse)
425 return((
const MagickInfo *) NULL);
426 magick_info=(
const MagickInfo *) NULL;
427 if ((name != (
const char *) NULL) && (*name !=
'\0'))
429 LockSemaphoreInfo(magick_semaphore);
430 if (LocaleCompare(name,
"*") == 0)
431#if defined(MAGICKCORE_BUILD_MODULES)
432 (void) OpenModules(exception);
434 RegisterStaticModules();
438 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,
440 if (magick_info == (
const MagickInfo *) NULL)
441#if defined(MAGICKCORE_BUILD_MODULES)
442 (void) OpenModule(name,exception);
444 (void) RegisterStaticModule(name,exception);
447 UnlockSemaphoreInfo(magick_semaphore);
449 if ((name == (
const char *) NULL) || (LocaleCompare(name,
"*") == 0))
450 return((
const MagickInfo *) GetRootValueFromSplayTree(magick_list));
451 if (magick_info == (
const MagickInfo *) NULL)
452 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,name);
485#if defined(__cplusplus) || defined(c_plusplus)
489static int MagickInfoCompare(
const void *x,
const void *y)
495 p=(
const MagickInfo **) x,
496 q=(
const MagickInfo **) y;
497 return(LocaleCompare((*p)->name,(*q)->name));
500#if defined(__cplusplus) || defined(c_plusplus)
504MagickExport
const MagickInfo **GetMagickInfoList(
const char *pattern,
505 size_t *number_formats,ExceptionInfo *exception)
519 assert(pattern != (
char *) NULL);
520 assert(number_formats != (
size_t *) NULL);
521 if (IsEventLogging() != MagickFalse)
522 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
524 p=GetMagickInfo(
"*",exception);
525 if (p == (
const MagickInfo *) NULL)
526 return((
const MagickInfo **) NULL);
527 formats=(
const MagickInfo **) AcquireQuantumMemory((
size_t)
528 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
529 if (formats == (
const MagickInfo **) NULL)
530 return((
const MagickInfo **) NULL);
534 LockSemaphoreInfo(magick_semaphore);
535 ResetSplayTreeIterator(magick_list);
536 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
537 for (i=0; p != (
const MagickInfo *) NULL; )
539 if ((p->stealth == MagickFalse) &&
540 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
542 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
544 UnlockSemaphoreInfo(magick_semaphore);
545 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickInfoCompare);
546 formats[i]=(MagickInfo *) NULL;
547 *number_formats=(size_t) i;
579#if defined(__cplusplus) || defined(c_plusplus)
583static int MagickCompare(
const void *x,
const void *y)
591 return(LocaleCompare(*p,*q));
594#if defined(__cplusplus) || defined(c_plusplus)
598MagickExport
char **GetMagickList(
const char *pattern,
599 size_t *number_formats,ExceptionInfo *exception)
613 assert(pattern != (
char *) NULL);
614 assert(number_formats != (
size_t *) NULL);
615 if (IsEventLogging() != MagickFalse)
616 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
618 p=GetMagickInfo(
"*",exception);
619 if (p == (
const MagickInfo *) NULL)
620 return((
char **) NULL);
621 formats=(
char **) AcquireQuantumMemory((
size_t)
622 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
623 if (formats == (
char **) NULL)
624 return((
char **) NULL);
625 LockSemaphoreInfo(magick_semaphore);
626 ResetSplayTreeIterator(magick_list);
627 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
628 for (i=0; p != (
const MagickInfo *) NULL; )
630 if ((p->stealth == MagickFalse) &&
631 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
632 formats[i++]=ConstantString(p->name);
633 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
635 UnlockSemaphoreInfo(magick_semaphore);
636 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickCompare);
637 formats[i]=(
char *) NULL;
638 *number_formats=(size_t) i;
664MagickExport
const char *GetMagickMimeType(
const MagickInfo *magick_info)
666 assert(magick_info != (MagickInfo *) NULL);
667 assert(magick_info->signature == MagickCoreSignature);
668 if (IsEventLogging() != MagickFalse)
669 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
670 return(magick_info->mime_type);
692MagickExport
int GetMagickPrecision(
void)
694 if (IsEventLogging() != MagickFalse)
695 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
696 return(SetMagickPrecision(0));
721MagickExport MagickBooleanType GetMagickRawSupport(
722 const MagickInfo *magick_info)
724 assert(magick_info != (MagickInfo *) NULL);
725 assert(magick_info->signature == MagickCoreSignature);
726 if (IsEventLogging() != MagickFalse)
727 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
728 return(magick_info->raw);
754MagickExport MagickBooleanType GetMagickSeekableStream(
755 const MagickInfo *magick_info)
757 assert(magick_info != (MagickInfo *) NULL);
758 assert(magick_info->signature == MagickCoreSignature);
759 if (IsEventLogging() != MagickFalse)
760 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
761 return(magick_info->seekable_stream);
786MagickExport MagickStatusType GetMagickThreadSupport(
787 const MagickInfo *magick_info)
789 assert(magick_info != (MagickInfo *) NULL);
790 assert(magick_info->signature == MagickCoreSignature);
791 if (IsEventLogging() != MagickFalse)
792 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
793 return(magick_info->thread_support);
820static void *DestroyMagickNode(
void *magick_info)
825 p=(MagickInfo *) magick_info;
826 if (p->magick_module != (
char *) NULL)
827 p->magick_module=DestroyString(p->magick_module);
828 if (p->note != (
char *) NULL)
829 p->note=DestroyString(p->note);
830 if (p->mime_type != (
char *) NULL)
831 p->mime_type=DestroyString(p->mime_type);
832 if (p->version != (
char *) NULL)
833 p->version=DestroyString(p->version);
834 if (p->description != (
char *) NULL)
835 p->description=DestroyString(p->description);
836 if (p->name != (
char *) NULL)
837 p->name=DestroyString(p->name);
839 DestroySemaphoreInfo(&p->semaphore);
840 return(RelinquishMagickMemory(p));
843static MagickBooleanType IsMagickTreeInstantiated(ExceptionInfo *exception)
845 if (magick_list_initialized == MagickFalse)
848 ActivateSemaphoreInfo(&magick_semaphore);
849 LockSemaphoreInfo(magick_semaphore);
850 if (magick_list_initialized == MagickFalse)
858 magick_list=NewSplayTree(CompareSplayTreeString,(
void *(*)(
void *))
859 NULL,DestroyMagickNode);
860 if (magick_list == (SplayTreeInfo *) NULL)
861 ThrowFatalException(ResourceLimitFatalError,
862 "MemoryAllocationFailed");
863 magick_info=SetMagickInfo(
"clipmask");
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#if defined(MAGICKCORE_MODULES_SUPPORT)
870 (void) GetModuleInfo((
char *) NULL,exception);
872 magick_list_initialized=MagickTrue;
874 UnlockSemaphoreInfo(magick_semaphore);
876 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
902MagickExport MagickBooleanType IsMagickConflict(
const char *magick)
904 assert(magick != (
char *) NULL);
905#if defined(macintosh)
906 return(MACIsMagickConflict(magick));
908 return(VMSIsMagickConflict(magick));
909#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
910 return(NTIsMagickConflict(magick));
940MagickExport MagickBooleanType ListMagickInfo(FILE *file,
941 ExceptionInfo *exception)
955 if (file == (FILE *) NULL)
957 magick_info=GetMagickInfoList(
"*",&number_formats,exception);
958 if (magick_info == (
const MagickInfo **) NULL)
960 ClearMagickException(exception);
961#if !defined(MAGICKCORE_MODULES_SUPPORT)
962 (void) FormatLocaleFile(file,
" Format Mode Description\n");
964 (void) FormatLocaleFile(file,
" Format Module Mode Description\n");
966 (void) FormatLocaleFile(file,
967 "--------------------------------------------------------"
968 "-----------------------\n");
969 for (i=0; i < (ssize_t) number_formats; i++)
971 if (magick_info[i]->stealth != MagickFalse)
973 (void) FormatLocaleFile(file,
"%9s%c ",
974 magick_info[i]->name != (
char *) NULL ? magick_info[i]->name :
"",
975 magick_info[i]->blob_support != MagickFalse ?
'*' :
' ');
976#if defined(MAGICKCORE_MODULES_SUPPORT)
979 magick_module[MaxTextExtent];
982 if (magick_info[i]->magick_module != (
char *) NULL)
983 (void) CopyMagickString(magick_module,magick_info[i]->magick_module,
985 (void) ConcatenateMagickString(magick_module,
" ",MaxTextExtent);
986 magick_module[9]=
'\0';
987 (void) FormatLocaleFile(file,
"%9s ",magick_module);
990 (void) FormatLocaleFile(file,
"%c%c%c ",magick_info[i]->decoder ?
'r' :
'-',
991 magick_info[i]->encoder ?
'w' :
'-',magick_info[i]->encoder != NULL &&
992 magick_info[i]->adjoin != MagickFalse ?
'+' :
'-');
993 if (magick_info[i]->description != (
char *) NULL)
994 (void) FormatLocaleFile(file,
" %s",magick_info[i]->description);
995 if (magick_info[i]->version != (
char *) NULL)
996 (void) FormatLocaleFile(file,
" (%s)",magick_info[i]->version);
997 (void) FormatLocaleFile(file,
"\n");
998 if (magick_info[i]->note != (
char *) NULL)
1003 text=StringToList(magick_info[i]->note);
1004 if (text != (
char **) NULL)
1006 for (j=0; text[j] != (
char *) NULL; j++)
1008 (void) FormatLocaleFile(file,
" %s\n",text[j]);
1009 text[j]=DestroyString(text[j]);
1011 text=(
char **) RelinquishMagickMemory(text);
1015 (void) FormatLocaleFile(file,
"\n* native blob support\n");
1016 (void) FormatLocaleFile(file,
"r read support\n");
1017 (void) FormatLocaleFile(file,
"w write support\n");
1018 (void) FormatLocaleFile(file,
"+ support for multiple images\n");
1019 (void) fflush(file);
1020 magick_info=(
const MagickInfo **) RelinquishMagickMemory((
void *)
1045MagickExport MagickBooleanType IsMagickCoreInstantiated(
void)
1047 return(instantiate_magickcore);
1068MagickExport MagickBooleanType MagickComponentGenesis(
void)
1071 magick_semaphore=AllocateSemaphoreInfo();
1093MagickExport
void MagickComponentTerminus(
void)
1096 ActivateSemaphoreInfo(&magick_semaphore);
1097 LockSemaphoreInfo(magick_semaphore);
1098 if (magick_list != (SplayTreeInfo *) NULL)
1100 magick_list=DestroySplayTree(magick_list);
1101 magick_list_initialized=MagickFalse;
1103 UnlockSemaphoreInfo(magick_semaphore);
1104 DestroySemaphoreInfo(&magick_semaphore);
1134static SignalHandler *SetMagickSignalHandler(
int signal_number,
1135 SignalHandler *handler)
1137#if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1149 sigaddset(&mask,signal_number);
1150 sigprocmask(SIG_BLOCK,&mask,NULL);
1151 action.sa_mask=mask;
1152 action.sa_handler=handler;
1154#if defined(SA_INTERRUPT)
1155 action.sa_flags|=SA_INTERRUPT;
1157#if defined(SA_ONSTACK)
1158 action.sa_flags|=SA_ONSTACK;
1160 previous_action.sa_handler=SIG_DFL;
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));
1171static void MagickSignalHandler(
int signal_number)
1173 if (magickcore_signal_in_progress != MagickFalse)
1174 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1175 magickcore_signal_in_progress=MagickTrue;
1176 AsynchronousResourceComponentTerminus();
1178 if (signal_number == SIGQUIT)
1182 if (signal_number == SIGABRT)
1186 if (signal_number == SIGBUS)
1190 if (signal_number == SIGFPE)
1194 if (signal_number == SIGSEGV)
1197#if !defined(MAGICKCORE_HAVE__EXIT)
1198 exit(signal_number);
1201 if (signal_number == SIGHUP)
1202 _exit(signal_number);
1205 if (signal_number == SIGINT)
1206 _exit(signal_number);
1209 if (signal_number == SIGTERM)
1210 _exit(signal_number);
1212#if defined(MAGICKCORE_HAVE_RAISE)
1213 if (signal_handlers[signal_number] != MagickSignalHandler)
1214 raise(signal_number);
1216 _exit(signal_number);
1220static SignalHandler *RegisterMagickSignalHandler(
int signal_number)
1225 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1226 if (handler == SIG_ERR)
1228 if (handler != SIG_DFL)
1229 handler=SetMagickSignalHandler(signal_number,handler);
1231 (
void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1232 "Register handler for signal: %d",signal_number);
1236static void SetClientNameAndPath(
const char *path)
1239 execution_path[MaxTextExtent],
1240 filename[MaxTextExtent];
1242#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1243 if ((path != (
const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1245 if ((path != (
const char *) NULL) && (*path == *DirectorySeparator) &&
1246 (IsPathAccessible(path) != MagickFalse))
1248 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1250 (
void) GetExecutionPath(execution_path,MaxTextExtent);
1251 GetPathComponent(execution_path,TailPath,filename);
1252 (void) SetClientName(filename);
1253 GetPathComponent(execution_path,HeadPath,execution_path);
1254 (void) SetClientPath(execution_path);
1257MagickExport
void MagickCoreGenesis(
const char *path,
1258 const MagickBooleanType establish_signal_handlers)
1266#if defined(__has_feature)
1267#if __has_feature(address_sanitizer)
1268 (void) putenv(
"MAGICK_THREAD_LIMIT=1");
1271 InitializeMagickMutex();
1273 if (instantiate_magickcore != MagickFalse)
1275 UnlockMagickMutex();
1278 (void) SemaphoreComponentGenesis();
1279 (void) ExceptionComponentGenesis();
1280 SetClientNameAndPath(path);
1281 (void) LogComponentGenesis();
1282 (void) LocaleComponentGenesis();
1283 (void) RandomComponentGenesis();
1284 events=GetEnvironmentValue(
"MAGICK_DEBUG");
1285 if (events != (
char *) NULL)
1287 (void) SetLogEventMask(events);
1288 events=DestroyString(events);
1290#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1293 if (establish_signal_handlers != MagickFalse)
1299 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1300 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1303 if (signal_handlers[SIGBUS] == (SignalHandler *) NULL)
1304 signal_handlers[SIGBUS]=RegisterMagickSignalHandler(SIGBUS);
1307 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1308 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1311 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1312 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1315 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1316 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1319 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1320 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1323 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1324 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1327 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1328 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1331 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1332 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1335 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1336 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1342 (void) ConfigureComponentGenesis();
1343 (void) PolicyComponentGenesis();
1344 (void) CacheComponentGenesis();
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) AnnotateComponentGenesis();
1357#if defined(MAGICKCORE_X11_DELEGATE)
1358 (void) XComponentGenesis();
1360 (void) RegistryComponentGenesis();
1361 (void) MonitorComponentGenesis();
1362 instantiate_magickcore=MagickTrue;
1363 UnlockMagickMutex();
1406MagickExport
void MagickCoreTerminus(
void)
1408 InitializeMagickMutex();
1410 if (instantiate_magickcore == MagickFalse)
1412 UnlockMagickMutex();
1415 MonitorComponentTerminus();
1416 RegistryComponentTerminus();
1417 AnnotateComponentTerminus();
1418 MimeComponentTerminus();
1419 TypeComponentTerminus();
1420#if defined(MAGICKCORE_OPENCL_SUPPORT)
1423 ColorComponentTerminus();
1424#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1425 NTWindowsTerminus();
1427 MagicComponentTerminus();
1428 DelegateComponentTerminus();
1429 MagickComponentTerminus();
1430#if !defined(MAGICKCORE_BUILD_MODULES)
1431 UnregisterStaticModules();
1433#if defined(MAGICKCORE_MODULES_SUPPORT)
1434 ModuleComponentTerminus();
1436#if defined(MAGICKCORE_X11_DELEGATE)
1437 XComponentTerminus();
1439 CoderComponentTerminus();
1440 AsynchronousResourceComponentTerminus();
1441 ResourceComponentTerminus();
1442 CacheComponentTerminus();
1443 PolicyComponentTerminus();
1444 ConfigureComponentTerminus();
1445 RandomComponentTerminus();
1446 LocaleComponentTerminus();
1447 LogComponentTerminus();
1448 ExceptionComponentTerminus();
1449 instantiate_magickcore=MagickFalse;
1450 UnlockMagickMutex();
1451 SemaphoreComponentTerminus();
1480MagickExport MagickInfo *RegisterMagickInfo(MagickInfo *magick_info)
1488 assert(magick_info != (MagickInfo *) NULL);
1489 assert(magick_info->signature == MagickCoreSignature);
1490 if (IsEventLogging() != MagickFalse)
1491 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",magick_info->name);
1492 if (magick_list == (SplayTreeInfo *) NULL)
1493 return((MagickInfo *) NULL);
1494 if (((magick_info->thread_support & DecoderThreadSupport) == 0) ||
1495 ((magick_info->thread_support & EncoderThreadSupport) == 0))
1496 magick_info->semaphore=AllocateSemaphoreInfo();
1497 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1498 if (status == MagickFalse)
1499 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1500 return(magick_info);
1521MagickPrivate
void ResetMagickPrecision(
void)
1553MagickExport MagickInfo *SetMagickInfo(
const char *name)
1558 assert(name != (
const char *) NULL);
1559 if (IsEventLogging() != MagickFalse)
1560 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
1561 magick_info=(MagickInfo *) AcquireMagickMemory(
sizeof(*magick_info));
1562 if (magick_info == (MagickInfo *) NULL)
1563 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1564 (void) memset(magick_info,0,
sizeof(*magick_info));
1565 magick_info->name=ConstantString(name);
1566 magick_info->adjoin=MagickTrue;
1567 magick_info->blob_support=MagickTrue;
1568 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1569 EncoderThreadSupport);
1570 magick_info->signature=MagickCoreSignature;
1571 return(magick_info);
1603MagickExport
int SetMagickPrecision(
const int precision)
1605#define MagickPrecision (4+MAGICKCORE_QUANTUM_DEPTH/8)
1607 if (IsEventLogging() != MagickFalse)
1608 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1610 magick_precision=precision;
1611 if ((precision < 0) || (magick_precision == 0))
1617 *exception = AcquireExceptionInfo();
1619 magick_precision=MagickPrecision;
1620 limit=(
char *) GetImageRegistry(StringRegistryType,
"precision",exception);
1621 exception=DestroyExceptionInfo(exception);
1622 if (limit == (
char *) NULL)
1623 limit=GetEnvironmentValue(
"MAGICK_PRECISION");
1624 if (limit == (
char *) NULL)
1625 limit=GetPolicyValue(
"system:precision");
1626 if (limit != (
char *) NULL)
1628 magick_precision=StringToInteger(limit);
1629 limit=DestroyString(limit);
1632 return(magick_precision);
1659MagickExport MagickBooleanType UnregisterMagickInfo(
const char *name)
1667 assert(name != (
const char *) NULL);
1668 if (magick_list == (SplayTreeInfo *) NULL)
1669 return(MagickFalse);
1670 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1671 return(MagickFalse);
1672 LockSemaphoreInfo(magick_semaphore);
1673 ResetSplayTreeIterator(magick_list);
1674 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1675 while (p != (
const MagickInfo *) NULL)
1677 if (LocaleCompare(p->name,name) == 0)
1679 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1681 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1682 UnlockSemaphoreInfo(magick_semaphore);