]> granicus.if.org Git - imagemagick/blob - MagickWand/display.c
(no commit message)
[imagemagick] / MagickWand / display.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %                                                                             %
4 %                                                                             %
5 %                                                                             %
6 %               DDDD   IIIII  SSSSS  PPPP   L       AAA   Y   Y               %
7 %               D   D    I    SS     P   P  L      A   A   Y Y                %
8 %               D   D    I     SSS   PPPP   L      AAAAA    Y                 %
9 %               D   D    I       SS  P      L      A   A    Y                 %
10 %               DDDD   IIIII  SSSSS  P      LLLLL  A   A    Y                 %
11 %                                                                             %
12 %                                                                             %
13 %              Methods to Interactively Display and Edit an Image             %
14 %                                                                             %
15 %                             Software Design                                 %
16 %                               John Cristy                                   %
17 %                                July 1992                                    %
18 %                                                                             %
19 %                                                                             %
20 %  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
21 %  dedicated to making software imaging solutions freely available.           %
22 %                                                                             %
23 %  You may not use this file except in compliance with the License.  You may  %
24 %  obtain a copy of the License at                                            %
25 %                                                                             %
26 %    http://www.imagemagick.org/script/license.php                            %
27 %                                                                             %
28 %  Unless required by applicable law or agreed to in writing, software        %
29 %  distributed under the License is distributed on an "AS IS" BASIS,          %
30 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31 %  See the License for the specific language governing permissions and        %
32 %  limitations under the License.                                             %
33 %                                                                             %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35 %
36 %  Use the display program to display an image or image sequence on any X
37 %  server.
38 %
39 */
40 \f
41 /*
42   Include declarations.
43 */
44 #include "MagickWand/studio.h"
45 #include "MagickWand/MagickWand.h"
46 #include "MagickWand/mogrify-private.h"
47 #include "MagickCore/display-private.h"
48 #include "MagickCore/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=IsMagickTrue(resource_value);
452   resource_value=XGetResourceInstance(resource_database,GetClientName(),
453     "dither","True");
454   quantize_info->dither=IsMagickTrue(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           *images;
508
509         /*
510           Option is a file name.
511         */
512         FireImageStack(MagickFalse,MagickFalse,pend);
513         filename=option;
514         if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
515           {
516             option=argv[++i];
517             filename=option;
518           }
519         (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
520         images=ReadImage(image_info,exception);
521         CatchException(exception);
522         status&=(images != (Image *) NULL) &&
523           (exception->severity < ErrorException);
524         if (images == (Image *) NULL)
525           continue;
526         AppendImageStack(images);
527         FinalizeImageSettings(image_info,image,MagickFalse);
528         iterations=0;
529         if (i == (ssize_t) (argc-1))
530           iterations=image->iterations;
531         display_image=CloneImageList(image,exception);
532         if (display_image == (Image *) NULL)
533           ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
534             GetExceptionMessage(errno));
535         do
536         {
537           /*
538             Transmogrify image as defined by the image processing options.
539           */
540           resource_info.quantum=1;
541           if (resource_info.window_id != (char *) NULL)
542             {
543               /*
544                 Display image to a specified X window.
545               */
546               status=XDisplayBackgroundImage(display,&resource_info,
547                 display_image,exception);
548               if (status != MagickFalse)
549                 {
550                   state|=RetainColorsState;
551                   status=MagickFalse;
552                 }
553             }
554           else
555             do
556             {
557               Image
558                 *nexus;
559
560               /*
561                 Display image to X server.
562               */
563               if (resource_info.delay != 1)
564                 display_image->delay=resource_info.delay;
565               nexus=XDisplayImage(display,&resource_info,argv,argc,
566                 &display_image,&state,exception);
567               status&=nexus != (Image *) NULL;
568               if (nexus == (Image *) NULL)
569                 break;
570               while ((nexus != (Image *) NULL) && ((state & ExitState) == 0))
571               {
572                 Image
573                   *next;
574
575                 if (nexus->montage != (char *) NULL)
576                   {
577                     /*
578                       User selected a visual directory image (montage).
579                     */
580                     display_image=nexus;
581                     break;
582                   }
583                 next=XDisplayImage(display,&resource_info,argv,argc,&nexus,
584                   &state,exception);
585                 if ((next == (Image *) NULL) &&
586                     (GetNextImageInList(nexus) != (Image *) NULL))
587                   {
588                     display_image=GetNextImageInList(nexus);
589                     nexus=NewImageList();
590                   }
591                 else
592                   {
593                     if (nexus != display_image)
594                       nexus=DestroyImageList(nexus);
595                     nexus=next;
596                   }
597               }
598             } while ((state & ExitState) == 0);
599           if (resource_info.write_filename != (char *) NULL)
600             {
601               /*
602                 Write image.
603               */
604               (void) CopyMagickString(display_image->filename,
605                 resource_info.write_filename,MaxTextExtent);
606               (void) SetImageInfo(image_info,1,&display_image->exception);
607               status&=WriteImage(image_info,display_image,
608                 &display_image->exception);
609               GetImageException(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 ((state & FormerImageState) == 0)
634           {
635             last_image=(size_t) image_number;
636             image_marker[i]=(size_t) image_number++;
637           }
638         else
639           {
640             /*
641               Proceed to previous image.
642             */
643             for (i--; i > 0; i--)
644               if (image_marker[i] == (size_t) (image_number-2))
645                 break;
646             image_number--;
647           }
648         if ((i == (ssize_t) (argc-1)) && ((state & ExitState) == 0))
649           i=0;
650         if ((state & ExitState) != 0)
651           break;
652         /*
653           Determine if we should proceed to the first image.
654         */
655         if (image_number < 0)
656           {
657             if ((state & FormerImageState) != 0)
658               {
659
660                 for (i=1; i < (ssize_t) (argc-2); i++)
661                   if (last_image == image_marker[i])
662                     break;
663                 image_number=(ssize_t) image_marker[i]+1;
664               }
665             continue;
666           }
667         if (resource_info.window_id != (char *) NULL)
668           state|=ExitState;
669         if ((iterations != 0) && (++iteration == (ssize_t) iterations))
670           state|=ExitState;
671         if (LocaleCompare(filename,"-") == 0)
672           state|=ExitState;
673         RemoveAllImageStack();
674         continue;
675       }
676     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
677     switch (*(option+1))
678     {
679       case 'a':
680       {
681         if (LocaleCompare("alpha",option+1) == 0)
682           {
683             ssize_t
684               type;
685
686             if (*option == '+')
687               break;
688             i++;
689             if (i == (ssize_t) argc)
690               ThrowDisplayException(OptionError,"MissingArgument",option);
691             type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
692             if (type < 0)
693               ThrowDisplayException(OptionError,"UnrecognizedAlphaChannelType",
694                 argv[i]);
695             break;
696           }
697         if (LocaleCompare("antialias",option+1) == 0)
698           break;
699         if (LocaleCompare("authenticate",option+1) == 0)
700           {
701             if (*option == '+')
702               break;
703             i++;
704             if (i == (ssize_t) argc)
705               ThrowDisplayException(OptionError,"MissingArgument",option);
706             break;
707           }
708         if (LocaleCompare("auto-orient",option+1) == 0)
709           break;
710         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
711       }
712       case 'b':
713       {
714         if (LocaleCompare("backdrop",option+1) == 0)
715           {
716             resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse;
717             break;
718           }
719         if (LocaleCompare("background",option+1) == 0)
720           {
721             if (*option == '+')
722               break;
723             i++;
724             if (i == (ssize_t) argc)
725               ThrowDisplayException(OptionError,"MissingArgument",option);
726             resource_info.background_color=argv[i];
727             break;
728           }
729         if (LocaleCompare("border",option+1) == 0)
730           {
731             if (*option == '+')
732               break;
733             i++;
734             if (i == (ssize_t) argc)
735               ThrowDisplayException(OptionError,"MissingArgument",option);
736             if (IsGeometry(argv[i]) == MagickFalse)
737               ThrowDisplayInvalidArgumentException(option,argv[i]);
738             break;
739           }
740         if (LocaleCompare("bordercolor",option+1) == 0)
741           {
742             if (*option == '+')
743               break;
744             i++;
745             if (i == (ssize_t) argc)
746               ThrowDisplayException(OptionError,"MissingArgument",option);
747             resource_info.border_color=argv[i];
748             break;
749           }
750         if (LocaleCompare("borderwidth",option+1) == 0)
751           {
752             resource_info.border_width=0;
753             if (*option == '+')
754               break;
755             i++;
756             if (i == (ssize_t) argc)
757               ThrowDisplayException(OptionError,"MissingArgument",option);
758             if (IsGeometry(argv[i]) == MagickFalse)
759               ThrowDisplayInvalidArgumentException(option,argv[i]);
760             resource_info.border_width=(unsigned int)
761               StringToUnsignedLong(argv[i]);
762             break;
763           }
764         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
765       }
766       case 'c':
767       {
768         if (LocaleCompare("cache",option+1) == 0)
769           {
770             if (*option == '+')
771               break;
772             i++;
773             if (i == (ssize_t) argc)
774               ThrowDisplayException(OptionError,"MissingArgument",option);
775             if (IsGeometry(argv[i]) == MagickFalse)
776               ThrowDisplayInvalidArgumentException(option,argv[i]);
777             break;
778           }
779         if (LocaleCompare("channel",option+1) == 0)
780           {
781             ssize_t
782               channel;
783
784             if (*option == '+')
785               break;
786             i++;
787             if (i == (ssize_t) (argc-1))
788               ThrowDisplayException(OptionError,"MissingArgument",option);
789             channel=ParseChannelOption(argv[i]);
790             if (channel < 0)
791               ThrowDisplayException(OptionError,"UnrecognizedChannelType",
792                 argv[i]);
793             break;
794           }
795         if (LocaleCompare("clip",option+1) == 0)
796           break;
797         if (LocaleCompare("clip-path",option+1) == 0)
798           {
799             i++;
800             if (i == (ssize_t) argc)
801               ThrowDisplayException(OptionError,"MissingArgument",option);
802             break;
803           }
804         if (LocaleCompare("coalesce",option+1) == 0)
805           break;
806         if (LocaleCompare("colormap",option+1) == 0)
807           {
808             resource_info.colormap=PrivateColormap;
809             if (*option == '+')
810               break;
811             i++;
812             if (i == (ssize_t) argc)
813               ThrowDisplayException(OptionError,"MissingArgument",option);
814             resource_info.colormap=UndefinedColormap;
815             if (LocaleCompare("private",argv[i]) == 0)
816               resource_info.colormap=PrivateColormap;
817             if (LocaleCompare("shared",argv[i]) == 0)
818               resource_info.colormap=SharedColormap;
819             if (resource_info.colormap == UndefinedColormap)
820               ThrowDisplayException(OptionError,"UnrecognizedColormapType",
821                 argv[i]);
822             break;
823           }
824         if (LocaleCompare("colors",option+1) == 0)
825           {
826             quantize_info->number_colors=0;
827             if (*option == '+')
828               break;
829             i++;
830             if (i == (ssize_t) argc)
831               ThrowDisplayException(OptionError,"MissingArgument",option);
832             if (IsGeometry(argv[i]) == MagickFalse)
833               ThrowDisplayInvalidArgumentException(option,argv[i]);
834             quantize_info->number_colors=StringToUnsignedLong(argv[i]);
835             break;
836           }
837         if (LocaleCompare("colorspace",option+1) == 0)
838           {
839             ssize_t
840               colorspace;
841
842             if (*option == '+')
843               break;
844             i++;
845             if (i == (ssize_t) argc)
846               ThrowDisplayException(OptionError,"MissingArgument",option);
847             colorspace=ParseCommandOption(MagickColorspaceOptions,
848               MagickFalse,argv[i]);
849             if (colorspace < 0)
850               ThrowDisplayException(OptionError,"UnrecognizedColorspace",
851                 argv[i]);
852             break;
853           }
854         if (LocaleCompare("comment",option+1) == 0)
855           {
856             if (*option == '+')
857               break;
858             i++;
859             if (i == (ssize_t) argc)
860               ThrowDisplayException(OptionError,"MissingArgument",option);
861             break;
862           }
863         if (LocaleCompare("compress",option+1) == 0)
864           {
865             ssize_t
866               compress;
867
868             if (*option == '+')
869               break;
870             i++;
871             if (i == (ssize_t) argc)
872               ThrowDisplayException(OptionError,"MissingArgument",option);
873             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
874               argv[i]);
875             if (compress < 0)
876               ThrowDisplayException(OptionError,"UnrecognizedImageCompression",
877                 argv[i]);
878             break;
879           }
880         if (LocaleCompare("concurrent",option+1) == 0)
881           break;
882         if (LocaleCompare("contrast",option+1) == 0)
883           break;
884         if (LocaleCompare("crop",option+1) == 0)
885           {
886             if (*option == '+')
887               break;
888             i++;
889             if (i == (ssize_t) argc)
890               ThrowDisplayException(OptionError,"MissingArgument",option);
891             if (IsGeometry(argv[i]) == MagickFalse)
892               ThrowDisplayInvalidArgumentException(option,argv[i]);
893             break;
894           }
895         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
896       }
897       case 'd':
898       {
899         if (LocaleCompare("debug",option+1) == 0)
900           {
901             ssize_t
902               event;
903
904             if (*option == '+')
905               break;
906             i++;
907             if (i == (ssize_t) argc)
908               ThrowDisplayException(OptionError,"MissingArgument",option);
909             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
910             if (event < 0)
911               ThrowDisplayException(OptionError,"UnrecognizedEventType",
912                 argv[i]);
913             (void) SetLogEventMask(argv[i]);
914             break;
915           }
916         if (LocaleCompare("decipher",option+1) == 0)
917           {
918             if (*option == '+')
919               break;
920             i++;
921             if (i == (ssize_t) (argc-1))
922               ThrowDisplayException(OptionError,"MissingArgument",option);
923             break;
924           }
925         if (LocaleCompare("define",option+1) == 0)
926           {
927             i++;
928             if (i == (ssize_t) argc)
929               ThrowDisplayException(OptionError,"MissingArgument",option);
930             if (*option == '+')
931               {
932                 const char
933                   *define;
934
935                 define=GetImageOption(image_info,argv[i]);
936                 if (define == (const char *) NULL)
937                   ThrowDisplayException(OptionError,"NoSuchOption",argv[i]);
938                 break;
939               }
940             break;
941           }
942         if (LocaleCompare("delay",option+1) == 0)
943           {
944             if (*option == '+')
945               break;
946             i++;
947             if (i == (ssize_t) argc)
948               ThrowDisplayException(OptionError,"MissingArgument",option);
949             if (IsGeometry(argv[i]) == MagickFalse)
950               ThrowDisplayInvalidArgumentException(option,argv[i]);
951             break;
952           }
953         if (LocaleCompare("density",option+1) == 0)
954           {
955             if (*option == '+')
956               break;
957             i++;
958             if (i == (ssize_t) argc)
959               ThrowDisplayException(OptionError,"MissingArgument",option);
960             if (IsGeometry(argv[i]) == MagickFalse)
961               ThrowDisplayInvalidArgumentException(option,argv[i]);
962             break;
963           }
964         if (LocaleCompare("depth",option+1) == 0)
965           {
966             if (*option == '+')
967               break;
968             i++;
969             if (i == (ssize_t) argc)
970               ThrowDisplayException(OptionError,"MissingArgument",option);
971             if (IsGeometry(argv[i]) == MagickFalse)
972               ThrowDisplayInvalidArgumentException(option,argv[i]);
973             break;
974           }
975         if (LocaleCompare("deskew",option+1) == 0)
976           {
977             if (*option == '+')
978               break;
979             i++;
980             if (i == (ssize_t) (argc-1))
981               ThrowDisplayException(OptionError,"MissingArgument",option);
982             if (IsGeometry(argv[i]) == MagickFalse)
983               ThrowDisplayInvalidArgumentException(option,argv[i]);
984             break;
985           }
986         if (LocaleCompare("despeckle",option+1) == 0)
987           break;
988         if (LocaleCompare("display",option+1) == 0)
989           {
990             if (*option == '+')
991               break;
992             i++;
993             if (i == (ssize_t) argc)
994               ThrowDisplayException(OptionError,"MissingArgument",option);
995             break;
996           }
997         if (LocaleCompare("dispose",option+1) == 0)
998           {
999             ssize_t
1000               dispose;
1001
1002             if (*option == '+')
1003               break;
1004             i++;
1005             if (i == (ssize_t) argc)
1006               ThrowDisplayException(OptionError,"MissingArgument",option);
1007             dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
1008             if (dispose < 0)
1009               ThrowDisplayException(OptionError,"UnrecognizedDisposeMethod",
1010                 argv[i]);
1011             break;
1012           }
1013         if (LocaleCompare("dither",option+1) == 0)
1014           {
1015             ssize_t
1016               method;
1017
1018             quantize_info->dither=MagickFalse;
1019             if (*option == '+')
1020               break;
1021             i++;
1022             if (i == (ssize_t) argc)
1023               ThrowDisplayException(OptionError,"MissingArgument",option);
1024             method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
1025             if (method < 0)
1026               ThrowDisplayException(OptionError,"UnrecognizedDitherMethod",
1027                 argv[i]);
1028             quantize_info->dither=MagickTrue;
1029             quantize_info->dither_method=(DitherMethod) method;
1030             break;
1031           }
1032         if (LocaleCompare("duration",option+1) == 0)
1033           {
1034             if (*option == '+')
1035               break;
1036             i++;
1037             if (i == (ssize_t) (argc-1))
1038               ThrowDisplayException(OptionError,"MissingArgument",option);
1039             if (IsGeometry(argv[i]) == MagickFalse)
1040               ThrowDisplayInvalidArgumentException(option,argv[i]);
1041             break;
1042           }
1043         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1044       }
1045       case 'e':
1046       {
1047         if (LocaleCompare("edge",option+1) == 0)
1048           {
1049             if (*option == '+')
1050               break;
1051             i++;
1052             if (i == (ssize_t) argc)
1053               ThrowDisplayException(OptionError,"MissingArgument",option);
1054             if (IsGeometry(argv[i]) == MagickFalse)
1055               ThrowDisplayInvalidArgumentException(option,argv[i]);
1056             break;
1057           }
1058         if (LocaleCompare("endian",option+1) == 0)
1059           {
1060             ssize_t
1061               endian;
1062
1063             if (*option == '+')
1064               break;
1065             i++;
1066             if (i == (ssize_t) argc)
1067               ThrowDisplayException(OptionError,"MissingArgument",option);
1068             endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
1069               argv[i]);
1070             if (endian < 0)
1071               ThrowDisplayException(OptionError,"UnrecognizedEndianType",
1072                 argv[i]);
1073             break;
1074           }
1075         if (LocaleCompare("enhance",option+1) == 0)
1076           break;
1077         if (LocaleCompare("equalize",option+1) == 0)
1078           break;
1079         if (LocaleCompare("extract",option+1) == 0)
1080           {
1081             if (*option == '+')
1082               break;
1083             i++;
1084             if (i == (ssize_t) argc)
1085               ThrowDisplayException(OptionError,"MissingArgument",option);
1086             if (IsGeometry(argv[i]) == MagickFalse)
1087               ThrowDisplayInvalidArgumentException(option,argv[i]);
1088             break;
1089           }
1090         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1091       }
1092       case 'f':
1093       {
1094         if (LocaleCompare("filter",option+1) == 0)
1095           {
1096             ssize_t
1097               filter;
1098
1099             if (*option == '+')
1100               break;
1101             i++;
1102             if (i == (ssize_t) argc)
1103               ThrowDisplayException(OptionError,"MissingArgument",option);
1104             filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
1105             if (filter < 0)
1106               ThrowDisplayException(OptionError,"UnrecognizedImageFilter",
1107                 argv[i]);
1108             break;
1109           }
1110         if (LocaleCompare("flatten",option+1) == 0)
1111           break;
1112         if (LocaleCompare("flip",option+1) == 0)
1113           break;
1114         if (LocaleCompare("flop",option+1) == 0)
1115           break;
1116         if (LocaleCompare("font",option+1) == 0)
1117           {
1118             if (*option == '+')
1119               break;
1120             i++;
1121             if (i == (ssize_t) argc)
1122               ThrowDisplayException(OptionError,"MissingArgument",option);
1123             resource_info.font=XGetResourceClass(resource_database,
1124               GetClientName(),"font",argv[i]);
1125             break;
1126           }
1127         if (LocaleCompare("foreground",option+1) == 0)
1128           {
1129             if (*option == '+')
1130               break;
1131             i++;
1132             if (i == (ssize_t) argc)
1133               ThrowDisplayException(OptionError,"MissingArgument",option);
1134             resource_info.foreground_color=argv[i];
1135             break;
1136           }
1137         if (LocaleCompare("format",option+1) == 0)
1138           {
1139             if (*option == '+')
1140               break;
1141             i++;
1142             if (i == (ssize_t) (argc-1))
1143               ThrowDisplayException(OptionError,"MissingArgument",option);
1144             break;
1145           }
1146         if (LocaleCompare("frame",option+1) == 0)
1147           {
1148             if (*option == '+')
1149               break;
1150             i++;
1151             if (i == (ssize_t) argc)
1152               ThrowDisplayException(OptionError,"MissingArgument",option);
1153             if (IsGeometry(argv[i]) == MagickFalse)
1154               ThrowDisplayInvalidArgumentException(option,argv[i]);
1155             break;
1156           }
1157         if (LocaleCompare("fuzz",option+1) == 0)
1158           {
1159             if (*option == '+')
1160               break;
1161             i++;
1162             if (i == (ssize_t) (argc-1))
1163               ThrowDisplayException(OptionError,"MissingArgument",option);
1164             if (IsGeometry(argv[i]) == MagickFalse)
1165               ThrowDisplayInvalidArgumentException(option,argv[i]);
1166             break;
1167           }
1168         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1169       }
1170       case 'g':
1171       {
1172         if (LocaleCompare("gamma",option+1) == 0)
1173           {
1174             i++;
1175             if (i == (ssize_t) argc)
1176               ThrowDisplayException(OptionError,"MissingArgument",option);
1177             if (IsGeometry(argv[i]) == MagickFalse)
1178               ThrowDisplayInvalidArgumentException(option,argv[i]);
1179             break;
1180           }
1181         if (LocaleCompare("geometry",option+1) == 0)
1182           {
1183             resource_info.image_geometry=(char *) NULL;
1184             if (*option == '+')
1185               break;
1186             (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
1187             i++;
1188             if (i == (ssize_t) argc)
1189               ThrowDisplayException(OptionError,"MissingArgument",option);
1190             if (IsGeometry(argv[i]) == MagickFalse)
1191               ThrowDisplayInvalidArgumentException(option,argv[i]);
1192             resource_info.image_geometry=ConstantString(argv[i]);
1193             break;
1194           }
1195         if (LocaleCompare("gravity",option+1) == 0)
1196           {
1197             ssize_t
1198               gravity;
1199
1200             if (*option == '+')
1201               break;
1202             i++;
1203             if (i == (ssize_t) (argc-1))
1204               ThrowDisplayException(OptionError,"MissingArgument",option);
1205             gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
1206               argv[i]);
1207             if (gravity < 0)
1208               ThrowDisplayException(OptionError,"UnrecognizedGravityType",
1209                 argv[i]);
1210             break;
1211           }
1212         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1213       }
1214       case 'h':
1215       {
1216         if ((LocaleCompare("help",option+1) == 0) ||
1217             (LocaleCompare("-help",option+1) == 0))
1218           break;
1219         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1220       }
1221       case 'i':
1222       {
1223         if (LocaleCompare("identify",option+1) == 0)
1224           break;
1225         if (LocaleCompare("iconGeometry",option+1) == 0)
1226           {
1227             resource_info.icon_geometry=(char *) NULL;
1228             if (*option == '+')
1229               break;
1230             i++;
1231             if (i == (ssize_t) argc)
1232               ThrowDisplayException(OptionError,"MissingArgument",option);
1233             if (IsGeometry(argv[i]) == MagickFalse)
1234               ThrowDisplayInvalidArgumentException(option,argv[i]);
1235             resource_info.icon_geometry=argv[i];
1236             break;
1237           }
1238         if (LocaleCompare("iconic",option+1) == 0)
1239           {
1240             resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse;
1241             break;
1242           }
1243         if (LocaleCompare("immutable",option+1) == 0)
1244           {
1245             resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse;
1246             break;
1247           }
1248         if (LocaleCompare("interlace",option+1) == 0)
1249           {
1250             ssize_t
1251               interlace;
1252
1253             if (*option == '+')
1254               break;
1255             i++;
1256             if (i == (ssize_t) argc)
1257               ThrowDisplayException(OptionError,"MissingArgument",option);
1258             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
1259               argv[i]);
1260             if (interlace < 0)
1261               ThrowDisplayException(OptionError,"UnrecognizedInterlaceType",
1262                 argv[i]);
1263             break;
1264           }
1265         if (LocaleCompare("interpolate",option+1) == 0)
1266           {
1267             ssize_t
1268               interpolate;
1269
1270             if (*option == '+')
1271               break;
1272             i++;
1273             if (i == (ssize_t) argc)
1274               ThrowDisplayException(OptionError,"MissingArgument",option);
1275             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
1276               argv[i]);
1277             if (interpolate < 0)
1278               ThrowDisplayException(OptionError,"UnrecognizedInterpolateMethod",
1279                 argv[i]);
1280             break;
1281           }
1282         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1283       }
1284       case 'l':
1285       {
1286         if (LocaleCompare("label",option+1) == 0)
1287           {
1288             if (*option == '+')
1289               break;
1290             i++;
1291             if (i == (ssize_t) argc)
1292               ThrowDisplayException(OptionError,"MissingArgument",option);
1293             break;
1294           }
1295         if (LocaleCompare("limit",option+1) == 0)
1296           {
1297             char
1298               *p;
1299
1300             double
1301               value;
1302
1303             ssize_t
1304               resource;
1305
1306             if (*option == '+')
1307               break;
1308             i++;
1309             if (i == (ssize_t) argc)
1310               ThrowDisplayException(OptionError,"MissingArgument",option);
1311             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
1312               argv[i]);
1313             if (resource < 0)
1314               ThrowDisplayException(OptionError,"UnrecognizedResourceType",
1315                 argv[i]);
1316             i++;
1317             if (i == (ssize_t) argc)
1318               ThrowDisplayException(OptionError,"MissingArgument",option);
1319             value=InterpretLocaleValue(argv[i],&p);
1320             (void) value;
1321             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
1322               ThrowDisplayInvalidArgumentException(option,argv[i]);
1323             break;
1324           }
1325         if (LocaleCompare("list",option+1) == 0)
1326           {
1327             ssize_t
1328               list;
1329
1330             if (*option == '+')
1331               break;
1332             i++;
1333             if (i == (ssize_t) argc)
1334               ThrowDisplayException(OptionError,"MissingArgument",option);
1335             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
1336             if (list < 0)
1337               ThrowDisplayException(OptionError,"UnrecognizedListType",argv[i]);
1338             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
1339               argv+j,exception);
1340             DestroyDisplay();
1341             return(status != 0 ? MagickFalse : MagickTrue);
1342           }
1343         if (LocaleCompare("log",option+1) == 0)
1344           {
1345             if (*option == '+')
1346               break;
1347             i++;
1348             if ((i == (ssize_t) argc) ||
1349                 (strchr(argv[i],'%') == (char *) NULL))
1350               ThrowDisplayException(OptionError,"MissingArgument",option);
1351             break;
1352           }
1353         if (LocaleCompare("loop",option+1) == 0)
1354           {
1355             if (*option == '+')
1356               break;
1357             i++;
1358             if (i == (ssize_t) (argc-1))
1359               ThrowDisplayException(OptionError,"MissingArgument",option);
1360             if (IsGeometry(argv[i]) == MagickFalse)
1361               ThrowDisplayInvalidArgumentException(option,argv[i]);
1362             iterations=StringToUnsignedLong(argv[i]);
1363             break;
1364           }
1365         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1366       }
1367       case 'm':
1368       {
1369         if (LocaleCompare("magnify",option+1) == 0)
1370           {
1371             resource_info.magnify=2;
1372             if (*option == '+')
1373               break;
1374             i++;
1375             if (i == (ssize_t) argc)
1376               ThrowDisplayException(OptionError,"MissingArgument",option);
1377             if (IsGeometry(argv[i]) == MagickFalse)
1378               ThrowDisplayInvalidArgumentException(option,argv[i]);
1379             resource_info.magnify=(unsigned int) StringToUnsignedLong(argv[i]);
1380             break;
1381           }
1382         if (LocaleCompare("map",option+1) == 0)
1383           {
1384             resource_info.map_type=(char *) NULL;
1385             if (*option == '+')
1386               break;
1387             (void) strcpy(argv[i]+1,"san");
1388             i++;
1389             if (i == (ssize_t) argc)
1390               ThrowDisplayException(OptionError,"MissingArgument",option);
1391             resource_info.map_type=argv[i];
1392             break;
1393           }
1394         if (LocaleCompare("matte",option+1) == 0)
1395           break;
1396         if (LocaleCompare("mattecolor",option+1) == 0)
1397           {
1398             if (*option == '+')
1399               break;
1400             i++;
1401             if (i == (ssize_t) argc)
1402               ThrowDisplayException(OptionError,"MissingArgument",option);
1403             resource_info.matte_color=argv[i];
1404             break;
1405           }
1406         if (LocaleCompare("monitor",option+1) == 0)
1407           break;
1408         if (LocaleCompare("monochrome",option+1) == 0)
1409           {
1410             if (*option == '+')
1411               break;
1412             quantize_info->number_colors=2;
1413             quantize_info->colorspace=GRAYColorspace;
1414             break;
1415           }
1416         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1417       }
1418       case 'n':
1419       {
1420         if (LocaleCompare("name",option+1) == 0)
1421           {
1422             resource_info.name=(char *) NULL;
1423             if (*option == '+')
1424               break;
1425             i++;
1426             if (i == (ssize_t) argc)
1427               ThrowDisplayException(OptionError,"MissingArgument",option);
1428             resource_info.name=ConstantString(argv[i]);
1429             break;
1430           }
1431         if (LocaleCompare("negate",option+1) == 0)
1432           break;
1433         if (LocaleCompare("noop",option+1) == 0)
1434           break;
1435         if (LocaleCompare("normalize",option+1) == 0)
1436           break;
1437         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1438       }
1439       case 'p':
1440       {
1441         if (LocaleCompare("page",option+1) == 0)
1442           {
1443             resource_info.image_geometry=(char *) NULL;
1444             if (*option == '+')
1445               break;
1446             i++;
1447             if (i == (ssize_t) argc)
1448               ThrowDisplayException(OptionError,"MissingArgument",option);
1449             resource_info.image_geometry=ConstantString(argv[i]);
1450             break;
1451           }
1452         if (LocaleCompare("profile",option+1) == 0)
1453           {
1454             i++;
1455             if (i == (ssize_t) argc)
1456               ThrowDisplayException(OptionError,"MissingArgument",option);
1457             break;
1458           }
1459         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1460       }
1461       case 'q':
1462       {
1463         if (LocaleCompare("quality",option+1) == 0)
1464           {
1465             if (*option == '+')
1466               break;
1467             i++;
1468             if (i == (ssize_t) argc)
1469               ThrowDisplayException(OptionError,"MissingArgument",option);
1470             if (IsGeometry(argv[i]) == MagickFalse)
1471               ThrowDisplayInvalidArgumentException(option,argv[i]);
1472             break;
1473           }
1474         if (LocaleCompare("quantize",option+1) == 0)
1475           {
1476             ssize_t
1477               colorspace;
1478
1479             if (*option == '+')
1480               break;
1481             i++;
1482             if (i == (ssize_t) (argc-1))
1483               ThrowDisplayException(OptionError,"MissingArgument",option);
1484             colorspace=ParseCommandOption(MagickColorspaceOptions,
1485               MagickFalse,argv[i]);
1486             if (colorspace < 0)
1487               ThrowDisplayException(OptionError,"UnrecognizedColorspace",
1488                 argv[i]);
1489             break;
1490           }
1491         if (LocaleCompare("quiet",option+1) == 0)
1492           break;
1493         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1494       }
1495       case 'r':
1496       {
1497         if (LocaleCompare("raise",option+1) == 0)
1498           {
1499             i++;
1500             if (i == (ssize_t) argc)
1501               ThrowDisplayException(OptionError,"MissingArgument",option);
1502             if (IsGeometry(argv[i]) == MagickFalse)
1503               ThrowDisplayInvalidArgumentException(option,argv[i]);
1504             break;
1505           }
1506         if (LocaleCompare("regard-warnings",option+1) == 0)
1507           break;
1508         if (LocaleCompare("remote",option+1) == 0)
1509           {
1510             i++;
1511             if (i == (ssize_t) argc)
1512               ThrowDisplayException(OptionError,"MissingArgument",option);
1513             if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0)
1514               return(MagickFalse);
1515             i--;
1516             break;
1517           }
1518         if (LocaleCompare("repage",option+1) == 0)
1519           {
1520             if (*option == '+')
1521               break;
1522             i++;
1523             if (i == (ssize_t) argc)
1524               ThrowDisplayException(OptionError,"MissingArgument",option);
1525             if (IsGeometry(argv[i]) == MagickFalse)
1526               ThrowDisplayInvalidArgumentException(option,argv[i]);
1527             break;
1528           }
1529         if (LocaleCompare("resample",option+1) == 0)
1530           {
1531             if (*option == '+')
1532               break;
1533             i++;
1534             if (i == (ssize_t) (argc-1))
1535               ThrowDisplayException(OptionError,"MissingArgument",option);
1536             if (IsGeometry(argv[i]) == MagickFalse)
1537               ThrowDisplayInvalidArgumentException(option,argv[i]);
1538             break;
1539           }
1540         if (LocaleCompare("resize",option+1) == 0)
1541           {
1542             if (*option == '+')
1543               break;
1544             i++;
1545             if (i == (ssize_t) argc)
1546               ThrowDisplayException(OptionError,"MissingArgument",option);
1547             if (IsGeometry(argv[i]) == MagickFalse)
1548               ThrowDisplayInvalidArgumentException(option,argv[i]);
1549             break;
1550           }
1551         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1552           {
1553             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1554             break;
1555           }
1556         if (LocaleCompare("roll",option+1) == 0)
1557           {
1558             if (*option == '+')
1559               break;
1560             i++;
1561             if (i == (ssize_t) argc)
1562               ThrowDisplayException(OptionError,"MissingArgument",option);
1563             if (IsGeometry(argv[i]) == MagickFalse)
1564               ThrowDisplayInvalidArgumentException(option,argv[i]);
1565             break;
1566           }
1567         if (LocaleCompare("rotate",option+1) == 0)
1568           {
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         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1577       }
1578       case 's':
1579       {
1580         if (LocaleCompare("sample",option+1) == 0)
1581           {
1582             if (*option == '+')
1583               break;
1584             i++;
1585             if (i == (ssize_t) argc)
1586               ThrowDisplayException(OptionError,"MissingArgument",option);
1587             if (IsGeometry(argv[i]) == MagickFalse)
1588               ThrowDisplayInvalidArgumentException(option,argv[i]);
1589             break;
1590           }
1591         if (LocaleCompare("sampling-factor",option+1) == 0)
1592           {
1593             if (*option == '+')
1594               break;
1595             i++;
1596             if (i == (ssize_t) argc)
1597               ThrowDisplayException(OptionError,"MissingArgument",option);
1598             if (IsGeometry(argv[i]) == MagickFalse)
1599               ThrowDisplayInvalidArgumentException(option,argv[i]);
1600             break;
1601           }
1602         if (LocaleCompare("scenes",option+1) == 0)
1603           {
1604             if (*option == '+')
1605               break;
1606             i++;
1607             if (i == (ssize_t) argc)
1608               ThrowDisplayException(OptionError,"MissingArgument",option);
1609             if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
1610               ThrowDisplayInvalidArgumentException(option,argv[i]);
1611             break;
1612           }
1613         if (LocaleCompare("seed",option+1) == 0)
1614           {
1615             if (*option == '+')
1616               break;
1617             i++;
1618             if (i == (ssize_t) (argc-1))
1619               ThrowDisplayException(OptionError,"MissingArgument",option);
1620             if (IsGeometry(argv[i]) == MagickFalse)
1621               ThrowDisplayInvalidArgumentException(option,argv[i]);
1622             break;
1623           }
1624         if (LocaleCompare("segment",option+1) == 0)
1625           {
1626             if (*option == '+')
1627               break;
1628             i++;
1629             if (i == (ssize_t) argc)
1630               ThrowDisplayException(OptionError,"MissingArgument",option);
1631             if (IsGeometry(argv[i]) == MagickFalse)
1632               ThrowDisplayInvalidArgumentException(option,argv[i]);
1633             break;
1634           }
1635         if (LocaleCompare("set",option+1) == 0)
1636           {
1637             i++;
1638             if (i == (ssize_t) argc)
1639               ThrowDisplayException(OptionError,"MissingArgument",option);
1640             if (*option == '+')
1641               break;
1642             i++;
1643             if (i == (ssize_t) argc)
1644               ThrowDisplayException(OptionError,"MissingArgument",option);
1645             break;
1646           }
1647         if (LocaleCompare("sharpen",option+1) == 0)
1648           {
1649             if (*option == '+')
1650               break;
1651             i++;
1652             if (i == (ssize_t) argc)
1653               ThrowDisplayException(OptionError,"MissingArgument",option);
1654             if (IsGeometry(argv[i]) == MagickFalse)
1655               ThrowDisplayInvalidArgumentException(option,argv[i]);
1656             break;
1657           }
1658         if (LocaleCompare("shared-memory",option+1) == 0)
1659           {
1660             resource_info.use_shared_memory= (*option == '-') ? MagickTrue :
1661               MagickFalse;
1662             break;
1663           }
1664         if (LocaleCompare("size",option+1) == 0)
1665           {
1666             if (*option == '+')
1667               break;
1668             i++;
1669             if (i == (ssize_t) argc)
1670               ThrowDisplayException(OptionError,"MissingArgument",option);
1671             if (IsGeometry(argv[i]) == MagickFalse)
1672               ThrowDisplayInvalidArgumentException(option,argv[i]);
1673             break;
1674           }
1675         if (LocaleCompare("strip",option+1) == 0)
1676           break;
1677         if (LocaleCompare("support",option+1) == 0)
1678           {
1679             i++;  /* deprecated */
1680             break;
1681           }
1682         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1683       }
1684       case 't':
1685       {
1686         if (LocaleCompare("text-font",option+1) == 0)
1687           {
1688             resource_info.text_font=(char *) NULL;
1689             if (*option == '+')
1690               break;
1691             i++;
1692             if (i == (ssize_t) argc)
1693               ThrowDisplayException(OptionError,"MissingArgument",option);
1694             resource_info.text_font=XGetResourceClass(resource_database,
1695               GetClientName(),"font",argv[i]);
1696             break;
1697           }
1698         if (LocaleCompare("texture",option+1) == 0)
1699           {
1700             if (*option == '+')
1701               break;
1702             i++;
1703             if (i == (ssize_t) argc)
1704               ThrowDisplayException(OptionError,"MissingArgument",option);
1705             break;
1706           }
1707         if (LocaleCompare("threshold",option+1) == 0)
1708           {
1709             if (*option == '+')
1710               break;
1711             i++;
1712             if (i == (ssize_t) argc)
1713               ThrowDisplayException(OptionError,"MissingArgument",option);
1714             if (IsGeometry(argv[i]) == MagickFalse)
1715               ThrowDisplayInvalidArgumentException(option,argv[i]);
1716             break;
1717           }
1718         if (LocaleCompare("thumbnail",option+1) == 0)
1719           {
1720             if (*option == '+')
1721               break;
1722             i++;
1723             if (i == (ssize_t) argc)
1724               ThrowDisplayException(OptionError,"MissingArgument",option);
1725             if (IsGeometry(argv[i]) == MagickFalse)
1726               ThrowDisplayInvalidArgumentException(option,argv[i]);
1727             break;
1728           }
1729         if (LocaleCompare("title",option+1) == 0)
1730           {
1731             resource_info.title=(char *) NULL;
1732             if (*option == '+')
1733               break;
1734             i++;
1735             if (i == (ssize_t) argc)
1736               ThrowDisplayException(OptionError,"MissingArgument",option);
1737             resource_info.title=argv[i];
1738             break;
1739           }
1740         if (LocaleCompare("transparent-color",option+1) == 0)
1741           {
1742             if (*option == '+')
1743               break;
1744             i++;
1745             if (i == (ssize_t) (argc-1))
1746               ThrowDisplayException(OptionError,"MissingArgument",option);
1747             break;
1748           }
1749         if (LocaleCompare("treedepth",option+1) == 0)
1750           {
1751             quantize_info->tree_depth=0;
1752             if (*option == '+')
1753               break;
1754             i++;
1755             if (i == (ssize_t) argc)
1756               ThrowDisplayException(OptionError,"MissingArgument",option);
1757             if (IsGeometry(argv[i]) == MagickFalse)
1758               ThrowDisplayInvalidArgumentException(option,argv[i]);
1759             quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
1760             break;
1761           }
1762         if (LocaleCompare("trim",option+1) == 0)
1763           break;
1764         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1765       }
1766       case 'u':
1767       {
1768         if (LocaleCompare("update",option+1) == 0)
1769           {
1770             resource_info.update=(unsigned int) (*option == '-');
1771             if (*option == '+')
1772               break;
1773             i++;
1774             if (i == (ssize_t) argc)
1775               ThrowDisplayException(OptionError,"MissingArgument",option);
1776             if (IsGeometry(argv[i]) == MagickFalse)
1777               ThrowDisplayInvalidArgumentException(option,argv[i]);
1778             resource_info.update=(unsigned int) StringToUnsignedLong(argv[i]);
1779             break;
1780           }
1781         if (LocaleCompare("use-pixmap",option+1) == 0)
1782           {
1783             resource_info.use_pixmap=(*option == '-') ? MagickTrue :
1784               MagickFalse;
1785             break;
1786           }
1787         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1788       }
1789       case 'v':
1790       {
1791         if (LocaleCompare("verbose",option+1) == 0)
1792           break;
1793         if ((LocaleCompare("version",option+1) == 0) ||
1794             (LocaleCompare("-version",option+1) == 0))
1795           {
1796             (void) FormatLocaleFile(stdout,"Version: %s\n",
1797               GetMagickVersion((size_t *) NULL));
1798             (void) FormatLocaleFile(stdout,"Copyright: %s\n",
1799               GetMagickCopyright());
1800             (void) FormatLocaleFile(stdout,"Features: %s\n\n",
1801               GetMagickFeatures());
1802             break;
1803           }
1804         if (LocaleCompare("visual",option+1) == 0)
1805           {
1806             resource_info.visual_type=(char *) NULL;
1807             if (*option == '+')
1808               break;
1809             i++;
1810             if (i == (ssize_t) argc)
1811               ThrowDisplayException(OptionError,"MissingArgument",option);
1812             resource_info.visual_type=argv[i];
1813             break;
1814           }
1815         if (LocaleCompare("virtual-pixel",option+1) == 0)
1816           {
1817             ssize_t
1818               method;
1819
1820             if (*option == '+')
1821               break;
1822             i++;
1823             if (i == (ssize_t) (argc-1))
1824               ThrowDisplayException(OptionError,"MissingArgument",option);
1825             method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
1826               argv[i]);
1827             if (method < 0)
1828               ThrowDisplayException(OptionError,
1829                 "UnrecognizedVirtualPixelMethod",argv[i]);
1830             break;
1831           }
1832         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1833       }
1834       case 'w':
1835       {
1836         if (LocaleCompare("window",option+1) == 0)
1837           {
1838             resource_info.window_id=(char *) NULL;
1839             if (*option == '+')
1840               break;
1841             i++;
1842             if (i == (ssize_t) argc)
1843               ThrowDisplayException(OptionError,"MissingArgument",option);
1844             resource_info.window_id=argv[i];
1845             break;
1846           }
1847         if (LocaleCompare("window-group",option+1) == 0)
1848           {
1849             resource_info.window_group=(char *) NULL;
1850             if (*option == '+')
1851               break;
1852             i++;
1853             if (i == (ssize_t) argc)
1854               ThrowDisplayException(OptionError,"MissingArgument",option);
1855             if (InterpretLocaleValue(argv[i],(char **) NULL) != 0)
1856               resource_info.window_group=argv[i];
1857             break;
1858           }
1859         if (LocaleCompare("write",option+1) == 0)
1860           {
1861             resource_info.write_filename=(char *) NULL;
1862             if (*option == '+')
1863               break;
1864             i++;
1865             if (i == (ssize_t) argc)
1866               ThrowDisplayException(OptionError,"MissingArgument",option);
1867             resource_info.write_filename=argv[i];
1868             if (IsPathAccessible(resource_info.write_filename) != MagickFalse)
1869               {
1870                 char
1871                   answer[2],
1872                   *p;
1873
1874                 (void) FormatLocaleFile(stderr,"Overwrite %s? ",
1875                   resource_info.write_filename);
1876                 p=fgets(answer,(int) sizeof(answer),stdin);
1877                 (void) p;
1878                 if (((*answer != 'y') && (*answer != 'Y')))
1879                   return(MagickFalse);
1880               }
1881             break;
1882           }
1883         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1884       }
1885       case '?':
1886         break;
1887       default:
1888         ThrowDisplayException(OptionError,"UnrecognizedOption",option);
1889     }
1890     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1891       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
1892     if (fire != MagickFalse)
1893       FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1894   }
1895   if (k != 0)
1896     ThrowDisplayException(OptionError,"UnbalancedParenthesis",argv[i]);
1897   if (state & RetainColorsState)
1898     {
1899       XRetainWindowColors(display,XRootWindow(display,XDefaultScreen(display)));
1900       (void) XSync(display,MagickFalse);
1901     }
1902   DestroyDisplay();
1903   return(status != 0 ? MagickTrue : MagickFalse);
1904 #else
1905   (void) argc;
1906   (void) argv;
1907   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
1908     "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
1909   return(DisplayUsage());
1910 #endif
1911 }