PageRenderTime 56ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/MagickWand/import.c

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