MagickCore  7.1.2-29
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 "MagickCore/studio.h"
44 #include "MagickCore/coder.h"
45 #include "MagickCore/exception-private.h"
46 #include "MagickCore/image.h"
47 #include "MagickCore/module.h"
48 #include "MagickCore/policy.h"
49 #include "MagickCore/static.h"
50 #include "MagickCore/string_.h"
51 #include "coders/coders.h"
52 ␌
53 /*
54  Define declarations.
55 */
56 #define AddMagickCoder(coder) { #coder, MagickFalse, \
57  Register ## coder ## Image, Unregister ## coder ## Image },
58 ␌
59 /*
60  ImageMagick module stub.
61 */
62 ModuleExport size_t RegisterUndefinedImage(void)
63 {
64  return(MagickImageCoderSignature);
65 }
66 
67 ModuleExport void UnregisterUndefinedImage(void)
68 {
69 }
70 ␌
71 /*
72  ImageMagick modules.
73 */
74 static struct
75 {
76  const char
77  *module;
78 
79  MagickBooleanType
80  registered;
81 
82  size_t
83  (*register_module)(void);
84 
85  void
86  (*unregister_module)(void);
87 } MagickModules[] = {
88 #if !defined(MAGICKCORE_BUILD_MODULES)
89  #include "coders/coders-list.h"
90 #endif
91  { (const char *) NULL, MagickFalse, RegisterUndefinedImage, UnregisterUndefinedImage }
92 };
93 ␌
94 /*
95 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96 % %
97 % %
98 % %
99 % I n v o k e S t a t i c I m a g e F i l t e r %
100 % %
101 % %
102 % %
103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104 %
105 % InvokeStaticImageFilter() invokes a static image filter.
106 %
107 % The format of the InvokeStaticImageFilter method is:
108 %
109 % MagickBooleanType InvokeStaticImageFilter(const char *tag,Image **image,
110 % const int argc,const char **argv)
111 %
112 % A description of each parameter follows:
113 %
114 % o tag: the module tag.
115 %
116 % o image: the image.
117 %
118 % o argc: the number of elements in the argument vector.
119 %
120 % o argv: A text array containing the command line arguments.
121 %
122 % o argv: A text array containing the command line arguments.
123 %
124 % o exception: return any errors or warnings in this structure.
125 %
126 */
127 #if defined(MAGICKCORE_MODULES_SUPPORT)
128 MagickExport MagickBooleanType InvokeStaticImageFilter(const char *tag,
129  Image **image,const int argc,const char **argv,ExceptionInfo *exception)
130 {
131  PolicyRights
132  rights;
133 
134  assert(image != (Image **) NULL);
135  assert((*image)->signature == MagickCoreSignature);
136  if (IsEventLogging() != MagickFalse)
137  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
138  rights=ReadPolicyRights;
139  if (IsRightsAuthorized(FilterPolicyDomain,rights,tag) == MagickFalse)
140  ThrowPolicyException(tag,MagickFalse);
141 #if defined(MAGICKCORE_MODULES_SUPPORT)
142  (void) tag;
143  (void) argc;
144  (void) argv;
145  (void) exception;
146 #else
147  {
148  extern size_t
149  analyzeImage(Image **,const int,char **,ExceptionInfo *);
150 
151  ImageFilterHandler
152  *image_filter;
153 
154  image_filter=(ImageFilterHandler *) NULL;
155  if (LocaleCompare("analyze",tag) == 0)
156  image_filter=(ImageFilterHandler *) analyzeImage;
157  if (image_filter == (ImageFilterHandler *) NULL)
158  (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
159  "UnableToLoadModule","`%s'",tag);
160  else
161  {
162  size_t
163  signature;
164 
165  if ((*image)->debug != MagickFalse)
166  (void) LogMagickEvent(TransformEvent,GetMagickModule(),
167  "Invoking \"%s\" static image filter",tag);
168  signature=image_filter(image,argc,argv,exception);
169  if ((*image)->debug != MagickFalse)
170  (void) LogMagickEvent(TransformEvent,GetMagickModule(),
171  "\"%s\" completes",tag);
172  if (signature != MagickImageFilterSignature)
173  {
174  (void) ThrowMagickException(exception,GetMagickModule(),ModuleError,
175  "ImageFilterSignatureMismatch","'%s': %8lx != %8lx",tag,
176  (unsigned long) signature,(unsigned long)
177  MagickImageFilterSignature);
178  return(MagickFalse);
179  }
180  }
181  }
182 #endif
183  return(MagickTrue);
184 }
185 #endif
186 ␌
187 /*
188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189 % %
190 % %
191 % %
192 % R e g i s t e r S t a t i c M o d u l e %
193 % %
194 % %
195 % %
196 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
197 %
198 % RegisterStaticModule() statically registers a module.
199 %
200 % The format of the RegisterStaticModule method is:
201 %
202 % MagickBooleanType RegisterStaticModule(const char module,
203 % ExceptionInfo *exception)
204 %
205 % A description of each parameter follows:
206 %
207 % o module: the want to register.
208 %
209 % o exception: return any errors or warnings in this structure.
210 %
211 */
212 MagickExport MagickBooleanType RegisterStaticModule(const char *module,
213  ExceptionInfo *exception)
214 {
215  char
216  module_name[MagickPathExtent];
217 
218  PolicyRights
219  rights;
220 
221  const CoderInfo
222  *p;
223 
224  size_t
225  extent;
226 
227  ssize_t
228  i;
229 
230  /*
231  Assign module name from alias.
232  */
233  assert(module != (const char *) NULL);
234  (void) CopyMagickString(module_name,module,MagickPathExtent);
235  p=GetCoderInfo(module,exception);
236  if (p != (CoderInfo *) NULL)
237  (void) CopyMagickString(module_name,p->name,MagickPathExtent);
238  rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
239  if (IsRightsAuthorized(ModulePolicyDomain,rights,module_name) == MagickFalse)
240  ThrowPolicyException(module_name,MagickFalse);
241  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
242  for (i=0; i < (ssize_t) extent; i++)
243  if (LocaleCompare(MagickModules[i].module,module_name) == 0)
244  {
245  if (MagickModules[i].registered == MagickFalse)
246  {
247  (void) (MagickModules[i].register_module)();
248  MagickModules[i].registered=MagickTrue;
249  }
250  return(MagickTrue);
251  }
252  return(MagickFalse);
253 }
254 ␌
255 /*
256 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
257 % %
258 % %
259 % %
260 % R e g i s t e r S t a t i c M o d u l e s %
261 % %
262 % %
263 % %
264 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
265 %
266 % RegisterStaticModules() statically registers all the available module
267 % handlers.
268 %
269 % The format of the RegisterStaticModules method is:
270 %
271 % (void) RegisterStaticModules(void)
272 %
273 */
274 MagickExport void RegisterStaticModules(void)
275 {
276  PolicyRights
277  rights;
278 
279  size_t
280  extent;
281 
282  ssize_t
283  i;
284 
285  rights=(PolicyRights) (ReadPolicyRights | WritePolicyRights);
286  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
287  for (i=0; i < (ssize_t) extent; i++)
288  {
289  if (MagickModules[i].registered == MagickFalse)
290  {
291  if (IsRightsAuthorized(ModulePolicyDomain,rights,MagickModules[i].module) == MagickFalse)
292  continue;
293  (void) (MagickModules[i].register_module)();
294  MagickModules[i].registered=MagickTrue;
295  }
296  }
297 }
298 ␌
299 /*
300 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
301 % %
302 % %
303 % %
304 % U n r e g i s t e r S t a t i c M o d u l e %
305 % %
306 % %
307 % %
308 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
309 %
310 % UnregisterStaticModule() statically unregisters the named module.
311 %
312 % The format of the UnregisterStaticModule method is:
313 %
314 % MagickBooleanType UnregisterStaticModule(const char *module)
315 %
316 % A description of each parameter follows:
317 %
318 % o module: the module we want to unregister.
319 %
320 */
321 MagickExport MagickBooleanType UnregisterStaticModule(const char *module)
322 {
323  size_t
324  extent;
325 
326  ssize_t
327  i;
328 
329  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
330  for (i=0; i < (ssize_t) extent; i++)
331  if (LocaleCompare(MagickModules[i].module,module) == 0)
332  {
333  if (MagickModules[i].registered != MagickFalse)
334  {
335  (MagickModules[i].unregister_module)();
336  MagickModules[i].registered=MagickFalse;
337  }
338  return(MagickTrue);
339  }
340  return(MagickFalse);
341 }
342 ␌
343 /*
344 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
345 % %
346 % %
347 % %
348 % U n r e g i s t e r S t a t i c M o d u l e s %
349 % %
350 % %
351 % %
352 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353 %
354 % UnregisterStaticModules() statically unregisters all the available module
355 % handlers.
356 %
357 % The format of the UnregisterStaticModules method is:
358 %
359 % UnregisterStaticModules(void)
360 %
361 */
362 MagickExport void UnregisterStaticModules(void)
363 {
364  size_t
365  extent;
366 
367  ssize_t
368  i;
369 
370  extent=sizeof(MagickModules)/sizeof(MagickModules[0]);
371  for (i=0; i < (ssize_t) extent; i++)
372  {
373  if (MagickModules[i].registered != MagickFalse)
374  {
375  (MagickModules[i].unregister_module)();
376  MagickModules[i].registered=MagickFalse;
377  }
378  }
379 }
Definition: image.h:132