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 static void SetClientNameAndPath(
const char *path)
1247 execution_path[MaxTextExtent],
1248 filename[MaxTextExtent];
1250 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1251 if ((path != (
const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1253 if ((path != (
const char *) NULL) && (*path == *DirectorySeparator) &&
1254 (IsPathAccessible(path) != MagickFalse))
1256 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1258 (
void) GetExecutionPath(execution_path,MaxTextExtent);
1259 GetPathComponent(execution_path,TailPath,filename);
1260 (void) SetClientName(filename);
1261 GetPathComponent(execution_path,HeadPath,execution_path);
1262 (void) SetClientPath(execution_path);
1265 MagickExport
void MagickCoreGenesis(
const char *path,
1266 const MagickBooleanType establish_signal_handlers)
1274 #if defined(__has_feature)
1275 #if __has_feature(address_sanitizer)
1276 (void) putenv(
"MAGICK_THREAD_LIMIT=1");
1279 InitializeMagickMutex();
1281 if (instantiate_magickcore != MagickFalse)
1283 UnlockMagickMutex();
1286 (void) SemaphoreComponentGenesis();
1287 (void) ExceptionComponentGenesis();
1288 SetClientNameAndPath(path);
1289 (void) LogComponentGenesis();
1290 (void) LocaleComponentGenesis();
1291 (void) RandomComponentGenesis();
1292 events=GetEnvironmentValue(
"MAGICK_DEBUG");
1293 if (events != (
char *) NULL)
1295 (void) SetLogEventMask(events);
1296 events=DestroyString(events);
1298 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1301 if (establish_signal_handlers != MagickFalse)
1306 #if defined(SIGABRT)
1307 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1308 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1311 if (signal_handlers[SIGBUS] == (SignalHandler *) NULL)
1312 signal_handlers[SIGBUS]=RegisterMagickSignalHandler(SIGBUS);
1314 #if defined(SIGSEGV)
1315 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1316 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1319 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1320 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1323 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1324 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1327 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1328 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1330 #if defined(SIGQUIT)
1331 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1332 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1334 #if defined(SIGTERM)
1335 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1336 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1338 #if defined(SIGXCPU)
1339 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1340 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1342 #if defined(SIGXFSZ)
1343 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1344 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1350 (void) ConfigureComponentGenesis();
1351 (void) PolicyComponentGenesis();
1352 (void) CacheComponentGenesis();
1353 (void) ResourceComponentGenesis();
1354 (void) CoderComponentGenesis();
1355 (void) MagickComponentGenesis();
1356 #if defined(MAGICKCORE_MODULES_SUPPORT)
1357 (void) ModuleComponentGenesis();
1359 (void) DelegateComponentGenesis();
1360 (void) MagicComponentGenesis();
1361 (void) ColorComponentGenesis();
1362 (void) TypeComponentGenesis();
1363 (void) MimeComponentGenesis();
1364 (void) AnnotateComponentGenesis();
1365 #if defined(MAGICKCORE_X11_DELEGATE)
1366 (void) XComponentGenesis();
1368 (void) RegistryComponentGenesis();
1369 (void) MonitorComponentGenesis();
1370 instantiate_magickcore=MagickTrue;
1371 UnlockMagickMutex();
1392 MagickExport
void MagickCoreTerminus(
void)
1394 InitializeMagickMutex();
1396 if (instantiate_magickcore == MagickFalse)
1398 UnlockMagickMutex();
1401 MonitorComponentTerminus();
1402 RegistryComponentTerminus();
1403 #if defined(MAGICKCORE_X11_DELEGATE)
1404 XComponentTerminus();
1406 #if defined(MAGICKCORE_XML_DELEGATE)
1409 AnnotateComponentTerminus();
1410 MimeComponentTerminus();
1411 TypeComponentTerminus();
1412 #if defined(MAGICKCORE_OPENCL_SUPPORT)
1415 ColorComponentTerminus();
1416 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
1417 NTWindowsTerminus();
1419 MagicComponentTerminus();
1420 DelegateComponentTerminus();
1421 MagickComponentTerminus();
1422 #if !defined(MAGICKCORE_BUILD_MODULES)
1423 UnregisterStaticModules();
1425 #if defined(MAGICKCORE_MODULES_SUPPORT)
1426 ModuleComponentTerminus();
1428 CoderComponentTerminus();
1429 AsynchronousResourceComponentTerminus();
1430 ResourceComponentTerminus();
1431 CacheComponentTerminus();
1432 PolicyComponentTerminus();
1433 ConfigureComponentTerminus();
1434 RandomComponentTerminus();
1435 LocaleComponentTerminus();
1436 LogComponentTerminus();
1437 ExceptionComponentTerminus();
1438 instantiate_magickcore=MagickFalse;
1439 UnlockMagickMutex();
1440 SemaphoreComponentTerminus();
1478 assert(magick_info->signature == MagickCoreSignature);
1479 if (IsEventLogging() != MagickFalse)
1480 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",magick_info->name);
1483 if (((magick_info->thread_support & DecoderThreadSupport) == 0) ||
1484 ((magick_info->thread_support & EncoderThreadSupport) == 0))
1485 magick_info->semaphore=AllocateSemaphoreInfo();
1486 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1487 if (status == MagickFalse)
1488 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1489 return(magick_info);
1519 MagickExport
MagickInfo *SetMagickInfo(
const char *name)
1524 assert(name != (
const char *) NULL);
1525 if (IsEventLogging() != MagickFalse)
1526 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
1527 magick_info=(
MagickInfo *) AcquireMagickMemory(
sizeof(*magick_info));
1529 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1530 (void) memset(magick_info,0,
sizeof(*magick_info));
1531 magick_info->name=ConstantString(name);
1532 magick_info->adjoin=MagickTrue;
1533 magick_info->blob_support=MagickTrue;
1534 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1535 EncoderThreadSupport);
1536 magick_info->signature=MagickCoreSignature;
1537 return(magick_info);
1569 MagickExport
int SetMagickPrecision(
const int precision)
1571 #define MagickPrecision (4+MAGICKCORE_QUANTUM_DEPTH/8)
1574 magick_precision = 0;
1576 if (IsEventLogging() != MagickFalse)
1577 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1579 magick_precision=precision;
1580 if ((precision < 0) || (magick_precision == 0))
1586 *exception = AcquireExceptionInfo();
1588 magick_precision=MagickPrecision;
1589 limit=(
char *) GetImageRegistry(StringRegistryType,
"precision",exception);
1590 exception=DestroyExceptionInfo(exception);
1591 if (limit == (
char *) NULL)
1592 limit=GetEnvironmentValue(
"MAGICK_PRECISION");
1593 if (limit == (
char *) NULL)
1594 limit=GetPolicyValue(
"system:precision");
1595 if (limit != (
char *) NULL)
1597 magick_precision=StringToInteger(limit);
1598 limit=DestroyString(limit);
1601 return(magick_precision);
1628 MagickExport MagickBooleanType UnregisterMagickInfo(
const char *name)
1636 assert(name != (
const char *) NULL);
1638 return(MagickFalse);
1639 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1640 return(MagickFalse);
1641 LockSemaphoreInfo(magick_semaphore);
1642 ResetSplayTreeIterator(magick_list);
1643 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1646 if (LocaleCompare(p->name,name) == 0)
1648 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1650 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1651 UnlockSemaphoreInfo(magick_semaphore);