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

Generated on 19 Nov 2009 for MagickCore by  doxygen 1.6.1