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

Generated on 19 Nov 2009 for MagickWand by  doxygen 1.6.1