43#include "wand/studio.h"
44#include "wand/MagickWand.h"
45#include "wand/mogrify-private.h"
46#include "magick/string-private.h"
110static MagickBooleanType CompositeImageList(ImageInfo *image_info,Image **image,
111 Image *composite_image,CompositeOptions *composite_options,
112 ExceptionInfo *exception)
117 assert(image_info != (ImageInfo *) NULL);
118 assert(image_info->signature == MagickCoreSignature);
119 assert(image != (Image **) NULL);
120 assert((*image)->signature == MagickCoreSignature);
121 assert(exception != (ExceptionInfo *) NULL);
122 if (IsEventLogging() != MagickFalse)
123 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",(*image)->filename);
126 if (composite_image != (Image *) NULL)
128 assert(composite_image->signature == MagickCoreSignature);
129 switch( composite_options->compose )
131 case BlendCompositeOp:
132 case BlurCompositeOp:
133 case DisplaceCompositeOp:
134 case DistortCompositeOp:
135 case DissolveCompositeOp:
136 case ModulateCompositeOp:
137 case ThresholdCompositeOp:
139 (void) SetImageArtifact(*image,
"compose:args",
140 composite_options->compose_args);
149 if (composite_options->stegano != 0)
154 (*image)->offset=composite_options->stegano-1;
155 stegano_image=SteganoImage(*image,composite_image,exception);
156 if (stegano_image != (Image *) NULL)
158 *image=DestroyImageList(*image);
159 *image=stegano_image;
163 if (composite_options->stereo != MagickFalse)
168 stereo_image=StereoAnaglyphImage(*image,composite_image,
169 composite_options->offset.x,composite_options->offset.y,
171 if (stereo_image != (Image *) NULL)
173 *image=DestroyImageList(*image);
178 if (composite_options->tile != MagickFalse)
190 (void) SetImageArtifact(composite_image,
"compose:outside-overlay",
192 columns=composite_image->columns;
193 for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows)
194 for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns)
195 status&=CompositeImageChannel(*image,
196 composite_options->channel,composite_options->compose,
197 composite_image,x,y);
198 GetImageException(*image,exception);
208 SetGeometry(*image,&geometry);
209 (void) ParseAbsoluteGeometry(composite_options->geometry,
211 geometry.width=composite_image->columns;
212 geometry.height=composite_image->rows;
213 GravityAdjustGeometry((*image)->columns,(*image)->rows,
214 composite_options->gravity, &geometry);
215 (*image)->gravity=(GravityType) composite_options->gravity;
219 status&=CompositeImageChannel(*image,composite_options->channel,
220 composite_options->compose,composite_image,geometry.x,
222 GetImageException(*image,exception);
225 return(status != 0 ? MagickTrue : MagickFalse);
228static MagickBooleanType CompositeUsage(
void)
232 " -debug events display copious debugging information\n"
233 " -help print program options\n"
234 " -list type print a list of supported option arguments\n"
235 " -log format format of debugging information\n"
236 " -version print version information",
238 " -blend geometry blend images\n"
239 " -border geometry surround image with a border of color\n"
240 " -bordercolor color border color\n"
241 " -colors value preferred number of colors in the image\n"
242 " -decipher filename convert cipher pixels to plain pixels\n"
243 " -displace geometry shift lookup according to a relative displacement map\n"
244 " -dissolve value dissolve the two images a given percent\n"
245 " -distort geometry shift lookup according to a absolute distortion map\n"
246 " -encipher filename convert plain pixels to cipher pixels\n"
247 " -extract geometry extract area from image\n"
248 " -geometry geometry location of the composite image\n"
249 " -identify identify the format and characteristics of the image\n"
250 " -monochrome transform image to black and white\n"
251 " -negate replace every pixel with its complementary color \n"
252 " -profile filename add ICM or IPTC information profile to image\n"
253 " -quantize colorspace reduce colors in this colorspace\n"
254 " -rotate degrees apply Paeth rotation to the image\n"
255 " -resize geometry resize the image\n"
256 " -sharpen geometry sharpen the image\n"
257 " -shave geometry shave pixels from the image edges\n"
258 " -stegano offset hide watermark within an image\n"
259 " -stereo geometry combine two image to create a stereo anaglyph\n"
260 " -strip strip image of all profiles and comments\n"
261 " -thumbnail geometry create a thumbnail of the image\n"
262 " -transform affine transform image\n"
263 " -type type image type\n"
264 " -unsharp geometry sharpen the image\n"
265 " -watermark geometry percent brightness and saturation of a watermark\n"
266 " -write filename write images to this file",
268 " -affine matrix affine transform matrix\n"
269 " -alpha option on, activate, off, deactivate, set, opaque, copy\n"
270 " transparent, extract, background, or shape\n"
271 " -authenticate password\n"
272 " decipher image with this password\n"
273 " -blue-primary point chromaticity blue primary point\n"
274 " -channel type apply option to select image channels\n"
275 " -colorspace type alternate image colorspace\n"
276 " -comment string annotate image with comment\n"
277 " -compose operator composite operator\n"
278 " -compress type type of pixel compression when writing the image\n"
279 " -define format:option\n"
280 " define one or more image format options\n"
281 " -depth value image depth\n"
282 " -density geometry horizontal and vertical density of the image\n"
283 " -display server get image or font from this X server\n"
284 " -dispose method layer disposal method\n"
285 " -dither method apply error diffusion to image\n"
286 " -encoding type text encoding type\n"
287 " -endian type endianness (MSB or LSB) of the image\n"
288 " -filter type use this filter when resizing an image\n"
289 " -font name render text with this font\n"
290 " -format \"string\" output formatted image characteristics\n"
291 " -gravity type which direction to gravitate towards\n"
292 " -green-primary point chromaticity green primary point\n"
293 " -interlace type type of image interlacing scheme\n"
294 " -interpolate method pixel color interpolation method\n"
295 " -label string assign a label to an image\n"
296 " -limit type value pixel cache resource limit\n"
297 " -matte store matte channel if the image has one\n"
298 " -monitor monitor progress\n"
299 " -page geometry size and location of an image canvas (setting)\n"
300 " -pointsize value font point size\n"
301 " -quality value JPEG/MIFF/PNG compression level\n"
302 " -quiet suppress all warning messages\n"
303 " -red-primary point chromaticity red primary point\n"
304 " -regard-warnings pay attention to warning messages\n"
305 " -repage geometry size and location of an image canvas (operator)\n"
306 " -respect-parentheses settings remain in effect until parenthesis boundary\n"
307 " -sampling-factor geometry\n"
308 " horizontal and vertical sampling factor\n"
309 " -scene value image scene number\n"
310 " -seed value seed a new sequence of pseudo-random numbers\n"
311 " -size geometry width and height of image\n"
312 " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n"
313 " -synchronize synchronize image to storage device\n"
314 " -taint declare the image as modified\n"
315 " -transparent-color color\n"
316 " transparent color\n"
317 " -treedepth value color tree depth\n"
318 " -tile repeat composite operation across and down image\n"
319 " -units type the units of image resolution\n"
320 " -verbose print detailed information about the image\n"
321 " -virtual-pixel method\n"
322 " virtual pixel access method\n"
323 " -white-point point chromaticity white point",
325 " -swap indexes swap two images in the image sequence";
327 ListMagickVersion(stdout);
328 (void) printf(
"Usage: %s [options ...] image [options ...] composite\n"
329 " [ [options ...] mask ] [options ...] composite\n",
331 (void) printf(
"\nImage Settings:\n");
332 (void) puts(settings);
333 (void) printf(
"\nImage Operators:\n");
334 (void) puts(operators);
335 (void) printf(
"\nImage Stack Operators:\n");
336 (void) puts(stack_operators);
337 (void) printf(
"\nMiscellaneous Options:\n");
338 (void) puts(miscellaneous);
340 "\nBy default, the image format of `file' is determined by its magic\n");
342 "number. To specify a particular image format, precede the filename\n");
344 "with an image format name and a colon (i.e. ps:image) or specify the\n");
346 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
347 (void) printf(
"'-' for standard input or output.\n");
351static void GetCompositeOptions(CompositeOptions *composite_options)
353 (void) memset(composite_options,0,
sizeof(*composite_options));
354 composite_options->channel=DefaultChannels;
355 composite_options->compose=OverCompositeOp;
358static void RelinquishCompositeOptions(CompositeOptions *composite_options)
360 if (composite_options->compose_args != (
char *) NULL)
361 composite_options->compose_args=(
char *)
362 RelinquishMagickMemory(composite_options->compose_args);
363 if (composite_options->geometry != (
char *) NULL)
364 composite_options->geometry=(
char *)
365 RelinquishMagickMemory(composite_options->geometry);
368WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info,
369 int argc,
char **argv,
char **metadata,ExceptionInfo *exception)
371#define NotInitialized (unsigned int) (~0)
372#define DestroyComposite() \
374 RelinquishCompositeOptions(&composite_options); \
375 DestroyImageStack(); \
376 for (i=0; i < (ssize_t) argc; i++) \
377 argv[i]=DestroyString(argv[i]); \
378 argv=(char **) RelinquishMagickMemory(argv); \
380#define ThrowCompositeException(asperity,tag,option) \
382 char *message = GetExceptionMessage(errno); \
383 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag, \
384 "`%s'",option == (char *) NULL ? message : option); \
385 message=DestroyString(message); \
386 DestroyComposite(); \
387 return(MagickFalse); \
389#define ThrowCompositeInvalidArgumentException(option,argument) \
391 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
392 "InvalidArgument","`%s': %s",option,argument); \
393 DestroyComposite(); \
394 return(MagickFalse); \
414 image_stack[MaxImageStackDepth+1];
434 assert(image_info != (ImageInfo *) NULL);
435 assert(image_info->signature == MagickCoreSignature);
436 if (image_info->debug != MagickFalse)
437 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
438 assert(exception != (ExceptionInfo *) NULL);
442 if ((LocaleCompare(
"version",option+1) == 0) ||
443 (LocaleCompare(
"-version",option+1) == 0))
445 ListMagickVersion(stdout);
451 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
452 "MissingArgument",
"%s",
"");
453 (void) CompositeUsage();
456 GetCompositeOptions(&composite_options);
457 filename=(
char *) NULL;
462 option=(
char *) NULL;
464 respect_parenthesis=MagickFalse;
469 composite_image=NewImageList();
470 image=NewImageList();
471 mask_image=NewImageList();
472 ReadCommandlLine(argc,&argv);
473 status=ExpandFilenames(&argc,&argv);
474 if (status == MagickFalse)
475 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
477 for (i=1; i < ((ssize_t) argc-1); i++)
480 if (LocaleCompare(option,
"(") == 0)
482 FireImageStack(MagickFalse,MagickTrue,pend);
483 if (k == MaxImageStackDepth)
484 ThrowCompositeException(OptionError,
"ParenthesisNestedTooDeeply",
489 if (LocaleCompare(option,
")") == 0)
491 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
493 ThrowCompositeException(OptionError,
"UnableToParseExpression",option);
497 if (IsCommandOption(option) == MagickFalse)
505 FireImageStack(MagickFalse,MagickFalse,pend);
507 if ((LocaleCompare(filename,
"--") == 0) && (i < ((ssize_t) argc-1)))
509 (void) SetImageOption(image_info,
"filename",filename);
510 (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
511 images=ReadImages(image_info,exception);
512 status&=(images != (Image *) NULL) &&
513 (exception->severity < ErrorException);
514 if (images == (Image *) NULL)
516 AppendImageStack(images);
519 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
524 if (LocaleCompare(
"affine",option+1) == 0)
529 if (i == (ssize_t) argc)
530 ThrowCompositeException(OptionError,
"MissingArgument",option);
531 if (IsGeometry(argv[i]) == MagickFalse)
532 ThrowCompositeInvalidArgumentException(option,argv[i]);
535 if (LocaleCompare(
"alpha",option+1) == 0)
543 if (i == (ssize_t) argc)
544 ThrowCompositeException(OptionError,
"MissingArgument",option);
545 type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
547 ThrowCompositeException(OptionError,
548 "UnrecognizedAlphaChannelType",argv[i]);
551 if (LocaleCompare(
"authenticate",option+1) == 0)
556 if (i == (ssize_t) argc)
557 ThrowCompositeException(OptionError,
"MissingArgument",option);
560 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
564 if (LocaleCompare(
"background",option+1) == 0)
569 if (i == (ssize_t) argc)
570 ThrowCompositeException(OptionError,
"MissingArgument",option);
573 if (LocaleCompare(
"blend",option+1) == 0)
575 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
579 if (i == (ssize_t) argc)
580 ThrowCompositeException(OptionError,
"MissingArgument",option);
581 if (IsGeometry(argv[i]) == MagickFalse)
582 ThrowCompositeInvalidArgumentException(option,argv[i]);
583 (void) CloneString(&composite_options.compose_args,argv[i]);
584 composite_options.compose=BlendCompositeOp;
587 if (LocaleCompare(
"blur",option+1) == 0)
589 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
593 if (i == (ssize_t) argc)
594 ThrowCompositeException(OptionError,
"MissingArgument",option);
595 if (IsGeometry(argv[i]) == MagickFalse)
596 ThrowCompositeInvalidArgumentException(option,argv[i]);
597 (void) CloneString(&composite_options.compose_args,argv[i]);
598 composite_options.compose=BlurCompositeOp;
601 if (LocaleCompare(
"blue-primary",option+1) == 0)
606 if (i == (ssize_t) argc)
607 ThrowCompositeException(OptionError,
"MissingArgument",option);
608 if (IsGeometry(argv[i]) == MagickFalse)
609 ThrowCompositeInvalidArgumentException(option,argv[i]);
612 if (LocaleCompare(
"border",option+1) == 0)
617 if (i == (ssize_t) argc)
618 ThrowCompositeException(OptionError,
"MissingArgument",option);
619 if (IsGeometry(argv[i]) == MagickFalse)
620 ThrowCompositeInvalidArgumentException(option,argv[i]);
623 if (LocaleCompare(
"bordercolor",option+1) == 0)
628 if (i == (ssize_t) argc)
629 ThrowCompositeException(OptionError,
"MissingArgument",option);
632 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
636 if (LocaleCompare(
"cache",option+1) == 0)
641 if (i == (ssize_t) argc)
642 ThrowCompositeException(OptionError,
"MissingArgument",option);
643 if (IsGeometry(argv[i]) == MagickFalse)
644 ThrowCompositeInvalidArgumentException(option,argv[i]);
647 if (LocaleCompare(
"channel",option+1) == 0)
654 composite_options.channel=DefaultChannels;
658 if (i == (ssize_t) argc)
659 ThrowCompositeException(OptionError,
"MissingArgument",option);
660 channel=ParseChannelOption(argv[i]);
662 ThrowCompositeException(OptionError,
"UnrecognizedChannelType",
664 composite_options.channel=(ChannelType) channel;
667 if (LocaleCompare(
"colors",option+1) == 0)
672 if (i == (ssize_t) argc)
673 ThrowCompositeException(OptionError,
"MissingArgument",option);
674 if (IsGeometry(argv[i]) == MagickFalse)
675 ThrowCompositeInvalidArgumentException(option,argv[i]);
678 if (LocaleCompare(
"colorspace",option+1) == 0)
686 if (i == (ssize_t) argc)
687 ThrowCompositeException(OptionError,
"MissingArgument",option);
688 colorspace=ParseCommandOption(MagickColorspaceOptions,
689 MagickFalse,argv[i]);
691 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
695 if (LocaleCompare(
"comment",option+1) == 0)
700 if (i == (ssize_t) argc)
701 ThrowCompositeException(OptionError,
"MissingArgument",option);
704 if (LocaleCompare(
"compose",option+1) == 0)
709 composite_options.compose=UndefinedCompositeOp;
713 if (i == (ssize_t) argc)
714 ThrowCompositeException(OptionError,
"MissingArgument",option);
715 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,
718 ThrowCompositeException(OptionError,
"UnrecognizedComposeOperator",
720 composite_options.compose=(CompositeOperator) compose;
723 if (LocaleCompare(
"compress",option+1) == 0)
731 if (i == (ssize_t) argc)
732 ThrowCompositeException(OptionError,
"MissingArgument",option);
733 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
736 ThrowCompositeException(OptionError,
737 "UnrecognizedImageCompression",argv[i]);
740 if (LocaleCompare(
"concurrent",option+1) == 0)
742 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
746 if (LocaleCompare(
"debug",option+1) == 0)
754 if (i == (ssize_t) argc)
755 ThrowCompositeException(OptionError,
"MissingArgument",option);
756 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
758 ThrowCompositeException(OptionError,
"UnrecognizedEventType",
760 (void) SetLogEventMask(argv[i]);
763 if (LocaleCompare(
"decipher",option+1) == 0)
768 if (i == (ssize_t) argc)
769 ThrowCompositeException(OptionError,
"MissingArgument",option);
772 if (LocaleCompare(
"define",option+1) == 0)
775 if (i == (ssize_t) argc)
776 ThrowCompositeException(OptionError,
"MissingArgument",option);
782 define=GetImageOption(image_info,argv[i]);
783 if (define == (
const char *) NULL)
784 ThrowCompositeException(OptionError,
"NoSuchOption",argv[i]);
789 if (LocaleCompare(
"density",option+1) == 0)
794 if (i == (ssize_t) argc)
795 ThrowCompositeException(OptionError,
"MissingArgument",option);
796 if (IsGeometry(argv[i]) == MagickFalse)
797 ThrowCompositeInvalidArgumentException(option,argv[i]);
800 if (LocaleCompare(
"depth",option+1) == 0)
805 if (i == (ssize_t) argc)
806 ThrowCompositeException(OptionError,
"MissingArgument",option);
807 if (IsGeometry(argv[i]) == MagickFalse)
808 ThrowCompositeInvalidArgumentException(option,argv[i]);
811 if (LocaleCompare(
"displace",option+1) == 0)
813 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
817 if (i == (ssize_t) argc)
818 ThrowCompositeException(OptionError,
"MissingArgument",option);
819 if (IsGeometry(argv[i]) == MagickFalse)
820 ThrowCompositeInvalidArgumentException(option,argv[i]);
821 (void) CloneString(&composite_options.compose_args,argv[i]);
822 composite_options.compose=DisplaceCompositeOp;
825 if (LocaleCompare(
"display",option+1) == 0)
830 if (i == (ssize_t) argc)
831 ThrowCompositeException(OptionError,
"MissingArgument",option);
834 if (LocaleCompare(
"dispose",option+1) == 0)
842 if (i == (ssize_t) argc)
843 ThrowCompositeException(OptionError,
"MissingArgument",option);
844 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
846 ThrowCompositeException(OptionError,
"UnrecognizedDisposeMethod",
850 if (LocaleCompare(
"dissolve",option+1) == 0)
852 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
856 if (i == (ssize_t) argc)
857 ThrowCompositeException(OptionError,
"MissingArgument",option);
858 if (IsGeometry(argv[i]) == MagickFalse)
859 ThrowCompositeInvalidArgumentException(option,argv[i]);
860 (void) CloneString(&composite_options.compose_args,argv[i]);
861 composite_options.compose=DissolveCompositeOp;
864 if (LocaleCompare(
"distort",option+1) == 0)
866 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
870 if (i == (ssize_t) argc)
871 ThrowCompositeException(OptionError,
"MissingArgument",option);
872 if (IsGeometry(argv[i]) == MagickFalse)
873 ThrowCompositeInvalidArgumentException(option,argv[i]);
874 (void) CloneString(&composite_options.compose_args,argv[i]);
875 composite_options.compose=DistortCompositeOp;
878 if (LocaleCompare(
"dither",option+1) == 0)
886 if (i == (ssize_t) argc)
887 ThrowCompositeException(OptionError,
"MissingArgument",option);
888 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
890 ThrowCompositeException(OptionError,
"UnrecognizedDitherMethod",
894 if (LocaleCompare(
"duration",option+1) == 0)
899 if (i == (ssize_t) argc)
900 ThrowCompositeException(OptionError,
"MissingArgument",option);
901 if (IsGeometry(argv[i]) == MagickFalse)
902 ThrowCompositeInvalidArgumentException(option,argv[i]);
905 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
909 if (LocaleCompare(
"encipher",option+1) == 0)
914 if (i == (ssize_t) argc)
915 ThrowCompositeException(OptionError,
"MissingArgument",option);
918 if (LocaleCompare(
"encoding",option+1) == 0)
923 if (i == (ssize_t) argc)
924 ThrowCompositeException(OptionError,
"MissingArgument",option);
927 if (LocaleCompare(
"endian",option+1) == 0)
935 if (i == (ssize_t) argc)
936 ThrowCompositeException(OptionError,
"MissingArgument",option);
937 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
940 ThrowCompositeException(OptionError,
"UnrecognizedEndianType",
944 if (LocaleCompare(
"extract",option+1) == 0)
949 if (i == (ssize_t) argc)
950 ThrowCompositeException(OptionError,
"MissingArgument",option);
951 if (IsGeometry(argv[i]) == MagickFalse)
952 ThrowCompositeInvalidArgumentException(option,argv[i]);
955 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
959 if (LocaleCompare(
"filter",option+1) == 0)
967 if (i == (ssize_t) argc)
968 ThrowCompositeException(OptionError,
"MissingArgument",option);
969 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
971 ThrowCompositeException(OptionError,
"UnrecognizedImageFilter",
975 if (LocaleCompare(
"font",option+1) == 0)
980 if (i == (ssize_t) argc)
981 ThrowCompositeException(OptionError,
"MissingArgument",option);
984 if (LocaleCompare(
"format",option+1) == 0)
989 if (i == (ssize_t) argc)
990 ThrowCompositeException(OptionError,
"MissingArgument",option);
994 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
998 if (LocaleCompare(
"geometry",option+1) == 0)
1000 (void) CloneString(&composite_options.geometry,(
char *) NULL);
1004 if (i == (ssize_t) argc)
1005 ThrowCompositeException(OptionError,
"MissingArgument",option);
1006 if (IsGeometry(argv[i]) == MagickFalse)
1007 ThrowCompositeInvalidArgumentException(option,argv[i]);
1008 (void) CloneString(&composite_options.geometry,argv[i]);
1011 if (LocaleCompare(
"gravity",option+1) == 0)
1016 composite_options.gravity=UndefinedGravity;
1020 if (i == (ssize_t) argc)
1021 ThrowCompositeException(OptionError,
"MissingArgument",option);
1022 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1025 ThrowCompositeException(OptionError,
"UnrecognizedGravityType",
1027 composite_options.gravity=(GravityType) gravity;
1030 if (LocaleCompare(
"green-primary",option+1) == 0)
1035 if (i == (ssize_t) argc)
1036 ThrowCompositeException(OptionError,
"MissingArgument",option);
1037 if (IsGeometry(argv[i]) == MagickFalse)
1038 ThrowCompositeInvalidArgumentException(option,argv[i]);
1041 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1045 if ((LocaleCompare(
"help",option+1) == 0) ||
1046 (LocaleCompare(
"-help",option+1) == 0))
1049 return(CompositeUsage());
1051 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1055 if (LocaleCompare(
"identify",option+1) == 0)
1057 if (LocaleCompare(
"interlace",option+1) == 0)
1065 if (i == (ssize_t) argc)
1066 ThrowCompositeException(OptionError,
"MissingArgument",option);
1067 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1070 ThrowCompositeException(OptionError,
1071 "UnrecognizedInterlaceType",argv[i]);
1074 if (LocaleCompare(
"interpolate",option+1) == 0)
1082 if (i == (ssize_t) argc)
1083 ThrowCompositeException(OptionError,
"MissingArgument",option);
1084 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1086 if (interpolate < 0)
1087 ThrowCompositeException(OptionError,
1088 "UnrecognizedInterpolateMethod",argv[i]);
1091 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1095 if (LocaleCompare(
"label",option+1) == 0)
1100 if (i == (ssize_t) argc)
1101 ThrowCompositeException(OptionError,
"MissingArgument",option);
1104 if (LocaleCompare(
"limit",option+1) == 0)
1118 if (i == (ssize_t) argc)
1119 ThrowCompositeException(OptionError,
"MissingArgument",option);
1120 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1123 ThrowCompositeException(OptionError,
"UnrecognizedResourceType",
1126 if (i == (ssize_t) argc)
1127 ThrowCompositeException(OptionError,
"MissingArgument",option);
1128 value=StringToDouble(argv[i],&p);
1130 if ((p == argv[i]) && (LocaleCompare(
"unlimited",argv[i]) != 0))
1131 ThrowCompositeInvalidArgumentException(option,argv[i]);
1134 if (LocaleCompare(
"list",option+1) == 0)
1142 if (i == (ssize_t) argc)
1143 ThrowCompositeException(OptionError,
"MissingArgument",option);
1144 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1146 ThrowCompositeException(OptionError,
"UnrecognizedListType",
1148 status=MogrifyImageInfo(image_info,(
int) (i-j+1),(
const char **)
1151 return(status == 0 ? MagickFalse : MagickTrue);
1153 if (LocaleCompare(
"log",option+1) == 0)
1158 if ((i == (ssize_t) argc) || (strchr(argv[i],
'%') == (
char *) NULL))
1159 ThrowCompositeException(OptionError,
"MissingArgument",option);
1162 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1166 if (LocaleCompare(
"matte",option+1) == 0)
1168 if (LocaleCompare(
"monitor",option+1) == 0)
1170 if (LocaleCompare(
"monochrome",option+1) == 0)
1172 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1176 if (LocaleCompare(
"negate",option+1) == 0)
1178 if (LocaleCompare(
"noop",option+1) == 0)
1180 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1184 if (LocaleCompare(
"page",option+1) == 0)
1189 if (i == (ssize_t) argc)
1190 ThrowCompositeException(OptionError,
"MissingArgument",option);
1193 if (LocaleCompare(
"pointsize",option+1) == 0)
1198 if (i == (ssize_t) argc)
1199 ThrowCompositeException(OptionError,
"MissingArgument",option);
1200 if (IsGeometry(argv[i]) == MagickFalse)
1201 ThrowCompositeInvalidArgumentException(option,argv[i]);
1204 if (LocaleCompare(
"process",option+1) == 0)
1209 if (i == (ssize_t) argc)
1210 ThrowCompositeException(OptionError,
"MissingArgument",option);
1213 if (LocaleCompare(
"profile",option+1) == 0)
1216 if (i == (ssize_t) argc)
1217 ThrowCompositeException(OptionError,
"MissingArgument",option);
1220 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1224 if (LocaleCompare(
"quality",option+1) == 0)
1229 if (i == (ssize_t) argc)
1230 ThrowCompositeException(OptionError,
"MissingArgument",option);
1231 if (IsGeometry(argv[i]) == MagickFalse)
1232 ThrowCompositeInvalidArgumentException(option,argv[i]);
1235 if (LocaleCompare(
"quantize",option+1) == 0)
1243 if (i == (ssize_t) argc)
1244 ThrowCompositeException(OptionError,
"MissingArgument",option);
1245 colorspace=ParseCommandOption(MagickColorspaceOptions,
1246 MagickFalse,argv[i]);
1248 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
1252 if (LocaleCompare(
"quiet",option+1) == 0)
1254 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1258 if (LocaleCompare(
"red-primary",option+1) == 0)
1263 if (i == (ssize_t) argc)
1264 ThrowCompositeException(OptionError,
"MissingArgument",option);
1265 if (IsGeometry(argv[i]) == MagickFalse)
1266 ThrowCompositeInvalidArgumentException(option,argv[i]);
1269 if (LocaleCompare(
"regard-warnings",option+1) == 0)
1271 if (LocaleCompare(
"render",option+1) == 0)
1273 if (LocaleCompare(
"repage",option+1) == 0)
1278 if (i == (ssize_t) argc)
1279 ThrowCompositeException(OptionError,
"MissingArgument",option);
1280 if (IsGeometry(argv[i]) == MagickFalse)
1281 ThrowCompositeInvalidArgumentException(option,argv[i]);
1284 if (LocaleNCompare(
"respect-parentheses",option+1,17) == 0)
1286 respect_parenthesis=(*option ==
'-') ? MagickTrue : MagickFalse;
1289 if (LocaleCompare(
"resize",option+1) == 0)
1294 if (i == (ssize_t) argc)
1295 ThrowCompositeException(OptionError,
"MissingArgument",option);
1296 if (IsGeometry(argv[i]) == MagickFalse)
1297 ThrowCompositeInvalidArgumentException(option,argv[i]);
1300 if (LocaleCompare(
"rotate",option+1) == 0)
1303 if (i == (ssize_t) argc)
1304 ThrowCompositeException(OptionError,
"MissingArgument",option);
1305 if (IsGeometry(argv[i]) == MagickFalse)
1306 ThrowCompositeInvalidArgumentException(option,argv[i]);
1309 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1313 if (LocaleCompare(
"sampling-factor",option+1) == 0)
1318 if (i == (ssize_t) argc)
1319 ThrowCompositeException(OptionError,
"MissingArgument",option);
1320 if (IsGeometry(argv[i]) == MagickFalse)
1321 ThrowCompositeInvalidArgumentException(option,argv[i]);
1324 if (LocaleCompare(
"scene",option+1) == 0)
1329 if (i == (ssize_t) argc)
1330 ThrowCompositeException(OptionError,
"MissingArgument",option);
1331 if (IsGeometry(argv[i]) == MagickFalse)
1332 ThrowCompositeInvalidArgumentException(option,argv[i]);
1335 if (LocaleCompare(
"seed",option+1) == 0)
1340 if (i == (ssize_t) argc)
1341 ThrowCompositeException(OptionError,
"MissingArgument",option);
1342 if (IsGeometry(argv[i]) == MagickFalse)
1343 ThrowCompositeInvalidArgumentException(option,argv[i]);
1346 if (LocaleCompare(
"sharpen",option+1) == 0)
1349 if (i == (ssize_t) argc)
1350 ThrowCompositeException(OptionError,
"MissingArgument",option);
1351 if (IsGeometry(argv[i]) == MagickFalse)
1352 ThrowCompositeInvalidArgumentException(option,argv[i]);
1355 if (LocaleCompare(
"shave",option+1) == 0)
1360 if (i == (ssize_t) argc)
1361 ThrowCompositeException(OptionError,
"MissingArgument",option);
1362 if (IsGeometry(argv[i]) == MagickFalse)
1363 ThrowCompositeInvalidArgumentException(option,argv[i]);
1366 if (LocaleCompare(
"size",option+1) == 0)
1371 if (i == (ssize_t) argc)
1372 ThrowCompositeException(OptionError,
"MissingArgument",option);
1373 if (IsGeometry(argv[i]) == MagickFalse)
1374 ThrowCompositeInvalidArgumentException(option,argv[i]);
1377 if (LocaleCompare(
"stegano",option+1) == 0)
1379 composite_options.stegano=0;
1383 if (i == (ssize_t) argc)
1384 ThrowCompositeException(OptionError,
"MissingArgument",option);
1385 if (IsGeometry(argv[i]) == MagickFalse)
1386 ThrowCompositeInvalidArgumentException(option,argv[i]);
1387 composite_options.stegano=(ssize_t) StringToLong(argv[i])+1;
1390 if (LocaleCompare(
"stereo",option+1) == 0)
1395 composite_options.stereo=MagickFalse;
1399 if (i == (ssize_t) argc)
1400 ThrowCompositeException(OptionError,
"MissingArgument",option);
1401 if (IsGeometry(argv[i]) == MagickFalse)
1402 ThrowCompositeInvalidArgumentException(option,argv[i]);
1403 flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset);
1404 if ((flags & YValue) == 0)
1405 composite_options.offset.y=composite_options.offset.x;
1406 composite_options.stereo=MagickTrue;
1409 if (LocaleCompare(
"strip",option+1) == 0)
1411 if (LocaleCompare(
"support",option+1) == 0)
1416 if (LocaleCompare(
"swap",option+1) == 0)
1421 if (i == (ssize_t) argc)
1422 ThrowCompositeException(OptionError,
"MissingArgument",option);
1423 if (IsGeometry(argv[i]) == MagickFalse)
1424 ThrowCompositeInvalidArgumentException(option,argv[i]);
1427 if (LocaleCompare(
"synchronize",option+1) == 0)
1429 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1433 if (LocaleCompare(
"taint",option+1) == 0)
1435 if (LocaleCompare(
"thumbnail",option+1) == 0)
1440 if (i == (ssize_t) argc)
1441 ThrowCompositeException(OptionError,
"MissingArgument",option);
1442 if (IsGeometry(argv[i]) == MagickFalse)
1443 ThrowCompositeInvalidArgumentException(option,argv[i]);
1446 if (LocaleCompare(
"tile",option+1) == 0)
1448 composite_options.tile=(*option ==
'-') ? MagickTrue : MagickFalse;
1449 (void) CopyMagickString(argv[i]+1,
"sans",MaxTextExtent);
1452 if (LocaleCompare(
"transform",option+1) == 0)
1454 if (LocaleCompare(
"transparent-color",option+1) == 0)
1459 if (i == (ssize_t) argc)
1460 ThrowCompositeException(OptionError,
"MissingArgument",option);
1463 if (LocaleCompare(
"treedepth",option+1) == 0)
1468 if (i == (ssize_t) argc)
1469 ThrowCompositeException(OptionError,
"MissingArgument",option);
1470 if (IsGeometry(argv[i]) == MagickFalse)
1471 ThrowCompositeInvalidArgumentException(option,argv[i]);
1474 if (LocaleCompare(
"type",option+1) == 0)
1482 if (i == (ssize_t) argc)
1483 ThrowCompositeException(OptionError,
"MissingArgument",option);
1484 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1486 ThrowCompositeException(OptionError,
"UnrecognizedImageType",
1490 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1494 if (LocaleCompare(
"units",option+1) == 0)
1502 if (i == (ssize_t) argc)
1503 ThrowCompositeException(OptionError,
"MissingArgument",option);
1504 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
1507 ThrowCompositeException(OptionError,
"UnrecognizedUnitsType",
1511 if (LocaleCompare(
"unsharp",option+1) == 0)
1513 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1517 if (i == (ssize_t) argc)
1518 ThrowCompositeException(OptionError,
"MissingArgument",option);
1519 if (IsGeometry(argv[i]) == MagickFalse)
1520 ThrowCompositeInvalidArgumentException(option,argv[i]);
1521 (void) CloneString(&composite_options.compose_args,argv[i]);
1522 composite_options.compose=ThresholdCompositeOp;
1525 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1529 if (LocaleCompare(
"verbose",option+1) == 0)
1531 if ((LocaleCompare(
"version",option+1) == 0) ||
1532 (LocaleCompare(
"-version",option+1) == 0))
1534 ListMagickVersion(stdout);
1537 if (LocaleCompare(
"virtual-pixel",option+1) == 0)
1545 if (i == (ssize_t) argc)
1546 ThrowCompositeException(OptionError,
"MissingArgument",option);
1547 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1550 ThrowCompositeException(OptionError,
1551 "UnrecognizedVirtualPixelMethod",argv[i]);
1554 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1558 if (LocaleCompare(
"watermark",option+1) == 0)
1560 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1564 if (i == (ssize_t) argc)
1565 ThrowCompositeException(OptionError,
"MissingArgument",option);
1566 if (IsGeometry(argv[i]) == MagickFalse)
1567 ThrowCompositeInvalidArgumentException(option,argv[i]);
1568 (void) CloneString(&composite_options.compose_args,argv[i]);
1569 composite_options.compose=ModulateCompositeOp;
1572 if (LocaleCompare(
"white-point",option+1) == 0)
1577 if (i == (ssize_t) argc)
1578 ThrowCompositeException(OptionError,
"MissingArgument",option);
1579 if (IsGeometry(argv[i]) == MagickFalse)
1580 ThrowCompositeInvalidArgumentException(option,argv[i]);
1583 if (LocaleCompare(
"write",option+1) == 0)
1586 if (i == (ssize_t) argc)
1587 ThrowCompositeException(OptionError,
"MissingArgument",option);
1590 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1595 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1597 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1598 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1599 if (fire != MagickFalse)
1600 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1603 ThrowCompositeException(OptionError,
"UnbalancedParenthesis",argv[i]);
1604 if (i-- != ((ssize_t) argc-1))
1605 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[i]);
1606 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1607 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1608 FinalizeImageSettings(image_info,image,MagickTrue);
1609 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1610 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1614 RemoveImageStack(composite_image);
1615 RemoveImageStack(images);
1616 (void) TransformImage(&composite_image,(
char *) NULL,
1617 composite_image->geometry);
1618 RemoveImageStack(mask_image);
1619 if (mask_image != (Image *) NULL)
1621 if ((composite_options.compose == DisplaceCompositeOp) ||
1622 (composite_options.compose == DistortCompositeOp))
1627 (void) CompositeImage(composite_image,CopyGreenCompositeOp,mask_image,
1629 mask_image=DestroyImage(mask_image);
1636 images->mask=mask_image;
1637 (void) NegateImage(images->mask,MagickFalse);
1640 status&=CompositeImageList(image_info,&images,composite_image,
1641 &composite_options,exception);
1642 composite_image=DestroyImage(composite_image);
1646 status&=WriteImages(image_info,images,argv[argc-1],exception);
1647 if (metadata != (
char **) NULL)
1652 text=InterpretImageProperties(image_info,images,format);
1653 InheritException(exception,&image->exception);
1654 if (text == (
char *) NULL)
1655 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
1657 (void) ConcatenateString(&(*metadata),text);
1658 text=DestroyString(text);
1660 images=DestroyImageList(images);
1661 RelinquishCompositeOptions(&composite_options);
1663 return(status != 0 ? MagickTrue : MagickFalse);