MagickCore  6.9.13-51
Convert, Edit, Or Compose Bitmap Images
static.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % %
4 % %
5 % %
6 % SSSSS TTTTT AAA TTTTT IIIII CCCC %
7 % SS T A A T I C %
8 % SSS T AAAAA T I C %
9 % SS T A A T I C %
10 % SSSSS T A A T IIIII CCCC %
11 % %
12 % %
13 % MagickCore Static Methods %
14 % %
15 % Software Design %
16 % Cristy %
17 % March 2000 %
18 % %
19 % %
20 % Copyright 1999 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
22 % %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
25 % %
26 % https://imagemagick.org/license/ %
27 % %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
33 % %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %
37 %
38 */
39 
40 /*
41  Include declarations.
42 */
43 #include "magick/studio.h"
44 #include "magick/coder.h"
45 #include "magick/exception-private.h"
46 #include "magick/image.h"
47 #include "magick/module.h"
48 #include "magick/policy.h"
49 #include "magick/static.h"
50 #include "magick/string_.h"
51 
52 /*
53  ImageMagick module stub.
54 */
55 ModuleExport size_t RegisterUndefinedImage(void)
56 {
57  return(MagickImageCoderSignature);
58 }
59 
60 ModuleExport void UnregisterUndefinedImage(void)
61 {
62 }
63 
64 /*
65  ImageMagick modules.
66 */
67 static struct
68 {
69  const char
70  *module;
71 
72  MagickBooleanType
73  registered;
74 
75  size_t
76  (*register_module)(void);
77 
78  void
79  (*unregister_module)(void);
80 } MagickModules[] =
81 {
82 #if !defined(MAGICKCORE_BUILD_MODULES)
83  { "AAI", MagickFalse, RegisterAAIImage, UnregisterAAIImage },
84  { "ART", MagickFalse, RegisterARTImage, UnregisterARTImage },
85  { "AVS", MagickFalse, RegisterAVSImage, UnregisterAVSImage },
86  { "BGR", MagickFalse, RegisterBGRImage, UnregisterBGRImage },
87  { "BMP", MagickFalse, RegisterBMPImage, UnregisterBMPImage },
88  { "BRAILLE", MagickFalse, RegisterBRAILLEImage, UnregisterBRAILLEImage },
89  { "CALS", MagickFalse, RegisterCALSImage, UnregisterCALSImage },
90  { "CAPTION", MagickFalse, RegisterCAPTIONImage, UnregisterCAPTIONImage },
91  { "CIN", MagickFalse, RegisterCINImage, UnregisterCINImage },
92  { "CIP", MagickFalse, RegisterCIPImage, UnregisterCIPImage },
93  { "CLIP", MagickFalse, RegisterCLIPImage, UnregisterCLIPImage },
94 #if defined(MAGICKCORE_WINGDI32_DELEGATE)
95  { "CLIPBOARD", MagickFalse, RegisterCLIPBOARDImage, UnregisterCLIPBOARDImage },
96 #endif
97  { "CMYK", MagickFalse, RegisterCMYKImage, UnregisterCMYKImage },
98  { "CUT", MagickFalse, RegisterCUTImage, UnregisterCUTImage },
99  { "DCM", MagickFalse, RegisterDCMImage, UnregisterDCMImage },
100  { "DDS", MagickFalse, RegisterDDSImage, UnregisterDDSImage },
101  { "DEBUG", MagickFalse, RegisterDEBUGImage, UnregisterDEBUGImage },
102  { "DIB", MagickFalse, RegisterDIBImage, UnregisterDIBImage },
103 #if defined(MAGICKCORE_DJVU_DELEGATE)
104  { "DJVU", MagickFalse, RegisterDJVUImage, UnregisterDJVUImage },
105 #endif
106  { "DNG", MagickFalse, RegisterDNGImage, UnregisterDNGImage },
107 #if defined(MAGICKCORE_DPS_DELEGATE)
108  { "DPS", MagickFalse, RegisterDPSImage, UnregisterDPSImage },
109 #endif
110  { "DPX", MagickFalse, RegisterDPXImage, UnregisterDPXImage },
111 #if defined(MAGICKCORE_WINGDI32_DELEGATE)
112  { "EMF", MagickFalse, RegisterEMFImage, UnregisterEMFImage },
113 #endif
114 #if defined(MAGICKCORE_TIFF_DELEGATE)
115  { "EPT", MagickFalse, RegisterEPTImage, UnregisterEPTImage },
116 #endif
117 #if defined(MAGICKCORE_OPENEXR_DELEGATE)
118  { "EXR", MagickFalse, RegisterEXRImage, UnregisterEXRImage },
119 #endif
120  { "FAX", MagickFalse, RegisterFAXImage, UnregisterFAXImage },
121  { "FITS", MagickFalse, RegisterFITSImage, UnregisterFITSImage },
122 #if defined(MAGICKCORE_FLIF_DELEGATE)
123  { "FLIF", MagickFalse, RegisterFLIFImage, UnregisterFLIFImage },
124 #endif
125 #if defined(MAGICKCORE_FPX_DELEGATE)
126  { "FPX", MagickFalse, RegisterFPXImage, UnregisterFPXImage },
127 #endif
128  { "GIF", MagickFalse, RegisterGIFImage, UnregisterGIFImage },
129  { "GRAY", MagickFalse, RegisterGRAYImage, UnregisterGRAYImage },
130  { "GRADIENT", MagickFalse, RegisterGRADIENTImage, UnregisterGRADIENTImage },
131  { "HALD", MagickFalse, RegisterHALDImage, UnregisterHALDImage },
132  { "HDR", MagickFalse, RegisterHDRImage, UnregisterHDRImage },
133 #if defined(MAGICKCORE_HEIC_DELEGATE)
134  { "HEIC", MagickFalse, RegisterHEICImage, UnregisterHEICImage },
135 #endif
136  { "HISTOGRAM", MagickFalse, RegisterHISTOGRAMImage, UnregisterHISTOGRAMImage },
137  { "HRZ", MagickFalse, RegisterHRZImage, UnregisterHRZImage },
138  { "HTML", MagickFalse, RegisterHTMLImage, UnregisterHTMLImage },
139  { "ICON", MagickFalse, RegisterICONImage, UnregisterICONImage },
140  { "INFO", MagickFalse, RegisterINFOImage, UnregisterINFOImage },
141  { "INLINE", MagickFalse, RegisterINLINEImage, UnregisterINLINEImage },
142  { "IPL", MagickFalse, RegisterIPLImage, UnregisterIPLImage },
143 #if defined(MAGICKCORE_JBIG_DELEGATE)
144  { "JBIG", MagickFalse, RegisterJBIGImage, UnregisterJBIGImage },
145 #endif
146  { "JNX", MagickFalse, RegisterJNXImage, UnregisterJNXImage },
147 #if defined(MAGICKCORE_JPEG_DELEGATE)
148  { "JPEG", MagickFalse, RegisterJPEGImage, UnregisterJPEGImage },
149 #endif
150 #if defined(MAGICKCORE_LIBOPENJP2_DELEGATE)
151  { "JP2", MagickFalse, RegisterJP2Image, UnregisterJP2Image },
152 #endif
153  { "JSON", MagickFalse, RegisterJSONImage, UnregisterJSONImage },
154  { "LABEL", MagickFalse, RegisterLABELImage, UnregisterLABELImage },
155  { "MAC", MagickFalse, RegisterMACImage, UnregisterMACImage },
156  { "MAGICK", MagickFalse, RegisterMAGICKImage, UnregisterMAGICKImage },
157  { "MAP", MagickFalse, RegisterMAPImage, UnregisterMAPImage },
158  { "MAT", MagickFalse, RegisterMATImage, UnregisterMATImage },
159  { "MATTE", MagickFalse, RegisterMATTEImage, UnregisterMATTEImage },
160  { "MASK", MagickFalse, RegisterMASKImage, UnregisterMASKImage },
161  { "META", MagickFalse, RegisterMETAImage, UnregisterMETAImage },
162  { "MIFF", MagickFalse, RegisterMIFFImage, UnregisterMIFFImage },
163  { "MONO", MagickFalse, RegisterMONOImage, UnregisterMONOImage },
164  { "MPC", MagickFalse, RegisterMPCImage, UnregisterMPCImage },
165  { "MPR", MagickFalse, RegisterMPRImage, UnregisterMPRImage },
166  { "MSL", MagickFalse, RegisterMSLImage, UnregisterMSLImage },
167  { "MTV", MagickFalse, RegisterMTVImage, UnregisterMTVImage },
168  { "MVG", MagickFalse, RegisterMVGImage, UnregisterMVGImage },
169  { "NULL", MagickFalse, RegisterNULLImage, UnregisterNULLImage },
170  { "OTB", MagickFalse, RegisterOTBImage, UnregisterOTBImage },
171  { "PALM", MagickFalse, RegisterPALMImage, UnregisterPALMImage },
172  { "PANGO", MagickFalse, RegisterPANGOImage, UnregisterPANGOImage },
173  { "PATTERN", MagickFalse, RegisterPATTERNImage, UnregisterPATTERNImage },
174  { "PCD", MagickFalse, RegisterPCDImage, UnregisterPCDImage },
175  { "PCL", MagickFalse, RegisterPCLImage, UnregisterPCLImage },
176  { "PCX", MagickFalse, RegisterPCXImage, UnregisterPCXImage },
177  { "PDB", MagickFalse, RegisterPDBImage, UnregisterPDBImage },
178  { "PDF", MagickFalse, RegisterPDFImage, UnregisterPDFImage },
179  { "PES", MagickFalse, RegisterPESImage, UnregisterPESImage },
180  { "PGX", MagickFalse, RegisterPGXImage, UnregisterPGXImage },
181  { "PICT", MagickFalse, RegisterPICTImage, UnregisterPICTImage },
182  { "PIX", MagickFalse, RegisterPIXImage, UnregisterPIXImage },
183  { "PLASMA", MagickFalse, RegisterPLASMAImage, UnregisterPLASMAImage },
184 #if defined(MAGICKCORE_PNG_DELEGATE)
185  { "PNG", MagickFalse, RegisterPNGImage, UnregisterPNGImage },
186 #endif
187  { "PNM", MagickFalse, RegisterPNMImage, UnregisterPNMImage },
188  { "PS", MagickFalse, RegisterPSImage, UnregisterPSImage },
189  { "PS2", MagickFalse, RegisterPS2Image, UnregisterPS2Image },
190  { "PS3", MagickFalse, RegisterPS3Image, UnregisterPS3Image },
191  { "PSD", MagickFalse, RegisterPSDImage, UnregisterPSDImage },
192  { "PWP", MagickFalse, RegisterPWPImage, UnregisterPWPImage },
193  { "RAW", MagickFalse, RegisterRAWImage, UnregisterRAWImage },
194  { "RGB", MagickFalse, RegisterRGBImage, UnregisterRGBImage },
195  { "RGF", MagickFalse, RegisterRGFImage, UnregisterRGFImage },
196  { "RLA", MagickFalse, RegisterRLAImage, UnregisterRLAImage },
197  { "RLE", MagickFalse, RegisterRLEImage, UnregisterRLEImage },
198  { "SCR", MagickFalse, RegisterSCRImage, UnregisterSCRImage },
199  { "SCREENSHOT", MagickFalse, RegisterSCREENSHOTImage, UnregisterSCREENSHOTImage },
200  { "SCT", MagickFalse, RegisterSCTImage, UnregisterSCTImage },
201  { "SFW", MagickFalse, RegisterSFWImage, UnregisterSFWImage },
202  { "SGI", MagickFalse, RegisterSGIImage, UnregisterSGIImage },
203  { "SIXEL", MagickFalse, RegisterSIXELImage, UnregisterSIXELImage },
204  { "STEGANO", MagickFalse, RegisterSTEGANOImage, UnregisterSTEGANOImage },
205  { "SUN", MagickFalse, RegisterSUNImage, UnregisterSUNImage },
206  { "SVG", MagickFalse, RegisterSVGImage, UnregisterSVGImage },
207  { "TGA", MagickFalse, RegisterTGAImage, UnregisterTGAImage },
208  { "THUMBNAIL", MagickFalse, RegisterTHUMBNAILImage, UnregisterTHUMBNAILImage },
209 #if defined(MAGICKCORE_TIFF_DELEGATE)
210  { "TIFF", MagickFalse, RegisterTIFFImage, UnregisterTIFFImage },
211 #endif
212  { "TILE", MagickFalse, RegisterTILEImage, UnregisterTILEImage },
213  { "TIM", MagickFalse, RegisterTIMImage, UnregisterTIMImage },
214  { "TTF", MagickFalse, RegisterTTFImage, UnregisterTTFImage },
215  { "TXT", MagickFalse, RegisterTXTImage, UnregisterTXTImage },
216  { "UIL", MagickFalse, RegisterUILImage, UnregisterUILImage },
217  { "URL", MagickFalse, RegisterURLImage, UnregisterURLImage },
218  { "UYVY", MagickFalse, RegisterUYVYImage, UnregisterUYVYImage },
219  { "VICAR", MagickFalse, RegisterVICARImage, UnregisterVICARImage },
220  { "VID", MagickFalse, RegisterVIDImage, UnregisterVIDImage },
221  { "VIDEO", MagickFalse, RegisterVIDEOImage, UnregisterVIDEOImage },
222  { "VIFF", MagickFalse, RegisterVIFFImage, UnregisterVIFFImage },
223  { "VIPS", MagickFalse, RegisterVIPSImage, UnregisterVIPSImage },
224  { "WBMP", MagickFalse, RegisterWBMPImage, UnregisterWBMPImage },
225 #if defined(MAGICKCORE_WEBP_DELEGATE)
226  { "WEBP", MagickFalse, RegisterWEBPImage, UnregisterWEBPImage },
227 #endif
228 #if defined(MAGICKCORE_WMF_DELEGATE) || defined(MAGICKCORE_WMFLITE_DELEGATE)
229  { "WMF", MagickFalse, RegisterWMFImage, UnregisterWMFImage },
230 #endif
231  { "WPG", MagickFalse, RegisterWPGImage, UnregisterWPGImage },
232 #if defined(MAGICKCORE_X11_DELEGATE)
233  { "X", MagickFalse, RegisterXImage, UnregisterXImage },
234 #endif
235  { "XBM", MagickFalse, RegisterXBMImage, UnregisterXBMImage },
236  { "XC", MagickFalse, RegisterXCImage, UnregisterXCImage },
237  { "XCF", MagickFalse, RegisterXCFImage, UnregisterXCFImage },
238  { "XPM", MagickFalse, RegisterXPMImage, UnregisterXPMImage },
239  { "XPS", MagickFalse, RegisterXPSImage, UnregisterXPSImage },
240 #if defined(MAGICKCORE_X11_DELEGATE)
241  { "XWD", MagickFalse, RegisterXWDImage, UnregisterXWDImage },
242 #endif
243  { "YCBCR", MagickFalse, RegisterYCBCRImage, UnregisterYCBCRImage },
244  { "YUV", MagickFalse, RegisterYUVImage, UnregisterYUVImage },
245 #endif
246  { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage }
247 };
248 
249 /*
250 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
251 % %
252 % %
253 % %
254 % I n v o k e S t a t i c I m a g e F i l t e r %
255 % %
256 % %
257 % %
258 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
259 %
260 % InvokeStaticImageFilter() invokes a static image filter.
261 %
262 % The format of the InvokeStaticImageFilter method is:
263 %
264 % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image,
265 % const int argc,const char **argv)
266 %
267 % A description of each parameter follows:
268 %
269 % o tag: the module tag.
270 %
271 % o image: the image.
272 %
273 % o argc: the number of elements in the argument vector.
274 %
275 % o argv: A text array containing the command line arguments.
276 %
277 % o argv: A text array containing the command line arguments.
278 %
279 % o exception: return any errors or warnings in this structure.
280 %
281 */
282 #if defined(MAGICKCORE_MODULES_SUPPORT)
283 MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag,
284  Image **image,const int argc,const char **argv,ExceptionInfo *exception)
285 {
286  PolicyRights
287  rights;
288 
289  assert(image != (Image **) NULL);
290  assert((*image)->signature == MagickCoreSignature);
291  if (IsEventLogging() != MagickFalse)
292  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
293  rights=ReadPolicyRights;
294  if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse)
295  ThrowPolicyException(tag,MagickFalse);
296 #if defined(MAGICKCORE_MODULES_SUPPORT)
297  (void) tag;
298  (void) argc;
299  (void) argv;
300  (void) exception;
301 #else
302  {
303  extern size_t
304  analyzeImage(Image **,const int,char **,ExceptionInfo *);
305 
306  ImageFilterHandler
307  *image_filter;
308 
309  image_filter=(ImageFilterHandler *) NULL;
310  if (LocaleCompare("analyze",tag) == 0)
311  image_filter=(ImageFilterHandler *) analyzeImage;
312  if (image_filter == (ImageFilterHandler *) NULL)
313  (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
314  "UnableToLoadModule","`%s'",tag);
315  else
316  {
317  size_t
318  signature;
319 
320  if ((*image)->debug != MagickFalse)
321  (void) LogMagickEvent(TransformEvent,GetMagickModule(),
322  "Invoking \"%s\" static image filter",tag);
323  signature=image_filter(image,argc,argv,exception);
324  if ((*image)->debug != MagickFalse)
325  (void) LogMagickEvent(TransformEvent,GetMagickModule(),
326  "\"%s\" completes",tag);
327  if (signature != MagickImageFilterSignature)
328  {
329  (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
330  "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
331  (unsigned long) signature,(unsigned long)
332  MagickImageFilterSignature);
333  return(MagickFalse);
334  }
335  }
336  }
337 #endif
338  return(MagickTrue);
339 }
340 #endif
341 
342 /*
343 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
344 % %
345 % %
346 % %
347 % R e g i s t e r S t a t i c M o d u l e %
348 % %
349 % %
350 % %
351 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352 %
353 % RegisterStaticModule() statically registers a module.
354 %
355 % The format of the RegisterStaticModule method is:
356 %
357 % MagickBooleanType RegisterStaticModule(const char module,
358 % ExceptionInfo *exception)
359 %
360 % A description of each parameter follows:
361 %
362 % o module: the want to register.
363 %
364 % o exception: return any errors or warnings in this structure.
365 %
366 */
367 MagickExport MagickBooleanType RegisterStaticModule(const char *module,
368  ExceptionInfo *exception)
369 {
370  char
371  module_name[MagickPathExtent];
372 
373  PolicyRights
374  rights;
375 
376  const CoderInfo
377  *p;
378 
379  size_t
380  extent;
381 
382  ssize_t
383  i;
384 
385  /*
386  Assign module name from alias.
387  */
388  assert(module != (const char *) NULL);
389  (void) CopyMagickString(module_name,module,MagickPathExtent);
390  p=GetCoderInfo(module,exception);
391  if (p != (CoderInfo *) NULL)
392  (void) CopyMagickString(module_name,p->name,MagickPathExtent);
393  rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
394  if (IsRightsAuthorized(ModulePolicyDomain,rights,module_name) == MagickFalse)
395  ThrowPolicyException(module_name,MagickFalse);
396  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
397  for (i=0; i < (ssize_t) extent; i++)
398  if (LocaleCompare(MagickModules[i].module,module_name) == 0)
399  {
400  if (MagickModules[i].registered == MagickFalse)
401  {
402  (void) (MagickModules[i].register_module)();
403  MagickModules[i].registered=MagickTrue;
404  }
405  return(MagickTrue);
406  }
407  return(MagickFalse);
408 }
409 
410 /*
411 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
412 % %
413 % %
414 % %
415 % R e g i s t e r S t a t i c M o d u l e s %
416 % %
417 % %
418 % %
419 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
420 %
421 % RegisterStaticModules() statically registers all the available module
422 % handlers.
423 %
424 % The format of the RegisterStaticModules method is:
425 %
426 % (void) RegisterStaticModules(void)
427 %
428 */
429 MagickExport void RegisterStaticModules(void)
430 {
431  PolicyRights
432  rights;
433 
434  size_t
435  extent;
436 
437  ssize_t
438  i;
439 
440  rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
441  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
442  for (i=0; i < (ssize_t) extent; i++)
443  {
444  if (MagickModules[i].registered == MagickFalse)
445  {
446  if (IsRightsAuthorized(ModulePolicyDomain,rights,MagickModules[i].module) == MagickFalse)
447  continue;
448  (void) (MagickModules[i].register_module)();
449  MagickModules[i].registered=MagickTrue;
450  }
451  }
452 }
453 
454 /*
455 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
456 % %
457 % %
458 % %
459 % U n r e g i s t e r S t a t i c M o d u l e %
460 % %
461 % %
462 % %
463 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
464 %
465 % UnregisterStaticModule() statically unregisters the named module.
466 %
467 % The format of the UnregisterStaticModule method is:
468 %
469 % MagickBooleanType UnregisterStaticModule(const char *module)
470 %
471 % A description of each parameter follows:
472 %
473 % o module: the module we want to unregister.
474 %
475 */
476 MagickExport MagickBooleanType UnregisterStaticModule(const char *module)
477 {
478  size_t
479  extent;
480 
481  ssize_t
482  i;
483 
484  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
485  for (i=0; i < (ssize_t) extent; i++)
486  if (LocaleCompare(MagickModules[i].module,module) == 0)
487  {
488  if (MagickModules[i].registered != MagickFalse)
489  {
490  (MagickModules[i].unregister_module)();
491  MagickModules[i].registered=MagickFalse;
492  }
493  return(MagickTrue);
494  }
495  return(MagickFalse);
496 }
497 
498 /*
499 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
500 % %
501 % %
502 % %
503 % U n r e g i s t e r S t a t i c M o d u l e s %
504 % %
505 % %
506 % %
507 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
508 %
509 % UnregisterStaticModules() statically unregisters all the available module
510 % handlers.
511 %
512 % The format of the UnregisterStaticModules method is:
513 %
514 % UnregisterStaticModules(void)
515 %
516 */
517 MagickExport void UnregisterStaticModules(void)
518 {
519  size_t
520  extent;
521 
522  ssize_t
523  i;
524 
525  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
526  for (i=0; i < (ssize_t) extent; i++)
527  {
528  if (MagickModules[i].registered != MagickFalse)
529  {
530  (MagickModules[i].unregister_module)();
531  MagickModules[i].registered=MagickFalse;
532  }
533  }
534 }
Definition: image.h:133