]> granicus.if.org Git - imagemagick/blob - MagickWand/display.c
(no commit message)
[imagemagick] / MagickWand / display.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %               DDDD   IIIII  SSSSS  PPPP   L       AAA   Y   Y               %
7 %               D   D    I    SS     P   P  L      A   A   Y Y                %
8 %               D   D    I     SSS   PPPP   L      AAAAA    Y                 %
9 %               D   D    I       SS  P      L      A   A    Y                 %
10 %               DDDD   IIIII  SSSSS  P      LLLLL  A   A    Y                 %
11 %                                                                             %
12 %                                                                             %
13 %              Methods to Interactively Display and Edit an Image             %
14 %                                                                             %
15 %                             Software Design                                 %
16 %                               John Cristy                                   %
17 %                                July 1992                                    %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2011 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 display program to display an image or image sequence on any X
37 %  server.
38 %
39 */
40 \f
41 /*
42   Include declarations.
43 */
44 #include "MagickWand/studio.h"
45 #include "MagickWand/MagickWand.h"
46 #include "MagickWand/mogrify-private.h"
47 #include "MagickCore/display-private.h"
48 #include "MagickCore/string-private.h"
49 \f
50 /*
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 %                                                                             %
53 %                                                                             %
54 %                                                                             %
55 +   D i s p l a y I m a g e C o m m a n d                                     %
56 %                                                                             %
57 %                                                                             %
58 %                                                                             %
59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 %
61 %  DisplayImageCommand() displays a sequence of images on any workstation
62 %  display running an X server.  Display first determines the hardware
63 %  capabilities of the workstation. If the number of unique colors in an image
64 %  is less than or equal to the number the workstation can support, the image
65 %  is displayed in an X window. Otherwise the number of colors in the image is
66 %  first reduced to match the color resolution of the workstation before it is
67 %  displayed.
68 %
69 %  This means that a continuous-tone 24 bits/pixel image can display on a 8
70 %  bit pseudo-color device or monochrome device. In most instances the reduced
71 %  color image closely resembles the original. Alternatively, a monochrome or
72 %  pseudo-color image sequence can display on a continuous-tone 24 bits/pixels
73 %  device.
74 %
75 %  The format of the DisplayImageCommand method is:
76 %
77 %      MagickBooleanType DisplayImageCommand(ImageInfo *image_info,int argc,
78 %        char **argv,char **metadata,ExceptionInfo *exception)
79 %
80 %  A description of each parameter follows:
81 %
82 %    o image_info: the image info.
83 %
84 %    o argc: the number of elements in the argument vector.
85 %
86 %    o argv: A text array containing the command line arguments.
87 %
88 %    o metadata: any metadata is returned here.
89 %
90 %    o exception: return any errors or warnings in this structure.
91 %
92 */
93
94 static MagickBooleanType DisplayUsage(void)
95 {
96   const char
97     **p;
98
99   static const char
100     *buttons[]=
101     {
102       "1    press to map or unmap the Command widget",
103       "2    press and drag to magnify a region of an image",
104       "3    press to load an image from a visual image directory",
105       (char *) NULL
106     },
107     *miscellaneous[]=
108     {
109       "-debug events        display copious debugging information",
110       "-help                print program options",
111       "-list type           print a list of supported option arguments",
112       "-log format          format of debugging information",
113       "-version             print version information",
114       (char *) NULL
115     },
116     *operators[]=
117     {
118       "-auto-orient         automagically orient image",
119       "-border geometry     surround image with a border of color",
120       "-clip                clip along the first path from the 8BIM profile",
121       "-clip-path id        clip along a named path from the 8BIM profile",
122       "-colors value        preferred number of colors in the image",
123       "-contrast            enhance or reduce the image contrast",
124       "-crop geometry       preferred size and location of the cropped image",
125       "-decipher filename   convert cipher pixels to plain pixels",
126       "-deskew threshold    straighten an image",
127       "-despeckle           reduce the speckles within an image",
128       "-edge factor         apply a filter to detect edges in the image",
129       "-enhance             apply a digital filter to enhance a noisy image",
130       "-equalize            perform histogram equalization to an image",
131       "-extract geometry    extract area from image",
132       "-flip                flip image in the vertical direction",
133       "-flop                flop image in the horizontal direction",
134       "-frame geometry      surround image with an ornamental border",
135       "-fuzz distance       colors within this distance are considered equal",
136       "-gamma value         level of gamma correction",
137       "-monochrome          transform image to black and white",
138       "-negate              replace every pixel with its complementary color",
139       "-normalize           transform image to span the full range of colors",
140       "-raise value         lighten/darken image edges to create a 3-D effect",
141       "-resample geometry   change the resolution of an image",
142       "-resize geometry     resize the image",
143       "-roll geometry       roll an image vertically or horizontally",
144       "-rotate degrees      apply Paeth rotation to the image",
145       "-sample geometry     scale image with pixel sampling",
146       "-segment value       segment an image",
147       "-sharpen geometry    sharpen the image",
148       "-strip               strip image of all profiles and comments",
149       "-threshold value     threshold the image",
150       "-thumbnail geometry  create a thumbnail of the image",
151       "-trim                trim image edges",
152       (char *) NULL
153     },
154     *settings[]=
155     {
156       "-alpha option        on, activate, off, deactivate, set, opaque, copy",
157       "                     transparent, extract, background, or shape",
158       "-antialias           remove pixel-aliasing",
159       "-authenticate password",
160       "                     decipher image with this password",
161       "-backdrop            display image centered on a backdrop",
162       "-channel type        apply option to select image channels",
163       "-colormap type       Shared or Private",
164       "-colorspace type     alternate image colorspace",
165       "-comment string      annotate image with comment",
166       "-compress type       type of pixel compression when writing the image",
167       "-define format:option",
168       "                     define one or more image format options",
169       "-delay value         display the next image after pausing",
170       "-density geometry    horizontal and vertical density of the image",
171       "-depth value         image depth",
172       "-display server      display image to this X server",
173       "-dispose method      layer disposal method",
174       "-dither method       apply error diffusion to image",
175       "-endian type         endianness (MSB or LSB) of the image",
176       "-filter type         use this filter when resizing an image",
177       "-format string     output formatted image characteristics",
178       "-geometry geometry   preferred size and location of the Image window",
179       "-gravity type        horizontal and vertical backdrop placement",
180       "-identify            identify the format and characteristics of the image",
181       "-immutable           displayed image cannot be modified",
182       "-interlace type      type of image interlacing scheme",
183       "-interpolate method  pixel color interpolation method",
184       "-label string        assign a label to an image",
185       "-limit type value    pixel cache resource limit",
186       "-loop iterations     loop images then exit",
187       "-map type            display image using this Standard Colormap",
188       "-monitor             monitor progress",
189       "-page geometry       size and location of an image canvas",
190       "-profile filename    add, delete, or apply an image profile",
191       "-quality value       JPEG/MIFF/PNG compression level",
192       "-quantize colorspace reduce colors in this colorspace",
193       "-quiet               suppress all warning messages",
194       "-regard-warnings     pay attention to warning messages",
195       "-remote command      execute a command in an remote display process",
196       "-repage geometry     size and location of an image canvas (operator)",
197       "-respect-parentheses settings remain in effect until parenthesis boundary",
198       "-sampling-factor geometry",
199       "                     horizontal and vertical sampling factor",
200       "-seed value          seed a new sequence of pseudo-random numbers",
201       "-set property value  set an image property",
202       "-size geometry       width and height of image",
203       "-texture filename    name of texture to tile onto the image background",
204       "-transparent-color color",
205       "                     transparent color",
206       "-treedepth value     color tree depth",
207       "-update seconds      detect when image file is modified and redisplay",
208       "-verbose             print detailed information about the image",
209       "-visual type         display image using this visual type",
210       "-virtual-pixel method",
211       "                     virtual pixel access method",
212       "-window id           display image to background of this window",
213       "-window-group id     exit program when this window id is destroyed",
214       "-write filename      write image to a file",
215       (char *) NULL
216     },
217     *sequence_operators[]=
218     {
219       "-coalesce            merge a sequence of images",
220       "-flatten             flatten a sequence of images",
221       (char *) NULL
222     };
223
224   (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
225   (void) printf("Copyright: %s\n",GetMagickCopyright());
226   (void) printf("Features: %s\n\n",GetMagickFeatures());
227   (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n",
228     GetClientName());
229   (void) printf("\nImage Settings:\n");
230   for (p=settings; *p != (char *) NULL; p++)
231     (void) printf("  %s\n",*p);
232   (void) printf("\nImage Operators:\n");
233   for (p=operators; *p != (char *) NULL; p++)
234     (void) printf("  %s\n",*p);
235   (void) printf("\nImage Sequence Operators:\n");
236   for (p=sequence_operators; *p != (char *) NULL; p++)
237     (void) printf("  %s\n",*p);
238   (void) printf("\nMiscellaneous Options:\n");
239   for (p=miscellaneous; *p != (char *) NULL; p++)
240     (void) printf("  %s\n",*p);
241   (void) printf(
242     "\nIn addition to those listed above, you can specify these standard X\n");
243   (void) printf(
244     "resources as command line options:  -background, -bordercolor,\n");
245   (void) printf(
246     "-borderwidth, -font, -foreground, -iconGeometry, -iconic, -mattecolor,\n");
247   (void) printf("-name, -shared-memory, -usePixmap, or -title.\n");
248   (void) printf(
249     "\nBy default, the image format of `file' is determined by its magic\n");
250   (void) printf(
251     "number.  To specify a particular image format, precede the filename\n");
252   (void) printf(
253     "with an image format name and a colon (i.e. ps:image) or specify the\n");
254   (void) printf(
255     "image type as the filename suffix (i.e. image.ps).  Specify 'file' as\n");
256   (void) printf("'-' for standard input or output.\n");
257   (void) printf("\nButtons: \n");
258   for (p=buttons; *p != (char *) NULL; p++)
259     (void) printf("  %s\n",*p);
260   return(MagickFalse);
261 }
262
263 WandExport MagickBooleanType DisplayImageCommand(ImageInfo *image_info,
264   int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
265 {
266 #if defined(MAGICKCORE_X11_DELEGATE)
267 #define DestroyDisplay() \
268 { \
269   if ((state & ExitState) == 0) \
270     DestroyXResources(); \
271   if (display != (Display *) NULL) \
272     { \
273       XCloseDisplay(display); \
274       display=(Display *) NULL; \
275     } \
276   XDestroyResourceInfo(&resource_info); \
277   DestroyImageStack(); \
278   if (image_marker != (size_t *) NULL) \
279     image_marker=(size_t *) RelinquishMagickMemory(image_marker); \
280   for (i=0; i < (ssize_t) argc; i++) \
281     argv[i]=DestroyString(argv[i]); \
282   argv=(char **) RelinquishMagickMemory(argv); \
283 }
284 #define ThrowDisplayException(asperity,tag,option) \
285 { \
286   (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
287     option); \
288   DestroyDisplay(); \
289   return(MagickFalse); \
290 }
291 #define ThrowDisplayInvalidArgumentException(option,argument) \
292 { \
293   (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
294     "InvalidArgument","`%s': %s",option,argument); \
295   DestroyDisplay(); \
296   return(MagickFalse); \
297 }
298
299   char
300     *resource_value,
301     *server_name;
302
303   const char
304     *option;
305
306   Display
307     *display;
308
309   Image
310     *image;
311
312   ImageStack
313     image_stack[MaxImageStackDepth+1];
314
315   MagickBooleanType
316     fire,
317     pend,
318     respect_parenthesis;
319
320   MagickStatusType
321     status;
322
323   QuantizeInfo
324     *quantize_info;
325
326   register ssize_t
327     i;
328
329   size_t
330     *image_marker,
331     iterations,
332     last_image,
333     state;
334
335   ssize_t
336     image_number,
337     iteration,
338     j,
339     k,
340     l;
341
342   XResourceInfo
343     resource_info;
344
345   XrmDatabase
346     resource_database;
347
348   /*
349     Set defaults.
350   */
351   assert(image_info != (ImageInfo *) NULL);
352   assert(image_info->signature == MagickSignature);
353   if (image_info->debug != MagickFalse)
354     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
355   assert(exception != (ExceptionInfo *) NULL);
356   if (argc == 2)
357     {
358       option=argv[1];
359       if ((LocaleCompare("version",option+1) == 0) ||
360           (LocaleCompare("-version",option+1) == 0))
361         {
362           (void) FormatLocaleFile(stdout,"Version: %s\n",
363             GetMagickVersion((size_t *) NULL));
364           (void) FormatLocaleFile(stdout,"Copyright: %s\n",
365             GetMagickCopyright());
366           (void) FormatLocaleFile(stdout,"Features: %s\n\n",
367             GetMagickFeatures());
368           return(MagickFalse);
369         }
370     }
371   SetNotifyHandlers;
372   display=(Display *) NULL;
373   j=1;
374   k=0;
375   image_marker=(size_t *) NULL;
376   image_number=0;
377   last_image=0;
378   NewImageStack();
379   option=(char *) NULL;
380   pend=MagickFalse;
381   respect_parenthesis=MagickFalse;
382   resource_database=(XrmDatabase) NULL;
383   (void) ResetMagickMemory(&resource_info,0,sizeof(resource_info));
384   server_name=(char *) NULL;
385   state=0;
386   status=MagickTrue;
387   ReadCommandlLine(argc,&argv);
388   status=ExpandFilenames(&argc,&argv);
389   if (status == MagickFalse)
390     ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
391       GetExceptionMessage(errno));
392   image_marker=(size_t *) AcquireQuantumMemory((size_t) argc+1UL,
393     sizeof(*image_marker));
394   if (image_marker == (size_t *) NULL)
395     ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
396       GetExceptionMessage(errno));
397   for (i=0; i <= (ssize_t) argc; i++)
398     image_marker[i]=(size_t) argc;
399   /*
400     Check for server name specified on the command line.
401   */
402   for (i=1; i < (ssize_t) argc; i++)
403   {
404     /*
405       Check command line for server name.
406     */
407     option=argv[i];
408     if (LocaleCompare("display",option+1) == 0)
409       {
410         /*
411           User specified server name.
412         */
413         i++;
414         if (i == (ssize_t) argc)
415           ThrowDisplayException(OptionError,"MissingArgument",option);
416         server_name=argv[i];
417       }
418     if ((LocaleCompare("help",option+1) == 0) ||
419         (LocaleCompare("-help",option+1) == 0))
420       return(DisplayUsage());
421   }
422   /*
423     Get user defaults from X resource database.
424   */
425   display=XOpenDisplay(server_name);
426   if (display == (Display *) NULL)
427     ThrowDisplayException(XServerError,"UnableToOpenXServer",
428       XDisplayName(server_name));
429   (void) XSetErrorHandler(XError);
430   resource_database=XGetResourceDatabase(display,GetClientName());
431   XGetResourceInfo(image_info,resource_database,GetClientName(),
432     &resource_info);
433   quantize_info=resource_info.quantize_info;
434   image_info->density=XGetResourceInstance(resource_database,GetClientName(),
435     "density",(char *) NULL);
436   if (image_info->density == (char *) NULL)
437     image_info->density=XGetScreenDensity(display);
438   resource_value=XGetResourceInstance(resource_database,GetClientName(),
439     "interlace","none");
440   image_info->interlace=(InterlaceType)
441     ParseCommandOption(MagickInterlaceOptions,MagickFalse,resource_value);
442   image_info->page=XGetResourceInstance(resource_database,GetClientName(),
443     "pageGeometry",(char *) NULL);
444   resource_value=XGetResourceInstance(resource_database,GetClientName(),
445     "quality","75");
446   image_info->quality=StringToUnsignedLong(resource_value);
447   resource_value=XGetResourceInstance(resource_database,GetClientName(),
448     "verbose","False");
449   image_info->verbose=IsMagickTrue(resource_value);
450   resource_value=XGetResourceInstance(resource_database,GetClientName(),
451     "dither","True");
452   quantize_info->dither=IsMagickTrue(resource_value);
453   /*
454     Parse command line.
455   */
456   iteration=0;
457   for (i=1; ((i <= (ssize_t) argc) && ((state & ExitState) == 0)); i++)
458   {
459     if (i < (ssize_t) argc)
460       option=argv[i];
461     else
462       if (image != (Image *) NULL)
463         break;
464       else
465         if (isatty(STDIN_FILENO) != MagickFalse)
466           option="logo:";
467         else
468           {
469             int
470               c;
471
472             c=getc(stdin);
473             if (c == EOF)
474               break;
475             else
476               {
477                 c=ungetc(c,stdin);
478                 option="-";
479               }
480           }
481     if (LocaleCompare(option,"(") == 0)
482       {
483         FireImageStack(MagickFalse,MagickTrue,pend);
484         if (k == MaxImageStackDepth)
485           ThrowDisplayException(OptionError,"ParenthesisNestedTooDeeply",
486             option);
487         PushImageStack();
488         continue;
489       }
490     if (LocaleCompare(option,")") == 0)
491       {
492         FireImageStack(MagickFalse,MagickTrue,MagickTrue);
493         if (k == 0)
494           ThrowDisplayException(OptionError,"UnableToParseExpression",option);
495         PopImageStack();
496         continue;
497       }
498     if (IsCommandOption(option) == MagickFalse)
499       {
500         const char
501           *filename;
502
503         Image
504           *display_image,
505           *images;
506
507         /*
508           Option is a file name.
509         */
510         FireImageStack(MagickFalse,MagickFalse,pend);
511         filename=option;
512         if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
513           {
514             option=argv[++i];
515             filename=option;
516           }
517         (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
518         images=ReadImage(image_info,exception);
519         CatchException(exception);
520         status&=(images != (Image *) NULL) &&
521           (exception->severity < ErrorException);
522         if (images == (Image *) NULL)
523           continue;
524         AppendImageStack(images);
525         FinalizeImageSettings(image_info,image,MagickFalse);
526         iterations=0;
527         if (i == (ssize_t) (argc-1))
528           iterations=image->iterations;
529         display_image=CloneImageList(image,exception);
530         if (display_image == (Image *) NULL)
531           ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
532             GetExceptionMessage(errno));
533         do
534         {
535           /*
536             Transmogrify image as defined by the image processing options.
537           */
538           resource_info.quantum=1;
539           if (resource_info.window_id != (char *) NULL)
540             {
541               /*
542                 Display image to a specified X window.
543               */
544               status=XDisplayBackgroundImage(display,&resource_info,
545                 display_image);
546               if (status != MagickFalse)
547                 {
548                   state|=RetainColorsState;
549                   status=MagickFalse;
550                 }
551             }
552           else
553             do
554             {
555               Image
556                 *nexus;
557
558               /*
559                 Display image to X server.
560               */
561               if (resource_info.delay != 1)
562                 display_image->delay=resource_info.delay;
563               nexus=XDisplayImage(display,&resource_info,argv,argc,
564                 &display_image,&state);
565               status&=nexus != (Image *) NULL;
566               if (nexus == (Image *) NULL)
567                 break;
568               while ((nexus != (Image *) NULL) && ((state & ExitState) == 0))
569               {
570                 Image
571                   *next;
572
573                 if (nexus->montage != (char *) NULL)
574                   {
575                     /*
576                       User selected a visual directory image (montage).
577                     */
578                     display_image=nexus;
579                     break;
580                   }
581                 next=XDisplayImage(display,&resource_info,argv,argc,&nexus,
582                   &state);
583                 if ((next == (Image *) NULL) &&
584                     (GetNextImageInList(nexus) != (Image *) NULL))
585                   {
586                     display_image=GetNextImageInList(nexus);
587                     nexus=NewImageList();
588                   }
589                 else
590                   {
591                     if (nexus != display_image)
592                       nexus=DestroyImageList(nexus);
593                     nexus=next;
594                   }
595               }
596             } while ((state & ExitState) == 0);
597           if (resource_info.write_filename != (char *) NULL)
598             {
599               /*
600                 Write image.
601               */
602               (void) CopyMagickString(display_image->filename,
603                 resource_info.write_filename,MaxTextExtent);
604               (void) SetImageInfo(image_info,1,&display_image->exception);
605               status&=WriteImage(image_info,display_image);
606               GetImageException(display_image,exception);
607             }
608           /*
609             Proceed to next/previous image.
610           */
611           if ((state & FormerImageState) != 0)
612             for (l=0; l < (ssize_t) resource_info.quantum; l++)
613             {
614               display_image=GetPreviousImageInList(display_image);
615               if (display_image == (Image *) NULL)
616                 break;
617             }
618           else
619             for (l=0; l < (ssize_t) resource_info.quantum; l++)
620             {
621               display_image=GetNextImageInList(display_image);
622               if (display_image == (Image *) NULL)
623                 break;
624             }
625         } while ((display_image != (Image *) NULL) && ((state & ExitState) == 0));
626         /*
627           Free image resources.
628         */
629         display_image=DestroyImageList(display_image);
630         if ((state & FormerImageState) == 0)
631           {
632             last_image=(size_t) image_number;
633             image_marker[i]=(size_t) image_number++;
634           }
635         else
636           {
637             /*
638               Proceed to previous image.
639             */
640             for (i--; i > 0; i--)
641               if (image_marker[i] == (size_t) (image_number-2))
642                 break;
643             image_number--;
644           }
645         if ((i == (ssize_t) (argc-1)) && ((state & ExitState) == 0))
646           i=0;
647         if ((state & ExitState) != 0)
648           break;
649         /*
650           Determine if we should proceed to the first image.
651         */
652         if (image_number < 0)
653           {
654             if ((state & FormerImageState) != 0)
655               {
656
657                 for (i=1; i < (ssize_t) (argc-2); i++)
658                   if (last_image == image_marker[i])
659                     break;
660                 image_number=(ssize_t) image_marker[i]+1;
661               }
662             continue;
663           }
664         if (resource_info.window_id != (char *) NULL)
665           state|=ExitState;
666         if ((iterations != 0) && (++iteration == (ssize_t) iterations))
667           state|=ExitState;
668         if (LocaleCompare(filename,"-") == 0)
669           state|=ExitState;
670         continue;
671       }
672     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
673     switch (*(option+1))
674     {
675       case 'a':
676       {
677         if (LocaleCompare("alpha",option+1) == 0)
678           {
679             ssize_t
680               type;
681
682             if (*option == '+')
683               break;
684             i++;
685             if (i == (ssize_t) argc)
686               ThrowDisplayException(OptionError,"MissingArgument",option);
687             type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
688             if (type < 0)
689               ThrowDisplayException(OptionError,"UnrecognizedAlphaChannelType",
690                 argv[i]);
691             break;
692           }
693         if (LocaleCompare("antialias",option+1) == 0)
694           break;
695         if (LocaleCompare("authenticate",option+1) == 0)
696           {
697             if (*option == '+')
698               break;
699             i++;
700             if (i == (ssize_t) argc)
701               ThrowDisplayException(OptionError,"MissingArgument",option);
702             break;
703           }
704         if (LocaleCompare("auto-orient",option+1) == 0)
705           break;
706         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
707       }
708       case 'b':
709       {
710         if (LocaleCompare("backdrop",option+1) == 0)
711           {
712             resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse;
713             break;
714           }
715         if (LocaleCompare("background",option+1) == 0)
716           {
717             if (*option == '+')
718               break;
719             i++;
720             if (i == (ssize_t) argc)
721               ThrowDisplayException(OptionError,"MissingArgument",option);
722             resource_info.background_color=argv[i];
723             break;
724           }
725         if (LocaleCompare("border",option+1) == 0)
726           {
727             if (*option == '+')
728               break;
729             i++;
730             if (i == (ssize_t) argc)
731               ThrowDisplayException(OptionError,"MissingArgument",option);
732             if (IsGeometry(argv[i]) == MagickFalse)
733               ThrowDisplayInvalidArgumentException(option,argv[i]);
734             break;
735           }
736         if (LocaleCompare("bordercolor",option+1) == 0)
737           {
738             if (*option == '+')
739               break;
740             i++;
741             if (i == (ssize_t) argc)
742               ThrowDisplayException(OptionError,"MissingArgument",option);
743             resource_info.border_color=argv[i];
744             break;
745           }
746         if (LocaleCompare("borderwidth",option+1) == 0)
747           {
748             resource_info.border_width=0;
749             if (*option == '+')
750               break;
751             i++;
752             if (i == (ssize_t) argc)
753               ThrowDisplayException(OptionError,"MissingArgument",option);
754             if (IsGeometry(argv[i]) == MagickFalse)
755               ThrowDisplayInvalidArgumentException(option,argv[i]);
756             resource_info.border_width=(unsigned int)
757               StringToUnsignedLong(argv[i]);
758             break;
759           }
760         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
761       }
762       case 'c':
763       {
764         if (LocaleCompare("cache",option+1) == 0)
765           {
766             if (*option == '+')
767               break;
768             i++;
769             if (i == (ssize_t) argc)
770               ThrowDisplayException(OptionError,"MissingArgument",option);
771             if (IsGeometry(argv[i]) == MagickFalse)
772               ThrowDisplayInvalidArgumentException(option,argv[i]);
773             break;
774           }
775         if (LocaleCompare("channel",option+1) == 0)
776           {
777             ssize_t
778               channel;
779
780             if (*option == '+')
781               break;
782             i++;
783             if (i == (ssize_t) (argc-1))
784               ThrowDisplayException(OptionError,"MissingArgument",option);
785             channel=ParseChannelOption(argv[i]);
786             if (channel < 0)
787               ThrowDisplayException(OptionError,"UnrecognizedChannelType",
788                 argv[i]);
789             break;
790           }
791         if (LocaleCompare("clip",option+1) == 0)
792           break;
793         if (LocaleCompare("clip-path",option+1) == 0)
794           {
795             i++;
796             if (i == (ssize_t) argc)
797               ThrowDisplayException(OptionError,"MissingArgument",option);
798             break;
799           }
800         if (LocaleCompare("coalesce",option+1) == 0)
801           break;
802         if (LocaleCompare("colormap",option+1) == 0)
803           {
804             resource_info.colormap=PrivateColormap;
805             if (*option == '+')
806               break;
807             i++;
808             if (i == (ssize_t) argc)
809               ThrowDisplayException(OptionError,"MissingArgument",option);
810             resource_info.colormap=UndefinedColormap;
811             if (LocaleCompare("private",argv[i]) == 0)
812               resource_info.colormap=PrivateColormap;
813             if (LocaleCompare("shared",argv[i]) == 0)
814               resource_info.colormap=SharedColormap;
815             if (resource_info.colormap == UndefinedColormap)
816               ThrowDisplayException(OptionError,"UnrecognizedColormapType",
817                 argv[i]);
818             break;
819           }
820         if (LocaleCompare("colors",option+1) == 0)
821           {
822             quantize_info->number_colors=0;
823             if (*option == '+')
824               break;
825             i++;
826             if (i == (ssize_t) argc)
827               ThrowDisplayException(OptionError,"MissingArgument",option);
828             if (IsGeometry(argv[i]) == MagickFalse)
829               ThrowDisplayInvalidArgumentException(option,argv[i]);
830             quantize_info->number_colors=StringToUnsignedLong(argv[i]);
831             break;
832           }
833         if (LocaleCompare("colorspace",option+1) == 0)
834           {
835             ssize_t
836               colorspace;
837
838             if (*option == '+')
839               break;
840             i++;
841             if (i == (ssize_t) argc)
842               ThrowDisplayException(OptionError,"MissingArgument",option);
843             colorspace=ParseCommandOption(MagickColorspaceOptions,
844               MagickFalse,argv[i]);
845             if (colorspace < 0)
846               ThrowDisplayException(OptionError,"UnrecognizedColorspace",
847                 argv[i]);
848             break;
849           }
850         if (LocaleCompare("comment",option+1) == 0)
851           {
852             if (*option == '+')
853               break;
854             i++;
855             if (i == (ssize_t) argc)
856               ThrowDisplayException(OptionError,"MissingArgument",option);
857             break;
858           }
859         if (LocaleCompare("compress",option+1) == 0)
860           {
861             ssize_t
862               compress;
863
864             if (*option == '+')
865               break;
866             i++;
867             if (i == (ssize_t) argc)
868               ThrowDisplayException(OptionError,"MissingArgument",option);
869             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
870               argv[i]);
871             if (compress < 0)
872               ThrowDisplayException(OptionError,"UnrecognizedImageCompression",
873                 argv[i]);
874             break;
875           }
876         if (LocaleCompare("concurrent",option+1) == 0)
877           break;
878         if (LocaleCompare("contrast",option+1) == 0)
879           break;
880         if (LocaleCompare("crop",option+1) == 0)
881           {
882             if (*option == '+')
883               break;
884             i++;
885             if (i == (ssize_t) argc)
886               ThrowDisplayException(OptionError,"MissingArgument",option);
887             if (IsGeometry(argv[i]) == MagickFalse)
888               ThrowDisplayInvalidArgumentException(option,argv[i]);
889             break;
890           }
891         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
892       }
893       case 'd':
894       {
895         if (LocaleCompare("debug",option+1) == 0)
896           {
897             ssize_t
898               event;
899
900             if (*option == '+')
901               break;
902             i++;
903             if (i == (ssize_t) argc)
904               ThrowDisplayException(OptionError,"MissingArgument",option);
905             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
906             if (event < 0)
907               ThrowDisplayException(OptionError,"UnrecognizedEventType",
908                 argv[i]);
909             (void) SetLogEventMask(argv[i]);
910             break;
911           }
912         if (LocaleCompare("decipher",option+1) == 0)
913           {
914             if (*option == '+')
915               break;
916             i++;
917             if (i == (ssize_t) (argc-1))
918               ThrowDisplayException(OptionError,"MissingArgument",option);
919             break;
920           }
921         if (LocaleCompare("define",option+1) == 0)
922           {
923             i++;
924             if (i == (ssize_t) argc)
925               ThrowDisplayException(OptionError,"MissingArgument",option);
926             if (*option == '+')
927               {
928                 const char
929                   *define;
930
931                 define=GetImageOption(image_info,argv[i]);
932                 if (define == (const char *) NULL)
933                   ThrowDisplayException(OptionError,"NoSuchOption",argv[i]);
934                 break;
935               }
936             break;
937           }
938         if (LocaleCompare("delay",option+1) == 0)
939           {
940             if (*option == '+')
941               break;
942             i++;
943             if (i == (ssize_t) argc)
944               ThrowDisplayException(OptionError,"MissingArgument",option);
945             if (IsGeometry(argv[i]) == MagickFalse)
946               ThrowDisplayInvalidArgumentException(option,argv[i]);
947             break;
948           }
949         if (LocaleCompare("density",option+1) == 0)
950           {
951             if (*option == '+')
952               break;
953             i++;
954             if (i == (ssize_t) argc)
955               ThrowDisplayException(OptionError,"MissingArgument",option);
956             if (IsGeometry(argv[i]) == MagickFalse)
957               ThrowDisplayInvalidArgumentException(option,argv[i]);
958             break;
959           }
960         if (LocaleCompare("depth",option+1) == 0)
961           {
962             if (*option == '+')
963               break;
964             i++;
965             if (i == (ssize_t) argc)
966               ThrowDisplayException(OptionError,"MissingArgument",option);
967             if (IsGeometry(argv[i]) == MagickFalse)
968               ThrowDisplayInvalidArgumentException(option,argv[i]);
969             break;
970           }
971         if (LocaleCompare("deskew",option+1) == 0)
972           {
973             if (*option == '+')
974               break;
975             i++;
976             if (i == (ssize_t) (argc-1))
977               ThrowDisplayException(OptionError,"MissingArgument",option);
978             if (IsGeometry(argv[i]) == MagickFalse)
979               ThrowDisplayInvalidArgumentException(option,argv[i]);
980             break;
981           }
982         if (LocaleCompare("despeckle",option+1) == 0)
983           break;
984         if (LocaleCompare("display",option+1) == 0)
985           {
986             if (*option == '+')
987               break;
988             i++;
989             if (i == (ssize_t) argc)
990               ThrowDisplayException(OptionError,"MissingArgument",option);
991             break;
992           }
993         if (LocaleCompare("dispose",option+1) == 0)
994           {
995             ssize_t
996               dispose;
997
998             if (*option == '+')
999               break;
1000             i++;
1001             if (i == (ssize_t) argc)
1002               ThrowDisplayException(OptionError,"MissingArgument",option);
1003             dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
1004             if (dispose < 0)
1005               ThrowDisplayException(OptionError,"UnrecognizedDisposeMethod",
1006                 argv[i]);
1007             break;
1008           }
1009         if (LocaleCompare("dither",option+1) == 0)
1010           {
1011             ssize_t
1012               method;
1013
1014             quantize_info->dither=MagickFalse;
1015             if (*option == '+')
1016               break;
1017             i++;
1018             if (i == (ssize_t) argc)
1019               ThrowDisplayException(OptionError,"MissingArgument",option);
1020             method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
1021             if (method < 0)
1022               ThrowDisplayException(OptionError,"UnrecognizedDitherMethod",
1023                 argv[i]);
1024             quantize_info->dither=MagickTrue;
1025             quantize_info->dither_method=(DitherMethod) method;
1026             break;
1027           }
1028         if (LocaleCompare("duration",option+1) == 0)
1029           {
1030             if (*option == '+')
1031               break;
1032             i++;
1033             if (i == (ssize_t) (argc-1))
1034               ThrowDisplayException(OptionError,"MissingArgument",option);
1035             if (IsGeometry(argv[i]) == MagickFalse)
1036               ThrowDisplayInvalidArgumentException(option,argv[i]);
1037             break;
1038           }
1039         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1040       }
1041       case 'e':
1042       {
1043         if (LocaleCompare("edge",option+1) == 0)
1044           {
1045             if (*option == '+')
1046               break;
1047             i++;
1048             if (i == (ssize_t) argc)
1049               ThrowDisplayException(OptionError,"MissingArgument",option);
1050             if (IsGeometry(argv[i]) == MagickFalse)
1051               ThrowDisplayInvalidArgumentException(option,argv[i]);
1052             break;
1053           }
1054         if (LocaleCompare("endian",option+1) == 0)
1055           {
1056             ssize_t
1057               endian;
1058
1059             if (*option == '+')
1060               break;
1061             i++;
1062             if (i == (ssize_t) argc)
1063               ThrowDisplayException(OptionError,"MissingArgument",option);
1064             endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
1065               argv[i]);
1066             if (endian < 0)
1067               ThrowDisplayException(OptionError,"UnrecognizedEndianType",
1068                 argv[i]);
1069             break;
1070           }
1071         if (LocaleCompare("enhance",option+1) == 0)
1072           break;
1073         if (LocaleCompare("equalize",option+1) == 0)
1074           break;
1075         if (LocaleCompare("extract",option+1) == 0)
1076           {
1077             if (*option == '+')
1078               break;
1079             i++;
1080             if (i == (ssize_t) argc)
1081               ThrowDisplayException(OptionError,"MissingArgument",option);
1082             if (IsGeometry(argv[i]) == MagickFalse)
1083               ThrowDisplayInvalidArgumentException(option,argv[i]);
1084             break;
1085           }
1086         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1087       }
1088       case 'f':
1089       {
1090         if (LocaleCompare("filter",option+1) == 0)
1091           {
1092             ssize_t
1093               filter;
1094
1095             if (*option == '+')
1096               break;
1097             i++;
1098             if (i == (ssize_t) argc)
1099               ThrowDisplayException(OptionError,"MissingArgument",option);
1100             filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
1101             if (filter < 0)
1102               ThrowDisplayException(OptionError,"UnrecognizedImageFilter",
1103                 argv[i]);
1104             break;
1105           }
1106         if (LocaleCompare("flatten",option+1) == 0)
1107           break;
1108         if (LocaleCompare("flip",option+1) == 0)
1109           break;
1110         if (LocaleCompare("flop",option+1) == 0)
1111           break;
1112         if (LocaleCompare("font",option+1) == 0)
1113           {
1114             if (*option == '+')
1115               break;
1116             i++;
1117             if (i == (ssize_t) argc)
1118               ThrowDisplayException(OptionError,"MissingArgument",option);
1119             resource_info.font=XGetResourceClass(resource_database,
1120               GetClientName(),"font",argv[i]);
1121             break;
1122           }
1123         if (LocaleCompare("foreground",option+1) == 0)
1124           {
1125             if (*option == '+')
1126               break;
1127             i++;
1128             if (i == (ssize_t) argc)
1129               ThrowDisplayException(OptionError,"MissingArgument",option);
1130             resource_info.foreground_color=argv[i];
1131             break;
1132           }
1133         if (LocaleCompare("format",option+1) == 0)
1134           {
1135             if (*option == '+')
1136               break;
1137             i++;
1138             if (i == (ssize_t) (argc-1))
1139               ThrowDisplayException(OptionError,"MissingArgument",option);
1140             break;
1141           }
1142         if (LocaleCompare("frame",option+1) == 0)
1143           {
1144             if (*option == '+')
1145               break;
1146             i++;
1147             if (i == (ssize_t) argc)
1148               ThrowDisplayException(OptionError,"MissingArgument",option);
1149             if (IsGeometry(argv[i]) == MagickFalse)
1150               ThrowDisplayInvalidArgumentException(option,argv[i]);
1151             break;
1152           }
1153         if (LocaleCompare("fuzz",option+1) == 0)
1154           {
1155             if (*option == '+')
1156               break;
1157             i++;
1158             if (i == (ssize_t) (argc-1))
1159               ThrowDisplayException(OptionError,"MissingArgument",option);
1160             if (IsGeometry(argv[i]) == MagickFalse)
1161               ThrowDisplayInvalidArgumentException(option,argv[i]);
1162             break;
1163           }
1164         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1165       }
1166       case 'g':
1167       {
1168         if (LocaleCompare("gamma",option+1) == 0)
1169           {
1170             i++;
1171             if (i == (ssize_t) argc)
1172               ThrowDisplayException(OptionError,"MissingArgument",option);
1173             if (IsGeometry(argv[i]) == MagickFalse)
1174               ThrowDisplayInvalidArgumentException(option,argv[i]);
1175             break;
1176           }
1177         if (LocaleCompare("geometry",option+1) == 0)
1178           {
1179             resource_info.image_geometry=(char *) NULL;
1180             if (*option == '+')
1181               break;
1182             (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
1183             i++;
1184             if (i == (ssize_t) argc)
1185               ThrowDisplayException(OptionError,"MissingArgument",option);
1186             if (IsGeometry(argv[i]) == MagickFalse)
1187               ThrowDisplayInvalidArgumentException(option,argv[i]);
1188             resource_info.image_geometry=ConstantString(argv[i]);
1189             break;
1190           }
1191         if (LocaleCompare("gravity",option+1) == 0)
1192           {
1193             ssize_t
1194               gravity;
1195
1196             if (*option == '+')
1197               break;
1198             i++;
1199             if (i == (ssize_t) (argc-1))
1200               ThrowDisplayException(OptionError,"MissingArgument",option);
1201             gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1202               argv[i]);
1203             if (gravity < 0)
1204               ThrowDisplayException(OptionError,"UnrecognizedGravityType",
1205                 argv[i]);
1206             break;
1207           }
1208         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1209       }
1210       case 'h':
1211       {
1212         if ((LocaleCompare("help",option+1) == 0) ||
1213             (LocaleCompare("-help",option+1) == 0))
1214           break;
1215         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1216       }
1217       case 'i':
1218       {
1219         if (LocaleCompare("identify",option+1) == 0)
1220           break;
1221         if (LocaleCompare("iconGeometry",option+1) == 0)
1222           {
1223             resource_info.icon_geometry=(char *) NULL;
1224             if (*option == '+')
1225               break;
1226             i++;
1227             if (i == (ssize_t) argc)
1228               ThrowDisplayException(OptionError,"MissingArgument",option);
1229             if (IsGeometry(argv[i]) == MagickFalse)
1230               ThrowDisplayInvalidArgumentException(option,argv[i]);
1231             resource_info.icon_geometry=argv[i];
1232             break;
1233           }
1234         if (LocaleCompare("iconic",option+1) == 0)
1235           {
1236             resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse;
1237             break;
1238           }
1239         if (LocaleCompare("immutable",option+1) == 0)
1240           {
1241             resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse;
1242             break;
1243           }
1244         if (LocaleCompare("interlace",option+1) == 0)
1245           {
1246             ssize_t
1247               interlace;
1248
1249             if (*option == '+')
1250               break;
1251             i++;
1252             if (i == (ssize_t) argc)
1253               ThrowDisplayException(OptionError,"MissingArgument",option);
1254             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1255               argv[i]);
1256             if (interlace < 0)
1257               ThrowDisplayException(OptionError,"UnrecognizedInterlaceType",
1258                 argv[i]);
1259             break;
1260           }
1261         if (LocaleCompare("interpolate",option+1) == 0)
1262           {
1263             ssize_t
1264               interpolate;
1265
1266             if (*option == '+')
1267               break;
1268             i++;
1269             if (i == (ssize_t) argc)
1270               ThrowDisplayException(OptionError,"MissingArgument",option);
1271             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1272               argv[i]);
1273             if (interpolate < 0)
1274               ThrowDisplayException(OptionError,"UnrecognizedInterpolateMethod",
1275                 argv[i]);
1276             break;
1277           }
1278         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1279       }
1280       case 'l':
1281       {
1282         if (LocaleCompare("label",option+1) == 0)
1283           {
1284             if (*option == '+')
1285               break;
1286             i++;
1287             if (i == (ssize_t) argc)
1288               ThrowDisplayException(OptionError,"MissingArgument",option);
1289             break;
1290           }
1291         if (LocaleCompare("limit",option+1) == 0)
1292           {
1293             char
1294               *p;
1295
1296             double
1297               value;
1298
1299             ssize_t
1300               resource;
1301
1302             if (*option == '+')
1303               break;
1304             i++;
1305             if (i == (ssize_t) argc)
1306               ThrowDisplayException(OptionError,"MissingArgument",option);
1307             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1308               argv[i]);
1309             if (resource < 0)
1310               ThrowDisplayException(OptionError,"UnrecognizedResourceType",
1311                 argv[i]);
1312             i++;
1313             if (i == (ssize_t) argc)
1314               ThrowDisplayException(OptionError,"MissingArgument",option);
1315             value=InterpretLocaleValue(argv[i],&p);
1316             (void) value;
1317             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
1318               ThrowDisplayInvalidArgumentException(option,argv[i]);
1319             break;
1320           }
1321         if (LocaleCompare("list",option+1) == 0)
1322           {
1323             ssize_t
1324               list;
1325
1326             if (*option == '+')
1327               break;
1328             i++;
1329             if (i == (ssize_t) argc)
1330               ThrowDisplayException(OptionError,"MissingArgument",option);
1331             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1332             if (list < 0)
1333               ThrowDisplayException(OptionError,"UnrecognizedListType",argv[i]);
1334             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
1335               argv+j,exception);
1336             DestroyDisplay();
1337             return(status != 0 ? MagickFalse : MagickTrue);
1338           }
1339         if (LocaleCompare("log",option+1) == 0)
1340           {
1341             if (*option == '+')
1342               break;
1343             i++;
1344             if ((i == (ssize_t) argc) ||
1345                 (strchr(argv[i],'%') == (char *) NULL))
1346               ThrowDisplayException(OptionError,"MissingArgument",option);
1347             break;
1348           }
1349         if (LocaleCompare("loop",option+1) == 0)
1350           {
1351             if (*option == '+')
1352               break;
1353             i++;
1354             if (i == (ssize_t) (argc-1))
1355               ThrowDisplayException(OptionError,"MissingArgument",option);
1356             if (IsGeometry(argv[i]) == MagickFalse)
1357               ThrowDisplayInvalidArgumentException(option,argv[i]);
1358             iterations=StringToUnsignedLong(argv[i]);
1359             break;
1360           }
1361         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1362       }
1363       case 'm':
1364       {
1365         if (LocaleCompare("magnify",option+1) == 0)
1366           {
1367             resource_info.magnify=2;
1368             if (*option == '+')
1369               break;
1370             i++;
1371             if (i == (ssize_t) argc)
1372               ThrowDisplayException(OptionError,"MissingArgument",option);
1373             if (IsGeometry(argv[i]) == MagickFalse)
1374               ThrowDisplayInvalidArgumentException(option,argv[i]);
1375             resource_info.magnify=(unsigned int) StringToUnsignedLong(argv[i]);
1376             break;
1377           }
1378         if (LocaleCompare("map",option+1) == 0)
1379           {
1380             resource_info.map_type=(char *) NULL;
1381             if (*option == '+')
1382               break;
1383             (void) strcpy(argv[i]+1,"san");
1384             i++;
1385             if (i == (ssize_t) argc)
1386               ThrowDisplayException(OptionError,"MissingArgument",option);
1387             resource_info.map_type=argv[i];
1388             break;
1389           }
1390         if (LocaleCompare("matte",option+1) == 0)
1391           break;
1392         if (LocaleCompare("mattecolor",option+1) == 0)
1393           {
1394             if (*option == '+')
1395               break;
1396             i++;
1397             if (i == (ssize_t) argc)
1398               ThrowDisplayException(OptionError,"MissingArgument",option);
1399             resource_info.matte_color=argv[i];
1400             break;
1401           }
1402         if (LocaleCompare("monitor",option+1) == 0)
1403           break;
1404         if (LocaleCompare("monochrome",option+1) == 0)
1405           {
1406             if (*option == '+')
1407               break;
1408             quantize_info->number_colors=2;
1409             quantize_info->colorspace=GRAYColorspace;
1410             break;
1411           }
1412         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1413       }
1414       case 'n':
1415       {
1416         if (LocaleCompare("name",option+1) == 0)
1417           {
1418             resource_info.name=(char *) NULL;
1419             if (*option == '+')
1420               break;
1421             i++;
1422             if (i == (ssize_t) argc)
1423               ThrowDisplayException(OptionError,"MissingArgument",option);
1424             resource_info.name=ConstantString(argv[i]);
1425             break;
1426           }
1427         if (LocaleCompare("negate",option+1) == 0)
1428           break;
1429         if (LocaleCompare("noop",option+1) == 0)
1430           break;
1431         if (LocaleCompare("normalize",option+1) == 0)
1432           break;
1433         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1434       }
1435       case 'p':
1436       {
1437         if (LocaleCompare("page",option+1) == 0)
1438           {
1439             resource_info.image_geometry=(char *) NULL;
1440             if (*option == '+')
1441               break;
1442             i++;
1443             if (i == (ssize_t) argc)
1444               ThrowDisplayException(OptionError,"MissingArgument",option);
1445             resource_info.image_geometry=ConstantString(argv[i]);
1446             break;
1447           }
1448         if (LocaleCompare("profile",option+1) == 0)
1449           {
1450             i++;
1451             if (i == (ssize_t) argc)
1452               ThrowDisplayException(OptionError,"MissingArgument",option);
1453             break;
1454           }
1455         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1456       }
1457       case 'q':
1458       {
1459         if (LocaleCompare("quality",option+1) == 0)
1460           {
1461             if (*option == '+')
1462               break;
1463             i++;
1464             if (i == (ssize_t) argc)
1465               ThrowDisplayException(OptionError,"MissingArgument",option);
1466             if (IsGeometry(argv[i]) == MagickFalse)
1467               ThrowDisplayInvalidArgumentException(option,argv[i]);
1468             break;
1469           }
1470         if (LocaleCompare("quantize",option+1) == 0)
1471           {
1472             ssize_t
1473               colorspace;
1474
1475             if (*option == '+')
1476               break;
1477             i++;
1478             if (i == (ssize_t) (argc-1))
1479               ThrowDisplayException(OptionError,"MissingArgument",option);
1480             colorspace=ParseCommandOption(MagickColorspaceOptions,
1481               MagickFalse,argv[i]);
1482             if (colorspace < 0)
1483               ThrowDisplayException(OptionError,"UnrecognizedColorspace",
1484                 argv[i]);
1485             break;
1486           }
1487         if (LocaleCompare("quiet",option+1) == 0)
1488           break;
1489         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1490       }
1491       case 'r':
1492       {
1493         if (LocaleCompare("raise",option+1) == 0)
1494           {
1495             i++;
1496             if (i == (ssize_t) argc)
1497               ThrowDisplayException(OptionError,"MissingArgument",option);
1498             if (IsGeometry(argv[i]) == MagickFalse)
1499               ThrowDisplayInvalidArgumentException(option,argv[i]);
1500             break;
1501           }
1502         if (LocaleCompare("regard-warnings",option+1) == 0)
1503           break;
1504         if (LocaleCompare("remote",option+1) == 0)
1505           {
1506             i++;
1507             if (i == (ssize_t) argc)
1508               ThrowDisplayException(OptionError,"MissingArgument",option);
1509             if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0)
1510               return(MagickFalse);
1511             i--;
1512             break;
1513           }
1514         if (LocaleCompare("repage",option+1) == 0)
1515           {
1516             if (*option == '+')
1517               break;
1518             i++;
1519             if (i == (ssize_t) argc)
1520               ThrowDisplayException(OptionError,"MissingArgument",option);
1521             if (IsGeometry(argv[i]) == MagickFalse)
1522               ThrowDisplayInvalidArgumentException(option,argv[i]);
1523             break;
1524           }
1525         if (LocaleCompare("resample",option+1) == 0)
1526           {
1527             if (*option == '+')
1528               break;
1529             i++;
1530             if (i == (ssize_t) (argc-1))
1531               ThrowDisplayException(OptionError,"MissingArgument",option);
1532             if (IsGeometry(argv[i]) == MagickFalse)
1533               ThrowDisplayInvalidArgumentException(option,argv[i]);
1534             break;
1535           }
1536         if (LocaleCompare("resize",option+1) == 0)
1537           {
1538             if (*option == '+')
1539               break;
1540             i++;
1541             if (i == (ssize_t) argc)
1542               ThrowDisplayException(OptionError,"MissingArgument",option);
1543             if (IsGeometry(argv[i]) == MagickFalse)
1544               ThrowDisplayInvalidArgumentException(option,argv[i]);
1545             break;
1546           }
1547         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1548           {
1549             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1550             break;
1551           }
1552         if (LocaleCompare("roll",option+1) == 0)
1553           {
1554             if (*option == '+')
1555               break;
1556             i++;
1557             if (i == (ssize_t) argc)
1558               ThrowDisplayException(OptionError,"MissingArgument",option);
1559             if (IsGeometry(argv[i]) == MagickFalse)
1560               ThrowDisplayInvalidArgumentException(option,argv[i]);
1561             break;
1562           }
1563         if (LocaleCompare("rotate",option+1) == 0)
1564           {
1565             i++;
1566             if (i == (ssize_t) argc)
1567               ThrowDisplayException(OptionError,"MissingArgument",option);
1568             if (IsGeometry(argv[i]) == MagickFalse)
1569               ThrowDisplayInvalidArgumentException(option,argv[i]);
1570             break;
1571           }
1572         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1573       }
1574       case 's':
1575       {
1576         if (LocaleCompare("sample",option+1) == 0)
1577           {
1578             if (*option == '+')
1579               break;
1580             i++;
1581             if (i == (ssize_t) argc)
1582               ThrowDisplayException(OptionError,"MissingArgument",option);
1583             if (IsGeometry(argv[i]) == MagickFalse)
1584               ThrowDisplayInvalidArgumentException(option,argv[i]);
1585             break;
1586           }
1587         if (LocaleCompare("sampling-factor",option+1) == 0)
1588           {
1589             if (*option == '+')
1590               break;
1591             i++;
1592             if (i == (ssize_t) argc)
1593               ThrowDisplayException(OptionError,"MissingArgument",option);
1594             if (IsGeometry(argv[i]) == MagickFalse)
1595               ThrowDisplayInvalidArgumentException(option,argv[i]);
1596             break;
1597           }
1598         if (LocaleCompare("scenes",option+1) == 0)
1599           {
1600             if (*option == '+')
1601               break;
1602             i++;
1603             if (i == (ssize_t) argc)
1604               ThrowDisplayException(OptionError,"MissingArgument",option);
1605             if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
1606               ThrowDisplayInvalidArgumentException(option,argv[i]);
1607             break;
1608           }
1609         if (LocaleCompare("seed",option+1) == 0)
1610           {
1611             if (*option == '+')
1612               break;
1613             i++;
1614             if (i == (ssize_t) (argc-1))
1615               ThrowDisplayException(OptionError,"MissingArgument",option);
1616             if (IsGeometry(argv[i]) == MagickFalse)
1617               ThrowDisplayInvalidArgumentException(option,argv[i]);
1618             break;
1619           }
1620         if (LocaleCompare("segment",option+1) == 0)
1621           {
1622             if (*option == '+')
1623               break;
1624             i++;
1625             if (i == (ssize_t) argc)
1626               ThrowDisplayException(OptionError,"MissingArgument",option);
1627             if (IsGeometry(argv[i]) == MagickFalse)
1628               ThrowDisplayInvalidArgumentException(option,argv[i]);
1629             break;
1630           }
1631         if (LocaleCompare("set",option+1) == 0)
1632           {
1633             i++;
1634             if (i == (ssize_t) argc)
1635               ThrowDisplayException(OptionError,"MissingArgument",option);
1636             if (*option == '+')
1637               break;
1638             i++;
1639             if (i == (ssize_t) argc)
1640               ThrowDisplayException(OptionError,"MissingArgument",option);
1641             break;
1642           }
1643         if (LocaleCompare("sharpen",option+1) == 0)
1644           {
1645             if (*option == '+')
1646               break;
1647             i++;
1648             if (i == (ssize_t) argc)
1649               ThrowDisplayException(OptionError,"MissingArgument",option);
1650             if (IsGeometry(argv[i]) == MagickFalse)
1651               ThrowDisplayInvalidArgumentException(option,argv[i]);
1652             break;
1653           }
1654         if (LocaleCompare("shared-memory",option+1) == 0)
1655           {
1656             resource_info.use_shared_memory= (*option == '-') ? MagickTrue :
1657               MagickFalse;
1658             break;
1659           }
1660         if (LocaleCompare("size",option+1) == 0)
1661           {
1662             if (*option == '+')
1663               break;
1664             i++;
1665             if (i == (ssize_t) argc)
1666               ThrowDisplayException(OptionError,"MissingArgument",option);
1667             if (IsGeometry(argv[i]) == MagickFalse)
1668               ThrowDisplayInvalidArgumentException(option,argv[i]);
1669             break;
1670           }
1671         if (LocaleCompare("strip",option+1) == 0)
1672           break;
1673         if (LocaleCompare("support",option+1) == 0)
1674           {
1675             i++;  /* deprecated */
1676             break;
1677           }
1678         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1679       }
1680       case 't':
1681       {
1682         if (LocaleCompare("text-font",option+1) == 0)
1683           {
1684             resource_info.text_font=(char *) NULL;
1685             if (*option == '+')
1686               break;
1687             i++;
1688             if (i == (ssize_t) argc)
1689               ThrowDisplayException(OptionError,"MissingArgument",option);
1690             resource_info.text_font=XGetResourceClass(resource_database,
1691               GetClientName(),"font",argv[i]);
1692             break;
1693           }
1694         if (LocaleCompare("texture",option+1) == 0)
1695           {
1696             if (*option == '+')
1697               break;
1698             i++;
1699             if (i == (ssize_t) argc)
1700               ThrowDisplayException(OptionError,"MissingArgument",option);
1701             break;
1702           }
1703         if (LocaleCompare("threshold",option+1) == 0)
1704           {
1705             if (*option == '+')
1706               break;
1707             i++;
1708             if (i == (ssize_t) argc)
1709               ThrowDisplayException(OptionError,"MissingArgument",option);
1710             if (IsGeometry(argv[i]) == MagickFalse)
1711               ThrowDisplayInvalidArgumentException(option,argv[i]);
1712             break;
1713           }
1714         if (LocaleCompare("thumbnail",option+1) == 0)
1715           {
1716             if (*option == '+')
1717               break;
1718             i++;
1719             if (i == (ssize_t) argc)
1720               ThrowDisplayException(OptionError,"MissingArgument",option);
1721             if (IsGeometry(argv[i]) == MagickFalse)
1722               ThrowDisplayInvalidArgumentException(option,argv[i]);
1723             break;
1724           }
1725         if (LocaleCompare("title",option+1) == 0)
1726           {
1727             resource_info.title=(char *) NULL;
1728             if (*option == '+')
1729               break;
1730             i++;
1731             if (i == (ssize_t) argc)
1732               ThrowDisplayException(OptionError,"MissingArgument",option);
1733             resource_info.title=argv[i];
1734             break;
1735           }
1736         if (LocaleCompare("transparent-color",option+1) == 0)
1737           {
1738             if (*option == '+')
1739               break;
1740             i++;
1741             if (i == (ssize_t) (argc-1))
1742               ThrowDisplayException(OptionError,"MissingArgument",option);
1743             break;
1744           }
1745         if (LocaleCompare("treedepth",option+1) == 0)
1746           {
1747             quantize_info->tree_depth=0;
1748             if (*option == '+')
1749               break;
1750             i++;
1751             if (i == (ssize_t) argc)
1752               ThrowDisplayException(OptionError,"MissingArgument",option);
1753             if (IsGeometry(argv[i]) == MagickFalse)
1754               ThrowDisplayInvalidArgumentException(option,argv[i]);
1755             quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
1756             break;
1757           }
1758         if (LocaleCompare("trim",option+1) == 0)
1759           break;
1760         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1761       }
1762       case 'u':
1763       {
1764         if (LocaleCompare("update",option+1) == 0)
1765           {
1766             resource_info.update=(unsigned int) (*option == '-');
1767             if (*option == '+')
1768               break;
1769             i++;
1770             if (i == (ssize_t) argc)
1771               ThrowDisplayException(OptionError,"MissingArgument",option);
1772             if (IsGeometry(argv[i]) == MagickFalse)
1773               ThrowDisplayInvalidArgumentException(option,argv[i]);
1774             resource_info.update=(unsigned int) StringToUnsignedLong(argv[i]);
1775             break;
1776           }
1777         if (LocaleCompare("use-pixmap",option+1) == 0)
1778           {
1779             resource_info.use_pixmap=(*option == '-') ? MagickTrue :
1780               MagickFalse;
1781             break;
1782           }
1783         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1784       }
1785       case 'v':
1786       {
1787         if (LocaleCompare("verbose",option+1) == 0)
1788           break;
1789         if ((LocaleCompare("version",option+1) == 0) ||
1790             (LocaleCompare("-version",option+1) == 0))
1791           {
1792             (void) FormatLocaleFile(stdout,"Version: %s\n",
1793               GetMagickVersion((size_t *) NULL));
1794             (void) FormatLocaleFile(stdout,"Copyright: %s\n",
1795               GetMagickCopyright());
1796             (void) FormatLocaleFile(stdout,"Features: %s\n\n",
1797               GetMagickFeatures());
1798             break;
1799           }
1800         if (LocaleCompare("visual",option+1) == 0)
1801           {
1802             resource_info.visual_type=(char *) NULL;
1803             if (*option == '+')
1804               break;
1805             i++;
1806             if (i == (ssize_t) argc)
1807               ThrowDisplayException(OptionError,"MissingArgument",option);
1808             resource_info.visual_type=argv[i];
1809             break;
1810           }
1811         if (LocaleCompare("virtual-pixel",option+1) == 0)
1812           {
1813             ssize_t
1814               method;
1815
1816             if (*option == '+')
1817               break;
1818             i++;
1819             if (i == (ssize_t) (argc-1))
1820               ThrowDisplayException(OptionError,"MissingArgument",option);
1821             method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1822               argv[i]);
1823             if (method < 0)
1824               ThrowDisplayException(OptionError,
1825                 "UnrecognizedVirtualPixelMethod",argv[i]);
1826             break;
1827           }
1828         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1829       }
1830       case 'w':
1831       {
1832         if (LocaleCompare("window",option+1) == 0)
1833           {
1834             resource_info.window_id=(char *) NULL;
1835             if (*option == '+')
1836               break;
1837             i++;
1838             if (i == (ssize_t) argc)
1839               ThrowDisplayException(OptionError,"MissingArgument",option);
1840             resource_info.window_id=argv[i];
1841             break;
1842           }
1843         if (LocaleCompare("window-group",option+1) == 0)
1844           {
1845             resource_info.window_group=(char *) NULL;
1846             if (*option == '+')
1847               break;
1848             i++;
1849             if (i == (ssize_t) argc)
1850               ThrowDisplayException(OptionError,"MissingArgument",option);
1851             if (InterpretLocaleValue(argv[i],(char **) NULL) != 0)
1852               resource_info.window_group=argv[i];
1853             break;
1854           }
1855         if (LocaleCompare("write",option+1) == 0)
1856           {
1857             resource_info.write_filename=(char *) NULL;
1858             if (*option == '+')
1859               break;
1860             i++;
1861             if (i == (ssize_t) argc)
1862               ThrowDisplayException(OptionError,"MissingArgument",option);
1863             resource_info.write_filename=argv[i];
1864             if (IsPathAccessible(resource_info.write_filename) != MagickFalse)
1865               {
1866                 char
1867                   answer[2],
1868                   *p;
1869
1870                 (void) FormatLocaleFile(stderr,"Overwrite %s? ",
1871                   resource_info.write_filename);
1872                 p=fgets(answer,(int) sizeof(answer),stdin);
1873                 (void) p;
1874                 if (((*answer != 'y') && (*answer != 'Y')))
1875                   return(MagickFalse);
1876               }
1877             break;
1878           }
1879         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1880       }
1881       case '?':
1882         break;
1883       default:
1884         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1885     }
1886     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1887       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
1888     if (fire != MagickFalse)
1889       FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1890   }
1891   if (k != 0)
1892     ThrowDisplayException(OptionError,"UnbalancedParenthesis",argv[i]);
1893   if (state & RetainColorsState)
1894     {
1895       XRetainWindowColors(display,XRootWindow(display,XDefaultScreen(display)));
1896       (void) XSync(display,MagickFalse);
1897     }
1898   DestroyDisplay();
1899   return(status != 0 ? MagickTrue : MagickFalse);
1900 #else
1901   (void) argc;
1902   (void) argv;
1903   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
1904     "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
1905   return(DisplayUsage());
1906 #endif
1907 }