root/ImageMagick/trunk/wand/display.c

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