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