blob: aa6bb9786df3344456259247d75887488eb4ee21 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% CCCC OOO M M PPPP OOO SSSSS IIIII TTTTT EEEEE %
7% C O O MM MM P P O O SS I T E %
8% C O O M M M PPPP O O SSS I T EEE %
9% C O O M M P O O SS I T E %
10% CCCC OOO M M P OOO SSSSS IIIII T EEEEE %
11% %
12% %
13% MagickWand Image Composite Methods %
14% %
15% Software Design %
cristyde984cd2013-12-01 14:49:27 +000016% Cristy %
cristy3ed852e2009-09-05 21:47:34 +000017% July 1992 %
18% %
19% %
cristyb56bb242014-11-25 17:12:48 +000020% Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% dedicated to making software imaging solutions freely available. %
22% %
23% You may not use this file except in compliance with the License. You may %
24% obtain a copy of the License at %
25% %
26% http://www.imagemagick.org/script/license.php %
27% %
28% Unless required by applicable law or agreed to in writing, software %
29% distributed under the License is distributed on an "AS IS" BASIS, %
30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31% See the License for the specific language governing permissions and %
32% limitations under the License. %
33% %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36% Use the composite program to overlap one image over another.
37%
38*/
39
40/*
41 Include declarations.
42*/
cristy4c08aed2011-07-01 19:47:50 +000043#include "MagickWand/studio.h"
44#include "MagickWand/MagickWand.h"
45#include "MagickWand/mogrify-private.h"
46#include "MagickCore/string-private.h"
cristy3ed852e2009-09-05 21:47:34 +000047
48/*
49 Typedef declarations.
50*/
51typedef struct _CompositeOptions
52{
cristyab015852011-07-06 01:03:32 +000053 ChannelType
54 channel;
55
cristy3ed852e2009-09-05 21:47:34 +000056 char
57 *compose_args,
58 *geometry;
59
60 CompositeOperator
61 compose;
62
63 GravityType
64 gravity;
65
cristybb503372010-05-27 20:51:26 +000066 ssize_t
cristy3ed852e2009-09-05 21:47:34 +000067 stegano;
68
69 RectangleInfo
70 offset;
71
72 MagickBooleanType
73 stereo,
74 tile;
75} CompositeOptions;
76
77/*
78%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79% %
80% %
81% %
82% C o m p o s i t e I m a g e C o m m a n d %
83% %
84% %
85% %
86%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
87%
88% CompositeImageCommand() reads one or more images and an optional mask and
89% composites them into a new image.
90%
91% The format of the CompositeImageCommand method is:
92%
93% MagickBooleanType CompositeImageCommand(ImageInfo *image_info,int argc,
94% char **argv,char **metadata,ExceptionInfo *exception)
95%
96% A description of each parameter follows:
97%
98% o image_info: the image info.
99%
100% o argc: the number of elements in the argument vector.
101%
102% o argv: A text array containing the command line arguments.
103%
104% o metadata: any metadata is returned here.
105%
106% o exception: return any errors or warnings in this structure.
107%
108*/
109
110static MagickBooleanType CompositeImageList(ImageInfo *image_info,Image **image,
111 Image *composite_image,CompositeOptions *composite_options,
112 ExceptionInfo *exception)
113{
114 MagickStatusType
115 status;
116
117 assert(image_info != (ImageInfo *) NULL);
118 assert(image_info->signature == MagickSignature);
119 assert(image != (Image **) NULL);
120 assert((*image)->signature == MagickSignature);
121 if ((*image)->debug != MagickFalse)
122 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
123 assert(exception != (ExceptionInfo *) NULL);
124 status=MagickTrue;
125 if (composite_image != (Image *) NULL)
126 {
cristyf2a82ee2014-05-26 17:49:54 +0000127 ChannelType
128 channel_mask;
129
130 channel_mask=SetImageChannelMask(composite_image,
131 composite_options->channel);
cristy3ed852e2009-09-05 21:47:34 +0000132 assert(composite_image->signature == MagickSignature);
cristybd5a96c2011-08-21 00:04:26 +0000133 switch (composite_options->compose)
134 {
135 case BlendCompositeOp:
136 case BlurCompositeOp:
137 case DisplaceCompositeOp:
138 case DistortCompositeOp:
139 case DissolveCompositeOp:
140 case ModulateCompositeOp:
141 case ThresholdCompositeOp:
142 (void) SetImageArtifact(composite_image,"compose:args",
143 composite_options->compose_args);
144 break;
145 default:
146 break;
147 }
cristy3ed852e2009-09-05 21:47:34 +0000148 /*
149 Composite image.
150 */
151 if (composite_options->stegano != 0)
152 {
153 Image
154 *stegano_image;
155
156 (*image)->offset=composite_options->stegano-1;
157 stegano_image=SteganoImage(*image,composite_image,exception);
158 if (stegano_image != (Image *) NULL)
159 {
160 *image=DestroyImageList(*image);
161 *image=stegano_image;
162 }
163 }
164 else
165 if (composite_options->stereo != MagickFalse)
166 {
167 Image
168 *stereo_image;
169
170 stereo_image=StereoAnaglyphImage(*image,composite_image,
171 composite_options->offset.x,composite_options->offset.y,
172 exception);
173 if (stereo_image != (Image *) NULL)
174 {
175 *image=DestroyImageList(*image);
176 *image=stereo_image;
177 }
178 }
179 else
180 if (composite_options->tile != MagickFalse)
181 {
cristy9d314ff2011-03-09 01:30:28 +0000182 size_t
183 columns;
184
cristybb503372010-05-27 20:51:26 +0000185 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000186 x,
187 y;
188
cristy3ed852e2009-09-05 21:47:34 +0000189 /*
190 Tile the composite image.
191 */
192 (void) SetImageArtifact(composite_image,"compose:outside-overlay",
193 "false");
194 columns=composite_image->columns;
cristyeaedf062010-05-29 22:36:02 +0000195 for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows)
196 for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns)
cristyfeb3e962012-03-29 17:25:55 +0000197 status&=CompositeImage(*image,composite_image,
cristy39172402012-03-30 13:04:39 +0000198 composite_options->compose,MagickTrue,x,y,exception);
cristy3ed852e2009-09-05 21:47:34 +0000199 }
200 else
201 {
202 RectangleInfo
203 geometry;
204
205 /*
206 Work out gravity Adjustment of Offset
207 */
208 SetGeometry(*image,&geometry);
209 (void) ParseAbsoluteGeometry(composite_options->geometry,
210 &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;
216 /*
217 Digitally composite image.
218 */
cristyfeb3e962012-03-29 17:25:55 +0000219 status&=CompositeImage(*image,composite_image,
cristy39172402012-03-30 13:04:39 +0000220 composite_options->compose,MagickTrue,geometry.x,geometry.y,
cristyfeb3e962012-03-29 17:25:55 +0000221 exception);
cristy3ed852e2009-09-05 21:47:34 +0000222 }
cristyf2a82ee2014-05-26 17:49:54 +0000223 (void) SetPixelChannelMask(composite_image,channel_mask);
cristy3ed852e2009-09-05 21:47:34 +0000224 }
225 return(status != 0 ? MagickTrue : MagickFalse);
226}
227
228static MagickBooleanType CompositeUsage(void)
229{
230 const char
231 **p;
232
233 static const char
234 *miscellaneous[]=
235 {
236 "-debug events display copious debugging information",
237 "-help print program options",
238 "-list type print a list of supported option arguments",
239 "-log format format of debugging information",
240 "-version print version information",
241 (char *) NULL
242 },
243 *operators[]=
244 {
245 "-blend geometry blend images",
246 "-border geometry surround image with a border of color",
247 "-bordercolor color border color",
cristy17ada022014-11-07 22:12:23 +0000248 "-channel mask set the image channel mask",
cristy3ed852e2009-09-05 21:47:34 +0000249 "-colors value preferred number of colors in the image",
250 "-decipher filename convert cipher pixels to plain pixels",
251 "-displace geometry shift lookup according to a relative displacement map",
252 "-dissolve value dissolve the two images a given percent",
253 "-distort geometry shift lookup according to a absolute distortion map",
254 "-encipher filename convert plain pixels to cipher pixels",
255 "-extract geometry extract area from image",
256 "-geometry geometry location of the composite image",
257 "-identify identify the format and characteristics of the image",
258 "-monochrome transform image to black and white",
259 "-negate replace every pixel with its complementary color ",
260 "-profile filename add ICM or IPTC information profile to image",
261 "-quantize colorspace reduce colors in this colorspace",
262 "-repage geometry size and location of an image canvas (operator)",
263 "-rotate degrees apply Paeth rotation to the image",
264 "-resize geometry resize the image",
265 "-sharpen geometry sharpen the image",
266 "-shave geometry shave pixels from the image edges",
267 "-stegano offset hide watermark within an image",
268 "-stereo geometry combine two image to create a stereo anaglyph",
269 "-strip strip image of all profiles and comments",
270 "-thumbnail geometry create a thumbnail of the image",
271 "-transform affine transform image",
272 "-type type image type",
273 "-unsharp geometry sharpen the image",
274 "-watermark geometry percent brightness and saturation of a watermark",
275 "-write filename write images to this file",
276 (char *) NULL
277 },
278 *settings[]=
279 {
280 "-affine matrix affine transform matrix",
281 "-alpha option on, activate, off, deactivate, set, opaque, copy",
282 " transparent, extract, background, or shape",
283 "-authenticate password",
284 " decipher image with this password",
285 "-blue-primary point chromaticity blue primary point",
cristy3ed852e2009-09-05 21:47:34 +0000286 "-colorspace type alternate image colorspace",
287 "-comment string annotate image with comment",
288 "-compose operator composite operator",
289 "-compress type type of pixel compression when writing the image",
290 "-define format:option",
291 " define one or more image format options",
292 "-depth value image depth",
293 "-density geometry horizontal and vertical density of the image",
294 "-display server get image or font from this X server",
295 "-dispose method layer disposal method",
296 "-dither method apply error diffusion to image",
297 "-encoding type text encoding type",
298 "-endian type endianness (MSB or LSB) of the image",
299 "-filter type use this filter when resizing an image",
300 "-font name render text with this font",
301 "-format \"string\" output formatted image characteristics",
302 "-gravity type which direction to gravitate towards",
303 "-green-primary point chromaticity green primary point",
304 "-interlace type type of image interlacing scheme",
305 "-interpolate method pixel color interpolation method",
306 "-label string assign a label to an image",
307 "-limit type value pixel cache resource limit",
cristye9252c22013-07-30 15:43:21 +0000308 "-matte store matte channel if the image has one",
cristy3ed852e2009-09-05 21:47:34 +0000309 "-monitor monitor progress",
310 "-page geometry size and location of an image canvas (setting)",
311 "-pointsize value font point size",
312 "-quality value JPEG/MIFF/PNG compression level",
313 "-quiet suppress all warning messages",
314 "-red-primary point chromaticity red primary point",
315 "-regard-warnings pay attention to warning messages",
316 "-respect-parentheses settings remain in effect until parenthesis boundary",
317 "-sampling-factor geometry",
318 " horizontal and vertical sampling factor",
319 "-scene value image scene number",
320 "-seed value seed a new sequence of pseudo-random numbers",
321 "-size geometry width and height of image",
cristye9252c22013-07-30 15:43:21 +0000322 "-support factor resize support: > 1.0 is blurry, < 1.0 is sharp",
cristyd9a29192010-10-16 16:49:53 +0000323 "-synchronize synchronize image to storage device",
324 "-taint declare the image as modified",
cristy3ed852e2009-09-05 21:47:34 +0000325 "-transparent-color color",
326 " transparent color",
327 "-treedepth value color tree depth",
328 "-tile repeat composite operation across and down image",
329 "-units type the units of image resolution",
330 "-verbose print detailed information about the image",
331 "-virtual-pixel method",
332 " virtual pixel access method",
333 "-white-point point chromaticity white point",
334 (char *) NULL
335 },
336 *stack_operators[]=
337 {
338 "-swap indexes swap two images in the image sequence",
339 (char *) NULL
340 };
341
342
cristy4f7a6132012-12-23 00:35:19 +0000343 ListMagickVersion(stdout);
cristy3ed852e2009-09-05 21:47:34 +0000344 (void) printf("Usage: %s [options ...] image [options ...] composite\n"
345 " [ [options ...] mask ] [options ...] composite\n",
346 GetClientName());
347 (void) printf("\nImage Settings:\n");
348 for (p=settings; *p != (char *) NULL; p++)
349 (void) printf(" %s\n",*p);
350 (void) printf("\nImage Operators:\n");
351 for (p=operators; *p != (char *) NULL; p++)
352 (void) printf(" %s\n",*p);
353 (void) printf("\nImage Stack Operators:\n");
354 for (p=stack_operators; *p != (char *) NULL; p++)
355 (void) printf(" %s\n",*p);
356 (void) printf("\nMiscellaneous Options:\n");
357 for (p=miscellaneous; *p != (char *) NULL; p++)
358 (void) printf(" %s\n",*p);
359 (void) printf(
anthonye5b39652012-04-21 05:37:29 +0000360 "\nBy default, the image format of 'file' is determined by its magic\n");
cristy3ed852e2009-09-05 21:47:34 +0000361 (void) printf(
362 "number. To specify a particular image format, precede the filename\n");
363 (void) printf(
364 "with an image format name and a colon (i.e. ps:image) or specify the\n");
365 (void) printf(
366 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
367 (void) printf("'-' for standard input or output.\n");
368 return(MagickFalse);
369}
370
371static void GetCompositeOptions(CompositeOptions *composite_options)
372{
373 (void) ResetMagickMemory(composite_options,0,sizeof(*composite_options));
cristyab015852011-07-06 01:03:32 +0000374 composite_options->channel=DefaultChannels;
cristy3ed852e2009-09-05 21:47:34 +0000375 composite_options->compose=OverCompositeOp;
376}
377
378static void RelinquishCompositeOptions(CompositeOptions *composite_options)
379{
380 if (composite_options->compose_args != (char *) NULL)
381 composite_options->compose_args=(char *)
382 RelinquishMagickMemory(composite_options->compose_args);
383}
384
385WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info,
386 int argc,char **argv,char **metadata,ExceptionInfo *exception)
387{
388#define NotInitialized (unsigned int) (~0)
389#define DestroyComposite() \
390{ \
391 RelinquishCompositeOptions(&composite_options); \
392 DestroyImageStack(); \
cristybb503372010-05-27 20:51:26 +0000393 for (i=0; i < (ssize_t) argc; i++) \
cristy3ed852e2009-09-05 21:47:34 +0000394 argv[i]=DestroyString(argv[i]); \
395 argv=(char **) RelinquishMagickMemory(argv); \
396}
397#define ThrowCompositeException(asperity,tag,option) \
398{ \
cristyefe601c2013-01-05 17:51:12 +0000399 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
cristy3ed852e2009-09-05 21:47:34 +0000400 option == (char *) NULL ? GetExceptionMessage(errno) : option); \
401 DestroyComposite(); \
402 return(MagickFalse); \
403}
404#define ThrowCompositeInvalidArgumentException(option,argument) \
405{ \
406 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
anthonye5b39652012-04-21 05:37:29 +0000407 "InvalidArgument","'%s': %s",option,argument); \
cristy3ed852e2009-09-05 21:47:34 +0000408 DestroyComposite(); \
409 return(MagickFalse); \
410}
411
412 char
413 *filename,
414 *option;
415
416 CompositeOptions
417 composite_options;
418
419 const char
420 *format;
421
422 Image
423 *composite_image,
424 *image,
425 *images,
426 *mask_image;
427
428 ImageStack
429 image_stack[MaxImageStackDepth+1];
430
431 MagickBooleanType
432 fire,
cristyebbcfea2011-02-25 02:43:54 +0000433 pend,
434 respect_parenthesis;
cristy3ed852e2009-09-05 21:47:34 +0000435
436 MagickStatusType
437 status;
438
cristy9d314ff2011-03-09 01:30:28 +0000439 register ssize_t
440 i;
441
cristybb503372010-05-27 20:51:26 +0000442 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000443 j,
444 k;
445
cristy3ed852e2009-09-05 21:47:34 +0000446 /*
447 Set default.
448 */
449 assert(image_info != (ImageInfo *) NULL);
450 assert(image_info->signature == MagickSignature);
451 if (image_info->debug != MagickFalse)
452 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
453 assert(exception != (ExceptionInfo *) NULL);
454 if (argc == 2)
455 {
456 option=argv[1];
457 if ((LocaleCompare("version",option+1) == 0) ||
458 (LocaleCompare("-version",option+1) == 0))
459 {
cristy4f7a6132012-12-23 00:35:19 +0000460 ListMagickVersion(stdout);
cristy3ed852e2009-09-05 21:47:34 +0000461 return(MagickFalse);
462 }
463 }
464 if (argc < 4)
cristy13e61a12010-02-04 20:19:00 +0000465 return(CompositeUsage());
cristy3ed852e2009-09-05 21:47:34 +0000466 GetCompositeOptions(&composite_options);
467 filename=(char *) NULL;
468 format="%w,%h,%m";
469 j=1;
470 k=0;
471 NewImageStack();
472 option=(char *) NULL;
473 pend=MagickFalse;
cristyebbcfea2011-02-25 02:43:54 +0000474 respect_parenthesis=MagickFalse;
cristy3ed852e2009-09-05 21:47:34 +0000475 status=MagickTrue;
476 /*
477 Check command syntax.
478 */
479 composite_image=NewImageList();
480 image=NewImageList();
481 mask_image=NewImageList();
482 ReadCommandlLine(argc,&argv);
483 status=ExpandFilenames(&argc,&argv);
484 if (status == MagickFalse)
485 ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed",
486 GetExceptionMessage(errno));
cristybb503372010-05-27 20:51:26 +0000487 for (i=1; i < (ssize_t) (argc-1); i++)
cristy3ed852e2009-09-05 21:47:34 +0000488 {
489 option=argv[i];
490 if (LocaleCompare(option,"(") == 0)
491 {
492 FireImageStack(MagickFalse,MagickTrue,pend);
493 if (k == MaxImageStackDepth)
494 ThrowCompositeException(OptionError,"ParenthesisNestedTooDeeply",
495 option);
496 PushImageStack();
497 continue;
498 }
499 if (LocaleCompare(option,")") == 0)
500 {
501 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
502 if (k == 0)
503 ThrowCompositeException(OptionError,"UnableToParseExpression",option);
504 PopImageStack();
505 continue;
506 }
cristy042ee782011-04-22 18:48:30 +0000507 if (IsCommandOption(option) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +0000508 {
509 Image
510 *images;
511
512 /*
513 Read input image.
514 */
515 FireImageStack(MagickFalse,MagickFalse,pend);
516 filename=argv[i];
cristycee97112010-05-28 00:44:52 +0000517 if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
cristy3ed852e2009-09-05 21:47:34 +0000518 filename=argv[++i];
cristy1b58f252012-03-01 01:41:41 +0000519 images=ReadImages(image_info,filename,exception);
cristy3ed852e2009-09-05 21:47:34 +0000520 status&=(images != (Image *) NULL) &&
521 (exception->severity < ErrorException);
522 if (images == (Image *) NULL)
523 continue;
524 AppendImageStack(images);
525 continue;
526 }
527 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
528 switch (*(option+1))
529 {
530 case 'a':
531 {
532 if (LocaleCompare("affine",option+1) == 0)
533 {
534 if (*option == '+')
535 break;
536 i++;
cristybb503372010-05-27 20:51:26 +0000537 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000538 ThrowCompositeException(OptionError,"MissingArgument",option);
539 if (IsGeometry(argv[i]) == MagickFalse)
540 ThrowCompositeInvalidArgumentException(option,argv[i]);
541 break;
542 }
543 if (LocaleCompare("alpha",option+1) == 0)
544 {
cristybb503372010-05-27 20:51:26 +0000545 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000546 type;
547
548 if (*option == '+')
549 break;
550 i++;
cristybb503372010-05-27 20:51:26 +0000551 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000552 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy288a3532012-08-28 00:19:44 +0000553 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000554 if (type < 0)
555 ThrowCompositeException(OptionError,
cristyb15b06c2012-08-28 11:36:48 +0000556 "UnrecognizedAlphaChannelOption",argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000557 break;
558 }
559 if (LocaleCompare("authenticate",option+1) == 0)
560 {
561 if (*option == '+')
562 break;
563 i++;
cristybb503372010-05-27 20:51:26 +0000564 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000565 ThrowCompositeException(OptionError,"MissingArgument",option);
566 break;
567 }
568 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
569 }
570 case 'b':
571 {
572 if (LocaleCompare("background",option+1) == 0)
573 {
574 if (*option == '+')
575 break;
576 i++;
cristybb503372010-05-27 20:51:26 +0000577 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000578 ThrowCompositeException(OptionError,"MissingArgument",option);
579 break;
580 }
581 if (LocaleCompare("blend",option+1) == 0)
582 {
583 (void) CloneString(&composite_options.compose_args,(char *) NULL);
584 if (*option == '+')
585 break;
586 i++;
cristybb503372010-05-27 20:51:26 +0000587 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000588 ThrowCompositeException(OptionError,"MissingArgument",option);
589 if (IsGeometry(argv[i]) == MagickFalse)
590 ThrowCompositeInvalidArgumentException(option,argv[i]);
591 (void) CloneString(&composite_options.compose_args,argv[i]);
592 composite_options.compose=BlendCompositeOp;
593 break;
594 }
595 if (LocaleCompare("blur",option+1) == 0)
596 {
597 (void) CloneString(&composite_options.compose_args,(char *) NULL);
598 if (*option == '+')
599 break;
600 i++;
cristybb503372010-05-27 20:51:26 +0000601 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000602 ThrowCompositeException(OptionError,"MissingArgument",option);
603 if (IsGeometry(argv[i]) == MagickFalse)
604 ThrowCompositeInvalidArgumentException(option,argv[i]);
605 (void) CloneString(&composite_options.compose_args,argv[i]);
606 composite_options.compose=BlurCompositeOp;
607 break;
608 }
609 if (LocaleCompare("blue-primary",option+1) == 0)
610 {
611 if (*option == '+')
612 break;
613 i++;
cristybb503372010-05-27 20:51:26 +0000614 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000615 ThrowCompositeException(OptionError,"MissingArgument",option);
616 if (IsGeometry(argv[i]) == MagickFalse)
617 ThrowCompositeInvalidArgumentException(option,argv[i]);
618 break;
619 }
620 if (LocaleCompare("border",option+1) == 0)
621 {
622 if (*option == '+')
623 break;
624 i++;
cristye81f5522014-05-07 01:25:59 +0000625 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000626 ThrowCompositeException(OptionError,"MissingArgument",option);
627 if (IsGeometry(argv[i]) == MagickFalse)
628 ThrowCompositeInvalidArgumentException(option,argv[i]);
629 break;
630 }
631 if (LocaleCompare("bordercolor",option+1) == 0)
632 {
633 if (*option == '+')
634 break;
635 i++;
cristye81f5522014-05-07 01:25:59 +0000636 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000637 ThrowCompositeException(OptionError,"MissingArgument",option);
638 break;
639 }
640 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
641 }
642 case 'c':
643 {
644 if (LocaleCompare("cache",option+1) == 0)
645 {
646 if (*option == '+')
647 break;
648 i++;
cristybb503372010-05-27 20:51:26 +0000649 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000650 ThrowCompositeException(OptionError,"MissingArgument",option);
651 if (IsGeometry(argv[i]) == MagickFalse)
652 ThrowCompositeInvalidArgumentException(option,argv[i]);
653 break;
654 }
655 if (LocaleCompare("channel",option+1) == 0)
656 {
cristybb503372010-05-27 20:51:26 +0000657 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000658 channel;
659
660 if (*option == '+')
661 {
cristyab015852011-07-06 01:03:32 +0000662 composite_options.channel=DefaultChannels;
cristy3ed852e2009-09-05 21:47:34 +0000663 break;
664 }
665 i++;
cristye81f5522014-05-07 01:25:59 +0000666 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000667 ThrowCompositeException(OptionError,"MissingArgument",option);
668 channel=ParseChannelOption(argv[i]);
669 if (channel < 0)
670 ThrowCompositeException(OptionError,"UnrecognizedChannelType",
671 argv[i]);
cristyab015852011-07-06 01:03:32 +0000672 composite_options.channel=(ChannelType) channel;
cristy3ed852e2009-09-05 21:47:34 +0000673 break;
674 }
675 if (LocaleCompare("colors",option+1) == 0)
676 {
677 if (*option == '+')
678 break;
679 i++;
cristybb503372010-05-27 20:51:26 +0000680 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000681 ThrowCompositeException(OptionError,"MissingArgument",option);
682 if (IsGeometry(argv[i]) == MagickFalse)
683 ThrowCompositeInvalidArgumentException(option,argv[i]);
684 break;
685 }
686 if (LocaleCompare("colorspace",option+1) == 0)
687 {
cristybb503372010-05-27 20:51:26 +0000688 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000689 colorspace;
690
691 if (*option == '+')
692 break;
693 i++;
cristybb503372010-05-27 20:51:26 +0000694 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000695 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000696 colorspace=ParseCommandOption(MagickColorspaceOptions,
cristy3ed852e2009-09-05 21:47:34 +0000697 MagickFalse,argv[i]);
698 if (colorspace < 0)
699 ThrowCompositeException(OptionError,"UnrecognizedColorspace",
700 argv[i]);
701 break;
702 }
703 if (LocaleCompare("comment",option+1) == 0)
704 {
705 if (*option == '+')
706 break;
707 i++;
cristybb503372010-05-27 20:51:26 +0000708 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000709 ThrowCompositeException(OptionError,"MissingArgument",option);
710 break;
711 }
712 if (LocaleCompare("compose",option+1) == 0)
713 {
cristybb503372010-05-27 20:51:26 +0000714 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000715 compose;
716
717 composite_options.compose=UndefinedCompositeOp;
718 if (*option == '+')
719 break;
720 i++;
cristybb503372010-05-27 20:51:26 +0000721 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000722 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000723 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +0000724 argv[i]);
725 if (compose < 0)
726 ThrowCompositeException(OptionError,"UnrecognizedComposeOperator",
727 argv[i]);
728 composite_options.compose=(CompositeOperator) compose;
729 break;
730 }
731 if (LocaleCompare("compress",option+1) == 0)
732 {
cristybb503372010-05-27 20:51:26 +0000733 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000734 compress;
735
736 if (*option == '+')
737 break;
738 i++;
cristybb503372010-05-27 20:51:26 +0000739 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000740 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000741 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +0000742 argv[i]);
743 if (compress < 0)
744 ThrowCompositeException(OptionError,
745 "UnrecognizedImageCompression",argv[i]);
746 break;
747 }
cristy22879752009-10-25 23:55:40 +0000748 if (LocaleCompare("concurrent",option+1) == 0)
749 break;
cristy3ed852e2009-09-05 21:47:34 +0000750 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
751 }
752 case 'd':
753 {
754 if (LocaleCompare("debug",option+1) == 0)
755 {
cristybb503372010-05-27 20:51:26 +0000756 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000757 event;
758
759 if (*option == '+')
760 break;
761 i++;
cristybb503372010-05-27 20:51:26 +0000762 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000763 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000764 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000765 if (event < 0)
766 ThrowCompositeException(OptionError,"UnrecognizedEventType",
767 argv[i]);
768 (void) SetLogEventMask(argv[i]);
769 break;
770 }
771 if (LocaleCompare("decipher",option+1) == 0)
772 {
773 if (*option == '+')
774 break;
775 i++;
cristye81f5522014-05-07 01:25:59 +0000776 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000777 ThrowCompositeException(OptionError,"MissingArgument",option);
778 break;
779 }
780 if (LocaleCompare("define",option+1) == 0)
781 {
782 i++;
cristybb503372010-05-27 20:51:26 +0000783 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000784 ThrowCompositeException(OptionError,"MissingArgument",option);
785 if (*option == '+')
786 {
787 const char
788 *define;
789
790 define=GetImageOption(image_info,argv[i]);
791 if (define == (const char *) NULL)
792 ThrowCompositeException(OptionError,"NoSuchOption",argv[i]);
793 break;
794 }
795 break;
796 }
797 if (LocaleCompare("density",option+1) == 0)
798 {
799 if (*option == '+')
800 break;
801 i++;
cristybb503372010-05-27 20:51:26 +0000802 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000803 ThrowCompositeException(OptionError,"MissingArgument",option);
804 if (IsGeometry(argv[i]) == MagickFalse)
805 ThrowCompositeInvalidArgumentException(option,argv[i]);
806 break;
807 }
808 if (LocaleCompare("depth",option+1) == 0)
809 {
810 if (*option == '+')
811 break;
812 i++;
cristybb503372010-05-27 20:51:26 +0000813 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000814 ThrowCompositeException(OptionError,"MissingArgument",option);
815 if (IsGeometry(argv[i]) == MagickFalse)
816 ThrowCompositeInvalidArgumentException(option,argv[i]);
817 break;
818 }
819 if (LocaleCompare("displace",option+1) == 0)
820 {
821 (void) CloneString(&composite_options.compose_args,(char *) NULL);
822 if (*option == '+')
823 break;
824 i++;
cristybb503372010-05-27 20:51:26 +0000825 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000826 ThrowCompositeException(OptionError,"MissingArgument",option);
827 if (IsGeometry(argv[i]) == MagickFalse)
828 ThrowCompositeInvalidArgumentException(option,argv[i]);
829 (void) CloneString(&composite_options.compose_args,argv[i]);
830 composite_options.compose=DisplaceCompositeOp;
831 break;
832 }
833 if (LocaleCompare("display",option+1) == 0)
834 {
835 if (*option == '+')
836 break;
837 i++;
cristybb503372010-05-27 20:51:26 +0000838 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000839 ThrowCompositeException(OptionError,"MissingArgument",option);
840 break;
841 }
842 if (LocaleCompare("dispose",option+1) == 0)
843 {
cristybb503372010-05-27 20:51:26 +0000844 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000845 dispose;
846
847 if (*option == '+')
848 break;
849 i++;
cristybb503372010-05-27 20:51:26 +0000850 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000851 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000852 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000853 if (dispose < 0)
854 ThrowCompositeException(OptionError,"UnrecognizedDisposeMethod",
855 argv[i]);
856 break;
857 }
858 if (LocaleCompare("dissolve",option+1) == 0)
859 {
860 (void) CloneString(&composite_options.compose_args,(char *) NULL);
861 if (*option == '+')
862 break;
863 i++;
cristybb503372010-05-27 20:51:26 +0000864 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000865 ThrowCompositeException(OptionError,"MissingArgument",option);
866 if (IsGeometry(argv[i]) == MagickFalse)
867 ThrowCompositeInvalidArgumentException(option,argv[i]);
868 (void) CloneString(&composite_options.compose_args,argv[i]);
869 composite_options.compose=DissolveCompositeOp;
870 break;
871 }
872 if (LocaleCompare("distort",option+1) == 0)
873 {
874 (void) CloneString(&composite_options.compose_args,(char *) NULL);
875 if (*option == '+')
876 break;
877 i++;
cristybb503372010-05-27 20:51:26 +0000878 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000879 ThrowCompositeException(OptionError,"MissingArgument",option);
880 if (IsGeometry(argv[i]) == MagickFalse)
881 ThrowCompositeInvalidArgumentException(option,argv[i]);
882 (void) CloneString(&composite_options.compose_args,argv[i]);
883 composite_options.compose=DistortCompositeOp;
884 break;
885 }
cristy22879752009-10-25 23:55:40 +0000886 if (LocaleCompare("dither",option+1) == 0)
cristy3ed852e2009-09-05 21:47:34 +0000887 {
cristybb503372010-05-27 20:51:26 +0000888 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000889 method;
890
891 if (*option == '+')
892 break;
893 i++;
cristybb503372010-05-27 20:51:26 +0000894 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000895 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000896 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000897 if (method < 0)
898 ThrowCompositeException(OptionError,"UnrecognizedDitherMethod",
899 argv[i]);
900 break;
901 }
cristy22879752009-10-25 23:55:40 +0000902 if (LocaleCompare("duration",option+1) == 0)
903 {
904 if (*option == '+')
905 break;
906 i++;
cristye81f5522014-05-07 01:25:59 +0000907 if (i == (ssize_t) argc)
cristy22879752009-10-25 23:55:40 +0000908 ThrowCompositeException(OptionError,"MissingArgument",option);
909 if (IsGeometry(argv[i]) == MagickFalse)
910 ThrowCompositeInvalidArgumentException(option,argv[i]);
911 break;
912 }
cristy3ed852e2009-09-05 21:47:34 +0000913 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
914 }
915 case 'e':
916 {
917 if (LocaleCompare("encipher",option+1) == 0)
918 {
919 if (*option == '+')
920 break;
921 i++;
cristye81f5522014-05-07 01:25:59 +0000922 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000923 ThrowCompositeException(OptionError,"MissingArgument",option);
924 break;
925 }
926 if (LocaleCompare("encoding",option+1) == 0)
927 {
928 if (*option == '+')
929 break;
930 i++;
cristybb503372010-05-27 20:51:26 +0000931 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000932 ThrowCompositeException(OptionError,"MissingArgument",option);
933 break;
934 }
935 if (LocaleCompare("endian",option+1) == 0)
936 {
cristybb503372010-05-27 20:51:26 +0000937 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000938 endian;
939
940 if (*option == '+')
941 break;
942 i++;
cristybb503372010-05-27 20:51:26 +0000943 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000944 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000945 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +0000946 argv[i]);
947 if (endian < 0)
948 ThrowCompositeException(OptionError,"UnrecognizedEndianType",
949 argv[i]);
950 break;
951 }
952 if (LocaleCompare("extract",option+1) == 0)
953 {
954 if (*option == '+')
955 break;
956 i++;
cristybb503372010-05-27 20:51:26 +0000957 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000958 ThrowCompositeException(OptionError,"MissingArgument",option);
959 if (IsGeometry(argv[i]) == MagickFalse)
960 ThrowCompositeInvalidArgumentException(option,argv[i]);
961 break;
962 }
963 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
964 }
965 case 'f':
966 {
967 if (LocaleCompare("filter",option+1) == 0)
968 {
cristybb503372010-05-27 20:51:26 +0000969 ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000970 filter;
971
972 if (*option == '+')
973 break;
974 i++;
cristybb503372010-05-27 20:51:26 +0000975 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000976 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +0000977 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +0000978 if (filter < 0)
979 ThrowCompositeException(OptionError,"UnrecognizedImageFilter",
980 argv[i]);
981 break;
982 }
983 if (LocaleCompare("font",option+1) == 0)
984 {
985 if (*option == '+')
986 break;
987 i++;
cristybb503372010-05-27 20:51:26 +0000988 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000989 ThrowCompositeException(OptionError,"MissingArgument",option);
990 break;
991 }
992 if (LocaleCompare("format",option+1) == 0)
993 {
994 if (*option == '+')
995 break;
996 i++;
cristybb503372010-05-27 20:51:26 +0000997 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000998 ThrowCompositeException(OptionError,"MissingArgument",option);
999 format=argv[i];
1000 break;
1001 }
1002 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1003 }
1004 case 'g':
1005 {
1006 if (LocaleCompare("geometry",option+1) == 0)
1007 {
1008 (void) CloneString(&composite_options.geometry,(char *) NULL);
1009 if (*option == '+')
1010 break;
1011 i++;
cristybb503372010-05-27 20:51:26 +00001012 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001013 ThrowCompositeException(OptionError,"MissingArgument",option);
1014 if (IsGeometry(argv[i]) == MagickFalse)
1015 ThrowCompositeInvalidArgumentException(option,argv[i]);
1016 (void) CloneString(&composite_options.geometry,argv[i]);
1017 break;
1018 }
1019 if (LocaleCompare("gravity",option+1) == 0)
1020 {
cristybb503372010-05-27 20:51:26 +00001021 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001022 gravity;
1023
1024 composite_options.gravity=UndefinedGravity;
1025 if (*option == '+')
1026 break;
1027 i++;
cristybb503372010-05-27 20:51:26 +00001028 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001029 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001030 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001031 argv[i]);
1032 if (gravity < 0)
1033 ThrowCompositeException(OptionError,"UnrecognizedGravityType",
1034 argv[i]);
1035 composite_options.gravity=(GravityType) gravity;
1036 break;
1037 }
1038 if (LocaleCompare("green-primary",option+1) == 0)
1039 {
1040 if (*option == '+')
1041 break;
1042 i++;
cristybb503372010-05-27 20:51:26 +00001043 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001044 ThrowCompositeException(OptionError,"MissingArgument",option);
1045 if (IsGeometry(argv[i]) == MagickFalse)
1046 ThrowCompositeInvalidArgumentException(option,argv[i]);
1047 break;
1048 }
1049 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1050 }
1051 case 'h':
1052 {
1053 if ((LocaleCompare("help",option+1) == 0) ||
1054 (LocaleCompare("-help",option+1) == 0))
1055 return(CompositeUsage());
1056 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1057 }
1058 case 'i':
1059 {
1060 if (LocaleCompare("identify",option+1) == 0)
1061 break;
1062 if (LocaleCompare("interlace",option+1) == 0)
1063 {
cristybb503372010-05-27 20:51:26 +00001064 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001065 interlace;
1066
1067 if (*option == '+')
1068 break;
1069 i++;
cristybb503372010-05-27 20:51:26 +00001070 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001071 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001072 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001073 argv[i]);
1074 if (interlace < 0)
1075 ThrowCompositeException(OptionError,
1076 "UnrecognizedInterlaceType",argv[i]);
1077 break;
1078 }
1079 if (LocaleCompare("interpolate",option+1) == 0)
1080 {
cristybb503372010-05-27 20:51:26 +00001081 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001082 interpolate;
1083
1084 if (*option == '+')
1085 break;
1086 i++;
cristybb503372010-05-27 20:51:26 +00001087 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001088 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001089 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001090 argv[i]);
1091 if (interpolate < 0)
1092 ThrowCompositeException(OptionError,
1093 "UnrecognizedInterpolateMethod",argv[i]);
1094 break;
1095 }
1096 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1097 }
1098 case 'l':
1099 {
1100 if (LocaleCompare("label",option+1) == 0)
1101 {
1102 if (*option == '+')
1103 break;
1104 i++;
cristybb503372010-05-27 20:51:26 +00001105 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001106 ThrowCompositeException(OptionError,"MissingArgument",option);
1107 break;
1108 }
1109 if (LocaleCompare("limit",option+1) == 0)
1110 {
1111 char
1112 *p;
1113
1114 double
1115 value;
1116
cristybb503372010-05-27 20:51:26 +00001117 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001118 resource;
1119
1120 if (*option == '+')
1121 break;
1122 i++;
cristybb503372010-05-27 20:51:26 +00001123 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001124 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001125 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001126 argv[i]);
1127 if (resource < 0)
1128 ThrowCompositeException(OptionError,"UnrecognizedResourceType",
1129 argv[i]);
1130 i++;
cristybb503372010-05-27 20:51:26 +00001131 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001132 ThrowCompositeException(OptionError,"MissingArgument",option);
cristydbdd0e32011-11-04 23:29:40 +00001133 value=StringToDouble(argv[i],&p);
cristyda16f162011-02-19 23:52:17 +00001134 (void) value;
cristy3ed852e2009-09-05 21:47:34 +00001135 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
1136 ThrowCompositeInvalidArgumentException(option,argv[i]);
1137 break;
1138 }
1139 if (LocaleCompare("list",option+1) == 0)
1140 {
cristybb503372010-05-27 20:51:26 +00001141 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001142 list;
1143
1144 if (*option == '+')
1145 break;
1146 i++;
cristybb503372010-05-27 20:51:26 +00001147 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001148 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001149 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00001150 if (list < 0)
1151 ThrowCompositeException(OptionError,"UnrecognizedListType",
1152 argv[i]);
cristyaeb2cbc2010-05-07 13:28:58 +00001153 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
cristy3ed852e2009-09-05 21:47:34 +00001154 argv+j,exception);
1155 DestroyComposite();
cristy32ce2392014-09-24 19:08:53 +00001156 return(status == 0 ? MagickTrue : MagickFalse);
cristy3ed852e2009-09-05 21:47:34 +00001157 }
1158 if (LocaleCompare("log",option+1) == 0)
1159 {
1160 if (*option == '+')
1161 break;
1162 i++;
cristybb503372010-05-27 20:51:26 +00001163 if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
cristy3ed852e2009-09-05 21:47:34 +00001164 ThrowCompositeException(OptionError,"MissingArgument",option);
1165 break;
1166 }
1167 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1168 }
1169 case 'm':
1170 {
1171 if (LocaleCompare("matte",option+1) == 0)
1172 break;
1173 if (LocaleCompare("monitor",option+1) == 0)
1174 break;
1175 if (LocaleCompare("monochrome",option+1) == 0)
1176 break;
1177 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1178 }
1179 case 'n':
1180 {
1181 if (LocaleCompare("negate",option+1) == 0)
1182 break;
1183 if (LocaleCompare("noop",option+1) == 0)
1184 break;
1185 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1186 }
1187 case 'p':
1188 {
1189 if (LocaleCompare("page",option+1) == 0)
1190 {
1191 if (*option == '+')
1192 break;
1193 i++;
cristybb503372010-05-27 20:51:26 +00001194 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001195 ThrowCompositeException(OptionError,"MissingArgument",option);
1196 break;
1197 }
1198 if (LocaleCompare("pointsize",option+1) == 0)
1199 {
1200 if (*option == '+')
1201 break;
1202 i++;
cristye81f5522014-05-07 01:25:59 +00001203 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001204 ThrowCompositeException(OptionError,"MissingArgument",option);
1205 if (IsGeometry(argv[i]) == MagickFalse)
1206 ThrowCompositeInvalidArgumentException(option,argv[i]);
1207 break;
1208 }
1209 if (LocaleCompare("process",option+1) == 0)
1210 {
1211 if (*option == '+')
1212 break;
1213 i++;
cristybb503372010-05-27 20:51:26 +00001214 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001215 ThrowCompositeException(OptionError,"MissingArgument",option);
1216 break;
1217 }
1218 if (LocaleCompare("profile",option+1) == 0)
1219 {
1220 i++;
cristybb503372010-05-27 20:51:26 +00001221 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001222 ThrowCompositeException(OptionError,"MissingArgument",option);
1223 break;
1224 }
1225 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1226 }
1227 case 'q':
1228 {
1229 if (LocaleCompare("quality",option+1) == 0)
1230 {
1231 if (*option == '+')
1232 break;
1233 i++;
cristybb503372010-05-27 20:51:26 +00001234 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001235 ThrowCompositeException(OptionError,"MissingArgument",option);
1236 if (IsGeometry(argv[i]) == MagickFalse)
1237 ThrowCompositeInvalidArgumentException(option,argv[i]);
1238 break;
1239 }
1240 if (LocaleCompare("quantize",option+1) == 0)
1241 {
cristybb503372010-05-27 20:51:26 +00001242 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001243 colorspace;
1244
1245 if (*option == '+')
1246 break;
1247 i++;
cristye81f5522014-05-07 01:25:59 +00001248 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001249 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001250 colorspace=ParseCommandOption(MagickColorspaceOptions,
cristy3ed852e2009-09-05 21:47:34 +00001251 MagickFalse,argv[i]);
1252 if (colorspace < 0)
1253 ThrowCompositeException(OptionError,"UnrecognizedColorspace",
1254 argv[i]);
1255 break;
1256 }
1257 if (LocaleCompare("quiet",option+1) == 0)
1258 break;
1259 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1260 }
1261 case 'r':
1262 {
1263 if (LocaleCompare("red-primary",option+1) == 0)
1264 {
1265 if (*option == '+')
1266 break;
1267 i++;
cristybb503372010-05-27 20:51:26 +00001268 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001269 ThrowCompositeException(OptionError,"MissingArgument",option);
1270 if (IsGeometry(argv[i]) == MagickFalse)
1271 ThrowCompositeInvalidArgumentException(option,argv[i]);
1272 break;
1273 }
1274 if (LocaleCompare("regard-warnings",option+1) == 0)
1275 break;
1276 if (LocaleCompare("render",option+1) == 0)
1277 break;
1278 if (LocaleCompare("repage",option+1) == 0)
1279 {
1280 if (*option == '+')
1281 break;
1282 i++;
cristybb503372010-05-27 20:51:26 +00001283 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001284 ThrowCompositeException(OptionError,"MissingArgument",option);
1285 if (IsGeometry(argv[i]) == MagickFalse)
1286 ThrowCompositeInvalidArgumentException(option,argv[i]);
1287 break;
1288 }
1289 if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1290 {
1291 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1292 break;
1293 }
1294 if (LocaleCompare("resize",option+1) == 0)
1295 {
1296 if (*option == '+')
1297 break;
1298 i++;
cristybb503372010-05-27 20:51:26 +00001299 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001300 ThrowCompositeException(OptionError,"MissingArgument",option);
1301 if (IsGeometry(argv[i]) == MagickFalse)
1302 ThrowCompositeInvalidArgumentException(option,argv[i]);
1303 break;
1304 }
1305 if (LocaleCompare("rotate",option+1) == 0)
1306 {
1307 i++;
cristybb503372010-05-27 20:51:26 +00001308 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001309 ThrowCompositeException(OptionError,"MissingArgument",option);
1310 if (IsGeometry(argv[i]) == MagickFalse)
1311 ThrowCompositeInvalidArgumentException(option,argv[i]);
1312 break;
1313 }
1314 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1315 }
1316 case 's':
1317 {
1318 if (LocaleCompare("sampling-factor",option+1) == 0)
1319 {
1320 if (*option == '+')
1321 break;
1322 i++;
cristybb503372010-05-27 20:51:26 +00001323 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001324 ThrowCompositeException(OptionError,"MissingArgument",option);
1325 if (IsGeometry(argv[i]) == MagickFalse)
1326 ThrowCompositeInvalidArgumentException(option,argv[i]);
1327 break;
1328 }
1329 if (LocaleCompare("scene",option+1) == 0)
1330 {
1331 if (*option == '+')
1332 break;
1333 i++;
cristybb503372010-05-27 20:51:26 +00001334 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001335 ThrowCompositeException(OptionError,"MissingArgument",option);
1336 if (IsGeometry(argv[i]) == MagickFalse)
1337 ThrowCompositeInvalidArgumentException(option,argv[i]);
1338 break;
1339 }
1340 if (LocaleCompare("seed",option+1) == 0)
1341 {
1342 if (*option == '+')
1343 break;
1344 i++;
cristye81f5522014-05-07 01:25:59 +00001345 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001346 ThrowCompositeException(OptionError,"MissingArgument",option);
1347 if (IsGeometry(argv[i]) == MagickFalse)
1348 ThrowCompositeInvalidArgumentException(option,argv[i]);
1349 break;
1350 }
1351 if (LocaleCompare("sharpen",option+1) == 0)
1352 {
1353 i++;
cristybb503372010-05-27 20:51:26 +00001354 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001355 ThrowCompositeException(OptionError,"MissingArgument",option);
1356 if (IsGeometry(argv[i]) == MagickFalse)
1357 ThrowCompositeInvalidArgumentException(option,argv[i]);
1358 break;
1359 }
1360 if (LocaleCompare("shave",option+1) == 0)
1361 {
1362 if (*option == '+')
1363 break;
1364 i++;
cristye81f5522014-05-07 01:25:59 +00001365 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001366 ThrowCompositeException(OptionError,"MissingArgument",option);
1367 if (IsGeometry(argv[i]) == MagickFalse)
1368 ThrowCompositeInvalidArgumentException(option,argv[i]);
1369 break;
1370 }
1371 if (LocaleCompare("size",option+1) == 0)
1372 {
1373 if (*option == '+')
1374 break;
1375 i++;
cristybb503372010-05-27 20:51:26 +00001376 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001377 ThrowCompositeException(OptionError,"MissingArgument",option);
1378 if (IsGeometry(argv[i]) == MagickFalse)
1379 ThrowCompositeInvalidArgumentException(option,argv[i]);
1380 break;
1381 }
1382 if (LocaleCompare("stegano",option+1) == 0)
1383 {
1384 composite_options.stegano=0;
1385 if (*option == '+')
1386 break;
1387 i++;
cristybb503372010-05-27 20:51:26 +00001388 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001389 ThrowCompositeException(OptionError,"MissingArgument",option);
1390 if (IsGeometry(argv[i]) == MagickFalse)
1391 ThrowCompositeInvalidArgumentException(option,argv[i]);
cristy32c2aea2010-12-01 01:00:50 +00001392 composite_options.stegano=(ssize_t) StringToLong(argv[i])+1;
cristy3ed852e2009-09-05 21:47:34 +00001393 break;
1394 }
1395 if (LocaleCompare("stereo",option+1) == 0)
1396 {
1397 MagickStatusType
1398 flags;
1399
1400 composite_options.stereo=MagickFalse;
1401 if (*option == '+')
1402 break;
1403 i++;
cristybb503372010-05-27 20:51:26 +00001404 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001405 ThrowCompositeException(OptionError,"MissingArgument",option);
1406 if (IsGeometry(argv[i]) == MagickFalse)
1407 ThrowCompositeInvalidArgumentException(option,argv[i]);
1408 flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset);
1409 if ((flags & YValue) == 0)
1410 composite_options.offset.y=composite_options.offset.x;
1411 composite_options.stereo=MagickTrue;
1412 break;
1413 }
1414 if (LocaleCompare("strip",option+1) == 0)
1415 break;
1416 if (LocaleCompare("support",option+1) == 0)
1417 {
1418 i++; /* deprecated */
1419 break;
1420 }
1421 if (LocaleCompare("swap",option+1) == 0)
1422 {
1423 if (*option == '+')
1424 break;
1425 i++;
cristye81f5522014-05-07 01:25:59 +00001426 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001427 ThrowCompositeException(OptionError,"MissingArgument",option);
1428 if (IsGeometry(argv[i]) == MagickFalse)
1429 ThrowCompositeInvalidArgumentException(option,argv[i]);
1430 break;
1431 }
cristyd9a29192010-10-16 16:49:53 +00001432 if (LocaleCompare("synchronize",option+1) == 0)
1433 break;
cristy3ed852e2009-09-05 21:47:34 +00001434 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1435 }
1436 case 't':
1437 {
cristyd9a29192010-10-16 16:49:53 +00001438 if (LocaleCompare("taint",option+1) == 0)
1439 break;
cristy3ed852e2009-09-05 21:47:34 +00001440 if (LocaleCompare("thumbnail",option+1) == 0)
1441 {
1442 if (*option == '+')
1443 break;
1444 i++;
cristybb503372010-05-27 20:51:26 +00001445 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001446 ThrowCompositeException(OptionError,"MissingArgument",option);
1447 if (IsGeometry(argv[i]) == MagickFalse)
1448 ThrowCompositeInvalidArgumentException(option,argv[i]);
1449 break;
1450 }
1451 if (LocaleCompare("tile",option+1) == 0)
1452 {
1453 composite_options.tile=(*option == '-') ? MagickTrue : MagickFalse;
1454 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
1455 break;
1456 }
1457 if (LocaleCompare("transform",option+1) == 0)
1458 break;
1459 if (LocaleCompare("transparent-color",option+1) == 0)
1460 {
1461 if (*option == '+')
1462 break;
1463 i++;
cristye81f5522014-05-07 01:25:59 +00001464 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001465 ThrowCompositeException(OptionError,"MissingArgument",option);
1466 break;
1467 }
1468 if (LocaleCompare("treedepth",option+1) == 0)
1469 {
1470 if (*option == '+')
1471 break;
1472 i++;
cristybb503372010-05-27 20:51:26 +00001473 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001474 ThrowCompositeException(OptionError,"MissingArgument",option);
1475 if (IsGeometry(argv[i]) == MagickFalse)
1476 ThrowCompositeInvalidArgumentException(option,argv[i]);
1477 break;
1478 }
1479 if (LocaleCompare("type",option+1) == 0)
1480 {
cristybb503372010-05-27 20:51:26 +00001481 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001482 type;
1483
1484 if (*option == '+')
1485 break;
1486 i++;
cristybb503372010-05-27 20:51:26 +00001487 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001488 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001489 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00001490 if (type < 0)
1491 ThrowCompositeException(OptionError,"UnrecognizedImageType",
1492 argv[i]);
1493 break;
1494 }
1495 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1496 }
1497 case 'u':
1498 {
1499 if (LocaleCompare("units",option+1) == 0)
1500 {
cristybb503372010-05-27 20:51:26 +00001501 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001502 units;
1503
1504 if (*option == '+')
1505 break;
1506 i++;
cristybb503372010-05-27 20:51:26 +00001507 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001508 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001509 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001510 argv[i]);
1511 if (units < 0)
1512 ThrowCompositeException(OptionError,"UnrecognizedUnitsType",
1513 argv[i]);
1514 break;
1515 }
1516 if (LocaleCompare("unsharp",option+1) == 0)
1517 {
1518 (void) CloneString(&composite_options.compose_args,(char *) NULL);
1519 if (*option == '+')
1520 break;
1521 i++;
cristybb503372010-05-27 20:51:26 +00001522 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001523 ThrowCompositeException(OptionError,"MissingArgument",option);
1524 if (IsGeometry(argv[i]) == MagickFalse)
1525 ThrowCompositeInvalidArgumentException(option,argv[i]);
1526 (void) CloneString(&composite_options.compose_args,argv[i]);
1527 composite_options.compose=ThresholdCompositeOp;
1528 break;
1529 }
1530 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1531 }
1532 case 'v':
1533 {
1534 if (LocaleCompare("verbose",option+1) == 0)
1535 break;
1536 if ((LocaleCompare("version",option+1) == 0) ||
1537 (LocaleCompare("-version",option+1) == 0))
1538 {
cristy4f7a6132012-12-23 00:35:19 +00001539 ListMagickVersion(stdout);
cristy3ed852e2009-09-05 21:47:34 +00001540 break;
1541 }
1542 if (LocaleCompare("virtual-pixel",option+1) == 0)
1543 {
cristybb503372010-05-27 20:51:26 +00001544 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00001545 method;
1546
1547 if (*option == '+')
1548 break;
1549 i++;
cristybb503372010-05-27 20:51:26 +00001550 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001551 ThrowCompositeException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00001552 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00001553 argv[i]);
1554 if (method < 0)
1555 ThrowCompositeException(OptionError,
1556 "UnrecognizedVirtualPixelMethod",argv[i]);
1557 break;
1558 }
1559 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1560 }
1561 case 'w':
1562 {
1563 if (LocaleCompare("watermark",option+1) == 0)
1564 {
1565 (void) CloneString(&composite_options.compose_args,(char *) NULL);
1566 if (*option == '+')
1567 break;
1568 i++;
cristybb503372010-05-27 20:51:26 +00001569 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001570 ThrowCompositeException(OptionError,"MissingArgument",option);
1571 if (IsGeometry(argv[i]) == MagickFalse)
1572 ThrowCompositeInvalidArgumentException(option,argv[i]);
1573 (void) CloneString(&composite_options.compose_args,argv[i]);
1574 composite_options.compose=ModulateCompositeOp;
1575 break;
1576 }
1577 if (LocaleCompare("white-point",option+1) == 0)
1578 {
1579 if (*option == '+')
1580 break;
1581 i++;
cristybb503372010-05-27 20:51:26 +00001582 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001583 ThrowCompositeException(OptionError,"MissingArgument",option);
1584 if (IsGeometry(argv[i]) == MagickFalse)
1585 ThrowCompositeInvalidArgumentException(option,argv[i]);
1586 break;
1587 }
1588 if (LocaleCompare("write",option+1) == 0)
1589 {
1590 i++;
cristybb503372010-05-27 20:51:26 +00001591 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00001592 ThrowCompositeException(OptionError,"MissingArgument",option);
1593 break;
1594 }
1595 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1596 }
1597 case '?':
1598 break;
1599 default:
1600 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
1601 }
cristy042ee782011-04-22 18:48:30 +00001602 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1603 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
cristy3ed852e2009-09-05 21:47:34 +00001604 if (fire != MagickFalse)
1605 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1606 }
1607 if (k != 0)
1608 ThrowCompositeException(OptionError,"UnbalancedParenthesis",argv[i]);
cristybb503372010-05-27 20:51:26 +00001609 if (i-- != (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00001610 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[i]);
1611 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1612 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]);
1613 FinalizeImageSettings(image_info,image,MagickTrue);
cristy94f20072009-09-12 02:12:36 +00001614 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
1615 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]);
cristy3ed852e2009-09-05 21:47:34 +00001616 /*
1617 Composite images.
1618 */
1619 RemoveImageStack(composite_image);
1620 RemoveImageStack(images);
1621 (void) TransformImage(&composite_image,(char *) NULL,
cristye941a752011-10-15 01:52:48 +00001622 composite_image->geometry,exception);
cristy3ed852e2009-09-05 21:47:34 +00001623 RemoveImageStack(mask_image);
1624 if (mask_image != (Image *) NULL)
1625 {
1626 if ((composite_options.compose == DisplaceCompositeOp) ||
1627 (composite_options.compose == DistortCompositeOp))
cristyfe831852013-02-12 14:56:07 +00001628 status&=CompositeImage(composite_image,mask_image,
1629 CopyGreenCompositeOp,MagickTrue,0,0,exception);
cristy3ed852e2009-09-05 21:47:34 +00001630 else
cristyfe831852013-02-12 14:56:07 +00001631 status&=CompositeImage(composite_image,mask_image,IntensityCompositeOp,
1632 MagickTrue,0,0,exception);
1633 mask_image=DestroyImage(mask_image);
cristy3ed852e2009-09-05 21:47:34 +00001634 }
1635 status&=CompositeImageList(image_info,&images,composite_image,
1636 &composite_options,exception);
1637 composite_image=DestroyImage(composite_image);
1638 /*
1639 Write composite images.
1640 */
1641 status&=WriteImages(image_info,images,argv[argc-1],exception);
1642 if (metadata != (char **) NULL)
1643 {
1644 char
1645 *text;
1646
cristy018f07f2011-09-04 21:15:19 +00001647 text=InterpretImageProperties(image_info,images,format,exception);
cristy3ed852e2009-09-05 21:47:34 +00001648 if (text == (char *) NULL)
1649 ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed",
1650 GetExceptionMessage(errno));
1651 (void) ConcatenateString(&(*metadata),text);
cristy3ed852e2009-09-05 21:47:34 +00001652 text=DestroyString(text);
1653 }
1654 images=DestroyImage(images);
1655 RelinquishCompositeOptions(&composite_options);
1656 DestroyComposite();
1657 return(status != 0 ? MagickTrue : MagickFalse);
1658}