MagickCore 6.9.13
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/script/license.php %
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 {
296 errno=EPERM;
297 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
298 "NotAuthorized","`%s'",tag);
299 return(MagickFalse);
300 }
301#if defined(MAGICKCORE_MODULES_SUPPORT)
302 (void) tag;
303 (void) argc;
304 (void) argv;
305 (void) exception;
306#else
307 {
308 extern size_t
309 analyzeImage(Image **,const int,char **,ExceptionInfo *);
310
311 ImageFilterHandler
312 *image_filter;
313
314 image_filter=(ImageFilterHandler *) NULL;
315 if (LocaleCompare("analyze",tag) == 0)
316 image_filter=(ImageFilterHandler *) analyzeImage;
317 if (image_filter == (ImageFilterHandler *) NULL)
318 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
319 "UnableToLoadModule","`%s'",tag);
320 else
321 {
322 size_t
323 signature;
324
325 if ((*image)->debug != MagickFalse)
326 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
327 "Invoking \"%s\" static image filter",tag);
328 signature=image_filter(image,argc,argv,exception);
329 if ((*image)->debug != MagickFalse)
330 (void) LogMagickEvent(TransformEvent,GetMagickModule(),
331 "\"%s\" completes",tag);
332 if (signature != MagickImageFilterSignature)
333 {
334 (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
335 "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
336 (unsigned long) signature,(unsigned long)
337 MagickImageFilterSignature);
338 return(MagickFalse);
339 }
340 }
341 }
342#endif
343 return(MagickTrue);
344}
345#endif
346
347/*
348%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
349% %
350% %
351% %
352% R e g i s t e r S t a t i c M o d u l e %
353% %
354% %
355% %
356%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
357%
358% RegisterStaticModule() statically registers a module.
359%
360% The format of the RegisterStaticModule method is:
361%
362% MagickBooleanType RegisterStaticModule(const char module,
363% ExceptionInfo *exception)
364%
365% A description of each parameter follows:
366%
367% o module: the want to register.
368%
369% o exception: return any errors or warnings in this structure.
370%
371*/
372MagickExport MagickBooleanType RegisterStaticModule(const char *module,
373 ExceptionInfo *exception)
374{
375 char
376 module_name[MagickPathExtent];
377
378 PolicyRights
379 rights;
380
381 const CoderInfo
382 *p;
383
384 size_t
385 extent;
386
387 ssize_t
388 i;
389
390 /*
391 Assign module name from alias.
392 */
393 assert(module != (const char *) NULL);
394 (void) CopyMagickString(module_name,module,MagickPathExtent);
395 p=GetCoderInfo(module,exception);
396 if (p != (CoderInfo *) NULL)
397 (void) CopyMagickString(module_name,p->name,MagickPathExtent);
398 rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
399 if (IsRightsAuthorized(ModulePolicyDomain,rights,module_name) == MagickFalse)
400 {
401 errno=EPERM;
402 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
403 "NotAuthorized","`%s'",module);
404 return(MagickFalse);
405 }
406 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
407 for (i=0; i < (ssize_t) extent; i++)
408 if (LocaleCompare(MagickModules[i].module,module_name) == 0)
409 {
410 if (MagickModules[i].registered == MagickFalse)
411 {
412 (void) (MagickModules[i].register_module)();
413 MagickModules[i].registered=MagickTrue;
414 }
415 return(MagickTrue);
416 }
417 return(MagickFalse);
418}
419
420/*
421%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
422% %
423% %
424% %
425% R e g i s t e r S t a t i c M o d u l e s %
426% %
427% %
428% %
429%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
430%
431% RegisterStaticModules() statically registers all the available module
432% handlers.
433%
434% The format of the RegisterStaticModules method is:
435%
436% (void) RegisterStaticModules(void)
437%
438*/
439MagickExport void RegisterStaticModules(void)
440{
441 PolicyRights
442 rights;
443
444 size_t
445 extent;
446
447 ssize_t
448 i;
449
450 rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
451 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
452 for (i=0; i < (ssize_t) extent; i++)
453 {
454 if (MagickModules[i].registered == MagickFalse)
455 {
456 if (IsRightsAuthorized(ModulePolicyDomain,rights,MagickModules[i].module) == MagickFalse)
457 continue;
458 (void) (MagickModules[i].register_module)();
459 MagickModules[i].registered=MagickTrue;
460 }
461 }
462}
463
464/*
465%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
466% %
467% %
468% %
469% U n r e g i s t e r S t a t i c M o d u l e %
470% %
471% %
472% %
473%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
474%
475% UnregisterStaticModule() statically unregisters the named module.
476%
477% The format of the UnregisterStaticModule method is:
478%
479% MagickBooleanType UnregisterStaticModule(const char *module)
480%
481% A description of each parameter follows:
482%
483% o module: the module we want to unregister.
484%
485*/
486MagickExport MagickBooleanType UnregisterStaticModule(const char *module)
487{
488 size_t
489 extent;
490
491 ssize_t
492 i;
493
494 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
495 for (i=0; i < (ssize_t) extent; i++)
496 if (LocaleCompare(MagickModules[i].module,module) == 0)
497 {
498 if (MagickModules[i].registered != MagickFalse)
499 {
500 (MagickModules[i].unregister_module)();
501 MagickModules[i].registered=MagickFalse;
502 }
503 return(MagickTrue);
504 }
505 return(MagickFalse);
506}
507
508/*
509%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
510% %
511% %
512% %
513% U n r e g i s t e r S t a t i c M o d u l e s %
514% %
515% %
516% %
517%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
518%
519% UnregisterStaticModules() statically unregisters all the available module
520% handlers.
521%
522% The format of the UnregisterStaticModules method is:
523%
524% UnregisterStaticModules(void)
525%
526*/
527MagickExport void UnregisterStaticModules(void)
528{
529 size_t
530 extent;
531
532 ssize_t
533 i;
534
535 extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
536 for (i=0; i < (ssize_t) extent; i++)
537 {
538 if (MagickModules[i].registered != MagickFalse)
539 {
540 (MagickModules[i].unregister_module)();
541 MagickModules[i].registered=MagickFalse;
542 }
543 }
544}