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