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