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"
86#if defined(MAGICKCORE_XML_DELEGATE)
87# if defined(MAGICKCORE_WINDOWS_SUPPORT)
88# if !defined(__MINGW32__)
89# include <win32config.h>
92# include <libxml/parser.h>
98#if !defined(MAGICKCORE_RETSIGTYPE)
99# define MAGICKCORE_RETSIGTYPE void
102# define SIG_DFL ((SignalHandler *) 0)
105# define SIG_ERR ((SignalHandler *) -1)
114typedef MAGICKCORE_RETSIGTYPE
124 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL };
129static volatile MagickBooleanType
130 instantiate_magickcore = MagickFalse,
131 magickcore_signal_in_progress = MagickFalse,
132 magick_list_initialized = MagickFalse;
137static MagickBooleanType
162MagickExport DecodeImageHandler *GetImageDecoder(
const MagickInfo *magick_info)
165 assert(magick_info->signature == MagickCoreSignature);
166 if (IsEventLogging() != MagickFalse)
167 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
168 return(magick_info->decoder);
193MagickExport EncodeImageHandler *GetImageEncoder(
const MagickInfo *magick_info)
196 assert(magick_info->signature == MagickCoreSignature);
197 if (IsEventLogging() != MagickFalse)
198 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
199 return(magick_info->encoder);
231MagickExport MagickBooleanType GetImageMagick(
const unsigned char *magick,
232 const size_t length,
char *format)
243 assert(magick != (
const unsigned char *) NULL);
244 if (IsEventLogging() != MagickFalse)
245 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
246 exception=AcquireExceptionInfo();
247 p=GetMagickInfo(
"*",exception);
248 exception=DestroyExceptionInfo(exception);
252 LockSemaphoreInfo(magick_semaphore);
253 ResetSplayTreeIterator(magick_list);
254 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
257 if ((p->magick != (IsImageFormatHandler *) NULL) &&
258 (p->magick(magick,length) != 0))
261 (void) CopyMagickString(format,p->name,MaxTextExtent);
264 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
266 UnlockSemaphoreInfo(magick_semaphore);
292MagickExport MagickBooleanType GetMagickAdjoin(
const MagickInfo *magick_info)
295 assert(magick_info->signature == MagickCoreSignature);
296 if (IsEventLogging() != MagickFalse)
297 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
298 return(magick_info->adjoin);
323MagickExport MagickBooleanType GetMagickBlobSupport(
327 assert(magick_info->signature == MagickCoreSignature);
328 if (IsEventLogging() != MagickFalse)
329 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
330 return(magick_info->blob_support);
355MagickExport
const char *GetMagickDescription(
const MagickInfo *magick_info)
358 assert(magick_info->signature == MagickCoreSignature);
359 if (IsEventLogging() != MagickFalse)
360 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
361 return(magick_info->description);
387MagickExport MagickBooleanType GetMagickEndianSupport(
391 assert(magick_info->signature == MagickCoreSignature);
392 if (IsEventLogging() != MagickFalse)
393 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
394 return(magick_info->endian_support);
423MagickExport
const MagickInfo *GetMagickInfo(
const char *name,
433 if (IsMagickTreeInstantiated(exception) == MagickFalse)
436 if ((name != (
const char *) NULL) && (*name !=
'\0'))
438 LockSemaphoreInfo(magick_semaphore);
439 if (LocaleCompare(name,
"*") == 0)
440#if defined(MAGICKCORE_BUILD_MODULES)
441 (void) OpenModules(exception);
443 RegisterStaticModules();
447 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,
450#
if defined(MAGICKCORE_BUILD_MODULES)
451 (void) OpenModule(name,exception);
453 (void) RegisterStaticModule(name,exception);
456 UnlockSemaphoreInfo(magick_semaphore);
458 if ((name == (
const char *) NULL) || (LocaleCompare(name,
"*") == 0))
459 return((
const MagickInfo *) GetRootValueFromSplayTree(magick_list));
461 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,name);
494#if defined(__cplusplus) || defined(c_plusplus)
498static int MagickInfoCompare(
const void *x,
const void *y)
506 return(LocaleCompare((*p)->name,(*q)->name));
509#if defined(__cplusplus) || defined(c_plusplus)
513MagickExport
const MagickInfo **GetMagickInfoList(
const char *pattern,
528 assert(pattern != (
char *) NULL);
529 assert(number_formats != (
size_t *) NULL);
530 if (IsEventLogging() != MagickFalse)
531 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
533 p=GetMagickInfo(
"*",exception);
536 formats=(
const MagickInfo **) AcquireQuantumMemory((
size_t)
537 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
543 LockSemaphoreInfo(magick_semaphore);
544 ResetSplayTreeIterator(magick_list);
545 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
548 if ((p->stealth == MagickFalse) &&
549 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
551 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
553 UnlockSemaphoreInfo(magick_semaphore);
554 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickInfoCompare);
556 *number_formats=(size_t) i;
588#if defined(__cplusplus) || defined(c_plusplus)
592static int MagickCompare(
const void *x,
const void *y)
600 return(LocaleCompare(*p,*q));
603#if defined(__cplusplus) || defined(c_plusplus)
607MagickExport
char **GetMagickList(
const char *pattern,
622 assert(pattern != (
char *) NULL);
623 assert(number_formats != (
size_t *) NULL);
624 if (IsEventLogging() != MagickFalse)
625 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
627 p=GetMagickInfo(
"*",exception);
629 return((
char **) NULL);
630 formats=(
char **) AcquireQuantumMemory((
size_t)
631 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
632 if (formats == (
char **) NULL)
633 return((
char **) NULL);
634 LockSemaphoreInfo(magick_semaphore);
635 ResetSplayTreeIterator(magick_list);
636 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
639 if ((p->stealth == MagickFalse) &&
640 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
641 formats[i++]=ConstantString(p->name);
642 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
644 UnlockSemaphoreInfo(magick_semaphore);
645 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickCompare);
646 formats[i]=(
char *) NULL;
647 *number_formats=(size_t) i;
673MagickExport
const char *GetMagickMimeType(
const MagickInfo *magick_info)
676 assert(magick_info->signature == MagickCoreSignature);
677 if (IsEventLogging() != MagickFalse)
678 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
679 return(magick_info->mime_type);
701MagickExport
int GetMagickPrecision(
void)
703 if (IsEventLogging() != MagickFalse)
704 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
705 return(SetMagickPrecision(0));
730MagickExport MagickBooleanType GetMagickRawSupport(
734 assert(magick_info->signature == MagickCoreSignature);
735 if (IsEventLogging() != MagickFalse)
736 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
737 return(magick_info->raw);
763MagickExport MagickBooleanType GetMagickSeekableStream(
767 assert(magick_info->signature == MagickCoreSignature);
768 if (IsEventLogging() != MagickFalse)
769 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
770 return(magick_info->seekable_stream);
795MagickExport MagickStatusType GetMagickThreadSupport(
799 assert(magick_info->signature == MagickCoreSignature);
800 if (IsEventLogging() != MagickFalse)
801 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
802 return(magick_info->thread_support);
829static void *DestroyMagickNode(
void *magick_info)
835 if (p->magick_module != (
char *) NULL)
836 p->magick_module=DestroyString(p->magick_module);
837 if (p->note != (
char *) NULL)
838 p->note=DestroyString(p->note);
839 if (p->mime_type != (
char *) NULL)
840 p->mime_type=DestroyString(p->mime_type);
841 if (p->version != (
char *) NULL)
842 p->version=DestroyString(p->version);
843 if (p->description != (
char *) NULL)
844 p->description=DestroyString(p->description);
845 if (p->name != (
char *) NULL)
846 p->name=DestroyString(p->name);
848 DestroySemaphoreInfo(&p->semaphore);
849 return(RelinquishMagickMemory(p));
852static MagickBooleanType IsMagickTreeInstantiated(
ExceptionInfo *exception)
854 if (magick_list_initialized == MagickFalse)
857 ActivateSemaphoreInfo(&magick_semaphore);
858 LockSemaphoreInfo(magick_semaphore);
859 if (magick_list_initialized == MagickFalse)
867 magick_list=NewSplayTree(CompareSplayTreeString,(
void *(*)(
void *))
868 NULL,DestroyMagickNode);
870 ThrowFatalException(ResourceLimitFatalError,
871 "MemoryAllocationFailed");
872 magick_info=SetMagickInfo(
"clipmask");
873 magick_info->stealth=MagickTrue;
874 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
875 if (status == MagickFalse)
876 ThrowFatalException(ResourceLimitFatalError,
877 "MemoryAllocationFailed");
878#if defined(MAGICKCORE_MODULES_SUPPORT)
879 (void) GetModuleInfo((
char *) NULL,exception);
881 magick_list_initialized=MagickTrue;
883 UnlockSemaphoreInfo(magick_semaphore);
885 return(magick_list != (
SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
911MagickExport 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));
949MagickExport MagickBooleanType ListMagickInfo(FILE *file,
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 magick_module[MaxTextExtent];
991 if (magick_info[i]->magick_module != (
char *) NULL)
992 (
void) CopyMagickString(magick_module,magick_info[i]->magick_module,
994 (void) ConcatenateMagickString(magick_module,
" ",MaxTextExtent);
995 magick_module[9]=
'\0';
996 (void) FormatLocaleFile(file,
"%9s ",magick_module);
999 (void) FormatLocaleFile(file,
"%c%c%c ",magick_info[i]->decoder ?
'r' :
'-',
1000 magick_info[i]->encoder ?
'w' :
'-',magick_info[i]->encoder != NULL &&
1001 magick_info[i]->adjoin != MagickFalse ?
'+' :
'-');
1002 if (magick_info[i]->description != (
char *) NULL)
1003 (void) FormatLocaleFile(file,
" %s",magick_info[i]->description);
1004 if (magick_info[i]->version != (
char *) NULL)
1005 (
void) FormatLocaleFile(file,
" (%s)",magick_info[i]->version);
1006 (void) FormatLocaleFile(file,
"\n");
1007 if (magick_info[i]->note != (
char *) NULL)
1012 text=StringToList(magick_info[i]->note);
1013 if (text != (
char **) NULL)
1015 for (j=0; text[j] != (
char *) NULL; j++)
1017 (void) FormatLocaleFile(file,
" %s\n",text[j]);
1018 text[j]=DestroyString(text[j]);
1020 text=(
char **) RelinquishMagickMemory(text);
1024 (void) FormatLocaleFile(file,
"\n* native blob support\n");
1025 (void) FormatLocaleFile(file,
"r read support\n");
1026 (void) FormatLocaleFile(file,
"w write support\n");
1027 (void) FormatLocaleFile(file,
"+ support for multiple images\n");
1028 (void) fflush(file);
1029 magick_info=(
const MagickInfo **) RelinquishMagickMemory((
void *)
1054MagickExport MagickBooleanType IsMagickCoreInstantiated(
void)
1056 return(instantiate_magickcore);
1077MagickExport MagickBooleanType MagickComponentGenesis(
void)
1080 magick_semaphore=AllocateSemaphoreInfo();
1102MagickExport
void MagickComponentTerminus(
void)
1105 ActivateSemaphoreInfo(&magick_semaphore);
1106 LockSemaphoreInfo(magick_semaphore);
1109 magick_list=DestroySplayTree(magick_list);
1110 magick_list_initialized=MagickFalse;
1112 UnlockSemaphoreInfo(magick_semaphore);
1113 DestroySemaphoreInfo(&magick_semaphore);
1143static SignalHandler *SetMagickSignalHandler(
int signal_number,
1144 SignalHandler *handler)
1146#if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1158 sigaddset(&mask,signal_number);
1159 sigprocmask(SIG_BLOCK,&mask,NULL);
1160 action.sa_mask=mask;
1161 action.sa_handler=handler;
1163#if defined(SA_INTERRUPT)
1164 action.sa_flags|=SA_INTERRUPT;
1166#if defined(SA_ONSTACK)
1167 action.sa_flags|=SA_ONSTACK;
1169 previous_action.sa_handler=SIG_DFL;
1170 status=sigaction(signal_number,&action,&previous_action);
1173 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1174 return(previous_action.sa_handler);
1176 return(signal(signal_number,handler));
1180static void MagickSignalHandler(
int signal_number)
1182 if (magickcore_signal_in_progress != MagickFalse)
1183 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1184 magickcore_signal_in_progress=MagickTrue;
1185 AsynchronousResourceComponentTerminus();
1187 if (signal_number == SIGQUIT)
1191 if (signal_number == SIGABRT)
1195 if (signal_number == SIGBUS)
1199 if (signal_number == SIGFPE)
1203 if (signal_number == SIGSEGV)
1206#if !defined(MAGICKCORE_HAVE__EXIT)
1207 exit(signal_number);
1210 if (signal_number == SIGHUP)
1211 _exit(signal_number);
1214 if (signal_number == SIGINT)
1215 _exit(signal_number);
1218 if (signal_number == SIGTERM)
1219 _exit(signal_number);
1221#if defined(MAGICKCORE_HAVE_RAISE)
1222 if (signal_handlers[signal_number] != MagickSignalHandler)
1223 raise(signal_number);
1225 _exit(signal_number);
1229static SignalHandler *RegisterMagickSignalHandler(
int signal_number)
1234 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1235 if (handler == SIG_ERR)
1237 if (handler != SIG_DFL)
1238 handler=SetMagickSignalHandler(signal_number,handler);
1240 (
void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1241 "Register handler for signal: %d",signal_number);
1245static void SetClientNameAndPath(
const char *path)
1248 execution_path[MaxTextExtent],
1249 filename[MaxTextExtent];
1251#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1252 if ((path != (
const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1254 if ((path != (
const char *) NULL) && (*path == *DirectorySeparator) &&
1255 (IsPathAccessible(path) != MagickFalse))
1257 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1259 (
void) GetExecutionPath(execution_path,MaxTextExtent);
1260 GetPathComponent(execution_path,TailPath,filename);
1261 (void) SetClientName(filename);
1262 GetPathComponent(execution_path,HeadPath,execution_path);
1263 (void) SetClientPath(execution_path);
1266MagickExport
void MagickCoreGenesis(
const char *path,
1267 const MagickBooleanType establish_signal_handlers)
1275#if defined(__has_feature)
1276#if __has_feature(address_sanitizer)
1277 (void) putenv(
"MAGICK_THREAD_LIMIT=1");
1280 InitializeMagickMutex();
1282 if (instantiate_magickcore != MagickFalse)
1284 UnlockMagickMutex();
1287 (void) SemaphoreComponentGenesis();
1288 (void) ExceptionComponentGenesis();
1289 SetClientNameAndPath(path);
1290 (void) LogComponentGenesis();
1291 (void) LocaleComponentGenesis();
1292 (void) RandomComponentGenesis();
1293 events=GetEnvironmentValue(
"MAGICK_DEBUG");
1294 if (events != (
char *) NULL)
1296 (void) SetLogEventMask(events);
1297 events=DestroyString(events);
1299#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1302 if (establish_signal_handlers != MagickFalse)
1308 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1309 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1312 if (signal_handlers[SIGBUS] == (SignalHandler *) NULL)
1313 signal_handlers[SIGBUS]=RegisterMagickSignalHandler(SIGBUS);
1316 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1317 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1320 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1321 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1324 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1325 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1328 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1329 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1332 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1333 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1336 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1337 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1340 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1341 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1344 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1345 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1351 (void) ConfigureComponentGenesis();
1352 (void) PolicyComponentGenesis();
1353 (void) CacheComponentGenesis();
1354 (void) ResourceComponentGenesis();
1355 (void) CoderComponentGenesis();
1356 (void) MagickComponentGenesis();
1357#if defined(MAGICKCORE_MODULES_SUPPORT)
1358 (void) ModuleComponentGenesis();
1360 (void) DelegateComponentGenesis();
1361 (void) MagicComponentGenesis();
1362 (void) ColorComponentGenesis();
1363 (void) TypeComponentGenesis();
1364 (void) MimeComponentGenesis();
1365 (void) AnnotateComponentGenesis();
1366#if defined(MAGICKCORE_X11_DELEGATE)
1367 (void) XComponentGenesis();
1369 (void) RegistryComponentGenesis();
1370 (void) MonitorComponentGenesis();
1371 (void) GetMagickTTL();
1372 instantiate_magickcore=MagickTrue;
1373 UnlockMagickMutex();
1416MagickExport
void MagickCoreTerminus(
void)
1418 InitializeMagickMutex();
1420 if (instantiate_magickcore == MagickFalse)
1422 UnlockMagickMutex();
1425 MonitorComponentTerminus();
1426 RegistryComponentTerminus();
1427#if defined(MAGICKCORE_XML_DELEGATE)
1430 AnnotateComponentTerminus();
1431 MimeComponentTerminus();
1432 TypeComponentTerminus();
1433#if defined(MAGICKCORE_OPENCL_SUPPORT)
1436 ColorComponentTerminus();
1437#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1438 NTWindowsTerminus();
1440 MagicComponentTerminus();
1441 DelegateComponentTerminus();
1442 MagickComponentTerminus();
1443#if !defined(MAGICKCORE_BUILD_MODULES)
1444 UnregisterStaticModules();
1446#if defined(MAGICKCORE_MODULES_SUPPORT)
1447 ModuleComponentTerminus();
1449#if defined(MAGICKCORE_X11_DELEGATE)
1450 XComponentTerminus();
1452 CoderComponentTerminus();
1453 AsynchronousResourceComponentTerminus();
1454 ResourceComponentTerminus();
1455 CacheComponentTerminus();
1456 PolicyComponentTerminus();
1457 ConfigureComponentTerminus();
1458 RandomComponentTerminus();
1459 LocaleComponentTerminus();
1460 LogComponentTerminus();
1461 ExceptionComponentTerminus();
1462 instantiate_magickcore=MagickFalse;
1463 UnlockMagickMutex();
1464 SemaphoreComponentTerminus();
1502 assert(magick_info->signature == MagickCoreSignature);
1503 if (IsEventLogging() != MagickFalse)
1504 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",magick_info->name);
1507 if (((magick_info->thread_support & DecoderThreadSupport) == 0) ||
1508 ((magick_info->thread_support & EncoderThreadSupport) == 0))
1509 magick_info->semaphore=AllocateSemaphoreInfo();
1510 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1511 if (status == MagickFalse)
1512 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1513 return(magick_info);
1543MagickExport
MagickInfo *SetMagickInfo(
const char *name)
1548 assert(name != (
const char *) NULL);
1549 if (IsEventLogging() != MagickFalse)
1550 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
1551 magick_info=(
MagickInfo *) AcquireMagickMemory(
sizeof(*magick_info));
1553 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1554 (void) memset(magick_info,0,
sizeof(*magick_info));
1555 magick_info->name=ConstantString(name);
1556 magick_info->adjoin=MagickTrue;
1557 magick_info->blob_support=MagickTrue;
1558 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1559 EncoderThreadSupport);
1560 magick_info->signature=MagickCoreSignature;
1561 return(magick_info);
1593MagickExport
int SetMagickPrecision(
const int precision)
1595#define MagickPrecision (4+MAGICKCORE_QUANTUM_DEPTH/8)
1598 magick_precision = 0;
1600 if (IsEventLogging() != MagickFalse)
1601 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1603 magick_precision=precision;
1604 if ((precision < 0) || (magick_precision == 0))
1610 *exception = AcquireExceptionInfo();
1612 magick_precision=MagickPrecision;
1613 limit=(
char *) GetImageRegistry(StringRegistryType,
"precision",exception);
1614 exception=DestroyExceptionInfo(exception);
1615 if (limit == (
char *) NULL)
1616 limit=GetEnvironmentValue(
"MAGICK_PRECISION");
1617 if (limit == (
char *) NULL)
1618 limit=GetPolicyValue(
"system:precision");
1619 if (limit != (
char *) NULL)
1621 magick_precision=StringToInteger(limit);
1622 limit=DestroyString(limit);
1625 return(magick_precision);
1652MagickExport MagickBooleanType UnregisterMagickInfo(
const char *name)
1660 assert(name != (
const char *) NULL);
1662 return(MagickFalse);
1663 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1664 return(MagickFalse);
1665 LockSemaphoreInfo(magick_semaphore);
1666 ResetSplayTreeIterator(magick_list);
1667 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1670 if (LocaleCompare(p->name,name) == 0)
1672 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1674 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1675 UnlockSemaphoreInfo(magick_semaphore);