|
MagickWand
6.7.5
|
00001 /* 00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00003 % % 00004 % % 00005 % % 00006 % IIIII M M PPPP OOO RRRR TTTTT % 00007 % I MM MM P P O O R R T % 00008 % I M M M PPPP O O RRRR T % 00009 % I M M P O O R R T % 00010 % IIIII M M P OOO R R T % 00011 % % 00012 % % 00013 % Import Image from X11 Screen % 00014 % % 00015 % Software Design % 00016 % John Cristy % 00017 % July 1992 % 00018 % % 00019 % % 00020 % Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization % 00021 % dedicated to making software imaging solutions freely available. % 00022 % % 00023 % You may not use this file except in compliance with the License. You may % 00024 % obtain a copy of the License at % 00025 % % 00026 % http://www.imagemagick.org/script/license.php % 00027 % % 00028 % Unless required by applicable law or agreed to in writing, software % 00029 % distributed under the License is distributed on an "AS IS" BASIS, % 00030 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 00031 % See the License for the specific language governing permissions and % 00032 % limitations under the License. % 00033 % % 00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00035 % 00036 % Use the import program to capture some or all of an X server screen and 00037 % save the image to a file. 00038 % 00039 */ 00040 00041 /* 00042 Include declarations. 00043 */ 00044 #include "MagickWand/studio.h" 00045 #include "MagickWand/MagickWand.h" 00046 #include "MagickWand/mogrify-private.h" 00047 #include "MagickCore/string-private.h" 00048 #include "MagickCore/xwindow-private.h" 00049 00050 /* 00051 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00052 % % 00053 % % 00054 % % 00055 + I m p o r t I m a g e C o m m a n d % 00056 % % 00057 % % 00058 % % 00059 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00060 % 00061 % ImportImageCommand() reads an image from any visible window on an X server 00062 % and outputs it as an image file. You can capture a single window, the 00063 % entire screen, or any rectangular portion of the screen. You can use the 00064 % display utility for redisplay, printing, editing, formatting, archiving, 00065 % image processing, etc. of the captured image.</dd> 00066 % 00067 % The target window can be specified by id, name, or may be selected by 00068 % clicking the mouse in the desired window. If you press a button and then 00069 % drag, a rectangle will form which expands and contracts as the mouse moves. 00070 % To save the portion of the screen defined by the rectangle, just release 00071 % the button. The keyboard bell is rung once at the beginning of the screen 00072 % capture and twice when it completes. 00073 % 00074 % The format of the ImportImageCommand method is: 00075 % 00076 % MagickBooleanType ImportImageCommand(ImageInfo *image_info,int argc, 00077 % char **argv,char **metadata,ExceptionInfo *exception) 00078 % 00079 % A description of each parameter follows: 00080 % 00081 % o image_info: the image info. 00082 % 00083 % o argc: the number of elements in the argument vector. 00084 % 00085 % o argv: A text array containing the command line arguments. 00086 % 00087 % o metadata: any metadata is returned here. 00088 % 00089 % o exception: return any errors or warnings in this structure. 00090 % 00091 */ 00092 00093 static MagickBooleanType ImportUsage(void) 00094 { 00095 const char 00096 **p; 00097 00098 static const char 00099 *miscellaneous[]= 00100 { 00101 "-debug events display copious debugging information", 00102 "-help print program options", 00103 "-list type print a list of supported option arguments", 00104 "-log format format of debugging information", 00105 "-version print version information", 00106 (char *) NULL 00107 }, 00108 *operators[]= 00109 { 00110 "-annotate geometry text", 00111 " annotate the image with text", 00112 "-colors value preferred number of colors in the image", 00113 "-crop geometry preferred size and location of the cropped image", 00114 "-encipher filename convert plain pixels to cipher pixels", 00115 "-geometry geometry preferred size or location of the image", 00116 "-help print program options", 00117 "-monochrome transform image to black and white", 00118 "-negate replace every pixel with its complementary color ", 00119 "-repage geometry size and location of an image canvas", 00120 "-quantize colorspace reduce colors in this colorspace", 00121 "-resize geometry resize the image", 00122 "-rotate degrees apply Paeth rotation to the image", 00123 "-strip strip image of all profiles and comments", 00124 "-thumbnail geometry create a thumbnail of the image", 00125 "-transparent color make this color transparent within the image", 00126 "-trim trim image edges", 00127 "-type type image type", 00128 (char *) NULL 00129 }, 00130 *settings[]= 00131 { 00132 "-adjoin join images into a single multi-image file", 00133 "-border include window border in the output image", 00134 "-channel type apply option to select image channels", 00135 "-colorspace type alternate image colorspace", 00136 "-comment string annotate image with comment", 00137 "-compress type type of pixel compression when writing the image", 00138 "-define format:option", 00139 " define one or more image format options", 00140 "-density geometry horizontal and vertical density of the image", 00141 "-depth value image depth", 00142 "-descend obtain image by descending window hierarchy", 00143 "-display server X server to contact", 00144 "-dispose method layer disposal method", 00145 "-dither method apply error diffusion to image", 00146 "-delay value display the next image after pausing", 00147 "-encipher filename convert plain pixels to cipher pixels", 00148 "-endian type endianness (MSB or LSB) of the image", 00149 "-encoding type text encoding type", 00150 "-filter type use this filter when resizing an image", 00151 "-format \"string\" output formatted image characteristics", 00152 "-frame include window manager frame", 00153 "-gravity direction which direction to gravitate towards", 00154 "-identify identify the format and characteristics of the image", 00155 "-interlace type None, Line, Plane, or Partition", 00156 "-interpolate method pixel color interpolation method", 00157 "-label string assign a label to an image", 00158 "-limit type value Area, Disk, Map, or Memory resource limit", 00159 "-monitor monitor progress", 00160 "-page geometry size and location of an image canvas", 00161 "-pause value seconds delay between snapshots", 00162 "-pointsize value font point size", 00163 "-quality value JPEG/MIFF/PNG compression level", 00164 "-quiet suppress all warning messages", 00165 "-regard-warnings pay attention to warning messages", 00166 "-respect-parentheses settings remain in effect until parenthesis boundary", 00167 "-sampling-factor geometry", 00168 " horizontal and vertical sampling factor", 00169 "-scene value image scene number", 00170 "-screen select image from root window", 00171 "-seed value seed a new sequence of pseudo-random numbers", 00172 "-set property value set an image property", 00173 "-silent operate silently, i.e. don't ring any bells ", 00174 "-snaps value number of screen snapshots", 00175 "-synchronize synchronize image to storage device", 00176 "-taint declare the image as modified", 00177 "-transparent-color color", 00178 " transparent color", 00179 "-treedepth value color tree depth", 00180 "-verbose print detailed information about the image", 00181 "-virtual-pixel method", 00182 " Constant, Edge, Mirror, or Tile", 00183 "-window id select window with this id or name", 00184 (char *) NULL 00185 }; 00186 00187 (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL)); 00188 (void) printf("Copyright: %s\n",GetMagickCopyright()); 00189 (void) printf("Features: %s\n\n",GetMagickFeatures()); 00190 (void) printf("Usage: %s [options ...] [ file ]\n", 00191 GetClientName()); 00192 (void) printf("\nImage Settings:\n"); 00193 for (p=settings; *p != (char *) NULL; p++) 00194 (void) printf(" %s\n",*p); 00195 (void) printf("\nImage Operators:\n"); 00196 for (p=operators; *p != (char *) NULL; p++) 00197 (void) printf(" %s\n",*p); 00198 (void) printf("\nMiscellaneous Options:\n"); 00199 for (p=miscellaneous; *p != (char *) NULL; p++) 00200 (void) printf(" %s\n",*p); 00201 (void) printf( 00202 "\nBy default, 'file' is written in the MIFF image format. To\n"); 00203 (void) printf( 00204 "specify a particular image format, precede the filename with an image\n"); 00205 (void) printf( 00206 "format name and a colon (i.e. ps:image) or specify the image type as\n"); 00207 (void) printf( 00208 "the filename suffix (i.e. image.ps). Specify 'file' as '-' for\n"); 00209 (void) printf("standard input or output.\n"); 00210 return(MagickFalse); 00211 } 00212 00213 static inline ssize_t MagickMax(const ssize_t x,const ssize_t y) 00214 { 00215 if (x > y) 00216 return(x); 00217 return(y); 00218 } 00219 00220 WandExport MagickBooleanType ImportImageCommand(ImageInfo *image_info, 00221 int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) 00222 { 00223 #if defined(MAGICKCORE_X11_DELEGATE) 00224 #define DestroyImport() \ 00225 { \ 00226 XDestroyResourceInfo(&resource_info); \ 00227 if (display != (Display *) NULL) \ 00228 { \ 00229 XCloseDisplay(display); \ 00230 display=(Display *) NULL; \ 00231 } \ 00232 DestroyImageStack(); \ 00233 if (target_window != (char *) NULL) \ 00234 target_window=DestroyString(target_window); \ 00235 for (i=0; i < (ssize_t) argc; i++) \ 00236 argv[i]=DestroyString(argv[i]); \ 00237 argv=(char **) RelinquishMagickMemory(argv); \ 00238 } 00239 #define ThrowImportException(asperity,tag,option) \ 00240 { \ 00241 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ 00242 option); \ 00243 DestroyImport(); \ 00244 return(MagickFalse); \ 00245 } 00246 #define ThrowImportInvalidArgumentException(option,argument) \ 00247 { \ 00248 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ 00249 "InvalidArgument","`%s': %s",option,argument); \ 00250 DestroyImport(); \ 00251 return(MagickFalse); \ 00252 } 00253 00254 char 00255 *filename, 00256 *option, 00257 *resource_value, 00258 *server_name, 00259 *target_window; 00260 00261 Display 00262 *display; 00263 00264 Image 00265 *image; 00266 00267 ImageStack 00268 image_stack[MaxImageStackDepth+1]; 00269 00270 MagickBooleanType 00271 fire, 00272 pend, 00273 respect_parenthesis; 00274 00275 MagickStatusType 00276 status; 00277 00278 QuantizeInfo 00279 *quantize_info; 00280 00281 register ssize_t 00282 i; 00283 00284 ssize_t 00285 j, 00286 k, 00287 snapshots; 00288 00289 XImportInfo 00290 ximage_info; 00291 00292 XResourceInfo 00293 resource_info; 00294 00295 XrmDatabase 00296 resource_database; 00297 00298 /* 00299 Set defaults. 00300 */ 00301 assert(image_info != (ImageInfo *) NULL); 00302 assert(image_info->signature == MagickSignature); 00303 if (image_info->debug != MagickFalse) 00304 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 00305 assert(exception != (ExceptionInfo *) NULL); 00306 if (argc == 2) 00307 { 00308 option=argv[1]; 00309 if ((LocaleCompare("version",option+1) == 0) || 00310 (LocaleCompare("-version",option+1) == 0)) 00311 { 00312 (void) FormatLocaleFile(stdout,"Version: %s\n", 00313 GetMagickVersion((size_t *) NULL)); 00314 (void) FormatLocaleFile(stdout,"Copyright: %s\n", 00315 GetMagickCopyright()); 00316 (void) FormatLocaleFile(stdout,"Features: %s\n\n", 00317 GetMagickFeatures()); 00318 return(MagickFalse); 00319 } 00320 } 00321 display=(Display *) NULL; 00322 j=1; 00323 k=0; 00324 NewImageStack(); 00325 option=(char *) NULL; 00326 pend=MagickFalse; 00327 resource_database=(XrmDatabase) NULL; 00328 respect_parenthesis=MagickFalse; 00329 (void) ResetMagickMemory(&resource_info,0,sizeof(resource_info)); 00330 server_name=(char *) NULL; 00331 status=MagickTrue; 00332 SetNotifyHandlers; 00333 target_window=(char *) NULL; 00334 /* 00335 Check for server name specified on the command line. 00336 */ 00337 ReadCommandlLine(argc,&argv); 00338 status=ExpandFilenames(&argc,&argv); 00339 if (status == MagickFalse) 00340 ThrowImportException(ResourceLimitError,"MemoryAllocationFailed", 00341 GetExceptionMessage(errno)); 00342 for (i=1; i < (ssize_t) argc; i++) 00343 { 00344 /* 00345 Check command line for server name. 00346 */ 00347 option=argv[i]; 00348 if (LocaleCompare("display",option+1) == 0) 00349 { 00350 /* 00351 User specified server name. 00352 */ 00353 i++; 00354 if (i == (ssize_t) argc) 00355 ThrowImportException(OptionError,"MissingArgument",option); 00356 server_name=argv[i]; 00357 } 00358 if ((LocaleCompare("help",option+1) == 0) || 00359 (LocaleCompare("-help",option+1) == 0)) 00360 return(ImportUsage()); 00361 } 00362 /* 00363 Get user defaults from X resource database. 00364 */ 00365 display=XOpenDisplay(server_name); 00366 if (display == (Display *) NULL) 00367 ThrowImportException(XServerError,"UnableToOpenXServer", 00368 XDisplayName(server_name)); 00369 (void) XSetErrorHandler(XError); 00370 resource_database=XGetResourceDatabase(display,GetClientName()); 00371 XGetImportInfo(&ximage_info); 00372 XGetResourceInfo(image_info,resource_database,GetClientName(), 00373 &resource_info); 00374 quantize_info=resource_info.quantize_info; 00375 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00376 "border","False"); 00377 ximage_info.borders=IsMagickTrue(resource_value); 00378 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00379 "delay","0"); 00380 resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value); 00381 image_info->density=XGetResourceInstance(resource_database,GetClientName(), 00382 "density",(char *) NULL); 00383 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00384 "descend","True"); 00385 ximage_info.descend=IsMagickTrue(resource_value); 00386 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00387 "frame","False"); 00388 ximage_info.frame=IsMagickTrue(resource_value); 00389 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00390 "interlace","none"); 00391 image_info->interlace=UndefinedInterlace; 00392 if (LocaleCompare("None",resource_value) == 0) 00393 image_info->interlace=NoInterlace; 00394 if (LocaleCompare("Line",resource_value) == 0) 00395 image_info->interlace=LineInterlace; 00396 if (LocaleCompare("Plane",resource_value) == 0) 00397 image_info->interlace=PlaneInterlace; 00398 if (LocaleCompare("Partition",resource_value) == 0) 00399 image_info->interlace=PartitionInterlace; 00400 if (image_info->interlace == UndefinedInterlace) 00401 ThrowImportException(OptionError,"Unrecognized interlace type", 00402 resource_value); 00403 image_info->page=XGetResourceInstance(resource_database,GetClientName(), 00404 "pageGeometry",(char *) NULL); 00405 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00406 "pause","0"); 00407 resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value); 00408 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00409 "quality","85"); 00410 image_info->quality=StringToUnsignedLong(resource_value); 00411 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00412 "screen","False"); 00413 ximage_info.screen=IsMagickTrue(resource_value); 00414 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00415 "silent","False"); 00416 ximage_info.silent=IsMagickTrue(resource_value); 00417 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00418 "verbose","False"); 00419 image_info->verbose=IsMagickTrue(resource_value); 00420 resource_value=XGetResourceInstance(resource_database,GetClientName(), 00421 "dither","True"); 00422 quantize_info->dither=IsMagickTrue(resource_value); 00423 snapshots=1; 00424 status=MagickTrue; 00425 filename=(char *) NULL; 00426 /* 00427 Check command syntax. 00428 */ 00429 for (i=1; i < (ssize_t) argc; i++) 00430 { 00431 option=argv[i]; 00432 if (LocaleCompare(option,"(") == 0) 00433 { 00434 FireImageStack(MagickFalse,MagickTrue,pend); 00435 if (k == MaxImageStackDepth) 00436 ThrowImportException(OptionError,"ParenthesisNestedTooDeeply", 00437 option); 00438 PushImageStack(); 00439 continue; 00440 } 00441 if (LocaleCompare(option,")") == 0) 00442 { 00443 FireImageStack(MagickFalse,MagickTrue,MagickTrue); 00444 if (k == 0) 00445 ThrowImportException(OptionError,"UnableToParseExpression",option); 00446 PopImageStack(); 00447 continue; 00448 } 00449 if (IsCommandOption(option) == MagickFalse) 00450 { 00451 Image 00452 *images; 00453 00454 size_t 00455 scene; 00456 00457 /* 00458 Read image from X server. 00459 */ 00460 FireImageStack(MagickFalse,MagickFalse,pend); 00461 filename=argv[i]; 00462 if (target_window != (char *) NULL) 00463 (void) CopyMagickString(image_info->filename,target_window, 00464 MaxTextExtent); 00465 for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++) 00466 { 00467 (void) sleep(resource_info.pause); 00468 images=XImportImage(image_info,&ximage_info,exception); 00469 status&=(images != (Image *) NULL) && 00470 (exception->severity < ErrorException); 00471 if (images == (Image *) NULL) 00472 continue; 00473 (void) CopyMagickString(images->filename,filename,MaxTextExtent); 00474 (void) CopyMagickString(images->magick,"PS",MaxTextExtent); 00475 images->scene=scene; 00476 AppendImageStack(images); 00477 } 00478 continue; 00479 } 00480 pend=image != (Image *) NULL ? MagickTrue : MagickFalse; 00481 switch(*(option+1)) 00482 { 00483 case 'a': 00484 { 00485 if (LocaleCompare("adjoin",option+1) == 0) 00486 break; 00487 if (LocaleCompare("annotate",option+1) == 0) 00488 { 00489 if (*option == '+') 00490 break; 00491 i++; 00492 if (i == (ssize_t) (argc-1)) 00493 ThrowImportException(OptionError,"MissingArgument",option); 00494 if (IsGeometry(argv[i]) == MagickFalse) 00495 ThrowImportInvalidArgumentException(option,argv[i]); 00496 if (i == (ssize_t) (argc-1)) 00497 ThrowImportException(OptionError,"MissingArgument",option); 00498 i++; 00499 break; 00500 } 00501 ThrowImportException(OptionError,"UnrecognizedOption",option); 00502 } 00503 case 'b': 00504 { 00505 if (LocaleCompare("border",option+1) == 0) 00506 { 00507 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); 00508 ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse; 00509 break; 00510 } 00511 if (LocaleCompare("bordercolor",option+1) == 0) 00512 { 00513 if (*option == '+') 00514 break; 00515 i++; 00516 if (i == (ssize_t) argc) 00517 ThrowImportException(OptionError,"MissingArgument",option); 00518 break; 00519 } 00520 ThrowImportException(OptionError,"UnrecognizedOption",option); 00521 } 00522 case 'c': 00523 { 00524 if (LocaleCompare("cache",option+1) == 0) 00525 { 00526 if (*option == '+') 00527 break; 00528 i++; 00529 if (i == (ssize_t) argc) 00530 ThrowImportException(OptionError,"MissingArgument",option); 00531 if (IsGeometry(argv[i]) == MagickFalse) 00532 ThrowImportInvalidArgumentException(option,argv[i]); 00533 break; 00534 } 00535 if (LocaleCompare("channel",option+1) == 0) 00536 { 00537 ssize_t 00538 channel; 00539 00540 if (*option == '+') 00541 break; 00542 i++; 00543 if (i == (ssize_t) (argc-1)) 00544 ThrowImportException(OptionError,"MissingArgument",option); 00545 channel=ParseChannelOption(argv[i]); 00546 if (channel < 0) 00547 ThrowImportException(OptionError,"UnrecognizedChannelType", 00548 argv[i]); 00549 break; 00550 } 00551 if (LocaleCompare("colors",option+1) == 0) 00552 { 00553 quantize_info->number_colors=0; 00554 if (*option == '+') 00555 break; 00556 i++; 00557 if (i == (ssize_t) argc) 00558 ThrowImportException(OptionError,"MissingArgument",option); 00559 if (IsGeometry(argv[i]) == MagickFalse) 00560 ThrowImportInvalidArgumentException(option,argv[i]); 00561 quantize_info->number_colors=StringToUnsignedLong(argv[i]); 00562 break; 00563 } 00564 if (LocaleCompare("colorspace",option+1) == 0) 00565 { 00566 ssize_t 00567 colorspace; 00568 00569 if (*option == '+') 00570 break; 00571 i++; 00572 if (i == (ssize_t) argc) 00573 ThrowImportException(OptionError,"MissingArgument",option); 00574 colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse, 00575 argv[i]); 00576 if (colorspace < 0) 00577 ThrowImportException(OptionError,"UnrecognizedColorspace", 00578 argv[i]); 00579 break; 00580 } 00581 if (LocaleCompare("comment",option+1) == 0) 00582 { 00583 if (*option == '+') 00584 break; 00585 i++; 00586 if (i == (ssize_t) argc) 00587 ThrowImportException(OptionError,"MissingArgument",option); 00588 status=SetImageOption(image_info,"comment",argv[i]); 00589 if (status == MagickFalse) 00590 ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); 00591 break; 00592 } 00593 if (LocaleCompare("compress",option+1) == 0) 00594 { 00595 ssize_t 00596 compress; 00597 00598 if (*option == '+') 00599 break; 00600 i++; 00601 if (i == (ssize_t) argc) 00602 ThrowImportException(OptionError,"MissingArgument",option); 00603 compress=ParseCommandOption(MagickCompressOptions,MagickFalse, 00604 argv[i]); 00605 if (compress < 0) 00606 ThrowImportException(OptionError,"UnrecognizedImageCompression", 00607 argv[i]); 00608 break; 00609 } 00610 if (LocaleCompare("concurrent",option+1) == 0) 00611 break; 00612 if (LocaleCompare("crop",option+1) == 0) 00613 { 00614 if (*option == '+') 00615 break; 00616 i++; 00617 if (i == (ssize_t) argc) 00618 ThrowImportException(OptionError,"MissingArgument",option); 00619 if (IsGeometry(argv[i]) == MagickFalse) 00620 ThrowImportInvalidArgumentException(option,argv[i]); 00621 break; 00622 } 00623 ThrowImportException(OptionError,"UnrecognizedOption",option); 00624 } 00625 case 'd': 00626 { 00627 if (LocaleCompare("debug",option+1) == 0) 00628 { 00629 ssize_t 00630 event; 00631 00632 if (*option == '+') 00633 break; 00634 i++; 00635 if (i == (ssize_t) argc) 00636 ThrowImportException(OptionError,"MissingArgument",option); 00637 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); 00638 if (event < 0) 00639 ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]); 00640 (void) SetLogEventMask(argv[i]); 00641 break; 00642 } 00643 if (LocaleCompare("define",option+1) == 0) 00644 { 00645 i++; 00646 if (i == (ssize_t) argc) 00647 ThrowImportException(OptionError,"MissingArgument",option); 00648 if (*option == '+') 00649 { 00650 const char 00651 *define; 00652 00653 define=GetImageOption(image_info,argv[i]); 00654 if (define == (char *) NULL) 00655 ThrowImportException(OptionError,"NoSuchOption",argv[i]); 00656 break; 00657 } 00658 break; 00659 } 00660 if (LocaleCompare("delay",option+1) == 0) 00661 { 00662 if (*option == '+') 00663 break; 00664 i++; 00665 if (i == (ssize_t) argc) 00666 ThrowImportException(OptionError,"MissingArgument",option); 00667 if (IsGeometry(argv[i]) == MagickFalse) 00668 ThrowImportInvalidArgumentException(option,argv[i]); 00669 status=SetImageOption(image_info,"delay",argv[i]); 00670 if (status == MagickFalse) 00671 ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); 00672 break; 00673 } 00674 if (LocaleCompare("density",option+1) == 0) 00675 { 00676 if (*option == '+') 00677 break; 00678 i++; 00679 if (i == (ssize_t) argc) 00680 ThrowImportException(OptionError,"MissingArgument",option); 00681 if (IsGeometry(argv[i]) == MagickFalse) 00682 ThrowImportInvalidArgumentException(option,argv[i]); 00683 break; 00684 } 00685 if (LocaleCompare("depth",option+1) == 0) 00686 { 00687 if (*option == '+') 00688 break; 00689 i++; 00690 if (i == (ssize_t) argc) 00691 ThrowImportException(OptionError,"MissingArgument",option); 00692 if (IsGeometry(argv[i]) == MagickFalse) 00693 ThrowImportInvalidArgumentException(option,argv[i]); 00694 break; 00695 } 00696 if (LocaleCompare("descend",option+1) == 0) 00697 { 00698 ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse; 00699 break; 00700 } 00701 if (LocaleCompare("display",option+1) == 0) 00702 { 00703 if (*option == '+') 00704 break; 00705 i++; 00706 if (i == (ssize_t) argc) 00707 ThrowImportException(OptionError,"MissingArgument",option); 00708 break; 00709 } 00710 if (LocaleCompare("dispose",option+1) == 0) 00711 { 00712 ssize_t 00713 dispose; 00714 00715 if (*option == '+') 00716 break; 00717 i++; 00718 if (i == (ssize_t) argc) 00719 ThrowImportException(OptionError,"MissingArgument",option); 00720 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); 00721 if (dispose < 0) 00722 ThrowImportException(OptionError,"UnrecognizedDisposeMethod", 00723 argv[i]); 00724 break; 00725 } 00726 if (LocaleCompare("dither",option+1) == 0) 00727 { 00728 ssize_t 00729 method; 00730 00731 quantize_info->dither=MagickFalse; 00732 if (*option == '+') 00733 break; 00734 i++; 00735 if (i == (ssize_t) argc) 00736 ThrowImportException(OptionError,"MissingArgument",option); 00737 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); 00738 if (method < 0) 00739 ThrowImportException(OptionError,"UnrecognizedDitherMethod", 00740 argv[i]); 00741 quantize_info->dither=MagickTrue; 00742 quantize_info->dither_method=(DitherMethod) method; 00743 break; 00744 } 00745 if (LocaleCompare("duration",option+1) == 0) 00746 { 00747 if (*option == '+') 00748 break; 00749 i++; 00750 if (i == (ssize_t) (argc-1)) 00751 ThrowImportException(OptionError,"MissingArgument",option); 00752 if (IsGeometry(argv[i]) == MagickFalse) 00753 ThrowImportInvalidArgumentException(option,argv[i]); 00754 break; 00755 } 00756 ThrowImportException(OptionError,"UnrecognizedOption",option); 00757 } 00758 case 'e': 00759 { 00760 if (LocaleCompare("encipher",option+1) == 0) 00761 { 00762 if (*option == '+') 00763 break; 00764 i++; 00765 if (i == (ssize_t) (argc-1)) 00766 ThrowImportException(OptionError,"MissingArgument",option); 00767 break; 00768 } 00769 if (LocaleCompare("encoding",option+1) == 0) 00770 { 00771 if (*option == '+') 00772 break; 00773 i++; 00774 if (i == (ssize_t) argc) 00775 ThrowImportException(OptionError,"MissingArgument",option); 00776 break; 00777 } 00778 if (LocaleCompare("endian",option+1) == 0) 00779 { 00780 ssize_t 00781 endian; 00782 00783 if (*option == '+') 00784 break; 00785 i++; 00786 if (i == (ssize_t) argc) 00787 ThrowImportException(OptionError,"MissingArgument",option); 00788 endian=ParseCommandOption(MagickEndianOptions,MagickFalse, 00789 argv[i]); 00790 if (endian < 0) 00791 ThrowImportException(OptionError,"UnrecognizedEndianType", 00792 argv[i]); 00793 break; 00794 } 00795 ThrowImportException(OptionError,"UnrecognizedOption",option); 00796 } 00797 case 'f': 00798 { 00799 if (LocaleCompare("filter",option+1) == 0) 00800 { 00801 ssize_t 00802 filter; 00803 00804 if (*option == '+') 00805 break; 00806 i++; 00807 if (i == (ssize_t) (argc-1)) 00808 ThrowImportException(OptionError,"MissingArgument",option); 00809 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); 00810 if (filter < 0) 00811 ThrowImportException(OptionError,"UnrecognizedImageFilter", 00812 argv[i]); 00813 break; 00814 } 00815 if (LocaleCompare("frame",option+1) == 0) 00816 { 00817 (void) CopyMagickString(argv[i]+1,"sans0",MaxTextExtent); 00818 ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse; 00819 break; 00820 } 00821 if (LocaleCompare("format",option+1) == 0) 00822 { 00823 if (*option == '+') 00824 break; 00825 i++; 00826 if (i == (ssize_t) (argc-1)) 00827 ThrowImportException(OptionError,"MissingArgument",option); 00828 break; 00829 } 00830 ThrowImportException(OptionError,"UnrecognizedOption",option); 00831 } 00832 case 'g': 00833 { 00834 if (LocaleCompare("geometry",option+1) == 0) 00835 { 00836 if (*option == '+') 00837 break; 00838 i++; 00839 if (i == (ssize_t) argc) 00840 ThrowImportException(OptionError,"MissingArgument",option); 00841 if (IsGeometry(argv[i]) == MagickFalse) 00842 ThrowImportInvalidArgumentException(option,argv[i]); 00843 break; 00844 } 00845 if (LocaleCompare("gravity",option+1) == 0) 00846 { 00847 ssize_t 00848 gravity; 00849 00850 if (*option == '+') 00851 break; 00852 i++; 00853 if (i == (ssize_t) argc) 00854 ThrowImportException(OptionError,"MissingArgument",option); 00855 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]); 00856 if (gravity < 0) 00857 ThrowImportException(OptionError,"UnrecognizedGravityType", 00858 argv[i]); 00859 break; 00860 } 00861 ThrowImportException(OptionError,"UnrecognizedOption",option); 00862 } 00863 case 'h': 00864 { 00865 if (LocaleCompare("help",option+1) == 0) 00866 break; 00867 ThrowImportException(OptionError,"UnrecognizedOption",option); 00868 } 00869 case 'i': 00870 { 00871 if (LocaleCompare("identify",option+1) == 0) 00872 break; 00873 if (LocaleCompare("interlace",option+1) == 0) 00874 { 00875 ssize_t 00876 interlace; 00877 00878 if (*option == '+') 00879 break; 00880 i++; 00881 if (i == (ssize_t) argc) 00882 ThrowImportException(OptionError,"MissingArgument",option); 00883 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, 00884 argv[i]); 00885 if (interlace < 0) 00886 ThrowImportException(OptionError,"UnrecognizedInterlaceType", 00887 argv[i]); 00888 break; 00889 } 00890 if (LocaleCompare("interpolate",option+1) == 0) 00891 { 00892 ssize_t 00893 interpolate; 00894 00895 if (*option == '+') 00896 break; 00897 i++; 00898 if (i == (ssize_t) argc) 00899 ThrowImportException(OptionError,"MissingArgument",option); 00900 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, 00901 argv[i]); 00902 if (interpolate < 0) 00903 ThrowImportException(OptionError,"UnrecognizedInterpolateMethod", 00904 argv[i]); 00905 break; 00906 } 00907 ThrowImportException(OptionError,"UnrecognizedOption",option); 00908 } 00909 case 'l': 00910 { 00911 if (LocaleCompare("label",option+1) == 0) 00912 { 00913 if (*option == '+') 00914 break; 00915 i++; 00916 if (i == (ssize_t) argc) 00917 ThrowImportException(OptionError,"MissingArgument",option); 00918 status=SetImageOption(image_info,"label",argv[i]); 00919 if (status == MagickFalse) 00920 ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); 00921 break; 00922 } 00923 if (LocaleCompare("limit",option+1) == 0) 00924 { 00925 char 00926 *p; 00927 00928 double 00929 value; 00930 00931 ssize_t 00932 resource; 00933 00934 if (*option == '+') 00935 break; 00936 i++; 00937 if (i == (ssize_t) argc) 00938 ThrowImportException(OptionError,"MissingArgument",option); 00939 resource=ParseCommandOption(MagickResourceOptions,MagickFalse, 00940 argv[i]); 00941 if (resource < 0) 00942 ThrowImportException(OptionError,"UnrecognizedResourceType", 00943 argv[i]); 00944 i++; 00945 if (i == (ssize_t) argc) 00946 ThrowImportException(OptionError,"MissingArgument",option); 00947 value=StringToDouble(argv[i],&p); 00948 (void) value; 00949 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) 00950 ThrowImportInvalidArgumentException(option,argv[i]); 00951 break; 00952 } 00953 if (LocaleCompare("list",option+1) == 0) 00954 { 00955 ssize_t 00956 list; 00957 00958 if (*option == '+') 00959 break; 00960 i++; 00961 if (i == (ssize_t) argc) 00962 ThrowImportException(OptionError,"MissingArgument",option); 00963 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); 00964 if (list < 0) 00965 ThrowImportException(OptionError,"UnrecognizedListType",argv[i]); 00966 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) 00967 argv+j,exception); 00968 DestroyImport(); 00969 return(status != 0 ? MagickFalse : MagickTrue); 00970 } 00971 if (LocaleCompare("log",option+1) == 0) 00972 { 00973 if (*option == '+') 00974 break; 00975 i++; 00976 if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL)) 00977 ThrowImportException(OptionError,"MissingArgument",option); 00978 break; 00979 } 00980 ThrowImportException(OptionError,"UnrecognizedOption",option); 00981 } 00982 case 'm': 00983 { 00984 if (LocaleCompare("monitor",option+1) == 0) 00985 break; 00986 if (LocaleCompare("monochrome",option+1) == 0) 00987 { 00988 if (*option == '+') 00989 break; 00990 quantize_info->number_colors=2; 00991 quantize_info->colorspace=GRAYColorspace; 00992 break; 00993 } 00994 ThrowImportException(OptionError,"UnrecognizedOption",option); 00995 } 00996 case 'n': 00997 { 00998 if (LocaleCompare("negate",option+1) == 0) 00999 break; 01000 ThrowImportException(OptionError,"UnrecognizedOption",option); 01001 } 01002 case 'p': 01003 { 01004 if (LocaleCompare("page",option+1) == 0) 01005 { 01006 if (*option == '+') 01007 break; 01008 i++; 01009 if (i == (ssize_t) argc) 01010 ThrowImportException(OptionError,"MissingArgument",option); 01011 status=SetImageOption(image_info,"page",argv[i]); 01012 if (status == MagickFalse) 01013 ThrowImportException(OptionError,"UnrecognizedOption",argv[i]); 01014 break; 01015 } 01016 if (LocaleCompare("pause",option+1) == 0) 01017 { 01018 resource_info.pause=0; 01019 if (*option == '+') 01020 break; 01021 i++; 01022 if (i == (ssize_t) argc) 01023 ThrowImportException(OptionError,"MissingArgument",option); 01024 if (IsGeometry(argv[i]) == MagickFalse) 01025 ThrowImportInvalidArgumentException(option,argv[i]); 01026 resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]); 01027 break; 01028 } 01029 if (LocaleCompare("ping",option+1) == 0) 01030 break; /* deprecated option */ 01031 if (LocaleCompare("pointsize",option+1) == 0) 01032 { 01033 if (*option == '+') 01034 break; 01035 i++; 01036 if (i == (ssize_t) argc) 01037 ThrowImportException(OptionError,"MissingArgument",option); 01038 if (IsGeometry(argv[i]) == MagickFalse) 01039 ThrowImportInvalidArgumentException(option,argv[i]); 01040 break; 01041 } 01042 ThrowImportException(OptionError,"UnrecognizedOption",option); 01043 } 01044 case 'q': 01045 { 01046 if (LocaleCompare("quality",option+1) == 0) 01047 { 01048 if (*option == '+') 01049 break; 01050 i++; 01051 if (i == (ssize_t) argc) 01052 ThrowImportException(OptionError,"MissingArgument",option); 01053 if (IsGeometry(argv[i]) == MagickFalse) 01054 ThrowImportInvalidArgumentException(option,argv[i]); 01055 break; 01056 } 01057 if (LocaleCompare("quantize",option+1) == 0) 01058 { 01059 ssize_t 01060 colorspace; 01061 01062 if (*option == '+') 01063 break; 01064 i++; 01065 if (i == (ssize_t) (argc-1)) 01066 ThrowImportException(OptionError,"MissingArgument",option); 01067 colorspace=ParseCommandOption(MagickColorspaceOptions, 01068 MagickFalse,argv[i]); 01069 if (colorspace < 0) 01070 ThrowImportException(OptionError,"UnrecognizedColorspace", 01071 argv[i]); 01072 break; 01073 } 01074 if (LocaleCompare("quiet",option+1) == 0) 01075 break; 01076 ThrowImportException(OptionError,"UnrecognizedOption",option); 01077 } 01078 case 'r': 01079 { 01080 if (LocaleCompare("regard-warnings",option+1) == 0) 01081 break; 01082 if (LocaleCompare("repage",option+1) == 0) 01083 { 01084 if (*option == '+') 01085 break; 01086 i++; 01087 if (i == (ssize_t) (argc-1)) 01088 ThrowImportException(OptionError,"MissingArgument",option); 01089 if (IsGeometry(argv[i]) == MagickFalse) 01090 ThrowImportInvalidArgumentException(option,argv[i]); 01091 break; 01092 } 01093 if (LocaleCompare("resize",option+1) == 0) 01094 { 01095 if (*option == '+') 01096 break; 01097 i++; 01098 if (i == (ssize_t) argc) 01099 ThrowImportException(OptionError,"MissingArgument",option); 01100 if (IsGeometry(argv[i]) == MagickFalse) 01101 ThrowImportInvalidArgumentException(option,argv[i]); 01102 break; 01103 } 01104 if (LocaleNCompare("respect-parentheses",option+1,17) == 0) 01105 { 01106 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; 01107 break; 01108 } 01109 if (LocaleCompare("rotate",option+1) == 0) 01110 { 01111 i++; 01112 if (i == (ssize_t) argc) 01113 ThrowImportException(OptionError,"MissingArgument",option); 01114 if (IsGeometry(argv[i]) == MagickFalse) 01115 ThrowImportInvalidArgumentException(option,argv[i]); 01116 break; 01117 } 01118 ThrowImportException(OptionError,"UnrecognizedOption",option); 01119 } 01120 case 's': 01121 { 01122 if (LocaleCompare("sampling-factor",option+1) == 0) 01123 { 01124 if (*option == '+') 01125 break; 01126 i++; 01127 if (i == (ssize_t) argc) 01128 ThrowImportException(OptionError,"MissingArgument",option); 01129 if (IsGeometry(argv[i]) == MagickFalse) 01130 ThrowImportInvalidArgumentException(option,argv[i]); 01131 break; 01132 } 01133 if (LocaleCompare("scene",option+1) == 0) 01134 { 01135 if (*option == '+') 01136 break; 01137 i++; 01138 if (i == (ssize_t) argc) 01139 ThrowImportException(OptionError,"MissingArgument",option); 01140 if (IsGeometry(argv[i]) == MagickFalse) 01141 ThrowImportInvalidArgumentException(option,argv[i]); 01142 break; 01143 } 01144 if (LocaleCompare("set",option+1) == 0) 01145 { 01146 i++; 01147 if (i == (ssize_t) argc) 01148 ThrowImportException(OptionError,"MissingArgument",option); 01149 if (*option == '+') 01150 break; 01151 i++; 01152 if (i == (ssize_t) argc) 01153 ThrowImportException(OptionError,"MissingArgument",option); 01154 break; 01155 } 01156 if (LocaleCompare("screen",option+1) == 0) 01157 { 01158 ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse; 01159 break; 01160 } 01161 if (LocaleCompare("seed",option+1) == 0) 01162 { 01163 if (*option == '+') 01164 break; 01165 i++; 01166 if (i == (ssize_t) (argc-1)) 01167 ThrowImportException(OptionError,"MissingArgument",option); 01168 if (IsGeometry(argv[i]) == MagickFalse) 01169 ThrowImportInvalidArgumentException(option,argv[i]); 01170 break; 01171 } 01172 if (LocaleCompare("silent",option+1) == 0) 01173 { 01174 ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse; 01175 break; 01176 } 01177 if (LocaleCompare("snaps",option+1) == 0) 01178 { 01179 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent); 01180 i++; 01181 if (i == (ssize_t) argc) 01182 ThrowImportException(OptionError,"MissingArgument",option); 01183 if (IsGeometry(argv[i]) == MagickFalse) 01184 ThrowImportInvalidArgumentException(option,argv[i]); 01185 snapshots=(ssize_t) StringToLong(argv[i]); 01186 break; 01187 } 01188 if (LocaleCompare("strip",option+1) == 0) 01189 break; 01190 if (LocaleCompare("support",option+1) == 0) 01191 { 01192 i++; /* deprecated */ 01193 break; 01194 } 01195 if (LocaleCompare("synchronize",option+1) == 0) 01196 break; 01197 ThrowImportException(OptionError,"UnrecognizedOption",option); 01198 } 01199 case 't': 01200 { 01201 if (LocaleCompare("taint",option+1) == 0) 01202 break; 01203 if (LocaleCompare("thumbnail",option+1) == 0) 01204 { 01205 if (*option == '+') 01206 break; 01207 i++; 01208 if (i == (ssize_t) argc) 01209 ThrowImportException(OptionError,"MissingArgument",option); 01210 if (IsGeometry(argv[i]) == MagickFalse) 01211 ThrowImportInvalidArgumentException(option,argv[i]); 01212 break; 01213 } 01214 if (LocaleCompare("transparent",option+1) == 0) 01215 { 01216 i++; 01217 if (i == (ssize_t) argc) 01218 ThrowImportException(OptionError,"MissingArgument",option); 01219 break; 01220 } 01221 if (LocaleCompare("transparent-color",option+1) == 0) 01222 { 01223 if (*option == '+') 01224 break; 01225 i++; 01226 if (i == (ssize_t) (argc-1)) 01227 ThrowImportException(OptionError,"MissingArgument",option); 01228 break; 01229 } 01230 if (LocaleCompare("treedepth",option+1) == 0) 01231 { 01232 quantize_info->tree_depth=0; 01233 if (*option == '+') 01234 break; 01235 i++; 01236 if (i == (ssize_t) argc) 01237 ThrowImportException(OptionError,"MissingArgument",option); 01238 if (IsGeometry(argv[i]) == MagickFalse) 01239 ThrowImportInvalidArgumentException(option,argv[i]); 01240 quantize_info->tree_depth=StringToUnsignedLong(argv[i]); 01241 break; 01242 } 01243 if (LocaleCompare("trim",option+1) == 0) 01244 break; 01245 if (LocaleCompare("type",option+1) == 0) 01246 { 01247 ssize_t 01248 type; 01249 01250 if (*option == '+') 01251 break; 01252 i++; 01253 if (i == (ssize_t) argc) 01254 ThrowImportException(OptionError,"MissingArgument",option); 01255 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]); 01256 if (type < 0) 01257 ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]); 01258 break; 01259 } 01260 ThrowImportException(OptionError,"UnrecognizedOption",option); 01261 } 01262 case 'w': 01263 { 01264 i++; 01265 if (i == (ssize_t) argc) 01266 ThrowImportException(OptionError,"MissingArgument",option); 01267 (void) CloneString(&target_window,argv[i]); 01268 break; 01269 } 01270 case 'v': 01271 { 01272 if (LocaleCompare("verbose",option+1) == 0) 01273 break; 01274 if ((LocaleCompare("version",option+1) == 0) || 01275 (LocaleCompare("-version",option+1) == 0)) 01276 { 01277 (void) FormatLocaleFile(stdout,"Version: %s\n", 01278 GetMagickVersion((size_t *) NULL)); 01279 (void) FormatLocaleFile(stdout,"Copyright: %s\n", 01280 GetMagickCopyright()); 01281 (void) FormatLocaleFile(stdout,"Features: %s\n\n", 01282 GetMagickFeatures()); 01283 break; 01284 } 01285 ThrowImportException(OptionError,"UnrecognizedOption",option); 01286 } 01287 case '?': 01288 break; 01289 default: 01290 ThrowImportException(OptionError,"UnrecognizedOption",option); 01291 } 01292 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & 01293 FireOptionFlag) == 0 ? MagickFalse : MagickTrue; 01294 if (fire != MagickFalse) 01295 FireImageStack(MagickFalse,MagickTrue,MagickTrue); 01296 } 01297 if (k != 0) 01298 ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]); 01299 if (i-- != (ssize_t) argc) 01300 ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]); 01301 if (image == (Image *) NULL) 01302 ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]); 01303 FinalizeImageSettings(image_info,image,MagickTrue); 01304 status&=WriteImages(image_info,image,filename,exception); 01305 DestroyImport(); 01306 return(status != 0 ? MagickTrue : MagickFalse); 01307 #else 01308 (void) argc; 01309 (void) argv; 01310 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, 01311 "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename); 01312 return(ImportUsage()); 01313 #endif 01314 }