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