2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11 % M M AAA GGGG IIIII CCCC K K %
12 % MM MM A A G I C K K %
13 % M M M AAAAA G GGG I C KKK %
14 % M M A A G G I C K K %
15 % M M A A GGGG IIIII CCCC K K %
18 % Object-oriented Perl interface to ImageMagick %
26 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
27 % dedicated to making software imaging solutions freely available. %
29 % You may not use this file except in compliance with the License. You may %
30 % obtain a copy of the License at %
32 % http://www.imagemagick.org/script/license.php %
34 % Unless required by applicable law or agreed to in writing, software %
35 % distributed under the License is distributed on an "AS IS" BASIS, %
36 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
37 % See the License for the specific language governing permissions and %
38 % limitations under the License. %
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 % PerlMagick is an objected-oriented Perl interface to ImageMagick. Use
43 % the module to read, manipulate, or write an image or image sequence from
44 % within a Perl script. This makes PerlMagick suitable for Web CGI scripts.
55 #if defined(__cplusplus) || defined(c_plusplus)
59 #define PERL_NO_GET_CONTEXT
64 #include <MagickCore/MagickCore.h>
67 #if defined(__cplusplus) || defined(c_plusplus)
79 #define DegreesToRadians(x) (MagickPI*(x)/180.0)
80 #define EndOf(array) (&array[NumberOf(array)])
81 #define MaxArguments 33
85 #define NumberOf(array) (sizeof(array)/sizeof(*array))
86 #define PackageName "Image::Magick"
89 #define PerlIO_importFILE(f, fl) (f)
90 #define PerlIO_findFILE(f) NULL
93 #define sv_undef PL_sv_undef
96 #define AddImageToRegistry(sv,image) \
98 if (magick_registry != (SplayTreeInfo *) NULL) \
100 (void) AddValueToSplayTree(magick_registry,image,image); \
101 (sv)=newSViv((IV) image); \
105 #define DeleteImageFromRegistry(reference,image) \
107 if (magick_registry != (SplayTreeInfo *) NULL) \
109 if (GetImageReferenceCount(image) == 1) \
110 (void) DeleteNodeByValueFromSplayTree(magick_registry,image); \
111 image=DestroyImage(image); \
112 sv_setiv(reference,0); \
116 #define InheritPerlException(exception,perl_exception) \
119 message[MaxTextExtent]; \
121 if ((exception)->severity != UndefinedException) \
123 (void) FormatLocaleString(message,MaxTextExtent,"Exception %d: %s%s%s%s",\
124 (exception)->severity, (exception)->reason ? \
125 GetLocaleExceptionMessage((exception)->severity,(exception)->reason) : \
126 "Unknown", (exception)->description ? " (" : "", \
127 (exception)->description ? GetLocaleExceptionMessage( \
128 (exception)->severity,(exception)->description) : "", \
129 (exception)->description ? ")" : ""); \
130 if ((perl_exception) != (SV *) NULL) \
132 if (SvCUR(perl_exception)) \
133 sv_catpv(perl_exception,"\n"); \
134 sv_catpv(perl_exception,message); \
139 #define ThrowPerlException(exception,severity,tag,reason) \
140 (void) ThrowMagickException(exception,GetMagickModule(),severity, \
141 tag,"`%s'",reason); \
144 Typedef and structure declarations.
148 ArrayReference = (~0),
149 RealReference = (~0)-1,
150 FileReference = (~0)-2,
151 ImageReference = (~0)-3,
152 IntegerReference = (~0)-4,
153 StringReference = (~0)-5
156 typedef struct _Arguments
196 *Image__Magick; /* data type for the Image::Magick package */
208 arguments[MaxArguments];
211 { "Comment", { {"comment", StringReference} } },
212 { "Label", { {"label", StringReference} } },
213 { "AddNoise", { {"noise", MagickNoiseOptions},
214 {"channel", MagickChannelOptions} } },
215 { "Colorize", { {"fill", StringReference}, {"opacity", StringReference} } },
216 { "Border", { {"geometry", StringReference}, {"width", IntegerReference},
217 {"height", IntegerReference}, {"fill", StringReference},
218 {"bordercolor", StringReference}, {"color", StringReference},
219 {"compose", MagickComposeOptions} } },
220 { "Blur", { {"geometry", StringReference}, {"radius", RealReference},
221 {"sigma", RealReference}, {"channel", MagickChannelOptions} } },
222 { "Chop", { {"geometry", StringReference}, {"width", IntegerReference},
223 {"height", IntegerReference}, {"x", IntegerReference},
224 {"y", IntegerReference} } },
225 { "Crop", { {"geometry", StringReference}, {"width", IntegerReference},
226 {"height", IntegerReference}, {"x", IntegerReference},
227 {"y", IntegerReference}, {"fuzz", StringReference},
228 {"gravity", MagickGravityOptions} } },
230 { "Edge", { {"radius", RealReference} } },
231 { "Emboss", { {"geometry", StringReference}, {"radius", RealReference},
232 {"sigma", RealReference} } },
236 { "Frame", { {"geometry", StringReference}, {"width", IntegerReference},
237 {"height", IntegerReference}, {"inner", IntegerReference},
238 {"outer", IntegerReference}, {"fill", StringReference},
239 {"color", StringReference}, {"compose", MagickComposeOptions} } },
240 { "Implode", { {"amount", RealReference},
241 {"interpolate", MagickInterpolateOptions} } },
243 { "MedianFilter", { {"geometry", StringReference},
244 {"width", IntegerReference},{"height", IntegerReference},
245 {"channel", MagickChannelOptions} } },
247 { "OilPaint", { {"radius", RealReference} } },
248 { "ReduceNoise", { {"geometry", StringReference},
249 {"width", IntegerReference},{"height", IntegerReference},
250 {"channel", MagickChannelOptions} } },
251 { "Roll", { {"geometry", StringReference}, {"x", IntegerReference},
252 {"y", IntegerReference} } },
253 { "Rotate", { {"degrees", RealReference}, {"fill", StringReference},
254 {"color", StringReference}, {"background", StringReference} } },
255 { "Sample", { {"geometry", StringReference}, {"width", IntegerReference},
256 {"height", IntegerReference} } },
257 { "Scale", { {"geometry", StringReference}, {"width", IntegerReference},
258 {"height", IntegerReference} } },
259 { "Shade", { {"geometry", StringReference}, {"azimuth", RealReference},
260 {"elevation", RealReference}, {"gray", MagickBooleanOptions} } },
261 { "Sharpen", { {"geometry", StringReference}, {"radius", RealReference},
262 {"sigma", RealReference}, {"channel", MagickChannelOptions} } },
263 { "Shear", { {"geometry", StringReference}, {"x", RealReference},
264 {"y", RealReference}, { "fill", StringReference},
265 {"color", StringReference} } },
266 { "Spread", { {"radius", RealReference} } },
267 { "Swirl", { {"degrees", RealReference},
268 {"interpolate", MagickInterpolateOptions} } },
269 { "Resize", { {"geometry", StringReference}, {"width", IntegerReference},
270 {"height", IntegerReference}, {"filter", MagickFilterOptions},
271 {"support", StringReference }, {"blur", RealReference } } },
272 { "Zoom", { {"geometry", StringReference}, {"width", IntegerReference},
273 {"height", IntegerReference}, {"filter", MagickFilterOptions},
274 {"support", RealReference }, {"blur", RealReference } } },
275 { "Annotate", { {"text", StringReference}, {"font", StringReference},
276 {"pointsize", RealReference}, {"density", StringReference},
277 {"undercolor", StringReference}, {"stroke", StringReference},
278 {"fill", StringReference}, {"geometry", StringReference},
279 {"pen", StringReference}, {"x", RealReference},
280 {"y", RealReference}, {"gravity", MagickGravityOptions},
281 {"translate", StringReference}, {"scale", StringReference},
282 {"rotate", RealReference}, {"skewX", RealReference},
283 {"skewY", RealReference}, {"strokewidth", RealReference},
284 {"antialias", MagickBooleanOptions}, {"family", StringReference},
285 {"style", MagickStyleOptions}, {"stretch", MagickStretchOptions},
286 {"weight", IntegerReference}, {"align", MagickAlignOptions},
287 {"encoding", StringReference}, {"affine", ArrayReference},
288 {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference},
289 {"tile", ImageReference}, {"kerning", RealReference},
290 {"interline-spacing", RealReference},
291 {"interword-spacing", RealReference},
292 {"direction", MagickDirectionOptions} } },
293 { "ColorFloodfill", { {"geometry", StringReference},
294 {"x", IntegerReference}, {"y", IntegerReference},
295 {"fill", StringReference}, {"bordercolor", StringReference},
296 {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } },
297 { "Composite", { {"image", ImageReference},
298 {"compose", MagickComposeOptions}, {"geometry", StringReference},
299 {"x", IntegerReference}, {"y", IntegerReference},
300 {"gravity", MagickGravityOptions}, {"opacity", StringReference},
301 {"tile", MagickBooleanOptions}, {"rotate", RealReference},
302 {"color", StringReference}, {"mask", ImageReference},
303 {"channel", MagickChannelOptions},
304 {"interpolate", MagickInterpolateOptions}, {"args", StringReference},
305 {"blend", StringReference} } },
306 { "Contrast", { {"sharpen", MagickBooleanOptions} } },
307 { "CycleColormap", { {"display", IntegerReference} } },
308 { "Draw", { {"primitive", MagickPrimitiveOptions},
309 {"points", StringReference}, {"method", MagickMethodOptions},
310 {"stroke", StringReference}, {"fill", StringReference},
311 {"strokewidth", RealReference}, {"font", StringReference},
312 {"bordercolor", StringReference}, {"x", RealReference},
313 {"y", RealReference}, {"translate", StringReference},
314 {"scale", StringReference}, {"rotate", RealReference},
315 {"skewX", RealReference}, {"skewY", RealReference},
316 {"tile", ImageReference}, {"pointsize", RealReference},
317 {"antialias", MagickBooleanOptions}, {"density", StringReference},
318 {"linewidth", RealReference}, {"affine", ArrayReference},
319 {"stroke-dashoffset", RealReference},
320 {"stroke-dasharray", ArrayReference},
321 {"interpolate", MagickInterpolateOptions},
322 {"origin", StringReference}, {"text", StringReference},
323 {"fill-pattern", ImageReference}, {"stroke-pattern", ImageReference},
324 {"vector-graphics", StringReference}, {"kerning", RealReference},
325 {"interline-spacing", RealReference},
326 {"interword-spacing", RealReference},
327 {"direction", MagickDirectionOptions} } },
328 { "Equalize", { {"channel", MagickChannelOptions} } },
329 { "Gamma", { {"gamma", StringReference}, {"channel", MagickChannelOptions},
330 {"red", RealReference}, {"green", RealReference},
331 {"blue", RealReference} } },
332 { "Map", { {"image", ImageReference}, {"dither", MagickBooleanOptions},
333 {"dither-method", MagickDitherOptions} } },
334 { "MatteFloodfill", { {"geometry", StringReference},
335 {"x", IntegerReference}, {"y", IntegerReference},
336 {"opacity", StringReference}, {"bordercolor", StringReference},
337 {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } },
338 { "Modulate", { {"factor", StringReference}, {"hue", RealReference},
339 {"saturation", RealReference}, {"whiteness", RealReference},
340 {"brightness", RealReference}, {"lightness", RealReference},
341 {"blackness", RealReference} } },
342 { "Negate", { {"gray", MagickBooleanOptions},
343 {"channel", MagickChannelOptions} } },
344 { "Normalize", { {"channel", MagickChannelOptions} } },
346 { "Opaque", { {"color", StringReference}, {"fill", StringReference},
347 {"fuzz", StringReference}, {"channel", MagickChannelOptions},
348 {"invert", MagickBooleanOptions} } },
349 { "Quantize", { {"colors", IntegerReference},
350 {"treedepth", IntegerReference}, {"colorspace", MagickColorspaceOptions},
351 {"dither", MagickBooleanOptions}, {"measure", MagickBooleanOptions},
352 {"global", MagickBooleanOptions}, {"transparent-color", StringReference},
353 {"dither-method", MagickDitherOptions} } },
354 { "Raise", { {"geometry", StringReference}, {"width", IntegerReference},
355 {"height", IntegerReference}, {"raise", MagickBooleanOptions} } },
356 { "Segment", { {"geometry", StringReference},
357 {"cluster-threshold", RealReference},
358 {"smoothing-threshold", RealReference},
359 {"colorspace", MagickColorspaceOptions},
360 {"verbose", MagickBooleanOptions} } },
362 { "Solarize", { {"geometry", StringReference},
363 {"threshold", StringReference} } },
365 { "Texture", { {"texture", ImageReference} } },
366 { "Evaluate", { {"value", RealReference},
367 {"operator", MagickEvaluateOptions},
368 {"channel", MagickChannelOptions} } },
369 { "Transparent", { {"color", StringReference}, {"opacity", StringReference},
370 {"fuzz", StringReference}, {"invert", MagickBooleanOptions} } },
371 { "Threshold", { {"threshold", StringReference},
372 {"channel", MagickChannelOptions} } },
373 { "Charcoal", { {"geometry", StringReference}, {"radius", RealReference},
374 {"sigma", RealReference} } },
375 { "Trim", { {"fuzz", StringReference} } },
376 { "Wave", { {"geometry", StringReference}, {"amplitude", RealReference},
377 {"wavelength", RealReference},
378 {"interpolate", MagickInterpolateOptions} } },
379 { "Separate", { {"channel", MagickChannelOptions} } },
381 { "Stereo", { {"image", ImageReference}, {"x", IntegerReference},
382 {"y", IntegerReference} } },
383 { "Stegano", { {"image", ImageReference}, {"offset", IntegerReference} } },
385 { "GaussianBlur", { {"geometry", StringReference},
386 {"radius", RealReference}, {"sigma", RealReference},
387 {"channel", MagickChannelOptions} } },
388 { "Convolve", { {"coefficients", ArrayReference},
389 {"channel", MagickChannelOptions}, {"bias", StringReference},
390 {"kernel", StringReference} } },
391 { "Profile", { {"name", StringReference}, {"profile", StringReference},
392 { "rendering-intent", MagickIntentOptions},
393 { "black-point-compensation", MagickBooleanOptions} } },
394 { "UnsharpMask", { {"geometry", StringReference},
395 {"radius", RealReference}, {"sigma", RealReference},
396 {"amount", RealReference}, {"threshold", RealReference},
397 {"channel", MagickChannelOptions} } },
398 { "MotionBlur", { {"geometry", StringReference},
399 {"radius", RealReference}, {"sigma", RealReference},
400 {"angle", RealReference}, {"channel", MagickChannelOptions} } },
401 { "OrderedDither", { {"threshold", StringReference},
402 {"channel", MagickChannelOptions} } },
403 { "Shave", { {"geometry", StringReference}, {"width", IntegerReference},
404 {"height", IntegerReference} } },
405 { "Level", { {"levels", StringReference}, {"black-point", RealReference},
406 {"white-point", RealReference}, {"gamma", RealReference},
407 {"channel", MagickChannelOptions}, {"level", StringReference} } },
408 { "Clip", { {"id", StringReference}, {"inside", MagickBooleanOptions} } },
409 { "AffineTransform", { {"affine", ArrayReference},
410 {"translate", StringReference}, {"scale", StringReference},
411 {"rotate", RealReference}, {"skewX", RealReference},
412 {"skewY", RealReference}, {"interpolate", MagickInterpolateOptions},
413 {"background", StringReference} } },
414 { "Difference", { {"image", ImageReference}, {"fuzz", StringReference} } },
415 { "AdaptiveThreshold", { {"geometry", StringReference},
416 {"width", IntegerReference}, {"height", IntegerReference},
417 {"bias", RealReference} } },
418 { "Resample", { {"density", StringReference}, {"x", RealReference},
419 {"y", RealReference}, {"filter", MagickFilterOptions},
420 {"support", RealReference }, {"blur", RealReference } } },
421 { "Describe", { {"file", FileReference} } },
422 { "BlackThreshold", { {"threshold", StringReference},
423 {"channel", MagickChannelOptions} } },
424 { "WhiteThreshold", { {"threshold", StringReference},
425 {"channel", MagickChannelOptions} } },
426 { "RadialBlur", { {"geometry", StringReference}, {"angle", RealReference},
427 {"channel", MagickChannelOptions} } },
428 { "Thumbnail", { {"geometry", StringReference}, {"width", IntegerReference},
429 {"height", IntegerReference} } },
431 { "Tint", { {"fill", StringReference}, {"opacity", StringReference} } },
432 { "Channel", { {"channel", MagickChannelOptions} } },
433 { "Splice", { {"geometry", StringReference}, {"width", IntegerReference},
434 {"height", IntegerReference}, {"x", IntegerReference},
435 {"y", IntegerReference}, {"fuzz", StringReference},
436 {"background", StringReference}, {"gravity", MagickGravityOptions} } },
437 { "Posterize", { {"levels", IntegerReference},
438 {"dither", MagickBooleanOptions} } },
439 { "Shadow", { {"geometry", StringReference}, {"opacity", RealReference},
440 {"sigma", RealReference}, {"x", IntegerReference},
441 {"y", IntegerReference} } },
442 { "Identify", { {"file", FileReference}, {"features", StringReference},
443 {"unique", MagickBooleanOptions} } },
444 { "SepiaTone", { {"threshold", RealReference} } },
445 { "SigmoidalContrast", { {"geometry", StringReference},
446 {"contrast", RealReference}, {"mid-point", RealReference},
447 {"channel", MagickChannelOptions}, {"sharpen", MagickBooleanOptions} } },
448 { "Extent", { {"geometry", StringReference}, {"width", IntegerReference},
449 {"height", IntegerReference}, {"x", IntegerReference},
450 {"y", IntegerReference}, {"fuzz", StringReference},
451 {"background", StringReference}, {"gravity", MagickGravityOptions} } },
452 { "Vignette", { {"geometry", StringReference}, {"radius", RealReference},
453 {"sigma", RealReference}, {"x", IntegerReference},
454 {"y", IntegerReference}, {"background", StringReference} } },
455 { "ContrastStretch", { {"levels", StringReference},
456 {"black-point", RealReference},{"white-point", RealReference},
457 {"channel", MagickChannelOptions} } },
460 { "AdaptiveSharpen", { {"geometry", StringReference},
461 {"radius", RealReference}, {"sigma", RealReference},
462 {"channel", MagickChannelOptions} } },
466 { "AdaptiveBlur", { {"geometry", StringReference},
467 {"radius", RealReference}, {"sigma", RealReference},
468 {"channel", MagickChannelOptions} } },
469 { "Sketch", { {"geometry", StringReference},
470 {"radius", RealReference}, {"sigma", RealReference},
471 {"angle", RealReference} } },
473 { "AdaptiveResize", { {"geometry", StringReference},
474 {"width", IntegerReference}, {"height", IntegerReference},
475 {"filter", MagickFilterOptions}, {"support", StringReference },
476 {"blur", RealReference } } },
477 { "ClipMask", { {"mask", ImageReference} } },
478 { "LinearStretch", { {"levels", StringReference},
479 {"black-point", RealReference},{"white-point", RealReference} } },
480 { "Recolor", { {"matrix", ArrayReference} } },
481 { "Mask", { {"mask", ImageReference} } },
482 { "Polaroid", { {"caption", StringReference}, {"angle", RealReference},
483 {"font", StringReference}, {"stroke", StringReference},
484 {"fill", StringReference}, {"strokewidth", RealReference},
485 {"pointsize", RealReference}, {"gravity", MagickGravityOptions},
486 {"background", StringReference} } },
487 { "FloodfillPaint", { {"geometry", StringReference},
488 {"x", IntegerReference}, {"y", IntegerReference},
489 {"fill", StringReference}, {"bordercolor", StringReference},
490 {"fuzz", StringReference}, {"channel", MagickChannelOptions},
491 {"invert", MagickBooleanOptions} } },
492 { "Distort", { {"points", ArrayReference}, {"method", MagickDistortOptions},
493 {"virtual-pixel", MagickVirtualPixelOptions},
494 {"best-fit", MagickBooleanOptions} } },
495 { "Clut", { {"image", ImageReference},
496 {"channel", MagickChannelOptions} } },
497 { "LiquidRescale", { {"geometry", StringReference},
498 {"width", IntegerReference}, {"height", IntegerReference},
499 {"delta-x", RealReference}, {"rigidity", RealReference } } },
500 { "Encipher", { {"passphrase", StringReference} } },
501 { "Decipher", { {"passphrase", StringReference} } },
502 { "Deskew", { {"geometry", StringReference},
503 {"threshold", StringReference} } },
504 { "Remap", { {"image", ImageReference}, {"dither", MagickBooleanOptions},
505 {"dither-method", MagickDitherOptions} } },
506 { "SparseColor", { {"points", ArrayReference},
507 {"method", MagickSparseColorOptions},
508 {"virtual-pixel", MagickVirtualPixelOptions},
509 {"channel", MagickChannelOptions} } },
510 { "Function", { {"parameters", ArrayReference},
511 {"function", MagickFunctionOptions},
512 {"virtual-pixel", MagickVirtualPixelOptions} } },
513 { "SelectiveBlur", { {"geometry", StringReference},
514 {"radius", RealReference}, {"sigma", RealReference},
515 {"threshold", RealReference}, {"channel", MagickChannelOptions} } },
516 { "HaldClut", { {"image", ImageReference},
517 {"channel", MagickChannelOptions} } },
518 { "BlueShift", { {"factor", StringReference} } },
519 { "ForwardFourierTransform", { {"magnitude", MagickBooleanOptions} } },
520 { "InverseFourierTransform", { {"magnitude", MagickBooleanOptions} } },
521 { "ColorDecisionList", {
522 {"color-correction-collection", StringReference} } },
523 { "AutoGamma", { {"channel", MagickChannelOptions} } },
524 { "AutoLevel", { {"channel", MagickChannelOptions} } },
525 { "LevelColors", { {"invert", MagickBooleanOptions},
526 {"black-point", StringReference}, {"white-point", StringReference},
527 {"channel", MagickChannelOptions}, {"invert", MagickBooleanOptions} } },
528 { "Clamp", { {"channel", MagickChannelOptions} } },
529 { "BrightnessContrast", { {"levels", StringReference},
530 {"brightness", RealReference},{"contrast", RealReference},
531 {"channel", MagickChannelOptions} } },
532 { "Morphology", { {"kernel", StringReference},
533 {"channel", MagickChannelOptions}, {"method", MagickMorphologyOptions},
534 {"iterations", IntegerReference} } },
535 { "ColorMatrix", { {"matrix", ArrayReference} } },
536 { "Color", { {"color", StringReference} } },
537 { "Mode", { {"geometry", StringReference},
538 {"width", IntegerReference},{"height", IntegerReference},
539 {"channel", MagickChannelOptions} } },
540 { "Statistic", { {"geometry", StringReference},
541 {"width", IntegerReference},{"height", IntegerReference},
542 {"channel", MagickChannelOptions}, {"type", MagickStatisticOptions} } }
546 *magick_registry = (SplayTreeInfo *) NULL;
549 Forward declarations.
552 *SetupList(pTHX_ SV *,struct PackageInfo **,SV ***,ExceptionInfo *);
555 strEQcase(const char *,const char *);
558 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
562 % C l o n e P a c k a g e I n f o %
566 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
568 % ClonePackageInfo makes a duplicate of the given info, or if info is NULL,
571 % The format of the ClonePackageInfo routine is:
573 % struct PackageInfo *ClonePackageInfo(struct PackageInfo *info,
576 % A description of each parameter follows:
578 % o info: a structure of type info.
580 % o exception: Return any errors or warnings in this structure.
583 static struct PackageInfo *ClonePackageInfo(struct PackageInfo *info,
584 ExceptionInfo *exception)
589 clone_info=(struct PackageInfo *) AcquireQuantumMemory(1,sizeof(*clone_info));
590 if (clone_info == (struct PackageInfo *) NULL)
592 ThrowPerlException(exception,ResourceLimitError,
593 "UnableToClonePackageInfo",PackageName);
594 return((struct PackageInfo *) NULL);
596 if (info == (struct PackageInfo *) NULL)
598 clone_info->image_info=CloneImageInfo((ImageInfo *) NULL);
602 clone_info->image_info=CloneImageInfo(info->image_info);
607 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
615 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
617 % constant() returns a double value for the specified name.
619 % The format of the constant routine is:
621 % double constant(char *name,ssize_t sans)
623 % A description of each parameter follows:
625 % o value: Method constant returns a double value for the specified name.
627 % o name: The name of the constant.
629 % o sans: This integer value is not used.
632 static double constant(char *name,ssize_t sans)
640 if (strEQ(name,"BlobError"))
642 if (strEQ(name,"BlobWarning"))
648 if (strEQ(name,"CacheError"))
650 if (strEQ(name,"CacheWarning"))
651 return(CacheWarning);
652 if (strEQ(name,"CoderError"))
654 if (strEQ(name,"CoderWarning"))
655 return(CoderWarning);
656 if (strEQ(name,"ConfigureError"))
657 return(ConfigureError);
658 if (strEQ(name,"ConfigureWarning"))
659 return(ConfigureWarning);
660 if (strEQ(name,"CorruptImageError"))
661 return(CorruptImageError);
662 if (strEQ(name,"CorruptImageWarning"))
663 return(CorruptImageWarning);
668 if (strEQ(name,"DelegateError"))
669 return(DelegateError);
670 if (strEQ(name,"DelegateWarning"))
671 return(DelegateWarning);
672 if (strEQ(name,"DrawError"))
674 if (strEQ(name,"DrawWarning"))
680 if (strEQ(name,"ErrorException"))
681 return(ErrorException);
682 if (strEQ(name,"ExceptionError"))
684 if (strEQ(name,"ExceptionWarning"))
685 return(CoderWarning);
690 if (strEQ(name,"FatalErrorException"))
691 return(FatalErrorException);
692 if (strEQ(name,"FileOpenError"))
693 return(FileOpenError);
694 if (strEQ(name,"FileOpenWarning"))
695 return(FileOpenWarning);
700 if (strEQ(name,"ImageError"))
702 if (strEQ(name,"ImageWarning"))
703 return(ImageWarning);
708 if (strEQ(name,"MaxRGB"))
709 return(QuantumRange);
710 if (strEQ(name,"MissingDelegateError"))
711 return(MissingDelegateError);
712 if (strEQ(name,"MissingDelegateWarning"))
713 return(MissingDelegateWarning);
714 if (strEQ(name,"ModuleError"))
716 if (strEQ(name,"ModuleWarning"))
717 return(ModuleWarning);
722 if (strEQ(name,"Opaque"))
724 if (strEQ(name,"OptionError"))
726 if (strEQ(name,"OptionWarning"))
727 return(OptionWarning);
732 if (strEQ(name,"MAGICKCORE_QUANTUM_DEPTH"))
733 return(MAGICKCORE_QUANTUM_DEPTH);
734 if (strEQ(name,"QuantumDepth"))
735 return(MAGICKCORE_QUANTUM_DEPTH);
736 if (strEQ(name,"QuantumRange"))
737 return(QuantumRange);
742 if (strEQ(name,"ResourceLimitError"))
743 return(ResourceLimitError);
744 if (strEQ(name,"ResourceLimitWarning"))
745 return(ResourceLimitWarning);
746 if (strEQ(name,"RegistryError"))
747 return(RegistryError);
748 if (strEQ(name,"RegistryWarning"))
749 return(RegistryWarning);
754 if (strEQ(name,"StreamError"))
756 if (strEQ(name,"StreamWarning"))
757 return(StreamWarning);
758 if (strEQ(name,"Success"))
764 if (strEQ(name,"Transparent"))
765 return(TransparentAlpha);
766 if (strEQ(name,"TypeError"))
768 if (strEQ(name,"TypeWarning"))
774 if (strEQ(name,"WarningException"))
775 return(WarningException);
780 if (strEQ(name,"XServerError"))
781 return(XServerError);
782 if (strEQ(name,"XServerWarning"))
783 return(XServerWarning);
792 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
796 % D e s t r o y P a c k a g e I n f o %
800 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
802 % Method DestroyPackageInfo frees a previously created info structure.
804 % The format of the DestroyPackageInfo routine is:
806 % DestroyPackageInfo(struct PackageInfo *info)
808 % A description of each parameter follows:
810 % o info: a structure of type info.
813 static void DestroyPackageInfo(struct PackageInfo *info)
815 info->image_info=DestroyImageInfo(info->image_info);
816 info=(struct PackageInfo *) RelinquishMagickMemory(info);
820 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
828 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
830 % Method GetList is recursively called by SetupList to traverse the
831 % Image__Magick reference. If building an reference_vector (see SetupList),
832 % *current is the current position in *reference_vector and *last is the final
833 % entry in *reference_vector.
835 % The format of the GetList routine is:
839 % A description of each parameter follows:
841 % o info: a structure of type info.
844 static Image *GetList(pTHX_ SV *reference,SV ***reference_vector,
845 ssize_t *current,ssize_t *last,ExceptionInfo *exception)
850 if (reference == (SV *) NULL)
852 switch (SvTYPE(reference))
872 previous=(Image *) NULL;
876 for (i=0; i <= n; i++)
882 if (rv && *rv && sv_isobject(*rv))
884 image=GetList(aTHX_ SvRV(*rv),reference_vector,current,last,
886 if (image == (Image *) NULL)
888 if (image == previous)
890 image=CloneImage(image,0,0,MagickTrue,exception);
891 if (image == (Image *) NULL)
894 image->previous=previous;
895 *(previous ? &previous->next : &head)=image;
896 for (previous=image; previous->next; previous=previous->next) ;
904 Blessed scalar, one image.
906 image=(Image *) SvIV(reference);
907 if (image == (Image *) NULL)
909 image->previous=(Image *) NULL;
910 image->next=(Image *) NULL;
911 if (reference_vector)
913 if (*current == *last)
916 if (*reference_vector == (SV **) NULL)
917 *reference_vector=(SV **) AcquireQuantumMemory(*last,
918 sizeof(*reference_vector));
920 *reference_vector=(SV **) ResizeQuantumMemory(*reference_vector,
921 *last,sizeof(*reference_vector));
923 if (*reference_vector == (SV **) NULL)
925 ThrowPerlException(exception,ResourceLimitError,
926 "MemoryAllocationFailed",PackageName);
927 return((Image *) NULL);
929 (*reference_vector)[*current]=reference;
930 (*reference_vector)[++(*current)]=NULL;
937 (void) fprintf(stderr,"GetList: UnrecognizedType %.20g\n",
938 (double) SvTYPE(reference));
939 return((Image *) NULL);
943 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
947 % G e t P a c k a g e I n f o %
951 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
953 % Method GetPackageInfo looks up or creates an info structure for the given
954 % Image__Magick reference. If it does create a new one, the information in
955 % package_info is used to initialize it.
957 % The format of the GetPackageInfo routine is:
959 % struct PackageInfo *GetPackageInfo(void *reference,
960 % struct PackageInfo *package_info,ExceptionInfo *exception)
962 % A description of each parameter follows:
964 % o info: a structure of type info.
966 % o exception: Return any errors or warnings in this structure.
969 static struct PackageInfo *GetPackageInfo(pTHX_ void *reference,
970 struct PackageInfo *package_info,ExceptionInfo *exception)
973 message[MaxTextExtent];
981 (void) FormatLocaleString(message,MaxTextExtent,"%s::package%s%p",
982 PackageName,XS_VERSION,reference);
983 sv=perl_get_sv(message,(TRUE | 0x02));
984 if (sv == (SV *) NULL)
986 ThrowPerlException(exception,ResourceLimitError,"UnableToGetPackageInfo",
988 return(package_info);
990 if (SvREFCNT(sv) == 0)
991 (void) SvREFCNT_inc(sv);
992 if (SvIOKp(sv) && (clone_info=(struct PackageInfo *) SvIV(sv)))
994 clone_info=ClonePackageInfo(package_info,exception);
995 sv_setiv(sv,(IV) clone_info);
1000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1004 % S e t A t t r i b u t e %
1008 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1010 % SetAttribute() sets the attribute to the value in sval. This can change
1011 % either or both of image or info.
1013 % The format of the SetAttribute routine is:
1015 % SetAttribute(struct PackageInfo *info,Image *image,char *attribute,
1016 % SV *sval,ExceptionInfo *exception)
1018 % A description of each parameter follows:
1020 % o list: a list of strings.
1022 % o string: a character string.
1026 static double SiPrefixToDouble(const char *string,const double interval)
1035 value=InterpretLocaleValue(string,&q);
1037 if ((*q != '\0') && (tolower((int) ((unsigned char) *(q+1))) == 'i'))
1039 switch (tolower((int) ((unsigned char) *q)))
1041 case '%': value*=pow(scale,0)*interval/100.0; break;
1042 case 'k': value*=pow(scale,1); break;
1043 case 'm': value*=pow(scale,2); break;
1044 case 'g': value*=pow(scale,3); break;
1045 case 't': value*=pow(scale,4); break;
1046 case 'p': value*=pow(scale,5); break;
1047 case 'e': value*=pow(scale,6); break;
1048 case 'z': value*=pow(scale,7); break;
1049 case 'y': value*=pow(scale,8); break;
1055 static inline ssize_t StringToLong(const char *value)
1057 return(strtol(value,(char **) NULL,10));
1060 static void SetAttribute(pTHX_ struct PackageInfo *info,Image *image,
1061 const char *attribute,SV *sval,ExceptionInfo *exception)
1088 if (LocaleCompare(attribute,"adjoin") == 0)
1090 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
1091 SvPV(sval,na)) : SvIV(sval);
1094 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1099 info->image_info->adjoin=sp != 0 ? MagickTrue : MagickFalse;
1102 if (LocaleCompare(attribute,"alpha") == 0)
1104 sp=SvPOK(sval) ? ParseCommandOption(MagickAlphaOptions,MagickFalse,
1105 SvPV(sval,na)) : SvIV(sval);
1108 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1112 for ( ; image; image=image->next)
1113 (void) SetImageAlphaChannel(image,(AlphaChannelType) sp,exception);
1116 if (LocaleCompare(attribute,"antialias") == 0)
1118 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
1119 SvPV(sval,na)) : SvIV(sval);
1122 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1127 info->image_info->antialias=sp != 0 ? MagickTrue : MagickFalse;
1130 if (LocaleCompare(attribute,"area-limit") == 0)
1135 limit=MagickResourceInfinity;
1136 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
1137 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
1138 (void) SetMagickResourceLimit(AreaResource,limit);
1141 if (LocaleCompare(attribute,"attenuate") == 0)
1144 (void) SetImageOption(info->image_info,attribute,SvPV(sval,na));
1147 if (LocaleCompare(attribute,"authenticate") == 0)
1150 (void) CloneString(&info->image_info->authenticate,SvPV(sval,na));
1154 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1155 for ( ; image; image=image->next)
1156 SetImageProperty(image,attribute,SvPV(sval,na));
1162 if (LocaleCompare(attribute,"background") == 0)
1164 (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception);
1166 info->image_info->background_color=target_color;
1167 for ( ; image; image=image->next)
1168 image->background_color=target_color;
1171 if (LocaleCompare(attribute,"bias") == 0)
1173 for ( ; image; image=image->next)
1174 image->bias=SiPrefixToDouble(SvPV(sval,na),QuantumRange);
1177 if (LocaleCompare(attribute,"blue-primary") == 0)
1179 for ( ; image; image=image->next)
1181 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1182 image->chromaticity.blue_primary.x=geometry_info.rho;
1183 image->chromaticity.blue_primary.y=geometry_info.sigma;
1184 if ((flags & SigmaValue) == 0)
1185 image->chromaticity.blue_primary.y=
1186 image->chromaticity.blue_primary.x;
1190 if (LocaleCompare(attribute,"bordercolor") == 0)
1192 (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception);
1194 info->image_info->border_color=target_color;
1195 for ( ; image; image=image->next)
1196 image->border_color=target_color;
1200 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1201 for ( ; image; image=image->next)
1202 SetImageProperty(image,attribute,SvPV(sval,na));
1208 if (LocaleCompare(attribute,"cache-threshold") == 0)
1210 (void) SetMagickResourceLimit(MemoryResource,(MagickSizeType)
1211 SiPrefixToDouble(SvPV(sval,na),100.0));
1212 (void) SetMagickResourceLimit(MapResource,(MagickSizeType)
1213 (2*SiPrefixToDouble(SvPV(sval,na),100.0)));
1216 if (LocaleCompare(attribute,"clip-mask") == 0)
1221 clip_mask=(Image *) NULL;
1223 clip_mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception);
1224 for ( ; image; image=image->next)
1225 SetImageClipMask(image,clip_mask);
1228 if (LocaleNCompare(attribute,"colormap",8) == 0)
1230 for ( ; image; image=image->next)
1238 if (image->storage_class == DirectClass)
1241 items=sscanf(attribute,"%*[^[][%ld",&i);
1243 if (i > (ssize_t) image->colors)
1245 if ((strchr(SvPV(sval,na),',') == 0) ||
1246 (strchr(SvPV(sval,na),')') != 0))
1247 QueryColorDatabase(SvPV(sval,na),image->colormap+i,exception);
1250 color=image->colormap+i;
1251 pixel.red=color->red;
1252 pixel.green=color->green;
1253 pixel.blue=color->blue;
1254 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1255 pixel.red=geometry_info.rho;
1256 pixel.green=geometry_info.sigma;
1257 pixel.blue=geometry_info.xi;
1258 color->red=ClampToQuantum(pixel.red);
1259 color->green=ClampToQuantum(pixel.green);
1260 color->blue=ClampToQuantum(pixel.blue);
1265 if (LocaleCompare(attribute,"colorspace") == 0)
1267 sp=SvPOK(sval) ? ParseCommandOption(MagickColorspaceOptions,
1268 MagickFalse,SvPV(sval,na)) : SvIV(sval);
1271 ThrowPerlException(exception,OptionError,"UnrecognizedColorspace",
1275 for ( ; image; image=image->next)
1276 (void) TransformImageColorspace(image,(ColorspaceType) sp);
1279 if (LocaleCompare(attribute,"comment") == 0)
1281 for ( ; image; image=image->next)
1282 (void) SetImageProperty(image,"Comment",InterpretImageProperties(
1283 info ? info->image_info : (ImageInfo *) NULL,image,
1287 if (LocaleCompare(attribute,"compression") == 0)
1289 sp=SvPOK(sval) ? ParseCommandOption(MagickCompressOptions,
1290 MagickFalse,SvPV(sval,na)) : SvIV(sval);
1293 ThrowPerlException(exception,OptionError,
1294 "UnrecognizedImageCompression",SvPV(sval,na));
1298 info->image_info->compression=(CompressionType) sp;
1299 for ( ; image; image=image->next)
1300 image->compression=(CompressionType) sp;
1304 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1305 for ( ; image; image=image->next)
1306 SetImageProperty(image,attribute,SvPV(sval,na));
1312 if (LocaleCompare(attribute,"debug") == 0)
1314 SetLogEventMask(SvPV(sval,na));
1317 if (LocaleCompare(attribute,"delay") == 0)
1319 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1320 for ( ; image; image=image->next)
1322 image->delay=(size_t) floor(geometry_info.rho+0.5);
1323 if ((flags & SigmaValue) != 0)
1324 image->ticks_per_second=(ssize_t)
1325 floor(geometry_info.sigma+0.5);
1329 if (LocaleCompare(attribute,"disk-limit") == 0)
1334 limit=MagickResourceInfinity;
1335 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
1336 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
1337 (void) SetMagickResourceLimit(DiskResource,limit);
1340 if (LocaleCompare(attribute,"density") == 0)
1342 if (IsGeometry(SvPV(sval,na)) == MagickFalse)
1344 ThrowPerlException(exception,OptionError,"MissingGeometry",
1349 (void) CloneString(&info->image_info->density,SvPV(sval,na));
1350 for ( ; image; image=image->next)
1352 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1353 image->x_resolution=geometry_info.rho;
1354 image->y_resolution=geometry_info.sigma;
1355 if ((flags & SigmaValue) == 0)
1356 image->y_resolution=image->x_resolution;
1360 if (LocaleCompare(attribute,"depth") == 0)
1363 info->image_info->depth=SvIV(sval);
1364 for ( ; image; image=image->next)
1365 (void) SetImageDepth(image,SvIV(sval));
1368 if (LocaleCompare(attribute,"dispose") == 0)
1370 sp=SvPOK(sval) ? ParseCommandOption(MagickDisposeOptions,MagickFalse,
1371 SvPV(sval,na)) : SvIV(sval);
1374 ThrowPerlException(exception,OptionError,
1375 "UnrecognizedDisposeMethod",SvPV(sval,na));
1378 for ( ; image; image=image->next)
1379 image->dispose=(DisposeType) sp;
1382 if (LocaleCompare(attribute,"dither") == 0)
1386 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,
1387 MagickFalse,SvPV(sval,na)) : SvIV(sval);
1390 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1394 info->image_info->dither=sp != 0 ? MagickTrue : MagickFalse;
1398 if (LocaleCompare(attribute,"display") == 0)
1402 (void) CloneString(&info->image_info->server_name,SvPV(sval,na));
1406 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1407 for ( ; image; image=image->next)
1408 SetImageProperty(image,attribute,SvPV(sval,na));
1414 if (LocaleCompare(attribute,"endian") == 0)
1416 sp=SvPOK(sval) ? ParseCommandOption(MagickEndianOptions,MagickFalse,
1417 SvPV(sval,na)) : SvIV(sval);
1420 ThrowPerlException(exception,OptionError,"UnrecognizedEndianType",
1425 info->image_info->endian=(EndianType) sp;
1426 for ( ; image; image=image->next)
1427 image->endian=(EndianType) sp;
1430 if (LocaleCompare(attribute,"extract") == 0)
1433 Set image extract geometry.
1435 (void) CloneString(&info->image_info->extract,SvPV(sval,na));
1439 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1440 for ( ; image; image=image->next)
1441 SetImageProperty(image,attribute,SvPV(sval,na));
1447 if (LocaleCompare(attribute,"filename") == 0)
1450 (void) CopyMagickString(info->image_info->filename,SvPV(sval,na),
1452 for ( ; image; image=image->next)
1453 (void) CopyMagickString(image->filename,SvPV(sval,na),
1457 if (LocaleCompare(attribute,"file") == 0)
1465 if (info == (struct PackageInfo *) NULL)
1467 io_info=IoIFP(sv_2io(sval));
1468 if (io_info == (PerlIO *) NULL)
1470 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
1474 file=PerlIO_findFILE(io_info);
1475 if (file == (FILE *) NULL)
1477 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
1481 SetImageInfoFile(info->image_info,file);
1484 if (LocaleCompare(attribute,"fill") == 0)
1487 (void) SetImageOption(info->image_info,"fill",SvPV(sval,na));
1490 if (LocaleCompare(attribute,"font") == 0)
1493 (void) CloneString(&info->image_info->font,SvPV(sval,na));
1496 if (LocaleCompare(attribute,"foreground") == 0)
1498 if (LocaleCompare(attribute,"fuzz") == 0)
1501 info->image_info->fuzz=SiPrefixToDouble(SvPV(sval,na),QuantumRange);
1502 for ( ; image; image=image->next)
1503 image->fuzz=SiPrefixToDouble(SvPV(sval,na),QuantumRange);
1507 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1508 for ( ; image; image=image->next)
1509 SetImageProperty(image,attribute,SvPV(sval,na));
1515 if (LocaleCompare(attribute,"gamma") == 0)
1517 for ( ; image; image=image->next)
1518 image->gamma=SvNV(sval);
1521 if (LocaleCompare(attribute,"gravity") == 0)
1523 sp=SvPOK(sval) ? ParseCommandOption(MagickGravityOptions,MagickFalse,
1524 SvPV(sval,na)) : SvIV(sval);
1527 ThrowPerlException(exception,OptionError,
1528 "UnrecognizedGravityType",SvPV(sval,na));
1532 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1533 for ( ; image; image=image->next)
1534 image->gravity=(GravityType) sp;
1537 if (LocaleCompare(attribute,"green-primary") == 0)
1539 for ( ; image; image=image->next)
1541 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1542 image->chromaticity.green_primary.x=geometry_info.rho;
1543 image->chromaticity.green_primary.y=geometry_info.sigma;
1544 if ((flags & SigmaValue) == 0)
1545 image->chromaticity.green_primary.y=
1546 image->chromaticity.green_primary.x;
1551 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1552 for ( ; image; image=image->next)
1553 SetImageProperty(image,attribute,SvPV(sval,na));
1559 if (LocaleNCompare(attribute,"index",5) == 0)
1573 for ( ; image; image=image->next)
1575 if (image->storage_class != PseudoClass)
1579 items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
1581 image_view=AcquireCacheView(image);
1582 q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception);
1583 if (q != (Quantum *) NULL)
1585 items=sscanf(SvPV(sval,na),"%ld",&index);
1586 if ((index >= 0) && (index < (ssize_t) image->colors))
1587 SetPixelIndex(image,index,q);
1588 (void) SyncCacheViewAuthenticPixels(image_view,exception);
1590 image_view=DestroyCacheView(image_view);
1594 if (LocaleCompare(attribute,"iterations") == 0)
1597 for ( ; image; image=image->next)
1598 image->iterations=SvIV(sval);
1601 if (LocaleCompare(attribute,"interlace") == 0)
1603 sp=SvPOK(sval) ? ParseCommandOption(MagickInterlaceOptions,
1604 MagickFalse,SvPV(sval,na)) : SvIV(sval);
1607 ThrowPerlException(exception,OptionError,
1608 "UnrecognizedInterlaceType",SvPV(sval,na));
1612 info->image_info->interlace=(InterlaceType) sp;
1613 for ( ; image; image=image->next)
1614 image->interlace=(InterlaceType) sp;
1618 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1619 for ( ; image; image=image->next)
1620 SetImageProperty(image,attribute,SvPV(sval,na));
1626 if (LocaleCompare(attribute,"label") == 0)
1628 for ( ; image; image=image->next)
1629 (void) SetImageProperty(image,"label",InterpretImageProperties(
1630 info ? info->image_info : (ImageInfo *) NULL,image,
1634 if (LocaleCompare(attribute,"loop") == 0)
1637 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1638 for ( ; image; image=image->next)
1639 SetImageProperty(image,attribute,SvPV(sval,na));
1645 if (LocaleCompare(attribute,"magick") == 0)
1648 (void) FormatLocaleString(info->image_info->filename,MaxTextExtent,
1649 "%s:",SvPV(sval,na));
1650 for ( ; image; image=image->next)
1651 (void) CopyMagickString(image->magick,SvPV(sval,na),MaxTextExtent);
1654 if (LocaleCompare(attribute,"map-limit") == 0)
1659 limit=MagickResourceInfinity;
1660 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
1661 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
1662 (void) SetMagickResourceLimit(MapResource,limit);
1665 if (LocaleCompare(attribute,"mask") == 0)
1670 mask=(Image *) NULL;
1672 mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception);
1673 for ( ; image; image=image->next)
1674 SetImageMask(image,mask);
1677 if (LocaleCompare(attribute,"mattecolor") == 0)
1679 (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception);
1681 info->image_info->matte_color=target_color;
1682 for ( ; image; image=image->next)
1683 image->matte_color=target_color;
1686 if (LocaleCompare(attribute,"matte") == 0)
1688 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
1689 SvPV(sval,na)) : SvIV(sval);
1692 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1696 for ( ; image; image=image->next)
1697 image->matte=sp != 0 ? MagickTrue : MagickFalse;
1700 if (LocaleCompare(attribute,"memory-limit") == 0)
1705 limit=MagickResourceInfinity;
1706 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
1707 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
1708 (void) SetMagickResourceLimit(MemoryResource,limit);
1711 if (LocaleCompare(attribute,"monochrome") == 0)
1713 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
1714 SvPV(sval,na)) : SvIV(sval);
1717 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1722 info->image_info->monochrome=sp != 0 ? MagickTrue : MagickFalse;
1723 for ( ; image; image=image->next)
1724 (void) SetImageType(image,BilevelType);
1728 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1729 for ( ; image; image=image->next)
1730 SetImageProperty(image,attribute,SvPV(sval,na));
1736 if (LocaleCompare(attribute,"option") == 0)
1739 DefineImageOption(info->image_info,SvPV(sval,na));
1742 if (LocaleCompare(attribute,"orientation") == 0)
1744 sp=SvPOK(sval) ? ParseCommandOption(MagickOrientationOptions,
1745 MagickFalse,SvPV(sval,na)) : SvIV(sval);
1748 ThrowPerlException(exception,OptionError,
1749 "UnrecognizedOrientationType",SvPV(sval,na));
1753 info->image_info->orientation=(OrientationType) sp;
1754 for ( ; image; image=image->next)
1755 image->orientation=(OrientationType) sp;
1759 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1760 for ( ; image; image=image->next)
1761 SetImageProperty(image,attribute,SvPV(sval,na));
1767 if (LocaleCompare(attribute,"page") == 0)
1772 geometry=GetPageGeometry(SvPV(sval,na));
1774 (void) CloneString(&info->image_info->page,geometry);
1775 for ( ; image; image=image->next)
1776 (void) ParsePageGeometry(image,geometry,&image->page,exception);
1777 geometry=(char *) RelinquishMagickMemory(geometry);
1780 if (LocaleCompare(attribute,"pen") == 0)
1783 (void) SetImageOption(info->image_info,"fill",SvPV(sval,na));
1786 if (LocaleNCompare(attribute,"pixel",5) == 0)
1800 for ( ; image; image=image->next)
1802 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1806 items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
1808 image_view=AcquireCacheView(image);
1809 q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception);
1810 if (q != (Quantum *) NULL)
1812 if ((strchr(SvPV(sval,na),',') == 0) ||
1813 (strchr(SvPV(sval,na),')') != 0))
1814 QueryMagickColor(SvPV(sval,na),&pixel,exception);
1817 GetPixelInfo(image,&pixel);
1818 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1819 pixel.red=geometry_info.rho;
1820 if ((flags & SigmaValue) != 0)
1821 pixel.green=geometry_info.sigma;
1822 if ((flags & XiValue) != 0)
1823 pixel.blue=geometry_info.xi;
1824 if ((flags & PsiValue) != 0)
1825 pixel.alpha=geometry_info.psi;
1826 if ((flags & ChiValue) != 0)
1827 pixel.black=geometry_info.chi;
1829 SetPixelRed(image,ClampToQuantum(pixel.red),q);
1830 SetPixelGreen(image,ClampToQuantum(pixel.green),q);
1831 SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
1832 if (image->colorspace == CMYKColorspace)
1833 SetPixelBlack(image,ClampToQuantum(pixel.black),q);
1834 SetPixelAlpha(image,ClampToQuantum(pixel.alpha),q);
1835 (void) SyncCacheViewAuthenticPixels(image_view,exception);
1837 image_view=DestroyCacheView(image_view);
1841 if (LocaleCompare(attribute,"pointsize") == 0)
1845 (void) ParseGeometry(SvPV(sval,na),&geometry_info);
1846 info->image_info->pointsize=geometry_info.rho;
1850 if (LocaleCompare(attribute,"preview") == 0)
1852 sp=SvPOK(sval) ? ParseCommandOption(MagickPreviewOptions,MagickFalse,
1853 SvPV(sval,na)) : SvIV(sval);
1856 ThrowPerlException(exception,OptionError,"UnrecognizedType",
1861 info->image_info->preview_type=(PreviewType) sp;
1865 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1866 for ( ; image; image=image->next)
1867 SetImageProperty(image,attribute,SvPV(sval,na));
1873 if (LocaleCompare(attribute,"quality") == 0)
1876 info->image_info->quality=SvIV(sval);
1877 for ( ; image; image=image->next)
1878 image->quality=SvIV(sval);
1882 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1883 for ( ; image; image=image->next)
1884 SetImageProperty(image,attribute,SvPV(sval,na));
1890 if (LocaleCompare(attribute,"red-primary") == 0)
1892 for ( ; image; image=image->next)
1894 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
1895 image->chromaticity.red_primary.x=geometry_info.rho;
1896 image->chromaticity.red_primary.y=geometry_info.sigma;
1897 if ((flags & SigmaValue) == 0)
1898 image->chromaticity.red_primary.y=
1899 image->chromaticity.red_primary.x;
1903 if (LocaleCompare(attribute,"render") == 0)
1905 sp=SvPOK(sval) ? ParseCommandOption(MagickIntentOptions,MagickFalse,
1906 SvPV(sval,na)) : SvIV(sval);
1909 ThrowPerlException(exception,OptionError,"UnrecognizedIntentType",
1913 for ( ; image; image=image->next)
1914 image->rendering_intent=(RenderingIntent) sp;
1917 if (LocaleCompare(attribute,"repage") == 0)
1922 for ( ; image; image=image->next)
1924 flags=ParseAbsoluteGeometry(SvPV(sval,na),&geometry);
1925 if ((flags & WidthValue) != 0)
1927 if ((flags & HeightValue) == 0)
1928 geometry.height=geometry.width;
1929 image->page.width=geometry.width;
1930 image->page.height=geometry.height;
1932 if ((flags & AspectValue) != 0)
1934 if ((flags & XValue) != 0)
1935 image->page.x+=geometry.x;
1936 if ((flags & YValue) != 0)
1937 image->page.y+=geometry.y;
1941 if ((flags & XValue) != 0)
1943 image->page.x=geometry.x;
1944 if (((flags & WidthValue) != 0) && (geometry.x > 0))
1945 image->page.width=image->columns+geometry.x;
1947 if ((flags & YValue) != 0)
1949 image->page.y=geometry.y;
1950 if (((flags & HeightValue) != 0) && (geometry.y > 0))
1951 image->page.height=image->rows+geometry.y;
1958 SetImageOption(info->image_info,attribute,SvPV(sval,na));
1959 for ( ; image; image=image->next)
1960 SetImageProperty(image,attribute,SvPV(sval,na));
1966 if (LocaleCompare(attribute,"sampling-factor") == 0)
1968 if (IsGeometry(SvPV(sval,na)) == MagickFalse)
1970 ThrowPerlException(exception,OptionError,"MissingGeometry",
1975 (void) CloneString(&info->image_info->sampling_factor,
1979 if (LocaleCompare(attribute,"scene") == 0)
1981 for ( ; image; image=image->next)
1982 image->scene=SvIV(sval);
1985 if (LocaleCompare(attribute,"server") == 0)
1987 if (LocaleCompare(attribute,"size") == 0)
1991 if (IsGeometry(SvPV(sval,na)) == MagickFalse)
1993 ThrowPerlException(exception,OptionError,"MissingGeometry",
1997 (void) CloneString(&info->image_info->size,SvPV(sval,na));
2001 if (LocaleCompare(attribute,"stroke") == 0)
2004 (void) SetImageOption(info->image_info,"stroke",SvPV(sval,na));
2008 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2009 for ( ; image; image=image->next)
2010 SetImageProperty(image,attribute,SvPV(sval,na));
2016 if (LocaleCompare(attribute,"texture") == 0)
2019 (void) CloneString(&info->image_info->texture,SvPV(sval,na));
2022 if (LocaleCompare(attribute,"thread-limit") == 0)
2027 limit=MagickResourceInfinity;
2028 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
2029 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
2030 (void) SetMagickResourceLimit(ThreadResource,limit);
2033 if (LocaleCompare(attribute,"tile-offset") == 0)
2038 geometry=GetPageGeometry(SvPV(sval,na));
2040 (void) CloneString(&info->image_info->page,geometry);
2041 for ( ; image; image=image->next)
2042 (void) ParsePageGeometry(image,geometry,&image->tile_offset,
2044 geometry=(char *) RelinquishMagickMemory(geometry);
2047 if (LocaleCompare(attribute,"time-limit") == 0)
2052 limit=MagickResourceInfinity;
2053 if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
2054 limit=(MagickSizeType) SiPrefixToDouble(SvPV(sval,na),100.0);
2055 (void) SetMagickResourceLimit(TimeResource,limit);
2058 if (LocaleCompare(attribute,"transparent-color") == 0)
2060 (void) QueryColorDatabase(SvPV(sval,na),&target_color,exception);
2062 info->image_info->transparent_color=target_color;
2063 for ( ; image; image=image->next)
2064 image->transparent_color=target_color;
2067 if (LocaleCompare(attribute,"type") == 0)
2069 sp=SvPOK(sval) ? ParseCommandOption(MagickTypeOptions,MagickFalse,
2070 SvPV(sval,na)) : SvIV(sval);
2073 ThrowPerlException(exception,OptionError,"UnrecognizedType",
2078 info->image_info->type=(ImageType) sp;
2079 for ( ; image; image=image->next)
2080 SetImageType(image,(ImageType) sp);
2084 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2085 for ( ; image; image=image->next)
2086 SetImageProperty(image,attribute,SvPV(sval,na));
2092 if (LocaleCompare(attribute,"units") == 0)
2094 sp=SvPOK(sval) ? ParseCommandOption(MagickResolutionOptions,
2095 MagickFalse,SvPV(sval,na)) : SvIV(sval);
2098 ThrowPerlException(exception,OptionError,"UnrecognizedUnitsType",
2103 info->image_info->units=(ResolutionType) sp;
2104 for ( ; image; image=image->next)
2109 units=(ResolutionType) sp;
2110 if (image->units != units)
2111 switch (image->units)
2113 case UndefinedResolution:
2114 case PixelsPerInchResolution:
2116 if (units == PixelsPerCentimeterResolution)
2118 image->x_resolution*=2.54;
2119 image->y_resolution*=2.54;
2123 case PixelsPerCentimeterResolution:
2125 if (units == PixelsPerInchResolution)
2127 image->x_resolution/=2.54;
2128 image->y_resolution/=2.54;
2138 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2139 for ( ; image; image=image->next)
2140 SetImageProperty(image,attribute,SvPV(sval,na));
2146 if (LocaleCompare(attribute,"verbose") == 0)
2148 sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
2149 SvPV(sval,na)) : SvIV(sval);
2152 ThrowPerlException(exception,OptionError,"UnrecognizedType",
2157 info->image_info->verbose=sp != 0 ? MagickTrue : MagickFalse;
2160 if (LocaleCompare(attribute,"view") == 0)
2163 (void) CloneString(&info->image_info->view,SvPV(sval,na));
2166 if (LocaleCompare(attribute,"virtual-pixel") == 0)
2168 sp=SvPOK(sval) ? ParseCommandOption(MagickVirtualPixelOptions,
2169 MagickFalse,SvPV(sval,na)) : SvIV(sval);
2172 ThrowPerlException(exception,OptionError,
2173 "UnrecognizedVirtualPixelMethod",SvPV(sval,na));
2177 info->image_info->virtual_pixel_method=(VirtualPixelMethod) sp;
2178 for ( ; image; image=image->next)
2179 SetImageVirtualPixelMethod(image,(VirtualPixelMethod) sp);
2183 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2184 for ( ; image; image=image->next)
2185 SetImageProperty(image,attribute,SvPV(sval,na));
2191 if (LocaleCompare(attribute,"white-point") == 0)
2193 for ( ; image; image=image->next)
2195 flags=ParseGeometry(SvPV(sval,na),&geometry_info);
2196 image->chromaticity.white_point.x=geometry_info.rho;
2197 image->chromaticity.white_point.y=geometry_info.sigma;
2198 if ((flags & SigmaValue) == 0)
2199 image->chromaticity.white_point.y=
2200 image->chromaticity.white_point.x;
2205 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2206 for ( ; image; image=image->next)
2207 SetImageProperty(image,attribute,SvPV(sval,na));
2213 SetImageOption(info->image_info,attribute,SvPV(sval,na));
2214 for ( ; image; image=image->next)
2215 SetImageProperty(image,attribute,SvPV(sval,na));
2222 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2226 % S e t u p L i s t %
2230 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2232 % Method SetupList returns the list of all the images linked by their
2233 % image->next and image->previous link lists for use with ImageMagick. If
2234 % info is non-NULL, an info structure is returned in *info. If
2235 % reference_vector is non-NULL,an array of SV* are returned in
2236 % *reference_vector. Reference_vector is used when the images are going to be
2237 % replaced with new Image*'s.
2239 % The format of the SetupList routine is:
2241 % Image *SetupList(SV *reference,struct PackageInfo **info,
2242 % SV ***reference_vector,ExceptionInfo *exception)
2244 % A description of each parameter follows:
2246 % o list: a list of strings.
2248 % o string: a character string.
2250 % o exception: Return any errors or warnings in this structure.
2253 static Image *SetupList(pTHX_ SV *reference,struct PackageInfo **info,
2254 SV ***reference_vector,ExceptionInfo *exception)
2263 if (reference_vector)
2264 *reference_vector=NULL;
2269 image=GetList(aTHX_ reference,reference_vector,¤t,&last,exception);
2270 if (info && (SvTYPE(reference) == SVt_PVAV))
2271 *info=GetPackageInfo(aTHX_ (void *) reference,(struct PackageInfo *) NULL,
2277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2281 % s t r E Q c a s e %
2285 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2287 % strEQcase() compares two strings and returns 0 if they are the
2288 % same or if the second string runs out first. The comparison is case
2291 % The format of the strEQcase routine is:
2293 % ssize_t strEQcase(const char *p,const char *q)
2295 % A description of each parameter follows:
2297 % o p: a character string.
2299 % o q: a character string.
2303 static ssize_t strEQcase(const char *p,const char *q)
2311 for (i=0 ; (c=(*q)) != 0; i++)
2313 if ((isUPPER((unsigned char) c) ? toLOWER(c) : c) !=
2314 (isUPPER((unsigned char) *p) ? toLOWER(*p) : *p))
2319 return(((*q == 0) && (*p == 0)) ? i : 0);
2323 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2327 % I m a g e : : M a g i c k %
2331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2335 MODULE = Image::Magick PACKAGE = Image::Magick
2340 MagickCoreGenesis("PerlMagick",MagickFalse);
2341 SetWarningHandler(NULL);
2342 SetErrorHandler(NULL);
2343 magick_registry=NewSplayTree((int (*)(const void *,const void *))
2344 NULL,(void *(*)(void *)) NULL,(void *(*)(void *)) NULL);
2350 if (magick_registry != (SplayTreeInfo *) NULL)
2351 magick_registry=DestroySplayTree(magick_registry);
2352 MagickCoreTerminus();
2356 constant(name,argument)
2361 ###############################################################################
2369 ###############################################################################
2374 Image::Magick ref=NO_INIT
2398 PERL_UNUSED_VAR(ref);
2399 PERL_UNUSED_VAR(ix);
2400 exception=AcquireExceptionInfo();
2401 perl_exception=newSVpv("",0);
2402 package_info=(struct PackageInfo *) NULL;
2403 if (sv_isobject(ST(0)) == 0)
2405 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2409 reference=SvRV(ST(0));
2410 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
2411 if (image == (Image *) NULL)
2413 ThrowPerlException(exception,OptionError,"NoImagesDefined",
2417 package_info=ClonePackageInfo(info,exception);
2419 SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception);
2422 for (i=2; i < items; i+=2)
2423 SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),
2425 (void) AnimateImages(package_info->image_info,image);
2426 (void) CatchImageException(image);
2427 InheritException(exception,&image->exception);
2430 if (package_info != (struct PackageInfo *) NULL)
2431 DestroyPackageInfo(package_info);
2432 InheritPerlException(exception,perl_exception);
2433 exception=DestroyExceptionInfo(exception);
2434 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
2435 SvPOK_on(perl_exception);
2436 ST(0)=sv_2mortal(perl_exception);
2441 ###############################################################################
2449 ###############################################################################
2454 Image::Magick ref=NO_INIT
2492 PERL_UNUSED_VAR(ref);
2493 PERL_UNUSED_VAR(ix);
2494 exception=AcquireExceptionInfo();
2495 perl_exception=newSVpv("",0);
2499 if (sv_isobject(ST(0)) == 0)
2501 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2505 reference=SvRV(ST(0));
2506 hv=SvSTASH(reference);
2508 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
2510 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
2511 if (image == (Image *) NULL)
2513 ThrowPerlException(exception,OptionError,"NoImagesDefined",
2517 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
2522 for (i=2; i < items; i+=2)
2524 attribute=(char *) SvPV(ST(i-1),na);
2530 if (LocaleCompare(attribute,"stack") == 0)
2532 stack=ParseCommandOption(MagickBooleanOptions,MagickFalse,
2536 ThrowPerlException(exception,OptionError,"UnrecognizedType",
2542 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
2548 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
2554 image=AppendImages(image,stack != 0 ? MagickTrue : MagickFalse,exception);
2555 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
2557 for ( ; image; image=image->next)
2559 AddImageToRegistry(sv,image);
2561 av_push(av,sv_bless(rv,hv));
2564 exception=DestroyExceptionInfo(exception);
2566 SvREFCNT_dec(perl_exception);
2570 InheritPerlException(exception,perl_exception);
2571 exception=DestroyExceptionInfo(exception);
2572 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
2573 SvPOK_on(perl_exception);
2574 ST(0)=sv_2mortal(perl_exception);
2579 ###############################################################################
2587 ###############################################################################
2592 Image::Magick ref=NO_INIT
2623 PERL_UNUSED_VAR(ref);
2624 PERL_UNUSED_VAR(ix);
2625 exception=AcquireExceptionInfo();
2626 perl_exception=newSVpv("",0);
2628 if (sv_isobject(ST(0)) == 0)
2630 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2634 reference=SvRV(ST(0));
2635 hv=SvSTASH(reference);
2636 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
2637 if (image == (Image *) NULL)
2639 ThrowPerlException(exception,OptionError,"NoImagesDefined",
2643 image=EvaluateImages(image,MeanEvaluateOperator,exception);
2644 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
2647 Create blessed Perl array for the returned image.
2650 ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
2652 AddImageToRegistry(sv,image);
2654 av_push(av,sv_bless(rv,hv));
2656 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
2657 (void) FormatLocaleString(info->image_info->filename,MaxTextExtent,
2658 "average-%.*s",(int) (MaxTextExtent-9),
2659 ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
2660 (void) CopyMagickString(image->filename,info->image_info->filename,
2662 SetImageInfo(info->image_info,0,exception);
2663 exception=DestroyExceptionInfo(exception);
2664 SvREFCNT_dec(perl_exception);
2668 InheritPerlException(exception,perl_exception);
2669 exception=DestroyExceptionInfo(exception);
2670 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
2671 SvPOK_on(perl_exception);
2672 ST(0)=sv_2mortal(perl_exception);
2677 ###############################################################################
2681 # B l o b T o I m a g e #
2685 ###############################################################################
2689 BlobToImage(ref,...)
2690 Image::Magick ref=NO_INIT
2736 PERL_UNUSED_VAR(ref);
2737 PERL_UNUSED_VAR(ix);
2738 exception=AcquireExceptionInfo();
2739 perl_exception=newSVpv("",0);
2742 ac=(items < 2) ? 1 : items-1;
2743 length=(STRLEN *) NULL;
2744 list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list));
2745 if (list == (char **) NULL)
2747 ThrowPerlException(exception,ResourceLimitError,
2748 "MemoryAllocationFailed",PackageName);
2751 length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length));
2752 if (length == (STRLEN *) NULL)
2754 ThrowPerlException(exception,ResourceLimitError,
2755 "MemoryAllocationFailed",PackageName);
2758 if (sv_isobject(ST(0)) == 0)
2760 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2764 reference=SvRV(ST(0));
2765 hv=SvSTASH(reference);
2766 if (SvTYPE(reference) != SVt_PVAV)
2768 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2772 av=(AV *) reference;
2773 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
2778 ThrowPerlException(exception,OptionError,"NoBlobDefined",PackageName);
2781 for (n=0, i=0; i < ac; i++)
2783 list[n]=(char *) (SvPV(ST(i+1),length[n]));
2784 if ((items >= 3) && strEQcase((char *) SvPV(ST(i+1),na),"blob"))
2786 list[n]=(char *) (SvPV(ST(i+2),length[n]));
2791 list[n]=(char *) NULL;
2793 for (i=number_images=0; i < n; i++)
2795 image=BlobToImage(info->image_info,list[i],length[i],exception);
2796 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
2798 for ( ; image; image=image->next)
2800 AddImageToRegistry(sv,image);
2802 av_push(av,sv_bless(rv,hv));
2810 for (i=0; i < n; i++)
2811 if (list[i] != (char *) NULL)
2812 for (p=keep; list[i] != *p++; )
2813 if (*p == (char *) NULL)
2815 list[i]=(char *) RelinquishMagickMemory(list[i]);
2821 list=(char **) RelinquishMagickMemory(list);
2823 length=(STRLEN *) RelinquishMagickMemory(length);
2824 InheritPerlException(exception,perl_exception);
2825 exception=DestroyExceptionInfo(exception);
2826 sv_setiv(perl_exception,(IV) number_images);
2827 SvPOK_on(perl_exception);
2828 ST(0)=sv_2mortal(perl_exception);
2833 ###############################################################################
2841 ###############################################################################
2846 Image::Magick ref=NO_INIT
2879 PERL_UNUSED_VAR(ref);
2880 PERL_UNUSED_VAR(ix);
2881 exception=AcquireExceptionInfo();
2882 perl_exception=newSVpv("",0);
2884 if (sv_isobject(ST(0)) == 0)
2886 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
2890 reference=SvRV(ST(0));
2891 hv=SvSTASH(reference);
2892 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
2893 if (image == (Image *) NULL)
2895 ThrowPerlException(exception,OptionError,"NoImagesDefined",
2900 Create blessed Perl array for the returned image.
2903 ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
2905 for ( ; image; image=image->next)
2907 clone=CloneImage(image,0,0,MagickTrue,exception);
2908 if ((clone == (Image *) NULL) || (exception->severity >= ErrorException))
2910 AddImageToRegistry(sv,clone);
2912 av_push(av,sv_bless(rv,hv));
2915 exception=DestroyExceptionInfo(exception);
2916 SvREFCNT_dec(perl_exception);
2920 InheritPerlException(exception,perl_exception);
2921 exception=DestroyExceptionInfo(exception);
2922 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
2923 SvPOK_on(perl_exception);
2924 ST(0)=sv_2mortal(perl_exception);
2929 ###############################################################################
2937 ###############################################################################
2945 PERL_UNUSED_VAR(ref);
2946 if (magick_registry != (SplayTreeInfo *) NULL)
2951 ResetSplayTreeIterator(magick_registry);
2952 p=(Image *) GetNextKeyInSplayTree(magick_registry);
2953 while (p != (Image *) NULL)
2956 p=(Image *) GetNextKeyInSplayTree(magick_registry);
2962 ###############################################################################
2970 ###############################################################################
2975 Image::Magick ref=NO_INIT
3004 PERL_UNUSED_VAR(ref);
3005 PERL_UNUSED_VAR(ix);
3006 exception=AcquireExceptionInfo();
3007 perl_exception=newSVpv("",0);
3009 if (sv_isobject(ST(0)) == 0)
3011 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3015 reference=SvRV(ST(0));
3016 hv=SvSTASH(reference);
3018 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
3020 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3021 if (image == (Image *) NULL)
3023 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3027 image=CoalesceImages(image,exception);
3028 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
3030 for ( ; image; image=image->next)
3032 AddImageToRegistry(sv,image);
3034 av_push(av,sv_bless(rv,hv));
3037 exception=DestroyExceptionInfo(exception);
3039 SvREFCNT_dec(perl_exception);
3043 InheritPerlException(exception,perl_exception);
3044 exception=DestroyExceptionInfo(exception);
3045 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
3046 SvPOK_on(perl_exception);
3047 ST(0)=sv_2mortal(perl_exception);
3052 ###############################################################################
3060 ###############################################################################
3065 Image::Magick ref=NO_INIT
3111 PERL_UNUSED_VAR(ref);
3112 PERL_UNUSED_VAR(ix);
3113 exception=AcquireExceptionInfo();
3114 perl_exception=newSVpv("",0);
3118 if (sv_isobject(ST(0)) == 0)
3120 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3124 reference=SvRV(ST(0));
3125 hv=SvSTASH(reference);
3127 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
3129 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3130 if (image == (Image *) NULL)
3132 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3136 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
3140 reconstruct_image=image;
3141 metric=RootMeanSquaredErrorMetric;
3142 for (i=2; i < items; i+=2)
3144 attribute=(char *) SvPV(ST(i-1),na);
3150 if (LocaleCompare(attribute,"channel") == 0)
3155 option=ParseChannelOption(SvPV(ST(i),na));
3158 ThrowPerlException(exception,OptionError,
3159 "UnrecognizedType",SvPV(ST(i),na));
3162 SetPixelChannelMap(image,(ChannelType) option);
3165 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3172 if (LocaleCompare(attribute,"fuzz") == 0)
3174 image->fuzz=SiPrefixToDouble(SvPV(ST(i),na),100.0);
3177 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3184 if (LocaleCompare(attribute,"image") == 0)
3186 reconstruct_image=SetupList(aTHX_ SvRV(ST(i)),
3187 (struct PackageInfo **) NULL,(SV ***) NULL,exception);
3190 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3197 if (LocaleCompare(attribute,"metric") == 0)
3199 option=ParseCommandOption(MagickMetricOptions,MagickFalse,
3203 ThrowPerlException(exception,OptionError,"UnrecognizedType",
3207 metric=(MetricType) option;
3210 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3216 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3222 difference_image=CompareImages(image,reconstruct_image,metric,&distortion,
3224 if (difference_image != (Image *) NULL)
3226 difference_image->error.mean_error_per_pixel=distortion;
3227 AddImageToRegistry(sv,difference_image);
3229 av_push(av,sv_bless(rv,hv));
3232 exception=DestroyExceptionInfo(exception);
3234 SvREFCNT_dec(perl_exception); /* can't return warning messages */
3238 InheritPerlException(exception,perl_exception);
3239 exception=DestroyExceptionInfo(exception);
3240 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
3241 SvPOK_on(perl_exception);
3242 ST(0)=sv_2mortal(perl_exception);
3247 ###############################################################################
3251 # C o m p a r e L a y e r s #
3255 ###############################################################################
3260 Image::Magick ref=NO_INIT
3262 CompareImagesLayers = 1
3264 compareimagelayers = 3
3301 PERL_UNUSED_VAR(ref);
3302 PERL_UNUSED_VAR(ix);
3303 exception=AcquireExceptionInfo();
3304 perl_exception=newSVpv("",0);
3306 if (sv_isobject(ST(0)) == 0)
3308 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3312 reference=SvRV(ST(0));
3313 hv=SvSTASH(reference);
3315 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
3317 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3318 if (image == (Image *) NULL)
3320 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3324 method=CompareAnyLayer;
3325 for (i=2; i < items; i+=2)
3327 attribute=(char *) SvPV(ST(i-1),na);
3333 if (LocaleCompare(attribute,"method") == 0)
3335 option=ParseCommandOption(MagickLayerOptions,MagickFalse,
3339 ThrowPerlException(exception,OptionError,"UnrecognizedType",
3343 method=(ImageLayerMethod) option;
3346 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3352 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3358 image=CompareImagesLayers(image,method,exception);
3359 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
3361 for ( ; image; image=image->next)
3363 AddImageToRegistry(sv,image);
3365 av_push(av,sv_bless(rv,hv));
3368 exception=DestroyExceptionInfo(exception);
3370 SvREFCNT_dec(perl_exception);
3374 InheritPerlException(exception,perl_exception);
3375 exception=DestroyExceptionInfo(exception);
3376 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
3377 SvPOK_on(perl_exception);
3378 ST(0)=sv_2mortal(perl_exception);
3383 ###############################################################################
3391 ###############################################################################
3396 Image::Magick ref=NO_INIT
3402 PERL_UNUSED_VAR(ref);
3403 if (sv_isobject(ST(0)) == 0)
3404 croak("ReferenceIsNotMyType");
3405 reference=SvRV(ST(0));
3406 switch (SvTYPE(reference))
3411 message[MaxTextExtent];
3429 Array (AV *) reference
3431 (void) FormatLocaleString(message,MaxTextExtent,"package%s%p",
3432 XS_VERSION,reference);
3433 hv=gv_stashpv(PackageName, FALSE);
3436 gvp=(GV **) hv_fetch(hv,message,(long) strlen(message),FALSE);
3440 if (sv && (SvREFCNT(sv) == 1) && SvIOK(sv))
3442 info=(struct PackageInfo *) SvIV(sv);
3443 DestroyPackageInfo(info);
3445 key=hv_delete(hv,message,(long) strlen(message),G_DISCARD);
3455 Blessed scalar = (Image *) SvIV(reference)
3457 image=(Image *) SvIV(reference);
3458 if (image != (Image *) NULL)
3459 DeleteImageFromRegistry(reference,image);
3468 ###############################################################################
3476 ###############################################################################
3481 Image::Magick ref=NO_INIT
3505 PERL_UNUSED_VAR(ref);
3506 PERL_UNUSED_VAR(ix);
3507 exception=AcquireExceptionInfo();
3508 perl_exception=newSVpv("",0);
3509 package_info=(struct PackageInfo *) NULL;
3510 if (sv_isobject(ST(0)) == 0)
3512 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3516 reference=SvRV(ST(0));
3517 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3518 if (image == (Image *) NULL)
3520 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3524 package_info=ClonePackageInfo(info,exception);
3526 SetAttribute(aTHX_ package_info,NULL,"server",ST(1),exception);
3529 for (i=2; i < items; i+=2)
3530 SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),
3532 (void) DisplayImages(package_info->image_info,image);
3533 (void) CatchImageException(image);
3534 InheritException(exception,&image->exception);
3537 if (package_info != (struct PackageInfo *) NULL)
3538 DestroyPackageInfo(package_info);
3539 InheritPerlException(exception,perl_exception);
3540 exception=DestroyExceptionInfo(exception);
3541 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
3542 SvPOK_on(perl_exception);
3543 ST(0)=sv_2mortal(perl_exception);
3548 ###############################################################################
3552 # E v a l u a t e I m a g e s #
3556 ###############################################################################
3561 Image::Magick ref=NO_INIT
3583 MagickEvaluateOperator
3598 PERL_UNUSED_VAR(ref);
3599 PERL_UNUSED_VAR(ix);
3600 exception=AcquireExceptionInfo();
3601 perl_exception=newSVpv("",0);
3603 if (sv_isobject(ST(0)) == 0)
3605 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3609 reference=SvRV(ST(0));
3610 hv=SvSTASH(reference);
3611 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3612 if (image == (Image *) NULL)
3614 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3618 op=MeanEvaluateOperator;
3624 in=ParseCommandOption(MagickEvaluateOptions,MagickFalse,(char *)
3628 ThrowPerlException(exception,OptionError,"UnrecognizedType",
3632 op=(MagickEvaluateOperator) in;
3635 for (i=2; i < items; i+=2)
3637 attribute=(char *) SvPV(ST(i-1),na);
3643 if (LocaleCompare(attribute,"operator") == 0)
3648 in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
3649 MagickEvaluateOptions,MagickFalse,SvPV(ST(i),na));
3652 ThrowPerlException(exception,OptionError,"UnrecognizedType",
3656 op=(MagickEvaluateOperator) in;
3659 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3665 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3671 image=EvaluateImages(image,op,exception);
3672 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
3675 Create blessed Perl array for the returned image.
3678 ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
3680 AddImageToRegistry(sv,image);
3682 av_push(av,sv_bless(rv,hv));
3684 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
3685 (void) FormatLocaleString(info->image_info->filename,MaxTextExtent,
3686 "evaluate-%.*s",(int) (MaxTextExtent-9),
3687 ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
3688 (void) CopyMagickString(image->filename,info->image_info->filename,
3690 SetImageInfo(info->image_info,0,exception);
3691 exception=DestroyExceptionInfo(exception);
3692 SvREFCNT_dec(perl_exception);
3696 InheritPerlException(exception,perl_exception);
3697 exception=DestroyExceptionInfo(exception);
3698 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
3699 SvPOK_on(perl_exception);
3700 ST(0)=sv_2mortal(perl_exception);
3705 ###############################################################################
3713 ###############################################################################
3718 Image::Magick ref=NO_INIT
3725 #define ChannelFeatures(channel,direction) \
3727 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3728 channel_features[channel].angular_second_moment[direction]); \
3729 PUSHs(sv_2mortal(newSVpv(message,0))); \
3730 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3731 channel_features[channel].contrast[direction]); \
3732 PUSHs(sv_2mortal(newSVpv(message,0))); \
3733 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3734 channel_features[channel].contrast[direction]); \
3735 PUSHs(sv_2mortal(newSVpv(message,0))); \
3736 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3737 channel_features[channel].variance_sum_of_squares[direction]); \
3738 PUSHs(sv_2mortal(newSVpv(message,0))); \
3739 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3740 channel_features[channel].inverse_difference_moment[direction]); \
3741 PUSHs(sv_2mortal(newSVpv(message,0))); \
3742 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3743 channel_features[channel].sum_average[direction]); \
3744 PUSHs(sv_2mortal(newSVpv(message,0))); \
3745 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3746 channel_features[channel].sum_variance[direction]); \
3747 PUSHs(sv_2mortal(newSVpv(message,0))); \
3748 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3749 channel_features[channel].sum_entropy[direction]); \
3750 PUSHs(sv_2mortal(newSVpv(message,0))); \
3751 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3752 channel_features[channel].entropy[direction]); \
3753 PUSHs(sv_2mortal(newSVpv(message,0))); \
3754 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3755 channel_features[channel].difference_variance[direction]); \
3756 PUSHs(sv_2mortal(newSVpv(message,0))); \
3757 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3758 channel_features[channel].difference_entropy[direction]); \
3759 PUSHs(sv_2mortal(newSVpv(message,0))); \
3760 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3761 channel_features[channel].measure_of_correlation_1[direction]); \
3762 PUSHs(sv_2mortal(newSVpv(message,0))); \
3763 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3764 channel_features[channel].measure_of_correlation_2[direction]); \
3765 PUSHs(sv_2mortal(newSVpv(message,0))); \
3766 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
3767 channel_features[channel].maximum_correlation_coefficient[direction]); \
3768 PUSHs(sv_2mortal(newSVpv(message,0))); \
3776 message[MaxTextExtent];
3803 PERL_UNUSED_VAR(ref);
3804 PERL_UNUSED_VAR(ix);
3805 exception=AcquireExceptionInfo();
3806 perl_exception=newSVpv("",0);
3808 if (sv_isobject(ST(0)) == 0)
3810 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3814 reference=SvRV(ST(0));
3817 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3818 if (image == (Image *) NULL)
3820 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3824 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
3826 for (i=2; i < items; i+=2)
3828 attribute=(char *) SvPV(ST(i-1),na);
3834 if (LocaleCompare(attribute,"distance") == 0)
3836 distance=StringToLong((char *) SvPV(ST(1),na));
3839 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3845 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3852 for ( ; image; image=image->next)
3854 channel_features=GetImageFeatures(image,distance,
3856 if (channel_features == (ChannelFeatures *) NULL)
3859 EXTEND(sp,75*count);
3860 for (i=0; i < 4; i++)
3862 ChannelFeatures(RedChannel,i);
3863 ChannelFeatures(GreenChannel,i);
3864 ChannelFeatures(BlueChannel,i);
3865 if (image->colorspace == CMYKColorspace)
3866 ChannelFeatures(BlackChannel,i);
3867 if (image->matte != MagickFalse)
3868 ChannelFeatures(AlphaChannel,i);
3870 channel_features=(ChannelFeatures *)
3871 RelinquishMagickMemory(channel_features);
3875 InheritPerlException(exception,perl_exception);
3876 exception=DestroyExceptionInfo(exception);
3877 SvREFCNT_dec(perl_exception);
3881 ###############################################################################
3889 ###############################################################################
3894 Image::Magick ref=NO_INIT
3932 PERL_UNUSED_VAR(ref);
3933 PERL_UNUSED_VAR(ix);
3934 exception=AcquireExceptionInfo();
3935 perl_exception=newSVpv("",0);
3937 if (sv_isobject(ST(0)) == 0)
3939 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
3943 reference=SvRV(ST(0));
3944 hv=SvSTASH(reference);
3945 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
3946 if (image == (Image *) NULL)
3948 ThrowPerlException(exception,OptionError,"NoImagesDefined",
3952 background_color=image->background_color;
3954 (void) QueryColorDatabase((char *) SvPV(ST(1),na),&background_color,
3957 for (i=2; i < items; i+=2)
3959 attribute=(char *) SvPV(ST(i-1),na);
3965 if (LocaleCompare(attribute,"background") == 0)
3967 (void) QueryColorDatabase((char *) SvPV(ST(1),na),
3968 &background_color,exception);
3971 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3977 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
3983 image->background_color=background_color;
3984 image=MergeImageLayers(image,FlattenLayer,exception);
3985 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
3988 Create blessed Perl array for the returned image.
3991 ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
3993 AddImageToRegistry(sv,image);
3995 av_push(av,sv_bless(rv,hv));
3997 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
3998 (void) FormatLocaleString(info->image_info->filename,MaxTextExtent,
3999 "flatten-%.*s",(int) (MaxTextExtent-9),
4000 ((p=strrchr(image->filename,'/')) ? p+1 : image->filename));
4001 (void) CopyMagickString(image->filename,info->image_info->filename,
4003 SetImageInfo(info->image_info,0,exception);
4004 exception=DestroyExceptionInfo(exception);
4005 SvREFCNT_dec(perl_exception);
4009 InheritPerlException(exception,perl_exception);
4010 exception=DestroyExceptionInfo(exception);
4011 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
4012 SvPOK_on(perl_exception); /* return messages in string context */
4013 ST(0)=sv_2mortal(perl_exception);
4018 ###############################################################################
4026 ###############################################################################
4031 Image::Magick ref=NO_INIT
4043 expression[MaxTextExtent];
4071 PERL_UNUSED_VAR(ref);
4072 PERL_UNUSED_VAR(ix);
4073 exception=AcquireExceptionInfo();
4074 perl_exception=newSVpv("",0);
4078 if (sv_isobject(ST(0)) == 0)
4080 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
4084 reference=SvRV(ST(0));
4085 hv=SvSTASH(reference);
4087 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
4089 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
4090 if (image == (Image *) NULL)
4092 ThrowPerlException(exception,OptionError,"NoImagesDefined",
4096 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
4100 channel=DefaultChannels;
4101 (void) CopyMagickString(expression,"u",MaxTextExtent);
4103 (void) CopyMagickString(expression,(char *) SvPV(ST(1),na),MaxTextExtent);
4105 for (i=2; i < items; i+=2)
4107 attribute=(char *) SvPV(ST(i-1),na);
4113 if (LocaleCompare(attribute,"channel") == 0)
4118 option=ParseChannelOption(SvPV(ST(i),na));
4121 ThrowPerlException(exception,OptionError,
4122 "UnrecognizedType",SvPV(ST(i),na));
4125 channel=(ChannelType) option;
4128 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4135 if (LocaleCompare(attribute,"expression") == 0)
4137 (void) CopyMagickString(expression,SvPV(ST(i),na),
4141 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4147 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4153 channel_mask=SetPixelChannelMask(image,channel);
4154 image=FxImage(image,expression,exception);
4155 if (image != (Image *) NULL)
4156 (void) SetPixelChannelMask(image,channel_mask);
4157 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
4159 for ( ; image; image=image->next)
4161 AddImageToRegistry(sv,image);
4163 av_push(av,sv_bless(rv,hv));
4166 exception=DestroyExceptionInfo(exception);
4168 SvREFCNT_dec(perl_exception); /* can't return warning messages */
4172 InheritPerlException(exception,perl_exception);
4173 exception=DestroyExceptionInfo(exception);
4174 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
4175 SvPOK_on(perl_exception);
4176 ST(0)=sv_2mortal(perl_exception);
4181 ###############################################################################
4189 ###############################################################################
4194 Image::Magick ref=NO_INIT
4205 color[MaxTextExtent];
4230 PERL_UNUSED_VAR(ref);
4231 PERL_UNUSED_VAR(ix);
4232 exception=AcquireExceptionInfo();
4233 perl_exception=newSVpv("",0);
4234 if (sv_isobject(ST(0)) == 0)
4236 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
4240 reference=SvRV(ST(0));
4241 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
4242 if (image == (Image *) NULL && !info)
4245 for (i=1; i < items; i++)
4247 attribute=(char *) SvPV(ST(i),na);
4254 if (LocaleCompare(attribute,"adjoin") == 0)
4257 s=newSViv((ssize_t) info->image_info->adjoin);
4258 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4261 if (LocaleCompare(attribute,"antialias") == 0)
4264 s=newSViv((ssize_t) info->image_info->antialias);
4265 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4268 if (LocaleCompare(attribute,"area") == 0)
4270 s=newSViv(GetMagickResource(AreaResource));
4271 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4274 if (LocaleCompare(attribute,"attenuate") == 0)
4279 value=GetImageProperty(image,attribute);
4280 if (value != (const char *) NULL)
4282 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4285 if (LocaleCompare(attribute,"authenticate") == 0)
4288 s=newSVpv(info->image_info->authenticate,0);
4289 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4292 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4299 if (LocaleCompare(attribute,"background") == 0)
4301 if (image == (Image *) NULL)
4303 (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat ","
4304 QuantumFormat "," QuantumFormat "," QuantumFormat,
4305 image->background_color.red,image->background_color.green,
4306 image->background_color.blue,image->background_color.alpha);
4308 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4311 if (LocaleCompare(attribute,"base-columns") == 0)
4313 if (image != (Image *) NULL)
4314 s=newSViv((ssize_t) image->magick_columns);
4315 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4318 if (LocaleCompare(attribute,"base-filename") == 0)
4320 if (image != (Image *) NULL)
4321 s=newSVpv(image->magick_filename,0);
4322 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4325 if (LocaleCompare(attribute,"base-height") == 0)
4327 if (image != (Image *) NULL)
4328 s=newSViv((ssize_t) image->magick_rows);
4329 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4332 if (LocaleCompare(attribute,"base-rows") == 0)
4334 if (image != (Image *) NULL)
4335 s=newSViv((ssize_t) image->magick_rows);
4336 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4339 if (LocaleCompare(attribute,"base-width") == 0)
4341 if (image != (Image *) NULL)
4342 s=newSViv((ssize_t) image->magick_columns);
4343 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4346 if (LocaleCompare(attribute,"bias") == 0)
4348 if (image != (Image *) NULL)
4349 s=newSVnv(image->bias);
4350 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4353 if (LocaleCompare(attribute,"blue-primary") == 0)
4355 if (image == (Image *) NULL)
4357 (void) FormatLocaleString(color,MaxTextExtent,"%.15g,%.15g",
4358 image->chromaticity.blue_primary.x,
4359 image->chromaticity.blue_primary.y);
4361 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4364 if (LocaleCompare(attribute,"bordercolor") == 0)
4366 if (image == (Image *) NULL)
4368 (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat ","
4369 QuantumFormat "," QuantumFormat "," QuantumFormat,
4370 image->border_color.red,image->border_color.green,
4371 image->border_color.blue,image->border_color.alpha);
4373 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4376 if (LocaleCompare(attribute,"bounding-box") == 0)
4379 geometry[MaxTextExtent];
4384 if (image == (Image *) NULL)
4386 page=GetImageBoundingBox(image,&image->exception);
4387 (void) FormatLocaleString(geometry,MaxTextExtent,
4388 "%.20gx%.20g%+.20g%+.20g",(double) page.width,(double)
4389 page.height,(double) page.x,(double) page.y);
4390 s=newSVpv(geometry,0);
4391 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4394 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4401 if (LocaleCompare(attribute,"class") == 0)
4403 if (image == (Image *) NULL)
4405 s=newSViv(image->storage_class);
4406 (void) sv_setpv(s,CommandOptionToMnemonic(MagickClassOptions,
4407 image->storage_class));
4409 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4412 if (LocaleCompare(attribute,"clip-mask") == 0)
4414 if (image != (Image *) NULL)
4420 if (image->mask == (Image *) NULL)
4422 if (image->mask != (Image *) NULL)
4424 AddImageToRegistry(sv,image->mask);
4425 s=sv_bless(newRV(sv),SvSTASH(reference));
4428 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4431 if (LocaleCompare(attribute,"clip-path") == 0)
4433 if (image != (Image *) NULL)
4439 if (image->clip_mask == (Image *) NULL)
4441 if (image->clip_mask != (Image *) NULL)
4443 AddImageToRegistry(sv,image->clip_mask);
4444 s=sv_bless(newRV(sv),SvSTASH(reference));
4447 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4450 if (LocaleCompare(attribute,"compression") == 0)
4452 j=info ? info->image_info->compression : image ?
4453 image->compression : UndefinedCompression;
4455 if (info->image_info->compression == UndefinedCompression)
4456 j=image->compression;
4458 (void) sv_setpv(s,CommandOptionToMnemonic(MagickCompressOptions,
4461 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4464 if (LocaleCompare(attribute,"colorspace") == 0)
4466 j=image ? image->colorspace : RGBColorspace;
4468 (void) sv_setpv(s,CommandOptionToMnemonic(MagickColorspaceOptions,
4471 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4474 if (LocaleCompare(attribute,"colors") == 0)
4476 if (image != (Image *) NULL)
4477 s=newSViv((ssize_t) GetNumberColors(image,(FILE *) NULL,
4478 &image->exception));
4479 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4482 if (LocaleNCompare(attribute,"colormap",8) == 0)
4487 if (image == (Image *) NULL || !image->colormap)
4490 items=sscanf(attribute,"%*[^[][%ld",&j);
4492 if (j > (ssize_t) image->colors)
4494 (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat ","
4495 QuantumFormat "," QuantumFormat "," QuantumFormat,
4496 image->colormap[j].red,image->colormap[j].green,
4497 image->colormap[j].blue,image->colormap[j].alpha);
4499 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4502 if (LocaleCompare(attribute,"columns") == 0)
4504 if (image != (Image *) NULL)
4505 s=newSViv((ssize_t) image->columns);
4506 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4509 if (LocaleCompare(attribute,"comment") == 0)
4514 value=GetImageProperty(image,attribute);
4515 if (value != (const char *) NULL)
4517 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4520 if (LocaleCompare(attribute,"copyright") == 0)
4522 s=newSVpv(GetMagickCopyright(),0);
4523 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4526 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4533 if (LocaleCompare(attribute,"density") == 0)
4536 geometry[MaxTextExtent];
4538 if (image == (Image *) NULL)
4540 (void) FormatLocaleString(geometry,MaxTextExtent,"%.15gx%.15g",
4541 image->x_resolution,image->y_resolution);
4542 s=newSVpv(geometry,0);
4543 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4546 if (LocaleCompare(attribute,"delay") == 0)
4548 if (image != (Image *) NULL)
4549 s=newSViv((ssize_t) image->delay);
4550 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4553 if (LocaleCompare(attribute,"depth") == 0)
4555 s=newSViv(MAGICKCORE_QUANTUM_DEPTH);
4556 if (image != (Image *) NULL)
4557 s=newSViv((ssize_t) GetImageDepth(image,&image->exception));
4558 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4561 if (LocaleCompare(attribute,"directory") == 0)
4563 if (image && image->directory)
4564 s=newSVpv(image->directory,0);
4565 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4568 if (LocaleCompare(attribute,"dispose") == 0)
4570 if (image == (Image *) NULL)
4573 s=newSViv(image->dispose);
4575 CommandOptionToMnemonic(MagickDisposeOptions,image->dispose));
4577 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4580 if (LocaleCompare(attribute,"disk") == 0)
4582 s=newSViv(GetMagickResource(DiskResource));
4583 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4586 if (LocaleCompare(attribute,"dither") == 0)
4589 s=newSViv((ssize_t) info->image_info->dither);
4590 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4593 if (LocaleCompare(attribute,"display") == 0) /* same as server */
4595 if (info && info->image_info->server_name)
4596 s=newSVpv(info->image_info->server_name,0);
4597 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4600 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4607 if (LocaleCompare(attribute,"elapsed-time") == 0)
4609 if (image != (Image *) NULL)
4610 s=newSVnv(GetElapsedTime(&image->timer));
4611 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4614 if (LocaleCompare(attribute,"endian") == 0)
4616 j=info ? info->image_info->endian : image ? image->endian :
4619 (void) sv_setpv(s,CommandOptionToMnemonic(MagickEndianOptions,j));
4621 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4624 if (LocaleCompare(attribute,"error") == 0)
4626 if (image != (Image *) NULL)
4627 s=newSVnv(image->error.mean_error_per_pixel);
4628 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4631 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4638 if (LocaleCompare(attribute,"filesize") == 0)
4640 if (image != (Image *) NULL)
4641 s=newSViv((ssize_t) GetBlobSize(image));
4642 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4645 if (LocaleCompare(attribute,"filename") == 0)
4647 if (info && info->image_info->filename &&
4648 *info->image_info->filename)
4649 s=newSVpv(info->image_info->filename,0);
4650 if (image != (Image *) NULL)
4651 s=newSVpv(image->filename,0);
4652 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4655 if (LocaleCompare(attribute,"filter") == 0)
4657 s=image ? newSViv(image->filter) : newSViv(0);
4658 (void) sv_setpv(s,CommandOptionToMnemonic(MagickFilterOptions,
4661 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4664 if (LocaleCompare(attribute,"font") == 0)
4666 if (info && info->image_info->font)
4667 s=newSVpv(info->image_info->font,0);
4668 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4671 if (LocaleCompare(attribute,"foreground") == 0)
4673 if (LocaleCompare(attribute,"format") == 0)
4678 magick_info=(const MagickInfo *) NULL;
4679 if (info && (*info->image_info->magick != '\0'))
4680 magick_info=GetMagickInfo(info->image_info->magick,exception);
4681 if (image != (Image *) NULL)
4682 magick_info=GetMagickInfo(image->magick,&image->exception);
4683 if ((magick_info != (const MagickInfo *) NULL) &&
4684 (*magick_info->description != '\0'))
4685 s=newSVpv((char *) magick_info->description,0);
4686 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4689 if (LocaleCompare(attribute,"fuzz") == 0)
4692 s=newSVnv(info->image_info->fuzz);
4693 if (image != (Image *) NULL)
4694 s=newSVnv(image->fuzz);
4695 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4698 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4705 if (LocaleCompare(attribute,"gamma") == 0)
4707 if (image != (Image *) NULL)
4708 s=newSVnv(image->gamma);
4709 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4712 if (LocaleCompare(attribute,"geometry") == 0)
4714 if (image && image->geometry)
4715 s=newSVpv(image->geometry,0);
4716 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4719 if (LocaleCompare(attribute,"gravity") == 0)
4721 s=image ? newSViv(image->gravity) : newSViv(0);
4722 (void) sv_setpv(s,CommandOptionToMnemonic(MagickGravityOptions,
4725 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4728 if (LocaleCompare(attribute,"green-primary") == 0)
4730 if (image == (Image *) NULL)
4732 (void) FormatLocaleString(color,MaxTextExtent,"%.15g,%.15g",
4733 image->chromaticity.green_primary.x,
4734 image->chromaticity.green_primary.y);
4736 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4739 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4746 if (LocaleCompare(attribute,"height") == 0)
4748 if (image != (Image *) NULL)
4749 s=newSViv((ssize_t) image->rows);
4750 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4753 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4760 if (LocaleCompare(attribute,"icc") == 0)
4762 if (image != (Image *) NULL)
4767 profile=GetImageProfile(image,"icc");
4768 if (profile != (StringInfo *) NULL)
4769 s=newSVpv((const char *) GetStringInfoDatum(profile),
4770 GetStringInfoLength(profile));
4772 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4775 if (LocaleCompare(attribute,"icm") == 0)
4777 if (image != (Image *) NULL)
4782 profile=GetImageProfile(image,"icm");
4783 if (profile != (const StringInfo *) NULL)
4784 s=newSVpv((const char *) GetStringInfoDatum(profile),
4785 GetStringInfoLength(profile));
4787 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4790 if (LocaleCompare(attribute,"id") == 0)
4792 if (image != (Image *) NULL)
4803 (void) FormatLocaleString(key,MaxTextExtent,"%.20g\n",(double)
4805 status=SetImageRegistry(ImageRegistryType,key,image,
4810 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4813 if (LocaleNCompare(attribute,"index",5) == 0)
4816 name[MaxTextExtent];
4825 register const Quantum
4831 if (image == (Image *) NULL)
4833 if (image->storage_class != PseudoClass)
4837 items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
4839 image_view=AcquireCacheView(image);
4840 p=GetCacheViewVirtualPixels(image_view,x,y,1,1,&image->exception);
4841 if (p != (const Quantum *) NULL)
4843 (void) FormatLocaleString(name,MaxTextExtent,QuantumFormat,
4844 GetPixelIndex(image,p));
4846 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4848 image_view=DestroyCacheView(image_view);
4851 if (LocaleCompare(attribute,"iptc") == 0)
4853 if (image != (Image *) NULL)
4858 profile=GetImageProfile(image,"iptc");
4859 if (profile != (const StringInfo *) NULL)
4860 s=newSVpv((const char *) GetStringInfoDatum(profile),
4861 GetStringInfoLength(profile));
4863 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4866 if (LocaleCompare(attribute,"iterations") == 0) /* same as loop */
4868 if (image != (Image *) NULL)
4869 s=newSViv((ssize_t) image->iterations);
4870 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4873 if (LocaleCompare(attribute,"interlace") == 0)
4875 j=info ? info->image_info->interlace : image ? image->interlace :
4878 (void) sv_setpv(s,CommandOptionToMnemonic(MagickInterlaceOptions,
4881 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4884 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4891 if (LocaleCompare(attribute,"label") == 0)
4896 if (image == (Image *) NULL)
4898 value=GetImageProperty(image,"Label");
4899 if (value != (const char *) NULL)
4901 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4904 if (LocaleCompare(attribute,"loop") == 0) /* same as iterations */
4906 if (image != (Image *) NULL)
4907 s=newSViv((ssize_t) image->iterations);
4908 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4911 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
4918 if (LocaleCompare(attribute,"magick") == 0)
4920 if (info && *info->image_info->magick)
4921 s=newSVpv(info->image_info->magick,0);
4922 if (image != (Image *) NULL)
4923 s=newSVpv(image->magick,0);
4924 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4927 if (LocaleCompare(attribute,"map") == 0)
4929 s=newSViv(GetMagickResource(MapResource));
4930 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4933 if (LocaleCompare(attribute,"maximum-error") == 0)
4935 if (image != (Image *) NULL)
4936 s=newSVnv(image->error.normalized_maximum_error);
4937 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4940 if (LocaleCompare(attribute,"memory") == 0)
4942 s=newSViv(GetMagickResource(MemoryResource));
4943 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4946 if (LocaleCompare(attribute,"mean-error") == 0)
4948 if (image != (Image *) NULL)
4949 s=newSVnv(image->error.normalized_mean_error);
4950 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4953 if (LocaleCompare(attribute,"mime") == 0)
4955 if (info && *info->image_info->magick)
4956 s=newSVpv(MagickToMime(info->image_info->magick),0);
4957 if (image != (Image *) NULL)
4958 s=newSVpv(MagickToMime(image->magick),0);
4959 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4962 if (LocaleCompare(attribute,"mattecolor") == 0)
4964 if (image == (Image *) NULL)
4966 (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat ","
4967 QuantumFormat "," QuantumFormat "," QuantumFormat,
4968 image->matte_color.red,image->matte_color.green,
4969 image->matte_color.blue,image->matte_color.alpha);
4971 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4974 if (LocaleCompare(attribute,"matte") == 0)
4976 if (image != (Image *) NULL)
4977 s=newSViv((ssize_t) image->matte);
4978 PUSHs(s ? sv_2mortal(s) : &sv_undef);
4981 if (LocaleCompare(attribute,"mime") == 0)
4987 if (info && *info->image_info->magick)
4988 magick=info->image_info->magick;
4989 if (image != (Image *) NULL)
4990 magick=image->magick;
4996 mime=MagickToMime(magick);
4998 mime=(char *) RelinquishMagickMemory(mime);
5000 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5003 if (LocaleCompare(attribute,"monochrome") == 0)
5005 if (image == (Image *) NULL)
5007 j=info ? info->image_info->monochrome :
5008 IsImageMonochrome(image,&image->exception);
5010 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5013 if (LocaleCompare(attribute,"montage") == 0)
5015 if (image && image->montage)
5016 s=newSVpv(image->montage,0);
5017 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5020 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5027 if (LocaleCompare(attribute,"orientation") == 0)
5029 j=info ? info->image_info->orientation : image ?
5030 image->orientation : UndefinedOrientation;
5032 (void) sv_setpv(s,CommandOptionToMnemonic(MagickOrientationOptions,
5035 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5038 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5045 if (LocaleCompare(attribute,"page") == 0)
5047 if (info && info->image_info->page)
5048 s=newSVpv(info->image_info->page,0);
5049 if (image != (Image *) NULL)
5052 geometry[MaxTextExtent];
5054 (void) FormatLocaleString(geometry,MaxTextExtent,
5055 "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,
5056 (double) image->page.height,(double) image->page.x,(double)
5058 s=newSVpv(geometry,0);
5060 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5063 if (LocaleCompare(attribute,"page.x") == 0)
5065 if (image != (Image *) NULL)
5066 s=newSViv((ssize_t) image->page.x);
5067 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5070 if (LocaleCompare(attribute,"page.y") == 0)
5072 if (image != (Image *) NULL)
5073 s=newSViv((ssize_t) image->page.y);
5074 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5077 if (LocaleNCompare(attribute,"pixel",5) == 0)
5080 tuple[MaxTextExtent];
5089 register const Quantum
5092 if (image == (Image *) NULL)
5096 items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
5098 p=GetVirtualPixels(image,x,y,1,1,exception);
5099 if (image->colorspace != CMYKColorspace)
5100 (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat ","
5101 QuantumFormat "," QuantumFormat "," QuantumFormat,
5102 GetPixelRed(image,p),GetPixelGreen(image,p),
5103 GetPixelBlue(image,p),GetPixelAlpha(image,p));
5105 (void) FormatLocaleString(tuple,MaxTextExtent,QuantumFormat ","
5106 QuantumFormat "," QuantumFormat "," QuantumFormat ","
5107 QuantumFormat,GetPixelRed(image,p),GetPixelGreen(image,p),
5108 GetPixelBlue(image,p),GetPixelBlack(image,p),
5109 GetPixelAlpha(image,p));
5111 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5114 if (LocaleCompare(attribute,"pointsize") == 0)
5117 s=newSViv((ssize_t) info->image_info->pointsize);
5118 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5121 if (LocaleCompare(attribute,"preview") == 0)
5123 s=newSViv(info->image_info->preview_type);
5124 (void) sv_setpv(s,CommandOptionToMnemonic(MagickPreviewOptions,
5125 info->image_info->preview_type));
5127 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5130 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5137 if (LocaleCompare(attribute,"quality") == 0)
5140 s=newSViv((ssize_t) info->image_info->quality);
5141 if (image != (Image *) NULL)
5142 s=newSViv((ssize_t) image->quality);
5143 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5146 if (LocaleCompare(attribute,"quantum") == 0)
5149 s=newSViv((ssize_t) MAGICKCORE_QUANTUM_DEPTH);
5150 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5153 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5160 if (LocaleCompare(attribute,"rendering-intent") == 0)
5162 s=newSViv(image->rendering_intent);
5163 (void) sv_setpv(s,CommandOptionToMnemonic(MagickIntentOptions,
5164 image->rendering_intent));
5166 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5169 if (LocaleCompare(attribute,"red-primary") == 0)
5171 if (image == (Image *) NULL)
5173 (void) FormatLocaleString(color,MaxTextExtent,"%.15g,%.15g",
5174 image->chromaticity.red_primary.x,
5175 image->chromaticity.red_primary.y);
5177 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5180 if (LocaleCompare(attribute,"rows") == 0)
5182 if (image != (Image *) NULL)
5183 s=newSViv((ssize_t) image->rows);
5184 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5187 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5194 if (LocaleCompare(attribute,"sampling-factor") == 0)
5196 if (info && info->image_info->sampling_factor)
5197 s=newSVpv(info->image_info->sampling_factor,0);
5198 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5201 if (LocaleCompare(attribute,"server") == 0) /* same as display */
5203 if (info && info->image_info->server_name)
5204 s=newSVpv(info->image_info->server_name,0);
5205 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5208 if (LocaleCompare(attribute,"size") == 0)
5210 if (info && info->image_info->size)
5211 s=newSVpv(info->image_info->size,0);
5212 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5215 if (LocaleCompare(attribute,"scene") == 0)
5217 if (image != (Image *) NULL)
5218 s=newSViv((ssize_t) image->scene);
5219 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5222 if (LocaleCompare(attribute,"scenes") == 0)
5224 if (image != (Image *) NULL)
5225 s=newSViv((ssize_t) info->image_info->number_scenes);
5226 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5229 if (LocaleCompare(attribute,"signature") == 0)
5234 if (image == (Image *) NULL)
5236 (void) SignatureImage(image);
5237 value=GetImageProperty(image,"Signature");
5238 if (value != (const char *) NULL)
5240 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5243 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5250 if (LocaleCompare(attribute,"taint") == 0)
5252 if (image != (Image *) NULL)
5253 s=newSViv((ssize_t) IsTaintImage(image));
5254 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5257 if (LocaleCompare(attribute,"texture") == 0)
5259 if (info && info->image_info->texture)
5260 s=newSVpv(info->image_info->texture,0);
5261 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5264 if (LocaleCompare(attribute,"total-ink-density") == 0)
5266 s=newSViv(MAGICKCORE_QUANTUM_DEPTH);
5267 if (image != (Image *) NULL)
5268 s=newSVnv(GetImageTotalInkDensity(image));
5269 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5272 if (LocaleCompare(attribute,"transparent-color") == 0)
5274 if (image == (Image *) NULL)
5276 (void) FormatLocaleString(color,MaxTextExtent,QuantumFormat ","
5277 QuantumFormat "," QuantumFormat "," QuantumFormat,
5278 image->transparent_color.red,image->transparent_color.green,
5279 image->transparent_color.blue,image->transparent_color.alpha);
5281 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5284 if (LocaleCompare(attribute,"type") == 0)
5286 if (image == (Image *) NULL)
5288 j=(ssize_t) GetImageType(image,&image->exception);
5290 (void) sv_setpv(s,CommandOptionToMnemonic(MagickTypeOptions,j));
5292 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5295 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5302 if (LocaleCompare(attribute,"units") == 0)
5304 j=info ? info->image_info->units : image ? image->units :
5305 UndefinedResolution;
5306 if (info && (info->image_info->units == UndefinedResolution))
5309 if (j == UndefinedResolution)
5310 s=newSVpv("undefined units",0);
5312 if (j == PixelsPerInchResolution)
5313 s=newSVpv("pixels / inch",0);
5315 s=newSVpv("pixels / centimeter",0);
5316 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5319 if (LocaleCompare(attribute,"user-time") == 0)
5321 if (image != (Image *) NULL)
5322 s=newSVnv(GetUserTime(&image->timer));
5323 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5326 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5333 if (LocaleCompare(attribute,"verbose") == 0)
5336 s=newSViv((ssize_t) info->image_info->verbose);
5337 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5340 if (LocaleCompare(attribute,"version") == 0)
5342 s=newSVpv(GetMagickVersion((size_t *) NULL),0);
5343 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5346 if (LocaleCompare(attribute,"view") == 0)
5348 if (info && info->image_info->view)
5349 s=newSVpv(info->image_info->view,0);
5350 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5353 if (LocaleCompare(attribute,"virtual-pixel") == 0)
5355 if (image == (Image *) NULL)
5357 j=(ssize_t) GetImageVirtualPixelMethod(image);
5359 (void) sv_setpv(s,CommandOptionToMnemonic(
5360 MagickVirtualPixelOptions,j));
5362 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5365 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5372 if (LocaleCompare(attribute,"white-point") == 0)
5374 if (image == (Image *) NULL)
5376 (void) FormatLocaleString(color,MaxTextExtent,"%.15g,%.15g",
5377 image->chromaticity.white_point.x,
5378 image->chromaticity.white_point.y);
5380 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5383 if (LocaleCompare(attribute,"width") == 0)
5385 if (image != (Image *) NULL)
5386 s=newSViv((ssize_t) image->columns);
5387 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5390 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5397 if (LocaleCompare(attribute,"x-resolution") == 0)
5399 if (image != (Image *) NULL)
5400 s=newSVnv(image->x_resolution);
5401 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5404 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5411 if (LocaleCompare(attribute,"y-resolution") == 0)
5413 if (image != (Image *) NULL)
5414 s=newSVnv(image->y_resolution);
5415 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5418 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5425 if (image == (Image *) NULL)
5426 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5430 value=GetImageProperty(image,attribute);
5431 if (value != (const char *) NULL)
5434 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5437 if (*attribute != '%')
5438 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5445 meta=InterpretImageProperties(info ? info->image_info :
5446 (ImageInfo *) NULL,image,attribute);
5448 PUSHs(s ? sv_2mortal(s) : &sv_undef);
5449 meta=(char *) RelinquishMagickMemory(meta);
5453 exception=DestroyExceptionInfo(exception);
5454 SvREFCNT_dec(perl_exception); /* can't return warning messages */
5458 ###############################################################################
5462 # G e t A u t h e n t i c P i x e l s #
5466 ###############################################################################
5470 GetAuthenticPixels(ref,...)
5471 Image::Magick ref = NO_INIT
5473 getauthenticpixels = 1
5503 PERL_UNUSED_VAR(ref);
5504 PERL_UNUSED_VAR(ix);
5505 exception=AcquireExceptionInfo();
5506 perl_exception=newSVpv("",0);
5507 if (sv_isobject(ST(0)) == 0)
5509 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
5513 reference=SvRV(ST(0));
5515 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
5516 if (image == (Image *) NULL)
5518 ThrowPerlException(exception,OptionError,"NoImagesDefined",
5525 region.width=image->columns;
5528 (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
5529 for (i=2; i < items; i+=2)
5531 attribute=(char *) SvPV(ST(i-1),na);
5537 if (LocaleCompare(attribute,"geometry") == 0)
5539 (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion);
5542 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5549 if (LocaleCompare(attribute,"height") == 0)
5551 region.height=SvIV(ST(i));
5554 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5561 if (LocaleCompare(attribute,"x") == 0)
5563 region.x=SvIV(ST(i));
5566 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5573 if (LocaleCompare(attribute,"y") == 0)
5575 region.y=SvIV(ST(i));
5578 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5585 if (LocaleCompare(attribute,"width") == 0)
5587 region.width=SvIV(ST(i));
5590 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5596 blob=(void *) GetAuthenticPixels(image,region.x,region.y,region.width,
5597 region.height,exception);
5598 if (blob != (void *) NULL)
5602 InheritPerlException(exception,perl_exception);
5603 exception=DestroyExceptionInfo(exception);
5604 SvREFCNT_dec(perl_exception); /* throw away all errors */
5613 ###############################################################################
5617 # G e t V i r t u a l P i x e l s #
5621 ###############################################################################
5625 GetVirtualPixels(ref,...)
5626 Image::Magick ref = NO_INIT
5628 getvirtualpixels = 1
5629 AcquireImagePixels = 2
5630 acquireimagepixels = 3
5658 PERL_UNUSED_VAR(ref);
5659 PERL_UNUSED_VAR(ix);
5660 exception=AcquireExceptionInfo();
5661 perl_exception=newSVpv("",0);
5662 if (sv_isobject(ST(0)) == 0)
5664 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
5668 reference=SvRV(ST(0));
5670 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
5671 if (image == (Image *) NULL)
5673 ThrowPerlException(exception,OptionError,"NoImagesDefined",
5680 region.width=image->columns;
5683 (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
5684 for (i=2; i < items; i+=2)
5686 attribute=(char *) SvPV(ST(i-1),na);
5692 if (LocaleCompare(attribute,"geometry") == 0)
5694 (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion);
5697 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
5704 if (LocaleCompare(attribute,"height") == 0)
5706 region.height=SvIV(ST(i));
5709 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5716 if (LocaleCompare(attribute,"x") == 0)
5718 region.x=SvIV(ST(i));
5721 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5728 if (LocaleCompare(attribute,"y") == 0)
5730 region.y=SvIV(ST(i));
5733 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5740 if (LocaleCompare(attribute,"width") == 0)
5742 region.width=SvIV(ST(i));
5745 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
5751 blob=(const void *) GetVirtualPixels(image,region.x,region.y,region.width,
5752 region.height,exception);
5753 if (blob != (void *) NULL)
5757 InheritPerlException(exception,perl_exception);
5758 exception=DestroyExceptionInfo(exception);
5759 SvREFCNT_dec(perl_exception); /* throw away all errors */
5762 RETVAL = (void *) blob;
5768 ###############################################################################
5772 # G e t A u t h e n t i c M e t a c o n t e n t #
5776 ###############################################################################
5780 GetAuthenticMetacontent(ref,...)
5781 Image::Magick ref = NO_INIT
5783 getauthenticmetacontent = 1
5804 PERL_UNUSED_VAR(ref);
5805 PERL_UNUSED_VAR(ix);
5806 exception=AcquireExceptionInfo();
5807 perl_exception=newSVpv("",0);
5808 if (sv_isobject(ST(0)) == 0)
5810 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
5814 reference=SvRV(ST(0));
5816 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
5817 if (image == (Image *) NULL)
5819 ThrowPerlException(exception,OptionError,"NoImagesDefined",
5824 blob=(void *) GetAuthenticMetacontent(image);
5825 if (blob != (void *) NULL)
5829 InheritPerlException(exception,perl_exception);
5830 exception=DestroyExceptionInfo(exception);
5831 SvREFCNT_dec(perl_exception); /* throw away all errors */
5840 ###############################################################################
5844 # G e t V i r t u a l M e t a c o n t e n t #
5848 ###############################################################################
5852 GetVirtualMetacontent(ref,...)
5853 Image::Magick ref = NO_INIT
5855 getvirtualmetacontent = 1
5874 PERL_UNUSED_VAR(ref);
5875 PERL_UNUSED_VAR(ix);
5876 exception=AcquireExceptionInfo();
5877 perl_exception=newSVpv("",0);
5878 if (sv_isobject(ST(0)) == 0)
5880 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
5884 reference=SvRV(ST(0));
5886 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
5887 if (image == (Image *) NULL)
5889 ThrowPerlException(exception,OptionError,"NoImagesDefined",
5894 blob=(void *) GetVirtualMetacontent(image);
5895 if (blob != (void *) NULL)
5899 InheritPerlException(exception,perl_exception);
5900 exception=DestroyExceptionInfo(exception);
5901 SvREFCNT_dec(perl_exception); /* throw away all errors */
5910 ###############################################################################
5914 # H i s t o g r a m #
5918 ###############################################################################
5923 Image::Magick ref=NO_INIT
5934 message[MaxTextExtent];
5961 PERL_UNUSED_VAR(ref);
5962 PERL_UNUSED_VAR(ix);
5963 exception=AcquireExceptionInfo();
5964 perl_exception=newSVpv("",0);
5966 if (sv_isobject(ST(0)) == 0)
5968 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
5972 reference=SvRV(ST(0));
5975 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
5976 if (image == (Image *) NULL)
5978 ThrowPerlException(exception,OptionError,"NoImagesDefined",
5982 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
5984 for ( ; image; image=image->next)
5986 histogram=GetImageHistogram(image,&number_colors,&image->exception);
5987 if (histogram == (PixelPacket *) NULL)
5989 count+=(ssize_t) number_colors;
5991 for (i=0; i < (ssize_t) number_colors; i++)
5993 (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat,
5995 PUSHs(sv_2mortal(newSVpv(message,0)));
5996 (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat,
5997 histogram[i].green);
5998 PUSHs(sv_2mortal(newSVpv(message,0)));
5999 (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat,
6001 PUSHs(sv_2mortal(newSVpv(message,0)));
6002 if (image->colorspace == CMYKColorspace)
6004 (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat,
6005 histogram[i].black);
6006 PUSHs(sv_2mortal(newSVpv(message,0)));
6008 (void) FormatLocaleString(message,MaxTextExtent,QuantumFormat,
6009 histogram[i].alpha);
6010 PUSHs(sv_2mortal(newSVpv(message,0)));
6011 (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double)
6012 histogram[i].count);
6013 PUSHs(sv_2mortal(newSVpv(message,0)));
6015 histogram=(PixelPacket *) RelinquishMagickMemory(histogram);
6019 InheritPerlException(exception,perl_exception);
6020 exception=DestroyExceptionInfo(exception);
6021 SvREFCNT_dec(perl_exception);
6025 ###############################################################################
6033 ###############################################################################
6038 Image::Magick ref=NO_INIT
6062 register const Quantum
6076 *reference; /* reference is the SV* of ref=SvIV(reference) */
6078 PERL_UNUSED_VAR(ref);
6079 PERL_UNUSED_VAR(ix);
6080 exception=AcquireExceptionInfo();
6081 perl_exception=newSVpv("",0);
6082 reference=SvRV(ST(0));
6083 av=(AV *) reference;
6084 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
6086 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
6087 if (image == (Image *) NULL)
6089 ThrowPerlException(exception,OptionError,"NoImagesDefined",
6093 normalize=MagickTrue;
6096 region.width=image->columns;
6099 (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
6100 for (i=2; i < items; i+=2)
6102 attribute=(char *) SvPV(ST(i-1),na);
6108 if (LocaleCompare(attribute,"channel") == 0)
6113 option=ParseChannelOption(SvPV(ST(i),na));
6116 ThrowPerlException(exception,OptionError,"UnrecognizedType",
6120 SetPixelChannelMap(image,(ChannelType) option);
6123 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6130 if (LocaleCompare(attribute,"geometry") == 0)
6132 (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion);
6135 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6142 if (LocaleCompare(attribute,"normalize") == 0)
6144 option=ParseCommandOption(MagickBooleanOptions,MagickFalse,
6148 ThrowPerlException(exception,OptionError,"UnrecognizedType",
6152 normalize=option != 0 ? MagickTrue : MagickFalse;
6155 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6162 if (LocaleCompare(attribute,"x") == 0)
6164 region.x=SvIV(ST(i));
6167 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6174 if (LocaleCompare(attribute,"y") == 0)
6176 region.y=SvIV(ST(i));
6179 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6185 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6191 p=GetVirtualPixels(image,region.x,region.y,1,1,exception);
6192 if (p == (const Quantum *) NULL)
6200 if (normalize != MagickFalse)
6201 scale=1.0/QuantumRange;
6202 if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
6203 PUSHs(sv_2mortal(newSVnv(scale*GetPixelRed(image,p))));
6204 if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
6205 PUSHs(sv_2mortal(newSVnv(scale*GetPixelGreen(image,p))));
6206 if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
6207 PUSHs(sv_2mortal(newSVnv(scale*GetPixelBlue(image,p))));
6208 if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
6209 (image->colorspace == CMYKColorspace))
6210 PUSHs(sv_2mortal(newSVnv(scale*GetPixelBlack(image,p))));
6211 if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
6212 PUSHs(sv_2mortal(newSVnv(scale*GetPixelAlpha(image,p))));
6216 InheritPerlException(exception,perl_exception);
6217 exception=DestroyExceptionInfo(exception);
6218 SvREFCNT_dec(perl_exception);
6222 ###############################################################################
6226 # G e t P i x e l s #
6230 ###############################################################################
6235 Image::Magick ref=NO_INIT
6274 *reference; /* reference is the SV* of ref=SvIV(reference) */
6276 PERL_UNUSED_VAR(ref);
6277 PERL_UNUSED_VAR(ix);
6278 exception=AcquireExceptionInfo();
6279 perl_exception=newSVpv("",0);
6280 reference=SvRV(ST(0));
6281 av=(AV *) reference;
6282 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
6284 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
6285 if (image == (Image *) NULL)
6287 ThrowPerlException(exception,OptionError,"NoImagesDefined",
6292 if (image->matte != MagickFalse)
6294 if (image->colorspace == CMYKColorspace)
6297 if (image->matte != MagickFalse)
6300 normalize=MagickFalse;
6303 region.width=image->columns;
6306 (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
6307 for (i=2; i < items; i+=2)
6309 attribute=(char *) SvPV(ST(i-1),na);
6315 if (LocaleCompare(attribute,"geometry") == 0)
6317 (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion);
6320 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6327 if (LocaleCompare(attribute,"height") == 0)
6329 region.height=SvIV(ST(i));
6332 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6339 if (LocaleCompare(attribute,"map") == 0)
6344 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6351 if (LocaleCompare(attribute,"normalize") == 0)
6353 option=ParseCommandOption(MagickBooleanOptions,MagickFalse,
6357 ThrowPerlException(exception,OptionError,"UnrecognizedType",
6361 normalize=option != 0 ? MagickTrue : MagickFalse;
6364 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6371 if (LocaleCompare(attribute,"width") == 0)
6373 region.width=SvIV(ST(i));
6376 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6383 if (LocaleCompare(attribute,"x") == 0)
6385 region.x=SvIV(ST(i));
6388 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6395 if (LocaleCompare(attribute,"y") == 0)
6397 region.y=SvIV(ST(i));
6400 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6406 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6412 if (normalize != MagickFalse)
6417 pixels=(float *) AcquireQuantumMemory(strlen(map)*region.width,
6418 region.height*sizeof(*pixels));
6419 if (pixels == (float *) NULL)
6421 ThrowPerlException(exception,ResourceLimitError,
6422 "MemoryAllocationFailed",PackageName);
6425 status=ExportImagePixels(image,region.x,region.y,region.width,
6426 region.height,map,FloatPixel,pixels,exception);
6427 if (status == MagickFalse)
6431 EXTEND(sp,strlen(map)*region.width*region.height);
6432 for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++)
6433 PUSHs(sv_2mortal(newSVnv(pixels[i])));
6435 pixels=(float *) RelinquishMagickMemory(pixels);
6442 pixels=(Quantum *) AcquireQuantumMemory(strlen(map)*region.width,
6443 region.height*sizeof(*pixels));
6444 if (pixels == (Quantum *) NULL)
6446 ThrowPerlException(exception,ResourceLimitError,
6447 "MemoryAllocationFailed",PackageName);
6450 status=ExportImagePixels(image,region.x,region.y,region.width,
6451 region.height,map,QuantumPixel,pixels,exception);
6452 if (status == MagickFalse)
6456 EXTEND(sp,strlen(map)*region.width*region.height);
6457 for (i=0; i < (ssize_t) (strlen(map)*region.width*region.height); i++)
6458 PUSHs(sv_2mortal(newSViv(pixels[i])));
6460 pixels=(Quantum *) RelinquishMagickMemory(pixels);
6464 InheritPerlException(exception,perl_exception);
6465 exception=DestroyExceptionInfo(exception);
6466 SvREFCNT_dec(perl_exception);
6470 ###############################################################################
6474 # I m a g e T o B l o b #
6478 ###############################################################################
6482 ImageToBlob(ref,...)
6483 Image::Magick ref=NO_INIT
6492 filename[MaxTextExtent];
6521 PERL_UNUSED_VAR(ref);
6522 PERL_UNUSED_VAR(ix);
6523 exception=AcquireExceptionInfo();
6524 perl_exception=newSVpv("",0);
6525 package_info=(struct PackageInfo *) NULL;
6526 if (sv_isobject(ST(0)) == 0)
6528 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
6532 reference=SvRV(ST(0));
6533 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
6534 if (image == (Image *) NULL)
6536 ThrowPerlException(exception,OptionError,"NoImagesDefined",
6540 package_info=ClonePackageInfo(info,exception);
6541 for (i=2; i < items; i+=2)
6542 SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),exception);
6543 (void) CopyMagickString(filename,package_info->image_info->filename,
6546 for (next=image; next; next=next->next)
6548 (void) CopyMagickString(next->filename,filename,MaxTextExtent);
6549 next->scene=scene++;
6551 SetImageInfo(package_info->image_info,(unsigned int)
6552 GetImageListLength(image),&image->exception);
6553 EXTEND(sp,(ssize_t) GetImageListLength(image));
6554 for ( ; image; image=image->next)
6557 blob=ImagesToBlob(package_info->image_info,image,&length,exception);
6558 if (blob != (char *) NULL)
6560 PUSHs(sv_2mortal(newSVpv((const char *) blob,length)));
6561 blob=(unsigned char *) RelinquishMagickMemory(blob);
6563 if (package_info->image_info->adjoin)
6568 if (package_info != (struct PackageInfo *) NULL)
6569 DestroyPackageInfo(package_info);
6570 InheritPerlException(exception,perl_exception);
6571 exception=DestroyExceptionInfo(exception);
6572 SvREFCNT_dec(perl_exception); /* throw away all errors */
6576 ###############################################################################
6584 ###############################################################################
6589 Image::Magick ref=NO_INIT
6593 OptimizeImageLayers = 3
6595 optimizeimagelayers = 5
6637 PERL_UNUSED_VAR(ref);
6638 PERL_UNUSED_VAR(ix);
6639 exception=AcquireExceptionInfo();
6640 perl_exception=newSVpv("",0);
6642 if (sv_isobject(ST(0)) == 0)
6644 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
6648 reference=SvRV(ST(0));
6649 hv=SvSTASH(reference);
6651 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
6653 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
6654 if (image == (Image *) NULL)
6656 ThrowPerlException(exception,OptionError,"NoImagesDefined",
6660 compose=image->compose;
6661 method=OptimizeLayer;
6662 for (i=2; i < items; i+=2)
6664 attribute=(char *) SvPV(ST(i-1),na);
6670 if (LocaleCompare(attribute,"compose") == 0)
6672 sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
6673 MagickComposeOptions,MagickFalse,SvPV(ST(i),na));
6676 ThrowPerlException(exception,OptionError,"UnrecognizedType",
6680 compose=(CompositeOperator) sp;
6683 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6690 if (LocaleCompare(attribute,"method") == 0)
6692 option=ParseCommandOption(MagickLayerOptions,MagickFalse,
6696 ThrowPerlException(exception,OptionError,"UnrecognizedType",
6700 method=(ImageLayerMethod) option;
6703 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6709 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
6715 layers=(Image *) NULL;
6718 case CompareAnyLayer:
6719 case CompareClearLayer:
6720 case CompareOverlayLayer:
6723 layers=CompareImagesLayers(image,method,exception);
6730 layers=MergeImageLayers(image,method,exception);
6735 layers=DisposeImages(image,exception);
6738 case OptimizeImageLayer:
6740 layers=OptimizeImageLayers(image,exception);
6743 case OptimizePlusLayer:
6745 layers=OptimizePlusImageLayers(image,exception);
6748 case OptimizeTransLayer:
6750 OptimizeImageTransparency(image,exception);
6751 InheritException(&(image->exception),exception);
6754 case RemoveDupsLayer:
6756 RemoveDuplicateLayers(&image,exception);
6757 InheritException(&(image->exception),exception);
6760 case RemoveZeroLayer:
6762 RemoveZeroDelayLayers(&image,exception);
6763 InheritException(&(image->exception),exception);
6772 General Purpose, GIF Animation Optimizer.
6774 layers=CoalesceImages(image,exception);
6775 if (layers == (Image *) NULL)
6777 InheritException(&(layers->exception),exception);
6779 layers=OptimizeImageLayers(image,exception);
6780 if (layers == (Image *) NULL)
6782 InheritException(&(layers->exception),exception);
6783 image=DestroyImageList(image);
6785 layers=(Image *) NULL;
6786 OptimizeImageTransparency(image,exception);
6787 InheritException(&(image->exception),exception);
6788 quantize_info=AcquireQuantizeInfo(info->image_info);
6789 (void) RemapImages(quantize_info,image,(Image *) NULL);
6790 quantize_info=DestroyQuantizeInfo(quantize_info);
6793 case CompositeLayer:
6802 Split image sequence at the first 'NULL:' image.
6805 while (source != (Image *) NULL)
6807 source=GetNextImageInList(source);
6808 if ((source != (Image *) NULL) &&
6809 (LocaleCompare(source->magick,"NULL") == 0))
6812 if (source != (Image *) NULL)
6814 if ((GetPreviousImageInList(source) == (Image *) NULL) ||
6815 (GetNextImageInList(source) == (Image *) NULL))
6816 source=(Image *) NULL;
6820 Separate the two lists, junk the null: image.
6822 source=SplitImageList(source->previous);
6823 DeleteImageFromList(&source);
6826 if (source == (Image *) NULL)
6828 (void) ThrowMagickException(exception,GetMagickModule(),
6829 OptionError,"MissingNullSeparator","layers Composite");
6833 Adjust offset with gravity and virtual canvas.
6835 SetGeometry(image,&geometry);
6836 (void) ParseAbsoluteGeometry(image->geometry,&geometry);
6837 geometry.width=source->page.width != 0 ? source->page.width :
6839 geometry.height=source->page.height != 0 ? source->page.height :
6841 GravityAdjustGeometry(image->page.width != 0 ? image->page.width :
6842 image->columns,image->page.height != 0 ? image->page.height :
6843 image->rows,image->gravity,&geometry);
6844 CompositeLayers(image,compose,source,geometry.x,geometry.y,exception);
6845 source=DestroyImageList(source);
6846 InheritException(&(image->exception),exception);
6850 if (layers != (Image *) NULL)
6852 InheritException(&(layers->exception),exception);
6855 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
6857 for ( ; image; image=image->next)
6859 AddImageToRegistry(sv,image);
6861 av_push(av,sv_bless(rv,hv));
6864 exception=DestroyExceptionInfo(exception);
6866 SvREFCNT_dec(perl_exception);
6870 InheritPerlException(exception,perl_exception);
6871 exception=DestroyExceptionInfo(exception);
6872 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
6873 SvPOK_on(perl_exception);
6874 ST(0)=sv_2mortal(perl_exception);
6879 ###############################################################################
6883 # M a g i c k T o M i m e #
6887 ###############################################################################
6891 MagickToMime(ref,name)
6892 Image::Magick ref=NO_INIT
6901 PERL_UNUSED_VAR(ref);
6902 PERL_UNUSED_VAR(ix);
6903 mime=MagickToMime(name);
6904 RETVAL=newSVpv(mime,0);
6905 mime=(char *) RelinquishMagickMemory(mime);
6911 ###############################################################################
6919 ###############################################################################
6924 Image::Magick ref=NO_INIT
6961 MedianConvolveImage = 36
6967 ReduceNoiseImage = 42
6993 ColorFloodfillImage= 68
6999 CycleColormapImage = 74
7009 MatteFloodfillImage= 84
7017 NumberColorsImage = 92
7027 SignatureImage = 102
7037 TransparentImage = 112
7039 ThresholdImage = 114
7053 DeconstructImage = 130
7055 GaussianBlurImage = 132
7061 UnsharpMaskImage = 138
7063 MotionBlurImage = 140
7065 OrderedDitherImage = 142
7072 AffineTransform = 149
7073 AffineTransformImage = 150
7075 DifferenceImage = 152
7076 AdaptiveThreshold = 153
7077 AdaptiveThresholdImage = 154
7082 BlackThreshold = 159
7083 BlackThresholdImage= 160
7084 WhiteThreshold = 161
7085 WhiteThresholdImage= 162
7087 RadialBlurImage = 164
7089 ThumbnailImage = 166
7099 PosterizeImage = 176
7105 SepiaToneImage = 182
7106 SigmoidalContrast = 183
7107 SigmoidalContrastImage = 184
7112 ContrastStretch = 189
7113 ContrastStretchImage = 190
7118 AdaptiveSharpen = 195
7119 AdaptiveSharpenImage = 196
7121 TransposeImage = 198
7123 TransverseImage = 200
7125 AutoOrientImage = 202
7127 AdaptiveBlurImage = 204
7131 UniqueColorsImage = 208
7132 AdaptiveResize = 209
7133 AdaptiveResizeImage= 210
7137 LinearStretchImage = 214
7144 FloodfillPaint = 221
7145 FloodfillPaintImage= 222
7151 LiquidRescaleImage = 228
7161 SparseColorImage = 238
7165 SelectiveBlurImage = 242
7169 BlueShiftImage = 246
7170 ForwardFourierTransform = 247
7171 ForwardFourierTransformImage = 248
7172 InverseFourierTransform = 249
7173 InverseFourierTransformImage = 250
7174 ColorDecisionList = 251
7175 ColorDecisionListImage = 252
7177 AutoGammaImage = 254
7179 AutoLevelImage = 256
7181 LevelImageColors = 258
7184 BrightnessContrast = 263
7185 BrightnessContrastImage = 264
7187 MorphologyImage = 266
7189 ColorMatrixImage = 268
7195 StatisticImage = 274
7204 attribute_flag[MaxArguments],
7205 message[MaxTextExtent];
7266 argument_list[MaxArguments];
7268 PERL_UNUSED_VAR(ref);
7269 PERL_UNUSED_VAR(ix);
7270 exception=AcquireExceptionInfo();
7271 perl_exception=newSVpv("",0);
7272 reference_vector=NULL;
7276 if (sv_isobject(ST(0)) == 0)
7278 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
7282 reference=SvRV(ST(0));
7283 region_info.width=0;
7284 region_info.height=0;
7287 region_image=(Image *) NULL;
7288 image=SetupList(aTHX_ reference,&info,&reference_vector,exception);
7289 if (ix && (ix != 666))
7292 Called as Method(...)
7295 rp=(&Methods[ix-1]);
7301 Called as Mogrify("Method",...)
7303 attribute=(char *) SvPV(ST(1),na);
7306 flags=ParseGravityGeometry(image,attribute,®ion_info,exception);
7307 attribute=(char *) SvPV(ST(2),na);
7310 for (rp=Methods; ; rp++)
7312 if (rp >= EndOf(Methods))
7314 ThrowPerlException(exception,OptionError,
7315 "UnrecognizedPerlMagickMethod",attribute);
7318 if (strEQcase(attribute,rp->name))
7324 if (image == (Image *) NULL)
7326 ThrowPerlException(exception,OptionError,"NoImagesDefined",attribute);
7329 Zero(&argument_list,NumberOf(argument_list),struct ArgumentList);
7330 Zero(&attribute_flag,NumberOf(attribute_flag),char);
7331 for (i=base; (i < items) || ((i == items) && (base == items)); i+=2)
7348 pp=(Arguments *) NULL;
7356 for (sv=ST(i), attribute=(char *) SvPV(ST(i-1),na); ; qq++)
7358 if ((qq >= EndOf(rp->arguments)) || (qq->method == NULL))
7360 if (strEQcase(attribute,qq->method) > ssize_test)
7363 ssize_test=strEQcase(attribute,qq->method);
7366 if (pp == (Arguments *) NULL)
7368 ThrowPerlException(exception,OptionError,"UnrecognizedOption",
7370 goto continue_outer_loop;
7372 al=(&argument_list[pp-rp->arguments]);
7375 case ArrayReference:
7377 if (SvTYPE(sv) != SVt_RV)
7379 (void) FormatLocaleString(message,MaxTextExtent,
7380 "invalid %.60s value",pp->method);
7381 ThrowPerlException(exception,OptionError,message,SvPV(sv,na));
7382 goto continue_outer_loop;
7384 al->array_reference=SvRV(sv);
7389 al->real_reference=SvNV(sv);
7394 al->file_reference=(FILE *) PerlIO_findFILE(IoIFP(sv_2io(sv)));
7397 case ImageReference:
7399 if (!sv_isobject(sv) ||
7400 !(al->image_reference=SetupList(aTHX_ SvRV(sv),
7401 (struct PackageInfo **) NULL,(SV ***) NULL,exception)))
7403 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
7409 case IntegerReference:
7411 al->integer_reference=SvIV(sv);
7414 case StringReference:
7416 al->string_reference=(char *) SvPV(sv,al->length);
7417 if (sv_isobject(sv))
7418 al->image_reference=SetupList(aTHX_ SvRV(sv),
7419 (struct PackageInfo **) NULL,(SV ***) NULL,exception);
7425 Is a string; look up name.
7427 if ((al->length > 1) && (*(char *) SvPV(sv,al->length) == '@'))
7429 al->string_reference=(char *) SvPV(sv,al->length);
7430 al->integer_reference=(-1);
7433 al->integer_reference=ParseCommandOption((CommandOption) pp->type,
7434 MagickFalse,SvPV(sv,na));
7435 if (pp->type == MagickChannelOptions)
7436 al->integer_reference=ParseChannelOption(SvPV(sv,na));
7437 if ((al->integer_reference < 0) && ((al->integer_reference=SvIV(sv)) <= 0))
7439 (void) FormatLocaleString(message,MaxTextExtent,
7440 "invalid %.60s value",pp->method);
7441 ThrowPerlException(exception,OptionError,message,SvPV(sv,na));
7442 goto continue_outer_loop;
7447 attribute_flag[pp-rp->arguments]++;
7448 continue_outer_loop: ;
7450 (void) ResetMagickMemory((char *) &fill_color,0,sizeof(fill_color));
7451 pv=reference_vector;
7452 SetGeometryInfo(&geometry_info);
7453 channel=DefaultChannels;
7454 for (next=image; next; next=next->next)
7457 SetGeometry(image,&geometry);
7458 if ((region_info.width*region_info.height) != 0)
7461 image=CropImage(image,®ion_info,exception);
7467 (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double) ix);
7468 ThrowPerlException(exception,OptionError,
7469 "UnrecognizedPerlMagickMethod",message);
7472 case 1: /* Comment */
7474 if (attribute_flag[0] == 0)
7475 argument_list[0].string_reference=(char *) NULL;
7476 (void) SetImageProperty(image,"comment",InterpretImageProperties(
7477 info ? info->image_info : (ImageInfo *) NULL,image,
7478 argument_list[0].string_reference));
7483 if (attribute_flag[0] == 0)
7484 argument_list[0].string_reference=(char *) NULL;
7485 (void) SetImageProperty(image,"label",InterpretImageProperties(
7486 info ? info->image_info : (ImageInfo *) NULL,image,
7487 argument_list[0].string_reference));
7490 case 3: /* AddNoise */
7492 if (attribute_flag[0] == 0)
7493 argument_list[0].integer_reference=UniformNoise;
7494 if (attribute_flag[1] != 0)
7495 channel=(ChannelType) argument_list[1].integer_reference;
7496 channel_mask=SetPixelChannelMask(image,channel);
7497 image=AddNoiseImage(image,(NoiseType)
7498 argument_list[0].integer_reference,exception);
7499 if (image != (Image *) NULL)
7500 (void) SetPixelChannelMask(image,channel_mask);
7503 case 4: /* Colorize */
7508 (void) GetOneVirtualPixel(image,0,0,&target,exception);
7509 if (attribute_flag[0] != 0)
7510 (void) QueryColorDatabase(argument_list[0].string_reference,&target,
7512 if (attribute_flag[1] == 0)
7513 argument_list[1].string_reference="100%";
7514 image=ColorizeImage(image,argument_list[1].string_reference,target,
7518 case 5: /* Border */
7522 if (attribute_flag[0] != 0)
7524 flags=ParsePageGeometry(image,argument_list[0].string_reference,
7525 &geometry,exception);
7526 if ((flags & HeightValue) == 0)
7527 geometry.height=geometry.width;
7529 if (attribute_flag[1] != 0)
7530 geometry.width=argument_list[1].integer_reference;
7531 if (attribute_flag[2] != 0)
7532 geometry.height=argument_list[2].integer_reference;
7533 if (attribute_flag[3] != 0)
7534 QueryColorDatabase(argument_list[3].string_reference,
7535 &image->border_color,exception);
7536 if (attribute_flag[4] != 0)
7537 QueryColorDatabase(argument_list[4].string_reference,
7538 &image->border_color,exception);
7539 if (attribute_flag[5] != 0)
7540 QueryColorDatabase(argument_list[5].string_reference,
7541 &image->border_color,exception);
7542 if (attribute_flag[6] != 0)
7543 image->compose=(CompositeOperator) argument_list[6].integer_reference;
7544 image=BorderImage(image,&geometry,exception);
7549 if (attribute_flag[0] != 0)
7551 flags=ParseGeometry(argument_list[0].string_reference,
7553 if ((flags & SigmaValue) == 0)
7554 geometry_info.sigma=1.0;
7556 if (attribute_flag[1] != 0)
7557 geometry_info.rho=argument_list[1].real_reference;
7558 if (attribute_flag[2] != 0)
7559 geometry_info.sigma=argument_list[2].real_reference;
7560 if (attribute_flag[3] != 0)
7561 channel=(ChannelType) argument_list[3].integer_reference;
7562 channel_mask=SetPixelChannelMask(image,channel);
7563 image=BlurImage(image,geometry_info.rho,geometry_info.sigma,
7565 if (image != (Image *) NULL)
7566 (void) SetPixelChannelMask(image,channel_mask);
7571 if (attribute_flag[0] != 0)
7572 flags=ParseGravityGeometry(image,argument_list[0].string_reference,
7573 &geometry,exception);
7574 if (attribute_flag[1] != 0)
7575 geometry.width=argument_list[1].integer_reference;
7576 if (attribute_flag[2] != 0)
7577 geometry.height=argument_list[2].integer_reference;
7578 if (attribute_flag[3] != 0)
7579 geometry.x=argument_list[3].integer_reference;
7580 if (attribute_flag[4] != 0)
7581 geometry.y=argument_list[4].integer_reference;
7582 image=ChopImage(image,&geometry,exception);
7587 if (attribute_flag[6] != 0)
7588 image->gravity=(GravityType) argument_list[6].integer_reference;
7589 if (attribute_flag[0] != 0)
7590 flags=ParseGravityGeometry(image,argument_list[0].string_reference,
7591 &geometry,exception);
7592 if (attribute_flag[1] != 0)
7593 geometry.width=argument_list[1].integer_reference;
7594 if (attribute_flag[2] != 0)
7595 geometry.height=argument_list[2].integer_reference;
7596 if (attribute_flag[3] != 0)
7597 geometry.x=argument_list[3].integer_reference;
7598 if (attribute_flag[4] != 0)
7599 geometry.y=argument_list[4].integer_reference;
7600 if (attribute_flag[5] != 0)
7602 SiPrefixToDouble(argument_list[5].string_reference,QuantumRange);
7603 image=CropImage(image,&geometry,exception);
7606 case 9: /* Despeckle */
7608 image=DespeckleImage(image,exception);
7613 if (attribute_flag[0] != 0)
7614 geometry_info.rho=argument_list[0].real_reference;
7615 image=EdgeImage(image,geometry_info.rho,exception);
7618 case 11: /* Emboss */
7620 if (attribute_flag[0] != 0)
7622 flags=ParseGeometry(argument_list[0].string_reference,
7624 if ((flags & SigmaValue) == 0)
7625 geometry_info.sigma=1.0;
7627 if (attribute_flag[1] != 0)
7628 geometry_info.rho=argument_list[1].real_reference;
7629 if (attribute_flag[2] != 0)
7630 geometry_info.sigma=argument_list[2].real_reference;
7631 image=EmbossImage(image,geometry_info.rho,geometry_info.sigma,
7635 case 12: /* Enhance */
7637 image=EnhanceImage(image,exception);
7642 image=FlipImage(image,exception);
7647 image=FlopImage(image,exception);
7650 case 15: /* Frame */
7655 if (attribute_flag[0] != 0)
7657 flags=ParsePageGeometry(image,argument_list[0].string_reference,
7658 &geometry,exception);
7659 if ((flags & HeightValue) == 0)
7660 geometry.height=geometry.width;
7661 frame_info.width=geometry.width;
7662 frame_info.height=geometry.height;
7663 frame_info.outer_bevel=geometry.x;
7664 frame_info.inner_bevel=geometry.y;
7666 if (attribute_flag[1] != 0)
7667 frame_info.width=argument_list[1].integer_reference;
7668 if (attribute_flag[2] != 0)
7669 frame_info.height=argument_list[2].integer_reference;
7670 if (attribute_flag[3] != 0)
7671 frame_info.inner_bevel=argument_list[3].integer_reference;
7672 if (attribute_flag[4] != 0)
7673 frame_info.outer_bevel=argument_list[4].integer_reference;
7674 if (attribute_flag[5] != 0)
7675 QueryColorDatabase(argument_list[5].string_reference,&fill_color,
7677 if (attribute_flag[6] != 0)
7678 QueryColorDatabase(argument_list[6].string_reference,&fill_color,
7680 frame_info.x=(ssize_t) frame_info.width;
7681 frame_info.y=(ssize_t) frame_info.height;
7682 frame_info.width=image->columns+2*frame_info.x;
7683 frame_info.height=image->rows+2*frame_info.y;
7684 if ((attribute_flag[5] != 0) || (attribute_flag[6] != 0))
7685 image->matte_color=fill_color;
7686 if (attribute_flag[7] != 0)
7687 image->compose=(CompositeOperator) argument_list[7].integer_reference;
7688 image=FrameImage(image,&frame_info,exception);
7691 case 16: /* Implode */
7693 if (attribute_flag[0] == 0)
7694 argument_list[0].real_reference=0.5;
7695 if (attribute_flag[1] != 0)
7696 image->interpolate=(InterpolatePixelMethod)
7697 argument_list[1].integer_reference;
7698 image=ImplodeImage(image,argument_list[0].real_reference,
7702 case 17: /* Magnify */
7704 image=MagnifyImage(image,exception);
7707 case 18: /* MedianFilter */
7709 if (attribute_flag[0] != 0)
7711 flags=ParseGeometry(argument_list[0].string_reference,
7713 if ((flags & SigmaValue) == 0)
7714 geometry_info.sigma=1.0;
7716 if (attribute_flag[1] != 0)
7717 geometry_info.rho=argument_list[1].real_reference;
7718 if (attribute_flag[2] != 0)
7719 geometry_info.sigma=argument_list[2].real_reference;
7720 if (attribute_flag[3] != 0)
7721 channel=(ChannelType) argument_list[3].integer_reference;
7722 channel_mask=SetPixelChannelMask(image,channel);
7723 image=StatisticImage(image,MedianStatistic,(size_t) geometry_info.rho,
7724 (size_t) geometry_info.sigma,exception);
7725 if (image != (Image *) NULL)
7726 (void) SetPixelChannelMask(image,channel_mask);
7729 case 19: /* Minify */
7731 image=MinifyImage(image,exception);
7734 case 20: /* OilPaint */
7736 if (attribute_flag[0] == 0)
7737 argument_list[0].real_reference=0.0;
7738 image=OilPaintImage(image,argument_list[0].real_reference,
7742 case 21: /* ReduceNoise */
7744 if (attribute_flag[0] != 0)
7746 flags=ParseGeometry(argument_list[0].string_reference,
7748 if ((flags & SigmaValue) == 0)
7749 geometry_info.sigma=1.0;
7751 if (attribute_flag[1] != 0)
7752 geometry_info.rho=argument_list[1].real_reference;
7753 if (attribute_flag[2] != 0)
7754 geometry_info.sigma=argument_list[2].real_reference;
7755 if (attribute_flag[3] != 0)
7756 channel=(ChannelType) argument_list[3].integer_reference;
7757 channel_mask=SetPixelChannelMask(image,channel);
7758 image=StatisticImage(image,NonpeakStatistic,(size_t)
7759 geometry_info.rho,(size_t) geometry_info.sigma,exception);
7760 if (image != (Image *) NULL)
7761 (void) SetPixelChannelMask(image,channel_mask);
7766 if (attribute_flag[0] != 0)
7767 flags=ParsePageGeometry(image,argument_list[0].string_reference,
7768 &geometry,exception);
7769 if (attribute_flag[1] != 0)
7770 geometry.x=argument_list[1].integer_reference;
7771 if (attribute_flag[2] != 0)
7772 geometry.y=argument_list[2].integer_reference;
7773 image=RollImage(image,geometry.x,geometry.y,exception);
7776 case 23: /* Rotate */
7778 if (attribute_flag[0] == 0)
7779 argument_list[0].real_reference=90.0;
7780 if (attribute_flag[1] != 0)
7781 QueryColorDatabase(argument_list[1].string_reference,
7782 &image->background_color,exception);
7783 if (attribute_flag[2] != 0)
7784 QueryColorDatabase(argument_list[2].string_reference,
7785 &image->background_color,exception);
7786 if (attribute_flag[3] != 0)
7787 QueryColorDatabase(argument_list[3].string_reference,
7788 &image->background_color,exception);
7789 image=RotateImage(image,argument_list[0].real_reference,exception);
7792 case 24: /* Sample */
7794 if (attribute_flag[0] != 0)
7795 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
7796 &geometry,exception);
7797 if (attribute_flag[1] != 0)
7798 geometry.width=argument_list[1].integer_reference;
7799 if (attribute_flag[2] != 0)
7800 geometry.height=argument_list[2].integer_reference;
7801 image=SampleImage(image,geometry.width,geometry.height,exception);
7804 case 25: /* Scale */
7806 if (attribute_flag[0] != 0)
7807 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
7808 &geometry,exception);
7809 if (attribute_flag[1] != 0)
7810 geometry.width=argument_list[1].integer_reference;
7811 if (attribute_flag[2] != 0)
7812 geometry.height=argument_list[2].integer_reference;
7813 image=ScaleImage(image,geometry.width,geometry.height,exception);
7816 case 26: /* Shade */
7818 if (attribute_flag[0] != 0)
7820 flags=ParseGeometry(argument_list[0].string_reference,
7822 if ((flags & SigmaValue) == 0)
7823 geometry_info.sigma=0.0;
7825 if (attribute_flag[1] != 0)
7826 geometry_info.rho=argument_list[1].real_reference;
7827 if (attribute_flag[2] != 0)
7828 geometry_info.sigma=argument_list[2].real_reference;
7829 image=ShadeImage(image,
7830 argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse,
7831 geometry_info.rho,geometry_info.sigma,exception);
7834 case 27: /* Sharpen */
7836 if (attribute_flag[0] != 0)
7838 flags=ParseGeometry(argument_list[0].string_reference,
7840 if ((flags & SigmaValue) == 0)
7841 geometry_info.sigma=1.0;
7843 if (attribute_flag[1] != 0)
7844 geometry_info.rho=argument_list[1].real_reference;
7845 if (attribute_flag[2] != 0)
7846 geometry_info.sigma=argument_list[2].real_reference;
7847 if (attribute_flag[3] != 0)
7848 channel=(ChannelType) argument_list[3].integer_reference;
7849 channel_mask=SetPixelChannelMask(image,channel);
7850 image=SharpenImage(image,geometry_info.rho,geometry_info.sigma,
7852 if (image != (Image *) NULL)
7853 (void) SetPixelChannelMask(image,channel_mask);
7856 case 28: /* Shear */
7858 if (attribute_flag[0] != 0)
7860 flags=ParseGeometry(argument_list[0].string_reference,
7862 if ((flags & SigmaValue) == 0)
7863 geometry_info.sigma=geometry_info.rho;
7865 if (attribute_flag[1] != 0)
7866 geometry_info.rho=argument_list[1].real_reference;
7867 if (attribute_flag[2] != 0)
7868 geometry_info.sigma=argument_list[2].real_reference;
7869 if (attribute_flag[3] != 0)
7870 QueryColorDatabase(argument_list[3].string_reference,
7871 &image->background_color,exception);
7872 if (attribute_flag[4] != 0)
7873 QueryColorDatabase(argument_list[4].string_reference,
7874 &image->background_color,exception);
7875 image=ShearImage(image,geometry_info.rho,geometry_info.sigma,
7879 case 29: /* Spread */
7881 if (attribute_flag[0] == 0)
7882 argument_list[0].real_reference=1.0;
7883 image=SpreadImage(image,argument_list[0].real_reference,exception);
7886 case 30: /* Swirl */
7888 if (attribute_flag[0] == 0)
7889 argument_list[0].real_reference=50.0;
7890 if (attribute_flag[1] != 0)
7891 image->interpolate=(InterpolatePixelMethod)
7892 argument_list[1].integer_reference;
7893 image=SwirlImage(image,argument_list[0].real_reference,exception);
7896 case 31: /* Resize */
7899 if (attribute_flag[0] != 0)
7900 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
7901 &geometry,exception);
7902 if (attribute_flag[1] != 0)
7903 geometry.width=argument_list[1].integer_reference;
7904 if (attribute_flag[2] != 0)
7905 geometry.height=argument_list[2].integer_reference;
7906 if (attribute_flag[3] == 0)
7907 argument_list[3].integer_reference=(ssize_t) UndefinedFilter;
7908 if (attribute_flag[4] != 0)
7909 SetImageArtifact(image,"filter:support",
7910 argument_list[4].string_reference);
7911 if (attribute_flag[5] == 0)
7912 argument_list[5].real_reference=1.0;
7913 image=ResizeImage(image,geometry.width,geometry.height,
7914 (FilterTypes) argument_list[3].integer_reference,
7915 argument_list[5].real_reference,exception);
7918 case 33: /* Annotate */
7923 draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL,
7925 if (attribute_flag[0] != 0)
7930 text=InterpretImageProperties(info ? info->image_info :
7931 (ImageInfo *) NULL,image,argument_list[0].string_reference);
7932 (void) CloneString(&draw_info->text,text);
7933 text=DestroyString(text);
7935 if (attribute_flag[1] != 0)
7936 (void) CloneString(&draw_info->font,
7937 argument_list[1].string_reference);
7938 if (attribute_flag[2] != 0)
7939 draw_info->pointsize=argument_list[2].real_reference;
7940 if (attribute_flag[3] != 0)
7941 (void) CloneString(&draw_info->density,
7942 argument_list[3].string_reference);
7943 if (attribute_flag[4] != 0)
7944 (void) QueryColorDatabase(argument_list[4].string_reference,
7945 &draw_info->undercolor,exception);
7946 if (attribute_flag[5] != 0)
7948 (void) QueryColorDatabase(argument_list[5].string_reference,
7949 &draw_info->stroke,exception);
7950 if (argument_list[5].image_reference != (Image *) NULL)
7951 draw_info->stroke_pattern=CloneImage(
7952 argument_list[5].image_reference,0,0,MagickTrue,exception);
7954 if (attribute_flag[6] != 0)
7956 (void) QueryColorDatabase(argument_list[6].string_reference,
7957 &draw_info->fill,exception);
7958 if (argument_list[6].image_reference != (Image *) NULL)
7959 draw_info->fill_pattern=CloneImage(
7960 argument_list[6].image_reference,0,0,MagickTrue,exception);
7962 if (attribute_flag[7] != 0)
7964 (void) CloneString(&draw_info->geometry,
7965 argument_list[7].string_reference);
7966 flags=ParsePageGeometry(image,argument_list[7].string_reference,
7967 &geometry,exception);
7968 if (((flags & SigmaValue) == 0) && ((flags & XiValue) != 0))
7969 geometry_info.sigma=geometry_info.xi;
7971 if (attribute_flag[8] != 0)
7972 (void) QueryColorDatabase(argument_list[8].string_reference,
7973 &draw_info->fill,exception);
7974 if (attribute_flag[11] != 0)
7975 draw_info->gravity=(GravityType) argument_list[11].integer_reference;
7976 if (attribute_flag[25] != 0)
7981 av=(AV *) argument_list[25].array_reference;
7982 if ((av_len(av) != 3) && (av_len(av) != 5))
7984 ThrowPerlException(exception,OptionError,
7985 "affine matrix must have 4 or 6 elements",PackageName);
7988 draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0)));
7989 draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0)));
7990 draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0)));
7991 draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0)));
7992 if (fabs(draw_info->affine.sx*draw_info->affine.sy-
7993 draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon)
7995 ThrowPerlException(exception,OptionError,
7996 "affine matrix is singular",PackageName);
7999 if (av_len(av) == 5)
8001 draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0)));
8002 draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0)));
8005 for (j=12; j < 17; j++)
8007 if (attribute_flag[j] == 0)
8009 value=argument_list[j].string_reference;
8010 angle=argument_list[j].real_reference;
8011 current=draw_info->affine;
8012 GetAffineMatrix(&affine);
8020 flags=ParseGeometry(value,&geometry_info);
8021 affine.tx=geometry_info.xi;
8022 affine.ty=geometry_info.psi;
8023 if ((flags & PsiValue) == 0)
8024 affine.ty=affine.tx;
8032 flags=ParseGeometry(value,&geometry_info);
8033 affine.sx=geometry_info.rho;
8034 affine.sy=geometry_info.sigma;
8035 if ((flags & SigmaValue) == 0)
8036 affine.sy=affine.sx;
8046 affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
8047 affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
8048 affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
8049 affine.sy=cos(DegreesToRadians(fmod(angle,360.0)));
8057 affine.ry=tan(DegreesToRadians(fmod(angle,360.0)));
8065 affine.rx=tan(DegreesToRadians(fmod(angle,360.0)));
8069 draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
8070 draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
8071 draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
8072 draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
8073 draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+
8075 draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+
8078 if (attribute_flag[9] == 0)
8079 argument_list[9].real_reference=0.0;
8080 if (attribute_flag[10] == 0)
8081 argument_list[10].real_reference=0.0;
8082 if ((attribute_flag[9] != 0) || (attribute_flag[10] != 0))
8085 geometry[MaxTextExtent];
8087 (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f",
8088 (double) argument_list[9].real_reference+draw_info->affine.tx,
8089 (double) argument_list[10].real_reference+draw_info->affine.ty);
8090 (void) CloneString(&draw_info->geometry,geometry);
8092 if (attribute_flag[17] != 0)
8093 draw_info->stroke_width=argument_list[17].real_reference;
8094 if (attribute_flag[18] != 0)
8096 draw_info->text_antialias=argument_list[18].integer_reference != 0 ?
8097 MagickTrue : MagickFalse;
8098 draw_info->stroke_antialias=draw_info->text_antialias;
8100 if (attribute_flag[19] != 0)
8101 (void) CloneString(&draw_info->family,
8102 argument_list[19].string_reference);
8103 if (attribute_flag[20] != 0)
8104 draw_info->style=(StyleType) argument_list[20].integer_reference;
8105 if (attribute_flag[21] != 0)
8106 draw_info->stretch=(StretchType) argument_list[21].integer_reference;
8107 if (attribute_flag[22] != 0)
8108 draw_info->weight=argument_list[22].integer_reference;
8109 if (attribute_flag[23] != 0)
8110 draw_info->align=(AlignType) argument_list[23].integer_reference;
8111 if (attribute_flag[24] != 0)
8112 (void) CloneString(&draw_info->encoding,
8113 argument_list[24].string_reference);
8114 if (attribute_flag[25] != 0)
8115 draw_info->fill_pattern=CloneImage(
8116 argument_list[25].image_reference,0,0,MagickTrue,exception);
8117 if (attribute_flag[26] != 0)
8118 draw_info->fill_pattern=CloneImage(
8119 argument_list[26].image_reference,0,0,MagickTrue,exception);
8120 if (attribute_flag[27] != 0)
8121 draw_info->stroke_pattern=CloneImage(
8122 argument_list[27].image_reference,0,0,MagickTrue,exception);
8123 if (attribute_flag[29] != 0)
8124 draw_info->kerning=argument_list[29].real_reference;
8125 if (attribute_flag[30] != 0)
8126 draw_info->interline_spacing=argument_list[30].real_reference;
8127 if (attribute_flag[31] != 0)
8128 draw_info->interword_spacing=argument_list[31].real_reference;
8129 if (attribute_flag[32] != 0)
8130 draw_info->direction=(DirectionType)
8131 argument_list[32].integer_reference;
8132 (void) AnnotateImage(image,draw_info);
8133 draw_info=DestroyDrawInfo(draw_info);
8136 case 34: /* ColorFloodfill */
8147 draw_info=CloneDrawInfo(info ? info->image_info :
8148 (ImageInfo *) NULL,(DrawInfo *) NULL);
8149 if (attribute_flag[0] != 0)
8150 flags=ParsePageGeometry(image,argument_list[0].string_reference,
8151 &geometry,exception);
8152 if (attribute_flag[1] != 0)
8153 geometry.x=argument_list[1].integer_reference;
8154 if (attribute_flag[2] != 0)
8155 geometry.y=argument_list[2].integer_reference;
8156 if (attribute_flag[3] != 0)
8157 (void) QueryColorDatabase(argument_list[3].string_reference,
8158 &draw_info->fill,exception);
8159 (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target,
8162 if (attribute_flag[4] != 0)
8164 QueryMagickColor(argument_list[4].string_reference,&target,
8168 if (attribute_flag[5] != 0)
8169 image->fuzz=SiPrefixToDouble(argument_list[5].string_reference,
8171 if (attribute_flag[6] != 0)
8172 invert=(MagickBooleanType) argument_list[6].integer_reference;
8173 (void) FloodfillPaintImage(image,draw_info,&target,geometry.x,
8175 draw_info=DestroyDrawInfo(draw_info);
8178 case 35: /* Composite */
8181 composite_geometry[MaxTextExtent];
8187 compose=OverCompositeOp;
8188 if (attribute_flag[0] != 0)
8189 composite_image=argument_list[0].image_reference;
8192 ThrowPerlException(exception,OptionError,
8193 "CompositeImageRequired",PackageName);
8197 Parameter Handling used for BOTH normal and tiled composition.
8199 if (attribute_flag[1] != 0) /* compose */
8200 compose=(CompositeOperator) argument_list[1].integer_reference;
8201 if (attribute_flag[6] != 0) /* opacity */
8203 if (compose != DissolveCompositeOp)
8204 (void) SetImageOpacity(composite_image,(Quantum)
8205 SiPrefixToDouble(argument_list[6].string_reference,
8228 Handle dissolve composite operator (patch by
8231 (void) CloneString(&image->geometry,
8232 argument_list[6].string_reference);
8233 opacity=(Quantum) SiPrefixToDouble(
8234 argument_list[6].string_reference,QuantumRange);
8235 if (composite_image->matte != MagickTrue)
8236 (void) SetImageOpacity(composite_image,OpaqueAlpha);
8237 composite_view=AcquireCacheView(composite_image);
8238 for (y=0; y < (ssize_t) composite_image->rows ; y++)
8240 q=GetCacheViewAuthenticPixels(composite_view,0,y,(ssize_t)
8241 composite_image->columns,1,exception);
8242 for (x=0; x < (ssize_t) composite_image->columns; x++)
8244 if (GetPixelAlpha(image,q) == OpaqueAlpha)
8245 SetPixelAlpha(composite_image,ClampToQuantum(opacity),q);
8246 q+=GetPixelChannels(composite_image);
8248 sync=SyncCacheViewAuthenticPixels(composite_view,exception);
8249 if (sync == MagickFalse)
8252 composite_view=DestroyCacheView(composite_view);
8255 if (attribute_flag[9] != 0) /* "color=>" */
8256 QueryColorDatabase(argument_list[9].string_reference,
8257 &composite_image->background_color,exception);
8258 if (attribute_flag[12] != 0) /* "interpolate=>" */
8259 image->interpolate=(InterpolatePixelMethod)
8260 argument_list[12].integer_reference;
8261 if (attribute_flag[13] != 0) /* "args=>" */
8262 (void) SetImageArtifact(composite_image,"compose:args",
8263 argument_list[13].string_reference);
8264 if (attribute_flag[14] != 0) /* "blend=>" depreciated */
8265 (void) SetImageArtifact(composite_image,"compose:args",
8266 argument_list[14].string_reference);
8268 Tiling Composition (with orthogonal rotate).
8270 rotate_image=(Image *) NULL;
8271 if (attribute_flag[8] != 0) /* "rotate=>" */
8276 rotate_image=RotateImage(composite_image,
8277 argument_list[8].real_reference,exception);
8278 if (rotate_image == (Image *) NULL)
8281 if (attribute_flag[7] && argument_list[7].integer_reference) /* tile */
8288 Tile the composite image.
8290 if (attribute_flag[8] != 0) /* "tile=>" */
8291 (void) SetImageArtifact(rotate_image,"compose:outside-overlay",
8294 (void) SetImageArtifact(composite_image,
8295 "compose:outside-overlay","false");
8296 for (y=0; y < (ssize_t) image->rows; y+=(ssize_t) composite_image->rows)
8297 for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) composite_image->columns)
8299 if (attribute_flag[8] != 0) /* rotate */
8300 (void) CompositeImage(image,compose,rotate_image,x,y);
8302 (void) CompositeImage(image,compose,composite_image,x,y);
8304 if (attribute_flag[8] != 0) /* rotate */
8305 rotate_image=DestroyImage(rotate_image);
8309 Parameter Handling used used ONLY for normal composition.
8311 if (attribute_flag[5] != 0) /* gravity */
8312 image->gravity=(GravityType) argument_list[5].integer_reference;
8313 if (attribute_flag[2] != 0) /* geometry offset */
8315 SetGeometry(image,&geometry);
8316 (void) ParseAbsoluteGeometry(argument_list[2].string_reference,
8318 GravityAdjustGeometry(image->columns,image->rows,image->gravity,
8321 if (attribute_flag[3] != 0) /* x offset */
8322 geometry.x=argument_list[3].integer_reference;
8323 if (attribute_flag[4] != 0) /* y offset */
8324 geometry.y=argument_list[4].integer_reference;
8325 if (attribute_flag[10] != 0) /* mask */
8327 if ((image->compose == DisplaceCompositeOp) ||
8328 (image->compose == DistortCompositeOp))
8331 Merge Y displacement into X displacement image.
8333 composite_image=CloneImage(composite_image,0,0,MagickTrue,
8335 (void) CompositeImage(composite_image,CopyGreenCompositeOp,
8336 argument_list[10].image_reference,0,0);
8341 Set a blending mask for the composition.
8343 image->mask=CloneImage(argument_list[10].image_reference,0,0,
8344 MagickTrue,&image->exception);
8345 (void) NegateImage(image->mask,MagickFalse,exception);
8348 if (attribute_flag[11] != 0) /* channel */
8349 channel=(ChannelType) argument_list[11].integer_reference;
8351 Composite two images (normal composition).
8353 (void) FormatLocaleString(composite_geometry,MaxTextExtent,
8354 "%.20gx%.20g%+.20g%+.20g",(double) composite_image->columns,
8355 (double) composite_image->rows,(double) geometry.x,(double)
8357 flags=ParseGravityGeometry(image,composite_geometry,&geometry,
8359 channel_mask=SetPixelChannelMask(image,channel);
8360 if (attribute_flag[8] == 0) /* no rotate */
8361 CompositeImage(image,compose,composite_image,geometry.x,geometry.y);
8365 Position adjust rotated image then composite.
8367 geometry.x-=(ssize_t) (rotate_image->columns-
8368 composite_image->columns)/2;
8369 geometry.y-=(ssize_t) (rotate_image->rows-
8370 composite_image->rows)/2;
8371 CompositeImage(image,compose,rotate_image,geometry.x,geometry.y);
8372 rotate_image=DestroyImage(rotate_image);
8374 if (attribute_flag[10] != 0) /* mask */
8376 if ((image->compose == DisplaceCompositeOp) ||
8377 (image->compose == DistortCompositeOp))
8378 composite_image=DestroyImage(composite_image);
8380 image->mask=DestroyImage(image->mask);
8382 (void) SetPixelChannelMask(image,channel_mask);
8385 case 36: /* Contrast */
8387 if (attribute_flag[0] == 0)
8388 argument_list[0].integer_reference=0;
8389 (void) ContrastImage(image,argument_list[0].integer_reference != 0 ?
8390 MagickTrue : MagickFalse,exception);
8393 case 37: /* CycleColormap */
8395 if (attribute_flag[0] == 0)
8396 argument_list[0].integer_reference=6;
8397 (void) CycleColormapImage(image,argument_list[0].integer_reference);
8405 draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL,
8407 (void) CloneString(&draw_info->primitive,"point");
8408 if (attribute_flag[0] != 0)
8410 if (argument_list[0].integer_reference < 0)
8411 (void) CloneString(&draw_info->primitive,
8412 argument_list[0].string_reference);
8414 (void) CloneString(&draw_info->primitive,CommandOptionToMnemonic(
8415 MagickPrimitiveOptions,argument_list[0].integer_reference));
8417 if (attribute_flag[1] != 0)
8419 if (LocaleCompare(draw_info->primitive,"path") == 0)
8421 (void) ConcatenateString(&draw_info->primitive," '");
8422 ConcatenateString(&draw_info->primitive,
8423 argument_list[1].string_reference);
8424 (void) ConcatenateString(&draw_info->primitive,"'");
8428 (void) ConcatenateString(&draw_info->primitive," ");
8429 ConcatenateString(&draw_info->primitive,
8430 argument_list[1].string_reference);
8433 if (attribute_flag[2] != 0)
8435 (void) ConcatenateString(&draw_info->primitive," ");
8436 (void) ConcatenateString(&draw_info->primitive,
8437 CommandOptionToMnemonic(MagickMethodOptions,
8438 argument_list[2].integer_reference));
8440 if (attribute_flag[3] != 0)
8442 (void) QueryColorDatabase(argument_list[3].string_reference,
8443 &draw_info->stroke,exception);
8444 if (argument_list[3].image_reference != (Image *) NULL)
8445 draw_info->stroke_pattern=CloneImage(
8446 argument_list[3].image_reference,0,0,MagickTrue,exception);
8448 if (attribute_flag[4] != 0)
8450 (void) QueryColorDatabase(argument_list[4].string_reference,
8451 &draw_info->fill,exception);
8452 if (argument_list[4].image_reference != (Image *) NULL)
8453 draw_info->fill_pattern=CloneImage(
8454 argument_list[4].image_reference,0,0,MagickTrue,exception);
8456 if (attribute_flag[5] != 0)
8457 draw_info->stroke_width=argument_list[5].real_reference;
8458 if (attribute_flag[6] != 0)
8459 (void) CloneString(&draw_info->font,
8460 argument_list[6].string_reference);
8461 if (attribute_flag[7] != 0)
8462 (void) QueryColorDatabase(argument_list[7].string_reference,
8463 &draw_info->border_color,exception);
8464 if (attribute_flag[8] != 0)
8465 draw_info->affine.tx=argument_list[8].real_reference;
8466 if (attribute_flag[9] != 0)
8467 draw_info->affine.ty=argument_list[9].real_reference;
8468 if (attribute_flag[20] != 0)
8473 av=(AV *) argument_list[20].array_reference;
8474 if ((av_len(av) != 3) && (av_len(av) != 5))
8476 ThrowPerlException(exception,OptionError,
8477 "affine matrix must have 4 or 6 elements",PackageName);
8480 draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0)));
8481 draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0)));
8482 draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0)));
8483 draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0)));
8484 if (fabs(draw_info->affine.sx*draw_info->affine.sy-
8485 draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon)
8487 ThrowPerlException(exception,OptionError,
8488 "affine matrix is singular",PackageName);
8491 if (av_len(av) == 5)
8493 draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0)));
8494 draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0)));
8497 for (j=10; j < 15; j++)
8499 if (attribute_flag[j] == 0)
8501 value=argument_list[j].string_reference;
8502 angle=argument_list[j].real_reference;
8503 current=draw_info->affine;
8504 GetAffineMatrix(&affine);
8512 flags=ParseGeometry(value,&geometry_info);
8513 affine.tx=geometry_info.xi;
8514 affine.ty=geometry_info.psi;
8515 if ((flags & PsiValue) == 0)
8516 affine.ty=affine.tx;
8524 flags=ParseGeometry(value,&geometry_info);
8525 affine.sx=geometry_info.rho;
8526 affine.sy=geometry_info.sigma;
8527 if ((flags & SigmaValue) == 0)
8528 affine.sy=affine.sx;
8538 affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
8539 affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
8540 affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
8541 affine.sy=cos(DegreesToRadians(fmod(angle,360.0)));
8549 affine.ry=tan(DegreesToRadians(fmod(angle,360.0)));
8557 affine.rx=tan(DegreesToRadians(fmod(angle,360.0)));
8561 draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
8562 draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
8563 draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
8564 draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
8565 draw_info->affine.tx=
8566 current.sx*affine.tx+current.ry*affine.ty+current.tx;
8567 draw_info->affine.ty=
8568 current.rx*affine.tx+current.sy*affine.ty+current.ty;
8570 if (attribute_flag[15] != 0)
8571 draw_info->fill_pattern=CloneImage(
8572 argument_list[15].image_reference,0,0,MagickTrue,exception);
8573 if (attribute_flag[16] != 0)
8574 draw_info->pointsize=argument_list[16].real_reference;
8575 if (attribute_flag[17] != 0)
8577 draw_info->stroke_antialias=argument_list[17].integer_reference != 0
8578 ? MagickTrue : MagickFalse;
8579 draw_info->text_antialias=draw_info->stroke_antialias;
8581 if (attribute_flag[18] != 0)
8582 (void) CloneString(&draw_info->density,
8583 argument_list[18].string_reference);
8584 if (attribute_flag[19] != 0)
8585 draw_info->stroke_width=argument_list[19].real_reference;
8586 if (attribute_flag[21] != 0)
8587 draw_info->dash_offset=argument_list[21].real_reference;
8588 if (attribute_flag[22] != 0)
8593 av=(AV *) argument_list[22].array_reference;
8594 draw_info->dash_pattern=(double *) AcquireQuantumMemory(
8595 av_len(av)+2UL,sizeof(*draw_info->dash_pattern));
8596 if (draw_info->dash_pattern != (double *) NULL)
8598 for (i=0; i <= av_len(av); i++)
8599 draw_info->dash_pattern[i]=(double)
8600 SvNV(*(av_fetch(av,i,0)));
8601 draw_info->dash_pattern[i]=0.0;
8604 if (attribute_flag[23] != 0)
8605 image->interpolate=(InterpolatePixelMethod)
8606 argument_list[23].integer_reference;
8607 if ((attribute_flag[24] != 0) &&
8608 (draw_info->fill_pattern != (Image *) NULL))
8609 flags=ParsePageGeometry(draw_info->fill_pattern,
8610 argument_list[24].string_reference,
8611 &draw_info->fill_pattern->tile_offset,exception);
8612 if (attribute_flag[25] != 0)
8614 (void) ConcatenateString(&draw_info->primitive," '");
8615 (void) ConcatenateString(&draw_info->primitive,
8616 argument_list[25].string_reference);
8617 (void) ConcatenateString(&draw_info->primitive,"'");
8619 if (attribute_flag[26] != 0)
8620 draw_info->fill_pattern=CloneImage(
8621 argument_list[26].image_reference,0,0,MagickTrue,exception);
8622 if (attribute_flag[27] != 0)
8623 draw_info->stroke_pattern=CloneImage(
8624 argument_list[27].image_reference,0,0,MagickTrue,exception);
8625 if (attribute_flag[28] != 0)
8626 (void) CloneString(&draw_info->primitive,
8627 argument_list[28].string_reference);
8628 if (attribute_flag[29] != 0)
8629 draw_info->kerning=argument_list[29].real_reference;
8630 if (attribute_flag[30] != 0)
8631 draw_info->interline_spacing=argument_list[30].real_reference;
8632 if (attribute_flag[31] != 0)
8633 draw_info->interword_spacing=argument_list[31].real_reference;
8634 if (attribute_flag[32] != 0)
8635 draw_info->direction=(DirectionType)
8636 argument_list[32].integer_reference;
8637 DrawImage(image,draw_info);
8638 draw_info=DestroyDrawInfo(draw_info);
8641 case 39: /* Equalize */
8643 if (attribute_flag[0] != 0)
8644 channel=(ChannelType) argument_list[0].integer_reference;
8645 channel_mask=SetPixelChannelMask(image,channel);
8646 EqualizeImage(image,exception);
8647 (void) SetPixelChannelMask(image,channel_mask);
8650 case 40: /* Gamma */
8652 if (attribute_flag[1] != 0)
8653 channel=(ChannelType) argument_list[1].integer_reference;
8654 if (attribute_flag[2] == 0)
8655 argument_list[2].real_reference=1.0;
8656 if (attribute_flag[3] == 0)
8657 argument_list[3].real_reference=1.0;
8658 if (attribute_flag[4] == 0)
8659 argument_list[4].real_reference=1.0;
8660 if (attribute_flag[0] == 0)
8662 (void) FormatLocaleString(message,MaxTextExtent,
8663 "%.15g,%.15g,%.15g",(double) argument_list[2].real_reference,
8664 (double) argument_list[3].real_reference,
8665 (double) argument_list[4].real_reference);
8666 argument_list[0].string_reference=message;
8668 (void) GammaImage(image,InterpretLocaleValue(
8669 argument_list[0].string_reference,(char **) NULL),exception);
8677 if (attribute_flag[0] == 0)
8679 ThrowPerlException(exception,OptionError,"MapImageRequired",
8683 quantize_info=AcquireQuantizeInfo(info->image_info);
8684 if (attribute_flag[1] != 0)
8685 quantize_info->dither=(MagickBooleanType)
8686 argument_list[1].integer_reference;
8687 if (attribute_flag[2] != 0)
8688 quantize_info->dither_method=(DitherMethod)
8689 argument_list[2].integer_reference;
8690 (void) RemapImages(quantize_info,image,
8691 argument_list[0].image_reference);
8692 quantize_info=DestroyQuantizeInfo(quantize_info);
8695 case 42: /* MatteFloodfill */
8706 draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL,
8708 if (attribute_flag[0] != 0)
8709 flags=ParsePageGeometry(image,argument_list[0].string_reference,
8710 &geometry,exception);
8711 if (attribute_flag[1] != 0)
8712 geometry.x=argument_list[1].integer_reference;
8713 if (attribute_flag[2] != 0)
8714 geometry.y=argument_list[2].integer_reference;
8715 if (image->matte == MagickFalse)
8716 (void) SetImageOpacity(image,OpaqueAlpha);
8717 (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target,
8719 if (attribute_flag[4] != 0)
8720 QueryMagickColor(argument_list[4].string_reference,&target,
8722 if (attribute_flag[3] != 0)
8723 target.alpha=SiPrefixToDouble(argument_list[3].string_reference,
8725 if (attribute_flag[5] != 0)
8726 image->fuzz=SiPrefixToDouble(argument_list[5].string_reference,
8729 if (attribute_flag[6] != 0)
8730 invert=(MagickBooleanType) argument_list[6].integer_reference;
8731 channel_mask=SetPixelChannelMask(image,AlphaChannel);
8732 (void) FloodfillPaintImage(image,draw_info,&target,geometry.x,
8734 (void) SetPixelChannelMask(image,channel_mask);
8735 draw_info=DestroyDrawInfo(draw_info);
8738 case 43: /* Modulate */
8741 modulate[MaxTextExtent];
8743 geometry_info.rho=100.0;
8744 geometry_info.sigma=100.0;
8745 geometry_info.xi=100.0;
8746 if (attribute_flag[0] != 0)
8747 (void)ParseGeometry(argument_list[0].string_reference,
8749 if (attribute_flag[1] != 0)
8750 geometry_info.xi=argument_list[1].real_reference;
8751 if (attribute_flag[2] != 0)
8752 geometry_info.sigma=argument_list[2].real_reference;
8753 if (attribute_flag[3] != 0)
8755 geometry_info.sigma=argument_list[3].real_reference;
8756 SetImageArtifact(image,"modulate:colorspace","HWB");
8758 if (attribute_flag[4] != 0)
8760 geometry_info.rho=argument_list[4].real_reference;
8761 SetImageArtifact(image,"modulate:colorspace","HSB");
8763 if (attribute_flag[5] != 0)
8765 geometry_info.sigma=argument_list[5].real_reference;
8766 SetImageArtifact(image,"modulate:colorspace","HSL");
8768 if (attribute_flag[6] != 0)
8770 geometry_info.rho=argument_list[6].real_reference;
8771 SetImageArtifact(image,"modulate:colorspace","HWB");
8773 (void) FormatLocaleString(modulate,MaxTextExtent,"%.15g,%.15g,%.15g",
8774 geometry_info.rho,geometry_info.sigma,geometry_info.xi);
8775 (void) ModulateImage(image,modulate);
8778 case 44: /* Negate */
8780 if (attribute_flag[0] == 0)
8781 argument_list[0].integer_reference=0;
8782 if (attribute_flag[1] != 0)
8783 channel=(ChannelType) argument_list[1].integer_reference;
8784 channel_mask=SetPixelChannelMask(image,channel);
8785 (void) NegateImage(image,argument_list[0].integer_reference != 0 ?
8786 MagickTrue : MagickFalse,exception);
8787 (void) SetPixelChannelMask(image,channel_mask);
8790 case 45: /* Normalize */
8792 if (attribute_flag[0] != 0)
8793 channel=(ChannelType) argument_list[0].integer_reference;
8794 channel_mask=SetPixelChannelMask(image,channel);
8795 NormalizeImage(image,exception);
8796 (void) SetPixelChannelMask(image,channel_mask);
8799 case 46: /* NumberColors */
8801 case 47: /* Opaque */
8810 (void) QueryMagickColor("none",&target,exception);
8811 (void) QueryMagickColor("none",&fill_color,exception);
8812 if (attribute_flag[0] != 0)
8813 (void) QueryMagickColor(argument_list[0].string_reference,
8815 if (attribute_flag[1] != 0)
8816 (void) QueryMagickColor(argument_list[1].string_reference,
8817 &fill_color,exception);
8818 if (attribute_flag[2] != 0)
8819 image->fuzz=SiPrefixToDouble(argument_list[2].string_reference,
8821 if (attribute_flag[3] != 0)
8822 channel=(ChannelType) argument_list[3].integer_reference;
8824 if (attribute_flag[4] != 0)
8825 invert=(MagickBooleanType) argument_list[4].integer_reference;
8826 channel_mask=SetPixelChannelMask(image,channel);
8827 (void) OpaquePaintImage(image,&target,&fill_color,invert);
8828 (void) SetPixelChannelMask(image,channel_mask);
8831 case 48: /* Quantize */
8836 quantize_info=AcquireQuantizeInfo(info->image_info);
8837 if (attribute_flag[0] != 0)
8838 quantize_info->number_colors=(size_t)
8839 argument_list[0].integer_reference;
8840 if (attribute_flag[1] != 0)
8841 quantize_info->tree_depth=(size_t)
8842 argument_list[1].integer_reference;
8843 if (attribute_flag[2] != 0)
8844 quantize_info->colorspace=(ColorspaceType)
8845 argument_list[2].integer_reference;
8846 if (attribute_flag[3] != 0)
8847 quantize_info->dither=argument_list[3].integer_reference != 0 ?
8848 MagickTrue : MagickFalse;
8849 if (attribute_flag[4] != 0)
8850 quantize_info->measure_error=
8851 argument_list[4].integer_reference != 0 ? MagickTrue : MagickFalse;
8852 if (attribute_flag[5] != 0)
8853 (void) QueryColorDatabase(argument_list[5].string_reference,
8854 &image->transparent_color,exception);
8855 if (attribute_flag[5] && argument_list[5].integer_reference)
8857 (void) QuantizeImages(quantize_info,image);
8860 if (attribute_flag[6] != 0)
8861 quantize_info->dither_method=(DitherMethod)
8862 argument_list[6].integer_reference;
8863 if ((image->storage_class == DirectClass) ||
8864 (image->colors > quantize_info->number_colors) ||
8865 (quantize_info->colorspace == GRAYColorspace))
8866 (void) QuantizeImage(quantize_info,image);
8868 CompressImageColormap(image);
8869 quantize_info=DestroyQuantizeInfo(quantize_info);
8872 case 49: /* Raise */
8874 if (attribute_flag[0] != 0)
8875 flags=ParsePageGeometry(image,argument_list[0].string_reference,
8876 &geometry,exception);
8877 if (attribute_flag[1] != 0)
8878 geometry.width=argument_list[1].integer_reference;
8879 if (attribute_flag[2] != 0)
8880 geometry.height=argument_list[2].integer_reference;
8881 if (attribute_flag[3] == 0)
8882 argument_list[3].integer_reference=1;
8883 (void) RaiseImage(image,&geometry,argument_list[3].integer_reference !=
8884 0 ? MagickTrue : MagickFalse);
8887 case 50: /* Segment */
8894 smoothing_threshold;
8899 cluster_threshold=1.0;
8900 smoothing_threshold=1.5;
8901 colorspace=RGBColorspace;
8902 verbose=MagickFalse;
8903 if (attribute_flag[0] != 0)
8905 flags=ParseGeometry(argument_list[0].string_reference,
8907 cluster_threshold=geometry_info.rho;
8908 if (flags & SigmaValue)
8909 smoothing_threshold=geometry_info.sigma;
8911 if (attribute_flag[1] != 0)
8912 cluster_threshold=argument_list[1].real_reference;
8913 if (attribute_flag[2] != 0)
8914 smoothing_threshold=argument_list[2].real_reference;
8915 if (attribute_flag[3] != 0)
8916 colorspace=(ColorspaceType) argument_list[3].integer_reference;
8917 if (attribute_flag[4] != 0)
8918 verbose=argument_list[4].integer_reference != 0 ?
8919 MagickTrue : MagickFalse;
8920 (void) SegmentImage(image,colorspace,verbose,cluster_threshold,
8921 smoothing_threshold);
8924 case 51: /* Signature */
8926 (void) SignatureImage(image);
8929 case 52: /* Solarize */
8931 geometry_info.rho=QuantumRange/2.0;
8932 if (attribute_flag[0] != 0)
8933 flags=ParseGeometry(argument_list[0].string_reference,
8935 if (attribute_flag[1] != 0)
8936 geometry_info.rho=SiPrefixToDouble(argument_list[1].string_reference,
8938 (void) SolarizeImage(image,geometry_info.rho);
8943 (void) SyncImage(image);
8946 case 54: /* Texture */
8948 if (attribute_flag[0] == 0)
8950 TextureImage(image,argument_list[0].image_reference);
8953 case 55: /* Evalute */
8955 MagickEvaluateOperator
8958 op=SetEvaluateOperator;
8959 if (attribute_flag[0] == MagickFalse)
8960 argument_list[0].real_reference=0.0;
8961 if (attribute_flag[1] != MagickFalse)
8962 op=(MagickEvaluateOperator) argument_list[1].integer_reference;
8963 if (attribute_flag[2] != MagickFalse)
8964 channel=(ChannelType) argument_list[2].integer_reference;
8965 channel_mask=SetPixelChannelMask(image,channel);
8966 (void) EvaluateImage(image,op,argument_list[0].real_reference,
8968 (void) SetPixelChannelMask(image,channel_mask);
8971 case 56: /* Transparent */
8982 (void) QueryMagickColor("none",&target,exception);
8983 if (attribute_flag[0] != 0)
8984 (void) QueryMagickColor(argument_list[0].string_reference,&target,
8986 opacity=TransparentAlpha;
8987 if (attribute_flag[1] != 0)
8988 opacity=SiPrefixToDouble(argument_list[1].string_reference,
8990 if (attribute_flag[2] != 0)
8991 image->fuzz=SiPrefixToDouble(argument_list[2].string_reference,
8993 if (attribute_flag[3] == 0)
8994 argument_list[3].integer_reference=0;
8996 if (attribute_flag[3] != 0)
8997 invert=(MagickBooleanType) argument_list[3].integer_reference;
8998 (void) TransparentPaintImage(image,&target,ClampToQuantum(opacity),
9002 case 57: /* Threshold */
9007 if (attribute_flag[0] == 0)
9008 argument_list[0].string_reference="50%";
9009 if (attribute_flag[1] != 0)
9010 channel=(ChannelType) argument_list[1].integer_reference;
9011 threshold=SiPrefixToDouble(argument_list[0].string_reference,
9013 channel_mask=SetPixelChannelMask(image,channel);
9014 (void) BilevelImage(image,threshold);
9015 (void) SetPixelChannelMask(image,channel_mask);
9018 case 58: /* Charcoal */
9020 if (attribute_flag[0] != 0)
9022 flags=ParseGeometry(argument_list[0].string_reference,
9024 if ((flags & SigmaValue) == 0)
9025 geometry_info.sigma=1.0;
9027 if (attribute_flag[1] != 0)
9028 geometry_info.rho=argument_list[1].real_reference;
9029 if (attribute_flag[2] != 0)
9030 geometry_info.sigma=argument_list[2].real_reference;
9031 image=CharcoalImage(image,geometry_info.rho,geometry_info.sigma,
9037 if (attribute_flag[0] != 0)
9038 image->fuzz=SiPrefixToDouble(argument_list[0].string_reference,
9040 image=TrimImage(image,exception);
9045 if (attribute_flag[0] != 0)
9047 flags=ParseGeometry(argument_list[0].string_reference,
9049 if ((flags & SigmaValue) == 0)
9050 geometry_info.sigma=1.0;
9052 if (attribute_flag[1] != 0)
9053 geometry_info.rho=argument_list[1].real_reference;
9054 if (attribute_flag[2] != 0)
9055 geometry_info.sigma=argument_list[2].real_reference;
9056 if (attribute_flag[3] != 0)
9057 image->interpolate=(InterpolatePixelMethod)
9058 argument_list[3].integer_reference;
9059 image=WaveImage(image,geometry_info.rho,geometry_info.sigma,
9063 case 61: /* Separate */
9065 if (attribute_flag[0] != 0)
9066 channel=(ChannelType) argument_list[0].integer_reference;
9067 channel_mask=SetPixelChannelMask(image,channel);
9068 (void) SeparateImage(image);
9069 (void) SetPixelChannelMask(image,channel_mask);
9072 case 63: /* Stereo */
9074 if (attribute_flag[0] == 0)
9076 ThrowPerlException(exception,OptionError,"StereoImageRequired",
9080 if (attribute_flag[1] != 0)
9081 geometry.x=argument_list[1].integer_reference;
9082 if (attribute_flag[2] != 0)
9083 geometry.y=argument_list[2].integer_reference;
9084 image=StereoAnaglyphImage(image,argument_list[0].image_reference,
9085 geometry.x,geometry.y,exception);
9088 case 64: /* Stegano */
9090 if (attribute_flag[0] == 0)
9092 ThrowPerlException(exception,OptionError,"SteganoImageRequired",
9096 if (attribute_flag[1] == 0)
9097 argument_list[1].integer_reference=0;
9098 image->offset=argument_list[1].integer_reference;
9099 image=SteganoImage(image,argument_list[0].image_reference,exception);
9102 case 65: /* Deconstruct */
9104 image=CompareImagesLayers(image,CompareAnyLayer,exception);
9107 case 66: /* GaussianBlur */
9109 if (attribute_flag[0] != 0)
9111 flags=ParseGeometry(argument_list[0].string_reference,
9113 if ((flags & SigmaValue) == 0)
9114 geometry_info.sigma=1.0;
9116 if (attribute_flag[1] != 0)
9117 geometry_info.rho=argument_list[1].real_reference;
9118 if (attribute_flag[2] != 0)
9119 geometry_info.sigma=argument_list[2].real_reference;
9120 if (attribute_flag[3] != 0)
9121 channel=(ChannelType) argument_list[3].integer_reference;
9122 channel_mask=SetPixelChannelMask(image,channel);
9123 image=GaussianBlurImage(image,geometry_info.rho,geometry_info.sigma,
9125 if (image != (Image *) NULL)
9126 (void) SetPixelChannelMask(image,channel_mask);
9129 case 67: /* Convolve */
9134 kernel=(KernelInfo *) NULL;
9135 if ((attribute_flag[0] == 0) && (attribute_flag[3] == 0))
9137 if (attribute_flag[0] != 0)
9145 kernel=AcquireKernelInfo((const char *) NULL);
9146 if (kernel == (KernelInfo *) NULL)
9148 av=(AV *) argument_list[0].array_reference;
9149 order=(size_t) sqrt(av_len(av)+1);
9150 kernel->width=order;
9151 kernel->height=order;
9152 kernel->values=(double *) AcquireQuantumMemory(order,order*
9153 sizeof(*kernel->values));
9154 if (kernel->values == (double *) NULL)
9156 kernel=DestroyKernelInfo(kernel);
9157 ThrowPerlException(exception,ResourceLimitFatalError,
9158 "MemoryAllocationFailed",PackageName);
9161 for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++)
9162 kernel->values[j]=(double) SvNV(*(av_fetch(av,j,0)));
9163 for ( ; j < (ssize_t) (order*order); j++)
9164 kernel->values[j]=0.0;
9166 if (attribute_flag[1] != 0)
9167 channel=(ChannelType) argument_list[1].integer_reference;
9168 if (attribute_flag[2] != 0)
9169 image->bias=SiPrefixToDouble(argument_list[2].string_reference,
9171 if (attribute_flag[3] != 0)
9173 kernel=AcquireKernelInfo(argument_list[3].string_reference);
9174 if (kernel == (KernelInfo *) NULL)
9177 channel_mask=SetPixelChannelMask(image,channel);
9178 kernel->bias=image->bias;
9179 image=ConvolveImage(image,kernel,exception);
9180 if (image != (Image *) NULL)
9181 (void) SetPixelChannelMask(image,channel_mask);
9182 kernel=DestroyKernelInfo(kernel);
9185 case 68: /* Profile */
9200 if (attribute_flag[0] != 0)
9201 name=argument_list[0].string_reference;
9202 if (attribute_flag[2] != 0)
9203 image->rendering_intent=(RenderingIntent)
9204 argument_list[2].integer_reference;
9205 if (attribute_flag[3] != 0)
9206 image->black_point_compensation=
9207 argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse;
9208 if (attribute_flag[1] != 0)
9210 if (argument_list[1].length == 0)
9213 Remove a profile from the image.
9215 (void) ProfileImage(image,name,(const unsigned char *) NULL,0,
9220 Associate user supplied profile with the image.
9222 profile=AcquireStringInfo(argument_list[1].length);
9223 SetStringInfoDatum(profile,(const unsigned char *)
9224 argument_list[1].string_reference);
9225 (void) ProfileImage(image,name,GetStringInfoDatum(profile),
9226 (size_t) GetStringInfoLength(profile),MagickFalse);
9227 profile=DestroyStringInfo(profile);
9231 Associate a profile with the image.
9234 CloneImageInfo(info ? info->image_info : (ImageInfo *) NULL);
9235 (void) CopyMagickString(profile_info->filename,name,MaxTextExtent);
9236 profile_image=ReadImages(profile_info,&image->exception);
9237 if (profile_image == (Image *) NULL)
9239 ResetImageProfileIterator(profile_image);
9240 name=GetNextImageProfile(profile_image);
9241 while (name != (const char *) NULL)
9246 profile=GetImageProfile(profile_image,name);
9247 if (profile != (const StringInfo *) NULL)
9248 (void) ProfileImage(image,name,GetStringInfoDatum(profile),
9249 (size_t) GetStringInfoLength(profile),MagickFalse);
9250 name=GetNextImageProfile(profile_image);
9252 profile_image=DestroyImage(profile_image);
9253 profile_info=DestroyImageInfo(profile_info);
9256 case 69: /* UnsharpMask */
9258 if (attribute_flag[0] != 0)
9260 flags=ParseGeometry(argument_list[0].string_reference,
9262 if ((flags & SigmaValue) == 0)
9263 geometry_info.sigma=1.0;
9264 if ((flags & XiValue) == 0)
9265 geometry_info.xi=1.0;
9266 if ((flags & PsiValue) == 0)
9267 geometry_info.psi=0.5;
9269 if (attribute_flag[1] != 0)
9270 geometry_info.rho=argument_list[1].real_reference;
9271 if (attribute_flag[2] != 0)
9272 geometry_info.sigma=argument_list[2].real_reference;
9273 if (attribute_flag[3] != 0)
9274 geometry_info.xi=argument_list[3].real_reference;
9275 if (attribute_flag[4] != 0)
9276 geometry_info.psi=argument_list[4].real_reference;
9277 if (attribute_flag[5] != 0)
9278 channel=(ChannelType) argument_list[5].integer_reference;
9279 channel_mask=SetPixelChannelMask(image,channel);
9280 image=UnsharpMaskImage(image,geometry_info.rho,geometry_info.sigma,
9281 geometry_info.xi,geometry_info.psi,exception);
9282 if (image != (Image *) NULL)
9283 (void) SetPixelChannelMask(image,channel_mask);
9286 case 70: /* MotionBlur */
9288 if (attribute_flag[0] != 0)
9290 flags=ParseGeometry(argument_list[0].string_reference,
9292 if ((flags & SigmaValue) == 0)
9293 geometry_info.sigma=1.0;
9294 if ((flags & XiValue) == 0)
9295 geometry_info.xi=1.0;
9297 if (attribute_flag[1] != 0)
9298 geometry_info.rho=argument_list[1].real_reference;
9299 if (attribute_flag[2] != 0)
9300 geometry_info.sigma=argument_list[2].real_reference;
9301 if (attribute_flag[3] != 0)
9302 geometry_info.xi=argument_list[3].real_reference;
9303 if (attribute_flag[4] != 0)
9304 channel=(ChannelType) argument_list[4].integer_reference;
9305 channel_mask=SetPixelChannelMask(image,channel);
9306 image=MotionBlurImage(image,geometry_info.rho,geometry_info.sigma,
9307 geometry_info.xi,exception);
9308 if (image != (Image *) NULL)
9309 (void) SetPixelChannelMask(image,channel_mask);
9312 case 71: /* OrderedDither */
9314 if (attribute_flag[0] == 0)
9315 argument_list[0].string_reference="o8x8";
9316 if (attribute_flag[1] != 0)
9317 channel=(ChannelType) argument_list[1].integer_reference;
9318 channel_mask=SetPixelChannelMask(image,channel);
9319 (void) OrderedPosterizeImage(image,argument_list[0].string_reference,
9321 (void) SetPixelChannelMask(image,channel_mask);
9324 case 72: /* Shave */
9326 if (attribute_flag[0] != 0)
9327 flags=ParsePageGeometry(image,argument_list[0].string_reference,
9328 &geometry,exception);
9329 if (attribute_flag[1] != 0)
9330 geometry.width=argument_list[1].integer_reference;
9331 if (attribute_flag[2] != 0)
9332 geometry.height=argument_list[2].integer_reference;
9333 image=ShaveImage(image,&geometry,exception);
9336 case 73: /* Level */
9344 white_point=(MagickRealType) image->columns*image->rows;
9346 if (attribute_flag[0] != 0)
9348 flags=ParseGeometry(argument_list[0].string_reference,
9350 black_point=geometry_info.rho;
9351 if ((flags & SigmaValue) != 0)
9352 white_point=geometry_info.sigma;
9353 if ((flags & XiValue) != 0)
9354 gamma=geometry_info.xi;
9355 if ((flags & PercentValue) != 0)
9357 black_point*=(double) (QuantumRange/100.0);
9358 white_point*=(double) (QuantumRange/100.0);
9360 if ((flags & SigmaValue) == 0)
9361 white_point=(double) QuantumRange-black_point;
9363 if (attribute_flag[1] != 0)
9364 black_point=argument_list[1].real_reference;
9365 if (attribute_flag[2] != 0)
9366 white_point=argument_list[2].real_reference;
9367 if (attribute_flag[3] != 0)
9368 gamma=argument_list[3].real_reference;
9369 if (attribute_flag[4] != 0)
9370 channel=(ChannelType) argument_list[4].integer_reference;
9371 if (attribute_flag[5] != 0)
9373 argument_list[0].real_reference=argument_list[5].real_reference;
9374 attribute_flag[0]=attribute_flag[5];
9376 channel_mask=SetPixelChannelMask(image,channel);
9377 (void) LevelImage(image,black_point,white_point,gamma,exception);
9378 (void) SetPixelChannelMask(image,channel_mask);
9383 if (attribute_flag[0] == 0)
9384 argument_list[0].string_reference="#1";
9385 if (attribute_flag[1] == 0)
9386 argument_list[1].integer_reference=MagickTrue;
9387 (void) ClipImagePath(image,argument_list[0].string_reference,
9388 argument_list[1].integer_reference != 0 ? MagickTrue : MagickFalse);
9391 case 75: /* AffineTransform */
9396 draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL,
9398 if (attribute_flag[0] != 0)
9403 av=(AV *) argument_list[0].array_reference;
9404 if ((av_len(av) != 3) && (av_len(av) != 5))
9406 ThrowPerlException(exception,OptionError,
9407 "affine matrix must have 4 or 6 elements",PackageName);
9410 draw_info->affine.sx=(double) SvNV(*(av_fetch(av,0,0)));
9411 draw_info->affine.rx=(double) SvNV(*(av_fetch(av,1,0)));
9412 draw_info->affine.ry=(double) SvNV(*(av_fetch(av,2,0)));
9413 draw_info->affine.sy=(double) SvNV(*(av_fetch(av,3,0)));
9414 if (fabs(draw_info->affine.sx*draw_info->affine.sy-
9415 draw_info->affine.rx*draw_info->affine.ry) < MagickEpsilon)
9417 ThrowPerlException(exception,OptionError,
9418 "affine matrix is singular",PackageName);
9421 if (av_len(av) == 5)
9423 draw_info->affine.tx=(double) SvNV(*(av_fetch(av,4,0)));
9424 draw_info->affine.ty=(double) SvNV(*(av_fetch(av,5,0)));
9427 for (j=1; j < 6; j++)
9429 if (attribute_flag[j] == 0)
9431 value=argument_list[j].string_reference;
9432 angle=argument_list[j].real_reference;
9433 current=draw_info->affine;
9434 GetAffineMatrix(&affine);
9442 flags=ParseGeometry(value,&geometry_info);
9443 affine.tx=geometry_info.xi;
9444 affine.ty=geometry_info.psi;
9445 if ((flags & PsiValue) == 0)
9446 affine.ty=affine.tx;
9454 flags=ParseGeometry(value,&geometry_info);
9455 affine.sx=geometry_info.rho;
9456 affine.sy=geometry_info.sigma;
9457 if ((flags & SigmaValue) == 0)
9458 affine.sy=affine.sx;
9468 affine.sx=cos(DegreesToRadians(fmod(angle,360.0)));
9469 affine.rx=sin(DegreesToRadians(fmod(angle,360.0)));
9470 affine.ry=(-sin(DegreesToRadians(fmod(angle,360.0))));
9471 affine.sy=cos(DegreesToRadians(fmod(angle,360.0)));
9479 affine.ry=tan(DegreesToRadians(fmod(angle,360.0)));
9487 affine.rx=tan(DegreesToRadians(fmod(angle,360.0)));
9491 draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
9492 draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
9493 draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
9494 draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
9495 draw_info->affine.tx=
9496 current.sx*affine.tx+current.ry*affine.ty+current.tx;
9497 draw_info->affine.ty=
9498 current.rx*affine.tx+current.sy*affine.ty+current.ty;
9500 if (attribute_flag[6] != 0)
9501 image->interpolate=(InterpolatePixelMethod)
9502 argument_list[6].integer_reference;
9503 if (attribute_flag[7] != 0)
9504 QueryColorDatabase(argument_list[7].string_reference,
9505 &image->background_color,exception);
9506 image=AffineTransformImage(image,&draw_info->affine,exception);
9507 draw_info=DestroyDrawInfo(draw_info);
9510 case 76: /* Difference */
9512 if (attribute_flag[0] == 0)
9514 ThrowPerlException(exception,OptionError,
9515 "ReferenceImageRequired",PackageName);
9518 if (attribute_flag[1] != 0)
9519 image->fuzz=SiPrefixToDouble(argument_list[1].string_reference,
9521 (void) IsImagesEqual(image,argument_list[0].image_reference);
9524 case 77: /* AdaptiveThreshold */
9526 if (attribute_flag[0] != 0)
9528 flags=ParseGeometry(argument_list[0].string_reference,
9530 if ((flags & PercentValue) != 0)
9531 geometry_info.xi=QuantumRange*geometry_info.xi/100.0;
9533 if (attribute_flag[1] != 0)
9534 geometry_info.rho=argument_list[1].integer_reference;
9535 if (attribute_flag[2] != 0)
9536 geometry_info.sigma=argument_list[2].integer_reference;
9537 if (attribute_flag[3] != 0)
9538 geometry_info.xi=argument_list[3].integer_reference;;
9539 image=AdaptiveThresholdImage(image,(size_t) geometry_info.rho,
9540 (size_t) geometry_info.sigma,(double) geometry_info.xi,exception);
9543 case 78: /* Resample */
9549 if (attribute_flag[0] != 0)
9551 flags=ParseGeometry(argument_list[0].string_reference,
9553 if ((flags & SigmaValue) == 0)
9554 geometry_info.sigma=geometry_info.rho;
9556 if (attribute_flag[1] != 0)
9557 geometry_info.rho=argument_list[1].real_reference;
9558 if (attribute_flag[2] != 0)
9559 geometry_info.sigma=argument_list[2].real_reference;
9560 if (attribute_flag[3] == 0)
9561 argument_list[3].integer_reference=(ssize_t) UndefinedFilter;
9562 if (attribute_flag[4] == 0)
9563 SetImageArtifact(image,"filter:support",
9564 argument_list[4].string_reference);
9565 if (attribute_flag[5] != 0)
9566 argument_list[5].real_reference=1.0;
9567 width=(size_t) (geometry_info.rho*image->columns/
9568 (image->x_resolution == 0.0 ? 72.0 : image->x_resolution)+0.5);
9569 height=(size_t) (geometry_info.sigma*image->rows/
9570 (image->y_resolution == 0.0 ? 72.0 : image->y_resolution)+0.5);
9571 image=ResizeImage(image,width,height,(FilterTypes)
9572 argument_list[3].integer_reference,argument_list[5].real_reference,
9574 if (image != (Image *) NULL)
9576 image->x_resolution=geometry_info.rho;
9577 image->y_resolution=geometry_info.sigma;
9581 case 79: /* Describe */
9583 if (attribute_flag[0] == 0)
9584 argument_list[0].file_reference=(FILE *) NULL;
9585 if (attribute_flag[1] != 0)
9586 (void) SetImageArtifact(image,"identify:features",
9587 argument_list[1].string_reference);
9588 (void) IdentifyImage(image,argument_list[0].file_reference,
9592 case 80: /* BlackThreshold */
9594 if (attribute_flag[0] == 0)
9595 argument_list[0].string_reference="50%";
9596 if (attribute_flag[2] != 0)
9597 channel=(ChannelType) argument_list[2].integer_reference;
9598 channel_mask=SetPixelChannelMask(image,channel);
9599 BlackThresholdImage(image,argument_list[0].string_reference,
9601 (void) SetPixelChannelMask(image,channel_mask);
9604 case 81: /* WhiteThreshold */
9606 if (attribute_flag[0] == 0)
9607 argument_list[0].string_reference="50%";
9608 if (attribute_flag[2] != 0)
9609 channel=(ChannelType) argument_list[2].integer_reference;
9610 channel_mask=SetPixelChannelMask(image,channel);
9611 WhiteThresholdImage(image,argument_list[0].string_reference,
9613 (void) SetPixelChannelMask(image,channel_mask);
9616 case 82: /* RadialBlur */
9618 if (attribute_flag[0] != 0)
9620 flags=ParseGeometry(argument_list[0].string_reference,
9622 if ((flags & SigmaValue) == 0)
9623 geometry_info.sigma=1.0;
9625 if (attribute_flag[1] != 0)
9626 geometry_info.rho=argument_list[1].real_reference;
9627 if (attribute_flag[2] != 0)
9628 channel=(ChannelType) argument_list[2].integer_reference;
9629 channel_mask=SetPixelChannelMask(image,channel);
9630 image=RadialBlurImage(image,geometry_info.rho,exception);
9631 if (image != (Image *) NULL)
9632 (void) SetPixelChannelMask(image,channel_mask);
9635 case 83: /* Thumbnail */
9637 if (attribute_flag[0] != 0)
9638 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
9639 &geometry,exception);
9640 if (attribute_flag[1] != 0)
9641 geometry.width=argument_list[1].integer_reference;
9642 if (attribute_flag[2] != 0)
9643 geometry.height=argument_list[2].integer_reference;
9644 image=ThumbnailImage(image,geometry.width,geometry.height,exception);
9647 case 84: /* Strip */
9649 (void) StripImage(image);
9657 (void) GetOneVirtualPixel(image,0,0,&target,exception);
9658 if (attribute_flag[0] != 0)
9659 (void) QueryColorDatabase(argument_list[0].string_reference,&target,
9661 if (attribute_flag[1] == 0)
9662 argument_list[1].string_reference="100";
9663 image=TintImage(image,argument_list[1].string_reference,target,
9667 case 86: /* Channel */
9669 if (attribute_flag[0] != 0)
9670 channel=(ChannelType) argument_list[0].integer_reference;
9671 channel_mask=SetPixelChannelMask(image,channel);
9672 (void) SeparateImage(image);
9673 (void) SetPixelChannelMask(image,channel_mask);
9676 case 87: /* Splice */
9678 if (attribute_flag[0] != 0)
9679 flags=ParseGravityGeometry(image,argument_list[0].string_reference,
9680 &geometry,exception);
9681 if (attribute_flag[1] != 0)
9682 geometry.width=argument_list[1].integer_reference;
9683 if (attribute_flag[2] != 0)
9684 geometry.height=argument_list[2].integer_reference;
9685 if (attribute_flag[3] != 0)
9686 geometry.x=argument_list[3].integer_reference;
9687 if (attribute_flag[4] != 0)
9688 geometry.y=argument_list[4].integer_reference;
9689 if (attribute_flag[5] != 0)
9690 image->fuzz=SiPrefixToDouble(argument_list[5].string_reference,
9692 if (attribute_flag[6] != 0)
9693 (void) QueryColorDatabase(argument_list[6].string_reference,
9694 &image->background_color,exception);
9695 if (attribute_flag[7] != 0)
9696 image->gravity=(GravityType) argument_list[7].integer_reference;
9697 image=SpliceImage(image,&geometry,exception);
9700 case 88: /* Posterize */
9702 if (attribute_flag[0] == 0)
9703 argument_list[0].integer_reference=3;
9704 if (attribute_flag[1] == 0)
9705 argument_list[1].integer_reference=0;
9706 (void) PosterizeImage(image,argument_list[0].integer_reference,
9707 argument_list[1].integer_reference ? MagickTrue : MagickFalse);
9710 case 89: /* Shadow */
9712 if (attribute_flag[0] != 0)
9714 flags=ParseGeometry(argument_list[0].string_reference,
9716 if ((flags & SigmaValue) == 0)
9717 geometry_info.sigma=1.0;
9718 if ((flags & XiValue) == 0)
9719 geometry_info.xi=4.0;
9720 if ((flags & PsiValue) == 0)
9721 geometry_info.psi=4.0;
9723 if (attribute_flag[1] != 0)
9724 geometry_info.rho=argument_list[1].real_reference;
9725 if (attribute_flag[2] != 0)
9726 geometry_info.sigma=argument_list[2].real_reference;
9727 if (attribute_flag[3] != 0)
9728 geometry_info.xi=argument_list[3].integer_reference;
9729 if (attribute_flag[4] != 0)
9730 geometry_info.psi=argument_list[4].integer_reference;
9731 image=ShadowImage(image,geometry_info.rho,geometry_info.sigma,
9732 (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi-
9736 case 90: /* Identify */
9738 if (attribute_flag[0] == 0)
9739 argument_list[0].file_reference=(FILE *) NULL;
9740 if (attribute_flag[1] != 0)
9741 (void) SetImageArtifact(image,"identify:features",
9742 argument_list[1].string_reference);
9743 if ((attribute_flag[2] != 0) &&
9744 (argument_list[2].integer_reference != 0))
9745 (void) SetImageArtifact(image,"identify:unique","true");
9746 (void) IdentifyImage(image,argument_list[0].file_reference,
9750 case 91: /* SepiaTone */
9752 if (attribute_flag[0] == 0)
9753 argument_list[0].real_reference=80.0*QuantumRange/100.0;
9754 image=SepiaToneImage(image,argument_list[0].real_reference,
9758 case 92: /* SigmoidalContrast */
9763 if (attribute_flag[0] != 0)
9765 flags=ParseGeometry(argument_list[0].string_reference,
9767 if ((flags & SigmaValue) == 0)
9768 geometry_info.sigma=QuantumRange/2.0;
9769 if ((flags & PercentValue) != 0)
9770 geometry_info.sigma=QuantumRange*geometry_info.sigma/100.0;
9772 if (attribute_flag[1] != 0)
9773 geometry_info.rho=argument_list[1].real_reference;
9774 if (attribute_flag[2] != 0)
9775 geometry_info.sigma=argument_list[2].real_reference;
9776 if (attribute_flag[3] != 0)
9777 channel=(ChannelType) argument_list[3].integer_reference;
9779 if (attribute_flag[4] != 0)
9780 sharpen=argument_list[4].integer_reference != 0 ? MagickTrue :
9782 channel_mask=SetPixelChannelMask(image,channel);
9783 (void) SigmoidalContrastImage(image,sharpen,geometry_info.rho,
9784 geometry_info.sigma);
9785 (void) SetPixelChannelMask(image,channel_mask);
9788 case 93: /* Extent */
9790 if (attribute_flag[7] != 0)
9791 image->gravity=(GravityType) argument_list[7].integer_reference;
9792 if (attribute_flag[0] != 0)
9797 flags=ParseGravityGeometry(image,
9798 argument_list[0].string_reference,&geometry,exception);
9800 if (geometry.width == 0)
9801 geometry.width=image->columns;
9802 if (geometry.height == 0)
9803 geometry.height=image->rows;
9805 if (attribute_flag[1] != 0)
9806 geometry.width=argument_list[1].integer_reference;
9807 if (attribute_flag[2] != 0)
9808 geometry.height=argument_list[2].integer_reference;
9809 if (attribute_flag[3] != 0)
9810 geometry.x=argument_list[3].integer_reference;
9811 if (attribute_flag[4] != 0)
9812 geometry.y=argument_list[4].integer_reference;
9813 if (attribute_flag[5] != 0)
9814 image->fuzz=SiPrefixToDouble(argument_list[5].string_reference,
9816 if (attribute_flag[6] != 0)
9817 (void) QueryColorDatabase(argument_list[6].string_reference,
9818 &image->background_color,exception);
9819 image=ExtentImage(image,&geometry,exception);
9822 case 94: /* Vignette */
9824 if (attribute_flag[0] != 0)
9826 flags=ParseGeometry(argument_list[0].string_reference,
9828 if ((flags & SigmaValue) == 0)
9829 geometry_info.sigma=1.0;
9830 if ((flags & XiValue) == 0)
9831 geometry_info.xi=0.1*image->columns;
9832 if ((flags & PsiValue) == 0)
9833 geometry_info.psi=0.1*image->rows;
9835 if (attribute_flag[1] != 0)
9836 geometry_info.rho=argument_list[1].real_reference;
9837 if (attribute_flag[2] != 0)
9838 geometry_info.sigma=argument_list[2].real_reference;
9839 if (attribute_flag[3] != 0)
9840 geometry_info.xi=argument_list[3].integer_reference;
9841 if (attribute_flag[4] != 0)
9842 geometry_info.psi=argument_list[4].integer_reference;
9843 if (attribute_flag[5] != 0)
9844 (void) QueryColorDatabase(argument_list[5].string_reference,
9845 &image->background_color,exception);
9846 image=VignetteImage(image,geometry_info.rho,geometry_info.sigma,
9847 (ssize_t) ceil(geometry_info.xi-0.5),(ssize_t) ceil(geometry_info.psi-
9851 case 95: /* ContrastStretch */
9858 white_point=(MagickRealType) image->columns*image->rows;
9859 if (attribute_flag[0] != 0)
9861 flags=ParseGeometry(argument_list[0].string_reference,
9863 black_point=geometry_info.rho;
9864 white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma :
9866 if ((flags & PercentValue) != 0)
9868 black_point*=(double) image->columns*image->rows/100.0;
9869 white_point*=(double) image->columns*image->rows/100.0;
9871 white_point=(MagickRealType) image->columns*image->rows-
9874 if (attribute_flag[1] != 0)
9875 black_point=argument_list[1].real_reference;
9876 if (attribute_flag[2] != 0)
9877 white_point=argument_list[2].real_reference;
9878 if (attribute_flag[4] != 0)
9879 channel=(ChannelType) argument_list[4].integer_reference;
9880 channel_mask=SetPixelChannelMask(image,channel);
9881 (void) ContrastStretchImage(image,black_point,white_point,exception);
9882 (void) SetPixelChannelMask(image,channel_mask);
9885 case 96: /* Sans0 */
9889 case 97: /* Sans1 */
9893 case 98: /* AdaptiveSharpen */
9895 if (attribute_flag[0] != 0)
9897 flags=ParseGeometry(argument_list[0].string_reference,
9899 if ((flags & SigmaValue) == 0)
9900 geometry_info.sigma=1.0;
9902 if (attribute_flag[1] != 0)
9903 geometry_info.rho=argument_list[1].real_reference;
9904 if (attribute_flag[2] != 0)
9905 geometry_info.sigma=argument_list[2].real_reference;
9906 if (attribute_flag[3] != 0)
9907 channel=(ChannelType) argument_list[3].integer_reference;
9908 channel_mask=SetPixelChannelMask(image,channel);
9909 image=AdaptiveSharpenImage(image,geometry_info.rho,
9910 geometry_info.sigma,exception);
9911 if (image != (Image *) NULL)
9912 (void) SetPixelChannelMask(image,channel_mask);
9915 case 99: /* Transpose */
9917 image=TransposeImage(image,exception);
9920 case 100: /* Tranverse */
9922 image=TransverseImage(image,exception);
9925 case 101: /* AutoOrient */
9927 switch (image->orientation)
9929 case TopRightOrientation:
9931 image=FlopImage(image,exception);
9934 case BottomRightOrientation:
9936 image=RotateImage(image,180.0,exception);
9939 case BottomLeftOrientation:
9941 image=FlipImage(image,exception);
9944 case LeftTopOrientation:
9946 image=TransposeImage(image,exception);
9949 case RightTopOrientation:
9951 image=RotateImage(image,90.0,exception);
9954 case RightBottomOrientation:
9956 image=TransverseImage(image,exception);
9959 case LeftBottomOrientation:
9961 image=RotateImage(image,270.0,exception);
9969 case 102: /* AdaptiveBlur */
9971 if (attribute_flag[0] != 0)
9973 flags=ParseGeometry(argument_list[0].string_reference,
9975 if ((flags & SigmaValue) == 0)
9976 geometry_info.sigma=1.0;
9978 if (attribute_flag[1] != 0)
9979 geometry_info.rho=argument_list[1].real_reference;
9980 if (attribute_flag[2] != 0)
9981 geometry_info.sigma=argument_list[2].real_reference;
9982 if (attribute_flag[3] != 0)
9983 channel=(ChannelType) argument_list[3].integer_reference;
9984 channel_mask=SetPixelChannelMask(image,channel);
9985 image=AdaptiveBlurImage(image,geometry_info.rho,geometry_info.sigma,
9987 if (image != (Image *) NULL)
9988 (void) SetPixelChannelMask(image,channel_mask);
9991 case 103: /* Sketch */
9993 if (attribute_flag[0] != 0)
9995 flags=ParseGeometry(argument_list[0].string_reference,
9997 if ((flags & SigmaValue) == 0)
9998 geometry_info.sigma=1.0;
9999 if ((flags & XiValue) == 0)
10000 geometry_info.xi=1.0;
10002 if (attribute_flag[1] != 0)
10003 geometry_info.rho=argument_list[1].real_reference;
10004 if (attribute_flag[2] != 0)
10005 geometry_info.sigma=argument_list[2].real_reference;
10006 if (attribute_flag[3] != 0)
10007 geometry_info.xi=argument_list[3].real_reference;
10008 image=SketchImage(image,geometry_info.rho,geometry_info.sigma,
10009 geometry_info.xi,exception);
10012 case 104: /* UniqueColors */
10014 image=UniqueImageColors(image,exception);
10017 case 105: /* AdaptiveResize */
10019 if (attribute_flag[0] != 0)
10020 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
10021 &geometry,exception);
10022 if (attribute_flag[1] != 0)
10023 geometry.width=argument_list[1].integer_reference;
10024 if (attribute_flag[2] != 0)
10025 geometry.height=argument_list[2].integer_reference;
10026 if (attribute_flag[3] != 0)
10027 image->filter=(FilterTypes) argument_list[4].integer_reference;
10028 if (attribute_flag[4] != 0)
10029 SetImageArtifact(image,"filter:support",
10030 argument_list[4].string_reference);
10031 if (attribute_flag[5] != 0)
10032 image->blur=argument_list[5].real_reference;
10033 image=AdaptiveResizeImage(image,geometry.width,geometry.height,
10037 case 106: /* ClipMask */
10039 if (attribute_flag[0] == 0)
10041 ThrowPerlException(exception,OptionError,"MaskImageRequired",
10043 goto PerlException;
10045 image->clip_mask=CloneImage(argument_list[0].image_reference,0,0,
10046 MagickTrue,exception);
10047 (void) NegateImage(image->clip_mask,MagickFalse,exception);
10050 case 107: /* LinearStretch */
10057 white_point=(MagickRealType) image->columns*image->rows;
10058 if (attribute_flag[0] != 0)
10060 flags=ParseGeometry(argument_list[0].string_reference,
10062 if ((flags & SigmaValue) != 0)
10063 white_point=geometry_info.sigma;
10064 if ((flags & PercentValue) != 0)
10066 black_point*=(double) image->columns*image->rows/100.0;
10067 white_point*=(double) image->columns*image->rows/100.0;
10069 if ((flags & SigmaValue) == 0)
10070 white_point=(double) image->columns*image->rows-black_point;
10072 if (attribute_flag[1] != 0)
10073 black_point=argument_list[1].real_reference;
10074 if (attribute_flag[2] != 0)
10075 white_point=argument_list[2].real_reference;
10076 (void) LinearStretchImage(image,black_point,white_point);
10079 case 109: /* Mask */
10081 if (attribute_flag[0] == 0)
10083 ThrowPerlException(exception,OptionError,"MaskImageRequired",
10085 goto PerlException;
10087 image->mask=CloneImage(argument_list[0].image_reference,0,0,
10088 MagickTrue,exception);
10089 (void) NegateImage(image->mask,MagickFalse,exception);
10092 case 110: /* Polaroid */
10100 draw_info=CloneDrawInfo(info ? info->image_info : (ImageInfo *) NULL,
10101 (DrawInfo *) NULL);
10102 if (attribute_flag[0] != 0)
10103 (void) SetImageProperty(image,"caption",InterpretImageProperties(
10104 info ? info->image_info : (ImageInfo *) NULL,image,
10105 argument_list[0].string_reference));
10107 if (attribute_flag[1] != 0)
10108 angle=argument_list[1].real_reference;
10109 if (attribute_flag[2] != 0)
10110 (void) CloneString(&draw_info->font,
10111 argument_list[2].string_reference);
10112 if (attribute_flag[3] != 0)
10113 (void) QueryColorDatabase(argument_list[3].string_reference,
10114 &draw_info->stroke,exception);
10115 if (attribute_flag[4] != 0)
10116 (void) QueryColorDatabase(argument_list[4].string_reference,
10117 &draw_info->fill,exception);
10118 if (attribute_flag[5] != 0)
10119 draw_info->stroke_width=argument_list[5].real_reference;
10120 if (attribute_flag[6] != 0)
10121 draw_info->pointsize=argument_list[6].real_reference;
10122 if (attribute_flag[7] != 0)
10123 draw_info->gravity=(GravityType) argument_list[7].integer_reference;
10124 if (attribute_flag[8] != 0)
10125 (void) QueryColorDatabase(argument_list[8].string_reference,
10126 &image->background_color,exception);
10127 image=PolaroidImage(image,draw_info,angle,exception);
10128 draw_info=DestroyDrawInfo(draw_info);
10131 case 111: /* FloodfillPaint */
10142 draw_info=CloneDrawInfo(info ? info->image_info :
10143 (ImageInfo *) NULL,(DrawInfo *) NULL);
10144 if (attribute_flag[0] != 0)
10145 flags=ParsePageGeometry(image,argument_list[0].string_reference,
10146 &geometry,exception);
10147 if (attribute_flag[1] != 0)
10148 geometry.x=argument_list[1].integer_reference;
10149 if (attribute_flag[2] != 0)
10150 geometry.y=argument_list[2].integer_reference;
10151 if (attribute_flag[3] != 0)
10152 (void) QueryColorDatabase(argument_list[3].string_reference,
10153 &draw_info->fill,exception);
10154 (void) GetOneVirtualMagickPixel(image,geometry.x,geometry.y,&target,
10156 if (attribute_flag[4] != 0)
10157 QueryMagickColor(argument_list[4].string_reference,&target,
10159 if (attribute_flag[5] != 0)
10160 image->fuzz=SiPrefixToDouble(argument_list[5].string_reference,
10162 if (attribute_flag[6] != 0)
10163 channel=(ChannelType) argument_list[6].integer_reference;
10164 invert=MagickFalse;
10165 if (attribute_flag[7] != 0)
10166 invert=(MagickBooleanType) argument_list[7].integer_reference;
10167 channel_mask=SetPixelChannelMask(image,channel);
10168 (void) FloodfillPaintImage(image,draw_info,&target,geometry.x,
10169 geometry.y,invert);
10170 (void) SetPixelChannelMask(image,channel_mask);
10171 draw_info=DestroyDrawInfo(draw_info);
10174 case 112: /* Distort */
10186 number_coordinates;
10191 if (attribute_flag[0] == 0)
10193 method=UndefinedDistortion;
10194 if (attribute_flag[1] != 0)
10195 method=(DistortImageMethod) argument_list[1].integer_reference;
10196 av=(AV *) argument_list[0].array_reference;
10197 number_coordinates=(size_t) av_len(av)+1;
10198 coordinates=(double *) AcquireQuantumMemory(number_coordinates,
10199 sizeof(*coordinates));
10200 if (coordinates == (double *) NULL)
10202 ThrowPerlException(exception,ResourceLimitFatalError,
10203 "MemoryAllocationFailed",PackageName);
10204 goto PerlException;
10206 for (j=0; j < (ssize_t) number_coordinates; j++)
10207 coordinates[j]=(double) SvNV(*(av_fetch(av,j,0)));
10208 virtual_pixel=UndefinedVirtualPixelMethod;
10209 if (attribute_flag[2] != 0)
10210 virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod)
10211 argument_list[2].integer_reference);
10212 image=DistortImage(image,method,number_coordinates,coordinates,
10213 argument_list[3].integer_reference != 0 ? MagickTrue : MagickFalse,
10215 if ((attribute_flag[2] != 0) && (image != (Image *) NULL))
10216 virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel);
10217 coordinates=(double *) RelinquishMagickMemory(coordinates);
10220 case 113: /* Clut */
10222 if (attribute_flag[0] == 0)
10224 ThrowPerlException(exception,OptionError,"ClutImageRequired",
10226 goto PerlException;
10228 if (attribute_flag[1] != 0)
10229 channel=(ChannelType) argument_list[1].integer_reference;
10230 channel_mask=SetPixelChannelMask(image,channel);
10231 (void) ClutImage(image,argument_list[0].image_reference,exception);
10232 (void) SetPixelChannelMask(image,channel_mask);
10235 case 114: /* LiquidRescale */
10237 if (attribute_flag[0] != 0)
10238 flags=ParseRegionGeometry(image,argument_list[0].string_reference,
10239 &geometry,exception);
10240 if (attribute_flag[1] != 0)
10241 geometry.width=argument_list[1].integer_reference;
10242 if (attribute_flag[2] != 0)
10243 geometry.height=argument_list[2].integer_reference;
10244 if (attribute_flag[3] == 0)
10245 argument_list[3].real_reference=1.0;
10246 if (attribute_flag[4] == 0)
10247 argument_list[4].real_reference=0.0;
10248 image=LiquidRescaleImage(image,geometry.width,geometry.height,
10249 argument_list[3].real_reference,argument_list[4].real_reference,
10253 case 115: /* EncipherImage */
10255 (void) EncipherImage(image,argument_list[0].string_reference,
10259 case 116: /* DecipherImage */
10261 (void) DecipherImage(image,argument_list[0].string_reference,
10265 case 117: /* Deskew */
10267 geometry_info.rho=QuantumRange/2.0;
10268 if (attribute_flag[0] != 0)
10269 flags=ParseGeometry(argument_list[0].string_reference,
10271 if (attribute_flag[1] != 0)
10272 geometry_info.rho=SiPrefixToDouble(
10273 argument_list[1].string_reference,QuantumRange);
10274 image=DeskewImage(image,geometry_info.rho,exception);
10277 case 118: /* Remap */
10282 if (attribute_flag[0] == 0)
10284 ThrowPerlException(exception,OptionError,"RemapImageRequired",
10286 goto PerlException;
10288 quantize_info=AcquireQuantizeInfo(info->image_info);
10289 if (attribute_flag[1] != 0)
10290 quantize_info->dither=(MagickBooleanType)
10291 argument_list[1].integer_reference;
10292 if (attribute_flag[2] != 0)
10293 quantize_info->dither_method=(DitherMethod)
10294 argument_list[2].integer_reference;
10295 (void) RemapImages(quantize_info,image,
10296 argument_list[0].image_reference);
10297 quantize_info=DestroyQuantizeInfo(quantize_info);
10300 case 119: /* SparseColor */
10312 number_coordinates;
10317 if (attribute_flag[0] == 0)
10319 method=UndefinedColorInterpolate;
10320 if (attribute_flag[1] != 0)
10321 method=(SparseColorMethod) argument_list[1].integer_reference;
10322 av=(AV *) argument_list[0].array_reference;
10323 number_coordinates=(size_t) av_len(av)+1;
10324 coordinates=(double *) AcquireQuantumMemory(number_coordinates,
10325 sizeof(*coordinates));
10326 if (coordinates == (double *) NULL)
10328 ThrowPerlException(exception,ResourceLimitFatalError,
10329 "MemoryAllocationFailed",PackageName);
10330 goto PerlException;
10332 for (j=0; j < (ssize_t) number_coordinates; j++)
10333 coordinates[j]=(double) SvNV(*(av_fetch(av,j,0)));
10334 virtual_pixel=UndefinedVirtualPixelMethod;
10335 if (attribute_flag[2] != 0)
10336 virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod)
10337 argument_list[2].integer_reference);
10338 if (attribute_flag[3] != 0)
10339 channel=(ChannelType) argument_list[3].integer_reference;
10340 channel_mask=SetPixelChannelMask(image,channel);
10341 image=SparseColorImage(image,method,number_coordinates,coordinates,
10343 if (image != (Image *) NULL)
10344 (void) SetPixelChannelMask(image,channel_mask);
10345 if ((attribute_flag[2] != 0) && (image != (Image *) NULL))
10346 virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel);
10347 coordinates=(double *) RelinquishMagickMemory(coordinates);
10350 case 120: /* Function */
10367 if (attribute_flag[0] == 0)
10369 function=UndefinedFunction;
10370 if (attribute_flag[1] != 0)
10371 function=(MagickFunction) argument_list[1].integer_reference;
10372 av=(AV *) argument_list[0].array_reference;
10373 number_parameters=(size_t) av_len(av)+1;
10374 parameters=(double *) AcquireQuantumMemory(number_parameters,
10375 sizeof(*parameters));
10376 if (parameters == (double *) NULL)
10378 ThrowPerlException(exception,ResourceLimitFatalError,
10379 "MemoryAllocationFailed",PackageName);
10380 goto PerlException;
10382 for (j=0; j < (ssize_t) number_parameters; j++)
10383 parameters[j]=(double) SvNV(*(av_fetch(av,j,0)));
10384 virtual_pixel=UndefinedVirtualPixelMethod;
10385 if (attribute_flag[2] != 0)
10386 virtual_pixel=SetImageVirtualPixelMethod(image,(VirtualPixelMethod)
10387 argument_list[2].integer_reference);
10388 (void) FunctionImage(image,function,number_parameters,parameters,
10390 if ((attribute_flag[2] != 0) && (image != (Image *) NULL))
10391 virtual_pixel=SetImageVirtualPixelMethod(image,virtual_pixel);
10392 parameters=(double *) RelinquishMagickMemory(parameters);
10395 case 121: /* SelectiveBlur */
10397 if (attribute_flag[0] != 0)
10399 flags=ParseGeometry(argument_list[0].string_reference,
10401 if ((flags & SigmaValue) == 0)
10402 geometry_info.sigma=1.0;
10403 if ((flags & PercentValue) != 0)
10404 geometry_info.xi=QuantumRange*geometry_info.xi/100.0;
10406 if (attribute_flag[1] != 0)
10407 geometry_info.rho=argument_list[1].real_reference;
10408 if (attribute_flag[2] != 0)
10409 geometry_info.sigma=argument_list[2].real_reference;
10410 if (attribute_flag[3] != 0)
10411 geometry_info.xi=argument_list[3].integer_reference;;
10412 if (attribute_flag[4] != 0)
10413 channel=(ChannelType) argument_list[4].integer_reference;
10414 channel_mask=SetPixelChannelMask(image,channel);
10415 image=SelectiveBlurImage(image,geometry_info.rho,geometry_info.sigma,
10416 geometry_info.xi,exception);
10417 if (image != (Image *) NULL)
10418 (void) SetPixelChannelMask(image,channel_mask);
10421 case 122: /* HaldClut */
10423 if (attribute_flag[0] == 0)
10425 ThrowPerlException(exception,OptionError,"ClutImageRequired",
10427 goto PerlException;
10429 if (attribute_flag[1] != 0)
10430 channel=(ChannelType) argument_list[1].integer_reference;
10431 channel_mask=SetPixelChannelMask(image,channel);
10432 (void) HaldClutImage(image,argument_list[0].image_reference,
10434 (void) SetPixelChannelMask(image,channel_mask);
10437 case 123: /* BlueShift */
10439 if (attribute_flag[0] != 0)
10440 (void) ParseGeometry(argument_list[0].string_reference,
10442 image=BlueShiftImage(image,geometry_info.rho,exception);
10445 case 124: /* ForwardFourierTransformImage */
10447 image=ForwardFourierTransformImage(image,
10448 argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse,
10452 case 125: /* InverseFourierTransformImage */
10454 image=InverseFourierTransformImage(image,image->next,
10455 argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse,
10459 case 126: /* ColorDecisionList */
10461 if (attribute_flag[0] == 0)
10462 argument_list[0].string_reference=(char *) NULL;
10463 (void) ColorDecisionListImage(image,
10464 argument_list[0].string_reference,exception);
10467 case 127: /* AutoGamma */
10469 if (attribute_flag[0] != 0)
10470 channel=(ChannelType) argument_list[0].integer_reference;
10471 channel_mask=SetPixelChannelMask(image,channel);
10472 (void) AutoGammaImage(image,exception);
10473 (void) SetPixelChannelMask(image,channel_mask);
10476 case 128: /* AutoLevel */
10478 if (attribute_flag[0] != 0)
10479 channel=(ChannelType) argument_list[0].integer_reference;
10480 channel_mask=SetPixelChannelMask(image,channel);
10481 (void) AutoLevelImage(image,exception);
10482 (void) SetPixelChannelMask(image,channel_mask);
10485 case 129: /* LevelColors */
10491 (void) QueryMagickColor("#000000",&black_point,exception);
10492 (void) QueryMagickColor("#ffffff",&white_point,exception);
10493 if (attribute_flag[1] != 0)
10494 (void) QueryMagickColor(argument_list[1].string_reference,
10495 &black_point,exception);
10496 if (attribute_flag[2] != 0)
10497 (void) QueryMagickColor(argument_list[2].string_reference,
10498 &white_point,exception);
10499 if (attribute_flag[3] != 0)
10500 channel=(ChannelType) argument_list[3].integer_reference;
10501 channel_mask=SetPixelChannelMask(image,channel);
10502 (void) LevelImageColors(image,&black_point,&white_point,
10503 argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse,
10505 (void) SetPixelChannelMask(image,channel_mask);
10508 case 130: /* Clamp */
10510 if (attribute_flag[0] != 0)
10511 channel=(ChannelType) argument_list[0].integer_reference;
10512 channel_mask=SetPixelChannelMask(image,channel);
10513 (void) ClampImage(image);
10514 (void) SetPixelChannelMask(image,channel_mask);
10517 case 132: /* BrightnessContrast */
10525 if (attribute_flag[0] != 0)
10527 flags=ParseGeometry(argument_list[0].string_reference,
10529 brightness=geometry_info.rho;
10530 if ((flags & SigmaValue) == 0)
10531 contrast=geometry_info.sigma;
10533 if (attribute_flag[1] != 0)
10534 brightness=argument_list[1].real_reference;
10535 if (attribute_flag[2] != 0)
10536 contrast=argument_list[2].real_reference;
10537 if (attribute_flag[4] != 0)
10538 channel=(ChannelType) argument_list[4].integer_reference;
10539 channel_mask=SetPixelChannelMask(image,channel);
10540 (void) BrightnessContrastImage(image,brightness,contrast,exception);
10541 (void) SetPixelChannelMask(image,channel_mask);
10544 case 133: /* Morphology */
10555 if (attribute_flag[0] == 0)
10557 kernel=AcquireKernelInfo(argument_list[0].string_reference);
10558 if (kernel == (KernelInfo *) NULL)
10560 if (attribute_flag[1] != 0)
10561 channel=(ChannelType) argument_list[1].integer_reference;
10562 method=UndefinedMorphology;
10563 if (attribute_flag[2] != 0)
10564 method=argument_list[2].integer_reference;
10566 if (attribute_flag[3] != 0)
10567 iterations=argument_list[4].integer_reference;
10568 channel_mask=SetPixelChannelMask(image,channel);
10569 image=MorphologyImage(image,method,iterations,kernel,exception);
10570 if (image != (Image *) NULL)
10571 (void) SetPixelChannelMask(image,channel_mask);
10572 kernel=DestroyKernelInfo(kernel);
10575 case 108: /* Recolor */
10576 case 134: /* ColorMatrix */
10590 if (attribute_flag[0] == 0)
10592 av=(AV *) argument_list[0].array_reference;
10593 if (av == (AV *) NULL)
10595 order=(size_t) sqrt(av_len(av)+1);
10596 color_matrix=(double *) AcquireQuantumMemory(order,order*
10597 sizeof(*color_matrix));
10598 if (color_matrix == (double *) NULL)
10600 ThrowPerlException(exception,ResourceLimitFatalError,
10601 "MemoryAllocationFailed",PackageName);
10602 goto PerlException;
10604 for (j=0; (j < (ssize_t) (order*order)) && (j < (av_len(av)+1)); j++)
10605 color_matrix[j]=(double) SvNV(*(av_fetch(av,j,0)));
10606 for ( ; j < (ssize_t) (order*order); j++)
10607 color_matrix[j]=0.0;
10608 kernel_info=AcquireKernelInfo((const char *) NULL);
10609 if (kernel_info == (KernelInfo *) NULL)
10611 kernel_info->width=order;
10612 kernel_info->height=order;
10613 kernel_info->values=color_matrix;
10614 image=ColorMatrixImage(image,kernel_info,exception);
10615 kernel_info->values=(double *) NULL;
10616 kernel_info=DestroyKernelInfo(kernel_info);
10617 color_matrix=(double *) RelinquishMagickMemory(color_matrix);
10620 case 135: /* Color */
10625 (void) QueryMagickColor("none",&color,exception);
10626 if (attribute_flag[0] != 0)
10627 (void) QueryMagickColor(argument_list[0].string_reference,
10629 (void) SetImageColor(image,&color);
10632 case 136: /* Mode */
10634 if (attribute_flag[0] != 0)
10636 flags=ParseGeometry(argument_list[0].string_reference,
10638 if ((flags & SigmaValue) == 0)
10639 geometry_info.sigma=1.0;
10641 if (attribute_flag[1] != 0)
10642 geometry_info.rho=argument_list[1].real_reference;
10643 if (attribute_flag[2] != 0)
10644 geometry_info.sigma=argument_list[2].real_reference;
10645 if (attribute_flag[3] != 0)
10646 channel=(ChannelType) argument_list[3].integer_reference;
10647 channel_mask=SetPixelChannelMask(image,channel);
10648 image=StatisticImage(image,ModeStatistic,(size_t) geometry_info.rho,
10649 (size_t) geometry_info.sigma,exception);
10650 if (image != (Image *) NULL)
10651 (void) SetPixelChannelMask(image,channel_mask);
10654 case 137: /* Statistic */
10659 statistic=UndefinedStatistic;
10660 if (attribute_flag[0] != 0)
10662 flags=ParseGeometry(argument_list[0].string_reference,
10664 if ((flags & SigmaValue) == 0)
10665 geometry_info.sigma=1.0;
10667 if (attribute_flag[1] != 0)
10668 geometry_info.rho=argument_list[1].real_reference;
10669 if (attribute_flag[2] != 0)
10670 geometry_info.sigma=argument_list[2].real_reference;
10671 if (attribute_flag[3] != 0)
10672 channel=(ChannelType) argument_list[3].integer_reference;
10673 if (attribute_flag[4] != 0)
10674 statistic=(StatisticType) argument_list[4].integer_reference;
10675 channel_mask=SetPixelChannelMask(image,channel);
10676 image=StatisticImage(image,statistic,(size_t) geometry_info.rho,
10677 (size_t) geometry_info.sigma,exception);
10678 if (image != (Image *) NULL)
10679 (void) SetPixelChannelMask(image,channel_mask);
10683 if (next != (Image *) NULL)
10684 (void) CatchImageException(next);
10685 if (region_image != (Image *) NULL)
10690 status=CompositeImage(region_image,CopyCompositeOp,image,
10691 region_info.x,region_info.y);
10693 (void) CatchImageException(region_image);
10694 image=DestroyImage(image);
10695 image=region_image;
10697 if (image != (Image *) NULL)
10700 if (next && (next != image))
10702 image->next=next->next;
10703 DeleteImageFromRegistry(*pv,next);
10705 sv_setiv(*pv,(IV) image);
10713 if (reference_vector)
10714 reference_vector=(SV **) RelinquishMagickMemory(reference_vector);
10715 InheritPerlException(exception,perl_exception);
10716 exception=DestroyExceptionInfo(exception);
10717 sv_setiv(perl_exception,(IV) number_images);
10718 SvPOK_on(perl_exception);
10719 ST(0)=sv_2mortal(perl_exception);
10724 ###############################################################################
10732 ###############################################################################
10737 Image::Magick ref=NO_INIT
10782 PERL_UNUSED_VAR(ref);
10783 PERL_UNUSED_VAR(ix);
10784 exception=AcquireExceptionInfo();
10785 perl_exception=newSVpv("",0);
10788 if (sv_isobject(ST(0)) == 0)
10790 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
10792 goto PerlException;
10794 reference=SvRV(ST(0));
10795 hv=SvSTASH(reference);
10797 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
10799 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
10800 if (image == (Image *) NULL)
10802 ThrowPerlException(exception,OptionError,"NoImagesDefined",
10804 goto PerlException;
10809 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
10810 montage_info=CloneMontageInfo(info->image_info,(MontageInfo *) NULL);
10811 (void) QueryMagickColor("none",&transparent_color,exception);
10812 for (i=2; i < items; i+=2)
10814 attribute=(char *) SvPV(ST(i-1),na);
10815 switch (*attribute)
10820 if (LocaleCompare(attribute,"background") == 0)
10822 (void) QueryColorDatabase(SvPV(ST(i),na),
10823 &montage_info->background_color,exception);
10824 for (next=image; next; next=next->next)
10825 next->background_color=montage_info->background_color;
10828 if (LocaleCompare(attribute,"border") == 0)
10830 montage_info->border_width=SvIV(ST(i));
10833 if (LocaleCompare(attribute,"bordercolor") == 0)
10835 (void) QueryColorDatabase(SvPV(ST(i),na),
10836 &montage_info->border_color,exception);
10837 for (next=image; next; next=next->next)
10838 next->border_color=montage_info->border_color;
10841 if (LocaleCompare(attribute,"borderwidth") == 0)
10843 montage_info->border_width=SvIV(ST(i));
10846 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
10853 if (LocaleCompare(attribute,"compose") == 0)
10855 sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
10856 MagickComposeOptions,MagickFalse,SvPV(ST(i),na));
10859 ThrowPerlException(exception,OptionError,"UnrecognizedType",
10863 for (next=image; next; next=next->next)
10864 next->compose=(CompositeOperator) sp;
10867 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
10874 if (LocaleCompare(attribute,"fill") == 0)
10876 (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->fill,
10880 if (LocaleCompare(attribute,"font") == 0)
10882 (void) CloneString(&montage_info->font,SvPV(ST(i),na));
10885 if (LocaleCompare(attribute,"frame") == 0)
10891 if (IsGeometry(p) == MagickFalse)
10893 ThrowPerlException(exception,OptionError,"MissingGeometry",
10897 (void) CloneString(&montage_info->frame,p);
10899 montage_info->frame=(char *) NULL;
10902 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
10909 if (LocaleCompare(attribute,"geometry") == 0)
10915 if (IsGeometry(p) == MagickFalse)
10917 ThrowPerlException(exception,OptionError,"MissingGeometry",
10921 (void) CloneString(&montage_info->geometry,p);
10923 montage_info->geometry=(char *) NULL;
10926 if (LocaleCompare(attribute,"gravity") == 0)
10931 in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
10932 MagickGravityOptions,MagickFalse,SvPV(ST(i),na));
10935 ThrowPerlException(exception,OptionError,"UnrecognizedType",
10939 montage_info->gravity=(GravityType) in;
10940 for (next=image; next; next=next->next)
10941 next->gravity=(GravityType) in;
10944 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
10951 if (LocaleCompare(attribute,"label") == 0)
10953 for (next=image; next; next=next->next)
10954 (void) SetImageProperty(next,"label",InterpretImageProperties(
10955 info ? info->image_info : (ImageInfo *) NULL,next,
10959 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
10966 if (LocaleCompare(attribute,"mattecolor") == 0)
10968 (void) QueryColorDatabase(SvPV(ST(i),na),
10969 &montage_info->matte_color,exception);
10970 for (next=image; next; next=next->next)
10971 next->matte_color=montage_info->matte_color;
10974 if (LocaleCompare(attribute,"mode") == 0)
10979 in=!SvPOK(ST(i)) ? SvIV(ST(i)) :
10980 ParseCommandOption(MagickModeOptions,MagickFalse,SvPV(ST(i),na));
10985 ThrowPerlException(exception,OptionError,
10986 "UnrecognizedModeType",SvPV(ST(i),na));
10991 (void) CloneString(&montage_info->frame,"15x15+3+3");
10992 montage_info->shadow=MagickTrue;
10997 montage_info->frame=(char *) NULL;
10998 montage_info->shadow=MagickFalse;
10999 montage_info->border_width=0;
11002 case ConcatenateMode:
11004 montage_info->frame=(char *) NULL;
11005 montage_info->shadow=MagickFalse;
11006 (void) CloneString(&montage_info->geometry,"+0+0");
11007 montage_info->border_width=0;
11012 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11019 if (LocaleCompare(attribute,"pointsize") == 0)
11021 montage_info->pointsize=SvIV(ST(i));
11024 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11031 if (LocaleCompare(attribute,"shadow") == 0)
11033 sp=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
11034 MagickBooleanOptions,MagickFalse,SvPV(ST(i),na));
11037 ThrowPerlException(exception,OptionError,"UnrecognizedType",
11041 montage_info->shadow=sp != 0 ? MagickTrue : MagickFalse;
11044 if (LocaleCompare(attribute,"stroke") == 0)
11046 (void) QueryColorDatabase(SvPV(ST(i),na),&montage_info->stroke,
11050 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11057 if (LocaleCompare(attribute,"texture") == 0)
11059 (void) CloneString(&montage_info->texture,SvPV(ST(i),na));
11062 if (LocaleCompare(attribute,"tile") == 0)
11064 char *p=SvPV(ST(i),na);
11065 if (IsGeometry(p) == MagickFalse)
11067 ThrowPerlException(exception,OptionError,"MissingGeometry",
11071 (void) CloneString(&montage_info->tile,p);
11073 montage_info->tile=(char *) NULL;
11076 if (LocaleCompare(attribute,"title") == 0)
11078 (void) CloneString(&montage_info->title,SvPV(ST(i),na));
11081 if (LocaleCompare(attribute,"transparent") == 0)
11086 QueryMagickColor(SvPV(ST(i),na),&transparent_color,exception);
11087 for (next=image; next; next=next->next)
11088 (void) TransparentPaintImage(next,&transparent_color,
11089 TransparentAlpha,MagickFalse);
11092 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11098 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11104 image=MontageImageList(info->image_info,montage_info,image,exception);
11105 montage_info=DestroyMontageInfo(montage_info);
11106 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
11107 goto PerlException;
11108 if (transparent_color.alpha != TransparentAlpha)
11109 for (next=image; next; next=next->next)
11110 (void) TransparentPaintImage(next,&transparent_color,
11111 TransparentAlpha,MagickFalse);
11112 for ( ; image; image=image->next)
11114 AddImageToRegistry(sv,image);
11116 av_push(av,sv_bless(rv,hv));
11119 exception=DestroyExceptionInfo(exception);
11120 ST(0)=av_reference;
11121 SvREFCNT_dec(perl_exception);
11125 InheritPerlException(exception,perl_exception);
11126 exception=DestroyExceptionInfo(exception);
11127 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
11128 SvPOK_on(perl_exception);
11129 ST(0)=sv_2mortal(perl_exception);
11134 ###############################################################################
11142 ###############################################################################
11147 Image::Magick ref=NO_INIT
11185 PERL_UNUSED_VAR(ref);
11186 PERL_UNUSED_VAR(ix);
11187 exception=AcquireExceptionInfo();
11188 perl_exception=newSVpv("",0);
11192 if (sv_isobject(ST(0)) == 0)
11194 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
11196 goto PerlException;
11198 reference=SvRV(ST(0));
11199 hv=SvSTASH(reference);
11201 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
11203 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
11204 if (image == (Image *) NULL)
11206 ThrowPerlException(exception,OptionError,"NoImagesDefined",
11208 goto PerlException;
11210 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
11215 for (i=2; i < items; i+=2)
11217 attribute=(char *) SvPV(ST(i-1),na);
11218 switch (*attribute)
11223 if (LocaleCompare(attribute,"frames") == 0)
11225 number_frames=SvIV(ST(i));
11228 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11234 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
11240 image=MorphImages(image,number_frames,exception);
11241 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
11242 goto PerlException;
11243 for ( ; image; image=image->next)
11245 AddImageToRegistry(sv,image);
11247 av_push(av,sv_bless(rv,hv));
11250 exception=DestroyExceptionInfo(exception);
11251 ST(0)=av_reference;
11252 SvREFCNT_dec(perl_exception); /* can't return warning messages */
11256 InheritPerlException(exception,perl_exception);
11257 exception=DestroyExceptionInfo(exception);
11258 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
11259 SvPOK_on(perl_exception);
11260 ST(0)=sv_2mortal(perl_exception);
11265 ###############################################################################
11273 ###############################################################################
11278 Image::Magick ref=NO_INIT
11306 PERL_UNUSED_VAR(ref);
11307 PERL_UNUSED_VAR(ix);
11308 exception=AcquireExceptionInfo();
11309 perl_exception=newSVpv("",0);
11311 if (sv_isobject(ST(0)) == 0)
11313 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
11315 goto PerlException;
11317 reference=SvRV(ST(0));
11318 hv=SvSTASH(reference);
11319 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
11320 if (image == (Image *) NULL)
11322 ThrowPerlException(exception,OptionError,"NoImagesDefined",
11324 goto PerlException;
11326 image=MergeImageLayers(image,MosaicLayer,exception);
11328 Create blessed Perl array for the returned image.
11331 ST(0)=sv_2mortal(sv_bless(newRV((SV *) av),hv));
11333 AddImageToRegistry(sv,image);
11335 av_push(av,sv_bless(rv,hv));
11337 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
11338 (void) CopyMagickString(image->filename,info->image_info->filename,
11340 SetImageInfo(info->image_info,0,&image->exception);
11341 exception=DestroyExceptionInfo(exception);
11342 SvREFCNT_dec(perl_exception);
11346 InheritPerlException(exception,perl_exception);
11347 exception=DestroyExceptionInfo(exception);
11348 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
11349 SvPOK_on(perl_exception); /* return messages in string context */
11350 ST(0)=sv_2mortal(perl_exception);
11355 ###############################################################################
11363 ###############################################################################
11368 Image::Magick ref=NO_INIT
11418 PERL_UNUSED_VAR(ref);
11419 PERL_UNUSED_VAR(ix);
11420 exception=AcquireExceptionInfo();
11421 perl_exception=newSVpv("",0);
11422 package_info=(struct PackageInfo *) NULL;
11423 ac=(items < 2) ? 1 : items-1;
11424 list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list));
11426 length=(STRLEN *) NULL;
11427 if (list == (char **) NULL)
11429 ThrowPerlException(exception,ResourceLimitError,
11430 "MemoryAllocationFailed",PackageName);
11431 goto PerlException;
11434 length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length));
11435 if (length == (STRLEN *) NULL)
11437 ThrowPerlException(exception,ResourceLimitError,
11438 "MemoryAllocationFailed",PackageName);
11439 goto PerlException;
11441 if (sv_isobject(ST(0)) == 0)
11443 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
11445 goto PerlException;
11447 reference=SvRV(ST(0));
11448 if (SvTYPE(reference) != SVt_PVAV)
11450 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
11452 goto PerlException;
11454 av=(AV *) reference;
11455 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
11457 package_info=ClonePackageInfo(info,exception);
11460 *list=(char *) (*package_info->image_info->filename ?
11461 package_info->image_info->filename : "XC:black");
11463 for (n=0, i=0; i < ac; i++)
11465 list[n]=(char *) SvPV(ST(i+1),length[n]);
11466 if ((items >= 3) && strEQcase(list[n],"blob"))
11472 blob=(void *) (SvPV(ST(i+1),length[n]));
11473 SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]);
11475 if ((items >= 3) && strEQcase(list[n],"filename"))
11477 if ((items >= 3) && strEQcase(list[n],"file"))
11486 io_info=IoIFP(sv_2io(ST(i+1)));
11487 if (io_info == (PerlIO *) NULL)
11489 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
11493 file=PerlIO_findFILE(io_info);
11494 if (file == (FILE *) NULL)
11496 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
11500 SetImageInfoFile(package_info->image_info,file);
11502 if ((items >= 3) && strEQcase(list[n],"magick"))
11506 list[n]=(char *) NULL;
11508 status=ExpandFilenames(&n,&list);
11509 if (status == MagickFalse)
11511 ThrowPerlException(exception,ResourceLimitError,
11512 "MemoryAllocationFailed",PackageName);
11513 goto PerlException;
11516 for (i=0; i < n; i++)
11518 (void) CopyMagickString(package_info->image_info->filename,list[i],
11520 image=PingImage(package_info->image_info,exception);
11521 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
11523 if ((package_info->image_info->file != (FILE *) NULL) ||
11524 (package_info->image_info->blob != (void *) NULL))
11525 DisassociateImageStream(image);
11526 count+=GetImageListLength(image);
11527 EXTEND(sp,4*count);
11528 for (next=image; next; next=next->next)
11530 PUSHs(sv_2mortal(newSViv(next->columns)));
11531 PUSHs(sv_2mortal(newSViv(next->rows)));
11532 PUSHs(sv_2mortal(newSViv((size_t) GetBlobSize(next))));
11533 PUSHs(sv_2mortal(newSVpv(next->magick,0)));
11535 image=DestroyImageList(image);
11540 for (i=0; i < n; i++)
11541 if (list[i] != (char *) NULL)
11542 for (p=keep; list[i] != *p++; )
11545 list[i]=(char *) RelinquishMagickMemory(list[i]);
11550 if (package_info != (struct PackageInfo *) NULL)
11551 DestroyPackageInfo(package_info);
11552 if (list && (list != keep))
11553 list=(char **) RelinquishMagickMemory(list);
11555 keep=(char **) RelinquishMagickMemory(keep);
11557 length=(STRLEN *) RelinquishMagickMemory(length);
11558 InheritPerlException(exception,perl_exception);
11559 exception=DestroyExceptionInfo(exception);
11560 SvREFCNT_dec(perl_exception); /* throw away all errors */
11564 ###############################################################################
11572 ###############################################################################
11577 Image::Magick ref=NO_INIT
11610 PERL_UNUSED_VAR(ref);
11611 PERL_UNUSED_VAR(ix);
11612 exception=AcquireExceptionInfo();
11613 perl_exception=newSVpv("",0);
11616 if (sv_isobject(ST(0)) == 0)
11618 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
11620 goto PerlException;
11622 reference=SvRV(ST(0));
11623 hv=SvSTASH(reference);
11625 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
11627 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
11628 if (image == (Image *) NULL)
11630 ThrowPerlException(exception,OptionError,"NoImagesDefined",
11632 goto PerlException;
11634 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
11635 preview_type=GammaPreview;
11637 preview_type=(PreviewType)
11638 ParseCommandOption(MagickPreviewOptions,MagickFalse,SvPV(ST(1),na));
11639 for ( ; image; image=image->next)
11641 preview_image=PreviewImage(image,preview_type,exception);
11642 if (preview_image == (Image *) NULL)
11643 goto PerlException;
11644 AddImageToRegistry(sv,preview_image);
11646 av_push(av,sv_bless(rv,hv));
11649 exception=DestroyExceptionInfo(exception);
11650 ST(0)=av_reference;
11651 SvREFCNT_dec(perl_exception); /* can't return warning messages */
11655 InheritPerlException(exception,perl_exception);
11656 exception=DestroyExceptionInfo(exception);
11657 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
11658 SvPOK_on(perl_exception);
11659 ST(0)=sv_2mortal(perl_exception);
11664 ###############################################################################
11668 # Q u e r y C o l o r #
11672 ###############################################################################
11676 QueryColor(ref,...)
11677 Image::Magick ref=NO_INIT
11697 PERL_UNUSED_VAR(ref);
11698 PERL_UNUSED_VAR(ix);
11699 exception=AcquireExceptionInfo();
11700 perl_exception=newSVpv("",0);
11709 colorlist=GetColorInfoList("*",&colors,exception);
11711 for (i=0; i < (ssize_t) colors; i++)
11713 PUSHs(sv_2mortal(newSVpv(colorlist[i]->name,0)));
11715 colorlist=(const ColorInfo **)
11716 RelinquishMagickMemory((ColorInfo **) colorlist);
11717 goto PerlException;
11719 EXTEND(sp,5*items);
11720 for (i=1; i < items; i++)
11722 name=(char *) SvPV(ST(i),na);
11723 if (QueryMagickColor(name,&color,exception) == MagickFalse)
11728 PUSHs(sv_2mortal(newSViv((size_t) floor(color.red+0.5))));
11729 PUSHs(sv_2mortal(newSViv((size_t) floor(color.green+0.5))));
11730 PUSHs(sv_2mortal(newSViv((size_t) floor(color.blue+0.5))));
11731 if (color.colorspace == CMYKColorspace)
11732 PUSHs(sv_2mortal(newSViv((size_t) floor(color.black+0.5))));
11733 if (color.matte != MagickFalse)
11734 PUSHs(sv_2mortal(newSViv((size_t) floor(color.alpha+0.5))));
11738 InheritPerlException(exception,perl_exception);
11739 exception=DestroyExceptionInfo(exception);
11740 SvREFCNT_dec(perl_exception);
11744 ###############################################################################
11748 # Q u e r y C o l o r N a m e #
11752 ###############################################################################
11756 QueryColorname(ref,...)
11757 Image::Magick ref=NO_INIT
11766 message[MaxTextExtent];
11785 *reference; /* reference is the SV* of ref=SvIV(reference) */
11787 PERL_UNUSED_VAR(ref);
11788 PERL_UNUSED_VAR(ix);
11789 exception=AcquireExceptionInfo();
11790 perl_exception=newSVpv("",0);
11791 reference=SvRV(ST(0));
11792 av=(AV *) reference;
11793 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
11795 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
11796 if (image == (Image *) NULL)
11798 ThrowPerlException(exception,OptionError,"NoImagesDefined",
11800 goto PerlException;
11803 for (i=1; i < items; i++)
11805 (void) QueryColorDatabase(SvPV(ST(i),na),&target_color,exception);
11806 (void) QueryColorname(image,&target_color,SVGCompliance,message,
11808 PUSHs(sv_2mortal(newSVpv(message,0)));
11812 InheritPerlException(exception,perl_exception);
11813 exception=DestroyExceptionInfo(exception);
11814 SvREFCNT_dec(perl_exception);
11818 ###############################################################################
11822 # Q u e r y F o n t #
11826 ###############################################################################
11831 Image::Magick ref=NO_INIT
11838 message[MaxTextExtent];
11849 volatile const TypeInfo
11852 PERL_UNUSED_VAR(ref);
11853 PERL_UNUSED_VAR(ix);
11854 exception=AcquireExceptionInfo();
11855 perl_exception=newSVpv("",0);
11864 typelist=GetTypeInfoList("*",&types,exception);
11866 for (i=0; i < (ssize_t) types; i++)
11868 PUSHs(sv_2mortal(newSVpv(typelist[i]->name,0)));
11870 typelist=(const TypeInfo **) RelinquishMagickMemory((TypeInfo **)
11872 goto PerlException;
11874 EXTEND(sp,10*items);
11875 for (i=1; i < items; i++)
11877 name=(char *) SvPV(ST(i),na);
11878 type_info=GetTypeInfo(name,exception);
11879 if (type_info == (TypeInfo *) NULL)
11884 if (type_info->name == (char *) NULL)
11887 PUSHs(sv_2mortal(newSVpv(type_info->name,0)));
11888 if (type_info->description == (char *) NULL)
11891 PUSHs(sv_2mortal(newSVpv(type_info->description,0)));
11892 if (type_info->family == (char *) NULL)
11895 PUSHs(sv_2mortal(newSVpv(type_info->family,0)));
11896 if (type_info->style == UndefinedStyle)
11899 PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStyleOptions,
11900 type_info->style),0)));
11901 if (type_info->stretch == UndefinedStretch)
11904 PUSHs(sv_2mortal(newSVpv(CommandOptionToMnemonic(MagickStretchOptions,
11905 type_info->stretch),0)));
11906 (void) FormatLocaleString(message,MaxTextExtent,"%.20g",(double)
11907 type_info->weight);
11908 PUSHs(sv_2mortal(newSVpv(message,0)));
11909 if (type_info->encoding == (char *) NULL)
11912 PUSHs(sv_2mortal(newSVpv(type_info->encoding,0)));
11913 if (type_info->foundry == (char *) NULL)
11916 PUSHs(sv_2mortal(newSVpv(type_info->foundry,0)));
11917 if (type_info->format == (char *) NULL)
11920 PUSHs(sv_2mortal(newSVpv(type_info->format,0)));
11921 if (type_info->metrics == (char *) NULL)
11924 PUSHs(sv_2mortal(newSVpv(type_info->metrics,0)));
11925 if (type_info->glyphs == (char *) NULL)
11928 PUSHs(sv_2mortal(newSVpv(type_info->glyphs,0)));
11932 InheritPerlException(exception,perl_exception);
11933 exception=DestroyExceptionInfo(exception);
11934 SvREFCNT_dec(perl_exception);
11938 ###############################################################################
11942 # Q u e r y F o n t M e t r i c s #
11946 ###############################################################################
11950 QueryFontMetrics(ref,...)
11951 Image::Magick ref=NO_INIT
11953 queryfontmetrics = 1
12000 *reference; /* reference is the SV* of ref=SvIV(reference) */
12005 PERL_UNUSED_VAR(ref);
12006 PERL_UNUSED_VAR(ix);
12007 exception=AcquireExceptionInfo();
12008 package_info=(struct PackageInfo *) NULL;
12009 perl_exception=newSVpv("",0);
12010 reference=SvRV(ST(0));
12011 av=(AV *) reference;
12012 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
12014 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
12015 if (image == (Image *) NULL)
12017 ThrowPerlException(exception,OptionError,"NoImagesDefined",
12019 goto PerlException;
12021 package_info=ClonePackageInfo(info,exception);
12022 draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL);
12023 CloneString(&draw_info->text,"");
12024 current=draw_info->affine;
12025 GetAffineMatrix(&affine);
12028 EXTEND(sp,7*items);
12029 for (i=2; i < items; i+=2)
12031 attribute=(char *) SvPV(ST(i-1),na);
12032 switch (*attribute)
12037 if (LocaleCompare(attribute,"antialias") == 0)
12039 type=ParseCommandOption(MagickBooleanOptions,MagickFalse,
12043 ThrowPerlException(exception,OptionError,"UnrecognizedType",
12047 draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse;
12050 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12057 if (LocaleCompare(attribute,"density") == 0)
12059 CloneString(&draw_info->density,SvPV(ST(i),na));
12062 if (LocaleCompare(attribute,"direction") == 0)
12064 draw_info->direction=(DirectionType) ParseCommandOption(
12065 MagickDirectionOptions,MagickFalse,SvPV(ST(i),na));
12068 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12075 if (LocaleCompare(attribute,"encoding") == 0)
12077 CloneString(&draw_info->encoding,SvPV(ST(i),na));
12080 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12087 if (LocaleCompare(attribute,"family") == 0)
12089 CloneString(&draw_info->family,SvPV(ST(i),na));
12092 if (LocaleCompare(attribute,"fill") == 0)
12095 (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill,
12096 &image->exception);
12099 if (LocaleCompare(attribute,"font") == 0)
12101 CloneString(&draw_info->font,SvPV(ST(i),na));
12104 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12111 if (LocaleCompare(attribute,"geometry") == 0)
12113 CloneString(&draw_info->geometry,SvPV(ST(i),na));
12116 if (LocaleCompare(attribute,"gravity") == 0)
12118 draw_info->gravity=(GravityType) ParseCommandOption(
12119 MagickGravityOptions,MagickFalse,SvPV(ST(i),na));
12122 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12129 if (LocaleCompare(attribute,"interline-spacing") == 0)
12131 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12132 draw_info->interline_spacing=geometry_info.rho;
12135 if (LocaleCompare(attribute,"interword-spacing") == 0)
12137 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12138 draw_info->interword_spacing=geometry_info.rho;
12141 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12148 if (LocaleCompare(attribute,"kerning") == 0)
12150 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12151 draw_info->kerning=geometry_info.rho;
12154 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12161 if (LocaleCompare(attribute,"pointsize") == 0)
12163 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12164 draw_info->pointsize=geometry_info.rho;
12167 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12174 if (LocaleCompare(attribute,"rotate") == 0)
12176 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12177 affine.rx=geometry_info.rho;
12178 affine.ry=geometry_info.sigma;
12179 if ((flags & SigmaValue) == 0)
12180 affine.ry=affine.rx;
12183 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12190 if (LocaleCompare(attribute,"scale") == 0)
12192 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12193 affine.sx=geometry_info.rho;
12194 affine.sy=geometry_info.sigma;
12195 if ((flags & SigmaValue) == 0)
12196 affine.sy=affine.sx;
12199 if (LocaleCompare(attribute,"skew") == 0)
12205 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12206 x_angle=geometry_info.rho;
12207 y_angle=geometry_info.sigma;
12208 if ((flags & SigmaValue) == 0)
12210 affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0)));
12211 affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0)));
12214 if (LocaleCompare(attribute,"stroke") == 0)
12217 (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke,
12218 &image->exception);
12221 if (LocaleCompare(attribute,"style") == 0)
12223 type=ParseCommandOption(MagickStyleOptions,MagickFalse,
12227 ThrowPerlException(exception,OptionError,"UnrecognizedType",
12231 draw_info->style=(StyleType) type;
12234 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12241 if (LocaleCompare(attribute,"text") == 0)
12243 CloneString(&draw_info->text,SvPV(ST(i),na));
12246 if (LocaleCompare(attribute,"translate") == 0)
12248 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12249 affine.tx=geometry_info.rho;
12250 affine.ty=geometry_info.sigma;
12251 if ((flags & SigmaValue) == 0)
12252 affine.ty=affine.tx;
12255 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12262 if (LocaleCompare(attribute,"weight") == 0)
12264 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12265 draw_info->weight=(size_t) geometry_info.rho;
12268 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12275 if (LocaleCompare(attribute,"x") == 0)
12277 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12278 x=geometry_info.rho;
12281 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12288 if (LocaleCompare(attribute,"y") == 0)
12290 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12291 y=geometry_info.rho;
12294 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12300 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12306 draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
12307 draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
12308 draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
12309 draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
12310 draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
12311 draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
12312 if (draw_info->geometry == (char *) NULL)
12314 draw_info->geometry=AcquireString((char *) NULL);
12315 (void) FormatLocaleString(draw_info->geometry,MaxTextExtent,
12316 "%.15g,%.15g",x,y);
12318 status=GetTypeMetrics(image,draw_info,&metrics);
12319 (void) CatchImageException(image);
12320 if (status == MagickFalse)
12324 PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x)));
12325 PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y)));
12326 PUSHs(sv_2mortal(newSVnv(metrics.ascent)));
12327 PUSHs(sv_2mortal(newSVnv(metrics.descent)));
12328 PUSHs(sv_2mortal(newSVnv(metrics.width)));
12329 PUSHs(sv_2mortal(newSVnv(metrics.height)));
12330 PUSHs(sv_2mortal(newSVnv(metrics.max_advance)));
12331 PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1)));
12332 PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1)));
12333 PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2)));
12334 PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2)));
12335 PUSHs(sv_2mortal(newSVnv(metrics.origin.x)));
12336 PUSHs(sv_2mortal(newSVnv(metrics.origin.y)));
12338 draw_info=DestroyDrawInfo(draw_info);
12341 if (package_info != (struct PackageInfo *) NULL)
12342 DestroyPackageInfo(package_info);
12343 InheritPerlException(exception,perl_exception);
12344 exception=DestroyExceptionInfo(exception);
12345 SvREFCNT_dec(perl_exception); /* can't return warning messages */
12349 ###############################################################################
12353 # Q u e r y M u l t i l i n e F o n t M e t r i c s #
12357 ###############################################################################
12361 QueryMultilineFontMetrics(ref,...)
12362 Image::Magick ref=NO_INIT
12364 querymultilinefontmetrics = 1
12411 *reference; /* reference is the SV* of ref=SvIV(reference) */
12416 PERL_UNUSED_VAR(ref);
12417 PERL_UNUSED_VAR(ix);
12418 exception=AcquireExceptionInfo();
12419 package_info=(struct PackageInfo *) NULL;
12420 perl_exception=newSVpv("",0);
12421 reference=SvRV(ST(0));
12422 av=(AV *) reference;
12423 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
12425 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
12426 if (image == (Image *) NULL)
12428 ThrowPerlException(exception,OptionError,"NoImagesDefined",
12430 goto PerlException;
12432 package_info=ClonePackageInfo(info,exception);
12433 draw_info=CloneDrawInfo(package_info->image_info,(DrawInfo *) NULL);
12434 CloneString(&draw_info->text,"");
12435 current=draw_info->affine;
12436 GetAffineMatrix(&affine);
12439 EXTEND(sp,7*items);
12440 for (i=2; i < items; i+=2)
12442 attribute=(char *) SvPV(ST(i-1),na);
12443 switch (*attribute)
12448 if (LocaleCompare(attribute,"antialias") == 0)
12450 type=ParseCommandOption(MagickBooleanOptions,MagickFalse,
12454 ThrowPerlException(exception,OptionError,"UnrecognizedType",
12458 draw_info->text_antialias=type != 0 ? MagickTrue : MagickFalse;
12461 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12468 if (LocaleCompare(attribute,"density") == 0)
12470 CloneString(&draw_info->density,SvPV(ST(i),na));
12473 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12480 if (LocaleCompare(attribute,"encoding") == 0)
12482 CloneString(&draw_info->encoding,SvPV(ST(i),na));
12485 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12492 if (LocaleCompare(attribute,"family") == 0)
12494 CloneString(&draw_info->family,SvPV(ST(i),na));
12497 if (LocaleCompare(attribute,"fill") == 0)
12500 (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->fill,
12501 &image->exception);
12504 if (LocaleCompare(attribute,"font") == 0)
12506 CloneString(&draw_info->font,SvPV(ST(i),na));
12509 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12516 if (LocaleCompare(attribute,"geometry") == 0)
12518 CloneString(&draw_info->geometry,SvPV(ST(i),na));
12521 if (LocaleCompare(attribute,"gravity") == 0)
12523 draw_info->gravity=(GravityType) ParseCommandOption(
12524 MagickGravityOptions,MagickFalse,SvPV(ST(i),na));
12527 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12534 if (LocaleCompare(attribute,"pointsize") == 0)
12536 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12537 draw_info->pointsize=geometry_info.rho;
12540 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12547 if (LocaleCompare(attribute,"rotate") == 0)
12549 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12550 affine.rx=geometry_info.rho;
12551 affine.ry=geometry_info.sigma;
12552 if ((flags & SigmaValue) == 0)
12553 affine.ry=affine.rx;
12556 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12563 if (LocaleCompare(attribute,"scale") == 0)
12565 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12566 affine.sx=geometry_info.rho;
12567 affine.sy=geometry_info.sigma;
12568 if ((flags & SigmaValue) == 0)
12569 affine.sy=affine.sx;
12572 if (LocaleCompare(attribute,"skew") == 0)
12578 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12579 x_angle=geometry_info.rho;
12580 y_angle=geometry_info.sigma;
12581 if ((flags & SigmaValue) == 0)
12583 affine.ry=tan(DegreesToRadians(fmod(x_angle,360.0)));
12584 affine.rx=tan(DegreesToRadians(fmod(y_angle,360.0)));
12587 if (LocaleCompare(attribute,"stroke") == 0)
12590 (void) QueryColorDatabase(SvPV(ST(i),na),&draw_info->stroke,
12591 &image->exception);
12594 if (LocaleCompare(attribute,"style") == 0)
12596 type=ParseCommandOption(MagickStyleOptions,MagickFalse,
12600 ThrowPerlException(exception,OptionError,"UnrecognizedType",
12604 draw_info->style=(StyleType) type;
12607 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12614 if (LocaleCompare(attribute,"text") == 0)
12616 CloneString(&draw_info->text,SvPV(ST(i),na));
12619 if (LocaleCompare(attribute,"translate") == 0)
12621 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12622 affine.tx=geometry_info.rho;
12623 affine.ty=geometry_info.sigma;
12624 if ((flags & SigmaValue) == 0)
12625 affine.ty=affine.tx;
12628 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12635 if (LocaleCompare(attribute,"weight") == 0)
12637 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12638 draw_info->weight=(size_t) geometry_info.rho;
12641 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12648 if (LocaleCompare(attribute,"x") == 0)
12650 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12651 x=geometry_info.rho;
12654 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12661 if (LocaleCompare(attribute,"y") == 0)
12663 flags=ParseGeometry(SvPV(ST(i),na),&geometry_info);
12664 y=geometry_info.rho;
12667 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12673 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
12679 draw_info->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
12680 draw_info->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
12681 draw_info->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
12682 draw_info->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
12683 draw_info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
12684 draw_info->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
12685 if (draw_info->geometry == (char *) NULL)
12687 draw_info->geometry=AcquireString((char *) NULL);
12688 (void) FormatLocaleString(draw_info->geometry,MaxTextExtent,
12689 "%.15g,%.15g",x,y);
12691 status=GetMultilineTypeMetrics(image,draw_info,&metrics);
12692 (void) CatchImageException(image);
12693 if (status == MagickFalse)
12697 PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.x)));
12698 PUSHs(sv_2mortal(newSVnv(metrics.pixels_per_em.y)));
12699 PUSHs(sv_2mortal(newSVnv(metrics.ascent)));
12700 PUSHs(sv_2mortal(newSVnv(metrics.descent)));
12701 PUSHs(sv_2mortal(newSVnv(metrics.width)));
12702 PUSHs(sv_2mortal(newSVnv(metrics.height)));
12703 PUSHs(sv_2mortal(newSVnv(metrics.max_advance)));
12704 PUSHs(sv_2mortal(newSVnv(metrics.bounds.x1)));
12705 PUSHs(sv_2mortal(newSVnv(metrics.bounds.y1)));
12706 PUSHs(sv_2mortal(newSVnv(metrics.bounds.x2)));
12707 PUSHs(sv_2mortal(newSVnv(metrics.bounds.y2)));
12708 PUSHs(sv_2mortal(newSVnv(metrics.origin.x)));
12709 PUSHs(sv_2mortal(newSVnv(metrics.origin.y)));
12711 draw_info=DestroyDrawInfo(draw_info);
12714 if (package_info != (struct PackageInfo *) NULL)
12715 DestroyPackageInfo(package_info);
12716 InheritPerlException(exception,perl_exception);
12717 exception=DestroyExceptionInfo(exception);
12718 SvREFCNT_dec(perl_exception); /* can't return warning messages */
12722 ###############################################################################
12726 # Q u e r y F o r m a t #
12730 ###############################################################################
12734 QueryFormat(ref,...)
12735 Image::Magick ref=NO_INIT
12752 volatile const MagickInfo
12755 PERL_UNUSED_VAR(ref);
12756 PERL_UNUSED_VAR(ix);
12757 exception=AcquireExceptionInfo();
12758 perl_exception=newSVpv("",0);
12762 format[MaxTextExtent];
12770 format_list=GetMagickInfoList("*",&types,exception);
12772 for (i=0; i < (ssize_t) types; i++)
12774 (void) CopyMagickString(format,format_list[i]->name,MaxTextExtent);
12775 LocaleLower(format);
12776 PUSHs(sv_2mortal(newSVpv(format,0)));
12778 format_list=(const MagickInfo **)
12779 RelinquishMagickMemory((MagickInfo *) format_list);
12780 goto PerlException;
12782 EXTEND(sp,8*items);
12783 for (i=1; i < items; i++)
12785 name=(char *) SvPV(ST(i),na);
12786 magick_info=GetMagickInfo(name,exception);
12787 if (magick_info == (const MagickInfo *) NULL)
12792 PUSHs(sv_2mortal(newSViv(magick_info->adjoin)));
12793 PUSHs(sv_2mortal(newSViv(magick_info->blob_support)));
12794 PUSHs(sv_2mortal(newSViv(magick_info->raw)));
12795 PUSHs(sv_2mortal(newSViv((long) magick_info->decoder)));
12796 PUSHs(sv_2mortal(newSViv((long) magick_info->encoder)));
12797 if (magick_info->description == (char *) NULL)
12800 PUSHs(sv_2mortal(newSVpv(magick_info->description,0)));
12801 if (magick_info->module == (char *) NULL)
12804 PUSHs(sv_2mortal(newSVpv(magick_info->module,0)));
12808 InheritPerlException(exception,perl_exception);
12809 exception=DestroyExceptionInfo(exception);
12810 SvREFCNT_dec(perl_exception);
12814 ###############################################################################
12818 # Q u e r y O p t i o n #
12822 ###############################################################################
12826 QueryOption(ref,...)
12827 Image::Magick ref=NO_INIT
12848 PERL_UNUSED_VAR(ref);
12849 PERL_UNUSED_VAR(ix);
12850 exception=AcquireExceptionInfo();
12851 perl_exception=newSVpv("",0);
12852 EXTEND(sp,8*items);
12853 for (i=1; i < items; i++)
12855 option=ParseCommandOption(MagickListOptions,MagickFalse,(char *)
12857 options=GetCommandOptions((CommandOption) option);
12858 if (options == (char **) NULL)
12862 for (j=0; options[j] != (char *) NULL; j++)
12863 PUSHs(sv_2mortal(newSVpv(options[j],0)));
12864 options=DestroyStringList(options);
12868 InheritPerlException(exception,perl_exception);
12869 exception=DestroyExceptionInfo(exception);
12870 SvREFCNT_dec(perl_exception);
12874 ###############################################################################
12882 ###############################################################################
12887 Image::Magick ref=NO_INIT
12934 *perl_exception, /* Perl variable for storing messages */
12939 PERL_UNUSED_VAR(ref);
12940 PERL_UNUSED_VAR(ix);
12941 exception=AcquireExceptionInfo();
12942 perl_exception=newSVpv("",0);
12944 package_info=(struct PackageInfo *) NULL;
12946 ac=(items < 2) ? 1 : items-1;
12947 list=(char **) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*list));
12949 length=(STRLEN *) NULL;
12950 if (list == (char **) NULL)
12952 ThrowPerlException(exception,ResourceLimitError,
12953 "MemoryAllocationFailed",PackageName);
12954 goto PerlException;
12956 length=(STRLEN *) AcquireQuantumMemory((size_t) ac+1UL,sizeof(*length));
12957 if (length == (STRLEN *) NULL)
12959 ThrowPerlException(exception,ResourceLimitError,
12960 "MemoryAllocationFailed",PackageName);
12961 goto PerlException;
12963 if (sv_isobject(ST(0)) == 0)
12965 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
12967 goto PerlException;
12969 reference=SvRV(ST(0));
12970 hv=SvSTASH(reference);
12971 if (SvTYPE(reference) != SVt_PVAV)
12973 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
12975 goto PerlException;
12977 av=(AV *) reference;
12978 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
12980 package_info=ClonePackageInfo(info,exception);
12983 *list=(char *) (*package_info->image_info->filename ?
12984 package_info->image_info->filename : "XC:black");
12986 for (n=0, i=0; i < ac; i++)
12988 list[n]=(char *) SvPV(ST(i+1),length[n]);
12989 if ((items >= 3) && strEQcase(list[n],"blob"))
12995 blob=(void *) (SvPV(ST(i+1),length[n]));
12996 SetImageInfoBlob(package_info->image_info,blob,(size_t) length[n]);
12998 if ((items >= 3) && strEQcase(list[n],"filename"))
13000 if ((items >= 3) && strEQcase(list[n],"file"))
13009 io_info=IoIFP(sv_2io(ST(i+1)));
13010 if (io_info == (PerlIO *) NULL)
13012 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
13016 file=PerlIO_findFILE(io_info);
13017 if (file == (FILE *) NULL)
13019 ThrowPerlException(exception,BlobError,"UnableToOpenFile",
13023 SetImageInfoFile(package_info->image_info,file);
13025 if ((items >= 3) && strEQcase(list[n],"magick"))
13029 list[n]=(char *) NULL;
13031 status=ExpandFilenames(&n,&list);
13032 if (status == MagickFalse)
13034 ThrowPerlException(exception,ResourceLimitError,
13035 "MemoryAllocationFailed",PackageName);
13036 goto PerlException;
13039 for (i=0; i < n; i++)
13041 if ((package_info->image_info->file != (FILE *) NULL) ||
13042 (package_info->image_info->blob != (void *) NULL))
13044 image=ReadImages(package_info->image_info,exception);
13045 if (image != (Image *) NULL)
13046 DisassociateImageStream(image);
13050 (void) CopyMagickString(package_info->image_info->filename,list[i],
13052 image=ReadImages(package_info->image_info,exception);
13054 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
13056 for ( ; image; image=image->next)
13058 AddImageToRegistry(sv,image);
13060 av_push(av,sv_bless(rv,hv));
13068 for (i=0; i < n; i++)
13069 if (list[i] != (char *) NULL)
13070 for (p=keep; list[i] != *p++; )
13071 if (*p == (char *) NULL)
13073 list[i]=(char *) RelinquishMagickMemory(list[i]);
13078 if (package_info != (struct PackageInfo *) NULL)
13079 DestroyPackageInfo(package_info);
13080 if (list && (list != keep))
13081 list=(char **) RelinquishMagickMemory(list);
13083 keep=(char **) RelinquishMagickMemory(keep);
13085 length=(STRLEN *) RelinquishMagickMemory(length);
13086 InheritPerlException(exception,perl_exception);
13087 exception=DestroyExceptionInfo(exception);
13088 sv_setiv(perl_exception,(IV) number_images);
13089 SvPOK_on(perl_exception);
13090 ST(0)=sv_2mortal(perl_exception);
13095 ###############################################################################
13103 ###############################################################################
13108 Image::Magick ref=NO_INIT
13131 PERL_UNUSED_VAR(ref);
13132 PERL_UNUSED_VAR(ix);
13133 exception=AcquireExceptionInfo();
13134 perl_exception=newSVpv("",0);
13135 reference=SvRV(ST(0));
13136 av=(AV *) reference;
13137 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
13139 for (i=1; i < items; i++)
13140 (void) RemoteDisplayCommand(info->image_info,(char *) NULL,(char *)
13141 SvPV(ST(i),na),exception);
13142 InheritPerlException(exception,perl_exception);
13143 exception=DestroyExceptionInfo(exception);
13144 SvREFCNT_dec(perl_exception); /* throw away all errors */
13148 ###############################################################################
13156 ###############################################################################
13161 Image::Magick ref=NO_INIT
13184 *reference; /* reference is the SV* of ref=SvIV(reference) */
13186 PERL_UNUSED_VAR(ref);
13187 PERL_UNUSED_VAR(ix);
13188 exception=AcquireExceptionInfo();
13189 perl_exception=newSVpv("",0);
13190 if (sv_isobject(ST(0)) == 0)
13192 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
13194 goto PerlException;
13196 reference=SvRV(ST(0));
13197 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13199 SetAttribute(aTHX_ info,image,"size",ST(1),exception);
13201 for (i=2; i < items; i+=2)
13202 SetAttribute(aTHX_ info,image,SvPV(ST(i-1),na),ST(i),exception);
13205 InheritPerlException(exception,perl_exception);
13206 exception=DestroyExceptionInfo(exception);
13207 sv_setiv(perl_exception,(IV) (SvCUR(perl_exception) != 0));
13208 SvPOK_on(perl_exception);
13209 ST(0)=sv_2mortal(perl_exception);
13214 ###############################################################################
13218 # S e t P i x e l #
13222 ###############################################################################
13227 Image::Magick ref=NO_INIT
13269 *reference; /* reference is the SV* of ref=SvIV(reference) */
13271 PERL_UNUSED_VAR(ref);
13272 PERL_UNUSED_VAR(ix);
13273 exception=AcquireExceptionInfo();
13274 perl_exception=newSVpv("",0);
13275 reference=SvRV(ST(0));
13276 av=(AV *) reference;
13277 info=GetPackageInfo(aTHX_ (void *) av,(struct PackageInfo *) NULL,
13279 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13280 if (image == (Image *) NULL)
13282 ThrowPerlException(exception,OptionError,"NoImagesDefined",
13284 goto PerlException;
13287 normalize=MagickTrue;
13290 region.width=image->columns;
13293 (void) ParseAbsoluteGeometry(SvPV(ST(1),na),®ion);
13294 channel=DefaultChannels;
13295 for (i=2; i < items; i+=2)
13297 attribute=(char *) SvPV(ST(i-1),na);
13298 switch (*attribute)
13303 if (LocaleCompare(attribute,"channel") == 0)
13308 option=ParseChannelOption(SvPV(ST(i),na));
13311 ThrowPerlException(exception,OptionError,"UnrecognizedType",
13315 channel=(ChannelType) option;
13318 if (LocaleCompare(attribute,"color") == 0)
13320 if (SvTYPE(ST(i)) != SVt_RV)
13323 message[MaxTextExtent];
13325 (void) FormatLocaleString(message,MaxTextExtent,
13326 "invalid %.60s value",attribute);
13327 ThrowPerlException(exception,OptionError,message,
13330 av=(AV *) SvRV(ST(i));
13333 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13340 if (LocaleCompare(attribute,"geometry") == 0)
13342 (void) ParseAbsoluteGeometry(SvPV(ST(i),na),®ion);
13345 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13352 if (LocaleCompare(attribute,"normalize") == 0)
13354 option=ParseCommandOption(MagickBooleanOptions,MagickFalse,
13358 ThrowPerlException(exception,OptionError,"UnrecognizedType",
13362 normalize=option != 0 ? MagickTrue : MagickFalse;
13365 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13372 if (LocaleCompare(attribute,"x") == 0)
13374 region.x=SvIV(ST(i));
13377 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13384 if (LocaleCompare(attribute,"y") == 0)
13386 region.y=SvIV(ST(i));
13389 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13395 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13401 (void) SetImageStorageClass(image,DirectClass,exception);
13402 channel_mask=SetPixelChannelMask(image,channel);
13403 q=GetAuthenticPixels(image,region.x,region.y,1,1,exception);
13404 if ((q == (const Quantum *) NULL) || (av == (AV *) NULL) ||
13405 (SvTYPE(av) != SVt_PVAV))
13417 if (normalize != MagickFalse)
13418 scale=QuantumRange;
13419 if (((GetPixelRedTraits(image) & UpdatePixelTrait) != 0) &&
13422 SetPixelRed(image,ClampToQuantum(scale*SvNV(*(
13423 av_fetch(av,i,0)))),q);
13426 if (((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0) &&
13429 SetPixelGreen(image,ClampToQuantum(scale*SvNV(*(
13430 av_fetch(av,i,0)))),q);
13433 if (((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0) &&
13436 SetPixelBlue(image,ClampToQuantum(scale*SvNV(*(
13437 av_fetch(av,i,0)))),q);
13440 if ((((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
13441 (image->colorspace == CMYKColorspace)) && (i <= av_len(av)))
13443 SetPixelBlack(image,ClampToQuantum(scale*
13444 SvNV(*(av_fetch(av,i,0)))),q);
13447 if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) &&
13450 SetPixelAlpha(image,ClampToQuantum(scale*
13451 SvNV(*(av_fetch(av,i,0)))),q);
13454 (void) SyncAuthenticPixels(image,exception);
13456 (void) SetPixelChannelMask(image,channel_mask);
13459 InheritPerlException(exception,perl_exception);
13460 exception=DestroyExceptionInfo(exception);
13461 SvREFCNT_dec(perl_exception);
13465 ###############################################################################
13473 ###############################################################################
13478 Image::Magick ref=NO_INIT
13517 PERL_UNUSED_VAR(ref);
13518 PERL_UNUSED_VAR(ix);
13519 exception=AcquireExceptionInfo();
13520 perl_exception=newSVpv("",0);
13524 if (sv_isobject(ST(0)) == 0)
13526 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
13528 goto PerlException;
13530 reference=SvRV(ST(0));
13531 hv=SvSTASH(reference);
13533 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
13535 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13536 if (image == (Image *) NULL)
13538 ThrowPerlException(exception,OptionError,"NoImagesDefined",
13540 goto PerlException;
13542 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
13548 for (i=2; i < items; i+=2)
13550 attribute=(char *) SvPV(ST(i-1),na);
13551 switch (*attribute)
13556 if (LocaleCompare(attribute,"offset") == 0)
13558 offset=(ssize_t) StringToLong((char *) SvPV(ST(1),na));
13561 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13568 if (LocaleCompare(attribute,"stack") == 0)
13570 stack=ParseCommandOption(MagickBooleanOptions,MagickFalse,
13574 ThrowPerlException(exception,OptionError,"UnrecognizedType",
13580 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13586 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13592 image=SmushImages(image,stack != 0 ? MagickTrue : MagickFalse,offset,
13594 if ((image == (Image *) NULL) || (exception->severity >= ErrorException))
13595 goto PerlException;
13596 for ( ; image; image=image->next)
13598 AddImageToRegistry(sv,image);
13600 av_push(av,sv_bless(rv,hv));
13603 exception=DestroyExceptionInfo(exception);
13604 ST(0)=av_reference;
13605 SvREFCNT_dec(perl_exception);
13609 InheritPerlException(exception,perl_exception);
13610 exception=DestroyExceptionInfo(exception);
13611 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
13612 SvPOK_on(perl_exception);
13613 ST(0)=sv_2mortal(perl_exception);
13618 ###############################################################################
13622 # S t a t i s t i c s #
13626 ###############################################################################
13630 Statistics(ref,...)
13631 Image::Magick ref=NO_INIT
13633 StatisticsImage = 1
13635 statisticsimage = 3
13638 #define ChannelStatistics(channel) \
13640 (void) FormatLocaleString(message,MaxTextExtent,"%.20g", \
13641 (double) channel_statistics[channel].depth); \
13642 PUSHs(sv_2mortal(newSVpv(message,0))); \
13643 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13644 channel_statistics[channel].minima/scale); \
13645 PUSHs(sv_2mortal(newSVpv(message,0))); \
13646 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13647 channel_statistics[channel].maxima/scale); \
13648 PUSHs(sv_2mortal(newSVpv(message,0))); \
13649 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13650 channel_statistics[channel].mean/scale); \
13651 PUSHs(sv_2mortal(newSVpv(message,0))); \
13652 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13653 channel_statistics[channel].standard_deviation/scale); \
13654 PUSHs(sv_2mortal(newSVpv(message,0))); \
13655 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13656 channel_statistics[channel].kurtosis); \
13657 PUSHs(sv_2mortal(newSVpv(message,0))); \
13658 (void) FormatLocaleString(message,MaxTextExtent,"%.15g", \
13659 channel_statistics[channel].skewness); \
13660 PUSHs(sv_2mortal(newSVpv(message,0))); \
13667 message[MaxTextExtent];
13670 *channel_statistics;
13691 PERL_UNUSED_VAR(ref);
13692 PERL_UNUSED_VAR(ix);
13693 exception=AcquireExceptionInfo();
13694 perl_exception=newSVpv("",0);
13696 if (sv_isobject(ST(0)) == 0)
13698 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
13700 goto PerlException;
13702 reference=SvRV(ST(0));
13705 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13706 if (image == (Image *) NULL)
13708 ThrowPerlException(exception,OptionError,"NoImagesDefined",
13710 goto PerlException;
13712 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
13714 for ( ; image; image=image->next)
13716 channel_statistics=GetImageStatistics(image,&image->exception);
13717 if (channel_statistics == (ChannelStatistics *) NULL)
13720 EXTEND(sp,35*count);
13721 scale=(double) QuantumRange;
13722 ChannelStatistics(RedChannel);
13723 ChannelStatistics(GreenChannel);
13724 ChannelStatistics(BlueChannel);
13725 if (image->colorspace == CMYKColorspace)
13726 ChannelStatistics(BlackChannel);
13727 if (image->matte != MagickFalse)
13728 ChannelStatistics(AlphaChannel);
13729 channel_statistics=(ChannelStatistics *)
13730 RelinquishMagickMemory(channel_statistics);
13734 InheritPerlException(exception,perl_exception);
13735 exception=DestroyExceptionInfo(exception);
13736 SvREFCNT_dec(perl_exception);
13740 ###############################################################################
13744 # S y n c A u t h e n t i c P i x e l s #
13748 ###############################################################################
13752 SyncAuthenticPixels(ref,...)
13753 Image::Magick ref = NO_INIT
13755 Syncauthenticpixels = 1
13756 SyncImagePixels = 2
13757 syncimagepixels = 3
13776 PERL_UNUSED_VAR(ref);
13777 PERL_UNUSED_VAR(ix);
13778 exception=AcquireExceptionInfo();
13779 perl_exception=newSVpv("",0);
13780 if (sv_isobject(ST(0)) == 0)
13782 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
13784 goto PerlException;
13787 reference=SvRV(ST(0));
13788 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13789 if (image == (Image *) NULL)
13791 ThrowPerlException(exception,OptionError,"NoImagesDefined",
13793 goto PerlException;
13796 status=SyncAuthenticPixels(image,exception);
13797 if (status != MagickFalse)
13799 InheritException(exception,&image->exception);
13802 InheritPerlException(exception,perl_exception);
13803 exception=DestroyExceptionInfo(exception);
13804 SvREFCNT_dec(perl_exception); /* throw away all errors */
13808 ###############################################################################
13812 # T r a n s f o r m #
13816 ###############################################################################
13821 Image::Magick ref=NO_INIT
13859 PERL_UNUSED_VAR(ref);
13860 PERL_UNUSED_VAR(ix);
13861 exception=AcquireExceptionInfo();
13862 perl_exception=newSVpv("",0);
13866 if (sv_isobject(ST(0)) == 0)
13868 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
13870 goto PerlException;
13872 reference=SvRV(ST(0));
13873 hv=SvSTASH(reference);
13875 av_reference=sv_2mortal(sv_bless(newRV((SV *) av),hv));
13877 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
13878 if (image == (Image *) NULL)
13880 ThrowPerlException(exception,OptionError,"NoImagesDefined",
13882 goto PerlException;
13884 info=GetPackageInfo(aTHX_ (void *) av,info,exception);
13888 crop_geometry=(char *) NULL;
13889 geometry=(char *) NULL;
13890 for (i=2; i < items; i+=2)
13892 attribute=(char *) SvPV(ST(i-1),na);
13893 switch (*attribute)
13898 if (LocaleCompare(attribute,"crop") == 0)
13900 crop_geometry=SvPV(ST(i),na);
13903 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13910 if (LocaleCompare(attribute,"geometry") == 0)
13912 geometry=SvPV(ST(i),na);
13915 if (LocaleCompare(attribute,"gravity") == 0)
13923 in=!SvPOK(ST(i)) ? SvIV(ST(i)) : ParseCommandOption(
13924 MagickGravityOptions,MagickFalse,SvPV(ST(i),na));
13927 ThrowPerlException(exception,OptionError,"UnrecognizedType",
13931 for (next=image; next; next=next->next)
13932 next->gravity=(GravityType) in;
13935 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13941 ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
13947 for ( ; image; image=image->next)
13949 clone=CloneImage(image,0,0,MagickTrue,exception);
13950 if ((clone == (Image *) NULL) || (exception->severity >= ErrorException))
13951 goto PerlException;
13952 TransformImage(&clone,crop_geometry,geometry);
13953 for ( ; clone; clone=clone->next)
13955 AddImageToRegistry(sv,clone);
13957 av_push(av,sv_bless(rv,hv));
13961 exception=DestroyExceptionInfo(exception);
13962 ST(0)=av_reference;
13963 SvREFCNT_dec(perl_exception); /* can't return warning messages */
13967 InheritPerlException(exception,perl_exception);
13968 exception=DestroyExceptionInfo(exception);
13969 sv_setiv(perl_exception,(IV) SvCUR(perl_exception) != 0);
13970 SvPOK_on(perl_exception);
13971 ST(0)=sv_2mortal(perl_exception);
13976 ###############################################################################
13984 ###############################################################################
13989 Image::Magick ref=NO_INIT
13997 filename[MaxTextExtent];
14021 PERL_UNUSED_VAR(ref);
14022 PERL_UNUSED_VAR(ix);
14023 exception=AcquireExceptionInfo();
14024 perl_exception=newSVpv("",0);
14026 package_info=(struct PackageInfo *) NULL;
14027 if (sv_isobject(ST(0)) == 0)
14029 ThrowPerlException(exception,OptionError,"ReferenceIsNotMyType",
14031 goto PerlException;
14033 reference=SvRV(ST(0));
14034 image=SetupList(aTHX_ reference,&info,(SV ***) NULL,exception);
14035 if (image == (Image *) NULL)
14037 ThrowPerlException(exception,OptionError,"NoImagesDefined",
14039 goto PerlException;
14041 package_info=ClonePackageInfo(info,exception);
14043 SetAttribute(aTHX_ package_info,NULL,"filename",ST(1),exception);
14046 for (i=2; i < items; i+=2)
14047 SetAttribute(aTHX_ package_info,image,SvPV(ST(i-1),na),ST(i),
14049 (void) CopyMagickString(filename,package_info->image_info->filename,
14052 for (next=image; next; next=next->next)
14054 (void) CopyMagickString(next->filename,filename,MaxTextExtent);
14055 next->scene=scene++;
14057 SetImageInfo(package_info->image_info,(unsigned int)
14058 GetImageListLength(image),&image->exception);
14059 for (next=image; next; next=next->next)
14061 (void) WriteImage(package_info->image_info,next);
14062 if (next->exception.severity >= ErrorException)
14063 InheritException(exception,&next->exception);
14064 GetImageException(next,exception);
14066 if (package_info->image_info->adjoin)
14071 if (package_info != (struct PackageInfo *) NULL)
14072 DestroyPackageInfo(package_info);
14073 InheritPerlException(exception,perl_exception);
14074 exception=DestroyExceptionInfo(exception);
14075 sv_setiv(perl_exception,(IV) number_images);
14076 SvPOK_on(perl_exception);
14077 ST(0)=sv_2mortal(perl_exception);