MagickWand  6.9.12-67
Convert, Edit, Or Compose Bitmap Images
 All Data Structures
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-2021 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 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  (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
219  option); \
220  DestroyImport(); \
221  return(MagickFalse); \
222 }
223 #define ThrowImportInvalidArgumentException(option,argument) \
224 { \
225  (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
226  "InvalidArgument","`%s': %s",option,argument); \
227  DestroyImport(); \
228  return(MagickFalse); \
229 }
230 
231  char
232  *filename,
233  *option,
234  *resource_value,
235  *server_name,
236  *target_window;
237 
238  Display
239  *display;
240 
241  Image
242  *image;
243 
244  ImageStack
245  image_stack[MaxImageStackDepth+1];
246 
247  MagickBooleanType
248  fire,
249  pend,
250  respect_parenthesis;
251 
252  MagickStatusType
253  status;
254 
255  QuantizeInfo
256  *quantize_info;
257 
258  ssize_t
259  i;
260 
261  ssize_t
262  j,
263  k,
264  snapshots;
265 
266  XImportInfo
267  ximage_info;
268 
269  XResourceInfo
270  resource_info;
271 
272  XrmDatabase
273  resource_database;
274 
275  wand_unreferenced(metadata);
276 
277  /*
278  Set defaults.
279  */
280  assert(image_info != (ImageInfo *) NULL);
281  assert(image_info->signature == MagickCoreSignature);
282  assert(exception != (ExceptionInfo *) NULL);
283  if (IsEventLogging() != MagickFalse)
284  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
285  if (argc == 2)
286  {
287  option=argv[1];
288  if ((LocaleCompare("version",option+1) == 0) ||
289  (LocaleCompare("-version",option+1) == 0))
290  {
291  ListMagickVersion(stdout);
292  return(MagickTrue);
293  }
294  }
295  display=(Display *) NULL;
296  j=1;
297  k=0;
298  NewImageStack();
299  option=(char *) NULL;
300  pend=MagickFalse;
301  resource_database=(XrmDatabase) NULL;
302  respect_parenthesis=MagickFalse;
303  (void) memset(&resource_info,0,sizeof(resource_info));
304  server_name=(char *) NULL;
305  status=MagickTrue;
306  SetNotifyHandlers;
307  target_window=(char *) NULL;
308  /*
309  Check for server name specified on the command line.
310  */
311  ReadCommandlLine(argc,&argv);
312  status=ExpandFilenames(&argc,&argv);
313  if (status == MagickFalse)
314  ThrowImportException(ResourceLimitError,"MemoryAllocationFailed",
315  GetExceptionMessage(errno));
316  for (i=1; i < (ssize_t) argc; i++)
317  {
318  /*
319  Check command line for server name.
320  */
321  option=argv[i];
322  if (IsCommandOption(option) == MagickFalse)
323  continue;
324  if (LocaleCompare("display",option+1) == 0)
325  {
326  /*
327  User specified server name.
328  */
329  i++;
330  if (i == (ssize_t) argc)
331  ThrowImportException(OptionError,"MissingArgument",option);
332  server_name=argv[i];
333  }
334  if ((LocaleCompare("help",option+1) == 0) ||
335  (LocaleCompare("-help",option+1) == 0))
336  {
337  DestroyImport();
338  return(ImportUsage());
339  }
340  }
341  /*
342  Get user defaults from X resource database.
343  */
344  display=XOpenDisplay(server_name);
345  if (display == (Display *) NULL)
346  ThrowImportException(XServerError,"UnableToOpenXServer",
347  XDisplayName(server_name));
348  (void) XSetErrorHandler(XError);
349  resource_database=XGetResourceDatabase(display,GetClientName());
350  XGetImportInfo(&ximage_info);
351  XGetResourceInfo(image_info,resource_database,GetClientName(),
352  &resource_info);
353  quantize_info=resource_info.quantize_info;
354  resource_value=XGetResourceInstance(resource_database,GetClientName(),
355  "border","False");
356  ximage_info.borders=IsMagickTrue(resource_value);
357  resource_value=XGetResourceInstance(resource_database,GetClientName(),
358  "delay","0");
359  resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value);
360  image_info->density=XGetResourceInstance(resource_database,GetClientName(),
361  "density",(char *) NULL);
362  resource_value=XGetResourceInstance(resource_database,GetClientName(),
363  "descend","False");
364  ximage_info.descend=IsMagickTrue(resource_value);
365  resource_value=XGetResourceInstance(resource_database,GetClientName(),
366  "frame","False");
367  ximage_info.frame=IsMagickTrue(resource_value);
368  resource_value=XGetResourceInstance(resource_database,GetClientName(),
369  "interlace","none");
370  image_info->interlace=UndefinedInterlace;
371  if (LocaleCompare("None",resource_value) == 0)
372  image_info->interlace=NoInterlace;
373  if (LocaleCompare("Line",resource_value) == 0)
374  image_info->interlace=LineInterlace;
375  if (LocaleCompare("Plane",resource_value) == 0)
376  image_info->interlace=PlaneInterlace;
377  if (LocaleCompare("Partition",resource_value) == 0)
378  image_info->interlace=PartitionInterlace;
379  if (image_info->interlace == UndefinedInterlace)
380  ThrowImportException(OptionError,"Unrecognized interlace type",
381  resource_value);
382  image_info->page=XGetResourceInstance(resource_database,GetClientName(),
383  "pageGeometry",(char *) NULL);
384  resource_value=XGetResourceInstance(resource_database,GetClientName(),
385  "pause","0");
386  resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value);
387  resource_value=XGetResourceInstance(resource_database,GetClientName(),
388  "quality","85");
389  image_info->quality=StringToUnsignedLong(resource_value);
390  resource_value=XGetResourceInstance(resource_database,GetClientName(),
391  "screen","False");
392  ximage_info.screen=IsMagickTrue(resource_value);
393  resource_value=XGetResourceInstance(resource_database,GetClientName(),
394  "silent","False");
395  ximage_info.silent=IsMagickTrue(resource_value);
396  resource_value=XGetResourceInstance(resource_database,GetClientName(),
397  "verbose","False");
398  image_info->verbose=IsMagickTrue(resource_value);
399  resource_value=XGetResourceInstance(resource_database,GetClientName(),
400  "dither","True");
401  quantize_info->dither=IsMagickTrue(resource_value);
402  snapshots=1;
403  status=MagickTrue;
404  filename=(char *) NULL;
405  /*
406  Check command syntax.
407  */
408  for (i=1; i < (ssize_t) argc; i++)
409  {
410  option=argv[i];
411  if (LocaleCompare(option,"(") == 0)
412  {
413  FireImageStack(MagickFalse,MagickTrue,pend);
414  if (k == MaxImageStackDepth)
415  ThrowImportException(OptionError,"ParenthesisNestedTooDeeply",
416  option);
417  PushImageStack();
418  continue;
419  }
420  if (LocaleCompare(option,")") == 0)
421  {
422  FireImageStack(MagickFalse,MagickTrue,MagickTrue);
423  if (k == 0)
424  ThrowImportException(OptionError,"UnableToParseExpression",option);
425  PopImageStack();
426  continue;
427  }
428  if (IsCommandOption(option) == MagickFalse)
429  {
430  Image
431  *images;
432 
433  size_t
434  scene;
435 
436  /*
437  Read image from X server.
438  */
439  FireImageStack(MagickFalse,MagickFalse,pend);
440  filename=argv[i];
441  if (target_window != (char *) NULL)
442  (void) CopyMagickString(image_info->filename,target_window,
443  MaxTextExtent);
444  for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++)
445  {
446  MagickDelay(1000*resource_info.pause);
447  images=XImportImage(image_info,&ximage_info);
448  status&=(images != (Image *) NULL) &&
449  (exception->severity < ErrorException);
450  if (images == (Image *) NULL)
451  continue;
452  (void) CopyMagickString(images->filename,filename,MaxTextExtent);
453  (void) CopyMagickString(images->magick,"PS",MaxTextExtent);
454  images->scene=scene;
455  AppendImageStack(images);
456  }
457  continue;
458  }
459  pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
460  switch(*(option+1))
461  {
462  case 'a':
463  {
464  if (LocaleCompare("adjoin",option+1) == 0)
465  break;
466  if (LocaleCompare("annotate",option+1) == 0)
467  {
468  if (*option == '+')
469  break;
470  i++;
471  if (i == (ssize_t) argc)
472  ThrowImportException(OptionError,"MissingArgument",option);
473  if (IsGeometry(argv[i]) == MagickFalse)
474  ThrowImportInvalidArgumentException(option,argv[i]);
475  if (i == (ssize_t) argc)
476  ThrowImportException(OptionError,"MissingArgument",option);
477  i++;
478  break;
479  }
480  ThrowImportException(OptionError,"UnrecognizedOption",option);
481  }
482  case 'b':
483  {
484  if (LocaleCompare("border",option+1) == 0)
485  {
486  (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
487  ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse;
488  break;
489  }
490  if (LocaleCompare("bordercolor",option+1) == 0)
491  {
492  if (*option == '+')
493  break;
494  i++;
495  if (i == (ssize_t) argc)
496  ThrowImportException(OptionError,"MissingArgument",option);
497  break;
498  }
499  ThrowImportException(OptionError,"UnrecognizedOption",option);
500  }
501  case 'c':
502  {
503  if (LocaleCompare("cache",option+1) == 0)
504  {
505  if (*option == '+')
506  break;
507  i++;
508  if (i == (ssize_t) argc)
509  ThrowImportException(OptionError,"MissingArgument",option);
510  if (IsGeometry(argv[i]) == MagickFalse)
511  ThrowImportInvalidArgumentException(option,argv[i]);
512  break;
513  }
514  if (LocaleCompare("channel",option+1) == 0)
515  {
516  ssize_t
517  channel;
518 
519  if (*option == '+')
520  break;
521  i++;
522  if (i == (ssize_t) argc)
523  ThrowImportException(OptionError,"MissingArgument",option);
524  channel=ParseChannelOption(argv[i]);
525  if (channel < 0)
526  ThrowImportException(OptionError,"UnrecognizedChannelType",
527  argv[i]);
528  break;
529  }
530  if (LocaleCompare("colors",option+1) == 0)
531  {
532  quantize_info->number_colors=0;
533  if (*option == '+')
534  break;
535  i++;
536  if (i == (ssize_t) argc)
537  ThrowImportException(OptionError,"MissingArgument",option);
538  if (IsGeometry(argv[i]) == MagickFalse)
539  ThrowImportInvalidArgumentException(option,argv[i]);
540  quantize_info->number_colors=StringToUnsignedLong(argv[i]);
541  break;
542  }
543  if (LocaleCompare("colorspace",option+1) == 0)
544  {
545  ssize_t
546  colorspace;
547 
548  if (*option == '+')
549  break;
550  i++;
551  if (i == (ssize_t) argc)
552  ThrowImportException(OptionError,"MissingArgument",option);
553  colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
554  argv[i]);
555  if (colorspace < 0)
556  ThrowImportException(OptionError,"UnrecognizedColorspace",
557  argv[i]);
558  break;
559  }
560  if (LocaleCompare("comment",option+1) == 0)
561  {
562  if (*option == '+')
563  break;
564  i++;
565  if (i == (ssize_t) argc)
566  ThrowImportException(OptionError,"MissingArgument",option);
567  status=SetImageOption(image_info,"comment",argv[i]);
568  if (status == MagickFalse)
569  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
570  break;
571  }
572  if (LocaleCompare("compress",option+1) == 0)
573  {
574  ssize_t
575  compress;
576 
577  if (*option == '+')
578  break;
579  i++;
580  if (i == (ssize_t) argc)
581  ThrowImportException(OptionError,"MissingArgument",option);
582  compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
583  argv[i]);
584  if (compress < 0)
585  ThrowImportException(OptionError,"UnrecognizedImageCompression",
586  argv[i]);
587  break;
588  }
589  if (LocaleCompare("concurrent",option+1) == 0)
590  break;
591  if (LocaleCompare("crop",option+1) == 0)
592  {
593  if (*option == '+')
594  break;
595  i++;
596  if (i == (ssize_t) argc)
597  ThrowImportException(OptionError,"MissingArgument",option);
598  if (IsGeometry(argv[i]) == MagickFalse)
599  ThrowImportInvalidArgumentException(option,argv[i]);
600  break;
601  }
602  ThrowImportException(OptionError,"UnrecognizedOption",option);
603  }
604  case 'd':
605  {
606  if (LocaleCompare("debug",option+1) == 0)
607  {
608  ssize_t
609  event;
610 
611  if (*option == '+')
612  break;
613  i++;
614  if (i == (ssize_t) argc)
615  ThrowImportException(OptionError,"MissingArgument",option);
616  event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
617  if (event < 0)
618  ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]);
619  (void) SetLogEventMask(argv[i]);
620  break;
621  }
622  if (LocaleCompare("define",option+1) == 0)
623  {
624  i++;
625  if (i == (ssize_t) argc)
626  ThrowImportException(OptionError,"MissingArgument",option);
627  if (*option == '+')
628  {
629  const char
630  *define;
631 
632  define=GetImageOption(image_info,argv[i]);
633  if (define == (char *) NULL)
634  ThrowImportException(OptionError,"NoSuchOption",argv[i]);
635  break;
636  }
637  break;
638  }
639  if (LocaleCompare("delay",option+1) == 0)
640  {
641  if (*option == '+')
642  break;
643  i++;
644  if (i == (ssize_t) argc)
645  ThrowImportException(OptionError,"MissingArgument",option);
646  if (IsGeometry(argv[i]) == MagickFalse)
647  ThrowImportInvalidArgumentException(option,argv[i]);
648  status=SetImageOption(image_info,"delay",argv[i]);
649  if (status == MagickFalse)
650  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
651  break;
652  }
653  if (LocaleCompare("density",option+1) == 0)
654  {
655  if (*option == '+')
656  break;
657  i++;
658  if (i == (ssize_t) argc)
659  ThrowImportException(OptionError,"MissingArgument",option);
660  if (IsGeometry(argv[i]) == MagickFalse)
661  ThrowImportInvalidArgumentException(option,argv[i]);
662  break;
663  }
664  if (LocaleCompare("depth",option+1) == 0)
665  {
666  if (*option == '+')
667  break;
668  i++;
669  if (i == (ssize_t) argc)
670  ThrowImportException(OptionError,"MissingArgument",option);
671  if (IsGeometry(argv[i]) == MagickFalse)
672  ThrowImportInvalidArgumentException(option,argv[i]);
673  break;
674  }
675  if (LocaleCompare("descend",option+1) == 0)
676  {
677  ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse;
678  break;
679  }
680  if (LocaleCompare("display",option+1) == 0)
681  {
682  if (*option == '+')
683  break;
684  i++;
685  if (i == (ssize_t) argc)
686  ThrowImportException(OptionError,"MissingArgument",option);
687  break;
688  }
689  if (LocaleCompare("dispose",option+1) == 0)
690  {
691  ssize_t
692  dispose;
693 
694  if (*option == '+')
695  break;
696  i++;
697  if (i == (ssize_t) argc)
698  ThrowImportException(OptionError,"MissingArgument",option);
699  dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
700  if (dispose < 0)
701  ThrowImportException(OptionError,"UnrecognizedDisposeMethod",
702  argv[i]);
703  break;
704  }
705  if (LocaleCompare("dither",option+1) == 0)
706  {
707  ssize_t
708  method;
709 
710  quantize_info->dither=MagickFalse;
711  if (*option == '+')
712  break;
713  i++;
714  if (i == (ssize_t) argc)
715  ThrowImportException(OptionError,"MissingArgument",option);
716  method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
717  if (method < 0)
718  ThrowImportException(OptionError,"UnrecognizedDitherMethod",
719  argv[i]);
720  quantize_info->dither=MagickTrue;
721  quantize_info->dither_method=(DitherMethod) method;
722  break;
723  }
724  if (LocaleCompare("duration",option+1) == 0)
725  {
726  if (*option == '+')
727  break;
728  i++;
729  if (i == (ssize_t) argc)
730  ThrowImportException(OptionError,"MissingArgument",option);
731  if (IsGeometry(argv[i]) == MagickFalse)
732  ThrowImportInvalidArgumentException(option,argv[i]);
733  break;
734  }
735  ThrowImportException(OptionError,"UnrecognizedOption",option);
736  }
737  case 'e':
738  {
739  if (LocaleCompare("encipher",option+1) == 0)
740  {
741  if (*option == '+')
742  break;
743  i++;
744  if (i == (ssize_t) argc)
745  ThrowImportException(OptionError,"MissingArgument",option);
746  break;
747  }
748  if (LocaleCompare("encoding",option+1) == 0)
749  {
750  if (*option == '+')
751  break;
752  i++;
753  if (i == (ssize_t) argc)
754  ThrowImportException(OptionError,"MissingArgument",option);
755  break;
756  }
757  if (LocaleCompare("endian",option+1) == 0)
758  {
759  ssize_t
760  endian;
761 
762  if (*option == '+')
763  break;
764  i++;
765  if (i == (ssize_t) argc)
766  ThrowImportException(OptionError,"MissingArgument",option);
767  endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
768  argv[i]);
769  if (endian < 0)
770  ThrowImportException(OptionError,"UnrecognizedEndianType",
771  argv[i]);
772  break;
773  }
774  ThrowImportException(OptionError,"UnrecognizedOption",option);
775  }
776  case 'f':
777  {
778  if (LocaleCompare("filter",option+1) == 0)
779  {
780  ssize_t
781  filter;
782 
783  if (*option == '+')
784  break;
785  i++;
786  if (i == (ssize_t) argc)
787  ThrowImportException(OptionError,"MissingArgument",option);
788  filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
789  if (filter < 0)
790  ThrowImportException(OptionError,"UnrecognizedImageFilter",
791  argv[i]);
792  break;
793  }
794  if (LocaleCompare("frame",option+1) == 0)
795  {
796  (void) CopyMagickString(argv[i]+1,"sans0",MaxTextExtent);
797  ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse;
798  break;
799  }
800  if (LocaleCompare("format",option+1) == 0)
801  {
802  if (*option == '+')
803  break;
804  i++;
805  if (i == (ssize_t) argc)
806  ThrowImportException(OptionError,"MissingArgument",option);
807  break;
808  }
809  ThrowImportException(OptionError,"UnrecognizedOption",option);
810  }
811  case 'g':
812  {
813  if (LocaleCompare("geometry",option+1) == 0)
814  {
815  if (*option == '+')
816  break;
817  i++;
818  if (i == (ssize_t) argc)
819  ThrowImportException(OptionError,"MissingArgument",option);
820  if (IsGeometry(argv[i]) == MagickFalse)
821  ThrowImportInvalidArgumentException(option,argv[i]);
822  break;
823  }
824  if (LocaleCompare("gravity",option+1) == 0)
825  {
826  ssize_t
827  gravity;
828 
829  if (*option == '+')
830  break;
831  i++;
832  if (i == (ssize_t) argc)
833  ThrowImportException(OptionError,"MissingArgument",option);
834  gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
835  if (gravity < 0)
836  ThrowImportException(OptionError,"UnrecognizedGravityType",
837  argv[i]);
838  break;
839  }
840  ThrowImportException(OptionError,"UnrecognizedOption",option);
841  }
842  case 'h':
843  {
844  if (LocaleCompare("help",option+1) == 0)
845  break;
846  ThrowImportException(OptionError,"UnrecognizedOption",option);
847  }
848  case 'i':
849  {
850  if (LocaleCompare("identify",option+1) == 0)
851  break;
852  if (LocaleCompare("interlace",option+1) == 0)
853  {
854  ssize_t
855  interlace;
856 
857  if (*option == '+')
858  break;
859  i++;
860  if (i == (ssize_t) argc)
861  ThrowImportException(OptionError,"MissingArgument",option);
862  interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
863  argv[i]);
864  if (interlace < 0)
865  ThrowImportException(OptionError,"UnrecognizedInterlaceType",
866  argv[i]);
867  break;
868  }
869  if (LocaleCompare("interpolate",option+1) == 0)
870  {
871  ssize_t
872  interpolate;
873 
874  if (*option == '+')
875  break;
876  i++;
877  if (i == (ssize_t) argc)
878  ThrowImportException(OptionError,"MissingArgument",option);
879  interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
880  argv[i]);
881  if (interpolate < 0)
882  ThrowImportException(OptionError,"UnrecognizedInterpolateMethod",
883  argv[i]);
884  break;
885  }
886  ThrowImportException(OptionError,"UnrecognizedOption",option);
887  }
888  case 'l':
889  {
890  if (LocaleCompare("label",option+1) == 0)
891  {
892  if (*option == '+')
893  break;
894  i++;
895  if (i == (ssize_t) argc)
896  ThrowImportException(OptionError,"MissingArgument",option);
897  status=SetImageOption(image_info,"label",argv[i]);
898  if (status == MagickFalse)
899  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
900  break;
901  }
902  if (LocaleCompare("limit",option+1) == 0)
903  {
904  char
905  *p;
906 
907  double
908  value;
909 
910  ssize_t
911  resource;
912 
913  if (*option == '+')
914  break;
915  i++;
916  if (i == (ssize_t) argc)
917  ThrowImportException(OptionError,"MissingArgument",option);
918  resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
919  argv[i]);
920  if (resource < 0)
921  ThrowImportException(OptionError,"UnrecognizedResourceType",
922  argv[i]);
923  i++;
924  if (i == (ssize_t) argc)
925  ThrowImportException(OptionError,"MissingArgument",option);
926  value=StringToDouble(argv[i],&p);
927  (void) value;
928  if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
929  ThrowImportInvalidArgumentException(option,argv[i]);
930  break;
931  }
932  if (LocaleCompare("list",option+1) == 0)
933  {
934  ssize_t
935  list;
936 
937  if (*option == '+')
938  break;
939  i++;
940  if (i == (ssize_t) argc)
941  ThrowImportException(OptionError,"MissingArgument",option);
942  list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
943  if (list < 0)
944  ThrowImportException(OptionError,"UnrecognizedListType",argv[i]);
945  status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
946  argv+j,exception);
947  DestroyImport();
948  return(status == 0 ? MagickFalse : MagickTrue);
949  }
950  if (LocaleCompare("log",option+1) == 0)
951  {
952  if (*option == '+')
953  break;
954  i++;
955  if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
956  ThrowImportException(OptionError,"MissingArgument",option);
957  break;
958  }
959  ThrowImportException(OptionError,"UnrecognizedOption",option);
960  }
961  case 'm':
962  {
963  if (LocaleCompare("monitor",option+1) == 0)
964  break;
965  if (LocaleCompare("monochrome",option+1) == 0)
966  {
967  if (*option == '+')
968  break;
969  quantize_info->number_colors=2;
970  quantize_info->colorspace=GRAYColorspace;
971  break;
972  }
973  ThrowImportException(OptionError,"UnrecognizedOption",option);
974  }
975  case 'n':
976  {
977  if (LocaleCompare("negate",option+1) == 0)
978  break;
979  ThrowImportException(OptionError,"UnrecognizedOption",option);
980  }
981  case 'p':
982  {
983  if (LocaleCompare("page",option+1) == 0)
984  {
985  if (*option == '+')
986  break;
987  i++;
988  if (i == (ssize_t) argc)
989  ThrowImportException(OptionError,"MissingArgument",option);
990  status=SetImageOption(image_info,"page",argv[i]);
991  if (status == MagickFalse)
992  ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
993  break;
994  }
995  if (LocaleCompare("pause",option+1) == 0)
996  {
997  resource_info.pause=0;
998  if (*option == '+')
999  break;
1000  i++;
1001  if (i == (ssize_t) argc)
1002  ThrowImportException(OptionError,"MissingArgument",option);
1003  if (IsGeometry(argv[i]) == MagickFalse)
1004  ThrowImportInvalidArgumentException(option,argv[i]);
1005  resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]);
1006  break;
1007  }
1008  if (LocaleCompare("ping",option+1) == 0)
1009  break; /* deprecated option */
1010  if (LocaleCompare("pointsize",option+1) == 0)
1011  {
1012  if (*option == '+')
1013  break;
1014  i++;
1015  if (i == (ssize_t) argc)
1016  ThrowImportException(OptionError,"MissingArgument",option);
1017  if (IsGeometry(argv[i]) == MagickFalse)
1018  ThrowImportInvalidArgumentException(option,argv[i]);
1019  break;
1020  }
1021  ThrowImportException(OptionError,"UnrecognizedOption",option);
1022  }
1023  case 'q':
1024  {
1025  if (LocaleCompare("quality",option+1) == 0)
1026  {
1027  if (*option == '+')
1028  break;
1029  i++;
1030  if (i == (ssize_t) argc)
1031  ThrowImportException(OptionError,"MissingArgument",option);
1032  if (IsGeometry(argv[i]) == MagickFalse)
1033  ThrowImportInvalidArgumentException(option,argv[i]);
1034  break;
1035  }
1036  if (LocaleCompare("quantize",option+1) == 0)
1037  {
1038  ssize_t
1039  colorspace;
1040 
1041  if (*option == '+')
1042  break;
1043  i++;
1044  if (i == (ssize_t) argc)
1045  ThrowImportException(OptionError,"MissingArgument",option);
1046  colorspace=ParseCommandOption(MagickColorspaceOptions,
1047  MagickFalse,argv[i]);
1048  if (colorspace < 0)
1049  ThrowImportException(OptionError,"UnrecognizedColorspace",
1050  argv[i]);
1051  break;
1052  }
1053  if (LocaleCompare("quiet",option+1) == 0)
1054  break;
1055  ThrowImportException(OptionError,"UnrecognizedOption",option);
1056  }
1057  case 'r':
1058  {
1059  if (LocaleCompare("regard-warnings",option+1) == 0)
1060  break;
1061  if (LocaleCompare("repage",option+1) == 0)
1062  {
1063  if (*option == '+')
1064  break;
1065  i++;
1066  if (i == (ssize_t) argc)
1067  ThrowImportException(OptionError,"MissingArgument",option);
1068  if (IsGeometry(argv[i]) == MagickFalse)
1069  ThrowImportInvalidArgumentException(option,argv[i]);
1070  break;
1071  }
1072  if (LocaleCompare("resize",option+1) == 0)
1073  {
1074  if (*option == '+')
1075  break;
1076  i++;
1077  if (i == (ssize_t) argc)
1078  ThrowImportException(OptionError,"MissingArgument",option);
1079  if (IsGeometry(argv[i]) == MagickFalse)
1080  ThrowImportInvalidArgumentException(option,argv[i]);
1081  break;
1082  }
1083  if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
1084  {
1085  respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
1086  break;
1087  }
1088  if (LocaleCompare("rotate",option+1) == 0)
1089  {
1090  i++;
1091  if (i == (ssize_t) argc)
1092  ThrowImportException(OptionError,"MissingArgument",option);
1093  if (IsGeometry(argv[i]) == MagickFalse)
1094  ThrowImportInvalidArgumentException(option,argv[i]);
1095  break;
1096  }
1097  ThrowImportException(OptionError,"UnrecognizedOption",option);
1098  }
1099  case 's':
1100  {
1101  if (LocaleCompare("sampling-factor",option+1) == 0)
1102  {
1103  if (*option == '+')
1104  break;
1105  i++;
1106  if (i == (ssize_t) argc)
1107  ThrowImportException(OptionError,"MissingArgument",option);
1108  if (IsGeometry(argv[i]) == MagickFalse)
1109  ThrowImportInvalidArgumentException(option,argv[i]);
1110  break;
1111  }
1112  if (LocaleCompare("scene",option+1) == 0)
1113  {
1114  if (*option == '+')
1115  break;
1116  i++;
1117  if (i == (ssize_t) argc)
1118  ThrowImportException(OptionError,"MissingArgument",option);
1119  if (IsGeometry(argv[i]) == MagickFalse)
1120  ThrowImportInvalidArgumentException(option,argv[i]);
1121  break;
1122  }
1123  if (LocaleCompare("set",option+1) == 0)
1124  {
1125  i++;
1126  if (i == (ssize_t) argc)
1127  ThrowImportException(OptionError,"MissingArgument",option);
1128  if (*option == '+')
1129  break;
1130  i++;
1131  if (i == (ssize_t) argc)
1132  ThrowImportException(OptionError,"MissingArgument",option);
1133  break;
1134  }
1135  if (LocaleCompare("screen",option+1) == 0)
1136  {
1137  ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse;
1138  break;
1139  }
1140  if (LocaleCompare("seed",option+1) == 0)
1141  {
1142  if (*option == '+')
1143  break;
1144  i++;
1145  if (i == (ssize_t) argc)
1146  ThrowImportException(OptionError,"MissingArgument",option);
1147  if (IsGeometry(argv[i]) == MagickFalse)
1148  ThrowImportInvalidArgumentException(option,argv[i]);
1149  break;
1150  }
1151  if (LocaleCompare("silent",option+1) == 0)
1152  {
1153  ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse;
1154  break;
1155  }
1156  if (LocaleCompare("snaps",option+1) == 0)
1157  {
1158  (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
1159  i++;
1160  if (i == (ssize_t) argc)
1161  ThrowImportException(OptionError,"MissingArgument",option);
1162  if (IsGeometry(argv[i]) == MagickFalse)
1163  ThrowImportInvalidArgumentException(option,argv[i]);
1164  snapshots=(ssize_t) StringToLong(argv[i]);
1165  break;
1166  }
1167  if (LocaleCompare("strip",option+1) == 0)
1168  break;
1169  if (LocaleCompare("support",option+1) == 0)
1170  {
1171  i++; /* deprecated */
1172  break;
1173  }
1174  if (LocaleCompare("synchronize",option+1) == 0)
1175  break;
1176  ThrowImportException(OptionError,"UnrecognizedOption",option);
1177  }
1178  case 't':
1179  {
1180  if (LocaleCompare("taint",option+1) == 0)
1181  break;
1182  if (LocaleCompare("thumbnail",option+1) == 0)
1183  {
1184  if (*option == '+')
1185  break;
1186  i++;
1187  if (i == (ssize_t) argc)
1188  ThrowImportException(OptionError,"MissingArgument",option);
1189  if (IsGeometry(argv[i]) == MagickFalse)
1190  ThrowImportInvalidArgumentException(option,argv[i]);
1191  break;
1192  }
1193  if (LocaleCompare("transparent",option+1) == 0)
1194  {
1195  i++;
1196  if (i == (ssize_t) argc)
1197  ThrowImportException(OptionError,"MissingArgument",option);
1198  break;
1199  }
1200  if (LocaleCompare("transparent-color",option+1) == 0)
1201  {
1202  if (*option == '+')
1203  break;
1204  i++;
1205  if (i == (ssize_t) argc)
1206  ThrowImportException(OptionError,"MissingArgument",option);
1207  break;
1208  }
1209  if (LocaleCompare("treedepth",option+1) == 0)
1210  {
1211  quantize_info->tree_depth=0;
1212  if (*option == '+')
1213  break;
1214  i++;
1215  if (i == (ssize_t) argc)
1216  ThrowImportException(OptionError,"MissingArgument",option);
1217  if (IsGeometry(argv[i]) == MagickFalse)
1218  ThrowImportInvalidArgumentException(option,argv[i]);
1219  quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
1220  break;
1221  }
1222  if (LocaleCompare("trim",option+1) == 0)
1223  break;
1224  if (LocaleCompare("type",option+1) == 0)
1225  {
1226  ssize_t
1227  type;
1228 
1229  if (*option == '+')
1230  break;
1231  i++;
1232  if (i == (ssize_t) argc)
1233  ThrowImportException(OptionError,"MissingArgument",option);
1234  type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
1235  if (type < 0)
1236  ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]);
1237  break;
1238  }
1239  ThrowImportException(OptionError,"UnrecognizedOption",option);
1240  }
1241  case 'w':
1242  {
1243  i++;
1244  if (i == (ssize_t) argc)
1245  ThrowImportException(OptionError,"MissingArgument",option);
1246  (void) CloneString(&target_window,argv[i]);
1247  break;
1248  }
1249  case 'v':
1250  {
1251  if (LocaleCompare("verbose",option+1) == 0)
1252  break;
1253  if ((LocaleCompare("version",option+1) == 0) ||
1254  (LocaleCompare("-version",option+1) == 0))
1255  {
1256  ListMagickVersion(stdout);
1257  break;
1258  }
1259  ThrowImportException(OptionError,"UnrecognizedOption",option);
1260  }
1261  case '?':
1262  break;
1263  default:
1264  ThrowImportException(OptionError,"UnrecognizedOption",option);
1265  }
1266  fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
1267  FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
1268  if (fire != MagickFalse)
1269  FireImageStack(MagickFalse,MagickTrue,MagickTrue);
1270  }
1271  if (k != 0)
1272  ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]);
1273  if (i-- != (ssize_t) argc)
1274  ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]);
1275  if (image == (Image *) NULL)
1276  ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]);
1277  FinalizeImageSettings(image_info,image,MagickTrue);
1278  status&=WriteImages(image_info,image,filename,exception);
1279  DestroyImport();
1280  return(status != 0 ? MagickTrue : MagickFalse);
1281 #else
1282  magick_unreferenced(argc);
1283  magick_unreferenced(argv);
1284  magick_unreferenced(metadata);
1285 
1286  (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
1287  "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
1288  return(ImportUsage());
1289 #endif
1290 }