MagickCore  6.7.5
magick.c
Go to the documentation of this file.
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 }