root/ImageMagick/trunk/wand/montage.c @ 63

Revision 1, 60.0 KB (checked in by cristy, 3 months ago)


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