43#include "MagickWand/studio.h"
44#include "MagickWand/MagickWand.h"
45#include "MagickWand/mogrify-private.h"
46#include "MagickCore/composite-private.h"
47#include "MagickCore/string-private.h"
112static MagickBooleanType CompositeImageList(ImageInfo *image_info,Image **image,
113 Image *composite_image,Image *mask_image,CompositeOptions *composite_options,
114 ExceptionInfo *exception)
122 assert(image_info != (ImageInfo *) NULL);
123 assert(image_info->signature == MagickCoreSignature);
124 assert(image != (Image **) NULL);
125 assert((*image)->signature == MagickCoreSignature);
126 assert(exception != (ExceptionInfo *) NULL);
127 if (IsEventLogging() != MagickFalse)
128 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",(*image)->filename);
131 composite_options->clip_to_self=GetCompositeClipToSelf(
132 composite_options->compose);
133 value=GetImageOption(image_info,
"compose:clip-to-self");
134 if (value != (
const char *) NULL)
135 composite_options->clip_to_self=IsStringTrue(value);
136 value=GetImageOption(image_info,
"compose:outside-overlay");
137 if (value != (
const char *) NULL)
138 composite_options->clip_to_self=IsStringFalse(value);
139 if (composite_image != (Image *) NULL)
144 channel_mask=SetImageChannelMask(composite_image,
145 composite_options->channel);
146 assert(composite_image->signature == MagickCoreSignature);
147 switch (composite_options->compose)
149 case BlendCompositeOp:
150 case BlurCompositeOp:
151 case DisplaceCompositeOp:
152 case DistortCompositeOp:
153 case DissolveCompositeOp:
154 case ModulateCompositeOp:
155 case SaliencyBlendCompositeOp:
156 case SeamlessBlendCompositeOp:
157 case ThresholdCompositeOp:
159 (void) SetImageArtifact(*image,
"compose:args",
160 composite_options->compose_args);
169 if (composite_options->stegano != 0)
174 (*image)->offset=composite_options->stegano-1;
175 stegano_image=SteganoImage(*image,composite_image,exception);
176 if (stegano_image != (Image *) NULL)
178 *image=DestroyImageList(*image);
179 *image=stegano_image;
183 if (composite_options->stereo != MagickFalse)
188 stereo_image=StereoAnaglyphImage(*image,composite_image,
189 composite_options->offset.x,composite_options->offset.y,
191 if (stereo_image != (Image *) NULL)
193 *image=DestroyImageList(*image);
198 if (composite_options->tile != MagickFalse)
210 columns=composite_image->columns;
211 for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows)
212 for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns)
213 status&=(MagickStatusType) CompositeImage(*image,
214 composite_image,composite_options->compose,MagickTrue,x,y,
225 SetGeometry(*image,&geometry);
226 (void) ParseAbsoluteGeometry(composite_options->geometry,
228 geometry.width=composite_image->columns;
229 geometry.height=composite_image->rows;
230 GravityAdjustGeometry((*image)->columns,(*image)->rows,
231 composite_options->gravity, &geometry);
232 (*image)->gravity=(GravityType) composite_options->gravity;
236 if (mask_image == (Image *) NULL)
237 status&=(MagickStatusType) CompositeImage(*image,
238 composite_image,composite_options->compose,
239 composite_options->clip_to_self,geometry.x,geometry.y,
246 clone_image=CloneImage(*image,0,0,MagickTrue,exception);
247 if (clone_image != (Image *) NULL)
249 status&=(MagickStatusType) CompositeImage(*image,
250 composite_image,composite_options->compose,
251 composite_options->clip_to_self,geometry.x,geometry.y,
253 status&=(MagickStatusType) CompositeImage(*image,
254 mask_image,CopyAlphaCompositeOp,MagickTrue,0,0,
256 status&=(MagickStatusType) CompositeImage(clone_image,
257 *image,OverCompositeOp,composite_options->clip_to_self,
259 *image=DestroyImageList(*image);
264 (void) SetPixelChannelMask(composite_image,channel_mask);
266 return(status != 0 ? MagickTrue : MagickFalse);
269static MagickBooleanType CompositeUsage(
void)
273 " -debug events display copious debugging information\n"
274 " -help print program options\n"
275 " -list type print a list of supported option arguments\n"
276 " -log format format of debugging information\n"
277 " -version print version information",
279 " -blend geometry blend images\n"
280 " -border geometry surround image with a border of color\n"
281 " -bordercolor color border color\n"
282 " -channel mask set the image channel mask\n"
283 " -colors value preferred number of colors in the image\n"
284 " -decipher filename convert cipher pixels to plain pixels\n"
285 " -displace geometry shift lookup according to a relative displacement map\n"
286 " -dissolve value dissolve the two images a given percent\n"
287 " -distort geometry shift lookup according to a absolute distortion map\n"
288 " -encipher filename convert plain pixels to cipher pixels\n"
289 " -extract geometry extract area from image\n"
290 " -geometry geometry location of the composite image\n"
291 " -identify identify the format and characteristics of the image\n"
292 " -monochrome transform image to black and white\n"
293 " -negate replace every pixel with its complementary color \n"
294 " -profile filename add ICM or IPTC information profile to image\n"
295 " -quantize colorspace reduce colors in this colorspace\n"
296 " -repage geometry size and location of an image canvas (operator)\n"
297 " -rotate degrees apply Paeth rotation to the image\n"
298 " -resize geometry resize the image\n"
299 " -sharpen geometry sharpen the image\n"
300 " -shave geometry shave pixels from the image edges\n"
301 " -stegano offset hide watermark within an image\n"
302 " -stereo geometry combine two image to create a stereo anaglyph\n"
303 " -strip strip image of all profiles and comments\n"
304 " -thumbnail geometry create a thumbnail of the image\n"
305 " -transform affine transform image\n"
306 " -type type image type\n"
307 " -unsharp geometry sharpen the image\n"
308 " -watermark geometry percent brightness and saturation of a watermark\n"
309 " -write filename write images to this file",
311 " -affine matrix affine transform matrix\n"
312 " -alpha option on, activate, off, deactivate, set, opaque, copy\n"
313 " transparent, extract, background, or shape\n"
314 " -authenticate password\n"
315 " decipher image with this password\n"
316 " -blue-primary point chromaticity blue primary point\n"
317 " -colorspace type alternate image colorspace\n"
318 " -comment string annotate image with comment\n"
319 " -compose operator composite operator\n"
320 " -compress type type of pixel compression when writing the image\n"
321 " -define format:option\n"
322 " define one or more image format options\n"
323 " -depth value image depth\n"
324 " -density geometry horizontal and vertical density of the image\n"
325 " -display server get image or font from this X server\n"
326 " -dispose method layer disposal method\n"
327 " -dither method apply error diffusion to image\n"
328 " -encoding type text encoding type\n"
329 " -endian type endianness (MSB or LSB) of the image\n"
330 " -filter type use this filter when resizing an image\n"
331 " -font name render text with this font\n"
332 " -format \"string\" output formatted image characteristics\n"
333 " -gravity type which direction to gravitate towards\n"
334 " -green-primary point chromaticity green primary point\n"
335 " -interlace type type of image interlacing scheme\n"
336 " -interpolate method pixel color interpolation method\n"
337 " -label string assign a label to an image\n"
338 " -limit type value pixel cache resource limit\n"
339 " -matte store matte channel if the image has one\n"
340 " -monitor monitor progress\n"
341 " -page geometry size and location of an image canvas (setting)\n"
342 " -pointsize value font point size\n"
343 " -quality value JPEG/MIFF/PNG compression level\n"
344 " -quiet suppress all warning messages\n"
345 " -red-primary point chromaticity red primary point\n"
346 " -regard-warnings pay attention to warning messages\n"
347 " -respect-parentheses settings remain in effect until parenthesis boundary\n"
348 " -sampling-factor geometry\n"
349 " horizontal and vertical sampling factor\n"
350 " -scene value image scene number\n"
351 " -seed value seed a new sequence of pseudo-random numbers\n"
352 " -size geometry width and height of image\n"
353 " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n"
354 " -synchronize synchronize image to storage device\n"
355 " -taint declare the image as modified\n"
356 " -transparent-color color\n"
357 " transparent color\n"
358 " -treedepth value color tree depth\n"
359 " -tile repeat composite operation across and down image\n"
360 " -units type the units of image resolution\n"
361 " -verbose print detailed information about the image\n"
362 " -virtual-pixel method\n"
363 " virtual pixel access method\n"
364 " -white-point point chromaticity white point",
366 " -swap indexes swap two images in the image sequence";
368 ListMagickVersion(stdout);
369 (void) printf(
"Usage: %s [options ...] image [options ...] composite\n"
370 " [ [options ...] mask ] [options ...] composite\n",
372 (void) printf(
"\nImage Settings:\n");
373 (void) puts(settings);
374 (void) printf(
"\nImage Operators:\n");
375 (void) puts(operators);
376 (void) printf(
"\nImage Stack Operators:\n");
377 (void) puts(stack_operators);
378 (void) printf(
"\nMiscellaneous Options:\n");
379 (void) puts(miscellaneous);
381 "\nBy default, the image format of 'file' is determined by its magic\n");
383 "number. To specify a particular image format, precede the filename\n");
385 "with an image format name and a colon (i.e. ps:image) or specify the\n");
387 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
388 (void) printf(
"'-' for standard input or output.\n");
392static void GetCompositeOptions(
const ImageInfo *image_info,
393 CompositeOptions *composite_options)
396 (void) memset(composite_options,0,
sizeof(*composite_options));
397 composite_options->channel=DefaultChannels;
398 composite_options->compose=OverCompositeOp;
401static void RelinquishCompositeOptions(CompositeOptions *composite_options)
403 if (composite_options->compose_args != (
char *) NULL)
404 composite_options->compose_args=(
char *)
405 RelinquishMagickMemory(composite_options->compose_args);
406 if (composite_options->geometry != (
char *) NULL)
407 composite_options->geometry=(
char *)
408 RelinquishMagickMemory(composite_options->geometry);
411WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info,
412 int argc,
char **argv,
char **metadata,ExceptionInfo *exception)
414#define NotInitialized (unsigned int) (~0)
415#define DestroyComposite() \
417 RelinquishCompositeOptions(&composite_options); \
418 DestroyImageStack(); \
419 for (i=0; i < (ssize_t) argc; i++) \
420 argv[i]=DestroyString(argv[i]); \
421 argv=(char **) RelinquishMagickMemory(argv); \
423#define ThrowCompositeException(asperity,tag,option) \
425 char *message = GetExceptionMessage(errno); \
426 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag, \
427 "`%s'",option == (char *) NULL ? message : option); \
428 message=DestroyString(message); \
429 DestroyComposite(); \
430 return(MagickFalse); \
432#define ThrowCompositeInvalidArgumentException(option,argument) \
434 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
435 "InvalidArgument","'%s': %s",option,argument); \
436 DestroyComposite(); \
437 return(MagickFalse); \
457 image_stack[MaxImageStackDepth+1];
477 assert(image_info != (ImageInfo *) NULL);
478 assert(image_info->signature == MagickCoreSignature);
479 assert(exception != (ExceptionInfo *) NULL);
480 if (IsEventLogging() != MagickFalse)
481 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
485 if ((LocaleCompare(
"version",option+1) == 0) ||
486 (LocaleCompare(
"-version",option+1) == 0))
488 ListMagickVersion(stdout);
494 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
495 "MissingArgument",
"%s",
"");
496 (void) CompositeUsage();
499 GetCompositeOptions(image_info,&composite_options);
500 filename=(
char *) NULL;
505 option=(
char *) NULL;
507 respect_parentheses=MagickFalse;
512 composite_image=NewImageList();
513 image=NewImageList();
514 mask_image=NewImageList();
515 ReadCommandlLine(argc,&argv);
516 status=ExpandFilenames(&argc,&argv);
517 if (status == MagickFalse)
518 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
520 for (i=1; i < ((ssize_t) argc-1); i++)
523 if (LocaleCompare(option,
"(") == 0)
525 FireImageStack(MagickFalse,MagickTrue,pend);
526 if (k == MaxImageStackDepth)
527 ThrowCompositeException(OptionError,
"ParenthesisNestedTooDeeply",
532 if (LocaleCompare(option,
")") == 0)
534 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
536 ThrowCompositeException(OptionError,
"UnableToParseExpression",option);
540 if (IsCommandOption(option) == MagickFalse)
545 FireImageStack(MagickFalse,MagickFalse,pend);
547 if ((LocaleCompare(filename,
"--") == 0) && (i < ((ssize_t) argc-1)))
549 images=ReadImages(image_info,filename,exception);
550 status&=(MagickStatusType) (images != (Image *) NULL) &&
551 (exception->severity < ErrorException);
552 if (images == (Image *) NULL)
554 AppendImageStack(images);
557 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
562 if (LocaleCompare(
"affine",option+1) == 0)
567 if (i == (ssize_t) argc)
568 ThrowCompositeException(OptionError,
"MissingArgument",option);
569 if (IsGeometry(argv[i]) == MagickFalse)
570 ThrowCompositeInvalidArgumentException(option,argv[i]);
573 if (LocaleCompare(
"alpha",option+1) == 0)
581 if (i == (ssize_t) argc)
582 ThrowCompositeException(OptionError,
"MissingArgument",option);
583 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,argv[i]);
585 ThrowCompositeException(OptionError,
586 "UnrecognizedAlphaChannelOption",argv[i]);
589 if (LocaleCompare(
"authenticate",option+1) == 0)
594 if (i == (ssize_t) argc)
595 ThrowCompositeException(OptionError,
"MissingArgument",option);
598 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
602 if (LocaleCompare(
"background",option+1) == 0)
607 if (i == (ssize_t) argc)
608 ThrowCompositeException(OptionError,
"MissingArgument",option);
611 if (LocaleCompare(
"blend",option+1) == 0)
613 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
617 if (i == (ssize_t) argc)
618 ThrowCompositeException(OptionError,
"MissingArgument",option);
619 if (IsGeometry(argv[i]) == MagickFalse)
620 ThrowCompositeInvalidArgumentException(option,argv[i]);
621 (void) CloneString(&composite_options.compose_args,argv[i]);
622 composite_options.compose=BlendCompositeOp;
625 if (LocaleCompare(
"blur",option+1) == 0)
627 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
631 if (i == (ssize_t) argc)
632 ThrowCompositeException(OptionError,
"MissingArgument",option);
633 if (IsGeometry(argv[i]) == MagickFalse)
634 ThrowCompositeInvalidArgumentException(option,argv[i]);
635 (void) CloneString(&composite_options.compose_args,argv[i]);
636 composite_options.compose=BlurCompositeOp;
639 if (LocaleCompare(
"blue-primary",option+1) == 0)
644 if (i == (ssize_t) argc)
645 ThrowCompositeException(OptionError,
"MissingArgument",option);
646 if (IsGeometry(argv[i]) == MagickFalse)
647 ThrowCompositeInvalidArgumentException(option,argv[i]);
650 if (LocaleCompare(
"border",option+1) == 0)
655 if (i == (ssize_t) argc)
656 ThrowCompositeException(OptionError,
"MissingArgument",option);
657 if (IsGeometry(argv[i]) == MagickFalse)
658 ThrowCompositeInvalidArgumentException(option,argv[i]);
661 if (LocaleCompare(
"bordercolor",option+1) == 0)
666 if (i == (ssize_t) argc)
667 ThrowCompositeException(OptionError,
"MissingArgument",option);
670 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
674 if (LocaleCompare(
"cache",option+1) == 0)
679 if (i == (ssize_t) argc)
680 ThrowCompositeException(OptionError,
"MissingArgument",option);
681 if (IsGeometry(argv[i]) == MagickFalse)
682 ThrowCompositeInvalidArgumentException(option,argv[i]);
685 if (LocaleCompare(
"channel",option+1) == 0)
692 composite_options.channel=DefaultChannels;
696 if (i == (ssize_t) argc)
697 ThrowCompositeException(OptionError,
"MissingArgument",option);
698 channel=ParseChannelOption(argv[i]);
700 ThrowCompositeException(OptionError,
"UnrecognizedChannelType",
702 composite_options.channel=(ChannelType) channel;
705 if (LocaleCompare(
"colors",option+1) == 0)
710 if (i == (ssize_t) argc)
711 ThrowCompositeException(OptionError,
"MissingArgument",option);
712 if (IsGeometry(argv[i]) == MagickFalse)
713 ThrowCompositeInvalidArgumentException(option,argv[i]);
716 if (LocaleCompare(
"colorspace",option+1) == 0)
724 if (i == (ssize_t) argc)
725 ThrowCompositeException(OptionError,
"MissingArgument",option);
726 colorspace=ParseCommandOption(MagickColorspaceOptions,
727 MagickFalse,argv[i]);
729 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
733 if (LocaleCompare(
"comment",option+1) == 0)
738 if (i == (ssize_t) argc)
739 ThrowCompositeException(OptionError,
"MissingArgument",option);
742 if (LocaleCompare(
"compose",option+1) == 0)
747 composite_options.compose=UndefinedCompositeOp;
751 if (i == (ssize_t) argc)
752 ThrowCompositeException(OptionError,
"MissingArgument",option);
753 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,
756 ThrowCompositeException(OptionError,
"UnrecognizedComposeOperator",
758 composite_options.compose=(CompositeOperator) compose;
761 if (LocaleCompare(
"compress",option+1) == 0)
769 if (i == (ssize_t) argc)
770 ThrowCompositeException(OptionError,
"MissingArgument",option);
771 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
774 ThrowCompositeException(OptionError,
775 "UnrecognizedImageCompression",argv[i]);
778 if (LocaleCompare(
"concurrent",option+1) == 0)
780 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
784 if (LocaleCompare(
"debug",option+1) == 0)
792 if (i == (ssize_t) argc)
793 ThrowCompositeException(OptionError,
"MissingArgument",option);
794 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
796 ThrowCompositeException(OptionError,
"UnrecognizedEventType",
798 (void) SetLogEventMask(argv[i]);
801 if (LocaleCompare(
"decipher",option+1) == 0)
806 if (i == (ssize_t) argc)
807 ThrowCompositeException(OptionError,
"MissingArgument",option);
810 if (LocaleCompare(
"define",option+1) == 0)
813 if (i == (ssize_t) argc)
814 ThrowCompositeException(OptionError,
"MissingArgument",option);
820 define=GetImageOption(image_info,argv[i]);
821 if (define == (
const char *) NULL)
822 ThrowCompositeException(OptionError,
"NoSuchOption",argv[i]);
827 if (LocaleCompare(
"density",option+1) == 0)
832 if (i == (ssize_t) argc)
833 ThrowCompositeException(OptionError,
"MissingArgument",option);
834 if (IsGeometry(argv[i]) == MagickFalse)
835 ThrowCompositeInvalidArgumentException(option,argv[i]);
838 if (LocaleCompare(
"depth",option+1) == 0)
843 if (i == (ssize_t) argc)
844 ThrowCompositeException(OptionError,
"MissingArgument",option);
845 if (IsGeometry(argv[i]) == MagickFalse)
846 ThrowCompositeInvalidArgumentException(option,argv[i]);
849 if (LocaleCompare(
"displace",option+1) == 0)
851 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
855 if (i == (ssize_t) argc)
856 ThrowCompositeException(OptionError,
"MissingArgument",option);
857 if (IsGeometry(argv[i]) == MagickFalse)
858 ThrowCompositeInvalidArgumentException(option,argv[i]);
859 (void) CloneString(&composite_options.compose_args,argv[i]);
860 composite_options.compose=DisplaceCompositeOp;
863 if (LocaleCompare(
"display",option+1) == 0)
868 if (i == (ssize_t) argc)
869 ThrowCompositeException(OptionError,
"MissingArgument",option);
872 if (LocaleCompare(
"dispose",option+1) == 0)
880 if (i == (ssize_t) argc)
881 ThrowCompositeException(OptionError,
"MissingArgument",option);
882 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
884 ThrowCompositeException(OptionError,
"UnrecognizedDisposeMethod",
888 if (LocaleCompare(
"dissolve",option+1) == 0)
890 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
894 if (i == (ssize_t) argc)
895 ThrowCompositeException(OptionError,
"MissingArgument",option);
896 if (IsGeometry(argv[i]) == MagickFalse)
897 ThrowCompositeInvalidArgumentException(option,argv[i]);
898 (void) CloneString(&composite_options.compose_args,argv[i]);
899 composite_options.compose=DissolveCompositeOp;
902 if (LocaleCompare(
"distort",option+1) == 0)
904 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
908 if (i == (ssize_t) argc)
909 ThrowCompositeException(OptionError,
"MissingArgument",option);
910 if (IsGeometry(argv[i]) == MagickFalse)
911 ThrowCompositeInvalidArgumentException(option,argv[i]);
912 (void) CloneString(&composite_options.compose_args,argv[i]);
913 composite_options.compose=DistortCompositeOp;
916 if (LocaleCompare(
"dither",option+1) == 0)
924 if (i == (ssize_t) argc)
925 ThrowCompositeException(OptionError,
"MissingArgument",option);
926 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
928 ThrowCompositeException(OptionError,
"UnrecognizedDitherMethod",
932 if (LocaleCompare(
"duration",option+1) == 0)
937 if (i == (ssize_t) argc)
938 ThrowCompositeException(OptionError,
"MissingArgument",option);
939 if (IsGeometry(argv[i]) == MagickFalse)
940 ThrowCompositeInvalidArgumentException(option,argv[i]);
943 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
947 if (LocaleCompare(
"encipher",option+1) == 0)
952 if (i == (ssize_t) argc)
953 ThrowCompositeException(OptionError,
"MissingArgument",option);
956 if (LocaleCompare(
"encoding",option+1) == 0)
961 if (i == (ssize_t) argc)
962 ThrowCompositeException(OptionError,
"MissingArgument",option);
965 if (LocaleCompare(
"endian",option+1) == 0)
973 if (i == (ssize_t) argc)
974 ThrowCompositeException(OptionError,
"MissingArgument",option);
975 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
978 ThrowCompositeException(OptionError,
"UnrecognizedEndianType",
982 if (LocaleCompare(
"extract",option+1) == 0)
987 if (i == (ssize_t) argc)
988 ThrowCompositeException(OptionError,
"MissingArgument",option);
989 if (IsGeometry(argv[i]) == MagickFalse)
990 ThrowCompositeInvalidArgumentException(option,argv[i]);
993 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
997 if (LocaleCompare(
"filter",option+1) == 0)
1005 if (i == (ssize_t) argc)
1006 ThrowCompositeException(OptionError,
"MissingArgument",option);
1007 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
1009 ThrowCompositeException(OptionError,
"UnrecognizedImageFilter",
1013 if (LocaleCompare(
"font",option+1) == 0)
1018 if (i == (ssize_t) argc)
1019 ThrowCompositeException(OptionError,
"MissingArgument",option);
1022 if (LocaleCompare(
"format",option+1) == 0)
1027 if (i == (ssize_t) argc)
1028 ThrowCompositeException(OptionError,
"MissingArgument",option);
1032 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1036 if (LocaleCompare(
"geometry",option+1) == 0)
1038 (void) CloneString(&composite_options.geometry,(
char *) NULL);
1042 if (i == (ssize_t) argc)
1043 ThrowCompositeException(OptionError,
"MissingArgument",option);
1044 if (IsGeometry(argv[i]) == MagickFalse)
1045 ThrowCompositeInvalidArgumentException(option,argv[i]);
1046 (void) CloneString(&composite_options.geometry,argv[i]);
1049 if (LocaleCompare(
"gravity",option+1) == 0)
1054 composite_options.gravity=UndefinedGravity;
1058 if (i == (ssize_t) argc)
1059 ThrowCompositeException(OptionError,
"MissingArgument",option);
1060 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1063 ThrowCompositeException(OptionError,
"UnrecognizedGravityType",
1065 composite_options.gravity=(GravityType) gravity;
1068 if (LocaleCompare(
"green-primary",option+1) == 0)
1073 if (i == (ssize_t) argc)
1074 ThrowCompositeException(OptionError,
"MissingArgument",option);
1075 if (IsGeometry(argv[i]) == MagickFalse)
1076 ThrowCompositeInvalidArgumentException(option,argv[i]);
1079 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1083 if ((LocaleCompare(
"help",option+1) == 0) ||
1084 (LocaleCompare(
"-help",option+1) == 0))
1087 return(CompositeUsage());
1089 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1093 if (LocaleCompare(
"identify",option+1) == 0)
1095 if (LocaleCompare(
"interlace",option+1) == 0)
1103 if (i == (ssize_t) argc)
1104 ThrowCompositeException(OptionError,
"MissingArgument",option);
1105 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1108 ThrowCompositeException(OptionError,
1109 "UnrecognizedInterlaceType",argv[i]);
1112 if (LocaleCompare(
"interpolate",option+1) == 0)
1120 if (i == (ssize_t) argc)
1121 ThrowCompositeException(OptionError,
"MissingArgument",option);
1122 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1124 if (interpolate < 0)
1125 ThrowCompositeException(OptionError,
1126 "UnrecognizedInterpolateMethod",argv[i]);
1129 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1133 if (LocaleCompare(
"label",option+1) == 0)
1138 if (i == (ssize_t) argc)
1139 ThrowCompositeException(OptionError,
"MissingArgument",option);
1142 if (LocaleCompare(
"limit",option+1) == 0)
1156 if (i == (ssize_t) argc)
1157 ThrowCompositeException(OptionError,
"MissingArgument",option);
1158 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1161 ThrowCompositeException(OptionError,
"UnrecognizedResourceType",
1164 if (i == (ssize_t) argc)
1165 ThrowCompositeException(OptionError,
"MissingArgument",option);
1166 value=StringToDouble(argv[i],&p);
1168 if ((p == argv[i]) && (LocaleCompare(
"unlimited",argv[i]) != 0))
1169 ThrowCompositeInvalidArgumentException(option,argv[i]);
1172 if (LocaleCompare(
"list",option+1) == 0)
1180 if (i == (ssize_t) argc)
1181 ThrowCompositeException(OptionError,
"MissingArgument",option);
1182 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1184 ThrowCompositeException(OptionError,
"UnrecognizedListType",
1186 status=MogrifyImageInfo(image_info,(
int) (i-j+1),(
const char **)
1189 return(status == 0 ? MagickFalse : MagickTrue);
1191 if (LocaleCompare(
"log",option+1) == 0)
1196 if ((i == (ssize_t) argc) || (strchr(argv[i],
'%') == (
char *) NULL))
1197 ThrowCompositeException(OptionError,
"MissingArgument",option);
1200 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1204 if (LocaleCompare(
"matte",option+1) == 0)
1206 if (LocaleCompare(
"monitor",option+1) == 0)
1208 if (LocaleCompare(
"monochrome",option+1) == 0)
1210 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1214 if (LocaleCompare(
"negate",option+1) == 0)
1216 if (LocaleCompare(
"noop",option+1) == 0)
1218 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1222 if (LocaleCompare(
"page",option+1) == 0)
1227 if (i == (ssize_t) argc)
1228 ThrowCompositeException(OptionError,
"MissingArgument",option);
1231 if (LocaleCompare(
"pointsize",option+1) == 0)
1236 if (i == (ssize_t) argc)
1237 ThrowCompositeException(OptionError,
"MissingArgument",option);
1238 if (IsGeometry(argv[i]) == MagickFalse)
1239 ThrowCompositeInvalidArgumentException(option,argv[i]);
1242 if (LocaleCompare(
"process",option+1) == 0)
1247 if (i == (ssize_t) argc)
1248 ThrowCompositeException(OptionError,
"MissingArgument",option);
1251 if (LocaleCompare(
"profile",option+1) == 0)
1254 if (i == (ssize_t) argc)
1255 ThrowCompositeException(OptionError,
"MissingArgument",option);
1258 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1262 if (LocaleCompare(
"quality",option+1) == 0)
1267 if (i == (ssize_t) argc)
1268 ThrowCompositeException(OptionError,
"MissingArgument",option);
1269 if (IsGeometry(argv[i]) == MagickFalse)
1270 ThrowCompositeInvalidArgumentException(option,argv[i]);
1273 if (LocaleCompare(
"quantize",option+1) == 0)
1281 if (i == (ssize_t) argc)
1282 ThrowCompositeException(OptionError,
"MissingArgument",option);
1283 colorspace=ParseCommandOption(MagickColorspaceOptions,
1284 MagickFalse,argv[i]);
1286 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
1290 if (LocaleCompare(
"quiet",option+1) == 0)
1292 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1296 if (LocaleCompare(
"red-primary",option+1) == 0)
1301 if (i == (ssize_t) argc)
1302 ThrowCompositeException(OptionError,
"MissingArgument",option);
1303 if (IsGeometry(argv[i]) == MagickFalse)
1304 ThrowCompositeInvalidArgumentException(option,argv[i]);
1307 if (LocaleCompare(
"regard-warnings",option+1) == 0)
1309 if (LocaleCompare(
"render",option+1) == 0)
1311 if (LocaleCompare(
"repage",option+1) == 0)
1316 if (i == (ssize_t) argc)
1317 ThrowCompositeException(OptionError,
"MissingArgument",option);
1318 if (IsGeometry(argv[i]) == MagickFalse)
1319 ThrowCompositeInvalidArgumentException(option,argv[i]);
1322 if (LocaleNCompare(
"respect-parentheses",option+1,17) == 0)
1324 respect_parentheses=(*option ==
'-') ? MagickTrue : MagickFalse;
1327 if (LocaleCompare(
"resize",option+1) == 0)
1332 if (i == (ssize_t) argc)
1333 ThrowCompositeException(OptionError,
"MissingArgument",option);
1334 if (IsGeometry(argv[i]) == MagickFalse)
1335 ThrowCompositeInvalidArgumentException(option,argv[i]);
1338 if (LocaleCompare(
"rotate",option+1) == 0)
1341 if (i == (ssize_t) argc)
1342 ThrowCompositeException(OptionError,
"MissingArgument",option);
1343 if (IsGeometry(argv[i]) == MagickFalse)
1344 ThrowCompositeInvalidArgumentException(option,argv[i]);
1347 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1351 if (LocaleCompare(
"sampling-factor",option+1) == 0)
1356 if (i == (ssize_t) argc)
1357 ThrowCompositeException(OptionError,
"MissingArgument",option);
1358 if (IsGeometry(argv[i]) == MagickFalse)
1359 ThrowCompositeInvalidArgumentException(option,argv[i]);
1362 if (LocaleCompare(
"scene",option+1) == 0)
1367 if (i == (ssize_t) argc)
1368 ThrowCompositeException(OptionError,
"MissingArgument",option);
1369 if (IsGeometry(argv[i]) == MagickFalse)
1370 ThrowCompositeInvalidArgumentException(option,argv[i]);
1373 if (LocaleCompare(
"seed",option+1) == 0)
1378 if (i == (ssize_t) argc)
1379 ThrowCompositeException(OptionError,
"MissingArgument",option);
1380 if (IsGeometry(argv[i]) == MagickFalse)
1381 ThrowCompositeInvalidArgumentException(option,argv[i]);
1384 if (LocaleCompare(
"sharpen",option+1) == 0)
1387 if (i == (ssize_t) argc)
1388 ThrowCompositeException(OptionError,
"MissingArgument",option);
1389 if (IsGeometry(argv[i]) == MagickFalse)
1390 ThrowCompositeInvalidArgumentException(option,argv[i]);
1393 if (LocaleCompare(
"shave",option+1) == 0)
1398 if (i == (ssize_t) argc)
1399 ThrowCompositeException(OptionError,
"MissingArgument",option);
1400 if (IsGeometry(argv[i]) == MagickFalse)
1401 ThrowCompositeInvalidArgumentException(option,argv[i]);
1404 if (LocaleCompare(
"size",option+1) == 0)
1409 if (i == (ssize_t) argc)
1410 ThrowCompositeException(OptionError,
"MissingArgument",option);
1411 if (IsGeometry(argv[i]) == MagickFalse)
1412 ThrowCompositeInvalidArgumentException(option,argv[i]);
1415 if (LocaleCompare(
"stegano",option+1) == 0)
1417 composite_options.stegano=0;
1421 if (i == (ssize_t) argc)
1422 ThrowCompositeException(OptionError,
"MissingArgument",option);
1423 if (IsGeometry(argv[i]) == MagickFalse)
1424 ThrowCompositeInvalidArgumentException(option,argv[i]);
1425 composite_options.stegano=(ssize_t) StringToLong(argv[i])+1;
1428 if (LocaleCompare(
"stereo",option+1) == 0)
1433 composite_options.stereo=MagickFalse;
1437 if (i == (ssize_t) argc)
1438 ThrowCompositeException(OptionError,
"MissingArgument",option);
1439 if (IsGeometry(argv[i]) == MagickFalse)
1440 ThrowCompositeInvalidArgumentException(option,argv[i]);
1441 flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset);
1442 if ((flags & YValue) == 0)
1443 composite_options.offset.y=composite_options.offset.x;
1444 composite_options.stereo=MagickTrue;
1447 if (LocaleCompare(
"strip",option+1) == 0)
1449 if (LocaleCompare(
"support",option+1) == 0)
1454 if (LocaleCompare(
"swap",option+1) == 0)
1459 if (i == (ssize_t) argc)
1460 ThrowCompositeException(OptionError,
"MissingArgument",option);
1461 if (IsGeometry(argv[i]) == MagickFalse)
1462 ThrowCompositeInvalidArgumentException(option,argv[i]);
1465 if (LocaleCompare(
"synchronize",option+1) == 0)
1467 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1471 if (LocaleCompare(
"taint",option+1) == 0)
1473 if (LocaleCompare(
"thumbnail",option+1) == 0)
1478 if (i == (ssize_t) argc)
1479 ThrowCompositeException(OptionError,
"MissingArgument",option);
1480 if (IsGeometry(argv[i]) == MagickFalse)
1481 ThrowCompositeInvalidArgumentException(option,argv[i]);
1484 if (LocaleCompare(
"tile",option+1) == 0)
1486 composite_options.tile=(*option ==
'-') ? MagickTrue : MagickFalse;
1487 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1490 if (LocaleCompare(
"transform",option+1) == 0)
1492 if (LocaleCompare(
"transparent-color",option+1) == 0)
1497 if (i == (ssize_t) argc)
1498 ThrowCompositeException(OptionError,
"MissingArgument",option);
1501 if (LocaleCompare(
"treedepth",option+1) == 0)
1506 if (i == (ssize_t) argc)
1507 ThrowCompositeException(OptionError,
"MissingArgument",option);
1508 if (IsGeometry(argv[i]) == MagickFalse)
1509 ThrowCompositeInvalidArgumentException(option,argv[i]);
1512 if (LocaleCompare(
"type",option+1) == 0)
1520 if (i == (ssize_t) argc)
1521 ThrowCompositeException(OptionError,
"MissingArgument",option);
1522 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1524 ThrowCompositeException(OptionError,
"UnrecognizedImageType",
1528 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1532 if (LocaleCompare(
"units",option+1) == 0)
1540 if (i == (ssize_t) argc)
1541 ThrowCompositeException(OptionError,
"MissingArgument",option);
1542 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
1545 ThrowCompositeException(OptionError,
"UnrecognizedUnitsType",
1549 if (LocaleCompare(
"unsharp",option+1) == 0)
1551 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1555 if (i == (ssize_t) argc)
1556 ThrowCompositeException(OptionError,
"MissingArgument",option);
1557 if (IsGeometry(argv[i]) == MagickFalse)
1558 ThrowCompositeInvalidArgumentException(option,argv[i]);
1559 (void) CloneString(&composite_options.compose_args,argv[i]);
1560 composite_options.compose=ThresholdCompositeOp;
1563 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1567 if (LocaleCompare(
"verbose",option+1) == 0)
1569 if ((LocaleCompare(
"version",option+1) == 0) ||
1570 (LocaleCompare(
"-version",option+1) == 0))
1572 ListMagickVersion(stdout);
1575 if (LocaleCompare(
"virtual-pixel",option+1) == 0)
1583 if (i == (ssize_t) argc)
1584 ThrowCompositeException(OptionError,
"MissingArgument",option);
1585 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1588 ThrowCompositeException(OptionError,
1589 "UnrecognizedVirtualPixelMethod",argv[i]);
1592 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1596 if (LocaleCompare(
"watermark",option+1) == 0)
1598 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1602 if (i == (ssize_t) argc)
1603 ThrowCompositeException(OptionError,
"MissingArgument",option);
1604 if (IsGeometry(argv[i]) == MagickFalse)
1605 ThrowCompositeInvalidArgumentException(option,argv[i]);
1606 (void) CloneString(&composite_options.compose_args,argv[i]);
1607 composite_options.compose=ModulateCompositeOp;
1610 if (LocaleCompare(
"white-point",option+1) == 0)
1615 if (i == (ssize_t) argc)
1616 ThrowCompositeException(OptionError,
"MissingArgument",option);
1617 if (IsGeometry(argv[i]) == MagickFalse)
1618 ThrowCompositeInvalidArgumentException(option,argv[i]);
1621 if (LocaleCompare(
"write",option+1) == 0)
1624 if (i == (ssize_t) argc)
1625 ThrowCompositeException(OptionError,
"MissingArgument",option);
1628 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1633 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1635 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1636 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1637 if (fire != MagickFalse)
1638 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1641 ThrowCompositeException(OptionError,
"UnbalancedParenthesis",argv[i]);
1642 if (i-- != ((ssize_t) argc-1))
1643 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[i]);
1644 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1645 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1646 FinalizeImageSettings(image_info,image,MagickTrue);
1647 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1648 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1652 RemoveImageStack(composite_image);
1653 RemoveImageStack(images);
1654 if (composite_image->geometry != (
char *) NULL)
1659 (void) ParseRegionGeometry(composite_image,composite_image->geometry,
1660 &resize_geometry,exception);
1661 if ((composite_image->columns != resize_geometry.width) ||
1662 (composite_image->rows != resize_geometry.height))
1667 resize_image=ResizeImage(composite_image,resize_geometry.width,
1668 resize_geometry.height,composite_image->filter,exception);
1669 if (resize_image != (Image *) NULL)
1671 composite_image=DestroyImage(composite_image);
1672 composite_image=resize_image;
1676 RemoveImageStack(mask_image);
1677 status&=(MagickStatusType) CompositeImageList(image_info,&images,
1678 composite_image,mask_image,&composite_options,exception);
1679 composite_image=DestroyImage(composite_image);
1683 status&=(MagickStatusType) WriteImages(image_info,images,argv[argc-1],
1685 if (metadata != (
char **) NULL)
1690 text=InterpretImageProperties(image_info,images,format,exception);
1691 if (text == (
char *) NULL)
1692 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
1694 (void) ConcatenateString(&(*metadata),text);
1695 text=DestroyString(text);
1697 images=DestroyImageList(images);
1698 RelinquishCompositeOptions(&composite_options);
1700 return(status != 0 ? MagickTrue : MagickFalse);