45#include "MagickWand/studio.h"
46#include "MagickWand/MagickWand.h"
47#include "MagickWand/mogrify-private.h"
48#include "MagickCore/string-private.h"
84static MagickBooleanType MontageUsage(
void)
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",
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",
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",
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";
215 ListMagickVersion(stdout);
216 (void) printf(
"Usage: %s [options ...] file [ [options ...] file ...] file\n",
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);
229 "\nIn addition to those listed above, you can specify these standard X\n");
231 "resources as command line options: -background, -bordercolor,\n");
233 "-mattecolor, -borderwidth, -font, or -title\n");
235 "\nBy default, the image format of 'file' is determined by its magic\n");
237 "number. To specify a particular image format, precede the filename\n");
239 "with an image format name and a colon (i.e. ps:image) or specify the\n");
241 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
242 (void) printf(
"'-' for standard input or output.\n");
246WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info,
247 int argc,
char **argv,
char **metadata,ExceptionInfo *exception)
249#define DestroyMontage() \
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); \
260#define ThrowMontageException(asperity,tag,option) \
262 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
265 return(MagickFalse); \
267#define ThrowMontageInvalidArgumentException(option,argument) \
269 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
270 "InvalidArgument","'%s': %s",option,argument); \
272 return(MagickFalse); \
283 *image = (Image *) NULL,
287 image_stack[MaxImageStackDepth+1];
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(),
"...");
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))
329 ListMagickVersion(stdout);
335 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
336 "MissingArgument",
"%s",
"");
337 (void) MontageUsage();
345 montage_image=NewImageList();
346 montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
348 option=(
char *) NULL;
350 respect_parentheses=MagickFalse;
353 transparent_color=(
char *) NULL;
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++)
365 if (LocaleCompare(option,
"(") == 0)
367 FireImageStack(MagickTrue,MagickTrue,pend);
368 if (k == MaxImageStackDepth)
369 ThrowMontageException(OptionError,
"ParenthesisNestedTooDeeply",
374 if (LocaleCompare(option,
")") == 0)
376 FireImageStack(MagickTrue,MagickTrue,MagickTrue);
378 ThrowMontageException(OptionError,
"UnableToParseExpression",option);
382 if (IsCommandOption(option) == MagickFalse)
387 FireImageStack(MagickFalse,MagickFalse,pend);
388 for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++)
397 if ((LocaleCompare(filename,
"--") == 0) && (i < ((ssize_t) argc-1)))
399 (void) CloneString(&image_info->font,montage_info->font);
400 if (first_scene == last_scene)
401 images=ReadImages(image_info,filename,exception);
405 scene_filename[MagickPathExtent];
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);
417 status&=(MagickStatusType) (images != (Image *) NULL) &&
418 (exception->severity < ErrorException);
419 if (images == (Image *) NULL)
421 AppendImageStack(images);
425 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
430 if (LocaleCompare(
"adaptive-sharpen",option+1) == 0)
433 if (i == (ssize_t) argc)
434 ThrowMontageException(OptionError,
"MissingArgument",option);
435 if (IsGeometry(argv[i]) == MagickFalse)
436 ThrowMontageInvalidArgumentException(option,argv[i]);
439 if (LocaleCompare(
"adjoin",option+1) == 0)
441 if (LocaleCompare(
"affine",option+1) == 0)
446 if (i == (ssize_t) argc)
447 ThrowMontageException(OptionError,
"MissingArgument",option);
448 if (IsGeometry(argv[i]) == MagickFalse)
449 ThrowMontageInvalidArgumentException(option,argv[i]);
452 if (LocaleCompare(
"alpha",option+1) == 0)
460 if (i == (ssize_t) argc)
461 ThrowMontageException(OptionError,
"MissingArgument",option);
462 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,
465 ThrowMontageException(OptionError,
466 "UnrecognizedAlphaChannelOption",argv[i]);
469 if (LocaleCompare(
"annotate",option+1) == 0)
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);
483 if (LocaleCompare(
"auto-orient",option+1) == 0)
485 if (LocaleCompare(
"authenticate",option+1) == 0)
490 if (i == (ssize_t) argc)
491 ThrowMontageException(OptionError,
"MissingArgument",option);
494 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
498 if (LocaleCompare(
"background",option+1) == 0)
503 if (i == (ssize_t) argc)
504 ThrowMontageException(OptionError,
"MissingArgument",option);
505 (void) QueryColorCompliance(argv[i],AllCompliance,
506 &montage_info->background_color,exception);
509 if (LocaleCompare(
"blue-primary",option+1) == 0)
514 if (i == (ssize_t) argc)
515 ThrowMontageException(OptionError,
"MissingArgument",option);
516 if (IsGeometry(argv[i]) == MagickFalse)
517 ThrowMontageInvalidArgumentException(option,argv[i]);
520 if (LocaleCompare(
"blur",option+1) == 0)
525 if (i == (ssize_t) argc)
526 ThrowMontageException(OptionError,
"MissingArgument",option);
527 if (IsGeometry(argv[i]) == MagickFalse)
528 ThrowMontageInvalidArgumentException(option,argv[i]);
531 if (LocaleCompare(
"border",option+1) == 0)
535 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
536 montage_info->border_width=0;
541 if (i == (ssize_t) argc)
542 ThrowMontageException(OptionError,
"MissingArgument",option);
543 if (IsGeometry(argv[i]) == MagickFalse)
544 ThrowMontageInvalidArgumentException(option,argv[i]);
546 montage_info->border_width=StringToUnsignedLong(argv[i]);
549 if (LocaleCompare(
"bordercolor",option+1) == 0)
554 if (i == (ssize_t) argc)
555 ThrowMontageException(OptionError,
"MissingArgument",option);
556 (void) QueryColorCompliance(argv[i],AllCompliance,
557 &montage_info->border_color,exception);
560 if (LocaleCompare(
"borderwidth",option+1) == 0)
562 montage_info->border_width=0;
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]);
573 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
577 if (LocaleCompare(
"cache",option+1) == 0)
582 if (i == (ssize_t) argc)
583 ThrowMontageException(OptionError,
"MissingArgument",option);
584 if (IsGeometry(argv[i]) == MagickFalse)
585 ThrowMontageInvalidArgumentException(option,argv[i]);
588 if (LocaleCompare(
"caption",option+1) == 0)
593 if (i == (ssize_t) argc)
594 ThrowMontageException(OptionError,
"MissingArgument",option);
597 if (LocaleCompare(
"channel",option+1) == 0)
605 if (i == (ssize_t) argc)
606 ThrowMontageException(OptionError,
"MissingArgument",option);
607 channel=ParseChannelOption(argv[i]);
609 ThrowMontageException(OptionError,
"UnrecognizedChannelType",
613 if (LocaleCompare(
"clone",option+1) == 0)
619 clone_list=CloneImageList(image,exception);
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);
626 clone_images=CloneImages(clone_list,
"-1",exception);
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);
636 if (clone_images == (Image *) NULL)
637 ThrowMontageException(OptionError,
"NoSuchImage",option);
638 AppendImageStack(clone_images);
639 clone_list=DestroyImageList(clone_list);
642 if (LocaleCompare(
"coalesce",option+1) == 0)
644 if (LocaleCompare(
"colors",option+1) == 0)
649 if (i == (ssize_t) argc)
650 ThrowMontageException(OptionError,
"MissingArgument",option);
651 if (IsGeometry(argv[i]) == MagickFalse)
652 ThrowMontageInvalidArgumentException(option,argv[i]);
655 if (LocaleCompare(
"colorspace",option+1) == 0)
663 if (i == (ssize_t) argc)
664 ThrowMontageException(OptionError,
"MissingArgument",option);
665 colorspace=ParseCommandOption(MagickColorspaceOptions,
666 MagickFalse,argv[i]);
668 ThrowMontageException(OptionError,
"UnrecognizedColorspace",
672 if (LocaleCompare(
"comment",option+1) == 0)
677 if (i == (ssize_t) argc)
678 ThrowMontageException(OptionError,
"MissingArgument",option);
681 if (LocaleCompare(
"compose",option+1) == 0)
689 if (i == (ssize_t) argc)
690 ThrowMontageException(OptionError,
"MissingArgument",option);
691 compose=ParseCommandOption(MagickComposeOptions,MagickFalse,argv[i]);
693 ThrowMontageException(OptionError,
"UnrecognizedComposeOperator",
697 if (LocaleCompare(
"composite",option+1) == 0)
699 if (LocaleCompare(
"compress",option+1) == 0)
707 if (i == (ssize_t) argc)
708 ThrowMontageException(OptionError,
"MissingArgument",option);
709 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
712 ThrowMontageException(OptionError,
"UnrecognizedCompressType",
716 if (LocaleCompare(
"concurrent",option+1) == 0)
718 if (LocaleCompare(
"crop",option+1) == 0)
723 if (i == (ssize_t) argc)
724 ThrowMontageException(OptionError,
"MissingArgument",option);
725 if (IsGeometry(argv[i]) == MagickFalse)
726 ThrowMontageInvalidArgumentException(option,argv[i]);
729 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
733 if (LocaleCompare(
"debug",option+1) == 0)
741 if (i == (ssize_t) argc)
742 ThrowMontageException(OptionError,
"MissingArgument",option);
743 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
745 ThrowMontageException(OptionError,
"UnrecognizedEventType",
747 (void) SetLogEventMask(argv[i]);
750 if (LocaleCompare(
"define",option+1) == 0)
753 if (i == (ssize_t) argc)
754 ThrowMontageException(OptionError,
"MissingArgument",option);
760 define=GetImageOption(image_info,argv[i]);
761 if (define == (
const char *) NULL)
762 ThrowMontageException(OptionError,
"NoSuchOption",argv[i]);
767 if (LocaleCompare(
"delay",option+1) == 0)
772 if (i == (ssize_t) argc)
773 ThrowMontageException(OptionError,
"MissingArgument",option);
774 if (IsGeometry(argv[i]) == MagickFalse)
775 ThrowMontageInvalidArgumentException(option,argv[i]);
778 if (LocaleCompare(
"delete",option+1) == 0)
783 if (i == (ssize_t) argc)
784 ThrowMontageException(OptionError,
"MissingArgument",option);
785 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
786 ThrowMontageInvalidArgumentException(option,argv[i]);
789 if (LocaleCompare(
"density",option+1) == 0)
794 if (i == (ssize_t) argc)
795 ThrowMontageException(OptionError,
"MissingArgument",option);
796 if (IsGeometry(argv[i]) == MagickFalse)
797 ThrowMontageInvalidArgumentException(option,argv[i]);
800 if (LocaleCompare(
"depth",option+1) == 0)
805 if (i == (ssize_t) argc)
806 ThrowMontageException(OptionError,
"MissingArgument",option);
807 if (IsGeometry(argv[i]) == MagickFalse)
808 ThrowMontageInvalidArgumentException(option,argv[i]);
811 if (LocaleCompare(
"display",option+1) == 0)
816 if (i == (ssize_t) argc)
817 ThrowMontageException(OptionError,
"MissingArgument",option);
820 if (LocaleCompare(
"dispose",option+1) == 0)
828 if (i == (ssize_t) argc)
829 ThrowMontageException(OptionError,
"MissingArgument",option);
830 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,
833 ThrowMontageException(OptionError,
"UnrecognizedDisposeMethod",
837 if (LocaleCompare(
"distort",option+1) == 0)
843 if (i == (ssize_t) argc)
844 ThrowMontageException(OptionError,
"MissingArgument",option);
845 op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]);
847 ThrowMontageException(OptionError,
"UnrecognizedDistortMethod",
850 if (i == (ssize_t) argc)
851 ThrowMontageException(OptionError,
"MissingArgument",option);
854 if (LocaleCompare(
"dither",option+1) == 0)
862 if (i == (ssize_t) argc)
863 ThrowMontageException(OptionError,
"MissingArgument",option);
864 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
866 ThrowMontageException(OptionError,
"UnrecognizedDitherMethod",
870 if (LocaleCompare(
"draw",option+1) == 0)
875 if (i == (ssize_t) argc)
876 ThrowMontageException(OptionError,
"MissingArgument",option);
879 if (LocaleCompare(
"duplicate",option+1) == 0)
884 if (i == (ssize_t) argc)
885 ThrowMontageException(OptionError,
"MissingArgument",option);
886 if (IsGeometry(argv[i]) == MagickFalse)
887 ThrowMontageInvalidArgumentException(option,argv[i]);
890 if (LocaleCompare(
"duration",option+1) == 0)
895 if (i == (ssize_t) argc)
896 ThrowMontageException(OptionError,
"MissingArgument",option);
897 if (IsGeometry(argv[i]) == MagickFalse)
898 ThrowMontageInvalidArgumentException(option,argv[i]);
901 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
905 if (LocaleCompare(
"encoding",option+1) == 0)
910 if (i == (ssize_t) argc)
911 ThrowMontageException(OptionError,
"MissingArgument",option);
914 if (LocaleCompare(
"endian",option+1) == 0)
922 if (i == (ssize_t) argc)
923 ThrowMontageException(OptionError,
"MissingArgument",option);
924 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
927 ThrowMontageException(OptionError,
"UnrecognizedEndianType",
931 if (LocaleCompare(
"extent",option+1) == 0)
936 if (i == (ssize_t) argc)
937 ThrowMontageException(OptionError,
"MissingArgument",option);
938 if (IsGeometry(argv[i]) == MagickFalse)
939 ThrowMontageInvalidArgumentException(option,argv[i]);
942 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
946 if (LocaleCompare(
"family",option+1) == 0)
951 if (i == (ssize_t) argc)
952 ThrowMontageException(OptionError,
"MissingArgument",option);
955 if (LocaleCompare(
"fill",option+1) == 0)
957 (void) QueryColorCompliance(
"none",AllCompliance,
958 &montage_info->fill,exception);
962 if (i == (ssize_t) argc)
963 ThrowMontageException(OptionError,
"MissingArgument",option);
964 (void) QueryColorCompliance(argv[i],AllCompliance,
965 &montage_info->fill,exception);
968 if (LocaleCompare(
"filter",option+1) == 0)
976 if (i == (ssize_t) argc)
977 ThrowMontageException(OptionError,
"MissingArgument",option);
978 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
980 ThrowMontageException(OptionError,
"UnrecognizedImageFilter",
984 if (LocaleCompare(
"flatten",option+1) == 0)
986 if (LocaleCompare(
"flip",option+1) == 0)
988 if (LocaleCompare(
"flop",option+1) == 0)
990 if (LocaleCompare(
"font",option+1) == 0)
995 if (i == (ssize_t) argc)
996 ThrowMontageException(OptionError,
"MissingArgument",option);
997 (void) CloneString(&montage_info->font,argv[i]);
1000 if (LocaleCompare(
"format",option+1) == 0)
1005 if (i == (ssize_t) argc)
1006 ThrowMontageException(OptionError,
"MissingArgument",option);
1010 if (LocaleCompare(
"frame",option+1) == 0)
1014 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1015 (void) CloneString(&montage_info->frame,(
char *) NULL);
1020 if (i == (ssize_t) argc)
1021 ThrowMontageException(OptionError,
"MissingArgument",option);
1022 if (IsGeometry(argv[i]) == MagickFalse)
1023 ThrowMontageInvalidArgumentException(option,argv[i]);
1025 (void) CloneString(&montage_info->frame,argv[i]);
1028 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1032 if (LocaleCompare(
"gamma",option+1) == 0)
1035 if (i == (ssize_t) argc)
1036 ThrowMontageException(OptionError,
"MissingArgument",option);
1037 if (IsGeometry(argv[i]) == MagickFalse)
1038 ThrowMontageInvalidArgumentException(option,argv[i]);
1041 if (LocaleCompare(
"geometry",option+1) == 0)
1043 (void) CloneString(&montage_info->geometry,(
char *) NULL);
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]);
1054 if (LocaleCompare(
"gravity",option+1) == 0)
1059 montage_info->gravity=UndefinedGravity;
1063 if (i == (ssize_t) argc)
1064 ThrowMontageException(OptionError,
"MissingArgument",option);
1065 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1068 ThrowMontageException(OptionError,
"UnrecognizedGravityType",
1070 montage_info->gravity=(GravityType) gravity;
1073 if (LocaleCompare(
"green-primary",option+1) == 0)
1078 if (i == (ssize_t) argc)
1079 ThrowMontageException(OptionError,
"MissingArgument",option);
1080 if (IsGeometry(argv[i]) == MagickFalse)
1081 ThrowMontageInvalidArgumentException(option,argv[i]);
1084 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1088 if ((LocaleCompare(
"help",option+1) == 0) ||
1089 (LocaleCompare(
"-help",option+1) == 0))
1092 return(MontageUsage());
1094 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1098 if (LocaleCompare(
"identify",option+1) == 0)
1100 if (LocaleCompare(
"insert",option+1) == 0)
1105 if (i == (ssize_t) argc)
1106 ThrowMontageException(OptionError,
"MissingArgument",option);
1107 if (IsGeometry(argv[i]) == MagickFalse)
1108 ThrowMontageInvalidArgumentException(option,argv[i]);
1111 if (LocaleCompare(
"interlace",option+1) == 0)
1119 if (i == (ssize_t) argc)
1120 ThrowMontageException(OptionError,
"MissingArgument",option);
1121 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1124 ThrowMontageException(OptionError,
"UnrecognizedInterlaceType",
1128 if (LocaleCompare(
"interpolate",option+1) == 0)
1136 if (i == (ssize_t) argc)
1137 ThrowMontageException(OptionError,
"MissingArgument",option);
1138 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1140 if (interpolate < 0)
1141 ThrowMontageException(OptionError,
"UnrecognizedInterpolateMethod",
1145 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1149 if (LocaleCompare(
"kerning",option+1) == 0)
1154 if (i == (ssize_t) argc)
1155 ThrowMontageException(OptionError,
"MissingArgument",option);
1156 if (IsGeometry(argv[i]) == MagickFalse)
1157 ThrowMontageInvalidArgumentException(option,argv[i]);
1160 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1164 if (LocaleCompare(
"label",option+1) == 0)
1169 if (i == (ssize_t) argc)
1170 ThrowMontageException(OptionError,
"MissingArgument",option);
1173 if (LocaleCompare(
"layers",option+1) == 0)
1181 if (i == (ssize_t) argc)
1182 ThrowMontageException(OptionError,
"MissingArgument",option);
1183 type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]);
1185 ThrowMontageException(OptionError,
"UnrecognizedLayerMethod",
1189 if (LocaleCompare(
"limit",option+1) == 0)
1203 if (i == (ssize_t) argc)
1204 ThrowMontageException(OptionError,
"MissingArgument",option);
1205 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1208 ThrowMontageException(OptionError,
"UnrecognizedResourceType",
1211 if (i == (ssize_t) argc)
1212 ThrowMontageException(OptionError,
"MissingArgument",option);
1213 value=StringToDouble(argv[i],&p);
1215 if ((p == argv[i]) && (LocaleCompare(
"unlimited",argv[i]) != 0))
1216 ThrowMontageInvalidArgumentException(option,argv[i]);
1219 if (LocaleCompare(
"list",option+1) == 0)
1227 if (i == (ssize_t) argc)
1228 ThrowMontageException(OptionError,
"MissingArgument",option);
1229 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1231 ThrowMontageException(OptionError,
"UnrecognizedListType",argv[i]);
1232 status=MogrifyImageInfo(image_info,(
int) (i-j+1),(
const char **)
1235 return(status == 0 ? MagickFalse : MagickTrue);
1237 if (LocaleCompare(
"log",option+1) == 0)
1242 if ((i == (ssize_t) argc) ||
1243 (strchr(argv[i],
'%') == (
char *) NULL))
1244 ThrowMontageException(OptionError,
"MissingArgument",option);
1247 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1251 if (LocaleCompare(
"matte",option+1) == 0)
1253 if (LocaleCompare(
"mattecolor",option+1) == 0)
1258 if (i == (ssize_t) argc)
1259 ThrowMontageException(OptionError,
"MissingArgument",option);
1260 (void) QueryColorCompliance(argv[i],AllCompliance,
1261 &montage_info->matte_color,exception);
1264 if (LocaleCompare(
"mode",option+1) == 0)
1269 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1273 if (i == (ssize_t) argc)
1274 ThrowMontageException(OptionError,
"MissingArgument",option);
1276 if (LocaleCompare(
"frame",argv[i]) == 0)
1279 (void) CloneString(&montage_info->frame,
"15x15+3+3");
1280 montage_info->shadow=MagickTrue;
1283 if (LocaleCompare(
"unframe",argv[i]) == 0)
1286 montage_info->frame=(
char *) NULL;
1287 montage_info->shadow=MagickFalse;
1288 montage_info->border_width=0;
1291 if (LocaleCompare(
"concatenate",argv[i]) == 0)
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;
1301 if (mode == UndefinedMode)
1302 ThrowMontageException(OptionError,
"UnrecognizedImageMode",
1306 if (LocaleCompare(
"monitor",option+1) == 0)
1308 if (LocaleCompare(
"monochrome",option+1) == 0)
1310 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1314 if (LocaleCompare(
"noop",option+1) == 0)
1316 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1320 if (LocaleCompare(
"page",option+1) == 0)
1325 if (i == (ssize_t) argc)
1326 ThrowMontageException(OptionError,
"MissingArgument",option);
1329 if (LocaleCompare(
"pointsize",option+1) == 0)
1331 montage_info->pointsize=12;
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);
1342 if (LocaleCompare(
"polaroid",option+1) == 0)
1347 if (i == (ssize_t) argc)
1348 ThrowMontageException(OptionError,
"MissingArgument",option);
1349 if (IsGeometry(argv[i]) == MagickFalse)
1350 ThrowMontageInvalidArgumentException(option,argv[i]);
1353 if (LocaleCompare(
"precision",option+1) == 0)
1358 if (i == (ssize_t) argc)
1359 ThrowMontageException(OptionError,
"MissingArgument",option);
1360 if (IsGeometry(argv[i]) == MagickFalse)
1361 ThrowMontageInvalidArgumentException(option,argv[i]);
1364 if (LocaleCompare(
"profile",option+1) == 0)
1367 if (i == (ssize_t) argc)
1368 ThrowMontageException(OptionError,
"MissingArgument",option);
1371 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1375 if (LocaleCompare(
"quality",option+1) == 0)
1380 if (i == (ssize_t) argc)
1381 ThrowMontageException(OptionError,
"MissingArgument",option);
1382 if (IsGeometry(argv[i]) == MagickFalse)
1383 ThrowMontageInvalidArgumentException(option,argv[i]);
1386 if (LocaleCompare(
"quantize",option+1) == 0)
1394 if (i == (ssize_t) argc)
1395 ThrowMontageException(OptionError,
"MissingArgument",option);
1396 colorspace=ParseCommandOption(MagickColorspaceOptions,
1397 MagickFalse,argv[i]);
1399 ThrowMontageException(OptionError,
"UnrecognizedColorspace",
1403 if (LocaleCompare(
"quiet",option+1) == 0)
1405 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1409 if (LocaleCompare(
"red-primary",option+1) == 0)
1414 if (i == (ssize_t) argc)
1415 ThrowMontageException(OptionError,
"MissingArgument",option);
1416 if (IsGeometry(argv[i]) == MagickFalse)
1417 ThrowMontageInvalidArgumentException(option,argv[i]);
1420 if (LocaleCompare(
"regard-warnings",option+1) == 0)
1422 if (LocaleCompare(
"render",option+1) == 0)
1424 if (LocaleCompare(
"repage",option+1) == 0)
1429 if (i == (ssize_t) argc)
1430 ThrowMontageException(OptionError,
"MissingArgument",option);
1431 if (IsGeometry(argv[i]) == MagickFalse)
1432 ThrowMontageInvalidArgumentException(option,argv[i]);
1435 if (LocaleCompare(
"resize",option+1) == 0)
1440 if (i == (ssize_t) argc)
1441 ThrowMontageException(OptionError,
"MissingArgument",option);
1442 if (IsGeometry(argv[i]) == MagickFalse)
1443 ThrowMontageInvalidArgumentException(option,argv[i]);
1446 if (LocaleNCompare(
"respect-parentheses",option+1,17) == 0)
1448 respect_parentheses=(*option ==
'-') ? MagickTrue : MagickFalse;
1451 if (LocaleCompare(
"reverse",option+1) == 0)
1453 if (LocaleCompare(
"rotate",option+1) == 0)
1456 if (i == (ssize_t) argc)
1457 ThrowMontageException(OptionError,
"MissingArgument",option);
1458 if (IsGeometry(argv[i]) == MagickFalse)
1459 ThrowMontageInvalidArgumentException(option,argv[i]);
1462 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1466 if (LocaleCompare(
"sampling-factor",option+1) == 0)
1471 if (i == (ssize_t) argc)
1472 ThrowMontageException(OptionError,
"MissingArgument",option);
1473 if (IsGeometry(argv[i]) == MagickFalse)
1474 ThrowMontageInvalidArgumentException(option,argv[i]);
1477 if (LocaleCompare(
"scale",option+1) == 0)
1482 if (i == (ssize_t) argc)
1483 ThrowMontageException(OptionError,
"MissingArgument",option);
1484 if (IsGeometry(argv[i]) == MagickFalse)
1485 ThrowMontageInvalidArgumentException(option,argv[i]);
1488 if (LocaleCompare(
"scenes",option+1) == 0)
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);
1504 if (LocaleCompare(
"seed",option+1) == 0)
1509 if (i == (ssize_t) argc)
1510 ThrowMontageException(OptionError,
"MissingArgument",option);
1511 if (IsGeometry(argv[i]) == MagickFalse)
1512 ThrowMontageInvalidArgumentException(option,argv[i]);
1515 if (LocaleCompare(
"set",option+1) == 0)
1518 if (i == (ssize_t) argc)
1519 ThrowMontageException(OptionError,
"MissingArgument",option);
1523 if (i == (ssize_t) argc)
1524 ThrowMontageException(OptionError,
"MissingArgument",option);
1527 if (LocaleCompare(
"shadow",option+1) == 0)
1531 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1532 montage_info->shadow=(*option ==
'-') ? MagickTrue :
1539 if (i == (ssize_t) argc)
1540 ThrowMontageException(OptionError,
"MissingArgument",option);
1541 if (IsGeometry(argv[i]) == MagickFalse)
1542 ThrowMontageInvalidArgumentException(option,argv[i]);
1545 if (LocaleCompare(
"sharpen",option+1) == 0)
1550 if ((i == (ssize_t) argc) || (IsGeometry(argv[i]) == MagickFalse))
1551 ThrowMontageException(OptionError,
"MissingArgument",option);
1554 if (LocaleCompare(
"size",option+1) == 0)
1559 if (i == (ssize_t) argc)
1560 ThrowMontageException(OptionError,
"MissingArgument",option);
1561 if (IsGeometry(argv[i]) == MagickFalse)
1562 ThrowMontageInvalidArgumentException(option,argv[i]);
1565 if (LocaleCompare(
"stroke",option+1) == 0)
1567 (void) QueryColorCompliance(
"none",AllCompliance,
1568 &montage_info->stroke,exception);
1572 if (i == (ssize_t) argc)
1573 ThrowMontageException(OptionError,
"MissingArgument",option);
1574 (void) QueryColorCompliance(argv[i],AllCompliance,
1575 &montage_info->stroke,exception);
1578 if (LocaleCompare(
"strip",option+1) == 0)
1580 if (LocaleCompare(
"strokewidth",option+1) == 0)
1585 if (i == (ssize_t) argc)
1586 ThrowMontageException(OptionError,
"MissingArgument",option);
1587 if (IsGeometry(argv[i]) == MagickFalse)
1588 ThrowMontageInvalidArgumentException(option,argv[i]);
1591 if (LocaleCompare(
"support",option+1) == 0)
1596 if (LocaleCompare(
"swap",option+1) == 0)
1601 if (i == (ssize_t) argc)
1602 ThrowMontageException(OptionError,
"MissingArgument",option);
1603 if (IsGeometry(argv[i]) == MagickFalse)
1604 ThrowMontageInvalidArgumentException(option,argv[i]);
1607 if (LocaleCompare(
"synchronize",option+1) == 0)
1609 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1613 if (LocaleCompare(
"taint",option+1) == 0)
1615 if (LocaleCompare(
"texture",option+1) == 0)
1617 (void) CloneString(&montage_info->texture,(
char *) NULL);
1621 if (i == (ssize_t) argc)
1622 ThrowMontageException(OptionError,
"MissingArgument",option);
1623 (void) CloneString(&montage_info->texture,argv[i]);
1626 if (LocaleCompare(
"thumbnail",option+1) == 0)
1631 if (i == (ssize_t) argc)
1632 ThrowMontageException(OptionError,
"MissingArgument",option);
1633 if (IsGeometry(argv[i]) == MagickFalse)
1634 ThrowMontageInvalidArgumentException(option,argv[i]);
1637 if (LocaleCompare(
"tile",option+1) == 0)
1641 (void) CopyMagickString(argv[i]+1,
"sans",MagickPathExtent);
1642 (void) CloneString(&montage_info->tile,(
char *) NULL);
1647 if (i == (ssize_t) argc)
1648 ThrowMontageException(OptionError,
"MissingArgument",option);
1649 if (IsGeometry(argv[i]) == MagickFalse)
1650 ThrowMontageInvalidArgumentException(option,argv[i]);
1652 (void) CloneString(&montage_info->tile,argv[i]);
1655 if (LocaleCompare(
"tile-offset",option+1) == 0)
1660 if (i == (ssize_t) argc)
1661 ThrowMontageException(OptionError,
"MissingArgument",option);
1662 if (IsGeometry(argv[i]) == MagickFalse)
1663 ThrowMontageInvalidArgumentException(option,argv[i]);
1666 if (LocaleCompare(
"tint",option+1) == 0)
1671 if (i == (ssize_t) argc)
1672 ThrowMontageException(OptionError,
"MissingArgument",option);
1673 if (IsGeometry(argv[i]) == MagickFalse)
1674 ThrowMontageInvalidArgumentException(option,argv[i]);
1677 if (LocaleCompare(
"transform",option+1) == 0)
1679 if (LocaleCompare(
"transpose",option+1) == 0)
1681 if (LocaleCompare(
"title",option+1) == 0)
1683 (void) CloneString(&montage_info->title,(
char *) NULL);
1687 if (i == (ssize_t) argc)
1688 ThrowMontageException(OptionError,
"MissingArgument",option);
1689 (void) CloneString(&montage_info->title,argv[i]);
1692 if (LocaleCompare(
"transform",option+1) == 0)
1694 if (LocaleCompare(
"transparent",option+1) == 0)
1696 transparent_color=(
char *) NULL;
1698 if (i == (ssize_t) argc)
1699 ThrowMontageException(OptionError,
"MissingArgument",option);
1700 (void) CloneString(&transparent_color,argv[i]);
1703 if (LocaleCompare(
"transparent-color",option+1) == 0)
1708 if (i == (ssize_t) argc)
1709 ThrowMontageException(OptionError,
"MissingArgument",option);
1712 if (LocaleCompare(
"treedepth",option+1) == 0)
1717 if (i == (ssize_t) argc)
1718 ThrowMontageException(OptionError,
"MissingArgument",option);
1719 if (IsGeometry(argv[i]) == MagickFalse)
1720 ThrowMontageInvalidArgumentException(option,argv[i]);
1723 if (LocaleCompare(
"trim",option+1) == 0)
1725 if (LocaleCompare(
"type",option+1) == 0)
1733 if (i == (ssize_t) argc)
1734 ThrowMontageException(OptionError,
"MissingArgument",option);
1735 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1737 ThrowMontageException(OptionError,
"UnrecognizedImageType",
1741 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1745 if (LocaleCompare(
"units",option+1) == 0)
1753 if (i == (ssize_t) argc)
1754 ThrowMontageException(OptionError,
"MissingArgument",option);
1755 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
1758 ThrowMontageException(OptionError,
"UnrecognizedUnitsType",
1762 if (LocaleCompare(
"unsharp",option+1) == 0)
1767 if (i == (ssize_t) argc)
1768 ThrowMontageException(OptionError,
"MissingArgument",option);
1769 if (IsGeometry(argv[i]) == MagickFalse)
1770 ThrowMontageInvalidArgumentException(option,argv[i]);
1773 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1777 if (LocaleCompare(
"verbose",option+1) == 0)
1781 if ((LocaleCompare(
"version",option+1) == 0) ||
1782 (LocaleCompare(
"-version",option+1) == 0))
1784 ListMagickVersion(stdout);
1787 if (LocaleCompare(
"virtual-pixel",option+1) == 0)
1795 if (i == (ssize_t) argc)
1796 ThrowMontageException(OptionError,
"MissingArgument",option);
1797 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1800 ThrowMontageException(OptionError,
1801 "UnrecognizedVirtualPixelMethod",argv[i]);
1804 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1808 if (LocaleCompare(
"white-point",option+1) == 0)
1813 if (i == (ssize_t) argc)
1814 ThrowMontageException(OptionError,
"MissingArgument",option);
1815 if (IsGeometry(argv[i]) == MagickFalse)
1816 ThrowMontageInvalidArgumentException(option,argv[i]);
1819 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1824 ThrowMontageException(OptionError,
"UnrecognizedOption",option)
1826 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1827 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1828 if (fire != MagickFalse)
1829 FireImageStack(MagickTrue,MagickTrue,MagickTrue);
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)
1849 (void) CopyMagickString(image_info->filename,argv[argc-1],
1851 (void) CopyMagickString(montage_image->magick_filename,argv[argc-1],
1853 if (*montage_image->magick ==
'\0')
1854 (void) CopyMagickString(montage_image->magick,image->magick,
1856 status&=(MagickStatusType) WriteImages(image_info,montage_image,
1857 argv[argc-1],exception);
1858 if (metadata != (
char **) NULL)
1863 text=InterpretImageProperties(image_info,montage_image,format,
1865 if (text == (
char *) NULL)
1866 ThrowMontageException(ResourceLimitError,
"MemoryAllocationFailed",
1867 GetExceptionMessage(errno));
1868 (void) ConcatenateString(&(*metadata),text);
1869 text=DestroyString(text);
1873 return(status != 0 ? MagickTrue : MagickFalse);