|
MagickCore
6.7.5
|
00001 /* 00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00003 % % 00004 % % 00005 % % 00006 % M M AAA GGGG IIIII CCCC K K % 00007 % MM MM A A G I C K K % 00008 % M M M AAAAA G GGG I C KKK % 00009 % M M A A G G I C K K % 00010 % M M A A GGGG IIIII CCCC K K % 00011 % % 00012 % % 00013 % Methods to Read or List ImageMagick Image formats % 00014 % % 00015 % Software Design % 00016 % Bob Friesenhahn % 00017 % John Cristy % 00018 % November 1998 % 00019 % % 00020 % % 00021 % Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization % 00022 % dedicated to making software imaging solutions freely available. % 00023 % % 00024 % You may not use this file except in compliance with the License. You may % 00025 % obtain a copy of the License at % 00026 % % 00027 % http://www.imagemagick.org/script/license.php % 00028 % % 00029 % Unless required by applicable law or agreed to in writing, software % 00030 % distributed under the License is distributed on an "AS IS" BASIS, % 00031 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 00032 % See the License for the specific language governing permissions and % 00033 % limitations under the License. % 00034 % % 00035 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00036 % 00037 % 00038 */ 00039 00040 /* 00041 Include declarations. 00042 */ 00043 #include "MagickCore/studio.h" 00044 #include "MagickCore/annotate-private.h" 00045 #include "MagickCore/blob.h" 00046 #include "MagickCore/blob-private.h" 00047 #include "MagickCore/cache.h" 00048 #include "MagickCore/cache-private.h" 00049 #include "MagickCore/coder-private.h" 00050 #include "MagickCore/client.h" 00051 #include "MagickCore/color-private.h" 00052 #include "MagickCore/configure-private.h" 00053 #include "MagickCore/constitute-private.h" 00054 #include "MagickCore/delegate-private.h" 00055 #include "MagickCore/draw.h" 00056 #include "MagickCore/exception.h" 00057 #include "MagickCore/exception-private.h" 00058 #include "MagickCore/locale-private.h" 00059 #include "MagickCore/log-private.h" 00060 #include "MagickCore/magic-private.h" 00061 #include "MagickCore/magick.h" 00062 #include "MagickCore/magick-private.h" 00063 #include "MagickCore/memory_.h" 00064 #include "MagickCore/mime-private.h" 00065 #include "MagickCore/module.h" 00066 #include "MagickCore/module-private.h" 00067 #include "MagickCore/nt-base-private.h" 00068 #include "MagickCore/random-private.h" 00069 #include "MagickCore/registry.h" 00070 #include "MagickCore/registry-private.h" 00071 #include "MagickCore/resource_.h" 00072 #include "MagickCore/resource-private.h" 00073 #include "MagickCore/policy.h" 00074 #include "MagickCore/policy-private.h" 00075 #include "MagickCore/semaphore.h" 00076 #include "MagickCore/semaphore-private.h" 00077 #include "MagickCore/signature-private.h" 00078 #include "MagickCore/splay-tree.h" 00079 #include "MagickCore/string_.h" 00080 #include "MagickCore/string-private.h" 00081 #include "MagickCore/thread_.h" 00082 #include "MagickCore/thread-private.h" 00083 #include "MagickCore/type-private.h" 00084 #include "MagickCore/token.h" 00085 #include "MagickCore/utility.h" 00086 #include "MagickCore/utility-private.h" 00087 #include "MagickCore/xwindow-private.h" 00088 00089 /* 00090 Define declarations. 00091 */ 00092 #if !defined(MAGICKCORE_RETSIGTYPE) 00093 # define MAGICKCORE_RETSIGTYPE void 00094 #endif 00095 #if !defined(SIG_DFL) 00096 # define SIG_DFL ((SignalHandler *) 0) 00097 #endif 00098 #if !defined(SIG_ERR) 00099 # define SIG_ERR ((SignalHandler *) -1) 00100 #endif 00101 #if !defined(SIGMAX) 00102 #define SIGMAX 64 00103 #endif 00104 00105 /* 00106 Typedef declarations. 00107 */ 00108 typedef MAGICKCORE_RETSIGTYPE 00109 SignalHandler(int); 00110 00111 /* 00112 Global declarations. 00113 */ 00114 static SemaphoreInfo 00115 *magick_semaphore = (SemaphoreInfo *) NULL; 00116 00117 static SignalHandler 00118 *signal_handlers[SIGMAX] = { (SignalHandler *) NULL }; 00119 00120 static SplayTreeInfo 00121 *magick_list = (SplayTreeInfo *) NULL; 00122 00123 static volatile MagickBooleanType 00124 instantiate_magick = MagickFalse, 00125 instantiate_magickcore = MagickFalse; 00126 00127 /* 00128 Forward declarations. 00129 */ 00130 static MagickBooleanType 00131 InitializeMagickList(ExceptionInfo *); 00132 00133 /* 00134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00135 % % 00136 % % 00137 % % 00138 + G e t I m a g e D e c o d e r % 00139 % % 00140 % % 00141 % % 00142 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00143 % 00144 % GetImageDecoder() returns the image decoder. 00145 % 00146 % The format of the GetImageDecoder method is: 00147 % 00148 % DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info) 00149 % 00150 % A description of each parameter follows: 00151 % 00152 % o magick_info: The magick info. 00153 % 00154 */ 00155 MagickExport DecodeImageHandler *GetImageDecoder(const MagickInfo *magick_info) 00156 { 00157 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00158 assert(magick_info != (MagickInfo *) NULL); 00159 assert(magick_info->signature == MagickSignature); 00160 return(magick_info->decoder); 00161 } 00162 00163 /* 00164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00165 % % 00166 % % 00167 % % 00168 + G e t I m a g e E n c o d e r % 00169 % % 00170 % % 00171 % % 00172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00173 % 00174 % GetImageEncoder() returns the image encoder. 00175 % 00176 % The format of the GetImageEncoder method is: 00177 % 00178 % EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info) 00179 % 00180 % A description of each parameter follows: 00181 % 00182 % o magick_info: The magick info. 00183 % 00184 */ 00185 MagickExport EncodeImageHandler *GetImageEncoder(const MagickInfo *magick_info) 00186 { 00187 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00188 assert(magick_info != (MagickInfo *) NULL); 00189 assert(magick_info->signature == MagickSignature); 00190 return(magick_info->encoder); 00191 } 00192 00193 /* 00194 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00195 % % 00196 % % 00197 % % 00198 + G e t I m a g e M a g i c k % 00199 % % 00200 % % 00201 % % 00202 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00203 % 00204 % GetImageMagick() searches for an image format that matches the specified 00205 % magick string. If one is found, MagickTrue is returned otherwise 00206 % MagickFalse. 00207 % 00208 % The format of the GetImageMagick method is: 00209 % 00210 % MagickBooleanType GetImageMagick(const unsigned char *magick, 00211 % const size_t length,char *format) 00212 % 00213 % A description of each parameter follows: 00214 % 00215 % o magick: the image format we are searching for. 00216 % 00217 % o length: the length of the binary string. 00218 % 00219 % o format: the image format as determined by the magick bytes. 00220 % 00221 */ 00222 MagickExport MagickBooleanType GetImageMagick(const unsigned char *magick, 00223 const size_t length,char *format) 00224 { 00225 ExceptionInfo 00226 *exception; 00227 00228 MagickBooleanType 00229 status; 00230 00231 register const MagickInfo 00232 *p; 00233 00234 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00235 assert(magick != (const unsigned char *) NULL); 00236 exception=AcquireExceptionInfo(); 00237 p=GetMagickInfo("*",exception); 00238 exception=DestroyExceptionInfo(exception); 00239 if (p == (const MagickInfo *) NULL) 00240 return(MagickFalse); 00241 status=MagickFalse; 00242 LockSemaphoreInfo(magick_semaphore); 00243 ResetSplayTreeIterator(magick_list); 00244 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00245 while (p != (const MagickInfo *) NULL) 00246 { 00247 if ((p->magick != (IsImageFormatHandler *) NULL) && 00248 (p->magick(magick,length) != 0)) 00249 { 00250 status=MagickTrue; 00251 (void) CopyMagickString(format,p->name,MaxTextExtent); 00252 break; 00253 } 00254 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00255 } 00256 UnlockSemaphoreInfo(magick_semaphore); 00257 return(status); 00258 } 00259 00260 /* 00261 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00262 % % 00263 % % 00264 % % 00265 + G e t M a g i c k A d j o i n % 00266 % % 00267 % % 00268 % % 00269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00270 % 00271 % GetMagickAdjoin() returns MagickTrue if the magick adjoin is MagickTrue. 00272 % 00273 % The format of the GetMagickAdjoin method is: 00274 % 00275 % MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info) 00276 % 00277 % A description of each parameter follows: 00278 % 00279 % o magick_info: The magick info. 00280 % 00281 */ 00282 MagickExport MagickBooleanType GetMagickAdjoin(const MagickInfo *magick_info) 00283 { 00284 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00285 assert(magick_info != (MagickInfo *) NULL); 00286 assert(magick_info->signature == MagickSignature); 00287 return(magick_info->adjoin); 00288 } 00289 00290 /* 00291 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00292 % % 00293 % % 00294 % % 00295 + G e t M a g i c k B l o b S u p p o r t % 00296 % % 00297 % % 00298 % % 00299 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00300 % 00301 % GetMagickBlobSupport() returns MagickTrue if the magick supports blobs. 00302 % 00303 % The format of the GetMagickBlobSupport method is: 00304 % 00305 % MagickBooleanType GetMagickBlobSupport(const MagickInfo *magick_info) 00306 % 00307 % A description of each parameter follows: 00308 % 00309 % o magick_info: The magick info. 00310 % 00311 */ 00312 MagickExport MagickBooleanType GetMagickBlobSupport( 00313 const MagickInfo *magick_info) 00314 { 00315 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00316 assert(magick_info != (MagickInfo *) NULL); 00317 assert(magick_info->signature == MagickSignature); 00318 return(magick_info->blob_support); 00319 } 00320 00321 /* 00322 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00323 % % 00324 % % 00325 % % 00326 + G e t M a g i c k D e s c r i p t i o n % 00327 % % 00328 % % 00329 % % 00330 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00331 % 00332 % GetMagickDescription() returns the magick description. 00333 % 00334 % The format of the GetMagickDescription method is: 00335 % 00336 % const char *GetMagickDescription(const MagickInfo *magick_info) 00337 % 00338 % A description of each parameter follows: 00339 % 00340 % o magick_info: The magick info. 00341 % 00342 */ 00343 MagickExport const char *GetMagickDescription(const MagickInfo *magick_info) 00344 { 00345 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00346 assert(magick_info != (MagickInfo *) NULL); 00347 assert(magick_info->signature == MagickSignature); 00348 return(magick_info->description); 00349 } 00350 00351 /* 00352 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00353 % % 00354 % % 00355 % % 00356 + G e t M a g i c k E n d i a n S u p p o r t % 00357 % % 00358 % % 00359 % % 00360 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00361 % 00362 % GetMagickEndianSupport() returns the MagickTrue if the coder respects 00363 % endianness other than MSBEndian. 00364 % 00365 % The format of the GetMagickEndianSupport method is: 00366 % 00367 % MagickBooleanType GetMagickEndianSupport(const MagickInfo *magick_info) 00368 % 00369 % A description of each parameter follows: 00370 % 00371 % o magick_info: The magick info. 00372 % 00373 */ 00374 MagickExport MagickBooleanType GetMagickEndianSupport( 00375 const MagickInfo *magick_info) 00376 { 00377 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00378 assert(magick_info != (MagickInfo *) NULL); 00379 assert(magick_info->signature == MagickSignature); 00380 return(magick_info->endian_support); 00381 } 00382 00383 /* 00384 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00385 % % 00386 % % 00387 % % 00388 + G e t M a g i c k I n f o % 00389 % % 00390 % % 00391 % % 00392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00393 % 00394 % GetMagickInfo() returns a pointer MagickInfo structure that matches 00395 % the specified name. If name is NULL, the head of the image format list 00396 % is returned. 00397 % 00398 % The format of the GetMagickInfo method is: 00399 % 00400 % const MagickInfo *GetMagickInfo(const char *name,Exception *exception) 00401 % 00402 % A description of each parameter follows: 00403 % 00404 % o name: the image format we are looking for. 00405 % 00406 % o exception: return any errors or warnings in this structure. 00407 % 00408 */ 00409 MagickExport const MagickInfo *GetMagickInfo(const char *name, 00410 ExceptionInfo *exception) 00411 { 00412 register const MagickInfo 00413 *p; 00414 00415 assert(exception != (ExceptionInfo *) NULL); 00416 if ((magick_list == (SplayTreeInfo *) NULL) || 00417 (instantiate_magick == MagickFalse)) 00418 if (InitializeMagickList(exception) == MagickFalse) 00419 return((const MagickInfo *) NULL); 00420 if ((name == (const char *) NULL) || (LocaleCompare(name,"*") == 0)) 00421 { 00422 #if defined(MAGICKCORE_MODULES_SUPPORT) 00423 if (LocaleCompare(name,"*") == 0) 00424 (void) OpenModules(exception); 00425 #endif 00426 LockSemaphoreInfo(magick_semaphore); 00427 ResetSplayTreeIterator(magick_list); 00428 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00429 UnlockSemaphoreInfo(magick_semaphore); 00430 return(p); 00431 } 00432 /* 00433 Find name in list. 00434 */ 00435 LockSemaphoreInfo(magick_semaphore); 00436 ResetSplayTreeIterator(magick_list); 00437 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00438 while (p != (const MagickInfo *) NULL) 00439 { 00440 if (LocaleCompare(p->name,name) == 0) 00441 break; 00442 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00443 } 00444 #if defined(MAGICKCORE_MODULES_SUPPORT) 00445 if (p == (const MagickInfo *) NULL) 00446 { 00447 if (*name != '\0') 00448 (void) OpenModule(name,exception); 00449 ResetSplayTreeIterator(magick_list); 00450 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00451 while (p != (const MagickInfo *) NULL) 00452 { 00453 if (LocaleCompare(p->name,name) == 0) 00454 break; 00455 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00456 } 00457 } 00458 #endif 00459 UnlockSemaphoreInfo(magick_semaphore); 00460 return(p); 00461 } 00462 00463 /* 00464 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00465 % % 00466 % % 00467 % % 00468 + G e t M a g i c k I n f o L i s t % 00469 % % 00470 % % 00471 % % 00472 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00473 % 00474 % GetMagickInfoList() returns any image formats that match the specified 00475 % pattern. 00476 % 00477 % The format of the GetMagickInfoList function is: 00478 % 00479 % const MagickInfo **GetMagickInfoList(const char *pattern, 00480 % size_t *number_formats,ExceptionInfo *exception) 00481 % 00482 % A description of each parameter follows: 00483 % 00484 % o pattern: Specifies a pointer to a text string containing a pattern. 00485 % 00486 % o number_formats: This integer returns the number of formats in the list. 00487 % 00488 % o exception: return any errors or warnings in this structure. 00489 % 00490 */ 00491 00492 #if defined(__cplusplus) || defined(c_plusplus) 00493 extern "C" { 00494 #endif 00495 00496 static int MagickInfoCompare(const void *x,const void *y) 00497 { 00498 const MagickInfo 00499 **p, 00500 **q; 00501 00502 p=(const MagickInfo **) x, 00503 q=(const MagickInfo **) y; 00504 return(LocaleCompare((*p)->name,(*q)->name)); 00505 } 00506 00507 #if defined(__cplusplus) || defined(c_plusplus) 00508 } 00509 #endif 00510 00511 MagickExport const MagickInfo **GetMagickInfoList(const char *pattern, 00512 size_t *number_formats,ExceptionInfo *exception) 00513 { 00514 const MagickInfo 00515 **formats; 00516 00517 register const MagickInfo 00518 *p; 00519 00520 register ssize_t 00521 i; 00522 00523 /* 00524 Allocate magick list. 00525 */ 00526 assert(pattern != (char *) NULL); 00527 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); 00528 assert(number_formats != (size_t *) NULL); 00529 *number_formats=0; 00530 p=GetMagickInfo("*",exception); 00531 if (p == (const MagickInfo *) NULL) 00532 return((const MagickInfo **) NULL); 00533 formats=(const MagickInfo **) AcquireQuantumMemory((size_t) 00534 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats)); 00535 if (formats == (const MagickInfo **) NULL) 00536 return((const MagickInfo **) NULL); 00537 /* 00538 Generate magick list. 00539 */ 00540 LockSemaphoreInfo(magick_semaphore); 00541 ResetSplayTreeIterator(magick_list); 00542 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00543 for (i=0; p != (const MagickInfo *) NULL; ) 00544 { 00545 if ((p->stealth == MagickFalse) && 00546 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) 00547 formats[i++]=p; 00548 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00549 } 00550 UnlockSemaphoreInfo(magick_semaphore); 00551 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickInfoCompare); 00552 formats[i]=(MagickInfo *) NULL; 00553 *number_formats=(size_t) i; 00554 return(formats); 00555 } 00556 00557 /* 00558 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00559 % % 00560 % % 00561 % % 00562 + G e t M a g i c k L i s t % 00563 % % 00564 % % 00565 % % 00566 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00567 % 00568 % GetMagickList() returns any image formats that match the specified pattern. 00569 % 00570 % The format of the GetMagickList function is: 00571 % 00572 % char **GetMagickList(const char *pattern,size_t *number_formats, 00573 % ExceptionInfo *exception) 00574 % 00575 % A description of each parameter follows: 00576 % 00577 % o pattern: Specifies a pointer to a text string containing a pattern. 00578 % 00579 % o number_formats: This integer returns the number of formats in the list. 00580 % 00581 % o exception: return any errors or warnings in this structure. 00582 % 00583 */ 00584 00585 #if defined(__cplusplus) || defined(c_plusplus) 00586 extern "C" { 00587 #endif 00588 00589 static int MagickCompare(const void *x,const void *y) 00590 { 00591 register const char 00592 **p, 00593 **q; 00594 00595 p=(const char **) x; 00596 q=(const char **) y; 00597 return(LocaleCompare(*p,*q)); 00598 } 00599 00600 #if defined(__cplusplus) || defined(c_plusplus) 00601 } 00602 #endif 00603 00604 MagickExport char **GetMagickList(const char *pattern, 00605 size_t *number_formats,ExceptionInfo *exception) 00606 { 00607 char 00608 **formats; 00609 00610 register const MagickInfo 00611 *p; 00612 00613 register ssize_t 00614 i; 00615 00616 /* 00617 Allocate magick list. 00618 */ 00619 assert(pattern != (char *) NULL); 00620 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",pattern); 00621 assert(number_formats != (size_t *) NULL); 00622 *number_formats=0; 00623 p=GetMagickInfo("*",exception); 00624 if (p == (const MagickInfo *) NULL) 00625 return((char **) NULL); 00626 formats=(char **) AcquireQuantumMemory((size_t) 00627 GetNumberOfNodesInSplayTree(magick_list)+1UL,sizeof(*formats)); 00628 if (formats == (char **) NULL) 00629 return((char **) NULL); 00630 LockSemaphoreInfo(magick_semaphore); 00631 ResetSplayTreeIterator(magick_list); 00632 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00633 for (i=0; p != (const MagickInfo *) NULL; ) 00634 { 00635 if ((p->stealth == MagickFalse) && 00636 (GlobExpression(p->name,pattern,MagickFalse) != MagickFalse)) 00637 formats[i++]=ConstantString(p->name); 00638 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 00639 } 00640 UnlockSemaphoreInfo(magick_semaphore); 00641 qsort((void *) formats,(size_t) i,sizeof(*formats),MagickCompare); 00642 formats[i]=(char *) NULL; 00643 *number_formats=(size_t) i; 00644 return(formats); 00645 } 00646 00647 /* 00648 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00649 % % 00650 % % 00651 % % 00652 % G e t M a g i c k P r e c i s i o n % 00653 % % 00654 % % 00655 % % 00656 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00657 % 00658 % GetMagickPrecision() returns the maximum number of significant digits to be 00659 % printed. 00660 % 00661 % The format of the GetMagickPrecision method is: 00662 % 00663 % int GetMagickPrecision(void) 00664 % 00665 */ 00666 MagickExport int GetMagickPrecision(void) 00667 { 00668 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00669 return(SetMagickPrecision(0)); 00670 } 00671 00672 /* 00673 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00674 % % 00675 % % 00676 % % 00677 + G e t M a g i c k R a w S u p p o r t % 00678 % % 00679 % % 00680 % % 00681 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00682 % 00683 % GetMagickRawSupport() returns the MagickTrue if the coder is a raw format. 00684 % 00685 % The format of the GetMagickRawSupport method is: 00686 % 00687 % MagickBooleanType GetMagickRawSupport(const MagickInfo *magick_info) 00688 % 00689 % A description of each parameter follows: 00690 % 00691 % o magick_info: The magick info. 00692 % 00693 */ 00694 MagickExport MagickBooleanType GetMagickRawSupport( 00695 const MagickInfo *magick_info) 00696 { 00697 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00698 assert(magick_info != (MagickInfo *) NULL); 00699 assert(magick_info->signature == MagickSignature); 00700 return(magick_info->raw); 00701 } 00702 00703 /* 00704 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00705 % % 00706 % % 00707 % % 00708 + G e t M a g i c k S e e k a b l e S t r e a m % 00709 % % 00710 % % 00711 % % 00712 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00713 % 00714 % GetMagickSeekableStream() returns MagickTrue if the magick supports a 00715 % seekable stream. 00716 % 00717 % The format of the GetMagickSeekableStream method is: 00718 % 00719 % MagickBooleanType GetMagickSeekableStream(const MagickInfo *magick_info) 00720 % 00721 % A description of each parameter follows: 00722 % 00723 % o magick_info: The magick info. 00724 % 00725 */ 00726 MagickExport MagickBooleanType GetMagickSeekableStream( 00727 const MagickInfo *magick_info) 00728 { 00729 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00730 assert(magick_info != (MagickInfo *) NULL); 00731 assert(magick_info->signature == MagickSignature); 00732 return(magick_info->seekable_stream); 00733 } 00734 00735 /* 00736 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00737 % % 00738 % % 00739 % % 00740 + G e t M a g i c k T h r e a d S u p p o r t % 00741 % % 00742 % % 00743 % % 00744 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00745 % 00746 % GetMagickThreadSupport() returns MagickTrue if the magick supports threads. 00747 % 00748 % The format of the GetMagickThreadSupport method is: 00749 % 00750 % MagickStatusType GetMagickThreadSupport(const MagickInfo *magick_info) 00751 % 00752 % A description of each parameter follows: 00753 % 00754 % o magick_info: The magick info. 00755 % 00756 */ 00757 MagickExport MagickStatusType GetMagickThreadSupport( 00758 const MagickInfo *magick_info) 00759 { 00760 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00761 assert(magick_info != (MagickInfo *) NULL); 00762 assert(magick_info->signature == MagickSignature); 00763 return(magick_info->thread_support); 00764 } 00765 00766 /* 00767 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00768 % % 00769 % % 00770 % % 00771 + I n i t i a l i z e M a g i c k L i s t % 00772 % % 00773 % % 00774 % % 00775 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00776 % 00777 % InitializeMagickList() initializes the magick list. 00778 % 00779 % The format of the InitializeMagickList() method is: 00780 % 00781 % InitializeMagickList(Exceptioninfo *exception) 00782 % 00783 % A description of each parameter follows. 00784 % 00785 % o exception: return any errors or warnings in this structure. 00786 % 00787 */ 00788 00789 static void *DestroyMagickNode(void *magick_info) 00790 { 00791 register MagickInfo 00792 *p; 00793 00794 p=(MagickInfo *) magick_info; 00795 if (p->name != (char *) NULL) 00796 p->name=DestroyString(p->name); 00797 if (p->description != (char *) NULL) 00798 p->description=DestroyString(p->description); 00799 if (p->version != (char *) NULL) 00800 p->version=DestroyString(p->version); 00801 if (p->note != (char *) NULL) 00802 p->note=DestroyString(p->note); 00803 if (p->module != (char *) NULL) 00804 p->module=DestroyString(p->module); 00805 return(RelinquishMagickMemory(p)); 00806 } 00807 00808 static MagickBooleanType InitializeMagickList(ExceptionInfo *exception) 00809 { 00810 (void) exception; 00811 if ((magick_list == (SplayTreeInfo *) NULL) && 00812 (instantiate_magick == MagickFalse)) 00813 { 00814 if (magick_semaphore == (SemaphoreInfo *) NULL) 00815 AcquireSemaphoreInfo(&magick_semaphore); 00816 LockSemaphoreInfo(magick_semaphore); 00817 if ((magick_list == (SplayTreeInfo *) NULL) && 00818 (instantiate_magick == MagickFalse)) 00819 { 00820 MagickBooleanType 00821 status; 00822 00823 MagickInfo 00824 *magick_info; 00825 00826 magick_list=NewSplayTree(CompareSplayTreeString, 00827 (void *(*)(void *)) NULL,DestroyMagickNode); 00828 if (magick_list == (SplayTreeInfo *) NULL) 00829 ThrowFatalException(ResourceLimitFatalError, 00830 "MemoryAllocationFailed"); 00831 magick_info=SetMagickInfo("ephemeral"); 00832 magick_info->stealth=MagickTrue; 00833 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info); 00834 if (status == MagickFalse) 00835 ThrowFatalException(ResourceLimitFatalError, 00836 "MemoryAllocationFailed"); 00837 magick_info=SetMagickInfo("clipmask"); 00838 magick_info->stealth=MagickTrue; 00839 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info); 00840 if (status == MagickFalse) 00841 { 00842 char 00843 *message; 00844 00845 message=GetExceptionMessage(errno); 00846 ThrowFatalException(ResourceLimitFatalError, 00847 "MemoryAllocationFailed"); 00848 message=DestroyString(message); 00849 } 00850 #if defined(MAGICKCORE_MODULES_SUPPORT) 00851 (void) GetModuleInfo((char *) NULL,exception); 00852 #endif 00853 #if !defined(MAGICKCORE_BUILD_MODULES) 00854 RegisterStaticModules(); 00855 #endif 00856 instantiate_magick=MagickTrue; 00857 } 00858 UnlockSemaphoreInfo(magick_semaphore); 00859 } 00860 return(magick_list != (SplayTreeInfo *) NULL ? MagickTrue : MagickFalse); 00861 } 00862 00863 /* 00864 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00865 % % 00866 % % 00867 % % 00868 + I s M a g i c k C o n f l i c t % 00869 % % 00870 % % 00871 % % 00872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00873 % 00874 % IsMagickConflict() returns MagickTrue if the image format conflicts with a 00875 % logical drive (.e.g. X:). 00876 % 00877 % The format of the IsMagickConflict method is: 00878 % 00879 % MagickBooleanType IsMagickConflict(const char *magick) 00880 % 00881 % A description of each parameter follows: 00882 % 00883 % o magick: Specifies the image format. 00884 % 00885 */ 00886 MagickPrivate MagickBooleanType IsMagickConflict(const char *magick) 00887 { 00888 assert(magick != (char *) NULL); 00889 #if defined(macintosh) 00890 return(MACIsMagickConflict(magick)); 00891 #elif defined(vms) 00892 return(VMSIsMagickConflict(magick)); 00893 #elif defined(MAGICKCORE_WINDOWS_SUPPORT) 00894 return(NTIsMagickConflict(magick)); 00895 #else 00896 return(MagickFalse); 00897 #endif 00898 } 00899 00900 /* 00901 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00902 % % 00903 % % 00904 % % 00905 + L i s t M a g i c k I n f o % 00906 % % 00907 % % 00908 % % 00909 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00910 % 00911 % ListMagickInfo() lists the image formats to a file. 00912 % 00913 % The format of the ListMagickInfo method is: 00914 % 00915 % MagickBooleanType ListMagickInfo(FILE *file,ExceptionInfo *exception) 00916 % 00917 % A description of each parameter follows. 00918 % 00919 % o file: A file handle. 00920 % 00921 % o exception: return any errors or warnings in this structure. 00922 % 00923 */ 00924 MagickExport MagickBooleanType ListMagickInfo(FILE *file, 00925 ExceptionInfo *exception) 00926 { 00927 const MagickInfo 00928 **magick_info; 00929 00930 register ssize_t 00931 i; 00932 00933 size_t 00934 number_formats; 00935 00936 ssize_t 00937 j; 00938 00939 if (file == (FILE *) NULL) 00940 file=stdout; 00941 magick_info=GetMagickInfoList("*",&number_formats,exception); 00942 if (magick_info == (const MagickInfo **) NULL) 00943 return(MagickFalse); 00944 ClearMagickException(exception); 00945 #if !defined(MAGICKCORE_MODULES_SUPPORT) 00946 (void) FormatLocaleFile(file," Format Mode Description\n"); 00947 #else 00948 (void) FormatLocaleFile(file," Format Module Mode Description\n"); 00949 #endif 00950 (void) FormatLocaleFile(file, 00951 "--------------------------------------------------------" 00952 "-----------------------\n"); 00953 for (i=0; i < (ssize_t) number_formats; i++) 00954 { 00955 if (magick_info[i]->stealth != MagickFalse) 00956 continue; 00957 (void) FormatLocaleFile(file,"%9s%c ", 00958 magick_info[i]->name != (char *) NULL ? magick_info[i]->name : "", 00959 magick_info[i]->blob_support != MagickFalse ? '*' : ' '); 00960 #if defined(MAGICKCORE_MODULES_SUPPORT) 00961 { 00962 char 00963 module[MaxTextExtent]; 00964 00965 *module='\0'; 00966 if (magick_info[i]->module != (char *) NULL) 00967 (void) CopyMagickString(module,magick_info[i]->module,MaxTextExtent); 00968 (void) ConcatenateMagickString(module," ",MaxTextExtent); 00969 module[9]='\0'; 00970 (void) FormatLocaleFile(file,"%9s ",module); 00971 } 00972 #endif 00973 (void) FormatLocaleFile(file,"%c%c%c ",magick_info[i]->decoder ? 'r' : '-', 00974 magick_info[i]->encoder ? 'w' : '-',magick_info[i]->encoder != NULL && 00975 magick_info[i]->adjoin != MagickFalse ? '+' : '-'); 00976 if (magick_info[i]->description != (char *) NULL) 00977 (void) FormatLocaleFile(file," %s",magick_info[i]->description); 00978 if (magick_info[i]->version != (char *) NULL) 00979 (void) FormatLocaleFile(file," (%s)",magick_info[i]->version); 00980 (void) FormatLocaleFile(file,"\n"); 00981 if (magick_info[i]->note != (char *) NULL) 00982 { 00983 char 00984 **text; 00985 00986 text=StringToList(magick_info[i]->note); 00987 if (text != (char **) NULL) 00988 { 00989 for (j=0; text[j] != (char *) NULL; j++) 00990 { 00991 (void) FormatLocaleFile(file," %s\n",text[j]); 00992 text[j]=DestroyString(text[j]); 00993 } 00994 text=(char **) RelinquishMagickMemory(text); 00995 } 00996 } 00997 } 00998 (void) FormatLocaleFile(file,"\n* native blob support\n"); 00999 (void) FormatLocaleFile(file,"r read support\n"); 01000 (void) FormatLocaleFile(file,"w write support\n"); 01001 (void) FormatLocaleFile(file,"+ support for multiple images\n"); 01002 (void) fflush(file); 01003 magick_info=(const MagickInfo **) RelinquishMagickMemory((void *) 01004 magick_info); 01005 return(MagickTrue); 01006 } 01007 01008 /* 01009 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01010 % % 01011 % % 01012 % % 01013 % I s M a g i c k I n s t a n t i a t e d % 01014 % % 01015 % % 01016 % % 01017 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01018 % 01019 % IsMagickInstantiated() returns MagickTrue if the ImageMagick environment 01020 % is currently instantiated: MagickCoreGenesis() has been called but 01021 % MagickDestroy() has not. 01022 % 01023 % The format of the IsMagickInstantiated method is: 01024 % 01025 % MagickBooleanType IsMagickInstantiated(void) 01026 % 01027 */ 01028 MagickExport MagickBooleanType IsMagickInstantiated(void) 01029 { 01030 return(instantiate_magick); 01031 } 01032 01033 /* 01034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01035 % % 01036 % % 01037 % % 01038 + M a g i c k C o m p o n e n t G e n e s i s % 01039 % % 01040 % % 01041 % % 01042 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01043 % 01044 % MagickComponentGenesis() instantiates the magick component. 01045 % 01046 % The format of the MagickComponentGenesis method is: 01047 % 01048 % MagickBooleanType MagickComponentGenesis(void) 01049 % 01050 */ 01051 MagickPrivate MagickBooleanType MagickComponentGenesis(void) 01052 { 01053 AcquireSemaphoreInfo(&magick_semaphore); 01054 return(MagickTrue); 01055 } 01056 01057 /* 01058 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01059 % % 01060 % % 01061 % % 01062 + M a g i c k C o m p o n e n t T e r m i n u s % 01063 % % 01064 % % 01065 % % 01066 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01067 % 01068 % MagickComponentTerminus() destroys the magick component. 01069 % 01070 % The format of the MagickComponentTerminus method is: 01071 % 01072 % void MagickComponentTerminus(void) 01073 % 01074 */ 01075 MagickPrivate void MagickComponentTerminus(void) 01076 { 01077 if (magick_semaphore == (SemaphoreInfo *) NULL) 01078 AcquireSemaphoreInfo(&magick_semaphore); 01079 LockSemaphoreInfo(magick_semaphore); 01080 if (magick_list != (SplayTreeInfo *) NULL) 01081 magick_list=DestroySplayTree(magick_list); 01082 instantiate_magick=MagickFalse; 01083 UnlockSemaphoreInfo(magick_semaphore); 01084 DestroySemaphoreInfo(&magick_semaphore); 01085 } 01086 01087 /* 01088 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01089 % % 01090 % % 01091 % % 01092 % M a g i c k C o r e G e n e s i s % 01093 % % 01094 % % 01095 % % 01096 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01097 % 01098 % MagickCoreGenesis() initializes the MagickCore environment. 01099 % 01100 % The format of the MagickCoreGenesis function is: 01101 % 01102 % MagickCoreGenesis(const char *path, 01103 % const MagickBooleanType establish_signal_handlers) 01104 % 01105 % A description of each parameter follows: 01106 % 01107 % o path: the execution path of the current ImageMagick client. 01108 % 01109 % o establish_signal_handlers: set to MagickTrue to use MagickCore's own 01110 % signal handlers for common signals. 01111 % 01112 */ 01113 01114 static SignalHandler *SetMagickSignalHandler(int signal_number, 01115 SignalHandler *handler) 01116 { 01117 #if defined(MAGICKCORE_HAVE_SIGACTION) && defined(MAGICKCORE_HAVE_SIGEMPTYSET) 01118 int 01119 status; 01120 01121 sigset_t 01122 mask; 01123 01124 struct sigaction 01125 action, 01126 previous_action; 01127 01128 sigemptyset(&mask); 01129 sigaddset(&mask,signal_number); 01130 sigprocmask(SIG_BLOCK,&mask,NULL); 01131 action.sa_mask=mask; 01132 action.sa_handler=handler; 01133 action.sa_flags=0; 01134 #if defined(SA_INTERRUPT) 01135 action.sa_flags|=SA_INTERRUPT; 01136 #endif 01137 status=sigaction(signal_number,&action,&previous_action); 01138 if (status < 0) 01139 return(SIG_ERR); 01140 sigprocmask(SIG_UNBLOCK,&mask,NULL); 01141 return(previous_action.sa_handler); 01142 #else 01143 return(signal(signal_number,handler)); 01144 #endif 01145 } 01146 01147 static void MagickSignalHandler(int signal_number) 01148 { 01149 #if !defined(MAGICKCORE_HAVE_SIGACTION) 01150 (void) signal(signal_number,SIG_IGN); 01151 #endif 01152 AsynchronousResourceComponentTerminus(); 01153 instantiate_magick=MagickFalse; 01154 (void) SetMagickSignalHandler(signal_number,signal_handlers[signal_number]); 01155 #if defined(MAGICKCORE_HAVE_RAISE) 01156 if (signal_handlers[signal_number] != MagickSignalHandler) 01157 raise(signal_number); 01158 #endif 01159 #if defined(SIGQUIT) 01160 if (signal_number == SIGQUIT) 01161 abort(); 01162 #endif 01163 #if defined(SIGABRT) 01164 if (signal_number == SIGABRT) 01165 abort(); 01166 #endif 01167 #if defined(SIGFPE) 01168 if (signal_number == SIGFPE) 01169 abort(); 01170 #endif 01171 #if defined(SIGXCPU) 01172 if (signal_number == SIGXCPU) 01173 abort(); 01174 #endif 01175 #if defined(SIGXFSZ) 01176 if (signal_number == SIGXFSZ) 01177 abort(); 01178 #endif 01179 #if defined(SIGSEGV) 01180 if (signal_number == SIGSEGV) 01181 abort(); 01182 #endif 01183 #if !defined(MAGICKCORE_HAVE__EXIT) 01184 exit(signal_number); 01185 #else 01186 #if defined(SIGHUP) 01187 if (signal_number == SIGHUP) 01188 exit(signal_number); 01189 #endif 01190 #if defined(SIGINT) && !defined(MAGICKCORE_WINDOWS_SUPPORT) 01191 if (signal_number == SIGINT) 01192 exit(signal_number); 01193 #endif 01194 #if defined(SIGTERM) 01195 if (signal_number == SIGTERM) 01196 exit(signal_number); 01197 #endif 01198 _exit(signal_number); /* do not invoke registered atexit() methods */ 01199 #endif 01200 } 01201 01202 static SignalHandler *RegisterMagickSignalHandler(int signal_number) 01203 { 01204 SignalHandler 01205 *handler; 01206 01207 handler=SetMagickSignalHandler(signal_number,MagickSignalHandler); 01208 if (handler == SIG_ERR) 01209 return(handler); 01210 if (handler != SIG_DFL) 01211 handler=SetMagickSignalHandler(signal_number,handler); 01212 else 01213 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(), 01214 "Register handler for signal: %d",signal_number); 01215 return(handler); 01216 } 01217 01218 MagickExport void MagickCoreGenesis(const char *path, 01219 const MagickBooleanType establish_signal_handlers) 01220 { 01221 char 01222 *events, 01223 execution_path[MaxTextExtent], 01224 filename[MaxTextExtent]; 01225 01226 /* 01227 Initialize the Magick environment. 01228 */ 01229 LockMagickMutex(); 01230 if (instantiate_magickcore != MagickFalse) 01231 { 01232 UnlockMagickMutex(); 01233 return; 01234 } 01235 (void) SemaphoreComponentGenesis(); 01236 (void) LogComponentGenesis(); 01237 (void) LocaleComponentGenesis(); 01238 (void) RandomComponentGenesis(); 01239 events=GetEnvironmentValue("MAGICK_DEBUG"); 01240 if (events != (char *) NULL) 01241 { 01242 (void) SetLogEventMask(events); 01243 events=DestroyString(events); 01244 } 01245 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 01246 #if defined(_DEBUG) && !defined(__BORLANDC__) && !defined(__MINGW32__) 01247 if (IsEventLogging() != MagickFalse) 01248 { 01249 int 01250 debug; 01251 01252 debug=_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 01253 debug|=_CRTDBG_CHECK_ALWAYS_DF |_CRTDBG_DELAY_FREE_MEM_DF | 01254 _CRTDBG_LEAK_CHECK_DF; 01255 if (0) 01256 { 01257 debug=_CrtSetDbgFlag(debug); 01258 _ASSERTE(_CrtCheckMemory()); 01259 } 01260 } 01261 #endif 01262 #endif 01263 /* 01264 Set client name and execution path. 01265 */ 01266 (void) GetExecutionPath(execution_path,MaxTextExtent); 01267 if ((path != (const char *) NULL) && (*path == *DirectorySeparator) && 01268 (IsPathAccessible(path) != MagickFalse)) 01269 (void) CopyMagickString(execution_path,path,MaxTextExtent); 01270 GetPathComponent(execution_path,TailPath,filename); 01271 (void) SetClientName(filename); 01272 GetPathComponent(execution_path,HeadPath,execution_path); 01273 (void) SetClientPath(execution_path); 01274 if (establish_signal_handlers != MagickFalse) 01275 { 01276 /* 01277 Set signal handlers. 01278 */ 01279 #if defined(SIGABRT) 01280 if (signal_handlers[SIGABRT] == (SignalHandler *) NULL) 01281 signal_handlers[SIGABRT]=RegisterMagickSignalHandler(SIGABRT); 01282 #endif 01283 #if defined(SIGSEGV) 01284 if (signal_handlers[SIGSEGV] == (SignalHandler *) NULL) 01285 signal_handlers[SIGSEGV]=RegisterMagickSignalHandler(SIGSEGV); 01286 #endif 01287 #if defined(SIGFPE) 01288 if (signal_handlers[SIGFPE] == (SignalHandler *) NULL) 01289 signal_handlers[SIGFPE]=RegisterMagickSignalHandler(SIGFPE); 01290 #endif 01291 #if defined(SIGHUP) 01292 if (signal_handlers[SIGHUP] == (SignalHandler *) NULL) 01293 signal_handlers[SIGHUP]=RegisterMagickSignalHandler(SIGHUP); 01294 #endif 01295 #if defined(SIGINT) && !defined(MAGICKCORE_WINDOWS_SUPPORT) 01296 if (signal_handlers[SIGINT] == (SignalHandler *) NULL) 01297 signal_handlers[SIGINT]=RegisterMagickSignalHandler(SIGINT); 01298 #endif 01299 #if defined(SIGQUIT) 01300 if (signal_handlers[SIGQUIT] == (SignalHandler *) NULL) 01301 signal_handlers[SIGQUIT]=RegisterMagickSignalHandler(SIGQUIT); 01302 #endif 01303 #if defined(SIGTERM) 01304 if (signal_handlers[SIGTERM] == (SignalHandler *) NULL) 01305 signal_handlers[SIGTERM]=RegisterMagickSignalHandler(SIGTERM); 01306 #endif 01307 #if defined(SIGXCPU) 01308 if (signal_handlers[SIGXCPU] == (SignalHandler *) NULL) 01309 signal_handlers[SIGXCPU]=RegisterMagickSignalHandler(SIGXCPU); 01310 #endif 01311 #if defined(SIGXFSZ) 01312 if (signal_handlers[SIGXFSZ] == (SignalHandler *) NULL) 01313 signal_handlers[SIGXFSZ]=RegisterMagickSignalHandler(SIGXFSZ); 01314 #endif 01315 } 01316 /* 01317 Instantiate magick resources. 01318 */ 01319 (void) ConfigureComponentGenesis(); 01320 (void) PolicyComponentGenesis(); 01321 (void) CacheComponentGenesis(); 01322 (void) RegistryComponentGenesis(); 01323 (void) ResourceComponentGenesis(); 01324 (void) CoderComponentGenesis(); 01325 (void) MagickComponentGenesis(); 01326 #if defined(MAGICKCORE_MODULES_SUPPORT) 01327 (void) ModuleComponentGenesis(); 01328 #endif 01329 (void) DelegateComponentGenesis(); 01330 (void) MagicComponentGenesis(); 01331 (void) ColorComponentGenesis(); 01332 (void) TypeComponentGenesis(); 01333 (void) MimeComponentGenesis(); 01334 (void) ConstituteComponentGenesis(); 01335 (void) AnnotateComponentGenesis(); 01336 #if defined(MAGICKCORE_X11_DELEGATE) 01337 (void) XComponentGenesis(); 01338 #endif 01339 instantiate_magickcore=MagickTrue; 01340 UnlockMagickMutex(); 01341 } 01342 01343 /* 01344 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01345 % % 01346 % % 01347 % % 01348 % M a g i c k C o r e T e r m i n u s % 01349 % % 01350 % % 01351 % % 01352 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01353 % 01354 % MagickCoreTerminus() destroys the MagickCore environment. 01355 % 01356 % The format of the MagickCoreTerminus function is: 01357 % 01358 % MagickCoreTerminus(void) 01359 % 01360 */ 01361 MagickExport void MagickCoreTerminus(void) 01362 { 01363 LockMagickMutex(); 01364 if (instantiate_magickcore == MagickFalse) 01365 { 01366 UnlockMagickMutex(); 01367 return; 01368 } 01369 #if defined(MAGICKCORE_X11_DELEGATE) 01370 XComponentTerminus(); 01371 #endif 01372 AnnotateComponentTerminus(); 01373 ConstituteComponentTerminus(); 01374 MimeComponentTerminus(); 01375 TypeComponentTerminus(); 01376 ColorComponentTerminus(); 01377 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 01378 NTGhostscriptUnLoadDLL(); 01379 #endif 01380 MagicComponentTerminus(); 01381 DelegateComponentTerminus(); 01382 MagickComponentTerminus(); 01383 #if !defined(MAGICKCORE_BUILD_MODULES) 01384 UnregisterStaticModules(); 01385 #endif 01386 #if defined(MAGICKCORE_MODULES_SUPPORT) 01387 ModuleComponentTerminus(); 01388 #endif 01389 CoderComponentTerminus(); 01390 ResourceComponentTerminus(); 01391 RegistryComponentTerminus(); 01392 CacheComponentTerminus(); 01393 PolicyComponentTerminus(); 01394 ConfigureComponentTerminus(); 01395 RandomComponentTerminus(); 01396 LocaleComponentTerminus(); 01397 LogComponentTerminus(); 01398 SemaphoreComponentTerminus(); 01399 instantiate_magickcore=MagickFalse; 01400 UnlockMagickMutex(); 01401 } 01402 01403 /* 01404 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01405 % % 01406 % % 01407 % % 01408 + R e g i s t e r M a g i c k I n f o % 01409 % % 01410 % % 01411 % % 01412 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01413 % 01414 % RegisterMagickInfo() adds attributes for a particular image format to the 01415 % list of supported formats. The attributes include the image format name, 01416 % a method to read and/or write the format, whether the format supports the 01417 % saving of more than one frame to the same file or blob, whether the format 01418 % supports native in-memory I/O, and a brief description of the format. 01419 % 01420 % The format of the RegisterMagickInfo method is: 01421 % 01422 % MagickInfo *RegisterMagickInfo(MagickInfo *magick_info) 01423 % 01424 % A description of each parameter follows: 01425 % 01426 % o magick_info: the magick info. 01427 % 01428 */ 01429 MagickExport MagickInfo *RegisterMagickInfo(MagickInfo *magick_info) 01430 { 01431 MagickBooleanType 01432 status; 01433 01434 /* 01435 Delete any existing name. 01436 */ 01437 assert(magick_info != (MagickInfo *) NULL); 01438 assert(magick_info->signature == MagickSignature); 01439 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",magick_info->name); 01440 if (magick_list == (SplayTreeInfo *) NULL) 01441 return((MagickInfo *) NULL); 01442 status=AddValueToSplayTree(magick_list,magick_info->name,magick_info); 01443 if (status == MagickFalse) 01444 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 01445 return(magick_info); 01446 } 01447 01448 /* 01449 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01450 % % 01451 % % 01452 % % 01453 + S e t M a g i c k I n f o % 01454 % % 01455 % % 01456 % % 01457 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01458 % 01459 % SetMagickInfo() allocates a MagickInfo structure and initializes the members 01460 % to default values. 01461 % 01462 % The format of the SetMagickInfo method is: 01463 % 01464 % MagickInfo *SetMagickInfo(const char *name) 01465 % 01466 % A description of each parameter follows: 01467 % 01468 % o magick_info: Method SetMagickInfo returns the allocated and initialized 01469 % MagickInfo structure. 01470 % 01471 % o name: a character string that represents the image format associated 01472 % with the MagickInfo structure. 01473 % 01474 */ 01475 MagickExport MagickInfo *SetMagickInfo(const char *name) 01476 { 01477 MagickInfo 01478 *magick_info; 01479 01480 assert(name != (const char *) NULL); 01481 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",name); 01482 magick_info=(MagickInfo *) AcquireMagickMemory(sizeof(*magick_info)); 01483 if (magick_info == (MagickInfo *) NULL) 01484 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 01485 (void) ResetMagickMemory(magick_info,0,sizeof(*magick_info)); 01486 magick_info->name=ConstantString(name); 01487 magick_info->adjoin=MagickTrue; 01488 magick_info->blob_support=MagickTrue; 01489 magick_info->thread_support=(MagickStatusType) (DecoderThreadSupport | 01490 EncoderThreadSupport); 01491 magick_info->signature=MagickSignature; 01492 return(magick_info); 01493 } 01494 01495 /* 01496 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01497 % % 01498 % % 01499 % % 01500 % S e t M a g i c k P r e c i s i o n % 01501 % % 01502 % % 01503 % % 01504 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01505 % 01506 % SetMagickPrecision() sets the maximum number of significant digits to be 01507 % printed. 01508 % 01509 % An input argument of 0 returns the current precision setting. 01510 % 01511 % A negative value forces the precision to reset to a default value according 01512 % to the environment variable "MAGICK_PRECISION", the current 'policy' 01513 % configuration setting, or the default value of '6', in that order. 01514 % 01515 % The format of the SetMagickPrecision method is: 01516 % 01517 % int SetMagickPrecision(const int precision) 01518 % 01519 % A description of each parameter follows: 01520 % 01521 % o precision: set the maximum number of significant digits to be printed. 01522 % 01523 */ 01524 MagickExport int SetMagickPrecision(const int precision) 01525 { 01526 #define MagickPrecision 6 01527 01528 static int 01529 magick_precision = 0; 01530 01531 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 01532 if (precision > 0) 01533 magick_precision=precision; 01534 if ((precision < 0) || (magick_precision == 0)) 01535 { 01536 char 01537 *limit; 01538 01539 /* 01540 Precision reset, or it has not been set yet 01541 */ 01542 magick_precision = MagickPrecision; 01543 limit=GetEnvironmentValue("MAGICK_PRECISION"); 01544 if (limit == (char *) NULL) 01545 limit=GetPolicyValue("precision"); 01546 if (limit != (char *) NULL) 01547 { 01548 magick_precision=StringToInteger(limit); 01549 limit=DestroyString(limit); 01550 } 01551 } 01552 return(magick_precision); 01553 } 01554 01555 /* 01556 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01557 % % 01558 % % 01559 % % 01560 + U n r e g i s t e r M a g i c k I n f o % 01561 % % 01562 % % 01563 % % 01564 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 01565 % 01566 % UnregisterMagickInfo() removes a name from the magick info list. It returns 01567 % MagickFalse if the name does not exist in the list otherwise MagickTrue. 01568 % 01569 % The format of the UnregisterMagickInfo method is: 01570 % 01571 % MagickBooleanType UnregisterMagickInfo(const char *name) 01572 % 01573 % A description of each parameter follows: 01574 % 01575 % o name: a character string that represents the image format we are 01576 % looking for. 01577 % 01578 */ 01579 MagickExport MagickBooleanType UnregisterMagickInfo(const char *name) 01580 { 01581 register const MagickInfo 01582 *p; 01583 01584 MagickBooleanType 01585 status; 01586 01587 assert(name != (const char *) NULL); 01588 if (magick_list == (SplayTreeInfo *) NULL) 01589 return(MagickFalse); 01590 if (GetNumberOfNodesInSplayTree(magick_list) == 0) 01591 return(MagickFalse); 01592 LockSemaphoreInfo(magick_semaphore); 01593 ResetSplayTreeIterator(magick_list); 01594 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 01595 while (p != (const MagickInfo *) NULL) 01596 { 01597 if (LocaleCompare(p->name,name) == 0) 01598 break; 01599 p=(const MagickInfo *) GetNextValueInSplayTree(magick_list); 01600 } 01601 status=DeleteNodeByValueFromSplayTree(magick_list,p); 01602 UnlockSemaphoreInfo(magick_semaphore); 01603 return(status); 01604 }