MagickWand 7.1.2-25
Convert, Edit, Or Compose Bitmap Images
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/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
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 " -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)
201WandExport 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
1297WandExport 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}