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