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