MagickWand  6.7.5
montage.c
Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %               M   M   OOO   N   N  TTTTT   AAA    GGGG  EEEEE               %
00007 %               MM MM  O   O  NN  N    T    A   A  G      E                   %
00008 %               M M M  O   O  N N N    T    AAAAA  G  GG  EEE                 %
00009 %               M   M  O   O  N  NN    T    A   A  G   G  E                   %
00010 %               M   M   OOO   N   N    T    A   A   GGG   EEEEE               %
00011 %                                                                             %
00012 %                                                                             %
00013 %                MagickWand Methods to Create Image Thumbnails                %
00014 %                                                                             %
00015 %                              Software Design                                %
00016 %                                John Cristy                                  %
00017 %                                 July 1992                                   %
00018 %                                                                             %
00019 %                                                                             %
00020 %  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
00021 %  dedicated to making software imaging solutions freely available.           %
00022 %                                                                             %
00023 %  You may not use this file except in compliance with the License.  You may  %
00024 %  obtain a copy of the License at                                            %
00025 %                                                                             %
00026 %    http://www.imagemagick.org/script/license.php                            %
00027 %                                                                             %
00028 %  Unless required by applicable law or agreed to in writing, software        %
00029 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00030 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00031 %  See the License for the specific language governing permissions and        %
00032 %  limitations under the License.                                             %
00033 %                                                                             %
00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00035 %
00036 %  Use the montage program to create a composite image by combining several
00037 %  separate images. The images are tiled on the composite image optionally
00038 %  adorned with a border, frame, image name, and more.
00039 %
00040 */
00041 
00042 /*
00043   Include declarations.
00044 */
00045 #include "MagickWand/studio.h"
00046 #include "MagickWand/MagickWand.h"
00047 #include "MagickWand/mogrify-private.h"
00048 #include "MagickCore/string-private.h"
00049 
00050 /*
00051 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00052 %                                                                             %
00053 %                                                                             %
00054 %                                                                             %
00055 +    M o n t a g e I m a g e C o m m a n d                                    %
00056 %                                                                             %
00057 %                                                                             %
00058 %                                                                             %
00059 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00060 %
00061 %  MontageImageCommand() reads one or more images, applies one or more image
00062 %  processing operations, and writes out the image in the same or
00063 %  differing format.
00064 %
00065 %  The format of the MontageImageCommand method is:
00066 %
00067 %      MagickBooleanType MontageImageCommand(ImageInfo *image_info,int argc,
00068 %        char **argv,char **metadata,ExceptionInfo *exception)
00069 %
00070 %  A description of each parameter follows:
00071 %
00072 %    o image_info: the image info.
00073 %
00074 %    o argc: the number of elements in the argument vector.
00075 %
00076 %    o argv: A text array containing the command line arguments.
00077 %
00078 %    o metadata: any metadata is returned here.
00079 %
00080 %    o exception: return any errors or warnings in this structure.
00081 %
00082 */
00083 
00084 static MagickBooleanType MontageUsage(void)
00085 {
00086   const char
00087     **p;
00088 
00089   static const char
00090     *miscellaneous[]=
00091     {
00092       "-debug events        display copious debugging information",
00093       "-help                print program options",
00094       "-list type           print a list of supported option arguments",
00095       "-log format          format of debugging information",
00096       "-version             print version information",
00097       (char *) NULL
00098     },
00099     *operators[]=
00100     {
00101       "-adaptive-sharpen geometry",
00102       "                     adaptively sharpen pixels; increase effect near edges",
00103       " annotate geometry text",
00104       "                     annotate the image with text",
00105       "-auto-orient         automagically orient image",
00106       "-blur geometry      reduce image noise and reduce detail levels",
00107       "-border geometry     surround image with a border of color",
00108       "-crop geometry       preferred size and location of the cropped image",
00109       "-extent geometry     set the image size",
00110       "-flatten             flatten a sequence of images",
00111       "-flip                flip image in the vertical direction",
00112       "-flop                flop image in the horizontal direction",
00113       "-frame geometry      surround image with an ornamental border",
00114       "-monochrome          transform image to black and white",
00115       "-polaroid angle      simulate a Polaroid picture",
00116       "-repage geometry     size and location of an image canvas (operator)",
00117       "-resize geometry     resize the image",
00118       "-rotate degrees      apply Paeth rotation to the image",
00119       "-strip               strip image of all profiles and comments",
00120       "-transform           affine transform image",
00121       "-transpose           flip image vertically and rotate 90 degrees",
00122       "-transparent color   make this color transparent within the image",
00123       "-type type           image type",
00124       "-unsharp geometry    sharpen the image",
00125       (char *) NULL
00126     },
00127     *settings[]=
00128     {
00129       "-adjoin              join images into a single multi-image file",
00130       "-affine matrix       affine transform matrix",
00131       "-alpha option        on, activate, off, deactivate, set, opaque, copy",
00132       "                     transparent, extract, background, or shape",
00133       "-authenticate password",
00134       "                     decipher image with this password",
00135       "-blue-primary point  chromaticity blue primary point",
00136       "-bordercolor color   border color",
00137       "-caption string      assign a caption to an image",
00138       "-channel type        apply option to select image channels",
00139       "-colors value        preferred number of colors in the image",
00140       "-colorspace type     alternate image colorsapce",
00141       "-comment string      annotate image with comment",
00142       "-compose operator    composite operator",
00143       "-compress type       type of pixel compression when writing the image",
00144       "-define format:option",
00145       "                     define one or more image format options",
00146       "-density geometry    horizontal and vertical density of the image",
00147       "-depth value         image depth",
00148       "-display server      query font from this X server",
00149       "-dispose method      layer disposal method",
00150       "-dither method       apply error diffusion to image",
00151       "-draw string         annotate the image with a graphic primitive",
00152       "-encoding type       text encoding type",
00153       "-endian type         endianness (MSB or LSB) of the image",
00154       "-extract geometry    extract area from image",
00155       "-fill color          color to use when filling a graphic primitive",
00156       "-filter type         use this filter when resizing an image",
00157       "-font name           render text with this font",
00158       "-format \"string\"     output formatted image characteristics",
00159       "-gamma value         level of gamma correction",
00160       "-geometry geometry   preferred tile and border sizes",
00161       "-gravity direction   which direction to gravitate towards",
00162       "-green-primary point chromaticity green primary point",
00163       "-identify            identify the format and characteristics of the image",
00164       "-interlace type      type of image interlacing scheme",
00165       "-interpolate method  pixel color interpolation method",
00166       "-kerning value       set the space between two letters",
00167       "-label string        assign a label to an image",
00168       "-limit type value    pixel cache resource limit",
00169       "-mattecolor color    frame color",
00170       "-mode type           framing style",
00171       "-monitor             monitor progress",
00172       "-origin geometry     image origin",
00173       "-page geometry       size and location of an image canvas (setting)",
00174       "-pointsize value     font point size",
00175       "-profile filename    add, delete, or apply an image profile",
00176       "-quality value       JPEG/MIFF/PNG compression level",
00177       "-quantize colorspace reduce colors in this colorspace",
00178       "-quiet               suppress all warning messages",
00179       "-red-primary point   chromaticity red primary point",
00180       "-regard-warnings     pay attention to warning messages",
00181       "-respect-parentheses settings remain in effect until parenthesis boundary",
00182       "-sampling-factor geometry",
00183       "                     horizontal and vertical sampling factor",
00184       "-scenes range        image scene range",
00185       "-seed value          seed a new sequence of pseudo-random numbers",
00186       "-set attribute value set an image attribute",
00187       "-shadow              add a shadow beneath a tile to simulate depth",
00188       "-size geometry       width and height of image",
00189       "-stroke color        color to use when stroking a graphic primitive",
00190       "-synchronize         synchronize image to storage device",
00191       "-taint               declare the image as modified",
00192       "-texture filename    name of texture to tile onto the image background",
00193       "-thumbnail geometry  create a thumbnail of the image",
00194       "-tile geometry       number of tiles per row and column",
00195       "-title string        decorate the montage image with a title",
00196       "-transparent-color color",
00197       "                     transparent color",
00198       "-treedepth value     color tree depth",
00199       "-trim                trim image edges",
00200       "-units type          the units of image resolution",
00201       "-verbose             print detailed information about the image",
00202       "-virtual-pixel method",
00203       "                     virtual pixel access method",
00204       "-white-point point   chromaticity white point",
00205       (char *) NULL
00206     },
00207     *sequence_operators[]=
00208     {
00209       "-coalesce            merge a sequence of images",
00210       "-composite           composite image",
00211       (char *) NULL
00212     },
00213     *stack_operators[]=
00214     {
00215       "-clone indexes       clone an image",
00216       "-duplicate count,indexes",
00217       "                     duplicate an image one or more times",
00218       (char *) NULL
00219     };
00220 
00221   (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
00222   (void) printf("Copyright: %s\n",GetMagickCopyright());
00223   (void) printf("Features: %s\n\n",GetMagickFeatures());
00224   (void) printf("Usage: %s [options ...] file [ [options ...] file ...] file\n",
00225     GetClientName());
00226   (void) printf("\nImage Settings:\n");
00227   for (p=settings; *p != (char *) NULL; p++)
00228     (void) printf("  %s\n",*p);
00229   (void) printf("\nImage Operators:\n");
00230   for (p=operators; *p != (char *) NULL; p++)
00231     (void) printf("  %s\n",*p);
00232   (void) printf("\nImage Sequence Operators:\n");
00233   for (p=sequence_operators; *p != (char *) NULL; p++)
00234     (void) printf("  %s\n",*p);
00235   (void) printf("\nImage Stack Operators:\n");
00236   for (p=stack_operators; *p != (char *) NULL; p++)
00237     (void) printf("  %s\n",*p);
00238   (void) printf("\nMiscellaneous Options:\n");
00239   for (p=miscellaneous; *p != (char *) NULL; p++)
00240     (void) printf("  %s\n",*p);
00241   (void) printf(
00242     "\nIn addition to those listed above, you can specify these standard X\n");
00243   (void) printf(
00244     "resources as command line options:  -background, -bordercolor,\n");
00245   (void) printf(
00246     "-borderwidth, -font, -mattecolor, or -title\n");
00247   (void) printf(
00248     "\nBy default, the image format of `file' is determined by its magic\n");
00249   (void) printf(
00250     "number.  To specify a particular image format, precede the filename\n");
00251   (void) printf(
00252     "with an image format name and a colon (i.e. ps:image) or specify the\n");
00253   (void) printf(
00254     "image type as the filename suffix (i.e. image.ps).  Specify 'file' as\n");
00255   (void) printf("'-' for standard input or output.\n");
00256   return(MagickFalse);
00257 }
00258 
00259 WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info,
00260   int argc,char **argv,char **metadata,ExceptionInfo *exception)
00261 {
00262 #define DestroyMontage() \
00263 { \
00264   if (montage_image != (Image *) NULL) \
00265     montage_image=DestroyImageList(montage_image); \
00266   DestroyImageStack(); \
00267   for (i=0; i < (ssize_t) argc; i++) \
00268     argv[i]=DestroyString(argv[i]); \
00269   argv=(char **) RelinquishMagickMemory(argv); \
00270 }
00271 #define ThrowMontageException(asperity,tag,option) \
00272 { \
00273   (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
00274     option); \
00275   DestroyMontage(); \
00276   return(MagickFalse); \
00277 }
00278 #define ThrowMontageInvalidArgumentException(option,argument) \
00279 { \
00280   (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
00281     "InvalidArgument","`%s': %s",option,argument); \
00282   DestroyMontage(); \
00283   return(MagickFalse); \
00284 }
00285 
00286   char
00287     *option,
00288     *transparent_color;
00289 
00290   const char
00291     *format;
00292 
00293   Image
00294     *image,
00295     *montage_image;
00296 
00297   ImageStack
00298     image_stack[MaxImageStackDepth+1];
00299 
00300   long
00301     first_scene,
00302     last_scene;
00303 
00304   MagickBooleanType
00305     fire,
00306     pend,
00307     respect_parenthesis;
00308 
00309   MagickStatusType
00310     status;
00311 
00312   MontageInfo
00313     *montage_info;
00314 
00315   register ssize_t
00316     i;
00317 
00318   ssize_t
00319     j,
00320     k,
00321     scene;
00322 
00323   /*
00324     Set defaults.
00325   */
00326   assert(image_info != (ImageInfo *) NULL);
00327   assert(image_info->signature == MagickSignature);
00328   if (image_info->debug != MagickFalse)
00329     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00330   assert(exception != (ExceptionInfo *) NULL);
00331   if (argc == 2)
00332     {
00333       option=argv[1];
00334       if ((LocaleCompare("version",option+1) == 0) ||
00335           (LocaleCompare("-version",option+1) == 0))
00336         {
00337           (void) FormatLocaleFile(stdout,"Version: %s\n",
00338             GetMagickVersion((size_t *) NULL));
00339           (void) FormatLocaleFile(stdout,"Copyright: %s\n",
00340             GetMagickCopyright());
00341           (void) FormatLocaleFile(stdout,"Features: %s\n\n",
00342             GetMagickFeatures());
00343           return(MagickFalse);
00344         }
00345     }
00346   if (argc < 3)
00347     return(MontageUsage());
00348   format="%w,%h,%m";
00349   first_scene=0;
00350   j=1;
00351   k=0;
00352   last_scene=0;
00353   montage_image=NewImageList();
00354   montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
00355   NewImageStack();
00356   option=(char *) NULL;
00357   pend=MagickFalse;
00358   respect_parenthesis=MagickFalse;
00359   scene=0;
00360   status=MagickFalse;
00361   transparent_color=(char *) NULL;
00362   /*
00363     Parse command line.
00364   */
00365   ReadCommandlLine(argc,&argv);
00366   status=ExpandFilenames(&argc,&argv);
00367   if (status == MagickFalse)
00368     ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
00369       GetExceptionMessage(errno));
00370   for (i=1; i < (ssize_t) (argc-1); i++)
00371   {
00372     option=argv[i];
00373     if (LocaleCompare(option,"(") == 0)
00374       {
00375         FireImageStack(MagickTrue,MagickTrue,pend);
00376         if (k == MaxImageStackDepth)
00377           ThrowMontageException(OptionError,"ParenthesisNestedTooDeeply",
00378             option);
00379         PushImageStack();
00380         continue;
00381       }
00382     if (LocaleCompare(option,")") == 0)
00383       {
00384         FireImageStack(MagickTrue,MagickTrue,MagickTrue);
00385         if (k == 0)
00386           ThrowMontageException(OptionError,"UnableToParseExpression",option);
00387         PopImageStack();
00388         continue;
00389       }
00390     if (IsCommandOption(option) == MagickFalse)
00391       {
00392         Image
00393           *images;
00394 
00395         FireImageStack(MagickFalse,MagickFalse,pend);
00396         for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++)
00397         {
00398           char
00399             *filename;
00400 
00401           /*
00402             Option is a file name: begin by reading image from specified file.
00403           */
00404           filename=argv[i];
00405           if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
00406             filename=argv[++i];
00407           (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
00408           if (first_scene != last_scene)
00409             {
00410               char
00411                 filename[MaxTextExtent];
00412 
00413               /*
00414                 Form filename for multi-part images.
00415               */
00416               (void) InterpretImageFilename(image_info,(Image *) NULL,
00417                 image_info->filename,(int) scene,filename,exception);
00418               if (LocaleCompare(filename,image_info->filename) == 0)
00419                 (void) FormatLocaleString(filename,MaxTextExtent,"%s.%.20g",
00420                   image_info->filename,(double) scene);
00421               (void) CopyMagickString(image_info->filename,filename,
00422                 MaxTextExtent);
00423             }
00424           (void) CloneString(&image_info->font,montage_info->font);
00425           images=ReadImages(image_info,exception);
00426           status&=(images != (Image *) NULL) &&
00427             (exception->severity < ErrorException);
00428           if (images == (Image *) NULL)
00429             continue;
00430           AppendImageStack(images);
00431         }
00432         continue;
00433       }
00434     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
00435     switch (*(option+1))
00436     {
00437       case 'a':
00438       {
00439         if (LocaleCompare("adaptive-sharpen",option+1) == 0)
00440           {
00441             i++;
00442             if (i == (ssize_t) (argc-1))
00443               ThrowMontageException(OptionError,"MissingArgument",option);
00444             if (IsGeometry(argv[i]) == MagickFalse)
00445               ThrowMontageInvalidArgumentException(option,argv[i]);
00446             break;
00447           }
00448         if (LocaleCompare("adjoin",option+1) == 0)
00449           break;
00450         if (LocaleCompare("affine",option+1) == 0)
00451           {
00452             if (*option == '+')
00453               break;
00454             i++;
00455             if (i == (ssize_t) (argc-1))
00456               ThrowMontageException(OptionError,"MissingArgument",option);
00457             if (IsGeometry(argv[i]) == MagickFalse)
00458               ThrowMontageInvalidArgumentException(option,argv[i]);
00459             break;
00460           }
00461         if (LocaleCompare("alpha",option+1) == 0)
00462           {
00463             ssize_t
00464               type;
00465 
00466             if (*option == '+')
00467               break;
00468             i++;
00469             if (i == (ssize_t) argc)
00470               ThrowMontageException(OptionError,"MissingArgument",option);
00471             type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
00472             if (type < 0)
00473               ThrowMontageException(OptionError,"UnrecognizedAlphaChannelType",
00474                 argv[i]);
00475             break;
00476           }
00477         if (LocaleCompare("annotate",option+1) == 0)
00478           {
00479             if (*option == '+')
00480               break;
00481             i++;
00482             if (i == (ssize_t) (argc-1))
00483               ThrowMontageException(OptionError,"MissingArgument",option);
00484             if (IsGeometry(argv[i]) == MagickFalse)
00485               ThrowMontageInvalidArgumentException(option,argv[i]);
00486             if (i == (ssize_t) (argc-1))
00487               ThrowMontageException(OptionError,"MissingArgument",option);
00488             i++;
00489             break;
00490           }
00491         if (LocaleCompare("auto-orient",option+1) == 0)
00492           break;
00493         if (LocaleCompare("authenticate",option+1) == 0)
00494           {
00495             if (*option == '+')
00496               break;
00497             i++;
00498             if (i == (ssize_t) argc)
00499               ThrowMontageException(OptionError,"MissingArgument",option);
00500             break;
00501           }
00502         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00503       }
00504       case 'b':
00505       {
00506         if (LocaleCompare("background",option+1) == 0)
00507           {
00508             if (*option == '+')
00509               break;
00510             i++;
00511             if (i == (ssize_t) argc)
00512               ThrowMontageException(OptionError,"MissingArgument",option);
00513             (void) QueryColorCompliance(argv[i],AllCompliance,
00514               &montage_info->background_color,exception);
00515             break;
00516           }
00517         if (LocaleCompare("blue-primary",option+1) == 0)
00518           {
00519             if (*option == '+')
00520               break;
00521             i++;
00522             if (i == (ssize_t) argc)
00523               ThrowMontageException(OptionError,"MissingArgument",option);
00524             if (IsGeometry(argv[i]) == MagickFalse)
00525               ThrowMontageInvalidArgumentException(option,argv[i]);
00526             break;
00527           }
00528         if (LocaleCompare("blur",option+1) == 0)
00529           {
00530             if (*option == '+')
00531               break;
00532             i++;
00533             if (i == (ssize_t) argc)
00534               ThrowMontageException(OptionError,"MissingArgument",option);
00535             if (IsGeometry(argv[i]) == MagickFalse)
00536               ThrowMontageInvalidArgumentException(option,argv[i]);
00537             break;
00538           }
00539         if (LocaleCompare("border",option+1) == 0)
00540           {
00541             if (k == 0)
00542               {
00543                 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
00544                 montage_info->border_width=0;
00545               }
00546             if (*option == '+')
00547               break;
00548             i++;
00549             if (i == (ssize_t) argc)
00550               ThrowMontageException(OptionError,"MissingArgument",option);
00551             if (IsGeometry(argv[i]) == MagickFalse)
00552               ThrowMontageInvalidArgumentException(option,argv[i]);
00553             if (k == 0)
00554               montage_info->border_width=StringToUnsignedLong(argv[i]);
00555             break;
00556           }
00557         if (LocaleCompare("bordercolor",option+1) == 0)
00558           {
00559             if (*option == '+')
00560               break;
00561             i++;
00562             if (i == (ssize_t) argc)
00563               ThrowMontageException(OptionError,"MissingArgument",option);
00564             (void) QueryColorCompliance(argv[i],AllCompliance,
00565               &montage_info->border_color,exception);
00566             break;
00567           }
00568         if (LocaleCompare("borderwidth",option+1) == 0)
00569           {
00570             montage_info->border_width=0;
00571             if (*option == '+')
00572               break;
00573             i++;
00574             if (i == (ssize_t) argc)
00575               ThrowMontageException(OptionError,"MissingArgument",option);
00576             if (IsGeometry(argv[i]) == MagickFalse)
00577               ThrowMontageInvalidArgumentException(option,argv[i]);
00578             montage_info->border_width=StringToUnsignedLong(argv[i]);
00579             break;
00580           }
00581         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00582       }
00583       case 'c':
00584       {
00585         if (LocaleCompare("cache",option+1) == 0)
00586           {
00587             if (*option == '+')
00588               break;
00589             i++;
00590             if (i == (ssize_t) argc)
00591               ThrowMontageException(OptionError,"MissingArgument",option);
00592             if (IsGeometry(argv[i]) == MagickFalse)
00593               ThrowMontageInvalidArgumentException(option,argv[i]);
00594             break;
00595           }
00596         if (LocaleCompare("caption",option+1) == 0)
00597           {
00598             if (*option == '+')
00599               break;
00600             i++;
00601             if (i == (ssize_t) argc)
00602               ThrowMontageException(OptionError,"MissingArgument",option);
00603             break;
00604           }
00605         if (LocaleCompare("channel",option+1) == 0)
00606           {
00607             ssize_t
00608               channel;
00609 
00610             if (*option == '+')
00611               break;
00612             i++;
00613             if (i == (ssize_t) (argc-1))
00614               ThrowMontageException(OptionError,"MissingArgument",option);
00615             channel=ParseChannelOption(argv[i]);
00616             if (channel < 0)
00617               ThrowMontageException(OptionError,"UnrecognizedChannelType",
00618                 argv[i]);
00619             break;
00620           }
00621         if (LocaleCompare("clone",option+1) == 0)
00622           {
00623             Image
00624               *clone_images;
00625 
00626             clone_images=image;
00627             if (k != 0)
00628               clone_images=image_stack[k-1].image;
00629             if (clone_images == (Image *) NULL)
00630               ThrowMontageException(ImageError,"ImageSequenceRequired",option);
00631             FireImageStack(MagickTrue,MagickTrue,MagickTrue);
00632             if (*option == '+')
00633               clone_images=CloneImages(clone_images,"-1",exception);
00634             else
00635               {
00636                 i++;
00637                 if (i == (ssize_t) (argc-1))
00638                   ThrowMontageException(OptionError,"MissingArgument",option);
00639                 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
00640                   ThrowMontageInvalidArgumentException(option,argv[i]);
00641                 clone_images=CloneImages(clone_images,argv[i],exception);
00642               }
00643             if (clone_images == (Image *) NULL)
00644               ThrowMontageException(OptionError,"NoSuchImage",option);
00645             AppendImageStack(clone_images);
00646             break;
00647           }
00648         if (LocaleCompare("coalesce",option+1) == 0)
00649           break;
00650         if (LocaleCompare("colors",option+1) == 0)
00651           {
00652             if (*option == '+')
00653               break;
00654             i++;
00655             if (i == (ssize_t) argc)
00656               ThrowMontageException(OptionError,"MissingArgument",option);
00657             if (IsGeometry(argv[i]) == MagickFalse)
00658               ThrowMontageInvalidArgumentException(option,argv[i]);
00659             break;
00660           }
00661         if (LocaleCompare("colorspace",option+1) == 0)
00662           {
00663             ssize_t
00664               colorspace;
00665 
00666             if (*option == '+')
00667               break;
00668             i++;
00669             if (i == (ssize_t) argc)
00670               ThrowMontageException(OptionError,"MissingArgument",option);
00671             colorspace=ParseCommandOption(MagickColorspaceOptions,
00672               MagickFalse,argv[i]);
00673             if (colorspace < 0)
00674               ThrowMontageException(OptionError,"UnrecognizedColorspace",
00675                 argv[i]);
00676             break;
00677           }
00678         if (LocaleCompare("comment",option+1) == 0)
00679           {
00680             if (*option == '+')
00681               break;
00682             i++;
00683             if (i == (ssize_t) argc)
00684               ThrowMontageException(OptionError,"MissingArgument",option);
00685             break;
00686           }
00687         if (LocaleCompare("compose",option+1) == 0)
00688           {
00689             ssize_t
00690               compose;
00691 
00692             if (*option == '+')
00693               break;
00694             i++;
00695             if (i == (ssize_t) argc)
00696               ThrowMontageException(OptionError,"MissingArgument",option);
00697             compose=ParseCommandOption(MagickComposeOptions,MagickFalse,argv[i]);
00698             if (compose < 0)
00699               ThrowMontageException(OptionError,"UnrecognizedComposeOperator",
00700                 argv[i]);
00701             break;
00702           }
00703         if (LocaleCompare("composite",option+1) == 0)
00704           break;
00705         if (LocaleCompare("compress",option+1) == 0)
00706           {
00707             ssize_t
00708               compress;
00709 
00710             if (*option == '+')
00711               break;
00712             i++;
00713             if (i == (ssize_t) argc)
00714               ThrowMontageException(OptionError,"MissingArgument",option);
00715             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
00716               argv[i]);
00717             if (compress < 0)
00718               ThrowMontageException(OptionError,"UnrecognizedCompressType",
00719                 argv[i]);
00720             break;
00721           }
00722         if (LocaleCompare("concurrent",option+1) == 0)
00723           break;
00724         if (LocaleCompare("crop",option+1) == 0)
00725           {
00726             if (*option == '+')
00727               break;
00728             i++;
00729             if (i == (ssize_t) argc)
00730               ThrowMontageException(OptionError,"MissingArgument",option);
00731             if (IsGeometry(argv[i]) == MagickFalse)
00732               ThrowMontageInvalidArgumentException(option,argv[i]);
00733             break;
00734           }
00735         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00736       }
00737       case 'd':
00738       {
00739         if (LocaleCompare("debug",option+1) == 0)
00740           {
00741             ssize_t
00742               event;
00743 
00744             if (*option == '+')
00745               break;
00746             i++;
00747             if (i == (ssize_t) argc)
00748               ThrowMontageException(OptionError,"MissingArgument",option);
00749             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
00750             if (event < 0)
00751               ThrowMontageException(OptionError,"UnrecognizedEventType",
00752                 argv[i]);
00753             (void) SetLogEventMask(argv[i]);
00754             break;
00755           }
00756         if (LocaleCompare("define",option+1) == 0)
00757           {
00758             i++;
00759             if (i == (ssize_t) argc)
00760               ThrowMontageException(OptionError,"MissingArgument",option);
00761             if (*option == '+')
00762               {
00763                 const char
00764                   *define;
00765 
00766                 define=GetImageOption(image_info,argv[i]);
00767                 if (define == (const char *) NULL)
00768                   ThrowMontageException(OptionError,"NoSuchOption",argv[i]);
00769                 break;
00770               }
00771             break;
00772           }
00773         if (LocaleCompare("density",option+1) == 0)
00774           {
00775             if (*option == '+')
00776               break;
00777             i++;
00778             if (i == (ssize_t) argc)
00779               ThrowMontageException(OptionError,"MissingArgument",option);
00780             if (IsGeometry(argv[i]) == MagickFalse)
00781               ThrowMontageInvalidArgumentException(option,argv[i]);
00782             break;
00783           }
00784         if (LocaleCompare("depth",option+1) == 0)
00785           {
00786             if (*option == '+')
00787               break;
00788             i++;
00789             if (i == (ssize_t) argc)
00790               ThrowMontageException(OptionError,"MissingArgument",option);
00791             if (IsGeometry(argv[i]) == MagickFalse)
00792               ThrowMontageInvalidArgumentException(option,argv[i]);
00793             break;
00794           }
00795         if (LocaleCompare("display",option+1) == 0)
00796           {
00797             if (*option == '+')
00798               break;
00799             i++;
00800             if (i == (ssize_t) argc)
00801               ThrowMontageException(OptionError,"MissingArgument",option);
00802             break;
00803           }
00804         if (LocaleCompare("dispose",option+1) == 0)
00805           {
00806             ssize_t
00807               dispose;
00808 
00809             if (*option == '+')
00810               break;
00811             i++;
00812             if (i == (ssize_t) argc)
00813               ThrowMontageException(OptionError,"MissingArgument",option);
00814             dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
00815             if (dispose < 0)
00816               ThrowMontageException(OptionError,"UnrecognizedDisposeMethod",
00817                 argv[i]);
00818             break;
00819           }
00820         if (LocaleCompare("dither",option+1) == 0)
00821           {
00822             ssize_t
00823               method;
00824 
00825             if (*option == '+')
00826               break;
00827             i++;
00828             if (i == (ssize_t) argc)
00829               ThrowMontageException(OptionError,"MissingArgument",option);
00830             method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
00831             if (method < 0)
00832               ThrowMontageException(OptionError,"UnrecognizedDitherMethod",
00833                 argv[i]);
00834             break;
00835           }
00836         if (LocaleCompare("draw",option+1) == 0)
00837           {
00838             if (*option == '+')
00839               break;
00840             i++;
00841             if (i == (ssize_t) argc)
00842               ThrowMontageException(OptionError,"MissingArgument",option);
00843             break;
00844           }
00845         if (LocaleCompare("duplicate",option+1) == 0)
00846           {
00847             if (*option == '+')
00848               break;
00849             i++;
00850             if (i == (ssize_t) (argc-1))
00851               ThrowMontageException(OptionError,"MissingArgument",option);
00852             if (IsGeometry(argv[i]) == MagickFalse)
00853               ThrowMontageInvalidArgumentException(option,argv[i]);
00854             break;
00855           }
00856         if (LocaleCompare("duration",option+1) == 0)
00857           {
00858             if (*option == '+')
00859               break;
00860             i++;
00861             if (i == (ssize_t) (argc-1))
00862               ThrowMontageException(OptionError,"MissingArgument",option);
00863             if (IsGeometry(argv[i]) == MagickFalse)
00864               ThrowMontageInvalidArgumentException(option,argv[i]);
00865             break;
00866           }
00867         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00868       }
00869       case 'e':
00870       {
00871         if (LocaleCompare("encoding",option+1) == 0)
00872           {
00873             if (*option == '+')
00874               break;
00875             i++;
00876             if (i == (ssize_t) argc)
00877               ThrowMontageException(OptionError,"MissingArgument",option);
00878             break;
00879           }
00880         if (LocaleCompare("endian",option+1) == 0)
00881           {
00882             ssize_t
00883               endian;
00884 
00885             if (*option == '+')
00886               break;
00887             i++;
00888             if (i == (ssize_t) argc)
00889               ThrowMontageException(OptionError,"MissingArgument",option);
00890             endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
00891               argv[i]);
00892             if (endian < 0)
00893               ThrowMontageException(OptionError,"UnrecognizedEndianType",
00894                 argv[i]);
00895             break;
00896           }
00897         if (LocaleCompare("extent",option+1) == 0)
00898           {
00899             if (*option == '+')
00900               break;
00901             i++;
00902             if (i == (ssize_t) (argc-1))
00903               ThrowMontageException(OptionError,"MissingArgument",option);
00904             if (IsGeometry(argv[i]) == MagickFalse)
00905               ThrowMontageInvalidArgumentException(option,argv[i]);
00906             break;
00907           }
00908         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00909       }
00910       case 'f':
00911       {
00912         if (LocaleCompare("fill",option+1) == 0)
00913           {
00914             (void) QueryColorCompliance("none",AllCompliance,
00915               &montage_info->fill,exception);
00916             if (*option == '+')
00917               break;
00918             i++;
00919             if (i == (ssize_t) argc)
00920               ThrowMontageException(OptionError,"MissingArgument",option);
00921             (void) QueryColorCompliance(argv[i],AllCompliance,
00922               &montage_info->fill,exception);
00923             break;
00924           }
00925         if (LocaleCompare("filter",option+1) == 0)
00926           {
00927             ssize_t
00928               filter;
00929 
00930             if (*option == '+')
00931               break;
00932             i++;
00933             if (i == (ssize_t) argc)
00934               ThrowMontageException(OptionError,"MissingArgument",option);
00935             filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
00936             if (filter < 0)
00937               ThrowMontageException(OptionError,"UnrecognizedImageFilter",
00938                 argv[i]);
00939             break;
00940           }
00941         if (LocaleCompare("flatten",option+1) == 0)
00942           break;
00943         if (LocaleCompare("flip",option+1) == 0)
00944           break;
00945         if (LocaleCompare("flop",option+1) == 0)
00946           break;
00947         if (LocaleCompare("font",option+1) == 0)
00948           {
00949             if (*option == '+')
00950               break;
00951             i++;
00952             if (i == (ssize_t) argc)
00953               ThrowMontageException(OptionError,"MissingArgument",option);
00954             (void) CloneString(&montage_info->font,argv[i]);
00955             break;
00956           }
00957         if (LocaleCompare("format",option+1) == 0)
00958           {
00959             if (*option == '+')
00960               break;
00961             i++;
00962             if (i == (ssize_t) argc)
00963               ThrowMontageException(OptionError,"MissingArgument",option);
00964             format=argv[i];
00965             break;
00966           }
00967         if (LocaleCompare("frame",option+1) == 0)
00968           {
00969             if (k == 0)
00970               {
00971                 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
00972                 (void) CloneString(&montage_info->frame,(char *) NULL);
00973               }
00974             if (*option == '+')
00975               break;
00976             i++;
00977             if (i == (ssize_t) argc)
00978               ThrowMontageException(OptionError,"MissingArgument",option);
00979             if (IsGeometry(argv[i]) == MagickFalse)
00980               ThrowMontageInvalidArgumentException(option,argv[i]);
00981             if (k == 0)
00982               (void) CloneString(&montage_info->frame,argv[i]);
00983             break;
00984           }
00985         ThrowMontageException(OptionError,"UnrecognizedOption",option)
00986       }
00987       case 'g':
00988       {
00989         if (LocaleCompare("gamma",option+1) == 0)
00990           {
00991             i++;
00992             if (i == (ssize_t) argc)
00993               ThrowMontageException(OptionError,"MissingArgument",option);
00994             if (IsGeometry(argv[i]) == MagickFalse)
00995               ThrowMontageInvalidArgumentException(option,argv[i]);
00996             break;
00997           }
00998         if (LocaleCompare("geometry",option+1) == 0)
00999           {
01000             (void) CloneString(&montage_info->geometry,(char *) NULL);
01001             if (*option == '+')
01002               break;
01003             i++;
01004             if (i == (ssize_t) argc)
01005               ThrowMontageException(OptionError,"MissingArgument",option);
01006             if (IsGeometry(argv[i]) == MagickFalse)
01007               ThrowMontageInvalidArgumentException(option,argv[i]);
01008             (void) CloneString(&montage_info->geometry,argv[i]);
01009             break;
01010           }
01011         if (LocaleCompare("gravity",option+1) == 0)
01012           {
01013             ssize_t
01014               gravity;
01015 
01016             montage_info->gravity=UndefinedGravity;
01017             if (*option == '+')
01018               break;
01019             i++;
01020             if (i == (ssize_t) argc)
01021               ThrowMontageException(OptionError,"MissingArgument",option);
01022             gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
01023               argv[i]);
01024             if (gravity < 0)
01025               ThrowMontageException(OptionError,"UnrecognizedGravityType",
01026                 argv[i]);
01027             montage_info->gravity=(GravityType) gravity;
01028             break;
01029           }
01030         if (LocaleCompare("green-primary",option+1) == 0)
01031           {
01032             if (*option == '+')
01033               break;
01034             i++;
01035             if (i == (ssize_t) argc)
01036               ThrowMontageException(OptionError,"MissingArgument",option);
01037             if (IsGeometry(argv[i]) == MagickFalse)
01038               ThrowMontageInvalidArgumentException(option,argv[i]);
01039             break;
01040           }
01041         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01042       }
01043       case 'h':
01044       {
01045         if ((LocaleCompare("help",option+1) == 0) ||
01046             (LocaleCompare("-help",option+1) == 0))
01047           return(MontageUsage());
01048         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01049       }
01050       case 'i':
01051       {
01052         if (LocaleCompare("identify",option+1) == 0)
01053           break;
01054         if (LocaleCompare("interlace",option+1) == 0)
01055           {
01056             ssize_t
01057               interlace;
01058 
01059             if (*option == '+')
01060               break;
01061             i++;
01062             if (i == (ssize_t) argc)
01063               ThrowMontageException(OptionError,"MissingArgument",option);
01064             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
01065               argv[i]);
01066             if (interlace < 0)
01067               ThrowMontageException(OptionError,"UnrecognizedInterlaceType",
01068                 argv[i]);
01069             break;
01070           }
01071         if (LocaleCompare("interpolate",option+1) == 0)
01072           {
01073             ssize_t
01074               interpolate;
01075 
01076             if (*option == '+')
01077               break;
01078             i++;
01079             if (i == (ssize_t) argc)
01080               ThrowMontageException(OptionError,"MissingArgument",option);
01081             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
01082               argv[i]);
01083             if (interpolate < 0)
01084               ThrowMontageException(OptionError,"UnrecognizedInterpolateMethod",
01085                 argv[i]);
01086             break;
01087           }
01088         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01089       }
01090       case 'k':
01091       {
01092         if (LocaleCompare("kerning",option+1) == 0)
01093           {
01094             if (*option == '+')
01095               break;
01096             i++;
01097             if (i == (ssize_t) (argc-1))
01098               ThrowMontageException(OptionError,"MissingArgument",option);
01099             if (IsGeometry(argv[i]) == MagickFalse)
01100               ThrowMontageInvalidArgumentException(option,argv[i]);
01101             break;
01102           }
01103         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01104       }
01105       case 'l':
01106       {
01107         if (LocaleCompare("label",option+1) == 0)
01108           {
01109             if (*option == '+')
01110               break;
01111             i++;
01112             if (i == (ssize_t) argc)
01113               ThrowMontageException(OptionError,"MissingArgument",option);
01114             break;
01115           }
01116         if (LocaleCompare("limit",option+1) == 0)
01117           {
01118             char
01119               *p;
01120 
01121             double
01122               value;
01123 
01124             ssize_t
01125               resource;
01126 
01127             if (*option == '+')
01128               break;
01129             i++;
01130             if (i == (ssize_t) argc)
01131               ThrowMontageException(OptionError,"MissingArgument",option);
01132             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
01133               argv[i]);
01134             if (resource < 0)
01135               ThrowMontageException(OptionError,"UnrecognizedResourceType",
01136                 argv[i]);
01137             i++;
01138             if (i == (ssize_t) argc)
01139               ThrowMontageException(OptionError,"MissingArgument",option);
01140             value=StringToDouble(argv[i],&p);
01141             (void) value;
01142             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
01143               ThrowMontageInvalidArgumentException(option,argv[i]);
01144             break;
01145           }
01146         if (LocaleCompare("list",option+1) == 0)
01147           {
01148             ssize_t
01149               list;
01150 
01151             if (*option == '+')
01152               break;
01153             i++;
01154             if (i == (ssize_t) argc)
01155               ThrowMontageException(OptionError,"MissingArgument",option);
01156             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
01157             if (list < 0)
01158               ThrowMontageException(OptionError,"UnrecognizedListType",argv[i]);
01159             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
01160               argv+j,exception);
01161             DestroyMontage();
01162             return(status != 0 ? MagickFalse : MagickTrue);
01163           }
01164         if (LocaleCompare("log",option+1) == 0)
01165           {
01166             if (*option == '+')
01167               break;
01168             i++;
01169             if ((i == (ssize_t) argc) ||
01170                 (strchr(argv[i],'%') == (char *) NULL))
01171               ThrowMontageException(OptionError,"MissingArgument",option);
01172             break;
01173           }
01174         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01175       }
01176       case 'm':
01177       {
01178         if (LocaleCompare("matte",option+1) == 0)
01179           break;
01180         if (LocaleCompare("mattecolor",option+1) == 0)
01181           {
01182             if (*option == '+')
01183               break;
01184             i++;
01185             if (i == (ssize_t) argc)
01186               ThrowMontageException(OptionError,"MissingArgument",option);
01187             (void) QueryColorCompliance(argv[i],AllCompliance,
01188               &montage_info->matte_color,exception);
01189             break;
01190           }
01191         if (LocaleCompare("mode",option+1) == 0)
01192           {
01193             MontageMode
01194               mode;
01195 
01196             (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
01197             if (*option == '+')
01198               break;
01199             i++;
01200             if (i == (ssize_t) argc)
01201               ThrowMontageException(OptionError,"MissingArgument",option);
01202             mode=UndefinedMode;
01203             if (LocaleCompare("frame",argv[i]) == 0)
01204               {
01205                 mode=FrameMode;
01206                 (void) CloneString(&montage_info->frame,"15x15+3+3");
01207                 montage_info->shadow=MagickTrue;
01208                 break;
01209               }
01210             if (LocaleCompare("unframe",argv[i]) == 0)
01211               {
01212                 mode=UnframeMode;
01213                 montage_info->frame=(char *) NULL;
01214                 montage_info->shadow=MagickFalse;
01215                 montage_info->border_width=0;
01216                 break;
01217               }
01218             if (LocaleCompare("concatenate",argv[i]) == 0)
01219               {
01220                 mode=ConcatenateMode;
01221                 montage_info->frame=(char *) NULL;
01222                 montage_info->shadow=MagickFalse;
01223                 montage_info->gravity=(GravityType) NorthWestGravity;
01224                 (void) CloneString(&montage_info->geometry,"+0+0");
01225                 montage_info->border_width=0;
01226                 break;
01227               }
01228             if (mode == UndefinedMode)
01229               ThrowMontageException(OptionError,"UnrecognizedImageMode",
01230                 argv[i]);
01231             break;
01232           }
01233         if (LocaleCompare("monitor",option+1) == 0)
01234           break;
01235         if (LocaleCompare("monochrome",option+1) == 0)
01236           {
01237             if (*option == '+')
01238               break;
01239             break;
01240           }
01241         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01242       }
01243       case 'n':
01244       {
01245         if (LocaleCompare("noop",option+1) == 0)
01246           break;
01247         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01248       }
01249       case 'o':
01250       {
01251         if (LocaleCompare("origin",option+1) == 0)
01252           {
01253             if (*option == '+')
01254               break;
01255             i++;
01256             if (i == (ssize_t) argc)
01257               ThrowMontageException(OptionError,"MissingArgument",option);
01258             if (IsGeometry(argv[i]) == MagickFalse)
01259               ThrowMontageInvalidArgumentException(option,argv[i]);
01260             break;
01261           }
01262         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01263       }
01264       case 'p':
01265       {
01266         if (LocaleCompare("page",option+1) == 0)
01267           {
01268             if (*option == '+')
01269               break;
01270             i++;
01271             if (i == (ssize_t) argc)
01272               ThrowMontageException(OptionError,"MissingArgument",option);
01273             break;
01274           }
01275         if (LocaleCompare("pointsize",option+1) == 0)
01276           {
01277             montage_info->pointsize=12;
01278             if (*option == '+')
01279               break;
01280             i++;
01281             if (i == (ssize_t) argc)
01282               ThrowMontageException(OptionError,"MissingArgument",option);
01283             if (IsGeometry(argv[i]) == MagickFalse)
01284               ThrowMontageInvalidArgumentException(option,argv[i]);
01285             montage_info->pointsize=StringToDouble(argv[i],(char **) NULL);
01286             break;
01287           }
01288         if (LocaleCompare("polaroid",option+1) == 0)
01289           {
01290             if (*option == '+')
01291               break;
01292             i++;
01293             if (i == (ssize_t) (argc-1))
01294               ThrowMontageException(OptionError,"MissingArgument",option);
01295             if (IsGeometry(argv[i]) == MagickFalse)
01296               ThrowMontageInvalidArgumentException(option,argv[i]);
01297             break;
01298           }
01299         if (LocaleCompare("profile",option+1) == 0)
01300           {
01301             i++;
01302             if (i == (ssize_t) (argc-1))
01303               ThrowMontageException(OptionError,"MissingArgument",option);
01304             break;
01305           }
01306         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01307       }
01308       case 'q':
01309       {
01310         if (LocaleCompare("quality",option+1) == 0)
01311           {
01312             if (*option == '+')
01313               break;
01314             i++;
01315             if (i == (ssize_t) argc)
01316               ThrowMontageException(OptionError,"MissingArgument",option);
01317             if (IsGeometry(argv[i]) == MagickFalse)
01318               ThrowMontageInvalidArgumentException(option,argv[i]);
01319             break;
01320           }
01321         if (LocaleCompare("quantize",option+1) == 0)
01322           {
01323             ssize_t
01324               colorspace;
01325 
01326             if (*option == '+')
01327               break;
01328             i++;
01329             if (i == (ssize_t) (argc-1))
01330               ThrowMontageException(OptionError,"MissingArgument",option);
01331             colorspace=ParseCommandOption(MagickColorspaceOptions,
01332               MagickFalse,argv[i]);
01333             if (colorspace < 0)
01334               ThrowMontageException(OptionError,"UnrecognizedColorspace",
01335                 argv[i]);
01336             break;
01337           }
01338         if (LocaleCompare("quiet",option+1) == 0)
01339           break;
01340         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01341       }
01342       case 'r':
01343       {
01344         if (LocaleCompare("red-primary",option+1) == 0)
01345           {
01346             if (*option == '+')
01347               break;
01348             i++;
01349             if (i == (ssize_t) argc)
01350               ThrowMontageException(OptionError,"MissingArgument",option);
01351             if (IsGeometry(argv[i]) == MagickFalse)
01352               ThrowMontageInvalidArgumentException(option,argv[i]);
01353             break;
01354           }
01355         if (LocaleCompare("regard-warnings",option+1) == 0)
01356           break;
01357         if (LocaleCompare("render",option+1) == 0)
01358           break;
01359         if (LocaleCompare("repage",option+1) == 0)
01360           {
01361             if (*option == '+')
01362               break;
01363             i++;
01364             if (i == (ssize_t) argc)
01365               ThrowMontageException(OptionError,"MissingArgument",option);
01366             if (IsGeometry(argv[i]) == MagickFalse)
01367               ThrowMontageInvalidArgumentException(option,argv[i]);
01368             break;
01369           }
01370         if (LocaleCompare("resize",option+1) == 0)
01371           {
01372             if (*option == '+')
01373               break;
01374             i++;
01375             if (i == (ssize_t) argc)
01376               ThrowMontageException(OptionError,"MissingArgument",option);
01377             if (IsGeometry(argv[i]) == MagickFalse)
01378               ThrowMontageInvalidArgumentException(option,argv[i]);
01379             break;
01380           }
01381         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
01382           {
01383             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
01384             break;
01385           }
01386         if (LocaleCompare("rotate",option+1) == 0)
01387           {
01388             i++;
01389             if (i == (ssize_t) argc)
01390               ThrowMontageException(OptionError,"MissingArgument",option);
01391             if (IsGeometry(argv[i]) == MagickFalse)
01392               ThrowMontageInvalidArgumentException(option,argv[i]);
01393             break;
01394           }
01395         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01396       }
01397       case 's':
01398       {
01399         if (LocaleCompare("sampling-factor",option+1) == 0)
01400           {
01401             if (*option == '+')
01402               break;
01403             i++;
01404             if (i == (ssize_t) argc)
01405               ThrowMontageException(OptionError,"MissingArgument",option);
01406             if (IsGeometry(argv[i]) == MagickFalse)
01407               ThrowMontageInvalidArgumentException(option,argv[i]);
01408             break;
01409           }
01410         if (LocaleCompare("seed",option+1) == 0)
01411           {
01412             if (*option == '+')
01413               break;
01414             i++;
01415             if (i == (ssize_t) (argc-1))
01416               ThrowMontageException(OptionError,"MissingArgument",option);
01417             if (IsGeometry(argv[i]) == MagickFalse)
01418               ThrowMontageInvalidArgumentException(option,argv[i]);
01419             break;
01420           }
01421         if (LocaleCompare("scenes",option+1) == 0)
01422           {
01423             first_scene=0;
01424             last_scene=0;
01425             if (*option == '+')
01426               break;
01427             i++;
01428             if (i == (ssize_t) argc)
01429               ThrowMontageException(OptionError,"MissingArgument",option);
01430             if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
01431               ThrowMontageInvalidArgumentException(option,argv[i]);
01432             first_scene=(int) StringToLong(argv[i]);
01433             last_scene=first_scene;
01434             (void) sscanf(argv[i],"%ld-%ld",&first_scene,&last_scene);
01435             break;
01436           }
01437         if (LocaleCompare("set",option+1) == 0)
01438           {
01439             i++;
01440             if (i == (ssize_t) argc)
01441               ThrowMontageException(OptionError,"MissingArgument",option);
01442             if (*option == '+')
01443               break;
01444             i++;
01445             if (i == (ssize_t) argc)
01446               ThrowMontageException(OptionError,"MissingArgument",option);
01447             break;
01448           }
01449         if (LocaleCompare("shadow",option+1) == 0)
01450           {
01451             if (k == 0)
01452               {
01453                 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
01454                 montage_info->shadow=(*option == '-') ? MagickTrue :
01455                   MagickFalse;
01456                 break;
01457               }
01458             if (*option == '+')
01459               break;
01460             i++;
01461             if (i == (ssize_t) (argc-1))
01462               ThrowMontageException(OptionError,"MissingArgument",option);
01463             if (IsGeometry(argv[i]) == MagickFalse)
01464               ThrowMontageInvalidArgumentException(option,argv[i]);
01465             break;
01466           }
01467         if (LocaleCompare("sharpen",option+1) == 0)
01468           {
01469             if (*option == '+')
01470               break;
01471             i++;
01472             if ((i == (ssize_t) argc) || (IsGeometry(argv[i]) == MagickFalse))
01473               ThrowMontageException(OptionError,"MissingArgument",option);
01474             break;
01475           }
01476         if (LocaleCompare("size",option+1) == 0)
01477           {
01478             if (*option == '+')
01479               break;
01480             i++;
01481             if (i == (ssize_t) argc)
01482               ThrowMontageException(OptionError,"MissingArgument",option);
01483             if (IsGeometry(argv[i]) == MagickFalse)
01484               ThrowMontageInvalidArgumentException(option,argv[i]);
01485             break;
01486           }
01487         if (LocaleCompare("stroke",option+1) == 0)
01488           {
01489             (void) QueryColorCompliance("none",AllCompliance,
01490               &montage_info->stroke,exception);
01491             if (*option == '+')
01492               break;
01493             i++;
01494             if (i == (ssize_t) argc)
01495               ThrowMontageException(OptionError,"MissingArgument",option);
01496             (void) QueryColorCompliance(argv[i],AllCompliance,
01497               &montage_info->stroke,exception);
01498             break;
01499           }
01500         if (LocaleCompare("strip",option+1) == 0)
01501           break;
01502         if (LocaleCompare("strokewidth",option+1) == 0)
01503           {
01504             if (*option == '+')
01505               break;
01506             i++;
01507             if (i == (ssize_t) argc)
01508               ThrowMontageException(OptionError,"MissingArgument",option);
01509             if (IsGeometry(argv[i]) == MagickFalse)
01510               ThrowMontageInvalidArgumentException(option,argv[i]);
01511             break;
01512           }
01513         if (LocaleCompare("support",option+1) == 0)
01514           {
01515             i++;  /* deprecated */
01516             break;
01517           }
01518         if (LocaleCompare("synchronize",option+1) == 0)
01519           break;
01520         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01521       }
01522       case 't':
01523       {
01524         if (LocaleCompare("taint",option+1) == 0)
01525           break;
01526         if (LocaleCompare("texture",option+1) == 0)
01527           {
01528             (void) CloneString(&montage_info->texture,(char *) NULL);
01529             if (*option == '+')
01530               break;
01531             i++;
01532             if (i == (ssize_t) argc)
01533               ThrowMontageException(OptionError,"MissingArgument",option);
01534             (void) CloneString(&montage_info->texture,argv[i]);
01535             break;
01536           }
01537         if (LocaleCompare("thumbnail",option+1) == 0)
01538           {
01539             if (*option == '+')
01540               break;
01541             i++;
01542             if (i == (ssize_t) argc)
01543               ThrowMontageException(OptionError,"MissingArgument",option);
01544             if (IsGeometry(argv[i]) == MagickFalse)
01545               ThrowMontageInvalidArgumentException(option,argv[i]);
01546             break;
01547           }
01548         if (LocaleCompare("tile",option+1) == 0)
01549           {
01550             if (k == 0)
01551               {
01552                 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
01553                 (void) CloneString(&montage_info->tile,(char *) NULL);
01554               }
01555             if (*option == '+')
01556               break;
01557             i++;
01558             if (i == (ssize_t) argc)
01559               ThrowMontageException(OptionError,"MissingArgument",option);
01560             if (IsGeometry(argv[i]) == MagickFalse)
01561               ThrowMontageInvalidArgumentException(option,argv[i]);
01562             if (k == 0)
01563               (void) CloneString(&montage_info->tile,argv[i]);
01564             break;
01565           }
01566         if (LocaleCompare("tile-offset",option+1) == 0)
01567           {
01568             if (*option == '+')
01569               break;
01570             i++;
01571             if (i == (ssize_t) (argc-1))
01572               ThrowMontageException(OptionError,"MissingArgument",option);
01573             if (IsGeometry(argv[i]) == MagickFalse)
01574               ThrowMontageInvalidArgumentException(option,argv[i]);
01575             break;
01576           }
01577         if (LocaleCompare("tint",option+1) == 0)
01578           {
01579             if (*option == '+')
01580               break;
01581             i++;
01582             if (i == (ssize_t) argc)
01583               ThrowMontageException(OptionError,"MissingArgument",option);
01584             if (IsGeometry(argv[i]) == MagickFalse)
01585               ThrowMontageInvalidArgumentException(option,argv[i]);
01586             break;
01587           }
01588         if (LocaleCompare("transform",option+1) == 0)
01589           break;
01590         if (LocaleCompare("transpose",option+1) == 0)
01591           break;
01592         if (LocaleCompare("title",option+1) == 0)
01593           {
01594             (void) CloneString(&montage_info->title,(char *) NULL);
01595             if (*option == '+')
01596               break;
01597             i++;
01598             if (i == (ssize_t) argc)
01599               ThrowMontageException(OptionError,"MissingArgument",option);
01600             (void) CloneString(&montage_info->title,argv[i]);
01601             break;
01602           }
01603         if (LocaleCompare("transform",option+1) == 0)
01604           break;
01605         if (LocaleCompare("transparent",option+1) == 0)
01606           {
01607             transparent_color=(char *) NULL;
01608             i++;
01609             if (i == (ssize_t) argc)
01610               ThrowMontageException(OptionError,"MissingArgument",option);
01611             (void) CloneString(&transparent_color,argv[i]);
01612             break;
01613           }
01614         if (LocaleCompare("transparent-color",option+1) == 0)
01615           {
01616             if (*option == '+')
01617               break;
01618             i++;
01619             if (i == (ssize_t) (argc-1))
01620               ThrowMontageException(OptionError,"MissingArgument",option);
01621             break;
01622           }
01623         if (LocaleCompare("treedepth",option+1) == 0)
01624           {
01625             if (*option == '+')
01626               break;
01627             i++;
01628             if (i == (ssize_t) argc)
01629               ThrowMontageException(OptionError,"MissingArgument",option);
01630             if (IsGeometry(argv[i]) == MagickFalse)
01631               ThrowMontageInvalidArgumentException(option,argv[i]);
01632             break;
01633           }
01634         if (LocaleCompare("trim",option+1) == 0)
01635           break;
01636         if (LocaleCompare("type",option+1) == 0)
01637           {
01638             ssize_t
01639               type;
01640 
01641             if (*option == '+')
01642               break;
01643             i++;
01644             if (i == (ssize_t) argc)
01645               ThrowMontageException(OptionError,"MissingArgument",option);
01646             type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
01647             if (type < 0)
01648               ThrowMontageException(OptionError,"UnrecognizedImageType",
01649                 argv[i]);
01650             break;
01651           }
01652         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01653       }
01654       case 'u':
01655       {
01656         if (LocaleCompare("units",option+1) == 0)
01657           {
01658             ssize_t
01659               units;
01660 
01661             if (*option == '+')
01662               break;
01663             i++;
01664             if (i == (ssize_t) (argc-1))
01665               ThrowMontageException(OptionError,"MissingArgument",option);
01666             units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
01667               argv[i]);
01668             if (units < 0)
01669               ThrowMontageException(OptionError,"UnrecognizedUnitsType",
01670                 argv[i]);
01671             break;
01672           }
01673         if (LocaleCompare("unsharp",option+1) == 0)
01674           {
01675             if (*option == '+')
01676               break;
01677             i++;
01678             if (i == (ssize_t) (argc-1))
01679               ThrowMontageException(OptionError,"MissingArgument",option);
01680             if (IsGeometry(argv[i]) == MagickFalse)
01681               ThrowMontageInvalidArgumentException(option,argv[i]);
01682             break;
01683           }
01684         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01685       }
01686       case 'v':
01687       {
01688         if (LocaleCompare("verbose",option+1) == 0)
01689           {
01690             break;
01691           }
01692         if ((LocaleCompare("version",option+1) == 0) ||
01693             (LocaleCompare("-version",option+1) == 0))
01694           {
01695             (void) FormatLocaleFile(stdout,"Version: %s\n",
01696               GetMagickVersion((size_t *) NULL));
01697             (void) FormatLocaleFile(stdout,"Copyright: %s\n",
01698               GetMagickCopyright());
01699             (void) FormatLocaleFile(stdout,"Features: %s\n\n",
01700               GetMagickFeatures());
01701             break;
01702           }
01703         if (LocaleCompare("virtual-pixel",option+1) == 0)
01704           {
01705             ssize_t
01706               method;
01707 
01708             if (*option == '+')
01709               break;
01710             i++;
01711             if (i == (ssize_t) argc)
01712               ThrowMontageException(OptionError,"MissingArgument",option);
01713             method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
01714               argv[i]);
01715             if (method < 0)
01716               ThrowMontageException(OptionError,
01717                 "UnrecognizedVirtualPixelMethod",argv[i]);
01718             break;
01719           }
01720         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01721       }
01722       case 'w':
01723       {
01724         if (LocaleCompare("white-point",option+1) == 0)
01725           {
01726             if (*option == '+')
01727               break;
01728             i++;
01729             if (i == (ssize_t) argc)
01730               ThrowMontageException(OptionError,"MissingArgument",option);
01731             if (IsGeometry(argv[i]) == MagickFalse)
01732               ThrowMontageInvalidArgumentException(option,argv[i]);
01733             break;
01734           }
01735         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01736       }
01737       case '?':
01738         break;
01739       default:
01740         ThrowMontageException(OptionError,"UnrecognizedOption",option)
01741     }
01742     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
01743       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
01744     if (fire != MagickFalse)
01745       FireImageStack(MagickTrue,MagickTrue,MagickTrue);
01746   }
01747   if (k != 0)
01748     ThrowMontageException(OptionError,"UnbalancedParenthesis",argv[i]);
01749   if (i-- != (ssize_t) (argc-1))
01750     ThrowMontageException(OptionError,"MissingAnImageFilename",argv[i]);
01751   if (image == (Image *) NULL)
01752     ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]);
01753   FinalizeImageSettings(image_info,image,MagickTrue);
01754   if (image == (Image *) NULL)
01755     ThrowMontageException(OptionError,"MissingAnImageFilename",argv[argc-1]);
01756   (void) CopyMagickString(montage_info->filename,argv[argc-1],MaxTextExtent);
01757   montage_image=MontageImageList(image_info,montage_info,image,exception);
01758   if (montage_image == (Image *) NULL)
01759     status=MagickFalse;
01760   else
01761     {
01762       /*
01763         Write image.
01764       */
01765       (void) CopyMagickString(image_info->filename,argv[argc-1],MaxTextExtent);
01766       (void) CopyMagickString(montage_image->magick_filename,argv[argc-1],
01767         MaxTextExtent);
01768       if (*montage_image->magick == '\0')
01769         (void) CopyMagickString(montage_image->magick,image->magick,
01770           MaxTextExtent);
01771       status&=WriteImages(image_info,montage_image,argv[argc-1],exception);
01772       if (metadata != (char **) NULL)
01773         {
01774           char
01775             *text;
01776 
01777           text=InterpretImageProperties(image_info,montage_image,format,
01778             exception);
01779           if (text == (char *) NULL)
01780             ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
01781               GetExceptionMessage(errno));
01782           (void) ConcatenateString(&(*metadata),text);
01783           (void) ConcatenateString(&(*metadata),"\n");
01784           text=DestroyString(text);
01785         }
01786     }
01787   montage_info=DestroyMontageInfo(montage_info);
01788   DestroyMontage();
01789   return(status != 0 ? MagickTrue : MagickFalse);
01790 }