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