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