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