MagickWand  6.9.13-50
Convert, Edit, Or Compose Bitmap Images
import.c
1 /*
2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 % %
4 % %
5 % %
6 % IIIII M M PPPP OOO RRRR TTTTT %
7 % I MM MM P P O O R R T %
8 % I M M M PPPP O O RRRR T %
9 % I M M P O O R R T %
10 % IIIII M M P OOO R R T %
11 % %
12 % %
13 % Import Image from X11 Screen %
14 % %
15 % Software Design %
16 % Cristy %
17 % July 1992 %
18 % %
19 % %
20 % Copyright 1999 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/license/ %
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 import program to capture some or all of an X server screen and
37 % save the image to a file.
38 %
39 */
40 
41 /*
42  Include declarations.
43 */
44 #include "wand/studio.h"
45 #include "wand/MagickWand.h"
46 #include "wand/mogrify-private.h"
47 #include "magick/string-private.h"
48 #include "magick/image-private.h"
49 #include "magick/xwindow-private.h"
50 
51 /*
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 % %
54 % %
55 % %
56 + I m p o r t I m a g e C o m m a n d %
57 % %
58 % %
59 % %
60 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61 %
62 % ImportImageCommand() reads an image from any visible window on an X server
63 % and outputs it as an image file. You can capture a single window, the
64 % entire screen, or any rectangular portion of the screen. You can use the
65 % display utility for redisplay, printing, editing, formatting, archiving,
66 % image processing, etc. of the captured image.
67 %
68 % The target window can be specified by id, name, or may be selected by
69 % clicking the mouse in the desired window. If you press a button and then
70 % drag, a rectangle will form which expands and contracts as the mouse moves.
71 % To save the portion of the screen defined by the rectangle, just release
72 % the button. The keyboard bell is rung once at the beginning of the screen
73 % capture and twice when it completes.
74 %
75 % The format of the ImportImageCommand method is:
76 %
77 % MagickBooleanType ImportImageCommand(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 ImportUsage(void)
95 {
96  static const char
97  miscellaneous[] =
98  " -debug events display copious debugging information\n"
99  " -help print program options\n"
100  " -list type print a list of supported option arguments\n"
101  " -log format format of debugging information\n"
102  " -version print version information",
103  operators[] =
104  " -annotate geometry text\n"
105  " annotate the image with text\n"
106  " -colors value preferred number of colors in the image\n"
107  " -crop geometry preferred size and location of the cropped image\n"
108  " -encipher filename convert plain pixels to cipher pixels\n"
109  " -geometry geometry preferred size or location of the image\n"
110  " -help print program options\n"
111  " -monochrome transform image to black and white\n"
112  " -negate replace every pixel with its complementary color \n"
113  " -quantize colorspace reduce colors in this colorspace\n"
114  " -resize geometry resize the image\n"
115  " -rotate degrees apply Paeth rotation to the image\n"
116  " -strip strip image of all profiles and comments\n"
117  " -thumbnail geometry create a thumbnail of the image\n"
118  " -transparent color make this color transparent within the image\n"
119  " -trim trim image edges\n"
120  " -type type image type",
121  settings[] =
122  " -adjoin join images into a single multi-image file\n"
123  " -border include window border in the output image\n"
124  " -channel type apply option to select image channels\n"
125  " -colorspace type alternate image colorspace\n"
126  " -comment string annotate image with comment\n"
127  " -compress type type of pixel compression when writing the image\n"
128  " -define format:option\n"
129  " define one or more image format options\n"
130  " -density geometry horizontal and vertical density of the image\n"
131  " -depth value image depth\n"
132  " -descend obtain image by descending window hierarchy\n"
133  " -display server X server to contact\n"
134  " -dispose method layer disposal method\n"
135  " -dither method apply error diffusion to image\n"
136  " -delay value display the next image after pausing\n"
137  " -encipher filename convert plain pixels to cipher pixels\n"
138  " -endian type endianness (MSB or LSB) of the image\n"
139  " -encoding type text encoding type\n"
140  " -filter type use this filter when resizing an image\n"
141  " -format \"string\" output formatted image characteristics\n"
142  " -frame include window manager frame\n"
143  " -gravity direction which direction to gravitate towards\n"
144  " -identify identify the format and characteristics of the image\n"
145  " -interlace type None, Line, Plane, or Partition\n"
146  " -interpolate method pixel color interpolation method\n"
147  " -label string assign a label to an image\n"
148  " -limit type value Area, Disk, Map, or Memory resource limit\n"
149  " -monitor monitor progress\n"
150  " -page geometry size and location of an image canvas\n"
151  " -pause seconds seconds delay between snapshots\n"
152  " -pointsize value font point size\n"
153  " -quality value JPEG/MIFF/PNG compression level\n"
154  " -quiet suppress all warning messages\n"
155  " -regard-warnings pay attention to warning messages\n"
156  " -repage geometry size and location of an image canvas\n"
157  " -respect-parentheses settings remain in effect until parenthesis boundary\n"
158  " -sampling-factor geometry\n"
159  " horizontal and vertical sampling factor\n"
160  " -scene value image scene number\n"
161  " -screen select image from root window\n"
162  " -seed value seed a new sequence of pseudo-random numbers\n"
163  " -set property value set an image property\n"
164  " -silent operate silently, i.e. don't ring any bells \n"
165  " -snaps value number of screen snapshots\n"
166  " -support factor resize support: > 1.0 is blurry, < 1.0 is sharp\n"
167  " -synchronize synchronize image to storage device\n"
168  " -taint declare the image as modified\n"
169  " -transparent-color color\n"
170  " transparent color\n"
171  " -treedepth value color tree depth\n"
172  " -verbose print detailed information about the image\n"
173  " -virtual-pixel method\n"
174  " Constant, Edge, Mirror, or Tile\n"
175  " -window id select window with this id or name";
176 
177  ListMagickVersion(stdout);
178  (void) printf("Usage: %s [options ...] [ file ]\n",GetClientName());
179  (void) printf("\nImage Settings:\n");
180  (void) puts(settings);
181  (void) printf("\nImage Operators:\n");
182  (void) puts(operators);
183  (void) printf("\nMiscellaneous Options:\n");
184  (void) puts(miscellaneous);
185  (void) printf(
186  "\nBy default, 'file' is written in the MIFF image format. To\n");
187  (void) printf(
188  "specify a particular image format, precede the filename with an image\n");
189  (void) printf(
190  "format name and a colon (i.e. ps:image) or specify the image type as\n");
191  (void) printf(
192  "the filename suffix (i.e. image.ps). Specify 'file' as '-' for\n");
193  (void) printf("standard input or output.\n");
194  return(MagickTrue);
195 }
196 
197 WandExport MagickBooleanType ImportImageCommand(ImageInfo *image_info,
198  int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
199 {
200 #if defined(MAGICKCORE_X11_DELEGATE)
201 #define DestroyImport() \
202 { \
203  XDestroyResourceInfo(&resource_info); \
204  if (display != (Display *) NULL) \
205  { \
206  XCloseDisplay(display); \
207  display=(Display *) NULL; \
208  } \
209  DestroyImageStack(); \
210  if (target_window != (char *) NULL) \
211  target_window=DestroyString(target_window); \
212  for (i=0; i < (ssize_t) argc; i++) \
213  argv[i]=DestroyString(argv[i]); \
214  argv=(char **) RelinquishMagickMemory(argv); \
215 }
216 #define ThrowImportException(asperity,tag,option) \
217 { \
218  char *message = GetExceptionMessage(errno); \
219  (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag, \
220  "`%s'",option == (char *) NULL ? message : option); \
221  message=DestroyString(message); \
222  DestroyImport(); \
223  return(MagickFalse); \
224 }
225 #define ThrowImportInvalidArgumentException(option,argument) \
226 { \
227  (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
228  "InvalidArgument","`%s': %s",option,argument); \
229  DestroyImport(); \
230  return(MagickFalse); \
231 }
232 
233  char
234  *filename,
235  *option,
236  *resource_value,
237  *server_name,
238  *target_window;
239 
240  Display
241  *display;
242 
243  Image
244  *image;
245 
246  ImageStack
247  image_stack[MaxImageStackDepth+1];
248 
249  MagickBooleanType
250  fire,
251  pend,
252  respect_parenthesis;
253 
254  MagickStatusType
255  status;
256 
257  QuantizeInfo
258  *quantize_info;
259 
260  ssize_t
261  i;
262 
263  ssize_t
264  j,
265  k,
266  snapshots;
267 
268  XImportInfo
269  ximage_info;
270 
271  XResourceInfo
272  resource_info;
273 
274  XrmDatabase
275  resource_database;
276 
277  wand_unreferenced(metadata);
278 
279  /*
280  Set defaults.
281  */
282  assert(image_info != (ImageInfo *) NULL);
283  assert(image_info->signature == MagickCoreSignature);
284  assert(exception != (ExceptionInfo *) NULL);
285  if (IsEventLogging() != MagickFalse)
286  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
287  if (argc == 2)
288  {
289  option=argv[1];
290  if ((LocaleCompare("version",option+1) == 0) ||
291  (LocaleCompare("-version",option+1) == 0))
292  {
293  ListMagickVersion(stdout);
294  return(MagickTrue);
295  }
296  }
297  display=(Display *) NULL;
298  j=1;
299  k=0;
300  NewImageStack();
301  option=(char *) NULL;
302  pend=MagickFalse;
303  resource_database=(XrmDatabase) NULL;
304  respect_parenthesis=MagickFalse;
305  (void) memset(&resource_info,0,sizeof(resource_info));
306  server_name=(char *) NULL;
307  status=MagickTrue;
308  SetNotifyHandlers;
309  target_window=(char *) NULL;
310  /*
311  Check for server name specified on the command line.
312  */
313  ReadCommandlLine(argc,&argv);
314  status=ExpandFilenames(&argc,&argv);
315  if (status == MagickFalse)
316  ThrowImportException(ResourceLimitError,"MemoryAllocationFailed",
317  (char *) NULL);
318  for (i=1; i < (ssize_t) argc; i++)
319  {
320  /*
321  Check command line for server name.
322  */
323  option=argv[i];
324  if (IsCommandOption(option) == MagickFalse)
325  continue;
326  if (LocaleCompare("display",option+1) == 0)
327  {
328  /*
329  User specified server name.
330  */
331  i++;
332  if (i == (ssize_t) argc)
333  ThrowImportException(OptionError,"MissingArgument",option);
334  server_name=argv[i];
335  }
336  if ((LocaleCompare("help",option+1) == 0) ||
337  (LocaleCompare("-help",option+1) == 0))
338  {
339  DestroyImport();
340  return(ImportUsage());
341  }
342  }
343  /*
344  Get user defaults from X resource database.
345  */
346  display=XOpenDisplay(server_name);
347  if (display == (Display *) NULL)
348  ThrowImportException(XServerError,"UnableToOpenXServer",
349  XDisplayName(server_name));
350  (void) XSetErrorHandler(XError);
351  resource_database=XGetResourceDatabase(display,GetClientName());
352  XGetImportInfo(&ximage_info);
353  XGetResourceInfo(image_info,resource_database,GetClientName(),
354  &resource_info);
355  quantize_info=resource_info.quantize_info;
356  resource_value=XGetResourceInstance(resource_database,GetClientName(),
357  "border","False");
358  ximage_info.borders=IsMagickTrue(resource_value);
359  resource_value=XGetResourceInstance(resource_database,GetClientName(),
360  "delay","0");
361  resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value);
362  image_info->density=XGetResourceInstance(resource_database,GetClientName(),
363  "density",(char *) NULL);
364  resource_value=XGetResourceInstance(resource_database,GetClientName(),
365  "descend","False");
366  ximage_info.descend=IsMagickTrue(resource_value);
367  resource_value=XGetResourceInstance(resource_database,GetClientName(),
368  "frame","False");
369  ximage_info.frame=IsMagickTrue(resource_value);
370  resource_value=XGetResourceInstance(resource_database,GetClientName(),
371  "interlace","none");
372  image_info->interlace=UndefinedInterlace;
373  if (LocaleCompare("None",resource_value) == 0)
374  image_info->interlace=NoInterlace;
375  if (LocaleCompare("Line",resource_value) == 0)
376  image_info->interlace=LineInterlace;
377  if (LocaleCompare("Plane",resource_value) == 0)
378  image_info->interlace=PlaneInterlace;
379  if (LocaleCompare("Partition",resource_value) == 0)
380  image_info->interlace=PartitionInterlace;
381  if (image_info->interlace == UndefinedInterlace)
382  ThrowImportException(OptionError,"Unrecognized interlace type",
383  resource_value);
384  image_info->page=XGetResourceInstance(resource_database,GetClientName(),
385  "pageGeometry",(char *) NULL);
386  resource_value=XGetResourceInstance(resource_database,GetClientName(),
387  "pause","0");
388  resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value);
389  resource_value=XGetResourceInstance(resource_database,GetClientName(),
390  "quality","85");
391  image_info->quality=StringToUnsignedLong(resource_value);
392  resource_value=XGetResourceInstance(resource_database,GetClientName(),
393  "screen","False");
394  ximage_info.screen=IsMagickTrue(resource_value);
395  resource_value=XGetResourceInstance(resource_database,GetClientName(),
396  "silent","False");
397  ximage_info.silent=IsMagickTrue(resource_value);
398  resource_value=XGetResourceInstance(resource_database,GetClientName(),
399  "verbose","False");
400  image_info->verbose=IsMagickTrue(resource_value);
401  resource_value=XGetResourceInstance(resource_database,GetClientName(),
402  "dither","True");
403  quantize_info->dither=IsMagickTrue(resource_value);
404  snapshots=1;
405  status=MagickTrue;
406  filename=(char *) NULL;
407  /*
408  Check command syntax.
409  */
410  for (i=1; i < (ssize_t) argc; i++)
411  {
412  option=argv[i];
413  if (LocaleCompare(option,"(") == 0)
414  {
415  FireImageStack(MagickFalse,MagickTrue,pend);
416  if (k == MaxImageStackDepth)
417  ThrowImportException(OptionError,"ParenthesisNestedTooDeeply",
418  option);
419  PushImageStack();
420  continue;
421  }
422  if (LocaleCompare(option,")") == 0)
423  {
424  FireImageStack(MagickFalse,MagickTrue,MagickTrue);
425  if (k == 0)
426  ThrowImportException(OptionError,"UnableToParseExpression",option);
427  PopImageStack();
428  continue;
429  }
430  if (IsCommandOption(option) == MagickFalse)
431  {
432  Image
433  *images;
434 
435  size_t
436  scene;
437 
438  /*
439  Read image from X server.
440  */
441  FireImageStack(MagickFalse,MagickFalse,pend);
442  filename=argv[i];
443  if (target_window != (char *) NULL)
444  (void) CopyMagickString(image_info->filename,target_window,
445  MaxTextExtent);
446  for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++)
447  {
448  MagickDelay(1000*resource_info.pause);
449  images=XImportImage(image_info,&ximage_info);
450  status&=(images != (Image *) NULL) &&
451  (exception->severity < ErrorException);
452  if (images == (Image *) NULL)
453  continue;
454  (void) CopyMagickString(images->filename,filename,MaxTextExtent);
455  (void) CopyMagickString(images->magick,"PS",MaxTextExtent);
456  images->scene=scene;
457  AppendImageStack(images);
458  }
459  continue;
460  }
461  pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
462  switch(*(option+1))
463  {
464  case 'a':
465  {
466  if (LocaleCompare("adjoin",option+1) == 0)
467  break;
468  if (LocaleCompare("annotate",option+1) == 0)
469  {
470  if (*option == '+')
471  break;
472  i++;
473  if (i == (ssize_t) argc)
474  ThrowImportException(OptionError,"MissingArgument",option);
475  if (IsGeometry(argv[i]) == MagickFalse)
476  ThrowImportInvalidArgumentException(option,argv[i]);
477  if (i == (ssize_t) argc)
478  ThrowImportException(OptionError,"MissingArgument",option);
479  i++;
480  break;
481  }
482  ThrowImportException(OptionError,"UnrecognizedOption",option);
483  }
484  case 'b':
485  {
486  if (LocaleCompare("border",option+1) == 0)
487  {
488  (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
489  ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse;
490  break;
491  }
492  if (LocaleCompare("bordercolor",option+1) == 0)
493  {
494  if (*option == '+')
495  break;
496  i++;
497  if (i == (ssize_t) argc)
498  ThrowImportException(OptionError,"MissingArgument",option);
499  break;
500  }
501  ThrowImportException(OptionError,"UnrecognizedOption",option);
502  }
503  case 'c':
504  {
505  if (LocaleCompare("cache",option+1) == 0)
506  {
507  if (*option == '+')
508  break;
509  i++;
510  if (i == (ssize_t) argc)
511  ThrowImportException(OptionError,"MissingArgument",option);
512  if (IsGeometry(argv[i]) == MagickFalse)
513  ThrowImportInvalidArgumentException(option,argv[i]);
514  break;
515  }
516  if (LocaleCompare("channel",option+1) == 0)
517  {
518  ssize_t
519  channel;
520 
521  if (*option == '+')
522  break;
523  i++;
524  if (i == (ssize_t) argc)
525  ThrowImportException(OptionError,"MissingArgument",option);
526  channel=ParseChannelOption(argv[i]);
527  if (channel < 0)
528  ThrowImportException(OptionError,"UnrecognizedChannelType",
529  argv[i]);
530  break;
531  }
532  if (LocaleCompare("colors",option+1) == 0)
533  {
534  quantize_info->number_colors=0;
535  if (*option == '+')
536  break;
537  i++;
538  if (i == (ssize_t) argc)
539  ThrowImportException(OptionError,"MissingArgument",option);
540  if (IsGeometry(argv[i]) == MagickFalse)
541  ThrowImportInvalidArgumentException(option,argv[i]);
542  quantize_info->number_colors=StringToUnsignedLong(argv[i]);
543  break;
544  }
545  if (LocaleCompare("colorspace",option+1) == 0)
546  {
547  ssize_t
548  colorspace;
549 
550  if (*option == '+')
551  break;
552  i++;
553  if (i == (ssize_t) argc)
554  ThrowImportException(OptionError,"MissingArgument",option);
555  colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
556  argv[i]);
557  if (colorspace < 0)
558  ThrowImportException(OptionError,"UnrecognizedColorspace",
559  argv[i]);
560  break;
561  }
562  if (LocaleCompare("comment",option+1) == 0)
563  {
564  if (*option == '+')
565  break;
566  i++;
567  if (i == (ssize_t) argc)
568  ThrowImportException(OptionError,"MissingArgument",option);
569  status=SetImageOption(image_info,"comment",argv[i]);
570  if (status == MagickFalse)
571  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
572  break;
573  }
574  if (LocaleCompare("compress",option+1) == 0)
575  {
576  ssize_t
577  compress;
578 
579  if (*option == '+')
580  break;
581  i++;
582  if (i == (ssize_t) argc)
583  ThrowImportException(OptionError,"MissingArgument",option);
584  compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
585  argv[i]);
586  if (compress < 0)
587  ThrowImportException(OptionError,"UnrecognizedImageCompression",
588  argv[i]);
589  break;
590  }
591  if (LocaleCompare("concurrent",option+1) == 0)
592  break;
593  if (LocaleCompare("crop",option+1) == 0)
594  {
595  if (*option == '+')
596  break;
597  i++;
598  if (i == (ssize_t) argc)
599  ThrowImportException(OptionError,"MissingArgument",option);
600  if (IsGeometry(argv[i]) == MagickFalse)
601  ThrowImportInvalidArgumentException(option,argv[i]);
602  break;
603  }
604  ThrowImportException(OptionError,"UnrecognizedOption",option);
605  }
606  case 'd':
607  {
608  if (LocaleCompare("debug",option+1) == 0)
609  {
610  ssize_t
611  event;
612 
613  if (*option == '+')
614  break;
615  i++;
616  if (i == (ssize_t) argc)
617  ThrowImportException(OptionError,"MissingArgument",option);
618  event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
619  if (event < 0)
620  ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]);
621  (void) SetLogEventMask(argv[i]);
622  break;
623  }
624  if (LocaleCompare("define",option+1) == 0)
625  {
626  i++;
627  if (i == (ssize_t) argc)
628  ThrowImportException(OptionError,"MissingArgument",option);
629  if (*option == '+')
630  {
631  const char
632  *define;
633 
634  define=GetImageOption(image_info,argv[i]);
635  if (define == (char *) NULL)
636  ThrowImportException(OptionError,"NoSuchOption",argv[i]);
637  break;
638  }
639  break;
640  }
641  if (LocaleCompare("delay",option+1) == 0)
642  {
643  if (*option == '+')
644  break;
645  i++;
646  if (i == (ssize_t) argc)
647  ThrowImportException(OptionError,"MissingArgument",option);
648  if (IsGeometry(argv[i]) == MagickFalse)
649  ThrowImportInvalidArgumentException(option,argv[i]);
650  status=SetImageOption(image_info,"delay",argv[i]);
651  if (status == MagickFalse)
652  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
653  break;
654  }
655  if (LocaleCompare("density",option+1) == 0)
656  {
657  if (*option == '+')
658  break;
659  i++;
660  if (i == (ssize_t) argc)
661  ThrowImportException(OptionError,"MissingArgument",option);
662  if (IsGeometry(argv[i]) == MagickFalse)
663  ThrowImportInvalidArgumentException(option,argv[i]);
664  break;
665  }
666  if (LocaleCompare("depth",option+1) == 0)
667  {
668  if (*option == '+')
669  break;
670  i++;
671  if (i == (ssize_t) argc)
672  ThrowImportException(OptionError,"MissingArgument",option);
673  if (IsGeometry(argv[i]) == MagickFalse)
674  ThrowImportInvalidArgumentException(option,argv[i]);
675  break;
676  }
677  if (LocaleCompare("descend",option+1) == 0)
678  {
679  ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse;
680  break;
681  }
682  if (LocaleCompare("display",option+1) == 0)
683  {
684  if (*option == '+')
685  break;
686  i++;
687  if (i == (ssize_t) argc)
688  ThrowImportException(OptionError,"MissingArgument",option);
689  break;
690  }
691  if (LocaleCompare("dispose",option+1) == 0)
692  {
693  ssize_t
694  dispose;
695 
696  if (*option == '+')
697  break;
698  i++;
699  if (i == (ssize_t) argc)
700  ThrowImportException(OptionError,"MissingArgument",option);
701  dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
702  if (dispose < 0)
703  ThrowImportException(OptionError,"UnrecognizedDisposeMethod",
704  argv[i]);
705  break;
706  }
707  if (LocaleCompare("dither",option+1) == 0)
708  {
709  ssize_t
710  method;
711 
712  quantize_info->dither=MagickFalse;
713  if (*option == '+')
714  break;
715  i++;
716  if (i == (ssize_t) argc)
717  ThrowImportException(OptionError,"MissingArgument",option);
718  method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
719  if (method < 0)
720  ThrowImportException(OptionError,"UnrecognizedDitherMethod",
721  argv[i]);
722  quantize_info->dither=MagickTrue;
723  quantize_info->dither_method=(DitherMethod) method;
724  break;
725  }
726  if (LocaleCompare("duration",option+1) == 0)
727  {
728  if (*option == '+')
729  break;
730  i++;
731  if (i == (ssize_t) argc)
732  ThrowImportException(OptionError,"MissingArgument",option);
733  if (IsGeometry(argv[i]) == MagickFalse)
734  ThrowImportInvalidArgumentException(option,argv[i]);
735  break;
736  }
737  ThrowImportException(OptionError,"UnrecognizedOption",option);
738  }
739  case 'e':
740  {
741  if (LocaleCompare("encipher",option+1) == 0)
742  {
743  if (*option == '+')
744  break;
745  i++;
746  if (i == (ssize_t) argc)
747  ThrowImportException(OptionError,"MissingArgument",option);
748  break;
749  }
750  if (LocaleCompare("encoding",option+1) == 0)
751  {
752  if (*option == '+')
753  break;
754  i++;
755  if (i == (ssize_t) argc)
756  ThrowImportException(OptionError,"MissingArgument",option);
757  break;
758  }
759  if (LocaleCompare("endian",option+1) == 0)
760  {
761  ssize_t
762  endian;
763 
764  if (*option == '+')
765  break;
766  i++;
767  if (i == (ssize_t) argc)
768  ThrowImportException(OptionError,"MissingArgument",option);
769  endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
770  argv[i]);
771  if (endian < 0)
772  ThrowImportException(OptionError,"UnrecognizedEndianType",
773  argv[i]);
774  break;
775  }
776  ThrowImportException(OptionError,"UnrecognizedOption",option);
777  }
778  case 'f':
779  {
780  if (LocaleCompare("filter",option+1) == 0)
781  {
782  ssize_t
783  filter;
784 
785  if (*option == '+')
786  break;
787  i++;
788  if (i == (ssize_t) argc)
789  ThrowImportException(OptionError,"MissingArgument",option);
790  filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
791  if (filter < 0)
792  ThrowImportException(OptionError,"UnrecognizedImageFilter",
793  argv[i]);
794  break;
795  }
796  if (LocaleCompare("frame",option+1) == 0)
797  {
798  (void) CopyMagickString(argv[i]+1,"sans0",MaxTextExtent);
799  ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse;
800  break;
801  }
802  if (LocaleCompare("format",option+1) == 0)
803  {
804  if (*option == '+')
805  break;
806  i++;
807  if (i == (ssize_t) argc)
808  ThrowImportException(OptionError,"MissingArgument",option);
809  break;
810  }
811  ThrowImportException(OptionError,"UnrecognizedOption",option);
812  }
813  case 'g':
814  {
815  if (LocaleCompare("geometry",option+1) == 0)
816  {
817  if (*option == '+')
818  break;
819  i++;
820  if (i == (ssize_t) argc)
821  ThrowImportException(OptionError,"MissingArgument",option);
822  if (IsGeometry(argv[i]) == MagickFalse)
823  ThrowImportInvalidArgumentException(option,argv[i]);
824  break;
825  }
826  if (LocaleCompare("gravity",option+1) == 0)
827  {
828  ssize_t
829  gravity;
830 
831  if (*option == '+')
832  break;
833  i++;
834  if (i == (ssize_t) argc)
835  ThrowImportException(OptionError,"MissingArgument",option);
836  gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
837  if (gravity < 0)
838  ThrowImportException(OptionError,"UnrecognizedGravityType",
839  argv[i]);
840  break;
841  }
842  ThrowImportException(OptionError,"UnrecognizedOption",option);
843  }
844  case 'h':
845  {
846  if (LocaleCompare("help",option+1) == 0)
847  break;
848  ThrowImportException(OptionError,"UnrecognizedOption",option);
849  }
850  case 'i':
851  {
852  if (LocaleCompare("identify",option+1) == 0)
853  break;
854  if (LocaleCompare("interlace",option+1) == 0)
855  {
856  ssize_t
857  interlace;
858 
859  if (*option == '+')
860  break;
861  i++;
862  if (i == (ssize_t) argc)
863  ThrowImportException(OptionError,"MissingArgument",option);
864  interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
865  argv[i]);
866  if (interlace < 0)
867  ThrowImportException(OptionError,"UnrecognizedInterlaceType",
868  argv[i]);
869  break;
870  }
871  if (LocaleCompare("interpolate",option+1) == 0)
872  {
873  ssize_t
874  interpolate;
875 
876  if (*option == '+')
877  break;
878  i++;
879  if (i == (ssize_t) argc)
880  ThrowImportException(OptionError,"MissingArgument",option);
881  interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
882  argv[i]);
883  if (interpolate < 0)
884  ThrowImportException(OptionError,"UnrecognizedInterpolateMethod",
885  argv[i]);
886  break;
887  }
888  ThrowImportException(OptionError,"UnrecognizedOption",option);
889  }
890  case 'l':
891  {
892  if (LocaleCompare("label",option+1) == 0)
893  {
894  if (*option == '+')
895  break;
896  i++;
897  if (i == (ssize_t) argc)
898  ThrowImportException(OptionError,"MissingArgument",option);
899  status=SetImageOption(image_info,"label",argv[i]);
900  if (status == MagickFalse)
901  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
902  break;
903  }
904  if (LocaleCompare("limit",option+1) == 0)
905  {
906  char
907  *p;
908 
909  double
910  value;
911 
912  ssize_t
913  resource;
914 
915  if (*option == '+')
916  break;
917  i++;
918  if (i == (ssize_t) argc)
919  ThrowImportException(OptionError,"MissingArgument",option);
920  resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
921  argv[i]);
922  if (resource < 0)
923  ThrowImportException(OptionError,"UnrecognizedResourceType",
924  argv[i]);
925  i++;
926  if (i == (ssize_t) argc)
927  ThrowImportException(OptionError,"MissingArgument",option);
928  value=StringToDouble(argv[i],&p);
929  (void) value;
930  if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
931  ThrowImportInvalidArgumentException(option,argv[i]);
932  break;
933  }
934  if (LocaleCompare("list",option+1) == 0)
935  {
936  ssize_t
937  list;
938 
939  if (*option == '+')
940  break;
941  i++;
942  if (i == (ssize_t) argc)
943  ThrowImportException(OptionError,"MissingArgument",option);
944  list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
945  if (list < 0)
946  ThrowImportException(OptionError,"UnrecognizedListType",argv[i]);
947  status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
948  argv+j,exception);
949  DestroyImport();
950  return(status == 0 ? MagickFalse : MagickTrue);
951  }
952  if (LocaleCompare("log",option+1) == 0)
953  {
954  if (*option == '+')
955  break;
956  i++;
957  if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
958  ThrowImportException(OptionError,"MissingArgument",option);
959  break;
960  }
961  ThrowImportException(OptionError,"UnrecognizedOption",option);
962  }
963  case 'm':
964  {
965  if (LocaleCompare("monitor",option+1) == 0)
966  break;
967  if (LocaleCompare("monochrome",option+1) == 0)
968  {
969  if (*option == '+')
970  break;
971  quantize_info->number_colors=2;
972  quantize_info->colorspace=GRAYColorspace;
973  break;
974  }
975  ThrowImportException(OptionError,"UnrecognizedOption",option);
976  }
977  case 'n':
978  {
979  if (LocaleCompare("negate",option+1) == 0)
980  break;
981  ThrowImportException(OptionError,"UnrecognizedOption",option);
982  }
983  case 'p':
984  {
985  if (LocaleCompare("page",option+1) == 0)
986  {
987  if (*option == '+')
988  break;
989  i++;
990  if (i == (ssize_t) argc)
991  ThrowImportException(OptionError,"MissingArgument",option);
992  status=SetImageOption(image_info,"page",argv[i]);
993  if (status == MagickFalse)
994  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
995  break;
996  }
997  if (LocaleCompare("pause",option+1) == 0)
998  {
999  resource_info.pause=0;
1000  if (*option == '+')
1001  break;
1002  i++;
1003  if (i == (ssize_t) argc)
1004  ThrowImportException(OptionError,"MissingArgument",option);
1005  if (IsGeometry(argv[i]) == MagickFalse)
1006  ThrowImportInvalidArgumentException(option,argv[i]);
1007  resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]);
1008  break;
1009  }
1010  if (LocaleCompare("ping",option+1) == 0)
1011  break; /* deprecated option */
1012  if (LocaleCompare("pointsize",option+1) == 0)
1013  {
1014  if (*option == '+')
1015  break;
1016  i++;
1017  if (i == (ssize_t) argc)
1018  ThrowImportException(OptionError,"MissingArgument",option);
1019  if (IsGeometry(argv[i]) == MagickFalse)
1020  ThrowImportInvalidArgumentException(option,argv[i]);
1021  break;
1022  }
1023  ThrowImportException(OptionError,"UnrecognizedOption",option);
1024  }
1025  case 'q':
1026  {
1027  if (LocaleCompare("quality",option+1) == 0)
1028  {
1029  if (*option == '+')
1030  break;
1031  i++;
1032  if (i == (ssize_t) argc)
1033  ThrowImportException(OptionError,"MissingArgument",option);
1034  if (IsGeometry(argv[i]) == MagickFalse)
1035  ThrowImportInvalidArgumentException(option,argv[i]);
1036  break;
1037  }
1038  if (LocaleCompare("quantize",option+1) == 0)
1039  {
1040  ssize_t
1041  colorspace;
1042 
1043  if (*option == '+')
1044  break;
1045  i++;
1046  if (i == (ssize_t) argc)
1047  ThrowImportException(OptionError,"MissingArgument",option);
1048  colorspace=ParseCommandOption(MagickColorspaceOptions,
1049  MagickFalse,argv[i]);
1050  if (colorspace < 0)
1051  ThrowImportException(OptionError,"UnrecognizedColorspace",
1052  argv[i]);
1053  break;
1054  }
1055  if (LocaleCompare("quiet",option+1) == 0)
1056  break;
1057  ThrowImportException(OptionError,"UnrecognizedOption",option);
1058  }
1059  case 'r':
1060  {
1061  if (LocaleCompare("regard-warnings",option+1) == 0)
1062  break;
1063  if (LocaleCompare("repage",option+1) == 0)
1064  {
1065  if (*option == '+')
1066  break;
1067  i++;
1068  if (i == (ssize_t) argc)
1069  ThrowImportException(OptionError,"MissingArgument",option);
1070  if (IsGeometry(argv[i]) == MagickFalse)
1071  ThrowImportInvalidArgumentException(option,argv[i]);
1072  break;
1073  }
1074  if (LocaleCompare("resize",option+1) == 0)
1075  {
1076  if (*option == '+')
1077  break;
1078  i++;
1079  if (i == (ssize_t) argc)
1080  ThrowImportException(OptionError,"MissingArgument",option);
1081  if (IsGeometry(argv[i]) == MagickFalse)
1082  ThrowImportInvalidArgumentException(option,argv[i]);
1083  break;
1084  }
1085  if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1086  {
1087  respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1088  break;
1089  }
1090  if (LocaleCompare("rotate",option+1) == 0)
1091  {
1092  i++;
1093  if (i == (ssize_t) argc)
1094  ThrowImportException(OptionError,"MissingArgument",option);
1095  if (IsGeometry(argv[i]) == MagickFalse)
1096  ThrowImportInvalidArgumentException(option,argv[i]);
1097  break;
1098  }
1099  ThrowImportException(OptionError,"UnrecognizedOption",option);
1100  }
1101  case 's':
1102  {
1103  if (LocaleCompare("sampling-factor",option+1) == 0)
1104  {
1105  if (*option == '+')
1106  break;
1107  i++;
1108  if (i == (ssize_t) argc)
1109  ThrowImportException(OptionError,"MissingArgument",option);
1110  if (IsGeometry(argv[i]) == MagickFalse)
1111  ThrowImportInvalidArgumentException(option,argv[i]);
1112  break;
1113  }
1114  if (LocaleCompare("scene",option+1) == 0)
1115  {
1116  if (*option == '+')
1117  break;
1118  i++;
1119  if (i == (ssize_t) argc)
1120  ThrowImportException(OptionError,"MissingArgument",option);
1121  if (IsGeometry(argv[i]) == MagickFalse)
1122  ThrowImportInvalidArgumentException(option,argv[i]);
1123  break;
1124  }
1125  if (LocaleCompare("set",option+1) == 0)
1126  {
1127  i++;
1128  if (i == (ssize_t) argc)
1129  ThrowImportException(OptionError,"MissingArgument",option);
1130  if (*option == '+')
1131  break;
1132  i++;
1133  if (i == (ssize_t) argc)
1134  ThrowImportException(OptionError,"MissingArgument",option);
1135  break;
1136  }
1137  if (LocaleCompare("screen",option+1) == 0)
1138  {
1139  ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse;
1140  break;
1141  }
1142  if (LocaleCompare("seed",option+1) == 0)
1143  {
1144  if (*option == '+')
1145  break;
1146  i++;
1147  if (i == (ssize_t) argc)
1148  ThrowImportException(OptionError,"MissingArgument",option);
1149  if (IsGeometry(argv[i]) == MagickFalse)
1150  ThrowImportInvalidArgumentException(option,argv[i]);
1151  break;
1152  }
1153  if (LocaleCompare("silent",option+1) == 0)
1154  {
1155  ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse;
1156  break;
1157  }
1158  if (LocaleCompare("snaps",option+1) == 0)
1159  {
1160  (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
1161  i++;
1162  if (i == (ssize_t) argc)
1163  ThrowImportException(OptionError,"MissingArgument",option);
1164  if (IsGeometry(argv[i]) == MagickFalse)
1165  ThrowImportInvalidArgumentException(option,argv[i]);
1166  snapshots=(ssize_t) StringToLong(argv[i]);
1167  break;
1168  }
1169  if (LocaleCompare("strip",option+1) == 0)
1170  break;
1171  if (LocaleCompare("support",option+1) == 0)
1172  {
1173  i++; /* deprecated */
1174  break;
1175  }
1176  if (LocaleCompare("synchronize",option+1) == 0)
1177  break;
1178  ThrowImportException(OptionError,"UnrecognizedOption",option);
1179  }
1180  case 't':
1181  {
1182  if (LocaleCompare("taint",option+1) == 0)
1183  break;
1184  if (LocaleCompare("thumbnail",option+1) == 0)
1185  {
1186  if (*option == '+')
1187  break;
1188  i++;
1189  if (i == (ssize_t) argc)
1190  ThrowImportException(OptionError,"MissingArgument",option);
1191  if (IsGeometry(argv[i]) == MagickFalse)
1192  ThrowImportInvalidArgumentException(option,argv[i]);
1193  break;
1194  }
1195  if (LocaleCompare("transparent",option+1) == 0)
1196  {
1197  i++;
1198  if (i == (ssize_t) argc)
1199  ThrowImportException(OptionError,"MissingArgument",option);
1200  break;
1201  }
1202  if (LocaleCompare("transparent-color",option+1) == 0)
1203  {
1204  if (*option == '+')
1205  break;
1206  i++;
1207  if (i == (ssize_t) argc)
1208  ThrowImportException(OptionError,"MissingArgument",option);
1209  break;
1210  }
1211  if (LocaleCompare("treedepth",option+1) == 0)
1212  {
1213  quantize_info->tree_depth=0;
1214  if (*option == '+')
1215  break;
1216  i++;
1217  if (i == (ssize_t) argc)
1218  ThrowImportException(OptionError,"MissingArgument",option);
1219  if (IsGeometry(argv[i]) == MagickFalse)
1220  ThrowImportInvalidArgumentException(option,argv[i]);
1221  quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
1222  break;
1223  }
1224  if (LocaleCompare("trim",option+1) == 0)
1225  break;
1226  if (LocaleCompare("type",option+1) == 0)
1227  {
1228  ssize_t
1229  type;
1230 
1231  if (*option == '+')
1232  break;
1233  i++;
1234  if (i == (ssize_t) argc)
1235  ThrowImportException(OptionError,"MissingArgument",option);
1236  type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1237  if (type < 0)
1238  ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]);
1239  break;
1240  }
1241  ThrowImportException(OptionError,"UnrecognizedOption",option);
1242  }
1243  case 'w':
1244  {
1245  i++;
1246  if (i == (ssize_t) argc)
1247  ThrowImportException(OptionError,"MissingArgument",option);
1248  (void) CloneString(&target_window,argv[i]);
1249  break;
1250  }
1251  case 'v':
1252  {
1253  if (LocaleCompare("verbose",option+1) == 0)
1254  break;
1255  if ((LocaleCompare("version",option+1) == 0) ||
1256  (LocaleCompare("-version",option+1) == 0))
1257  {
1258  ListMagickVersion(stdout);
1259  break;
1260  }
1261  ThrowImportException(OptionError,"UnrecognizedOption",option);
1262  }
1263  case '?':
1264  break;
1265  default:
1266  ThrowImportException(OptionError,"UnrecognizedOption",option);
1267  }
1268  fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1269  FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1270  if (fire != MagickFalse)
1271  FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1272  }
1273  if (k != 0)
1274  ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]);
1275  if (i-- != (ssize_t) argc)
1276  ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]);
1277  if (image == (Image *) NULL)
1278  ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]);
1279  FinalizeImageSettings(image_info,image,MagickTrue);
1280  status&=WriteImages(image_info,image,filename,exception);
1281  DestroyImport();
1282  return(status != 0 ? MagickTrue : MagickFalse);
1283 #else
1284  magick_unreferenced(argc);
1285  magick_unreferenced(argv);
1286  magick_unreferenced(metadata);
1287 
1288  (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
1289  "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
1290  return(ImportUsage());
1291 #endif
1292 }