PageRenderTime 328ms CodeModel.GetById 127ms RepoModel.GetById 12ms app.codeStats 1ms

/scripts/ImageMagick-6.6.2-6/wand/import.c

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