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/token.h"
83 #include "magick/utility.h"
84 #include "magick/xwindow-private.h"
85 #if defined(MAGICKCORE_XML_DELEGATE)
86 # if defined(MAGICKCORE_WINDOWS_SUPPORT)
87 # if !defined(__MINGW32__)
88 # include <win32config.h>
91 # include <libxml/parser.h>
97 #if !defined(MAGICKCORE_RETSIGTYPE)
98 # define MAGICKCORE_RETSIGTYPE void
100 #if !defined(SIG_DFL)
101 # define SIG_DFL ((SignalHandler *) 0)
103 #if !defined(SIG_ERR)
104 # define SIG_ERR ((SignalHandler *) -1)
113 typedef MAGICKCORE_RETSIGTYPE
123 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
128 static volatile MagickBooleanType
129 instantiate_magickcore = MagickFalse,
130 magickcore_signal_in_progress = MagickFalse,
131 magick_list_initialized = MagickFalse;
136 static MagickBooleanType
161 MagickExport DecodeImageHandler *GetImageDecoder(
const MagickInfo *magick_info)
164 assert(magick_info->signature == MagickCoreSignature);
165 if (IsEventLogging() != MagickFalse)
166 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
167 return(magick_info->decoder);
192 MagickExport EncodeImageHandler *GetImageEncoder(
const MagickInfo *magick_info)
195 assert(magick_info->signature == MagickCoreSignature);
196 if (IsEventLogging() != MagickFalse)
197 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
198 return(magick_info->encoder);
230 MagickExport MagickBooleanType GetImageMagick(
const unsigned char *magick,
231 const size_t length,
char *format)
242 assert(magick != (
const unsigned char *) NULL);
243 if (IsEventLogging() != MagickFalse)
244 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
245 exception=AcquireExceptionInfo();
246 p=GetMagickInfo(
"*",exception);
247 exception=DestroyExceptionInfo(exception);
251 LockSemaphoreInfo(magick_semaphore);
252 ResetSplayTreeIterator(magick_list);
253 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
256 if ((p->magick != (IsImageFormatHandler *) NULL) &&
257 (p->magick(magick,length) != 0))
260 (void) CopyMagickString(format,p->name,MaxTextExtent);
263 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
265 UnlockSemaphoreInfo(magick_semaphore);
291 MagickExport MagickBooleanType GetMagickAdjoin(
const MagickInfo *magick_info)
294 assert(magick_info->signature == MagickCoreSignature);
295 if (IsEventLogging() != MagickFalse)
296 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
297 return(magick_info->adjoin);
322 MagickExport MagickBooleanType GetMagickBlobSupport(
326 assert(magick_info->signature == MagickCoreSignature);
327 if (IsEventLogging() != MagickFalse)
328 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
329 return(magick_info->blob_support);
354 MagickExport
const char *GetMagickDescription(
const MagickInfo *magick_info)
357 assert(magick_info->signature == MagickCoreSignature);
358 if (IsEventLogging() != MagickFalse)
359 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
360 return(magick_info->description);
386 MagickExport MagickBooleanType GetMagickEndianSupport(
390 assert(magick_info->signature == MagickCoreSignature);
391 if (IsEventLogging() != MagickFalse)
392 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
393 return(magick_info->endian_support);
422 MagickExport
const MagickInfo *GetMagickInfo(
const char *name,
432 if (IsMagickTreeInstantiated(exception) == MagickFalse)
435 if ((name != (
const char *) NULL) && (*name !=
'\0'))
437 LockSemaphoreInfo(magick_semaphore);
438 if (LocaleCompare(name,
"*") == 0)
439 #if defined(MAGICKCORE_BUILD_MODULES)
440 (void) OpenModules(exception);
442 RegisterStaticModules();
446 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,
449 #
if defined(MAGICKCORE_BUILD_MODULES)
450 (void) OpenModule(name,exception);
452 (void) RegisterStaticModule(name,exception);
455 UnlockSemaphoreInfo(magick_semaphore);
457 if ((name == (
const char *) NULL) || (LocaleCompare(name,
"*") == 0))
458 return((
const MagickInfo *) GetRootValueFromSplayTree(magick_list));
460 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,name);
493 #if defined(__cplusplus) || defined(c_plusplus)
497 static int MagickInfoCompare(
const void *x,
const void *y)
505 return(LocaleCompare((*p)->name,(*q)->name));
508 #if defined(__cplusplus) || defined(c_plusplus)
512 MagickExport
const MagickInfo **GetMagickInfoList(
const char *pattern,
527 assert(pattern != (
char *) NULL);
528 assert(number_formats != (
size_t *) NULL);
529 if (IsEventLogging() != MagickFalse)
530 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
532 p=GetMagickInfo(
"*",exception);
535 formats=(
const MagickInfo **) AcquireQuantumMemory((
size_t)
536 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
542 LockSemaphoreInfo(magick_semaphore);
543 ResetSplayTreeIterator(magick_list);
544 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
547 if ((p->stealth == MagickFalse) &&
548 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
550 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
552 UnlockSemaphoreInfo(magick_semaphore);
553 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickInfoCompare);
555 *number_formats=(size_t) i;
587 #if defined(__cplusplus) || defined(c_plusplus)
591 static int MagickCompare(
const void *x,
const void *y)
599 return(LocaleCompare(*p,*q));
602 #if defined(__cplusplus) || defined(c_plusplus)
606 MagickExport
char **GetMagickList(
const char *pattern,
621 assert(pattern != (
char *) NULL);
622 assert(number_formats != (
size_t *) NULL);
623 if (IsEventLogging() != MagickFalse)
624 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
626 p=GetMagickInfo(
"*",exception);
628 return((
char **) NULL);
629 formats=(
char **) AcquireQuantumMemory((
size_t)
630 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
631 if (formats == (
char **) NULL)
632 return((
char **) NULL);
633 LockSemaphoreInfo(magick_semaphore);
634 ResetSplayTreeIterator(magick_list);
635 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
638 if ((p->stealth == MagickFalse) &&
639 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
640 formats[i++]=ConstantString(p->name);
641 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
643 UnlockSemaphoreInfo(magick_semaphore);
644 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickCompare);
645 formats[i]=(
char *) NULL;
646 *number_formats=(size_t) i;
672 MagickExport
const char *GetMagickMimeType(
const MagickInfo *magick_info)
675 assert(magick_info->signature == MagickCoreSignature);
676 if (IsEventLogging() != MagickFalse)
677 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
678 return(magick_info->mime_type);
700 MagickExport
int GetMagickPrecision(
void)
702 if (IsEventLogging() != MagickFalse)
703 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
704 return(SetMagickPrecision(0));
729 MagickExport MagickBooleanType GetMagickRawSupport(
733 assert(magick_info->signature == MagickCoreSignature);
734 if (IsEventLogging() != MagickFalse)
735 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
736 return(magick_info->raw);
762 MagickExport MagickBooleanType GetMagickSeekableStream(
766 assert(magick_info->signature == MagickCoreSignature);
767 if (IsEventLogging() != MagickFalse)
768 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
769 return(magick_info->seekable_stream);
794 MagickExport MagickStatusType GetMagickThreadSupport(
798 assert(magick_info->signature == MagickCoreSignature);
799 if (IsEventLogging() != MagickFalse)
800 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
801 return(magick_info->thread_support);
828 static void *DestroyMagickNode(
void *magick_info)
834 if (p->magick_module != (
char *) NULL)
835 p->magick_module=DestroyString(p->magick_module);
836 if (p->note != (
char *) NULL)
837 p->note=DestroyString(p->note);
838 if (p->mime_type != (
char *) NULL)
839 p->mime_type=DestroyString(p->mime_type);
840 if (p->version != (
char *) NULL)
841 p->version=DestroyString(p->version);
842 if (p->description != (
char *) NULL)
843 p->description=DestroyString(p->description);
844 if (p->name != (
char *) NULL)
845 p->name=DestroyString(p->name);
847 DestroySemaphoreInfo(&p->semaphore);
848 return(RelinquishMagickMemory(p));
851 static MagickBooleanType IsMagickTreeInstantiated(
ExceptionInfo *exception)
853 if (magick_list_initialized == MagickFalse)
856 ActivateSemaphoreInfo(&magick_semaphore);
857 LockSemaphoreInfo(magick_semaphore);
858 if (magick_list_initialized == MagickFalse)
866 magick_list=NewSplayTree(CompareSplayTreeString,(
void *(*)(
void *))
867 NULL,DestroyMagickNode);
869 ThrowFatalException(ResourceLimitFatalError,
870 "MemoryAllocationFailed");
871 magick_info=SetMagickInfo(
"clipmask");
872 magick_info->stealth=MagickTrue;
873 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
874 if (status == MagickFalse)
875 ThrowFatalException(ResourceLimitFatalError,
876 "MemoryAllocationFailed");
877 #if defined(MAGICKCORE_MODULES_SUPPORT)
878 (void) GetModuleInfo((
char *) NULL,exception);
880 magick_list_initialized=MagickTrue;
882 UnlockSemaphoreInfo(magick_semaphore);
884 return(magick_list != (
SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
910 MagickExport MagickBooleanType IsMagickConflict(
const char *magick)
912 assert(magick != (
char *) NULL);
913 #if defined(macintosh)
914 return(MACIsMagickConflict(magick));
916 return(VMSIsMagickConflict(magick));
917 #elif defined(MAGICKCORE_WINDOWS_SUPPORT)
918 return(NTIsMagickConflict(magick));
948 MagickExport MagickBooleanType ListMagickInfo(FILE *file,
963 if (file == (FILE *) NULL)
965 magick_info=GetMagickInfoList(
"*",&number_formats,exception);
966 if (magick_info == (
const MagickInfo **) NULL)
968 ClearMagickException(exception);
969 #if !defined(MAGICKCORE_MODULES_SUPPORT)
970 (void) FormatLocaleFile(file,
" Format Mode Description\n");
972 (void) FormatLocaleFile(file,
" Format Module Mode Description\n");
974 (void) FormatLocaleFile(file,
975 "--------------------------------------------------------"
976 "-----------------------\n");
977 for (i=0; i < (ssize_t) number_formats; i++)
979 if (magick_info[i]->stealth != MagickFalse)
981 (void) FormatLocaleFile(file,
"%9s%c ",
982 magick_info[i]->name != (
char *) NULL ? magick_info[i]->name :
"",
983 magick_info[i]->blob_support != MagickFalse ?
'*' :
' ');
984 #if defined(MAGICKCORE_MODULES_SUPPORT)
987 magick_module[MaxTextExtent];
990 if (magick_info[i]->magick_module != (
char *) NULL)
991 (
void) CopyMagickString(magick_module,magick_info[i]->magick_module,
993 (void) ConcatenateMagickString(magick_module,
" ",MaxTextExtent);
994 magick_module[9]=
'\0';
995 (void) FormatLocaleFile(file,
"%9s ",magick_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 *)
1053 MagickExport MagickBooleanType IsMagickCoreInstantiated(
void)
1055 return(instantiate_magickcore);
1076 MagickExport MagickBooleanType MagickComponentGenesis(
void)
1079 magick_semaphore=AllocateSemaphoreInfo();
1101 MagickExport
void MagickComponentTerminus(
void)
1104 ActivateSemaphoreInfo(&magick_semaphore);
1105 LockSemaphoreInfo(magick_semaphore);
1108 magick_list=DestroySplayTree(magick_list);
1109 magick_list_initialized=MagickFalse;
1111 UnlockSemaphoreInfo(magick_semaphore);
1112 DestroySemaphoreInfo(&magick_semaphore);
1142 static SignalHandler *SetMagickSignalHandler(
int signal_number,
1143 SignalHandler *handler)
1145 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1157 sigaddset(&mask,signal_number);
1158 sigprocmask(SIG_BLOCK,&mask,NULL);
1159 action.sa_mask=mask;
1160 action.sa_handler=handler;
1162 #if defined(SA_INTERRUPT)
1163 action.sa_flags|=SA_INTERRUPT;
1165 #if defined(SA_ONSTACK)
1166 action.sa_flags|=SA_ONSTACK;
1168 previous_action.sa_handler=SIG_DFL;
1169 status=sigaction(signal_number,&action,&previous_action);
1172 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1173 return(previous_action.sa_handler);
1175 return(signal(signal_number,handler));
1179 static void MagickSignalHandler(
int signal_number)
1181 if (magickcore_signal_in_progress != MagickFalse)
1182 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1183 magickcore_signal_in_progress=MagickTrue;
1184 AsynchronousResourceComponentTerminus();
1185 #if defined(SIGQUIT)
1186 if (signal_number == SIGQUIT)
1189 #if defined(SIGABRT)
1190 if (signal_number == SIGABRT)
1194 if (signal_number == SIGBUS)
1198 if (signal_number == SIGFPE)
1201 #if defined(SIGSEGV)
1202 if (signal_number == SIGSEGV)
1205 #if !defined(MAGICKCORE_HAVE__EXIT)
1206 exit(signal_number);
1209 if (signal_number == SIGHUP)
1210 _exit(signal_number);
1213 if (signal_number == SIGINT)
1214 _exit(signal_number);
1216 #if defined(SIGTERM)
1217 if (signal_number == SIGTERM)
1218 _exit(signal_number);
1220 #if defined(MAGICKCORE_HAVE_RAISE)
1221 if (signal_handlers[signal_number] != MagickSignalHandler)
1222 raise(signal_number);
1224 _exit(signal_number);
1228 static SignalHandler *RegisterMagickSignalHandler(
int signal_number)
1233 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1234 if (handler == SIG_ERR)
1236 if (handler != SIG_DFL)
1237 handler=SetMagickSignalHandler(signal_number,handler);
1239 (
void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1240 "Register handler for signal: %d",signal_number);
1244 MagickExport
void MagickCoreGenesis(
const char *path,
1245 const MagickBooleanType establish_signal_handlers)
1249 execution_path[MaxTextExtent],
1250 filename[MaxTextExtent];
1255 #if defined(__has_feature)
1256 #if __has_feature(address_sanitizer)
1257 (void) putenv(
"MAGICK_THREAD_LIMIT=1");
1260 InitializeMagickMutex();
1262 if (instantiate_magickcore != MagickFalse)
1264 UnlockMagickMutex();
1267 (void) SemaphoreComponentGenesis();
1268 (void) ExceptionComponentGenesis();
1269 (void) LogComponentGenesis();
1270 (void) LocaleComponentGenesis();
1271 (void) RandomComponentGenesis();
1272 events=GetEnvironmentValue(
"MAGICK_DEBUG");
1273 if (events != (
char *) NULL)
1275 (void) SetLogEventMask(events);
1276 events=DestroyString(events);
1278 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1284 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1285 if ((path != (
const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1287 if ((path != (
const char *) NULL) && (*path == *DirectorySeparator) &&
1288 (IsPathAccessible(path) != MagickFalse))
1290 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1292 (
void) GetExecutionPath(execution_path,MaxTextExtent);
1293 GetPathComponent(execution_path,TailPath,filename);
1294 (void) SetClientName(filename);
1295 GetPathComponent(execution_path,HeadPath,execution_path);
1296 (void) SetClientPath(execution_path);
1297 if (establish_signal_handlers != MagickFalse)
1302 #if defined(SIGABRT)
1303 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1304 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1307 if (signal_handlers[SIGBUS] == (SignalHandler *) NULL)
1308 signal_handlers[SIGBUS]=RegisterMagickSignalHandler(SIGBUS);
1310 #if defined(SIGSEGV)
1311 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1312 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1315 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1316 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1319 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1320 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1323 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1324 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1326 #if defined(SIGQUIT)
1327 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1328 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1330 #if defined(SIGTERM)
1331 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1332 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1334 #if defined(SIGXCPU)
1335 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1336 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1338 #if defined(SIGXFSZ)
1339 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1340 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1346 (void) ConfigureComponentGenesis();
1347 (void) PolicyComponentGenesis();
1348 (void) CacheComponentGenesis();
1349 (void) ResourceComponentGenesis();
1350 (void) CoderComponentGenesis();
1351 (void) MagickComponentGenesis();
1352 #if defined(MAGICKCORE_MODULES_SUPPORT)
1353 (void) ModuleComponentGenesis();
1355 (void) DelegateComponentGenesis();
1356 (void) MagicComponentGenesis();
1357 (void) ColorComponentGenesis();
1358 (void) TypeComponentGenesis();
1359 (void) MimeComponentGenesis();
1360 (void) AnnotateComponentGenesis();
1361 #if defined(MAGICKCORE_X11_DELEGATE)
1362 (void) XComponentGenesis();
1364 (void) RegistryComponentGenesis();
1365 (void) MonitorComponentGenesis();
1366 instantiate_magickcore=MagickTrue;
1367 UnlockMagickMutex();
1388 MagickExport
void MagickCoreTerminus(
void)
1390 InitializeMagickMutex();
1392 if (instantiate_magickcore == MagickFalse)
1394 UnlockMagickMutex();
1397 MonitorComponentTerminus();
1398 RegistryComponentTerminus();
1399 #if defined(MAGICKCORE_X11_DELEGATE)
1400 XComponentTerminus();
1402 #if defined(MAGICKCORE_XML_DELEGATE)
1405 AnnotateComponentTerminus();
1406 MimeComponentTerminus();
1407 TypeComponentTerminus();
1408 #if defined(MAGICKCORE_OPENCL_SUPPORT)
1411 ColorComponentTerminus();
1412 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1413 NTWindowsTerminus();
1415 MagicComponentTerminus();
1416 DelegateComponentTerminus();
1417 MagickComponentTerminus();
1418 #if !defined(MAGICKCORE_BUILD_MODULES)
1419 UnregisterStaticModules();
1421 #if defined(MAGICKCORE_MODULES_SUPPORT)
1422 ModuleComponentTerminus();
1424 CoderComponentTerminus();
1425 AsynchronousResourceComponentTerminus();
1426 ResourceComponentTerminus();
1427 CacheComponentTerminus();
1428 PolicyComponentTerminus();
1429 ConfigureComponentTerminus();
1430 RandomComponentTerminus();
1431 LocaleComponentTerminus();
1432 LogComponentTerminus();
1433 ExceptionComponentTerminus();
1434 instantiate_magickcore=MagickFalse;
1435 UnlockMagickMutex();
1436 SemaphoreComponentTerminus();
1474 assert(magick_info->signature == MagickCoreSignature);
1475 if (IsEventLogging() != MagickFalse)
1476 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",magick_info->name);
1479 if (((magick_info->thread_support & DecoderThreadSupport) == 0) ||
1480 ((magick_info->thread_support & EncoderThreadSupport) == 0))
1481 magick_info->semaphore=AllocateSemaphoreInfo();
1482 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1483 if (status == MagickFalse)
1484 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1485 return(magick_info);
1515 MagickExport
MagickInfo *SetMagickInfo(
const char *name)
1520 assert(name != (
const char *) NULL);
1521 if (IsEventLogging() != MagickFalse)
1522 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
1523 magick_info=(
MagickInfo *) AcquireMagickMemory(
sizeof(*magick_info));
1525 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1526 (void) memset(magick_info,0,
sizeof(*magick_info));
1527 magick_info->name=ConstantString(name);
1528 magick_info->adjoin=MagickTrue;
1529 magick_info->blob_support=MagickTrue;
1530 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1531 EncoderThreadSupport);
1532 magick_info->signature=MagickCoreSignature;
1533 return(magick_info);
1565 MagickExport
int SetMagickPrecision(
const int precision)
1567 #define MagickPrecision (4+MAGICKCORE_QUANTUM_DEPTH/8)
1570 magick_precision = 0;
1572 if (IsEventLogging() != MagickFalse)
1573 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1575 magick_precision=precision;
1576 if ((precision < 0) || (magick_precision == 0))
1582 *exception = AcquireExceptionInfo();
1584 magick_precision=MagickPrecision;
1585 limit=(
char *) GetImageRegistry(StringRegistryType,
"precision",exception);
1586 exception=DestroyExceptionInfo(exception);
1587 if (limit == (
char *) NULL)
1588 limit=GetEnvironmentValue(
"MAGICK_PRECISION");
1589 if (limit == (
char *) NULL)
1590 limit=GetPolicyValue(
"system:precision");
1591 if (limit != (
char *) NULL)
1593 magick_precision=StringToInteger(limit);
1594 limit=DestroyString(limit);
1597 return(magick_precision);
1624 MagickExport MagickBooleanType UnregisterMagickInfo(
const char *name)
1632 assert(name != (
const char *) NULL);
1634 return(MagickFalse);
1635 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1636 return(MagickFalse);
1637 LockSemaphoreInfo(magick_semaphore);
1638 ResetSplayTreeIterator(magick_list);
1639 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1642 if (LocaleCompare(p->name,name) == 0)
1644 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1646 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1647 UnlockSemaphoreInfo(magick_semaphore);