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"
112 static 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&=CompositeImage(*image,composite_image,
214 composite_options->compose,MagickTrue,x,y,exception);
224 SetGeometry(*image,&geometry);
225 (void) ParseAbsoluteGeometry(composite_options->geometry,
227 geometry.width=composite_image->columns;
228 geometry.height=composite_image->rows;
229 GravityAdjustGeometry((*image)->columns,(*image)->rows,
230 composite_options->gravity, &geometry);
231 (*image)->gravity=(GravityType) composite_options->gravity;
235 if (mask_image == (Image *) NULL)
236 status&=CompositeImage(*image,composite_image,
237 composite_options->compose,composite_options->clip_to_self,
238 geometry.x,geometry.y,exception);
244 clone_image=CloneImage(*image,0,0,MagickTrue,exception);
245 if (clone_image != (Image *) NULL)
247 status&=CompositeImage(*image,composite_image,
248 composite_options->compose,
249 composite_options->clip_to_self,geometry.x,geometry.y,
251 status&=CompositeImage(*image,mask_image,
252 CopyAlphaCompositeOp,MagickTrue,0,0,exception);
253 status&=CompositeImage(clone_image,*image,OverCompositeOp,
254 composite_options->clip_to_self,0,0,exception);
255 *image=DestroyImageList(*image);
260 (void) SetPixelChannelMask(composite_image,channel_mask);
262 return(status != 0 ? MagickTrue : MagickFalse);
265 static MagickBooleanType CompositeUsage(
void)
269 " -debug events display copious debugging information\n"
270 " -help print program options\n"
271 " -list type print a list of supported option arguments\n"
272 " -log format format of debugging information\n"
273 " -version print version information",
275 " -blend geometry blend images\n"
276 " -border geometry surround image with a border of color\n"
277 " -bordercolor color border color\n"
278 " -channel mask set the image channel mask\n"
279 " -colors value preferred number of colors in the image\n"
280 " -decipher filename convert cipher pixels to plain pixels\n"
281 " -displace geometry shift lookup according to a relative displacement map\n"
282 " -dissolve value dissolve the two images a given percent\n"
283 " -distort geometry shift lookup according to a absolute distortion map\n"
284 " -encipher filename convert plain pixels to cipher pixels\n"
285 " -extract geometry extract area from image\n"
286 " -geometry geometry location of the composite image\n"
287 " -identify identify the format and characteristics of the image\n"
288 " -monochrome transform image to black and white\n"
289 " -negate replace every pixel with its complementary color \n"
290 " -profile filename add ICM or IPTC information profile to image\n"
291 " -quantize colorspace reduce colors in this colorspace\n"
292 " -repage geometry size and location of an image canvas (operator)\n"
293 " -rotate degrees apply Paeth rotation to the image\n"
294 " -resize geometry resize the image\n"
295 " -sharpen geometry sharpen the image\n"
296 " -shave geometry shave pixels from the image edges\n"
297 " -stegano offset hide watermark within an image\n"
298 " -stereo geometry combine two image to create a stereo anaglyph\n"
299 " -strip strip image of all profiles and comments\n"
300 " -thumbnail geometry create a thumbnail of the image\n"
301 " -transform affine transform image\n"
302 " -type type image type\n"
303 " -unsharp geometry sharpen the image\n"
304 " -watermark geometry percent brightness and saturation of a watermark\n"
305 " -write filename write images to this file",
307 " -affine matrix affine transform matrix\n"
308 " -alpha option on, activate, off, deactivate, set, opaque, copy\n"
309 " transparent, extract, background, or shape\n"
310 " -authenticate password\n"
311 " decipher image with this password\n"
312 " -blue-primary point chromaticity blue primary point\n"
313 " -colorspace type alternate image colorspace\n"
314 " -comment string annotate image with comment\n"
315 " -compose operator composite operator\n"
316 " -compress type type of pixel compression when writing the image\n"
317 " -define format:option\n"
318 " define one or more image format options\n"
319 " -depth value image depth\n"
320 " -density geometry horizontal and vertical density of the image\n"
321 " -display server get image or font from this X server\n"
322 " -dispose method layer disposal method\n"
323 " -dither method apply error diffusion to image\n"
324 " -encoding type text encoding type\n"
325 " -endian type endianness (MSB or LSB) of the image\n"
326 " -filter type use this filter when resizing an image\n"
327 " -font name render text with this font\n"
328 " -format \"string\" output formatted image characteristics\n"
329 " -gravity type which direction to gravitate towards\n"
330 " -green-primary point chromaticity green primary point\n"
331 " -interlace type type of image interlacing scheme\n"
332 " -interpolate method pixel color interpolation method\n"
333 " -label string assign a label to an image\n"
334 " -limit type value pixel cache resource limit\n"
335 " -matte store matte channel if the image has one\n"
336 " -monitor monitor progress\n"
337 " -page geometry size and location of an image canvas (setting)\n"
338 " -pointsize value font point size\n"
339 " -quality value JPEG/MIFF/PNG compression level\n"
340 " -quiet suppress all warning messages\n"
341 " -red-primary point chromaticity red primary point\n"
342 " -regard-warnings pay attention to warning messages\n"
343 " -respect-parentheses settings remain in effect until parenthesis boundary\n"
344 " -sampling-factor geometry\n"
345 " horizontal and vertical sampling factor\n"
346 " -scene value image scene number\n"
347 " -seed value seed a new sequence of pseudo-random numbers\n"
348 " -size geometry width and height of image\n"
349 " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n"
350 " -synchronize synchronize image to storage device\n"
351 " -taint declare the image as modified\n"
352 " -transparent-color color\n"
353 " transparent color\n"
354 " -treedepth value color tree depth\n"
355 " -tile repeat composite operation across and down image\n"
356 " -units type the units of image resolution\n"
357 " -verbose print detailed information about the image\n"
358 " -virtual-pixel method\n"
359 " virtual pixel access method\n"
360 " -white-point point chromaticity white point",
362 " -swap indexes swap two images in the image sequence";
364 ListMagickVersion(stdout);
365 (void) printf(
"Usage: %s [options ...] image [options ...] composite\n"
366 " [ [options ...] mask ] [options ...] composite\n",
368 (void) printf(
"\nImage Settings:\n");
369 (void) puts(settings);
370 (void) printf(
"\nImage Operators:\n");
371 (void) puts(operators);
372 (void) printf(
"\nImage Stack Operators:\n");
373 (void) puts(stack_operators);
374 (void) printf(
"\nMiscellaneous Options:\n");
375 (void) puts(miscellaneous);
377 "\nBy default, the image format of 'file' is determined by its magic\n");
379 "number. To specify a particular image format, precede the filename\n");
381 "with an image format name and a colon (i.e. ps:image) or specify the\n");
383 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
384 (void) printf(
"'-' for standard input or output.\n");
388 static void GetCompositeOptions(
const ImageInfo *image_info,
392 (void) memset(composite_options,0,
sizeof(*composite_options));
393 composite_options->channel=DefaultChannels;
394 composite_options->compose=OverCompositeOp;
399 if (composite_options->compose_args != (
char *) NULL)
400 composite_options->compose_args=(
char *)
401 RelinquishMagickMemory(composite_options->compose_args);
402 if (composite_options->geometry != (
char *) NULL)
403 composite_options->geometry=(
char *)
404 RelinquishMagickMemory(composite_options->geometry);
407 WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info,
408 int argc,
char **argv,
char **metadata,ExceptionInfo *exception)
410 #define NotInitialized (unsigned int) (~0)
411 #define DestroyComposite() \
413 RelinquishCompositeOptions(&composite_options); \
414 DestroyImageStack(); \
415 for (i=0; i < (ssize_t) argc; i++) \
416 argv[i]=DestroyString(argv[i]); \
417 argv=(char **) RelinquishMagickMemory(argv); \
419 #define ThrowCompositeException(asperity,tag,option) \
421 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
422 option == (char *) NULL ? GetExceptionMessage(errno) : option); \
423 DestroyComposite(); \
424 return(MagickFalse); \
426 #define ThrowCompositeInvalidArgumentException(option,argument) \
428 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
429 "InvalidArgument","'%s': %s",option,argument); \
430 DestroyComposite(); \
431 return(MagickFalse); \
451 image_stack[MaxImageStackDepth+1];
471 assert(image_info != (ImageInfo *) NULL);
472 assert(image_info->signature == MagickCoreSignature);
473 assert(exception != (ExceptionInfo *) NULL);
474 if (IsEventLogging() != MagickFalse)
475 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
479 if ((LocaleCompare(
"version",option+1) == 0) ||
480 (LocaleCompare(
"-version",option+1) == 0))
482 ListMagickVersion(stdout);
487 return(CompositeUsage());
488 GetCompositeOptions(image_info,&composite_options);
489 filename=(
char *) NULL;
494 option=(
char *) NULL;
496 respect_parenthesis=MagickFalse;
501 composite_image=NewImageList();
502 image=NewImageList();
503 mask_image=NewImageList();
504 ReadCommandlLine(argc,&argv);
505 status=ExpandFilenames(&argc,&argv);
506 if (status == MagickFalse)
507 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
508 GetExceptionMessage(errno));
509 for (i=1; i < (ssize_t) (argc-1); i++)
512 if (LocaleCompare(option,
"(") == 0)
514 FireImageStack(MagickFalse,MagickTrue,pend);
515 if (k == MaxImageStackDepth)
516 ThrowCompositeException(OptionError,
"ParenthesisNestedTooDeeply",
521 if (LocaleCompare(option,
")") == 0)
523 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
525 ThrowCompositeException(OptionError,
"UnableToParseExpression",option);
529 if (IsCommandOption(option) == MagickFalse)
534 FireImageStack(MagickFalse,MagickFalse,pend);
536 if ((LocaleCompare(filename,
"--") == 0) && (i < (ssize_t) (argc-1)))
538 images=ReadImages(image_info,filename,exception);
539 status&=(images != (Image *) NULL) &&
540 (exception->severity < ErrorException);
541 if (images == (Image *) NULL)
543 AppendImageStack(images);
546 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
551 if (LocaleCompare(
"affine",option+1) == 0)
556 if (i == (ssize_t) argc)
557 ThrowCompositeException(OptionError,
"MissingArgument",option);
558 if (IsGeometry(argv[i]) == MagickFalse)
559 ThrowCompositeInvalidArgumentException(option,argv[i]);
562 if (LocaleCompare(
"alpha",option+1) == 0)
570 if (i == (ssize_t) argc)
571 ThrowCompositeException(OptionError,
"MissingArgument",option);
572 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,argv[i]);
574 ThrowCompositeException(OptionError,
575 "UnrecognizedAlphaChannelOption",argv[i]);
578 if (LocaleCompare(
"authenticate",option+1) == 0)
583 if (i == (ssize_t) argc)
584 ThrowCompositeException(OptionError,
"MissingArgument",option);
587 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
591 if (LocaleCompare(
"background",option+1) == 0)
596 if (i == (ssize_t) argc)
597 ThrowCompositeException(OptionError,
"MissingArgument",option);
600 if (LocaleCompare(
"blend",option+1) == 0)
602 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
606 if (i == (ssize_t) argc)
607 ThrowCompositeException(OptionError,
"MissingArgument",option);
608 if (IsGeometry(argv[i]) == MagickFalse)
609 ThrowCompositeInvalidArgumentException(option,argv[i]);
610 (void) CloneString(&composite_options.compose_args,argv[i]);
611 composite_options.compose=BlendCompositeOp;
614 if (LocaleCompare(
"blur",option+1) == 0)
616 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
620 if (i == (ssize_t) argc)
621 ThrowCompositeException(OptionError,
"MissingArgument",option);
622 if (IsGeometry(argv[i]) == MagickFalse)
623 ThrowCompositeInvalidArgumentException(option,argv[i]);
624 (void) CloneString(&composite_options.compose_args,argv[i]);
625 composite_options.compose=BlurCompositeOp;
628 if (LocaleCompare(
"blue-primary",option+1) == 0)
633 if (i == (ssize_t) argc)
634 ThrowCompositeException(OptionError,
"MissingArgument",option);
635 if (IsGeometry(argv[i]) == MagickFalse)
636 ThrowCompositeInvalidArgumentException(option,argv[i]);
639 if (LocaleCompare(
"border",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(
"bordercolor",option+1) == 0)
655 if (i == (ssize_t) argc)
656 ThrowCompositeException(OptionError,
"MissingArgument",option);
659 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
663 if (LocaleCompare(
"cache",option+1) == 0)
668 if (i == (ssize_t) argc)
669 ThrowCompositeException(OptionError,
"MissingArgument",option);
670 if (IsGeometry(argv[i]) == MagickFalse)
671 ThrowCompositeInvalidArgumentException(option,argv[i]);
674 if (LocaleCompare(
"channel",option+1) == 0)
681 composite_options.channel=DefaultChannels;
685 if (i == (ssize_t) argc)
686 ThrowCompositeException(OptionError,
"MissingArgument",option);
687 channel=ParseChannelOption(argv[i]);
689 ThrowCompositeException(OptionError,
"UnrecognizedChannelType",
691 composite_options.channel=(ChannelType) channel;
694 if (LocaleCompare(
"colors",option+1) == 0)
699 if (i == (ssize_t) argc)
700 ThrowCompositeException(OptionError,
"MissingArgument",option);
701 if (IsGeometry(argv[i]) == MagickFalse)
702 ThrowCompositeInvalidArgumentException(option,argv[i]);
705 if (LocaleCompare(
"colorspace",option+1) == 0)
713 if (i == (ssize_t) argc)
714 ThrowCompositeException(OptionError,
"MissingArgument",option);
715 colorspace=ParseCommandOption(MagickColorspaceOptions,
716 MagickFalse,argv[i]);
718 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
722 if (LocaleCompare(
"comment",option+1) == 0)
727 if (i == (ssize_t) argc)
728 ThrowCompositeException(OptionError,
"MissingArgument",option);
731 if (LocaleCompare(
"compose",option+1) == 0)
736 composite_options.compose=UndefinedCompositeOp;
740 if (i == (ssize_t) argc)
741 ThrowCompositeException(OptionError,
"MissingArgument",option);
742 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,
745 ThrowCompositeException(OptionError,
"UnrecognizedComposeOperator",
747 composite_options.compose=(CompositeOperator) compose;
750 if (LocaleCompare(
"compress",option+1) == 0)
758 if (i == (ssize_t) argc)
759 ThrowCompositeException(OptionError,
"MissingArgument",option);
760 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
763 ThrowCompositeException(OptionError,
764 "UnrecognizedImageCompression",argv[i]);
767 if (LocaleCompare(
"concurrent",option+1) == 0)
769 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
773 if (LocaleCompare(
"debug",option+1) == 0)
781 if (i == (ssize_t) argc)
782 ThrowCompositeException(OptionError,
"MissingArgument",option);
783 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
785 ThrowCompositeException(OptionError,
"UnrecognizedEventType",
787 (void) SetLogEventMask(argv[i]);
790 if (LocaleCompare(
"decipher",option+1) == 0)
795 if (i == (ssize_t) argc)
796 ThrowCompositeException(OptionError,
"MissingArgument",option);
799 if (LocaleCompare(
"define",option+1) == 0)
802 if (i == (ssize_t) argc)
803 ThrowCompositeException(OptionError,
"MissingArgument",option);
809 define=GetImageOption(image_info,argv[i]);
810 if (define == (
const char *) NULL)
811 ThrowCompositeException(OptionError,
"NoSuchOption",argv[i]);
816 if (LocaleCompare(
"density",option+1) == 0)
821 if (i == (ssize_t) argc)
822 ThrowCompositeException(OptionError,
"MissingArgument",option);
823 if (IsGeometry(argv[i]) == MagickFalse)
824 ThrowCompositeInvalidArgumentException(option,argv[i]);
827 if (LocaleCompare(
"depth",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(
"displace",option+1) == 0)
840 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
844 if (i == (ssize_t) argc)
845 ThrowCompositeException(OptionError,
"MissingArgument",option);
846 if (IsGeometry(argv[i]) == MagickFalse)
847 ThrowCompositeInvalidArgumentException(option,argv[i]);
848 (void) CloneString(&composite_options.compose_args,argv[i]);
849 composite_options.compose=DisplaceCompositeOp;
852 if (LocaleCompare(
"display",option+1) == 0)
857 if (i == (ssize_t) argc)
858 ThrowCompositeException(OptionError,
"MissingArgument",option);
861 if (LocaleCompare(
"dispose",option+1) == 0)
869 if (i == (ssize_t) argc)
870 ThrowCompositeException(OptionError,
"MissingArgument",option);
871 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
873 ThrowCompositeException(OptionError,
"UnrecognizedDisposeMethod",
877 if (LocaleCompare(
"dissolve",option+1) == 0)
879 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
883 if (i == (ssize_t) argc)
884 ThrowCompositeException(OptionError,
"MissingArgument",option);
885 if (IsGeometry(argv[i]) == MagickFalse)
886 ThrowCompositeInvalidArgumentException(option,argv[i]);
887 (void) CloneString(&composite_options.compose_args,argv[i]);
888 composite_options.compose=DissolveCompositeOp;
891 if (LocaleCompare(
"distort",option+1) == 0)
893 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
897 if (i == (ssize_t) argc)
898 ThrowCompositeException(OptionError,
"MissingArgument",option);
899 if (IsGeometry(argv[i]) == MagickFalse)
900 ThrowCompositeInvalidArgumentException(option,argv[i]);
901 (void) CloneString(&composite_options.compose_args,argv[i]);
902 composite_options.compose=DistortCompositeOp;
905 if (LocaleCompare(
"dither",option+1) == 0)
913 if (i == (ssize_t) argc)
914 ThrowCompositeException(OptionError,
"MissingArgument",option);
915 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
917 ThrowCompositeException(OptionError,
"UnrecognizedDitherMethod",
921 if (LocaleCompare(
"duration",option+1) == 0)
926 if (i == (ssize_t) argc)
927 ThrowCompositeException(OptionError,
"MissingArgument",option);
928 if (IsGeometry(argv[i]) == MagickFalse)
929 ThrowCompositeInvalidArgumentException(option,argv[i]);
932 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
936 if (LocaleCompare(
"encipher",option+1) == 0)
941 if (i == (ssize_t) argc)
942 ThrowCompositeException(OptionError,
"MissingArgument",option);
945 if (LocaleCompare(
"encoding",option+1) == 0)
950 if (i == (ssize_t) argc)
951 ThrowCompositeException(OptionError,
"MissingArgument",option);
954 if (LocaleCompare(
"endian",option+1) == 0)
962 if (i == (ssize_t) argc)
963 ThrowCompositeException(OptionError,
"MissingArgument",option);
964 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
967 ThrowCompositeException(OptionError,
"UnrecognizedEndianType",
971 if (LocaleCompare(
"extract",option+1) == 0)
976 if (i == (ssize_t) argc)
977 ThrowCompositeException(OptionError,
"MissingArgument",option);
978 if (IsGeometry(argv[i]) == MagickFalse)
979 ThrowCompositeInvalidArgumentException(option,argv[i]);
982 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
986 if (LocaleCompare(
"filter",option+1) == 0)
994 if (i == (ssize_t) argc)
995 ThrowCompositeException(OptionError,
"MissingArgument",option);
996 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
998 ThrowCompositeException(OptionError,
"UnrecognizedImageFilter",
1002 if (LocaleCompare(
"font",option+1) == 0)
1007 if (i == (ssize_t) argc)
1008 ThrowCompositeException(OptionError,
"MissingArgument",option);
1011 if (LocaleCompare(
"format",option+1) == 0)
1016 if (i == (ssize_t) argc)
1017 ThrowCompositeException(OptionError,
"MissingArgument",option);
1021 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1025 if (LocaleCompare(
"geometry",option+1) == 0)
1027 (void) CloneString(&composite_options.geometry,(
char *) NULL);
1031 if (i == (ssize_t) argc)
1032 ThrowCompositeException(OptionError,
"MissingArgument",option);
1033 if (IsGeometry(argv[i]) == MagickFalse)
1034 ThrowCompositeInvalidArgumentException(option,argv[i]);
1035 (void) CloneString(&composite_options.geometry,argv[i]);
1038 if (LocaleCompare(
"gravity",option+1) == 0)
1043 composite_options.gravity=UndefinedGravity;
1047 if (i == (ssize_t) argc)
1048 ThrowCompositeException(OptionError,
"MissingArgument",option);
1049 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1052 ThrowCompositeException(OptionError,
"UnrecognizedGravityType",
1054 composite_options.gravity=(GravityType) gravity;
1057 if (LocaleCompare(
"green-primary",option+1) == 0)
1062 if (i == (ssize_t) argc)
1063 ThrowCompositeException(OptionError,
"MissingArgument",option);
1064 if (IsGeometry(argv[i]) == MagickFalse)
1065 ThrowCompositeInvalidArgumentException(option,argv[i]);
1068 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1072 if ((LocaleCompare(
"help",option+1) == 0) ||
1073 (LocaleCompare(
"-help",option+1) == 0))
1076 return(CompositeUsage());
1078 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1082 if (LocaleCompare(
"identify",option+1) == 0)
1084 if (LocaleCompare(
"interlace",option+1) == 0)
1092 if (i == (ssize_t) argc)
1093 ThrowCompositeException(OptionError,
"MissingArgument",option);
1094 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1097 ThrowCompositeException(OptionError,
1098 "UnrecognizedInterlaceType",argv[i]);
1101 if (LocaleCompare(
"interpolate",option+1) == 0)
1109 if (i == (ssize_t) argc)
1110 ThrowCompositeException(OptionError,
"MissingArgument",option);
1111 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1113 if (interpolate < 0)
1114 ThrowCompositeException(OptionError,
1115 "UnrecognizedInterpolateMethod",argv[i]);
1118 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1122 if (LocaleCompare(
"label",option+1) == 0)
1127 if (i == (ssize_t) argc)
1128 ThrowCompositeException(OptionError,
"MissingArgument",option);
1131 if (LocaleCompare(
"limit",option+1) == 0)
1145 if (i == (ssize_t) argc)
1146 ThrowCompositeException(OptionError,
"MissingArgument",option);
1147 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1150 ThrowCompositeException(OptionError,
"UnrecognizedResourceType",
1153 if (i == (ssize_t) argc)
1154 ThrowCompositeException(OptionError,
"MissingArgument",option);
1155 value=StringToDouble(argv[i],&p);
1157 if ((p == argv[i]) && (LocaleCompare(
"unlimited",argv[i]) != 0))
1158 ThrowCompositeInvalidArgumentException(option,argv[i]);
1161 if (LocaleCompare(
"list",option+1) == 0)
1169 if (i == (ssize_t) argc)
1170 ThrowCompositeException(OptionError,
"MissingArgument",option);
1171 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1173 ThrowCompositeException(OptionError,
"UnrecognizedListType",
1175 status=MogrifyImageInfo(image_info,(
int) (i-j+1),(
const char **)
1178 return(status == 0 ? MagickFalse : MagickTrue);
1180 if (LocaleCompare(
"log",option+1) == 0)
1185 if ((i == (ssize_t) argc) || (strchr(argv[i],
'%') == (
char *) NULL))
1186 ThrowCompositeException(OptionError,
"MissingArgument",option);
1189 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1193 if (LocaleCompare(
"matte",option+1) == 0)
1195 if (LocaleCompare(
"monitor",option+1) == 0)
1197 if (LocaleCompare(
"monochrome",option+1) == 0)
1199 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1203 if (LocaleCompare(
"negate",option+1) == 0)
1205 if (LocaleCompare(
"noop",option+1) == 0)
1207 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1211 if (LocaleCompare(
"page",option+1) == 0)
1216 if (i == (ssize_t) argc)
1217 ThrowCompositeException(OptionError,
"MissingArgument",option);
1220 if (LocaleCompare(
"pointsize",option+1) == 0)
1225 if (i == (ssize_t) argc)
1226 ThrowCompositeException(OptionError,
"MissingArgument",option);
1227 if (IsGeometry(argv[i]) == MagickFalse)
1228 ThrowCompositeInvalidArgumentException(option,argv[i]);
1231 if (LocaleCompare(
"process",option+1) == 0)
1236 if (i == (ssize_t) argc)
1237 ThrowCompositeException(OptionError,
"MissingArgument",option);
1240 if (LocaleCompare(
"profile",option+1) == 0)
1243 if (i == (ssize_t) argc)
1244 ThrowCompositeException(OptionError,
"MissingArgument",option);
1247 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1251 if (LocaleCompare(
"quality",option+1) == 0)
1256 if (i == (ssize_t) argc)
1257 ThrowCompositeException(OptionError,
"MissingArgument",option);
1258 if (IsGeometry(argv[i]) == MagickFalse)
1259 ThrowCompositeInvalidArgumentException(option,argv[i]);
1262 if (LocaleCompare(
"quantize",option+1) == 0)
1270 if (i == (ssize_t) argc)
1271 ThrowCompositeException(OptionError,
"MissingArgument",option);
1272 colorspace=ParseCommandOption(MagickColorspaceOptions,
1273 MagickFalse,argv[i]);
1275 ThrowCompositeException(OptionError,
"UnrecognizedColorspace",
1279 if (LocaleCompare(
"quiet",option+1) == 0)
1281 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1285 if (LocaleCompare(
"red-primary",option+1) == 0)
1290 if (i == (ssize_t) argc)
1291 ThrowCompositeException(OptionError,
"MissingArgument",option);
1292 if (IsGeometry(argv[i]) == MagickFalse)
1293 ThrowCompositeInvalidArgumentException(option,argv[i]);
1296 if (LocaleCompare(
"regard-warnings",option+1) == 0)
1298 if (LocaleCompare(
"render",option+1) == 0)
1300 if (LocaleCompare(
"repage",option+1) == 0)
1305 if (i == (ssize_t) argc)
1306 ThrowCompositeException(OptionError,
"MissingArgument",option);
1307 if (IsGeometry(argv[i]) == MagickFalse)
1308 ThrowCompositeInvalidArgumentException(option,argv[i]);
1311 if (LocaleNCompare(
"respect-parentheses",option+1,17) == 0)
1313 respect_parenthesis=(*option ==
'-') ? MagickTrue : MagickFalse;
1316 if (LocaleCompare(
"resize",option+1) == 0)
1321 if (i == (ssize_t) argc)
1322 ThrowCompositeException(OptionError,
"MissingArgument",option);
1323 if (IsGeometry(argv[i]) == MagickFalse)
1324 ThrowCompositeInvalidArgumentException(option,argv[i]);
1327 if (LocaleCompare(
"rotate",option+1) == 0)
1330 if (i == (ssize_t) argc)
1331 ThrowCompositeException(OptionError,
"MissingArgument",option);
1332 if (IsGeometry(argv[i]) == MagickFalse)
1333 ThrowCompositeInvalidArgumentException(option,argv[i]);
1336 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1340 if (LocaleCompare(
"sampling-factor",option+1) == 0)
1345 if (i == (ssize_t) argc)
1346 ThrowCompositeException(OptionError,
"MissingArgument",option);
1347 if (IsGeometry(argv[i]) == MagickFalse)
1348 ThrowCompositeInvalidArgumentException(option,argv[i]);
1351 if (LocaleCompare(
"scene",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(
"seed",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(
"sharpen",option+1) == 0)
1376 if (i == (ssize_t) argc)
1377 ThrowCompositeException(OptionError,
"MissingArgument",option);
1378 if (IsGeometry(argv[i]) == MagickFalse)
1379 ThrowCompositeInvalidArgumentException(option,argv[i]);
1382 if (LocaleCompare(
"shave",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(
"size",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(
"stegano",option+1) == 0)
1406 composite_options.stegano=0;
1410 if (i == (ssize_t) argc)
1411 ThrowCompositeException(OptionError,
"MissingArgument",option);
1412 if (IsGeometry(argv[i]) == MagickFalse)
1413 ThrowCompositeInvalidArgumentException(option,argv[i]);
1414 composite_options.stegano=(ssize_t) StringToLong(argv[i])+1;
1417 if (LocaleCompare(
"stereo",option+1) == 0)
1422 composite_options.stereo=MagickFalse;
1426 if (i == (ssize_t) argc)
1427 ThrowCompositeException(OptionError,
"MissingArgument",option);
1428 if (IsGeometry(argv[i]) == MagickFalse)
1429 ThrowCompositeInvalidArgumentException(option,argv[i]);
1430 flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset);
1431 if ((flags & YValue) == 0)
1432 composite_options.offset.y=composite_options.offset.x;
1433 composite_options.stereo=MagickTrue;
1436 if (LocaleCompare(
"strip",option+1) == 0)
1438 if (LocaleCompare(
"support",option+1) == 0)
1443 if (LocaleCompare(
"swap",option+1) == 0)
1448 if (i == (ssize_t) argc)
1449 ThrowCompositeException(OptionError,
"MissingArgument",option);
1450 if (IsGeometry(argv[i]) == MagickFalse)
1451 ThrowCompositeInvalidArgumentException(option,argv[i]);
1454 if (LocaleCompare(
"synchronize",option+1) == 0)
1456 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1460 if (LocaleCompare(
"taint",option+1) == 0)
1462 if (LocaleCompare(
"thumbnail",option+1) == 0)
1467 if (i == (ssize_t) argc)
1468 ThrowCompositeException(OptionError,
"MissingArgument",option);
1469 if (IsGeometry(argv[i]) == MagickFalse)
1470 ThrowCompositeInvalidArgumentException(option,argv[i]);
1473 if (LocaleCompare(
"tile",option+1) == 0)
1475 composite_options.tile=(*option ==
'-') ? MagickTrue : MagickFalse;
1476 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1479 if (LocaleCompare(
"transform",option+1) == 0)
1481 if (LocaleCompare(
"transparent-color",option+1) == 0)
1486 if (i == (ssize_t) argc)
1487 ThrowCompositeException(OptionError,
"MissingArgument",option);
1490 if (LocaleCompare(
"treedepth",option+1) == 0)
1495 if (i == (ssize_t) argc)
1496 ThrowCompositeException(OptionError,
"MissingArgument",option);
1497 if (IsGeometry(argv[i]) == MagickFalse)
1498 ThrowCompositeInvalidArgumentException(option,argv[i]);
1501 if (LocaleCompare(
"type",option+1) == 0)
1509 if (i == (ssize_t) argc)
1510 ThrowCompositeException(OptionError,
"MissingArgument",option);
1511 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1513 ThrowCompositeException(OptionError,
"UnrecognizedImageType",
1517 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1521 if (LocaleCompare(
"units",option+1) == 0)
1529 if (i == (ssize_t) argc)
1530 ThrowCompositeException(OptionError,
"MissingArgument",option);
1531 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
1534 ThrowCompositeException(OptionError,
"UnrecognizedUnitsType",
1538 if (LocaleCompare(
"unsharp",option+1) == 0)
1540 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1544 if (i == (ssize_t) argc)
1545 ThrowCompositeException(OptionError,
"MissingArgument",option);
1546 if (IsGeometry(argv[i]) == MagickFalse)
1547 ThrowCompositeInvalidArgumentException(option,argv[i]);
1548 (void) CloneString(&composite_options.compose_args,argv[i]);
1549 composite_options.compose=ThresholdCompositeOp;
1552 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1556 if (LocaleCompare(
"verbose",option+1) == 0)
1558 if ((LocaleCompare(
"version",option+1) == 0) ||
1559 (LocaleCompare(
"-version",option+1) == 0))
1561 ListMagickVersion(stdout);
1564 if (LocaleCompare(
"virtual-pixel",option+1) == 0)
1572 if (i == (ssize_t) argc)
1573 ThrowCompositeException(OptionError,
"MissingArgument",option);
1574 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1577 ThrowCompositeException(OptionError,
1578 "UnrecognizedVirtualPixelMethod",argv[i]);
1581 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1585 if (LocaleCompare(
"watermark",option+1) == 0)
1587 (void) CloneString(&composite_options.compose_args,(
char *) NULL);
1591 if (i == (ssize_t) argc)
1592 ThrowCompositeException(OptionError,
"MissingArgument",option);
1593 if (IsGeometry(argv[i]) == MagickFalse)
1594 ThrowCompositeInvalidArgumentException(option,argv[i]);
1595 (void) CloneString(&composite_options.compose_args,argv[i]);
1596 composite_options.compose=ModulateCompositeOp;
1599 if (LocaleCompare(
"white-point",option+1) == 0)
1604 if (i == (ssize_t) argc)
1605 ThrowCompositeException(OptionError,
"MissingArgument",option);
1606 if (IsGeometry(argv[i]) == MagickFalse)
1607 ThrowCompositeInvalidArgumentException(option,argv[i]);
1610 if (LocaleCompare(
"write",option+1) == 0)
1613 if (i == (ssize_t) argc)
1614 ThrowCompositeException(OptionError,
"MissingArgument",option);
1617 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1622 ThrowCompositeException(OptionError,
"UnrecognizedOption",option)
1624 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1625 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1626 if (fire != MagickFalse)
1627 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1630 ThrowCompositeException(OptionError,
"UnbalancedParenthesis",argv[i]);
1631 if (i-- != (ssize_t) (argc-1))
1632 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[i]);
1633 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1634 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1635 FinalizeImageSettings(image_info,image,MagickTrue);
1636 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1637 ThrowCompositeException(OptionError,
"MissingAnImageFilename",argv[argc-1]);
1641 RemoveImageStack(composite_image);
1642 RemoveImageStack(images);
1643 if (composite_image->geometry != (
char *) NULL)
1648 (void) ParseRegionGeometry(composite_image,composite_image->geometry,
1649 &resize_geometry,exception);
1650 if ((composite_image->columns != resize_geometry.width) ||
1651 (composite_image->rows != resize_geometry.height))
1656 resize_image=ResizeImage(composite_image,resize_geometry.width,
1657 resize_geometry.height,composite_image->filter,exception);
1658 if (resize_image != (Image *) NULL)
1660 composite_image=DestroyImage(composite_image);
1661 composite_image=resize_image;
1665 RemoveImageStack(mask_image);
1666 status&=CompositeImageList(image_info,&images,composite_image,mask_image,
1667 &composite_options,exception);
1668 composite_image=DestroyImage(composite_image);
1672 status&=WriteImages(image_info,images,argv[argc-1],exception);
1673 if (metadata != (
char **) NULL)
1678 text=InterpretImageProperties(image_info,images,format,exception);
1679 if (text == (
char *) NULL)
1680 ThrowCompositeException(ResourceLimitError,
"MemoryAllocationFailed",
1681 GetExceptionMessage(errno));
1682 (void) ConcatenateString(&(*metadata),text);
1683 text=DestroyString(text);
1685 images=DestroyImageList(images);
1686 RelinquishCompositeOptions(&composite_options);
1688 return(status != 0 ? MagickTrue : MagickFalse);