MagickCore 6.9.13-51
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
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*/
55ModuleExport size_t RegisterUndefinedImage(void)
56{
57 return(MagickImageCoderSignature);
58}
59
60ModuleExport void UnregisterUndefinedImage(void)
61{
62}
63
64/*
65 ImageMagick modules.
66*/
67static 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)
283MagickExport 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*/
367MagickExport 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*/
429MagickExport 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*/
476MagickExport 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*/
517MagickExport 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}