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