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;
135 magick_precision = 0;
140static MagickBooleanType
165MagickExport DecodeImageHandler *GetImageDecoder(
const MagickInfo *magick_info)
168 assert(magick_info->signature == MagickCoreSignature);
169 if (IsEventLogging() != MagickFalse)
170 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
171 return(magick_info->decoder);
196MagickExport EncodeImageHandler *GetImageEncoder(
const MagickInfo *magick_info)
199 assert(magick_info->signature == MagickCoreSignature);
200 if (IsEventLogging() != MagickFalse)
201 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
202 return(magick_info->encoder);
234MagickExport MagickBooleanType GetImageMagick(
const unsigned char *magick,
235 const size_t length,
char *format)
246 assert(magick != (
const unsigned char *) NULL);
247 if (IsEventLogging() != MagickFalse)
248 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
249 exception=AcquireExceptionInfo();
250 p=GetMagickInfo(
"*",exception);
251 exception=DestroyExceptionInfo(exception);
255 LockSemaphoreInfo(magick_semaphore);
256 ResetSplayTreeIterator(magick_list);
257 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
260 if ((p->magick != (IsImageFormatHandler *) NULL) &&
261 (p->magick(magick,length) != 0))
264 (void) CopyMagickString(format,p->name,MaxTextExtent);
267 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
269 UnlockSemaphoreInfo(magick_semaphore);
295MagickExport MagickBooleanType GetMagickAdjoin(
const MagickInfo *magick_info)
298 assert(magick_info->signature == MagickCoreSignature);
299 if (IsEventLogging() != MagickFalse)
300 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
301 return(magick_info->adjoin);
326MagickExport MagickBooleanType GetMagickBlobSupport(
330 assert(magick_info->signature == MagickCoreSignature);
331 if (IsEventLogging() != MagickFalse)
332 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
333 return(magick_info->blob_support);
358MagickExport
const char *GetMagickDescription(
const MagickInfo *magick_info)
361 assert(magick_info->signature == MagickCoreSignature);
362 if (IsEventLogging() != MagickFalse)
363 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
364 return(magick_info->description);
390MagickExport MagickBooleanType GetMagickEndianSupport(
394 assert(magick_info->signature == MagickCoreSignature);
395 if (IsEventLogging() != MagickFalse)
396 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
397 return(magick_info->endian_support);
426MagickExport
const MagickInfo *GetMagickInfo(
const char *name,
436 if (IsMagickTreeInstantiated(exception) == MagickFalse)
439 if ((name != (
const char *) NULL) && (*name !=
'\0'))
441 LockSemaphoreInfo(magick_semaphore);
442 if (LocaleCompare(name,
"*") == 0)
443#if defined(MAGICKCORE_BUILD_MODULES)
444 (void) OpenModules(exception);
446 RegisterStaticModules();
450 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,
453#if defined(MAGICKCORE_BUILD_MODULES)
454 (void) OpenModule(name,exception);
456 (void) RegisterStaticModule(name,exception);
459 UnlockSemaphoreInfo(magick_semaphore);
461 if ((name == (
const char *) NULL) || (LocaleCompare(name,
"*") == 0))
462 return((
const MagickInfo *) GetRootValueFromSplayTree(magick_list));
464 magick_info=(
const MagickInfo *) GetValueFromSplayTree(magick_list,name);
497#if defined(__cplusplus) || defined(c_plusplus)
501static int MagickInfoCompare(
const void *x,
const void *y)
509 return(LocaleCompare((*p)->name,(*q)->name));
512#if defined(__cplusplus) || defined(c_plusplus)
516MagickExport
const MagickInfo **GetMagickInfoList(
const char *pattern,
531 assert(pattern != (
char *) NULL);
532 assert(number_formats != (
size_t *) NULL);
533 if (IsEventLogging() != MagickFalse)
534 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
536 p=GetMagickInfo(
"*",exception);
539 formats=(
const MagickInfo **) AcquireQuantumMemory((
size_t)
540 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
546 LockSemaphoreInfo(magick_semaphore);
547 ResetSplayTreeIterator(magick_list);
548 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
551 if ((p->stealth == MagickFalse) &&
552 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
554 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
556 UnlockSemaphoreInfo(magick_semaphore);
557 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickInfoCompare);
559 *number_formats=(size_t) i;
591#if defined(__cplusplus) || defined(c_plusplus)
595static int MagickCompare(
const void *x,
const void *y)
603 return(LocaleCompare(*p,*q));
606#if defined(__cplusplus) || defined(c_plusplus)
610MagickExport
char **GetMagickList(
const char *pattern,
625 assert(pattern != (
char *) NULL);
626 assert(number_formats != (
size_t *) NULL);
627 if (IsEventLogging() != MagickFalse)
628 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
630 p=GetMagickInfo(
"*",exception);
632 return((
char **) NULL);
633 formats=(
char **) AcquireQuantumMemory((
size_t)
634 GetNumberOfNodesInSplayTree(magick_list)+1UL,
sizeof(*formats));
635 if (formats == (
char **) NULL)
636 return((
char **) NULL);
637 LockSemaphoreInfo(magick_semaphore);
638 ResetSplayTreeIterator(magick_list);
639 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
642 if ((p->stealth == MagickFalse) &&
643 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse))
644 formats[i++]=ConstantString(p->name);
645 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
647 UnlockSemaphoreInfo(magick_semaphore);
648 qsort((
void *) formats,(
size_t) i,
sizeof(*formats),MagickCompare);
649 formats[i]=(
char *) NULL;
650 *number_formats=(size_t) i;
676MagickExport
const char *GetMagickMimeType(
const MagickInfo *magick_info)
679 assert(magick_info->signature == MagickCoreSignature);
680 if (IsEventLogging() != MagickFalse)
681 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
682 return(magick_info->mime_type);
704MagickExport
int GetMagickPrecision(
void)
706 if (IsEventLogging() != MagickFalse)
707 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
708 return(SetMagickPrecision(0));
733MagickExport MagickBooleanType GetMagickRawSupport(
737 assert(magick_info->signature == MagickCoreSignature);
738 if (IsEventLogging() != MagickFalse)
739 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
740 return(magick_info->raw);
766MagickExport MagickBooleanType GetMagickSeekableStream(
770 assert(magick_info->signature == MagickCoreSignature);
771 if (IsEventLogging() != MagickFalse)
772 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
773 return(magick_info->seekable_stream);
798MagickExport MagickStatusType GetMagickThreadSupport(
802 assert(magick_info->signature == MagickCoreSignature);
803 if (IsEventLogging() != MagickFalse)
804 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
805 return(magick_info->thread_support);
832static void *DestroyMagickNode(
void *magick_info)
838 if (p->magick_module != (
char *) NULL)
839 p->magick_module=DestroyString(p->magick_module);
840 if (p->note != (
char *) NULL)
841 p->note=DestroyString(p->note);
842 if (p->mime_type != (
char *) NULL)
843 p->mime_type=DestroyString(p->mime_type);
844 if (p->version != (
char *) NULL)
845 p->version=DestroyString(p->version);
846 if (p->description != (
char *) NULL)
847 p->description=DestroyString(p->description);
848 if (p->name != (
char *) NULL)
849 p->name=DestroyString(p->name);
851 DestroySemaphoreInfo(&p->semaphore);
852 return(RelinquishMagickMemory(p));
855static MagickBooleanType IsMagickTreeInstantiated(
ExceptionInfo *exception)
857 if (magick_list_initialized == MagickFalse)
860 ActivateSemaphoreInfo(&magick_semaphore);
861 LockSemaphoreInfo(magick_semaphore);
862 if (magick_list_initialized == MagickFalse)
870 magick_list=NewSplayTree(CompareSplayTreeString,(
void *(*)(
void *))
871 NULL,DestroyMagickNode);
873 ThrowFatalException(ResourceLimitFatalError,
874 "MemoryAllocationFailed");
875 magick_info=SetMagickInfo(
"clipmask");
876 magick_info->stealth=MagickTrue;
877 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
878 if (status == MagickFalse)
879 ThrowFatalException(ResourceLimitFatalError,
880 "MemoryAllocationFailed");
881#if defined(MAGICKCORE_MODULES_SUPPORT)
882 (void) GetModuleInfo((
char *) NULL,exception);
884 magick_list_initialized=MagickTrue;
886 UnlockSemaphoreInfo(magick_semaphore);
888 return(magick_list != (
SplayTreeInfo *) NULL ? MagickTrue : MagickFalse);
914MagickExport MagickBooleanType IsMagickConflict(
const char *magick)
916 assert(magick != (
char *) NULL);
917#if defined(macintosh)
918 return(MACIsMagickConflict(magick));
920 return(VMSIsMagickConflict(magick));
921#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
922 return(NTIsMagickConflict(magick));
952MagickExport MagickBooleanType ListMagickInfo(FILE *file,
967 if (file == (FILE *) NULL)
969 magick_info=GetMagickInfoList(
"*",&number_formats,exception);
970 if (magick_info == (
const MagickInfo **) NULL)
972 ClearMagickException(exception);
973#if !defined(MAGICKCORE_MODULES_SUPPORT)
974 (void) FormatLocaleFile(file,
" Format Mode Description\n");
976 (void) FormatLocaleFile(file,
" Format Module Mode Description\n");
978 (void) FormatLocaleFile(file,
979 "--------------------------------------------------------"
980 "-----------------------\n");
981 for (i=0; i < (ssize_t) number_formats; i++)
983 if (magick_info[i]->stealth != MagickFalse)
985 (void) FormatLocaleFile(file,
"%9s%c ",
986 magick_info[i]->name != (
char *) NULL ? magick_info[i]->name :
"",
987 magick_info[i]->blob_support != MagickFalse ?
'*' :
' ');
988#if defined(MAGICKCORE_MODULES_SUPPORT)
991 magick_module[MaxTextExtent];
994 if (magick_info[i]->magick_module != (
char *) NULL)
995 (void) CopyMagickString(magick_module,magick_info[i]->magick_module,
997 (void) ConcatenateMagickString(magick_module,
" ",MaxTextExtent);
998 magick_module[9]=
'\0';
999 (void) FormatLocaleFile(file,
"%9s ",magick_module);
1002 (void) FormatLocaleFile(file,
"%c%c%c ",magick_info[i]->decoder ?
'r' :
'-',
1003 magick_info[i]->encoder ?
'w' :
'-',magick_info[i]->encoder != NULL &&
1004 magick_info[i]->adjoin != MagickFalse ?
'+' :
'-');
1005 if (magick_info[i]->description != (
char *) NULL)
1006 (void) FormatLocaleFile(file,
" %s",magick_info[i]->description);
1007 if (magick_info[i]->version != (
char *) NULL)
1008 (void) FormatLocaleFile(file,
" (%s)",magick_info[i]->version);
1009 (void) FormatLocaleFile(file,
"\n");
1010 if (magick_info[i]->note != (
char *) NULL)
1015 text=StringToList(magick_info[i]->note);
1016 if (text != (
char **) NULL)
1018 for (j=0; text[j] != (
char *) NULL; j++)
1020 (void) FormatLocaleFile(file,
" %s\n",text[j]);
1021 text[j]=DestroyString(text[j]);
1023 text=(
char **) RelinquishMagickMemory(text);
1027 (void) FormatLocaleFile(file,
"\n* native blob support\n");
1028 (void) FormatLocaleFile(file,
"r read support\n");
1029 (void) FormatLocaleFile(file,
"w write support\n");
1030 (void) FormatLocaleFile(file,
"+ support for multiple images\n");
1031 (void) fflush(file);
1032 magick_info=(
const MagickInfo **) RelinquishMagickMemory((
void *)
1057MagickExport MagickBooleanType IsMagickCoreInstantiated(
void)
1059 return(instantiate_magickcore);
1080MagickExport MagickBooleanType MagickComponentGenesis(
void)
1083 magick_semaphore=AllocateSemaphoreInfo();
1105MagickExport
void MagickComponentTerminus(
void)
1108 ActivateSemaphoreInfo(&magick_semaphore);
1109 LockSemaphoreInfo(magick_semaphore);
1112 magick_list=DestroySplayTree(magick_list);
1113 magick_list_initialized=MagickFalse;
1115 UnlockSemaphoreInfo(magick_semaphore);
1116 DestroySemaphoreInfo(&magick_semaphore);
1146static SignalHandler *SetMagickSignalHandler(
int signal_number,
1147 SignalHandler *handler)
1149#if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET)
1161 sigaddset(&mask,signal_number);
1162 sigprocmask(SIG_BLOCK,&mask,NULL);
1163 action.sa_mask=mask;
1164 action.sa_handler=handler;
1166#if defined(SA_INTERRUPT)
1167 action.sa_flags|=SA_INTERRUPT;
1169#if defined(SA_ONSTACK)
1170 action.sa_flags|=SA_ONSTACK;
1172 previous_action.sa_handler=SIG_DFL;
1173 status=sigaction(signal_number,&action,&previous_action);
1176 sigprocmask(SIG_UNBLOCK,&mask,NULL);
1177 return(previous_action.sa_handler);
1179 return(signal(signal_number,handler));
1183static void MagickSignalHandler(
int signal_number)
1185 if (magickcore_signal_in_progress != MagickFalse)
1186 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]);
1187 magickcore_signal_in_progress=MagickTrue;
1188 AsynchronousResourceComponentTerminus();
1190 if (signal_number == SIGQUIT)
1194 if (signal_number == SIGABRT)
1198 if (signal_number == SIGBUS)
1202 if (signal_number == SIGFPE)
1206 if (signal_number == SIGSEGV)
1209#if !defined(MAGICKCORE_HAVE__EXIT)
1210 exit(signal_number);
1213 if (signal_number == SIGHUP)
1214 _exit(signal_number);
1217 if (signal_number == SIGINT)
1218 _exit(signal_number);
1221 if (signal_number == SIGTERM)
1222 _exit(signal_number);
1224#if defined(MAGICKCORE_HAVE_RAISE)
1225 if (signal_handlers[signal_number] != MagickSignalHandler)
1226 raise(signal_number);
1228 _exit(signal_number);
1232static SignalHandler *RegisterMagickSignalHandler(
int signal_number)
1237 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler);
1238 if (handler == SIG_ERR)
1240 if (handler != SIG_DFL)
1241 handler=SetMagickSignalHandler(signal_number,handler);
1243 (
void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
1244 "Register handler for signal: %d",signal_number);
1248static void SetClientNameAndPath(
const char *path)
1251 execution_path[MaxTextExtent],
1252 filename[MaxTextExtent];
1254#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1255 if ((path != (
const char *) NULL) && (IsPathAccessible(path) != MagickFalse))
1257 if ((path != (
const char *) NULL) && (*path == *DirectorySeparator) &&
1258 (IsPathAccessible(path) != MagickFalse))
1260 (void) CopyMagickString(execution_path,path,MaxTextExtent);
1262 (
void) GetExecutionPath(execution_path,MaxTextExtent);
1263 GetPathComponent(execution_path,TailPath,filename);
1264 (void) SetClientName(filename);
1265 GetPathComponent(execution_path,HeadPath,execution_path);
1266 (void) SetClientPath(execution_path);
1269MagickExport
void MagickCoreGenesis(
const char *path,
1270 const MagickBooleanType establish_signal_handlers)
1278#if defined(__has_feature)
1279#if __has_feature(address_sanitizer)
1280 (void) putenv(
"MAGICK_THREAD_LIMIT=1");
1283 InitializeMagickMutex();
1285 if (instantiate_magickcore != MagickFalse)
1287 UnlockMagickMutex();
1290 (void) SemaphoreComponentGenesis();
1291 (void) ExceptionComponentGenesis();
1292 SetClientNameAndPath(path);
1293 (void) LogComponentGenesis();
1294 (void) LocaleComponentGenesis();
1295 (void) RandomComponentGenesis();
1296 events=GetEnvironmentValue(
"MAGICK_DEBUG");
1297 if (events != (
char *) NULL)
1299 (void) SetLogEventMask(events);
1300 events=DestroyString(events);
1302#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1305 if (establish_signal_handlers != MagickFalse)
1311 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL)
1312 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT);
1315 if (signal_handlers[SIGBUS] == (SignalHandler *) NULL)
1316 signal_handlers[SIGBUS]=RegisterMagickSignalHandler(SIGBUS);
1319 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL)
1320 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV);
1323 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL)
1324 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE);
1327 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL)
1328 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP);
1331 if (signal_handlers[SIGINT] == (SignalHandler *) NULL)
1332 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT);
1335 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL)
1336 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT);
1339 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL)
1340 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM);
1343 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL)
1344 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU);
1347 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL)
1348 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ);
1354 (void) ConfigureComponentGenesis();
1355 (void) PolicyComponentGenesis();
1356 (void) CacheComponentGenesis();
1357 (void) ResourceComponentGenesis();
1358 (void) CoderComponentGenesis();
1359 (void) MagickComponentGenesis();
1360#if defined(MAGICKCORE_MODULES_SUPPORT)
1361 (void) ModuleComponentGenesis();
1363 (void) DelegateComponentGenesis();
1364 (void) MagicComponentGenesis();
1365 (void) ColorComponentGenesis();
1366 (void) TypeComponentGenesis();
1367 (void) MimeComponentGenesis();
1368 (void) AnnotateComponentGenesis();
1369#if defined(MAGICKCORE_X11_DELEGATE)
1370 (void) XComponentGenesis();
1372 (void) RegistryComponentGenesis();
1373 (void) MonitorComponentGenesis();
1374 instantiate_magickcore=MagickTrue;
1375 UnlockMagickMutex();
1418MagickExport
void MagickCoreTerminus(
void)
1420 InitializeMagickMutex();
1422 if (instantiate_magickcore == MagickFalse)
1424 UnlockMagickMutex();
1427 MonitorComponentTerminus();
1428 RegistryComponentTerminus();
1429#if defined(MAGICKCORE_XML_DELEGATE)
1432 AnnotateComponentTerminus();
1433 MimeComponentTerminus();
1434 TypeComponentTerminus();
1435#if defined(MAGICKCORE_OPENCL_SUPPORT)
1438 ColorComponentTerminus();
1439#if defined(MAGICKCORE_WINDOWS_SUPPORT)
1440 NTWindowsTerminus();
1442 MagicComponentTerminus();
1443 DelegateComponentTerminus();
1444 MagickComponentTerminus();
1445#if !defined(MAGICKCORE_BUILD_MODULES)
1446 UnregisterStaticModules();
1448#if defined(MAGICKCORE_MODULES_SUPPORT)
1449 ModuleComponentTerminus();
1451#if defined(MAGICKCORE_X11_DELEGATE)
1452 XComponentTerminus();
1454 CoderComponentTerminus();
1455 AsynchronousResourceComponentTerminus();
1456 ResourceComponentTerminus();
1457 CacheComponentTerminus();
1458 PolicyComponentTerminus();
1459 ConfigureComponentTerminus();
1460 RandomComponentTerminus();
1461 LocaleComponentTerminus();
1462 LogComponentTerminus();
1463 ExceptionComponentTerminus();
1464 instantiate_magickcore=MagickFalse;
1465 UnlockMagickMutex();
1466 SemaphoreComponentTerminus();
1504 assert(magick_info->signature == MagickCoreSignature);
1505 if (IsEventLogging() != MagickFalse)
1506 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",magick_info->name);
1509 if (((magick_info->thread_support & DecoderThreadSupport) == 0) ||
1510 ((magick_info->thread_support & EncoderThreadSupport) == 0))
1511 magick_info->semaphore=AllocateSemaphoreInfo();
1512 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info);
1513 if (status == MagickFalse)
1514 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1515 return(magick_info);
1536MagickPrivate
void ResetMagickPrecision(
void)
1568MagickExport
MagickInfo *SetMagickInfo(
const char *name)
1573 assert(name != (
const char *) NULL);
1574 if (IsEventLogging() != MagickFalse)
1575 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",name);
1576 magick_info=(
MagickInfo *) AcquireMagickMemory(
sizeof(*magick_info));
1578 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
1579 (void) memset(magick_info,0,
sizeof(*magick_info));
1580 magick_info->name=ConstantString(name);
1581 magick_info->adjoin=MagickTrue;
1582 magick_info->blob_support=MagickTrue;
1583 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport |
1584 EncoderThreadSupport);
1585 magick_info->signature=MagickCoreSignature;
1586 return(magick_info);
1618MagickExport
int SetMagickPrecision(
const int precision)
1620#define MagickPrecision (4+MAGICKCORE_QUANTUM_DEPTH/8)
1622 if (IsEventLogging() != MagickFalse)
1623 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1625 magick_precision=precision;
1626 if ((precision < 0) || (magick_precision == 0))
1632 *exception = AcquireExceptionInfo();
1634 magick_precision=MagickPrecision;
1635 limit=(
char *) GetImageRegistry(StringRegistryType,
"precision",exception);
1636 exception=DestroyExceptionInfo(exception);
1637 if (limit == (
char *) NULL)
1638 limit=GetEnvironmentValue(
"MAGICK_PRECISION");
1639 if (limit == (
char *) NULL)
1640 limit=GetPolicyValue(
"system:precision");
1641 if (limit != (
char *) NULL)
1643 magick_precision=StringToInteger(limit);
1644 limit=DestroyString(limit);
1647 return(magick_precision);
1674MagickExport MagickBooleanType UnregisterMagickInfo(
const char *name)
1682 assert(name != (
const char *) NULL);
1684 return(MagickFalse);
1685 if (GetNumberOfNodesInSplayTree(magick_list) == 0)
1686 return(MagickFalse);
1687 LockSemaphoreInfo(magick_semaphore);
1688 ResetSplayTreeIterator(magick_list);
1689 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1692 if (LocaleCompare(p->name,name) == 0)
1694 p=(
const MagickInfo *) GetNextValueInSplayTree(magick_list);
1696 status=DeleteNodeByValueFromSplayTree(magick_list,p);
1697 UnlockSemaphoreInfo(magick_semaphore);