PageRenderTime 56ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/ImageMagick-6.3.2/wand/import.c

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