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