MagickWand 7.1.1
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
montage.c
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% M M OOO N N TTTTT AAA GGGG EEEEE %
7% MM MM O O NN N T A A G E %
8% M M M O O N N N T AAAAA G GG EEE %
9% M M O O N NN T A A G G E %
10% M M OOO N N T A A GGG EEEEE %
11% %
12% %
13% MagickWand Methods to Create Image Thumbnails %
14% %
15% Software Design %
16% Cristy %
17% July 1992 %
18% %
19% %
20% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization %
21% 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% https://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 montage program to create a composite image by combining several
37% separate images. The images are tiled on the composite image optionally
38% adorned with a border, frame, image name, and more.
39%
40*/
41
42/*
43 Include declarations.
44*/
45#include "MagickWand/studio.h"
46#include "MagickWand/MagickWand.h"
47#include "MagickWand/mogrify-private.h"
48#include "MagickCore/string-private.h"
49
50/*
51%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52% %
53% %
54% %
55+ M o n t a g e I m a g e C o m m a n d %
56% %
57% %
58% %
59%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60%
61% MontageImageCommand() reads one or more images, applies one or more image
62% processing operations, and writes out the image in the same or
63% differing format.
64%
65% The format of the MontageImageCommand method is:
66%
67% MagickBooleanType MontageImageCommand(ImageInfo *image_info,int argc,
68% char **argv,char **metadata,ExceptionInfo *exception)
69%
70% A description of each parameter follows:
71%
72% o image_info: the image info.
73%
74% o argc: the number of elements in the argument vector.
75%
76% o argv: A text array containing the command line arguments.
77%
78% o metadata: any metadata is returned here.
79%
80% o exception: return any errors or warnings in this structure.
81%
82*/
83
84static MagickBooleanType MontageUsage(void)
85{
86 static const char
87 miscellaneous[] =
88 " -debug events display copious debugging information\n"
89 " -help print program options\n"
90 " -list type print a list of supported option arguments\n"
91 " -log format format of debugging information\n"
92 " -version print version information",
93 operators[] =
94 " -adaptive-sharpen geometry\n"
95 " adaptively sharpen pixels; increase effect near edges\n"
96 " -annotate geometry text\n"
97 " annotate the image with text\n"
98 " -auto-orient automagically orient image\n"
99 " -blur geometry reduce image noise and reduce detail levels\n"
100 " -border geometry surround image with a border of color\n"
101 " -channel mask set the image channel mask\n"
102 " -crop geometry preferred size and location of the cropped image\n"
103 " -distort method args\n"
104 " distort images according to given method and args\n"
105 " -extent geometry set the image size\n"
106 " -flatten flatten a sequence of images\n"
107 " -flip flip image in the vertical direction\n"
108 " -flop flop image in the horizontal direction\n"
109 " -frame geometry surround image with an ornamental border\n"
110 " -layers method optimize, merge, or compare image layers\n"
111 " -monochrome transform image to black and white\n"
112 " -polaroid angle simulate a Polaroid picture\n"
113 " -repage geometry size and location of an image canvas (operator)\n"
114 " -resize geometry resize the image\n"
115 " -rotate degrees apply Paeth rotation to the image\n"
116 " -scale geometry scale the image\n"
117 " -strip strip image of all profiles and comments\n"
118 " -transform affine transform image\n"
119 " -transpose flip image vertically and rotate 90 degrees\n"
120 " -transparent color make this color transparent within the image\n"
121 " -type type image type\n"
122 " -unsharp geometry sharpen the image",
123 settings[] =
124 " -adjoin join images into a single multi-image file\n"
125 " -affine matrix affine transform matrix\n"
126 " -alpha option on, activate, off, deactivate, set, opaque, copy\n"
127 " transparent, extract, background, or shape\n"
128 " -authenticate password\n"
129 " decipher image with this password\n"
130 " -blue-primary point chromaticity blue primary point\n"
131 " -bordercolor color border color\n"
132 " -caption string assign a caption to an image\n"
133 " -colors value preferred number of colors in the image\n"
134 " -colorspace type alternate image colorspace\n"
135 " -comment string annotate image with comment\n"
136 " -compose operator composite operator\n"
137 " -compress type type of pixel compression when writing the image\n"
138 " -define format:option\n"
139 " define one or more image format options\n"
140 " -delay value display the next image after pausing\n"
141 " -density geometry horizontal and vertical density of the image\n"
142 " -depth value image depth\n"
143 " -display server query font from this X server\n"
144 " -dispose method layer disposal method\n"
145 " -dither method apply error diffusion to image\n"
146 " -draw string annotate the image with a graphic primitive\n"
147 " -encoding type text encoding type\n"
148 " -endian type endianness (MSB or LSB) of the image\n"
149 " -extract geometry extract area from image\n"
150 " -family name render text with this font family\n"
151 " -fill color color to use when filling a graphic primitive\n"
152 " -filter type use this filter when resizing an image\n"
153 " -font name render text with this font\n"
154 " -format \"string\" output formatted image characteristics\n"
155 " -gamma value level of gamma correction\n"
156 " -geometry geometry preferred tile and border sizes\n"
157 " -gravity direction which direction to gravitate towards\n"
158 " -green-primary point chromaticity green primary point\n"
159 " -identify identify the format and characteristics of the image\n"
160 " -interlace type type of image interlacing scheme\n"
161 " -interpolate method pixel color interpolation method\n"
162 " -kerning value set the space between two letters\n"
163 " -label string assign a label to an image\n"
164 " -limit type value pixel cache resource limit\n"
165 " -matte store matte channel if the image has one\n"
166 " -mattecolor color frame color\n"
167 " -mode type framing style\n"
168 " -monitor monitor progress\n"
169 " -page geometry size and location of an image canvas (setting)\n"
170 " -pointsize value font point size\n"
171 " -profile filename add, delete, or apply an image profile\n"
172 " -quality value JPEG/MIFF/PNG compression level\n"
173 " -quantize colorspace reduce colors in this colorspace\n"
174 " -quiet suppress all warning messages\n"
175 " -red-primary point chromaticity red primary point\n"
176 " -regard-warnings pay attention to warning messages\n"
177 " -respect-parentheses settings remain in effect until parenthesis boundary\n"
178 " -sampling-factor geometry\n"
179 " horizontal and vertical sampling factor\n"
180 " -scenes range image scene range\n"
181 " -seed value seed a new sequence of pseudo-random numbers\n"
182 " -set attribute value set an image attribute\n"
183 " -shadow add a shadow beneath a tile to simulate depth\n"
184 " -size geometry width and height of image\n"
185 " -stroke color color to use when stroking a graphic primitive\n"
186 " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n"
187 " -synchronize synchronize image to storage device\n"
188 " -taint declare the image as modified\n"
189 " -texture filename name of texture to tile onto the image background\n"
190 " -thumbnail geometry create a thumbnail of the image\n"
191 " -tile geometry number of tiles per row and column\n"
192 " -title string decorate the montage image with a title\n"
193 " -transparent-color color\n"
194 " transparent color\n"
195 " -treedepth value color tree depth\n"
196 " -trim trim image edges\n"
197 " -units type the units of image resolution\n"
198 " -verbose print detailed information about the image\n"
199 " -virtual-pixel method\n"
200 " virtual pixel access method\n"
201 " -white-point point chromaticity white point",
202 sequence_operators[] =
203 " -coalesce merge a sequence of images\n"
204 " -composite composite image",
205 stack_operators[] =
206 " -clone indexes clone an image\n"
207 " -delete indexes delete the image from the image sequence\n"
208 " -duplicate count,indexes\n"
209 " duplicate an image one or more times\n"
210 " -insert index insert last image into the image sequence\n"
211 " -reverse reverse image sequence\n"
212 " -swap indexes swap two images in the image sequence";
213
214 ListMagickVersion(stdout);
215 (void) printf("Usage: %s [options ...] file [ [options ...] file ...] file\n",
216 GetClientName());
217 (void) printf("\nImage Settings:\n");
218 (void) puts(settings);
219 (void) printf("\nImage Operators:\n");
220 (void) puts(operators);
221 (void) printf("\nImage Sequence Operators:\n");
222 (void) puts(sequence_operators);
223 (void) printf("\nImage Stack Operators:\n");
224 (void) puts(stack_operators);
225 (void) printf("\nMiscellaneous Options:\n");
226 (void) puts(miscellaneous);
227 (void) printf(
228 "\nIn addition to those listed above, you can specify these standard X\n");
229 (void) printf(
230 "resources as command line options: -background, -bordercolor,\n");
231 (void) printf(
232 "-mattecolor, -borderwidth, -font, or -title\n");
233 (void) printf(
234 "\nBy default, the image format of 'file' is determined by its magic\n");
235 (void) printf(
236 "number. To specify a particular image format, precede the filename\n");
237 (void) printf(
238 "with an image format name and a colon (i.e. ps:image) or specify the\n");
239 (void) printf(
240 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
241 (void) printf("'-' for standard input or output.\n");
242 return(MagickTrue);
243}
244
245WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info,
246 int argc,char **argv,char **metadata,ExceptionInfo *exception)
247{
248#define DestroyMontage() \
249{ \
250 if (montage_image != (Image *) NULL) \
251 montage_image=DestroyImageList(montage_image); \
252 if (montage_info != (MontageInfo *) NULL) \
253 montage_info=DestroyMontageInfo(montage_info); \
254 DestroyImageStack(); \
255 for (i=0; i < (ssize_t) argc; i++) \
256 argv[i]=DestroyString(argv[i]); \
257 argv=(char **) RelinquishMagickMemory(argv); \
258}
259#define ThrowMontageException(asperity,tag,option) \
260{ \
261 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
262 option); \
263 DestroyMontage(); \
264 return(MagickFalse); \
265}
266#define ThrowMontageInvalidArgumentException(option,argument) \
267{ \
268 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
269 "InvalidArgument","'%s': %s",option,argument); \
270 DestroyMontage(); \
271 return(MagickFalse); \
272}
273
274 char
275 *option,
276 *transparent_color;
277
278 const char
279 *format;
280
281 Image
282 *image = (Image *) NULL,
283 *montage_image;
284
286 image_stack[MaxImageStackDepth+1];
287
288 long
289 first_scene,
290 last_scene;
291
292 MagickBooleanType
293 fire,
294 pend,
295 respect_parenthesis;
296
297 MagickStatusType
298 status;
299
300 MontageInfo
301 *montage_info;
302
303 ssize_t
304 i;
305
306 ssize_t
307 j,
308 k,
309 scene;
310
311 /*
312 Set defaults.
313 */
314 assert(image_info != (ImageInfo *) NULL);
315 assert(image_info->signature == MagickCoreSignature);
316 assert(exception != (ExceptionInfo *) NULL);
317 if (IsEventLogging() != MagickFalse)
318 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
319 if (argc == 2)
320 {
321 option=argv[1];
322 if ((LocaleCompare("help",option+1) == 0) ||
323 (LocaleCompare("-help",option+1) == 0))
324 return(MontageUsage());
325 if ((LocaleCompare("version",option+1) == 0) ||
326 (LocaleCompare("-version",option+1) == 0))
327 {
328 ListMagickVersion(stdout);
329 return(MagickTrue);
330 }
331 }
332 if (argc < 3)
333 {
334 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
335 "MissingArgument","%s","");
336 (void) MontageUsage();
337 return(MagickFalse);
338 }
339 format="%w,%h,%m";
340 first_scene=0;
341 j=1;
342 k=0;
343 last_scene=0;
344 montage_image=NewImageList();
345 montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
346 NewImageStack();
347 option=(char *) NULL;
348 pend=MagickFalse;
349 respect_parenthesis=MagickFalse;
350 scene=0;
351 status=MagickFalse;
352 transparent_color=(char *) NULL;
353 /*
354 Parse command line.
355 */
356 ReadCommandlLine(argc,&argv);
357 status=ExpandFilenames(&argc,&argv);
358 if (status == MagickFalse)
359 ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
360 GetExceptionMessage(errno));
361 for (i=1; i < (ssize_t) (argc-1); i++)
362 {
363 option=argv[i];
364 if (LocaleCompare(option,"(") == 0)
365 {
366 FireImageStack(MagickTrue,MagickTrue,pend);
367 if (k == MaxImageStackDepth)
368 ThrowMontageException(OptionError,"ParenthesisNestedTooDeeply",
369 option);
370 PushImageStack();
371 continue;
372 }
373 if (LocaleCompare(option,")") == 0)
374 {
375 FireImageStack(MagickTrue,MagickTrue,MagickTrue);
376 if (k == 0)
377 ThrowMontageException(OptionError,"UnableToParseExpression",option);
378 PopImageStack();
379 continue;
380 }
381 if (IsCommandOption(option) == MagickFalse)
382 {
383 Image
384 *images;
385
386 FireImageStack(MagickFalse,MagickFalse,pend);
387 for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++)
388 {
389 char
390 *filename;
391
392 /*
393 Option is a file name: begin by reading image from specified file.
394 */
395 filename=argv[i];
396 if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
397 filename=argv[++i];
398 (void) CloneString(&image_info->font,montage_info->font);
399 if (first_scene == last_scene)
400 images=ReadImages(image_info,filename,exception);
401 else
402 {
403 char
404 scene_filename[MagickPathExtent];
405
406 /*
407 Form filename for multi-part images.
408 */
409 (void) InterpretImageFilename(image_info,(Image *) NULL,
410 image_info->filename,(int) scene,scene_filename,exception);
411 if (LocaleCompare(filename,image_info->filename) == 0)
412 (void) FormatLocaleString(scene_filename,MagickPathExtent,
413 "%s.%.20g",image_info->filename,(double) scene);
414 images=ReadImages(image_info,scene_filename,exception);
415 }
416 status&=(MagickStatusType) (images != (Image *) NULL) &&
417 (exception->severity < ErrorException);
418 if (images == (Image *) NULL)
419 continue;
420 AppendImageStack(images);
421 }
422 continue;
423 }
424 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
425 switch (*(option+1))
426 {
427 case 'a':
428 {
429 if (LocaleCompare("adaptive-sharpen",option+1) == 0)
430 {
431 i++;
432 if (i == (ssize_t) argc)
433 ThrowMontageException(OptionError,"MissingArgument",option);
434 if (IsGeometry(argv[i]) == MagickFalse)
435 ThrowMontageInvalidArgumentException(option,argv[i]);
436 break;
437 }
438 if (LocaleCompare("adjoin",option+1) == 0)
439 break;
440 if (LocaleCompare("affine",option+1) == 0)
441 {
442 if (*option == '+')
443 break;
444 i++;
445 if (i == (ssize_t) argc)
446 ThrowMontageException(OptionError,"MissingArgument",option);
447 if (IsGeometry(argv[i]) == MagickFalse)
448 ThrowMontageInvalidArgumentException(option,argv[i]);
449 break;
450 }
451 if (LocaleCompare("alpha",option+1) == 0)
452 {
453 ssize_t
454 type;
455
456 if (*option == '+')
457 break;
458 i++;
459 if (i == (ssize_t) argc)
460 ThrowMontageException(OptionError,"MissingArgument",option);
461 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,
462 argv[i]);
463 if (type < 0)
464 ThrowMontageException(OptionError,
465 "UnrecognizedAlphaChannelOption",argv[i]);
466 break;
467 }
468 if (LocaleCompare("annotate",option+1) == 0)
469 {
470 if (*option == '+')
471 break;
472 i++;
473 if (i == (ssize_t) argc)
474 ThrowMontageException(OptionError,"MissingArgument",option);
475 if (IsGeometry(argv[i]) == MagickFalse)
476 ThrowMontageInvalidArgumentException(option,argv[i]);
477 if (i == (ssize_t) argc)
478 ThrowMontageException(OptionError,"MissingArgument",option);
479 i++;
480 break;
481 }
482 if (LocaleCompare("auto-orient",option+1) == 0)
483 break;
484 if (LocaleCompare("authenticate",option+1) == 0)
485 {
486 if (*option == '+')
487 break;
488 i++;
489 if (i == (ssize_t) argc)
490 ThrowMontageException(OptionError,"MissingArgument",option);
491 break;
492 }
493 ThrowMontageException(OptionError,"UnrecognizedOption",option)
494 }
495 case 'b':
496 {
497 if (LocaleCompare("background",option+1) == 0)
498 {
499 if (*option == '+')
500 break;
501 i++;
502 if (i == (ssize_t) argc)
503 ThrowMontageException(OptionError,"MissingArgument",option);
504 (void) QueryColorCompliance(argv[i],AllCompliance,
505 &montage_info->background_color,exception);
506 break;
507 }
508 if (LocaleCompare("blue-primary",option+1) == 0)
509 {
510 if (*option == '+')
511 break;
512 i++;
513 if (i == (ssize_t) argc)
514 ThrowMontageException(OptionError,"MissingArgument",option);
515 if (IsGeometry(argv[i]) == MagickFalse)
516 ThrowMontageInvalidArgumentException(option,argv[i]);
517 break;
518 }
519 if (LocaleCompare("blur",option+1) == 0)
520 {
521 if (*option == '+')
522 break;
523 i++;
524 if (i == (ssize_t) argc)
525 ThrowMontageException(OptionError,"MissingArgument",option);
526 if (IsGeometry(argv[i]) == MagickFalse)
527 ThrowMontageInvalidArgumentException(option,argv[i]);
528 break;
529 }
530 if (LocaleCompare("border",option+1) == 0)
531 {
532 if (k == 0)
533 {
534 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
535 montage_info->border_width=0;
536 }
537 if (*option == '+')
538 break;
539 i++;
540 if (i == (ssize_t) argc)
541 ThrowMontageException(OptionError,"MissingArgument",option);
542 if (IsGeometry(argv[i]) == MagickFalse)
543 ThrowMontageInvalidArgumentException(option,argv[i]);
544 if (k == 0)
545 montage_info->border_width=StringToUnsignedLong(argv[i]);
546 break;
547 }
548 if (LocaleCompare("bordercolor",option+1) == 0)
549 {
550 if (*option == '+')
551 break;
552 i++;
553 if (i == (ssize_t) argc)
554 ThrowMontageException(OptionError,"MissingArgument",option);
555 (void) QueryColorCompliance(argv[i],AllCompliance,
556 &montage_info->border_color,exception);
557 break;
558 }
559 if (LocaleCompare("borderwidth",option+1) == 0)
560 {
561 montage_info->border_width=0;
562 if (*option == '+')
563 break;
564 i++;
565 if (i == (ssize_t) argc)
566 ThrowMontageException(OptionError,"MissingArgument",option);
567 if (IsGeometry(argv[i]) == MagickFalse)
568 ThrowMontageInvalidArgumentException(option,argv[i]);
569 montage_info->border_width=StringToUnsignedLong(argv[i]);
570 break;
571 }
572 ThrowMontageException(OptionError,"UnrecognizedOption",option)
573 }
574 case 'c':
575 {
576 if (LocaleCompare("cache",option+1) == 0)
577 {
578 if (*option == '+')
579 break;
580 i++;
581 if (i == (ssize_t) argc)
582 ThrowMontageException(OptionError,"MissingArgument",option);
583 if (IsGeometry(argv[i]) == MagickFalse)
584 ThrowMontageInvalidArgumentException(option,argv[i]);
585 break;
586 }
587 if (LocaleCompare("caption",option+1) == 0)
588 {
589 if (*option == '+')
590 break;
591 i++;
592 if (i == (ssize_t) argc)
593 ThrowMontageException(OptionError,"MissingArgument",option);
594 break;
595 }
596 if (LocaleCompare("channel",option+1) == 0)
597 {
598 ssize_t
599 channel;
600
601 if (*option == '+')
602 break;
603 i++;
604 if (i == (ssize_t) argc)
605 ThrowMontageException(OptionError,"MissingArgument",option);
606 channel=ParseChannelOption(argv[i]);
607 if (channel < 0)
608 ThrowMontageException(OptionError,"UnrecognizedChannelType",
609 argv[i]);
610 break;
611 }
612 if (LocaleCompare("clone",option+1) == 0)
613 {
614 Image
615 *clone_images,
616 *clone_list;
617
618 clone_list=CloneImageList(image,exception);
619 if (k != 0)
620 clone_list=CloneImageList(image_stack[k-1].image,exception);
621 if (clone_list == (Image *) NULL)
622 ThrowMontageException(ImageError,"ImageSequenceRequired",option);
623 FireImageStack(MagickTrue,MagickTrue,MagickTrue);
624 if (*option == '+')
625 clone_images=CloneImages(clone_list,"-1",exception);
626 else
627 {
628 i++;
629 if (i == (ssize_t) argc)
630 ThrowMontageException(OptionError,"MissingArgument",option);
631 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
632 ThrowMontageInvalidArgumentException(option,argv[i]);
633 clone_images=CloneImages(clone_list,argv[i],exception);
634 }
635 if (clone_images == (Image *) NULL)
636 ThrowMontageException(OptionError,"NoSuchImage",option);
637 AppendImageStack(clone_images);
638 clone_list=DestroyImageList(clone_list);
639 break;
640 }
641 if (LocaleCompare("coalesce",option+1) == 0)
642 break;
643 if (LocaleCompare("colors",option+1) == 0)
644 {
645 if (*option == '+')
646 break;
647 i++;
648 if (i == (ssize_t) argc)
649 ThrowMontageException(OptionError,"MissingArgument",option);
650 if (IsGeometry(argv[i]) == MagickFalse)
651 ThrowMontageInvalidArgumentException(option,argv[i]);
652 break;
653 }
654 if (LocaleCompare("colorspace",option+1) == 0)
655 {
656 ssize_t
657 colorspace;
658
659 if (*option == '+')
660 break;
661 i++;
662 if (i == (ssize_t) argc)
663 ThrowMontageException(OptionError,"MissingArgument",option);
664 colorspace=ParseCommandOption(MagickColorspaceOptions,
665 MagickFalse,argv[i]);
666 if (colorspace < 0)
667 ThrowMontageException(OptionError,"UnrecognizedColorspace",
668 argv[i]);
669 break;
670 }
671 if (LocaleCompare("comment",option+1) == 0)
672 {
673 if (*option == '+')
674 break;
675 i++;
676 if (i == (ssize_t) argc)
677 ThrowMontageException(OptionError,"MissingArgument",option);
678 break;
679 }
680 if (LocaleCompare("compose",option+1) == 0)
681 {
682 ssize_t
683 compose;
684
685 if (*option == '+')
686 break;
687 i++;
688 if (i == (ssize_t) argc)
689 ThrowMontageException(OptionError,"MissingArgument",option);
690 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,argv[i]);
691 if (compose < 0)
692 ThrowMontageException(OptionError,"UnrecognizedComposeOperator",
693 argv[i]);
694 break;
695 }
696 if (LocaleCompare("composite",option+1) == 0)
697 break;
698 if (LocaleCompare("compress",option+1) == 0)
699 {
700 ssize_t
701 compress;
702
703 if (*option == '+')
704 break;
705 i++;
706 if (i == (ssize_t) argc)
707 ThrowMontageException(OptionError,"MissingArgument",option);
708 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
709 argv[i]);
710 if (compress < 0)
711 ThrowMontageException(OptionError,"UnrecognizedCompressType",
712 argv[i]);
713 break;
714 }
715 if (LocaleCompare("concurrent",option+1) == 0)
716 break;
717 if (LocaleCompare("crop",option+1) == 0)
718 {
719 if (*option == '+')
720 break;
721 i++;
722 if (i == (ssize_t) argc)
723 ThrowMontageException(OptionError,"MissingArgument",option);
724 if (IsGeometry(argv[i]) == MagickFalse)
725 ThrowMontageInvalidArgumentException(option,argv[i]);
726 break;
727 }
728 ThrowMontageException(OptionError,"UnrecognizedOption",option)
729 }
730 case 'd':
731 {
732 if (LocaleCompare("debug",option+1) == 0)
733 {
734 ssize_t
735 event;
736
737 if (*option == '+')
738 break;
739 i++;
740 if (i == (ssize_t) argc)
741 ThrowMontageException(OptionError,"MissingArgument",option);
742 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
743 if (event < 0)
744 ThrowMontageException(OptionError,"UnrecognizedEventType",
745 argv[i]);
746 (void) SetLogEventMask(argv[i]);
747 break;
748 }
749 if (LocaleCompare("define",option+1) == 0)
750 {
751 i++;
752 if (i == (ssize_t) argc)
753 ThrowMontageException(OptionError,"MissingArgument",option);
754 if (*option == '+')
755 {
756 const char
757 *define;
758
759 define=GetImageOption(image_info,argv[i]);
760 if (define == (const char *) NULL)
761 ThrowMontageException(OptionError,"NoSuchOption",argv[i]);
762 break;
763 }
764 break;
765 }
766 if (LocaleCompare("delay",option+1) == 0)
767 {
768 if (*option == '+')
769 break;
770 i++;
771 if (i == (ssize_t) argc)
772 ThrowMontageException(OptionError,"MissingArgument",option);
773 if (IsGeometry(argv[i]) == MagickFalse)
774 ThrowMontageInvalidArgumentException(option,argv[i]);
775 break;
776 }
777 if (LocaleCompare("delete",option+1) == 0)
778 {
779 if (*option == '+')
780 break;
781 i++;
782 if (i == (ssize_t) argc)
783 ThrowMontageException(OptionError,"MissingArgument",option);
784 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
785 ThrowMontageInvalidArgumentException(option,argv[i]);
786 break;
787 }
788 if (LocaleCompare("density",option+1) == 0)
789 {
790 if (*option == '+')
791 break;
792 i++;
793 if (i == (ssize_t) argc)
794 ThrowMontageException(OptionError,"MissingArgument",option);
795 if (IsGeometry(argv[i]) == MagickFalse)
796 ThrowMontageInvalidArgumentException(option,argv[i]);
797 break;
798 }
799 if (LocaleCompare("depth",option+1) == 0)
800 {
801 if (*option == '+')
802 break;
803 i++;
804 if (i == (ssize_t) argc)
805 ThrowMontageException(OptionError,"MissingArgument",option);
806 if (IsGeometry(argv[i]) == MagickFalse)
807 ThrowMontageInvalidArgumentException(option,argv[i]);
808 break;
809 }
810 if (LocaleCompare("display",option+1) == 0)
811 {
812 if (*option == '+')
813 break;
814 i++;
815 if (i == (ssize_t) argc)
816 ThrowMontageException(OptionError,"MissingArgument",option);
817 break;
818 }
819 if (LocaleCompare("dispose",option+1) == 0)
820 {
821 ssize_t
822 dispose;
823
824 if (*option == '+')
825 break;
826 i++;
827 if (i == (ssize_t) argc)
828 ThrowMontageException(OptionError,"MissingArgument",option);
829 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,
830 argv[i]);
831 if (dispose < 0)
832 ThrowMontageException(OptionError,"UnrecognizedDisposeMethod",
833 argv[i]);
834 break;
835 }
836 if (LocaleCompare("distort",option+1) == 0)
837 {
838 ssize_t
839 op;
840
841 i++;
842 if (i == (ssize_t) argc)
843 ThrowMontageException(OptionError,"MissingArgument",option);
844 op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]);
845 if (op < 0)
846 ThrowMontageException(OptionError,"UnrecognizedDistortMethod",
847 argv[i]);
848 i++;
849 if (i == (ssize_t) argc)
850 ThrowMontageException(OptionError,"MissingArgument",option);
851 break;
852 }
853 if (LocaleCompare("dither",option+1) == 0)
854 {
855 ssize_t
856 method;
857
858 if (*option == '+')
859 break;
860 i++;
861 if (i == (ssize_t) argc)
862 ThrowMontageException(OptionError,"MissingArgument",option);
863 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
864 if (method < 0)
865 ThrowMontageException(OptionError,"UnrecognizedDitherMethod",
866 argv[i]);
867 break;
868 }
869 if (LocaleCompare("draw",option+1) == 0)
870 {
871 if (*option == '+')
872 break;
873 i++;
874 if (i == (ssize_t) argc)
875 ThrowMontageException(OptionError,"MissingArgument",option);
876 break;
877 }
878 if (LocaleCompare("duplicate",option+1) == 0)
879 {
880 if (*option == '+')
881 break;
882 i++;
883 if (i == (ssize_t) argc)
884 ThrowMontageException(OptionError,"MissingArgument",option);
885 if (IsGeometry(argv[i]) == MagickFalse)
886 ThrowMontageInvalidArgumentException(option,argv[i]);
887 break;
888 }
889 if (LocaleCompare("duration",option+1) == 0)
890 {
891 if (*option == '+')
892 break;
893 i++;
894 if (i == (ssize_t) argc)
895 ThrowMontageException(OptionError,"MissingArgument",option);
896 if (IsGeometry(argv[i]) == MagickFalse)
897 ThrowMontageInvalidArgumentException(option,argv[i]);
898 break;
899 }
900 ThrowMontageException(OptionError,"UnrecognizedOption",option)
901 }
902 case 'e':
903 {
904 if (LocaleCompare("encoding",option+1) == 0)
905 {
906 if (*option == '+')
907 break;
908 i++;
909 if (i == (ssize_t) argc)
910 ThrowMontageException(OptionError,"MissingArgument",option);
911 break;
912 }
913 if (LocaleCompare("endian",option+1) == 0)
914 {
915 ssize_t
916 endian;
917
918 if (*option == '+')
919 break;
920 i++;
921 if (i == (ssize_t) argc)
922 ThrowMontageException(OptionError,"MissingArgument",option);
923 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
924 argv[i]);
925 if (endian < 0)
926 ThrowMontageException(OptionError,"UnrecognizedEndianType",
927 argv[i]);
928 break;
929 }
930 if (LocaleCompare("extent",option+1) == 0)
931 {
932 if (*option == '+')
933 break;
934 i++;
935 if (i == (ssize_t) argc)
936 ThrowMontageException(OptionError,"MissingArgument",option);
937 if (IsGeometry(argv[i]) == MagickFalse)
938 ThrowMontageInvalidArgumentException(option,argv[i]);
939 break;
940 }
941 ThrowMontageException(OptionError,"UnrecognizedOption",option)
942 }
943 case 'f':
944 {
945 if (LocaleCompare("family",option+1) == 0)
946 {
947 if (*option == '+')
948 break;
949 i++;
950 if (i == (ssize_t) argc)
951 ThrowMontageException(OptionError,"MissingArgument",option);
952 break;
953 }
954 if (LocaleCompare("fill",option+1) == 0)
955 {
956 (void) QueryColorCompliance("none",AllCompliance,
957 &montage_info->fill,exception);
958 if (*option == '+')
959 break;
960 i++;
961 if (i == (ssize_t) argc)
962 ThrowMontageException(OptionError,"MissingArgument",option);
963 (void) QueryColorCompliance(argv[i],AllCompliance,
964 &montage_info->fill,exception);
965 break;
966 }
967 if (LocaleCompare("filter",option+1) == 0)
968 {
969 ssize_t
970 filter;
971
972 if (*option == '+')
973 break;
974 i++;
975 if (i == (ssize_t) argc)
976 ThrowMontageException(OptionError,"MissingArgument",option);
977 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
978 if (filter < 0)
979 ThrowMontageException(OptionError,"UnrecognizedImageFilter",
980 argv[i]);
981 break;
982 }
983 if (LocaleCompare("flatten",option+1) == 0)
984 break;
985 if (LocaleCompare("flip",option+1) == 0)
986 break;
987 if (LocaleCompare("flop",option+1) == 0)
988 break;
989 if (LocaleCompare("font",option+1) == 0)
990 {
991 if (*option == '+')
992 break;
993 i++;
994 if (i == (ssize_t) argc)
995 ThrowMontageException(OptionError,"MissingArgument",option);
996 (void) CloneString(&montage_info->font,argv[i]);
997 break;
998 }
999 if (LocaleCompare("format",option+1) == 0)
1000 {
1001 if (*option == '+')
1002 break;
1003 i++;
1004 if (i == (ssize_t) argc)
1005 ThrowMontageException(OptionError,"MissingArgument",option);
1006 format=argv[i];
1007 break;
1008 }
1009 if (LocaleCompare("frame",option+1) == 0)
1010 {
1011 if (k == 0)
1012 {
1013 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
1014 (void) CloneString(&montage_info->frame,(char *) NULL);
1015 }
1016 if (*option == '+')
1017 break;
1018 i++;
1019 if (i == (ssize_t) argc)
1020 ThrowMontageException(OptionError,"MissingArgument",option);
1021 if (IsGeometry(argv[i]) == MagickFalse)
1022 ThrowMontageInvalidArgumentException(option,argv[i]);
1023 if (k == 0)
1024 (void) CloneString(&montage_info->frame,argv[i]);
1025 break;
1026 }
1027 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1028 }
1029 case 'g':
1030 {
1031 if (LocaleCompare("gamma",option+1) == 0)
1032 {
1033 i++;
1034 if (i == (ssize_t) argc)
1035 ThrowMontageException(OptionError,"MissingArgument",option);
1036 if (IsGeometry(argv[i]) == MagickFalse)
1037 ThrowMontageInvalidArgumentException(option,argv[i]);
1038 break;
1039 }
1040 if (LocaleCompare("geometry",option+1) == 0)
1041 {
1042 (void) CloneString(&montage_info->geometry,(char *) NULL);
1043 if (*option == '+')
1044 break;
1045 i++;
1046 if (i == (ssize_t) argc)
1047 ThrowMontageException(OptionError,"MissingArgument",option);
1048 if (IsGeometry(argv[i]) == MagickFalse)
1049 ThrowMontageInvalidArgumentException(option,argv[i]);
1050 (void) CloneString(&montage_info->geometry,argv[i]);
1051 break;
1052 }
1053 if (LocaleCompare("gravity",option+1) == 0)
1054 {
1055 ssize_t
1056 gravity;
1057
1058 montage_info->gravity=UndefinedGravity;
1059 if (*option == '+')
1060 break;
1061 i++;
1062 if (i == (ssize_t) argc)
1063 ThrowMontageException(OptionError,"MissingArgument",option);
1064 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1065 argv[i]);
1066 if (gravity < 0)
1067 ThrowMontageException(OptionError,"UnrecognizedGravityType",
1068 argv[i]);
1069 montage_info->gravity=(GravityType) gravity;
1070 break;
1071 }
1072 if (LocaleCompare("green-primary",option+1) == 0)
1073 {
1074 if (*option == '+')
1075 break;
1076 i++;
1077 if (i == (ssize_t) argc)
1078 ThrowMontageException(OptionError,"MissingArgument",option);
1079 if (IsGeometry(argv[i]) == MagickFalse)
1080 ThrowMontageInvalidArgumentException(option,argv[i]);
1081 break;
1082 }
1083 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1084 }
1085 case 'h':
1086 {
1087 if ((LocaleCompare("help",option+1) == 0) ||
1088 (LocaleCompare("-help",option+1) == 0))
1089 {
1090 DestroyMontage();
1091 return(MontageUsage());
1092 }
1093 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1094 }
1095 case 'i':
1096 {
1097 if (LocaleCompare("identify",option+1) == 0)
1098 break;
1099 if (LocaleCompare("insert",option+1) == 0)
1100 {
1101 if (*option == '+')
1102 break;
1103 i++;
1104 if (i == (ssize_t) argc)
1105 ThrowMontageException(OptionError,"MissingArgument",option);
1106 if (IsGeometry(argv[i]) == MagickFalse)
1107 ThrowMontageInvalidArgumentException(option,argv[i]);
1108 break;
1109 }
1110 if (LocaleCompare("interlace",option+1) == 0)
1111 {
1112 ssize_t
1113 interlace;
1114
1115 if (*option == '+')
1116 break;
1117 i++;
1118 if (i == (ssize_t) argc)
1119 ThrowMontageException(OptionError,"MissingArgument",option);
1120 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1121 argv[i]);
1122 if (interlace < 0)
1123 ThrowMontageException(OptionError,"UnrecognizedInterlaceType",
1124 argv[i]);
1125 break;
1126 }
1127 if (LocaleCompare("interpolate",option+1) == 0)
1128 {
1129 ssize_t
1130 interpolate;
1131
1132 if (*option == '+')
1133 break;
1134 i++;
1135 if (i == (ssize_t) argc)
1136 ThrowMontageException(OptionError,"MissingArgument",option);
1137 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1138 argv[i]);
1139 if (interpolate < 0)
1140 ThrowMontageException(OptionError,"UnrecognizedInterpolateMethod",
1141 argv[i]);
1142 break;
1143 }
1144 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1145 }
1146 case 'k':
1147 {
1148 if (LocaleCompare("kerning",option+1) == 0)
1149 {
1150 if (*option == '+')
1151 break;
1152 i++;
1153 if (i == (ssize_t) argc)
1154 ThrowMontageException(OptionError,"MissingArgument",option);
1155 if (IsGeometry(argv[i]) == MagickFalse)
1156 ThrowMontageInvalidArgumentException(option,argv[i]);
1157 break;
1158 }
1159 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1160 }
1161 case 'l':
1162 {
1163 if (LocaleCompare("label",option+1) == 0)
1164 {
1165 if (*option == '+')
1166 break;
1167 i++;
1168 if (i == (ssize_t) argc)
1169 ThrowMontageException(OptionError,"MissingArgument",option);
1170 break;
1171 }
1172 if (LocaleCompare("layers",option+1) == 0)
1173 {
1174 ssize_t
1175 type;
1176
1177 if (*option == '+')
1178 break;
1179 i++;
1180 if (i == (ssize_t) argc)
1181 ThrowMontageException(OptionError,"MissingArgument",option);
1182 type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]);
1183 if (type < 0)
1184 ThrowMontageException(OptionError,"UnrecognizedLayerMethod",
1185 argv[i]);
1186 break;
1187 }
1188 if (LocaleCompare("limit",option+1) == 0)
1189 {
1190 char
1191 *p;
1192
1193 double
1194 value;
1195
1196 ssize_t
1197 resource;
1198
1199 if (*option == '+')
1200 break;
1201 i++;
1202 if (i == (ssize_t) argc)
1203 ThrowMontageException(OptionError,"MissingArgument",option);
1204 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1205 argv[i]);
1206 if (resource < 0)
1207 ThrowMontageException(OptionError,"UnrecognizedResourceType",
1208 argv[i]);
1209 i++;
1210 if (i == (ssize_t) argc)
1211 ThrowMontageException(OptionError,"MissingArgument",option);
1212 value=StringToDouble(argv[i],&p);
1213 (void) value;
1214 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
1215 ThrowMontageInvalidArgumentException(option,argv[i]);
1216 break;
1217 }
1218 if (LocaleCompare("list",option+1) == 0)
1219 {
1220 ssize_t
1221 list;
1222
1223 if (*option == '+')
1224 break;
1225 i++;
1226 if (i == (ssize_t) argc)
1227 ThrowMontageException(OptionError,"MissingArgument",option);
1228 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1229 if (list < 0)
1230 ThrowMontageException(OptionError,"UnrecognizedListType",argv[i]);
1231 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
1232 argv+j,exception);
1233 DestroyMontage();
1234 return(status == 0 ? MagickFalse : MagickTrue);
1235 }
1236 if (LocaleCompare("log",option+1) == 0)
1237 {
1238 if (*option == '+')
1239 break;
1240 i++;
1241 if ((i == (ssize_t) argc) ||
1242 (strchr(argv[i],'%') == (char *) NULL))
1243 ThrowMontageException(OptionError,"MissingArgument",option);
1244 break;
1245 }
1246 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1247 }
1248 case 'm':
1249 {
1250 if (LocaleCompare("matte",option+1) == 0)
1251 break;
1252 if (LocaleCompare("mattecolor",option+1) == 0)
1253 {
1254 if (*option == '+')
1255 break;
1256 i++;
1257 if (i == (ssize_t) argc)
1258 ThrowMontageException(OptionError,"MissingArgument",option);
1259 (void) QueryColorCompliance(argv[i],AllCompliance,
1260 &montage_info->matte_color,exception);
1261 break;
1262 }
1263 if (LocaleCompare("mode",option+1) == 0)
1264 {
1265 MontageMode
1266 mode;
1267
1268 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
1269 if (*option == '+')
1270 break;
1271 i++;
1272 if (i == (ssize_t) argc)
1273 ThrowMontageException(OptionError,"MissingArgument",option);
1274 mode=UndefinedMode;
1275 if (LocaleCompare("frame",argv[i]) == 0)
1276 {
1277 mode=FrameMode;
1278 (void) CloneString(&montage_info->frame,"15x15+3+3");
1279 montage_info->shadow=MagickTrue;
1280 break;
1281 }
1282 if (LocaleCompare("unframe",argv[i]) == 0)
1283 {
1284 mode=UnframeMode;
1285 montage_info->frame=(char *) NULL;
1286 montage_info->shadow=MagickFalse;
1287 montage_info->border_width=0;
1288 break;
1289 }
1290 if (LocaleCompare("concatenate",argv[i]) == 0)
1291 {
1292 mode=ConcatenateMode;
1293 montage_info->frame=(char *) NULL;
1294 montage_info->shadow=MagickFalse;
1295 montage_info->gravity=(GravityType) NorthWestGravity;
1296 (void) CloneString(&montage_info->geometry,"+0+0");
1297 montage_info->border_width=0;
1298 break;
1299 }
1300 if (mode == UndefinedMode)
1301 ThrowMontageException(OptionError,"UnrecognizedImageMode",
1302 argv[i]);
1303 break;
1304 }
1305 if (LocaleCompare("monitor",option+1) == 0)
1306 break;
1307 if (LocaleCompare("monochrome",option+1) == 0)
1308 break;
1309 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1310 }
1311 case 'n':
1312 {
1313 if (LocaleCompare("noop",option+1) == 0)
1314 break;
1315 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1316 }
1317 case 'p':
1318 {
1319 if (LocaleCompare("page",option+1) == 0)
1320 {
1321 if (*option == '+')
1322 break;
1323 i++;
1324 if (i == (ssize_t) argc)
1325 ThrowMontageException(OptionError,"MissingArgument",option);
1326 break;
1327 }
1328 if (LocaleCompare("pointsize",option+1) == 0)
1329 {
1330 montage_info->pointsize=12;
1331 if (*option == '+')
1332 break;
1333 i++;
1334 if (i == (ssize_t) argc)
1335 ThrowMontageException(OptionError,"MissingArgument",option);
1336 if (IsGeometry(argv[i]) == MagickFalse)
1337 ThrowMontageInvalidArgumentException(option,argv[i]);
1338 montage_info->pointsize=StringToDouble(argv[i],(char **) NULL);
1339 break;
1340 }
1341 if (LocaleCompare("polaroid",option+1) == 0)
1342 {
1343 if (*option == '+')
1344 break;
1345 i++;
1346 if (i == (ssize_t) argc)
1347 ThrowMontageException(OptionError,"MissingArgument",option);
1348 if (IsGeometry(argv[i]) == MagickFalse)
1349 ThrowMontageInvalidArgumentException(option,argv[i]);
1350 break;
1351 }
1352 if (LocaleCompare("profile",option+1) == 0)
1353 {
1354 i++;
1355 if (i == (ssize_t) argc)
1356 ThrowMontageException(OptionError,"MissingArgument",option);
1357 break;
1358 }
1359 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1360 }
1361 case 'q':
1362 {
1363 if (LocaleCompare("quality",option+1) == 0)
1364 {
1365 if (*option == '+')
1366 break;
1367 i++;
1368 if (i == (ssize_t) argc)
1369 ThrowMontageException(OptionError,"MissingArgument",option);
1370 if (IsGeometry(argv[i]) == MagickFalse)
1371 ThrowMontageInvalidArgumentException(option,argv[i]);
1372 break;
1373 }
1374 if (LocaleCompare("quantize",option+1) == 0)
1375 {
1376 ssize_t
1377 colorspace;
1378
1379 if (*option == '+')
1380 break;
1381 i++;
1382 if (i == (ssize_t) argc)
1383 ThrowMontageException(OptionError,"MissingArgument",option);
1384 colorspace=ParseCommandOption(MagickColorspaceOptions,
1385 MagickFalse,argv[i]);
1386 if (colorspace < 0)
1387 ThrowMontageException(OptionError,"UnrecognizedColorspace",
1388 argv[i]);
1389 break;
1390 }
1391 if (LocaleCompare("quiet",option+1) == 0)
1392 break;
1393 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1394 }
1395 case 'r':
1396 {
1397 if (LocaleCompare("red-primary",option+1) == 0)
1398 {
1399 if (*option == '+')
1400 break;
1401 i++;
1402 if (i == (ssize_t) argc)
1403 ThrowMontageException(OptionError,"MissingArgument",option);
1404 if (IsGeometry(argv[i]) == MagickFalse)
1405 ThrowMontageInvalidArgumentException(option,argv[i]);
1406 break;
1407 }
1408 if (LocaleCompare("regard-warnings",option+1) == 0)
1409 break;
1410 if (LocaleCompare("render",option+1) == 0)
1411 break;
1412 if (LocaleCompare("repage",option+1) == 0)
1413 {
1414 if (*option == '+')
1415 break;
1416 i++;
1417 if (i == (ssize_t) argc)
1418 ThrowMontageException(OptionError,"MissingArgument",option);
1419 if (IsGeometry(argv[i]) == MagickFalse)
1420 ThrowMontageInvalidArgumentException(option,argv[i]);
1421 break;
1422 }
1423 if (LocaleCompare("resize",option+1) == 0)
1424 {
1425 if (*option == '+')
1426 break;
1427 i++;
1428 if (i == (ssize_t) argc)
1429 ThrowMontageException(OptionError,"MissingArgument",option);
1430 if (IsGeometry(argv[i]) == MagickFalse)
1431 ThrowMontageInvalidArgumentException(option,argv[i]);
1432 break;
1433 }
1434 if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1435 {
1436 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1437 break;
1438 }
1439 if (LocaleCompare("reverse",option+1) == 0)
1440 break;
1441 if (LocaleCompare("rotate",option+1) == 0)
1442 {
1443 i++;
1444 if (i == (ssize_t) argc)
1445 ThrowMontageException(OptionError,"MissingArgument",option);
1446 if (IsGeometry(argv[i]) == MagickFalse)
1447 ThrowMontageInvalidArgumentException(option,argv[i]);
1448 break;
1449 }
1450 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1451 }
1452 case 's':
1453 {
1454 if (LocaleCompare("sampling-factor",option+1) == 0)
1455 {
1456 if (*option == '+')
1457 break;
1458 i++;
1459 if (i == (ssize_t) argc)
1460 ThrowMontageException(OptionError,"MissingArgument",option);
1461 if (IsGeometry(argv[i]) == MagickFalse)
1462 ThrowMontageInvalidArgumentException(option,argv[i]);
1463 break;
1464 }
1465 if (LocaleCompare("scale",option+1) == 0)
1466 {
1467 if (*option == '+')
1468 break;
1469 i++;
1470 if (i == (ssize_t) argc)
1471 ThrowMontageException(OptionError,"MissingArgument",option);
1472 if (IsGeometry(argv[i]) == MagickFalse)
1473 ThrowMontageInvalidArgumentException(option,argv[i]);
1474 break;
1475 }
1476 if (LocaleCompare("scenes",option+1) == 0)
1477 {
1478 first_scene=0;
1479 last_scene=0;
1480 if (*option == '+')
1481 break;
1482 i++;
1483 if (i == (ssize_t) argc)
1484 ThrowMontageException(OptionError,"MissingArgument",option);
1485 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
1486 ThrowMontageInvalidArgumentException(option,argv[i]);
1487 first_scene=StringToLong(argv[i]);
1488 last_scene=first_scene;
1489 (void) sscanf(argv[i],"%ld-%ld",&first_scene,&last_scene);
1490 break;
1491 }
1492 if (LocaleCompare("seed",option+1) == 0)
1493 {
1494 if (*option == '+')
1495 break;
1496 i++;
1497 if (i == (ssize_t) argc)
1498 ThrowMontageException(OptionError,"MissingArgument",option);
1499 if (IsGeometry(argv[i]) == MagickFalse)
1500 ThrowMontageInvalidArgumentException(option,argv[i]);
1501 break;
1502 }
1503 if (LocaleCompare("set",option+1) == 0)
1504 {
1505 i++;
1506 if (i == (ssize_t) argc)
1507 ThrowMontageException(OptionError,"MissingArgument",option);
1508 if (*option == '+')
1509 break;
1510 i++;
1511 if (i == (ssize_t) argc)
1512 ThrowMontageException(OptionError,"MissingArgument",option);
1513 break;
1514 }
1515 if (LocaleCompare("shadow",option+1) == 0)
1516 {
1517 if (k == 0)
1518 {
1519 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
1520 montage_info->shadow=(*option == '-') ? MagickTrue :
1521 MagickFalse;
1522 break;
1523 }
1524 if (*option == '+')
1525 break;
1526 i++;
1527 if (i == (ssize_t) argc)
1528 ThrowMontageException(OptionError,"MissingArgument",option);
1529 if (IsGeometry(argv[i]) == MagickFalse)
1530 ThrowMontageInvalidArgumentException(option,argv[i]);
1531 break;
1532 }
1533 if (LocaleCompare("sharpen",option+1) == 0)
1534 {
1535 if (*option == '+')
1536 break;
1537 i++;
1538 if ((i == (ssize_t) argc) || (IsGeometry(argv[i]) == MagickFalse))
1539 ThrowMontageException(OptionError,"MissingArgument",option);
1540 break;
1541 }
1542 if (LocaleCompare("size",option+1) == 0)
1543 {
1544 if (*option == '+')
1545 break;
1546 i++;
1547 if (i == (ssize_t) argc)
1548 ThrowMontageException(OptionError,"MissingArgument",option);
1549 if (IsGeometry(argv[i]) == MagickFalse)
1550 ThrowMontageInvalidArgumentException(option,argv[i]);
1551 break;
1552 }
1553 if (LocaleCompare("stroke",option+1) == 0)
1554 {
1555 (void) QueryColorCompliance("none",AllCompliance,
1556 &montage_info->stroke,exception);
1557 if (*option == '+')
1558 break;
1559 i++;
1560 if (i == (ssize_t) argc)
1561 ThrowMontageException(OptionError,"MissingArgument",option);
1562 (void) QueryColorCompliance(argv[i],AllCompliance,
1563 &montage_info->stroke,exception);
1564 break;
1565 }
1566 if (LocaleCompare("strip",option+1) == 0)
1567 break;
1568 if (LocaleCompare("strokewidth",option+1) == 0)
1569 {
1570 if (*option == '+')
1571 break;
1572 i++;
1573 if (i == (ssize_t) argc)
1574 ThrowMontageException(OptionError,"MissingArgument",option);
1575 if (IsGeometry(argv[i]) == MagickFalse)
1576 ThrowMontageInvalidArgumentException(option,argv[i]);
1577 break;
1578 }
1579 if (LocaleCompare("support",option+1) == 0)
1580 {
1581 i++; /* deprecated */
1582 break;
1583 }
1584 if (LocaleCompare("swap",option+1) == 0)
1585 {
1586 if (*option == '+')
1587 break;
1588 i++;
1589 if (i == (ssize_t) argc)
1590 ThrowMontageException(OptionError,"MissingArgument",option);
1591 if (IsGeometry(argv[i]) == MagickFalse)
1592 ThrowMontageInvalidArgumentException(option,argv[i]);
1593 break;
1594 }
1595 if (LocaleCompare("synchronize",option+1) == 0)
1596 break;
1597 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1598 }
1599 case 't':
1600 {
1601 if (LocaleCompare("taint",option+1) == 0)
1602 break;
1603 if (LocaleCompare("texture",option+1) == 0)
1604 {
1605 (void) CloneString(&montage_info->texture,(char *) NULL);
1606 if (*option == '+')
1607 break;
1608 i++;
1609 if (i == (ssize_t) argc)
1610 ThrowMontageException(OptionError,"MissingArgument",option);
1611 (void) CloneString(&montage_info->texture,argv[i]);
1612 break;
1613 }
1614 if (LocaleCompare("thumbnail",option+1) == 0)
1615 {
1616 if (*option == '+')
1617 break;
1618 i++;
1619 if (i == (ssize_t) argc)
1620 ThrowMontageException(OptionError,"MissingArgument",option);
1621 if (IsGeometry(argv[i]) == MagickFalse)
1622 ThrowMontageInvalidArgumentException(option,argv[i]);
1623 break;
1624 }
1625 if (LocaleCompare("tile",option+1) == 0)
1626 {
1627 if (k == 0)
1628 {
1629 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
1630 (void) CloneString(&montage_info->tile,(char *) NULL);
1631 }
1632 if (*option == '+')
1633 break;
1634 i++;
1635 if (i == (ssize_t) argc)
1636 ThrowMontageException(OptionError,"MissingArgument",option);
1637 if (IsGeometry(argv[i]) == MagickFalse)
1638 ThrowMontageInvalidArgumentException(option,argv[i]);
1639 if (k == 0)
1640 (void) CloneString(&montage_info->tile,argv[i]);
1641 break;
1642 }
1643 if (LocaleCompare("tile-offset",option+1) == 0)
1644 {
1645 if (*option == '+')
1646 break;
1647 i++;
1648 if (i == (ssize_t) argc)
1649 ThrowMontageException(OptionError,"MissingArgument",option);
1650 if (IsGeometry(argv[i]) == MagickFalse)
1651 ThrowMontageInvalidArgumentException(option,argv[i]);
1652 break;
1653 }
1654 if (LocaleCompare("tint",option+1) == 0)
1655 {
1656 if (*option == '+')
1657 break;
1658 i++;
1659 if (i == (ssize_t) argc)
1660 ThrowMontageException(OptionError,"MissingArgument",option);
1661 if (IsGeometry(argv[i]) == MagickFalse)
1662 ThrowMontageInvalidArgumentException(option,argv[i]);
1663 break;
1664 }
1665 if (LocaleCompare("transform",option+1) == 0)
1666 break;
1667 if (LocaleCompare("transpose",option+1) == 0)
1668 break;
1669 if (LocaleCompare("title",option+1) == 0)
1670 {
1671 (void) CloneString(&montage_info->title,(char *) NULL);
1672 if (*option == '+')
1673 break;
1674 i++;
1675 if (i == (ssize_t) argc)
1676 ThrowMontageException(OptionError,"MissingArgument",option);
1677 (void) CloneString(&montage_info->title,argv[i]);
1678 break;
1679 }
1680 if (LocaleCompare("transform",option+1) == 0)
1681 break;
1682 if (LocaleCompare("transparent",option+1) == 0)
1683 {
1684 transparent_color=(char *) NULL;
1685 i++;
1686 if (i == (ssize_t) argc)
1687 ThrowMontageException(OptionError,"MissingArgument",option);
1688 (void) CloneString(&transparent_color,argv[i]);
1689 break;
1690 }
1691 if (LocaleCompare("transparent-color",option+1) == 0)
1692 {
1693 if (*option == '+')
1694 break;
1695 i++;
1696 if (i == (ssize_t) argc)
1697 ThrowMontageException(OptionError,"MissingArgument",option);
1698 break;
1699 }
1700 if (LocaleCompare("treedepth",option+1) == 0)
1701 {
1702 if (*option == '+')
1703 break;
1704 i++;
1705 if (i == (ssize_t) argc)
1706 ThrowMontageException(OptionError,"MissingArgument",option);
1707 if (IsGeometry(argv[i]) == MagickFalse)
1708 ThrowMontageInvalidArgumentException(option,argv[i]);
1709 break;
1710 }
1711 if (LocaleCompare("trim",option+1) == 0)
1712 break;
1713 if (LocaleCompare("type",option+1) == 0)
1714 {
1715 ssize_t
1716 type;
1717
1718 if (*option == '+')
1719 break;
1720 i++;
1721 if (i == (ssize_t) argc)
1722 ThrowMontageException(OptionError,"MissingArgument",option);
1723 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1724 if (type < 0)
1725 ThrowMontageException(OptionError,"UnrecognizedImageType",
1726 argv[i]);
1727 break;
1728 }
1729 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1730 }
1731 case 'u':
1732 {
1733 if (LocaleCompare("units",option+1) == 0)
1734 {
1735 ssize_t
1736 units;
1737
1738 if (*option == '+')
1739 break;
1740 i++;
1741 if (i == (ssize_t) argc)
1742 ThrowMontageException(OptionError,"MissingArgument",option);
1743 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
1744 argv[i]);
1745 if (units < 0)
1746 ThrowMontageException(OptionError,"UnrecognizedUnitsType",
1747 argv[i]);
1748 break;
1749 }
1750 if (LocaleCompare("unsharp",option+1) == 0)
1751 {
1752 if (*option == '+')
1753 break;
1754 i++;
1755 if (i == (ssize_t) argc)
1756 ThrowMontageException(OptionError,"MissingArgument",option);
1757 if (IsGeometry(argv[i]) == MagickFalse)
1758 ThrowMontageInvalidArgumentException(option,argv[i]);
1759 break;
1760 }
1761 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1762 }
1763 case 'v':
1764 {
1765 if (LocaleCompare("verbose",option+1) == 0)
1766 {
1767 break;
1768 }
1769 if ((LocaleCompare("version",option+1) == 0) ||
1770 (LocaleCompare("-version",option+1) == 0))
1771 {
1772 ListMagickVersion(stdout);
1773 break;
1774 }
1775 if (LocaleCompare("virtual-pixel",option+1) == 0)
1776 {
1777 ssize_t
1778 method;
1779
1780 if (*option == '+')
1781 break;
1782 i++;
1783 if (i == (ssize_t) argc)
1784 ThrowMontageException(OptionError,"MissingArgument",option);
1785 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1786 argv[i]);
1787 if (method < 0)
1788 ThrowMontageException(OptionError,
1789 "UnrecognizedVirtualPixelMethod",argv[i]);
1790 break;
1791 }
1792 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1793 }
1794 case 'w':
1795 {
1796 if (LocaleCompare("white-point",option+1) == 0)
1797 {
1798 if (*option == '+')
1799 break;
1800 i++;
1801 if (i == (ssize_t) argc)
1802 ThrowMontageException(OptionError,"MissingArgument",option);
1803 if (IsGeometry(argv[i]) == MagickFalse)
1804 ThrowMontageInvalidArgumentException(option,argv[i]);
1805 break;
1806 }
1807 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1808 }
1809 case '?':
1810 break;
1811 default:
1812 ThrowMontageException(OptionError,"UnrecognizedOption",option)
1813 }
1814 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1815 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1816 if (fire != MagickFalse)
1817 FireImageStack(MagickTrue,MagickTrue,MagickTrue);
1818 }
1819 if (k != 0)
1820 ThrowMontageException(OptionError,"UnbalancedParenthesis",argv[i]);
1821 if (i-- != (ssize_t) (argc-1))
1822 ThrowMontageException(OptionError,"MissingAnImageFilename",argv[i]);
1823 if (image == (Image *) NULL)
1824 ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]);
1825 FinalizeImageSettings(image_info,image,MagickTrue);
1826 if (image == (Image *) NULL)
1827 ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]);
1828 (void) CopyMagickString(montage_info->filename,argv[argc-1],MagickPathExtent);
1829 montage_image=MontageImageList(image_info,montage_info,image,exception);
1830 if (montage_image == (Image *) NULL)
1831 status=MagickFalse;
1832 else
1833 {
1834 /*
1835 Write image.
1836 */
1837 (void) CopyMagickString(image_info->filename,argv[argc-1],
1838 MagickPathExtent);
1839 (void) CopyMagickString(montage_image->magick_filename,argv[argc-1],
1840 MagickPathExtent);
1841 if (*montage_image->magick == '\0')
1842 (void) CopyMagickString(montage_image->magick,image->magick,
1843 MagickPathExtent);
1844 status&=(MagickStatusType) WriteImages(image_info,montage_image,
1845 argv[argc-1],exception);
1846 if (metadata != (char **) NULL)
1847 {
1848 char
1849 *text;
1850
1851 text=InterpretImageProperties(image_info,montage_image,format,
1852 exception);
1853 if (text == (char *) NULL)
1854 ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
1855 GetExceptionMessage(errno));
1856 (void) ConcatenateString(&(*metadata),text);
1857 text=DestroyString(text);
1858 }
1859 }
1860 DestroyMontage();
1861 return(status != 0 ? MagickTrue : MagickFalse);
1862}