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