Coverage Report

Created: 2026-10-28 07:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/graphicsmagick/magick/static.c
Line
Count
Source
1
/*
2
% Copyright (C) 2003-2024 GraphicsMagick Group
3
% Copyright (C) 2002 ImageMagick Studio
4
% SPDX-License-Identifier: MIT
5
%
6
% This program is covered by multiple licenses, which are described in
7
% Copyright.txt. You should have received a copy of Copyright.txt with this
8
% package; otherwise see http://www.graphicsmagick.org/www/Copyright.html.
9
%
10
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11
%                                                                             %
12
%                                                                             %
13
%                                                                             %
14
%                  SSSSS  TTTTT   AAA   TTTTT  IIIII   CCCC                   %
15
%                  SS       T    A   A    T      I    C                       %
16
%                   SSS     T    AAAAA    T      I    C                       %
17
%                     SS    T    A   A    T      I    C                       %
18
%                  SSSSS    T    A   A    T    IIIII   CCCC                   %
19
%                                                                             %
20
%                                                                             %
21
%                        GraphicsMagick Static Methods                        %
22
%                                                                             %
23
%                                                                             %
24
%                              Software Design                                %
25
%                                John Cristy                                  %
26
%                                 March 2000                                  %
27
%                                                                             %
28
%                                                                             %
29
%                                                                             %
30
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31
%
32
%
33
%
34
*/
35

36
/*
37
  Include declarations.
38
*/
39
#include "magick/studio.h"
40
#include "magick/log.h"
41
#include "magick/module.h"
42
#include "magick/static.h"
43
#include "magick/utility.h"
44

45
#if !defined(SupportMagickModules)
46
47
#include "magick/module_aliases.h"
48
49
/*
50
  This list must be ordered by 'name' in an ascending order based on
51
  strcmp(). This list will always be initialized data due to function
52
  address resolution.
53
*/
54
static const struct
55
{
56
  const char *name;
57
  void (*register_fn)(void);
58
  void (*unregister_fn)(void);
59
  const unsigned char name_length;
60
61
} StaticModules[] =
62
{
63
#define STATICM(name,register_fn,unregister_fn) {name,register_fn,unregister_fn,sizeof(name)-1}
64
  STATICM("AAI",RegisterAAIImage,UnregisterAAIImage),
65
  STATICM("ART",RegisterARTImage,UnregisterARTImage),
66
  STATICM("AVS",RegisterAVSImage,UnregisterAVSImage),
67
  STATICM("BMP",RegisterBMPImage,UnregisterBMPImage),
68
  STATICM("BRAILLE",RegisterBRAILLEImage,UnregisterBRAILLEImage),
69
  STATICM("CALS",RegisterCALSImage,UnregisterCALSImage),
70
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
71
  STATICM("CAPTION",RegisterCAPTIONImage,UnregisterCAPTIONImage),
72
#endif
73
  STATICM("CINEON",RegisterCINEONImage,UnregisterCINEONImage),
74
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
75
#  if defined(HasWINGDI32)
76
  STATICM("CLIPBOARD",RegisterCLIPBOARDImage,UnregisterCLIPBOARDImage),
77
#  endif
78
  STATICM("CMYK",RegisterCMYKImage,UnregisterCMYKImage),
79
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
80
  STATICM("CUT",RegisterCUTImage,UnregisterCUTImage),
81
  STATICM("DCM",RegisterDCMImage,UnregisterDCMImage),
82
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
83
  STATICM("DCRAW",RegisterDCRAWImage,UnregisterDCRAWImage),
84
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
85
  STATICM("DIB",RegisterDIBImage,UnregisterDIBImage),
86
  STATICM("DPX",RegisterDPXImage,UnregisterDPXImage),
87
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
88
#  if defined(HasWINGDI32)
89
  STATICM("EMF",RegisterEMFImage,UnregisterEMFImage),
90
#  endif
91
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
92
#if defined(HasTIFF)
93
  STATICM("EPT",RegisterEPTImage,UnregisterEPTImage),
94
#endif
95
  STATICM("FAX",RegisterFAXImage,UnregisterFAXImage),
96
  STATICM("FITS",RegisterFITSImage,UnregisterFITSImage),
97
#if defined(HasFPX)
98
  STATICM("FPX",RegisterFPXImage,UnregisterFPXImage),
99
#endif
100
  STATICM("GIF",RegisterGIFImage,UnregisterGIFImage),
101
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
102
  STATICM("GRAY",RegisterGRAYImage,UnregisterGRAYImage),
103
  STATICM("GRADIENT",RegisterGRADIENTImage,UnregisterGRADIENTImage),
104
  STATICM("HISTOGRAM",RegisterHISTOGRAMImage,UnregisterHISTOGRAMImage),
105
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
106
  STATICM("HRZ",RegisterHRZImage,UnregisterHRZImage),
107
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
108
  STATICM("HTML",RegisterHTMLImage,UnregisterHTMLImage),
109
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
110
#if defined(HasHEIF)
111
  STATICM("HEIF",RegisterHEIFImage,UnregisterHEIFImage),
112
#endif
113
  STATICM("ICON",RegisterICONImage,UnregisterICONImage),
114
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
115
  STATICM("IDENTITY",RegisterIDENTITYImage,UnregisterIDENTITYImage),
116
  STATICM("INFO",RegisterINFOImage,UnregisterINFOImage),
117
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
118
#if defined(HasJBIG)
119
  STATICM("JBIG",RegisterJBIGImage,UnregisterJBIGImage),
120
#endif
121
#if defined(HasJPEG)
122
  STATICM("JNX",RegisterJNXImage,UnregisterJNXImage),
123
#endif
124
#if defined(HasJPEG)
125
  STATICM("JPEG",RegisterJPEGImage,UnregisterJPEGImage),
126
#endif
127
#if defined(HasJP2)
128
  STATICM("JP2",RegisterJP2Image,UnregisterJP2Image),
129
#endif
130
#if defined(HasJXL)
131
  STATICM("JXL",RegisterJXLImage,UnregisterJXLImage),
132
#endif
133
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
134
  STATICM("LABEL",RegisterLABELImage,UnregisterLABELImage),
135
  STATICM("LOCALE",RegisterLOCALEImage,UnregisterLOCALEImage),
136
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
137
  STATICM("LOGO",RegisterLOGOImage,UnregisterLOGOImage),
138
  STATICM("MAC",RegisterMACImage,UnregisterMACImage),
139
  STATICM("MAP",RegisterMAPImage,UnregisterMAPImage),
140
  STATICM("MAT",RegisterMATImage,UnregisterMATImage),
141
  STATICM("MATTE",RegisterMATTEImage,UnregisterMATTEImage),
142
  STATICM("META",RegisterMETAImage,UnregisterMETAImage),
143
  STATICM("MIFF",RegisterMIFFImage,UnregisterMIFFImage),
144
  STATICM("MONO",RegisterMONOImage,UnregisterMONOImage),
145
  STATICM("MPC",RegisterMPCImage,UnregisterMPCImage),
146
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
147
  STATICM("MPEG",RegisterMPEGImage,UnregisterMPEGImage),
148
  STATICM("MPR",RegisterMPRImage,UnregisterMPRImage),
149
  STATICM("MSL",RegisterMSLImage,UnregisterMSLImage),
150
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
151
  STATICM("MTV",RegisterMTVImage,UnregisterMTVImage),
152
  STATICM("MVG",RegisterMVGImage,UnregisterMVGImage),
153
  STATICM("NULL",RegisterNULLImage,UnregisterNULLImage),
154
#if defined(HasPNG) && (defined(HasUNZIP) || defined(HasLIBZIP))
155
  STATICM("ORA",RegisterORAImage,UnregisterORAImage),
156
#endif
157
  STATICM("OTB",RegisterOTBImage,UnregisterOTBImage),
158
  STATICM("PALM",RegisterPALMImage,UnregisterPALMImage),
159
  STATICM("PCD",RegisterPCDImage,UnregisterPCDImage),
160
  STATICM("PCL",RegisterPCLImage,UnregisterPCLImage),
161
  STATICM("PCX",RegisterPCXImage,UnregisterPCXImage),
162
  STATICM("PDB",RegisterPDBImage,UnregisterPDBImage),
163
  STATICM("PDF",RegisterPDFImage,UnregisterPDFImage),
164
  STATICM("PICT",RegisterPICTImage,UnregisterPICTImage),
165
  STATICM("PIX",RegisterPIXImage,UnregisterPIXImage),
166
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
167
  STATICM("PLASMA",RegisterPLASMAImage,UnregisterPLASMAImage),
168
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
169
#if defined(HasPNG)
170
  STATICM("PNG",RegisterPNGImage,UnregisterPNGImage),
171
#endif
172
  STATICM("PNM",RegisterPNMImage,UnregisterPNMImage),
173
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
174
  STATICM("PREVIEW",RegisterPREVIEWImage,UnregisterPREVIEWImage),
175
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
176
  STATICM("PS",RegisterPSImage,UnregisterPSImage),
177
  STATICM("PS2",RegisterPS2Image,UnregisterPS2Image),
178
  STATICM("PS3",RegisterPS3Image,UnregisterPS3Image),
179
#if defined(EnableBrokenCoders) && EnableBrokenCoders
180
  STATICM("PSD",RegisterPSDImage,UnregisterPSDImage),
181
#endif /* defined(EnableBrokenCoders) && EnableBrokenCoders */
182
  STATICM("PWP",RegisterPWPImage,UnregisterPWPImage),
183
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
184
  STATICM("RGB",RegisterRGBImage,UnregisterRGBImage),
185
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
186
  STATICM("RLA",RegisterRLAImage,UnregisterRLAImage),
187
  STATICM("RLE",RegisterRLEImage,UnregisterRLEImage),
188
  STATICM("SCT",RegisterSCTImage,UnregisterSCTImage),
189
  STATICM("SFW",RegisterSFWImage,UnregisterSFWImage),
190
  STATICM("SGI",RegisterSGIImage,UnregisterSGIImage),
191
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
192
  STATICM("STEGANO",RegisterSTEGANOImage,UnregisterSTEGANOImage),
193
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
194
  STATICM("SUN",RegisterSUNImage,UnregisterSUNImage),
195
  STATICM("SVG",RegisterSVGImage,UnregisterSVGImage),
196
  STATICM("TGA",RegisterTGAImage,UnregisterTGAImage),
197
#if defined(HasTIFF)
198
  STATICM("TIFF",RegisterTIFFImage,UnregisterTIFFImage),
199
#endif
200
#if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION)
201
  STATICM("TILE",RegisterTILEImage,UnregisterTILEImage),
202
#endif /* if !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) */
203
  STATICM("TIM",RegisterTIMImage,UnregisterTIMImage),
204
  STATICM("TOPOL",RegisterTOPOLImage,UnregisterTOPOLImage),
205
  STATICM("TTF",RegisterTTFImage,UnregisterTTFImage),
206
  STATICM("TXT",RegisterTXTImage,UnregisterTXTImage),
207
  STATICM("UIL",RegisterUILImage,UnregisterUILImage),
208
  STATICM("URL",RegisterURLImage,UnregisterURLImage),
209
  STATICM("UYVY",RegisterUYVYImage,UnregisterUYVYImage),
210
  STATICM("VICAR",RegisterVICARImage,UnregisterVICARImage),
211
  STATICM("VID",RegisterVIDImage,UnregisterVIDImage),
212
  STATICM("VIFF",RegisterVIFFImage,UnregisterVIFFImage),
213
  STATICM("WBMP",RegisterWBMPImage,UnregisterWBMPImage),
214
#if defined(HasWEBP)
215
  STATICM("WEBP",RegisterWEBPImage,UnregisterWEBPImage),
216
#endif
217
  STATICM("WMF",RegisterWMFImage,UnregisterWMFImage),
218
  STATICM("WPG",RegisterWPGImage,UnregisterWPGImage),
219
#if defined(HasX11)
220
  STATICM("X",RegisterXImage,UnregisterXImage),
221
#endif /* defined(HasX11) */
222
  STATICM("XBM",RegisterXBMImage,UnregisterXBMImage),
223
  STATICM("XC",RegisterXCImage,UnregisterXCImage),
224
  STATICM("XCF",RegisterXCFImage,UnregisterXCFImage),
225
  STATICM("XPM",RegisterXPMImage,UnregisterXPMImage),
226
#if defined(_VISUALC_)
227
#if defined(EnableXTRNCoder)
228
  STATICM("XTRN",RegisterXTRNImage,UnregisterXTRNImage),
229
#endif /* if defined(EnableXTRNCoder) */
230
#endif /* defined(_VISUALC_) */
231
#if defined(HasX11)
232
  STATICM("XWD",RegisterXWDImage,UnregisterXWDImage),
233
#endif /* defined(HasX11) */
234
  STATICM("YUV",RegisterYUVImage,UnregisterYUVImage)
235
};
236
237
static unsigned char StaticModulesLoaded[ArraySize(StaticModules)] = { MagickFalse };
238
239

240
/*
241
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242
%                                                                             %
243
%                                                                             %
244
%                                                                             %
245
+   D e s t r o y M a g i c k M o d u l e s                                   %
246
%                                                                             %
247
%                                                                             %
248
%                                                                             %
249
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
250
%
251
%  DestroyMagickResources() destroys the resource environment.
252
%
253
%  The format of the DestroyMagickResources() method is:
254
%
255
%      DestroyMagickResources(void)
256
%
257
%
258
*/
259
void
260
DestroyMagickModules(void)
261
0
{
262
0
  unsigned int index;
263
264
0
  for (index=0; index < ArraySize(StaticModules);index++)
265
0
    {
266
0
      if (StaticModulesLoaded[index] != MagickFalse)
267
0
        {
268
0
          (StaticModules[index].unregister_fn)();
269
0
          StaticModulesLoaded[index] = MagickFalse;
270
0
        }
271
0
    }
272
0
}
273

274
/*
275
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276
%                                                                             %
277
%                                                                             %
278
%                                                                             %
279
+   I n i t i a l i z e M a g i c k M o d u l e s                             %
280
%                                                                             %
281
%                                                                             %
282
%                                                                             %
283
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
284
%
285
%  InitializeMagickModules() initializes the module loader.
286
%
287
%  The format of the InitializeMagickModules() method is:
288
%
289
%      InitializeMagickModules(void)
290
%
291
%
292
*/
293
void
294
InitializeMagickModules(void)
295
254
{
296
254
}
297

298
/*
299
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
300
%                                                                             %
301
%                                                                             %
302
%                                                                             %
303
%   O p e n M o d u l e                                                       %
304
%                                                                             %
305
%                                                                             %
306
%                                                                             %
307
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
308
%
309
%  OpenModule() loads a module, and invokes its registration method.  It
310
%  returns MagickPass on success, and MagickFail if there is an error.
311
%
312
%  The format of the OpenModule method is:
313
%
314
%      MagickPassFail OpenModule(const char *module,ExceptionInfo *exception)
315
%
316
%  A description of each parameter follows:
317
%
318
%    o status: Method OpenModule returns MagickPass if the specified module is
319
%      loaded, otherwise MagickFail.
320
%
321
%    o module: a character string that indicates the module to load.
322
%
323
%    o exception: Return any errors or warnings in this structure.
324
%
325
%
326
*/
327
MagickPassFail
328
OpenModule(const char *module,ExceptionInfo *exception)
329
25.6k
{
330
25.6k
  char
331
25.6k
    module_name[MaxTextExtent];
332
333
25.6k
  size_t
334
25.6k
    name_length;
335
336
25.6k
  unsigned int
337
25.6k
    index;
338
339
25.6k
  MagickPassFail
340
25.6k
    status = MagickFail;
341
342
25.6k
  (void) exception;
343
  /*
344
    Assign module name from alias.
345
  */
346
25.6k
  assert(module != (const char *) NULL);
347
25.6k
  name_length=strlcpy(module_name,module,MaxTextExtent);
348
25.6k
  LocaleUpper(module_name);
349
25.6k
  (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
350
25.6k
                        "Magick \"%s\"", module_name);
351
2.78M
  for (index=0; index < ArraySize(ModuleAliases);index++)
352
2.78M
    {
353
2.78M
      if (ModuleAliases[index].magick[0] > module_name[0])
354
25.5k
        break;
355
2.75M
      if ((ModuleAliases[index].magick[0] == module_name[0]) &&
356
176k
          (ModuleAliases[index].magick_len == name_length) &&
357
42.9k
          (memcmp(ModuleAliases[index].magick,module_name,name_length) == 0))
358
86
        {
359
86
          name_length=strlcpy(module_name,ModuleAliases[index].name,MaxTextExtent);
360
86
          break;
361
86
        }
362
2.75M
    }
363
364
  /*
365
    Find module in list and load if not already loaded
366
  */
367
1.51M
  for (index=0; index < ArraySize(StaticModules);index++)
368
1.51M
    {
369
1.51M
      if (StaticModules[index].name[0] > module_name[0])
370
25.3k
        break;
371
1.49M
      if ((StaticModules[index].name[0] == module_name[0]) &&
372
135k
          (StaticModules[index].name_length == name_length) &&
373
70.2k
          (memcmp(StaticModules[index].name,module_name,name_length) == 0))
374
322
        {
375
322
          if (StaticModulesLoaded[index] == MagickFalse)
376
322
            {
377
322
              (StaticModules[index].register_fn)();
378
322
              StaticModulesLoaded[index] = MagickTrue;
379
322
              (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
380
322
                                    "Loaded static module \"%s\"", module_name);
381
322
            }
382
322
          status=MagickPass;
383
322
          break;
384
322
        }
385
1.49M
    }
386
25.6k
  if (index == ArraySize(StaticModules))
387
0
    status=MagickFail;
388
389
25.6k
  return status;
390
25.6k
}
391

392
/*
393
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
394
%                                                                             %
395
%                                                                             %
396
%                                                                             %
397
%   O p e n M o d u l e s                                                     %
398
%                                                                             %
399
%                                                                             %
400
%                                                                             %
401
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
402
%
403
%  Method OpenModules loads all available modules.
404
%
405
%  The format of the OpenModules method is:
406
%
407
%      MagickPassFail OpenModules(ExceptionInfo *exception)
408
%
409
%  A description of each parameter follows:
410
%
411
%    o status: Method OpenModules returns True if the modules are loaded,
412
%      otherwise False.
413
%
414
%    o exception: Return any errors or warnings in this structure.
415
%
416
*/
417
MagickPassFail
418
OpenModules(ExceptionInfo *exception)
419
0
{
420
0
  unsigned int index;
421
0
  (void) exception;
422
423
0
  for (index=0; index < ArraySize(StaticModules); index++)
424
0
    {
425
0
      if (StaticModulesLoaded[index] == MagickFalse)
426
0
        {
427
0
          (StaticModules[index].register_fn)();
428
0
          StaticModulesLoaded[index] = MagickTrue;
429
0
        }
430
0
    }
431
432
0
  return MagickPass;
433
0
}
434
#endif /* !defined(SupportMagickModules) */
435

436
/*
437
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
438
%                                                                             %
439
%                                                                             %
440
%                                                                             %
441
%   E x e c u t e S t a t i c M o d u l e P r o c e s s                       %
442
%                                                                             %
443
%                                                                             %
444
%                                                                             %
445
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
446
%
447
%  ExecuteStaticModuleProcess() is just a template method. This version is
448
%  only used for static and moby builds.  See the version in module.c for
449
%  module-only builds. This function takes the place of ExecuteModuleProcess
450
%  for builds which do not support loading modules.
451
%
452
%  The format of the ExecuteStaticModuleProcess method is:
453
%
454
%      unsigned int ExecuteStaticModuleProcess(const char *tag,
455
%        Image **image,const int argc,char **argv)
456
%
457
%  A description of each parameter follows:
458
%
459
%    o tag: The module tag.
460
%
461
%    o image: The image.
462
%
463
%    o argc: The number of elements in the argument vector.
464
%
465
%    o argv: A text array containing the command line arguments.
466
%
467
*/
468
#if defined(SupportMagickModules)
469
unsigned int ExecuteStaticModuleProcess(const char *tag,
470
  Image **image,const int argc,char **argv)
471
#else
472
unsigned int ExecuteModuleProcess(const char *tag,
473
  Image **image,const int argc,char **argv)
474
#endif /* defined(SupportMagickModules) */
475
0
{
476
0
  unsigned int
477
0
    status = False;
478
479
0
#if !defined(SupportMagickModules)
480
0
  unsigned int
481
0
    (*method)(Image **,const int,char **) = 0;
482
483
0
  if (LocaleCompare("analyze",tag) == 0)
484
0
    method=AnalyzeImage;
485
486
0
  if (method)
487
0
    {
488
0
      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
489
0
        "Invoking \"%.1024s\" filter module",tag);
490
491
0
      status=(*method)(image,argc,argv);
492
493
0
      (void) LogMagickEvent(CoderEvent,GetMagickModule(),
494
0
        "Returned from \"%.1024s\" filter module",tag);
495
0
    }
496
#else
497
  ARG_NOT_USED(tag);
498
  ARG_NOT_USED(image);
499
  ARG_NOT_USED(argc);
500
  ARG_NOT_USED(argv);
501
#endif /* !defined(SupportMagickModules) */
502
0
  return(status);
503
0
}
504

505
/*
506
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
507
%                                                                             %
508
%                                                                             %
509
%                                                                             %
510
%   R e g i s t e r S t a t i c M o d u l e s                                 %
511
%                                                                             %
512
%                                                                             %
513
%                                                                             %
514
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
515
%
516
%
517
RegisterStaticModules() statically registers all the available module
518
%  handlers.
519
%
520
%  The format of the RegisterStaticModules method is:
521
%
522
%      RegisterStaticModules(void)
523
%
524
%
525
*/
526
void RegisterStaticModules(void)
527
0
{
528
0
#if !defined(SupportMagickModules)
529
0
  unsigned int index;
530
531
0
  for (index=0; index < ArraySize(StaticModules); index++)
532
0
    {
533
0
      if (StaticModulesLoaded[index] == MagickFalse)
534
0
        {
535
0
          (StaticModules[index].register_fn)();
536
0
          StaticModulesLoaded[index] = MagickTrue;
537
0
        }
538
0
    }
539
0
#endif /* !defined(SupportMagickModules) */
540
0
}
541

542
/*
543
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
544
%                                                                             %
545
%                                                                             %
546
%                                                                             %
547
%   U n r e g i s t e r S t a t i c M o d u l e s                             %
548
%                                                                             %
549
%                                                                             %
550
%                                                                             %
551
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
552
%
553
%  UnregisterStaticModules() statically unregisters all the available module
554
%  handlers. This allows allocated resources to be freed.
555
%
556
%  The format of the UnRegisterStaticModules method is:
557
%
558
%      UnRegisterStaticModules(void)
559
%
560
%
561
*/
562
void UnregisterStaticModules(void)
563
0
{
564
0
#if !defined(SupportMagickModules)
565
0
  unsigned int index;
566
567
0
  for (index=0; index < ArraySize(StaticModules);index++)
568
0
    {
569
0
      if (StaticModulesLoaded[index] != MagickFalse)
570
0
        {
571
0
          (StaticModules[index].unregister_fn)();
572
0
          StaticModulesLoaded[index] = MagickFalse;
573
0
        }
574
0
    }
575
0
#endif /* !defined(SupportMagickModules) */
576
0
}