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

/lib/wand/display.c

http://github.com/idaunis/binarytiers
C | 1901 lines | 1724 code | 44 blank | 133 comment | 818 complexity | b37fcf36fba163bfb3ac3064a6ca1490 MD5 | raw file
  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % %
  4. % %
  5. % %
  6. % DDDD IIIII SSSSS PPPP L AAA Y Y %
  7. % D D I SS P P L A A Y Y %
  8. % D D I SSS PPPP L AAAAA Y %
  9. % D D I SS P L A A Y %
  10. % DDDD IIIII SSSSS P LLLLL A A Y %
  11. % %
  12. % %
  13. % Methods to Interactively Display and Edit an Image %
  14. % %
  15. % Software Design %
  16. % John Cristy %
  17. % July 1992 %
  18. % %
  19. % %
  20. % Copyright 1999-2011 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 display program to display an image or image sequence on any X
  37. % server.
  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/display-private.h"
  47. #include "magick/string-private.h"
  48. /*
  49. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  50. % %
  51. % %
  52. % %
  53. + D i s p l a y I m a g e C o m m a n d %
  54. % %
  55. % %
  56. % %
  57. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  58. %
  59. % DisplayImageCommand() displays a sequence of images on any workstation
  60. % display running an X server. Display first determines the hardware
  61. % capabilities of the workstation. If the number of unique colors in an image
  62. % is less than or equal to the number the workstation can support, the image
  63. % is displayed in an X window. Otherwise the number of colors in the image is
  64. % first reduced to match the color resolution of the workstation before it is
  65. % displayed.
  66. %
  67. % This means that a continuous-tone 24 bits/pixel image can display on a 8
  68. % bit pseudo-color device or monochrome device. In most instances the reduced
  69. % color image closely resembles the original. Alternatively, a monochrome or
  70. % pseudo-color image sequence can display on a continuous-tone 24 bits/pixels
  71. % device.
  72. %
  73. % The format of the DisplayImageCommand method is:
  74. %
  75. % MagickBooleanType DisplayImageCommand(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 DisplayUsage(void)
  92. {
  93. const char
  94. **p;
  95. static const char
  96. *buttons[]=
  97. {
  98. "1 press to map or unmap the Command widget",
  99. "2 press and drag to magnify a region of an image",
  100. "3 press to load an image from a visual image directory",
  101. (char *) NULL
  102. },
  103. *miscellaneous[]=
  104. {
  105. "-debug events display copious debugging information",
  106. "-help print program options",
  107. "-list type print a list of supported option arguments",
  108. "-log format format of debugging information",
  109. "-version print version information",
  110. (char *) NULL
  111. },
  112. *operators[]=
  113. {
  114. "-auto-orient automagically orient image",
  115. "-border geometry surround image with a border of color",
  116. "-clip clip along the first path from the 8BIM profile",
  117. "-clip-path id clip along a named path from the 8BIM profile",
  118. "-colors value preferred number of colors in the image",
  119. "-contrast enhance or reduce the image contrast",
  120. "-crop geometry preferred size and location of the cropped image",
  121. "-decipher filename convert cipher pixels to plain pixels",
  122. "-deskew threshold straighten an image",
  123. "-despeckle reduce the speckles within an image",
  124. "-edge factor apply a filter to detect edges in the image",
  125. "-enhance apply a digital filter to enhance a noisy image",
  126. "-equalize perform histogram equalization to an image",
  127. "-extract geometry extract area from image",
  128. "-flip flip image in the vertical direction",
  129. "-flop flop image in the horizontal direction",
  130. "-frame geometry surround image with an ornamental border",
  131. "-fuzz distance colors within this distance are considered equal",
  132. "-gamma value level of gamma correction",
  133. "-monochrome transform image to black and white",
  134. "-negate replace every pixel with its complementary color",
  135. "-normalize transform image to span the full range of colors",
  136. "-raise value lighten/darken image edges to create a 3-D effect",
  137. "-resample geometry change the resolution of an image",
  138. "-resize geometry resize the image",
  139. "-roll geometry roll an image vertically or horizontally",
  140. "-rotate degrees apply Paeth rotation to the image",
  141. "-sample geometry scale image with pixel sampling",
  142. "-segment value segment an image",
  143. "-sharpen geometry sharpen the image",
  144. "-strip strip image of all profiles and comments",
  145. "-threshold value threshold the image",
  146. "-thumbnail geometry create a thumbnail of the image",
  147. "-trim trim image edges",
  148. (char *) NULL
  149. },
  150. *settings[]=
  151. {
  152. "-alpha option on, activate, off, deactivate, set, opaque, copy",
  153. " transparent, extract, background, or shape",
  154. "-antialias remove pixel-aliasing",
  155. "-authenticate password",
  156. " decipher image with this password",
  157. "-backdrop display image centered on a backdrop",
  158. "-channel type apply option to select image channels",
  159. "-colormap type Shared or Private",
  160. "-colorspace type alternate image colorspace",
  161. "-comment string annotate image with comment",
  162. "-compress type type of pixel compression when writing the image",
  163. "-define format:option",
  164. " define one or more image format options",
  165. "-delay value display the next image after pausing",
  166. "-density geometry horizontal and vertical density of the image",
  167. "-depth value image depth",
  168. "-display server display image to this X server",
  169. "-dispose method layer disposal method",
  170. "-dither method apply error diffusion to image",
  171. "-endian type endianness (MSB or LSB) of the image",
  172. "-filter type use this filter when resizing an image",
  173. "-format string output formatted image characteristics",
  174. "-geometry geometry preferred size and location of the Image window",
  175. "-gravity type horizontal and vertical backdrop placement",
  176. "-identify identify the format and characteristics of the image",
  177. "-immutable displayed image cannot be modified",
  178. "-interlace type type of image interlacing scheme",
  179. "-interpolate method pixel color interpolation method",
  180. "-label string assign a label to an image",
  181. "-limit type value pixel cache resource limit",
  182. "-loop iterations loop images then exit",
  183. "-map type display image using this Standard Colormap",
  184. "-monitor monitor progress",
  185. "-page geometry size and location of an image canvas",
  186. "-profile filename add, delete, or apply an image profile",
  187. "-quality value JPEG/MIFF/PNG compression level",
  188. "-quantize colorspace reduce colors in this colorspace",
  189. "-quiet suppress all warning messages",
  190. "-regard-warnings pay attention to warning messages",
  191. "-remote command execute a command in an remote display process",
  192. "-repage geometry size and location of an image canvas (operator)",
  193. "-respect-parentheses settings remain in effect until parenthesis boundary",
  194. "-sampling-factor geometry",
  195. " horizontal and vertical sampling factor",
  196. "-seed value seed a new sequence of pseudo-random numbers",
  197. "-set property value set an image property",
  198. "-size geometry width and height of image",
  199. "-texture filename name of texture to tile onto the image background",
  200. "-transparent-color color",
  201. " transparent color",
  202. "-treedepth value color tree depth",
  203. "-update seconds detect when image file is modified and redisplay",
  204. "-verbose print detailed information about the image",
  205. "-visual type display image using this visual type",
  206. "-virtual-pixel method",
  207. " virtual pixel access method",
  208. "-window id display image to background of this window",
  209. "-window-group id exit program when this window id is destroyed",
  210. "-write filename write image to a file",
  211. (char *) NULL
  212. },
  213. *sequence_operators[]=
  214. {
  215. "-coalesce merge a sequence of images",
  216. "-flatten flatten a sequence of images",
  217. (char *) NULL
  218. };
  219. (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
  220. (void) printf("Copyright: %s\n",GetMagickCopyright());
  221. (void) printf("Features: %s\n\n",GetMagickFeatures());
  222. (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n",
  223. GetClientName());
  224. (void) printf("\nImage Settings:\n");
  225. for (p=settings; *p != (char *) NULL; p++)
  226. (void) printf(" %s\n",*p);
  227. (void) printf("\nImage Operators:\n");
  228. for (p=operators; *p != (char *) NULL; p++)
  229. (void) printf(" %s\n",*p);
  230. (void) printf("\nImage Sequence Operators:\n");
  231. for (p=sequence_operators; *p != (char *) NULL; p++)
  232. (void) printf(" %s\n",*p);
  233. (void) printf("\nMiscellaneous Options:\n");
  234. for (p=miscellaneous; *p != (char *) NULL; p++)
  235. (void) printf(" %s\n",*p);
  236. (void) printf(
  237. "\nIn addition to those listed above, you can specify these standard X\n");
  238. (void) printf(
  239. "resources as command line options: -background, -bordercolor,\n");
  240. (void) printf(
  241. "-borderwidth, -font, -foreground, -iconGeometry, -iconic, -mattecolor,\n");
  242. (void) printf("-name, -shared-memory, -usePixmap, or -title.\n");
  243. (void) printf(
  244. "\nBy default, the image format of `file' is determined by its magic\n");
  245. (void) printf(
  246. "number. To specify a particular image format, precede the filename\n");
  247. (void) printf(
  248. "with an image format name and a colon (i.e. ps:image) or specify the\n");
  249. (void) printf(
  250. "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
  251. (void) printf("'-' for standard input or output.\n");
  252. (void) printf("\nButtons: \n");
  253. for (p=buttons; *p != (char *) NULL; p++)
  254. (void) printf(" %s\n",*p);
  255. return(MagickFalse);
  256. }
  257. WandExport MagickBooleanType DisplayImageCommand(ImageInfo *image_info,
  258. int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
  259. {
  260. #if defined(MAGICKCORE_X11_DELEGATE)
  261. #define DestroyDisplay() \
  262. { \
  263. if ((state & ExitState) == 0) \
  264. DestroyXResources(); \
  265. if (display != (Display *) NULL) \
  266. { \
  267. XCloseDisplay(display); \
  268. display=(Display *) NULL; \
  269. } \
  270. XDestroyResourceInfo(&resource_info); \
  271. DestroyImageStack(); \
  272. if (image_marker != (size_t *) NULL) \
  273. image_marker=(size_t *) RelinquishMagickMemory(image_marker); \
  274. for (i=0; i < (ssize_t) argc; i++) \
  275. argv[i]=DestroyString(argv[i]); \
  276. argv=(char **) RelinquishMagickMemory(argv); \
  277. }
  278. #define ThrowDisplayException(asperity,tag,option) \
  279. { \
  280. (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
  281. option); \
  282. DestroyDisplay(); \
  283. return(MagickFalse); \
  284. }
  285. #define ThrowDisplayInvalidArgumentException(option,argument) \
  286. { \
  287. (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
  288. "InvalidArgument","`%s': %s",option,argument); \
  289. DestroyDisplay(); \
  290. return(MagickFalse); \
  291. }
  292. char
  293. *resource_value,
  294. *server_name;
  295. const char
  296. *option;
  297. Display
  298. *display;
  299. Image
  300. *image;
  301. ImageStack
  302. image_stack[MaxImageStackDepth+1];
  303. ssize_t
  304. image_number,
  305. iteration,
  306. j,
  307. k,
  308. l;
  309. MagickBooleanType
  310. fire,
  311. pend,
  312. respect_parenthesis;
  313. MagickStatusType
  314. status;
  315. QuantizeInfo
  316. *quantize_info;
  317. register ssize_t
  318. i;
  319. size_t
  320. *image_marker,
  321. iterations,
  322. last_image,
  323. state;
  324. XResourceInfo
  325. resource_info;
  326. XrmDatabase
  327. resource_database;
  328. /*
  329. Set defaults.
  330. */
  331. assert(image_info != (ImageInfo *) NULL);
  332. assert(image_info->signature == MagickSignature);
  333. if (image_info->debug != MagickFalse)
  334. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
  335. assert(exception != (ExceptionInfo *) NULL);
  336. if (argc == 2)
  337. {
  338. option=argv[1];
  339. if ((LocaleCompare("version",option+1) == 0) ||
  340. (LocaleCompare("-version",option+1) == 0))
  341. {
  342. (void) fprintf(stdout,"Version: %s\n",
  343. GetMagickVersion((size_t *) NULL));
  344. (void) fprintf(stdout,"Copyright: %s\n",GetMagickCopyright());
  345. (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
  346. return(MagickFalse);
  347. }
  348. }
  349. SetNotifyHandlers;
  350. display=(Display *) NULL;
  351. j=1;
  352. k=0;
  353. image_marker=(size_t *) NULL;
  354. image_number=0;
  355. last_image=0;
  356. NewImageStack();
  357. option=(char *) NULL;
  358. pend=MagickFalse;
  359. respect_parenthesis=MagickFalse;
  360. resource_database=(XrmDatabase) NULL;
  361. (void) ResetMagickMemory(&resource_info,0,sizeof(resource_info));
  362. server_name=(char *) NULL;
  363. state=0;
  364. status=MagickTrue;
  365. ReadCommandlLine(argc,&argv);
  366. status=ExpandFilenames(&argc,&argv);
  367. if (status == MagickFalse)
  368. ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
  369. GetExceptionMessage(errno));
  370. image_marker=(size_t *) AcquireQuantumMemory((size_t) argc+1UL,
  371. sizeof(*image_marker));
  372. if (image_marker == (size_t *) NULL)
  373. ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed",
  374. GetExceptionMessage(errno));
  375. for (i=0; i <= (ssize_t) argc; i++)
  376. image_marker[i]=(size_t) argc;
  377. /*
  378. Check for server name specified on the command line.
  379. */
  380. for (i=1; i < (ssize_t) argc; i++)
  381. {
  382. /*
  383. Check command line for server name.
  384. */
  385. option=argv[i];
  386. if (LocaleCompare("display",option+1) == 0)
  387. {
  388. /*
  389. User specified server name.
  390. */
  391. i++;
  392. if (i == (ssize_t) argc)
  393. ThrowDisplayException(OptionError,"MissingArgument",option);
  394. server_name=argv[i];
  395. }
  396. if ((LocaleCompare("help",option+1) == 0) ||
  397. (LocaleCompare("-help",option+1) == 0))
  398. return(DisplayUsage());
  399. }
  400. /*
  401. Get user defaults from X resource database.
  402. */
  403. display=XOpenDisplay(server_name);
  404. if (display == (Display *) NULL)
  405. ThrowDisplayException(XServerError,"UnableToOpenXServer",
  406. XDisplayName(server_name));
  407. (void) XSetErrorHandler(XError);
  408. resource_database=XGetResourceDatabase(display,GetClientName());
  409. XGetResourceInfo(image_info,resource_database,GetClientName(),
  410. &resource_info);
  411. quantize_info=resource_info.quantize_info;
  412. image_info->density=XGetResourceInstance(resource_database,GetClientName(),
  413. "density",(char *) NULL);
  414. if (image_info->density == (char *) NULL)
  415. image_info->density=XGetScreenDensity(display);
  416. resource_value=XGetResourceInstance(resource_database,GetClientName(),
  417. "interlace","none");
  418. image_info->interlace=(InterlaceType)
  419. ParseMagickOption(MagickInterlaceOptions,MagickFalse,resource_value);
  420. image_info->page=XGetResourceInstance(resource_database,GetClientName(),
  421. "pageGeometry",(char *) NULL);
  422. resource_value=XGetResourceInstance(resource_database,GetClientName(),
  423. "quality","75");
  424. image_info->quality=StringToUnsignedLong(resource_value);
  425. resource_value=XGetResourceInstance(resource_database,GetClientName(),
  426. "verbose","False");
  427. image_info->verbose=IsMagickTrue(resource_value);
  428. resource_value=XGetResourceInstance(resource_database,GetClientName(),
  429. "dither","True");
  430. quantize_info->dither=IsMagickTrue(resource_value);
  431. /*
  432. Parse command line.
  433. */
  434. iteration=0;
  435. for (i=1; ((i <= (ssize_t) argc) && ((state & ExitState) == 0)); i++)
  436. {
  437. if (i < (ssize_t) argc)
  438. option=argv[i];
  439. else
  440. if (image != (Image *) NULL)
  441. break;
  442. else
  443. if (isatty(STDIN_FILENO) != MagickFalse)
  444. option="logo:";
  445. else
  446. {
  447. int
  448. c;
  449. c=getc(stdin);
  450. if (c == EOF)
  451. break;
  452. else
  453. {
  454. c=ungetc(c,stdin);
  455. option="-";
  456. }
  457. }
  458. if (LocaleCompare(option,"(") == 0)
  459. {
  460. FireImageStack(MagickFalse,MagickTrue,pend);
  461. if (k == MaxImageStackDepth)
  462. ThrowDisplayException(OptionError,"ParenthesisNestedTooDeeply",
  463. option);
  464. PushImageStack();
  465. continue;
  466. }
  467. if (LocaleCompare(option,")") == 0)
  468. {
  469. FireImageStack(MagickFalse,MagickTrue,MagickTrue);
  470. if (k == 0)
  471. ThrowDisplayException(OptionError,"UnableToParseExpression",option);
  472. PopImageStack();
  473. continue;
  474. }
  475. if (IsMagickOption(option) == MagickFalse)
  476. {
  477. const char
  478. *filename;
  479. Image
  480. *images;
  481. /*
  482. Option is a file name.
  483. */
  484. FireImageStack(MagickFalse,MagickFalse,pend);
  485. filename=option;
  486. if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
  487. {
  488. option=argv[++i];
  489. filename=option;
  490. }
  491. (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
  492. images=ReadImage(image_info,exception);
  493. CatchException(exception);
  494. status&=(images != (Image *) NULL) &&
  495. (exception->severity < ErrorException);
  496. if (images == (Image *) NULL)
  497. continue;
  498. AppendImageStack(images);
  499. FinalizeImageSettings(image_info,image,MagickFalse);
  500. iterations=0;
  501. if (i == (ssize_t) (argc-1))
  502. iterations=image->iterations;
  503. do
  504. {
  505. /*
  506. Transmogrify image as defined by the image processing options.
  507. */
  508. resource_info.quantum=1;
  509. if (resource_info.window_id != (char *) NULL)
  510. {
  511. /*
  512. Display image to a specified X window.
  513. */
  514. status=XDisplayBackgroundImage(display,&resource_info,image);
  515. if (status != MagickFalse)
  516. {
  517. state|=RetainColorsState;
  518. status=MagickFalse;
  519. }
  520. }
  521. else
  522. do
  523. {
  524. Image
  525. *nexus;
  526. /*
  527. Display image to X server.
  528. */
  529. if (resource_info.delay != 1)
  530. image->delay=resource_info.delay;
  531. nexus=XDisplayImage(display,&resource_info,argv,argc,&image,
  532. &state);
  533. status&=nexus != (Image *) NULL;
  534. if (nexus == (Image *) NULL)
  535. break;
  536. while ((nexus != (Image *) NULL) && ((state & ExitState) == 0))
  537. {
  538. Image
  539. *next;
  540. if (nexus->montage != (char *) NULL)
  541. {
  542. /*
  543. User selected a visual directory image (montage).
  544. */
  545. RemoveAllImageStack()
  546. image=nexus;
  547. break;
  548. }
  549. next=XDisplayImage(display,&resource_info,argv,argc,&nexus,
  550. &state);
  551. if ((next == (Image *) NULL) &&
  552. (GetNextImageInList(nexus) != (Image *) NULL))
  553. {
  554. RemoveAllImageStack()
  555. image=GetNextImageInList(nexus);
  556. nexus=NewImageList();
  557. }
  558. else
  559. {
  560. if (nexus != image)
  561. nexus=DestroyImageList(nexus);
  562. nexus=next;
  563. }
  564. }
  565. } while ((state & ExitState) == 0);
  566. if (resource_info.write_filename != (char *) NULL)
  567. {
  568. /*
  569. Write image.
  570. */
  571. (void) CopyMagickString(image->filename,
  572. resource_info.write_filename,MaxTextExtent);
  573. (void) SetImageInfo(image_info,1,&image->exception);
  574. status&=WriteImage(image_info,image);
  575. GetImageException(image,exception);
  576. }
  577. /*
  578. Proceed to next/previous image.
  579. */
  580. if ((state & FormerImageState) != 0)
  581. for (l=0; l < (ssize_t) resource_info.quantum; l++)
  582. {
  583. image=GetPreviousImageInList(image);
  584. if (image == (Image *) NULL)
  585. break;
  586. }
  587. else
  588. for (l=0; l < (ssize_t) resource_info.quantum; l++)
  589. {
  590. image=GetNextImageInList(image);
  591. if (image == (Image *) NULL)
  592. break;
  593. }
  594. } while ((image != (Image *) NULL) && ((state & ExitState) == 0));
  595. /*
  596. Free image resources.
  597. */
  598. if (image != (Image *) NULL)
  599. SetImageStack(image);
  600. RemoveAllImageStack();
  601. if ((state & FormerImageState) == 0)
  602. {
  603. last_image=(size_t) image_number;
  604. image_marker[i]=(size_t) image_number++;
  605. }
  606. else
  607. {
  608. /*
  609. Proceed to previous image.
  610. */
  611. for (i--; i > 0; i--)
  612. if (image_marker[i] == (size_t) (image_number-2))
  613. break;
  614. image_number--;
  615. }
  616. if ((i == (ssize_t) (argc-1)) && ((state & ExitState) == 0))
  617. i=0;
  618. if ((state & ExitState) != 0)
  619. break;
  620. /*
  621. Determine if we should proceed to the first image.
  622. */
  623. if (image_number < 0)
  624. {
  625. if ((state & FormerImageState) != 0)
  626. {
  627. for (i=1; i < (ssize_t) (argc-2); i++)
  628. if (last_image == image_marker[i])
  629. break;
  630. image_number=(ssize_t) image_marker[i]+1;
  631. }
  632. continue;
  633. }
  634. if (resource_info.window_id != (char *) NULL)
  635. state|=ExitState;
  636. if ((iterations != 0) && (++iteration == (ssize_t) iterations))
  637. state|=ExitState;
  638. if (LocaleCompare(filename,"-") == 0)
  639. state|=ExitState;
  640. continue;
  641. }
  642. pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
  643. switch (*(option+1))
  644. {
  645. case 'a':
  646. {
  647. if (LocaleCompare("alpha",option+1) == 0)
  648. {
  649. ssize_t
  650. type;
  651. if (*option == '+')
  652. break;
  653. i++;
  654. if (i == (ssize_t) argc)
  655. ThrowDisplayException(OptionError,"MissingArgument",option);
  656. type=ParseMagickOption(MagickAlphaOptions,MagickFalse,argv[i]);
  657. if (type < 0)
  658. ThrowDisplayException(OptionError,"UnrecognizedAlphaChannelType",
  659. argv[i]);
  660. break;
  661. }
  662. if (LocaleCompare("antialias",option+1) == 0)
  663. break;
  664. if (LocaleCompare("authenticate",option+1) == 0)
  665. {
  666. if (*option == '+')
  667. break;
  668. i++;
  669. if (i == (ssize_t) argc)
  670. ThrowDisplayException(OptionError,"MissingArgument",option);
  671. break;
  672. }
  673. if (LocaleCompare("auto-orient",option+1) == 0)
  674. break;
  675. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  676. }
  677. case 'b':
  678. {
  679. if (LocaleCompare("backdrop",option+1) == 0)
  680. {
  681. resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse;
  682. break;
  683. }
  684. if (LocaleCompare("background",option+1) == 0)
  685. {
  686. if (*option == '+')
  687. break;
  688. i++;
  689. if (i == (ssize_t) argc)
  690. ThrowDisplayException(OptionError,"MissingArgument",option);
  691. resource_info.background_color=argv[i];
  692. break;
  693. }
  694. if (LocaleCompare("border",option+1) == 0)
  695. {
  696. if (*option == '+')
  697. break;
  698. i++;
  699. if (i == (ssize_t) argc)
  700. ThrowDisplayException(OptionError,"MissingArgument",option);
  701. if (IsGeometry(argv[i]) == MagickFalse)
  702. ThrowDisplayInvalidArgumentException(option,argv[i]);
  703. break;
  704. }
  705. if (LocaleCompare("bordercolor",option+1) == 0)
  706. {
  707. if (*option == '+')
  708. break;
  709. i++;
  710. if (i == (ssize_t) argc)
  711. ThrowDisplayException(OptionError,"MissingArgument",option);
  712. resource_info.border_color=argv[i];
  713. break;
  714. }
  715. if (LocaleCompare("borderwidth",option+1) == 0)
  716. {
  717. resource_info.border_width=0;
  718. if (*option == '+')
  719. break;
  720. i++;
  721. if (i == (ssize_t) argc)
  722. ThrowDisplayException(OptionError,"MissingArgument",option);
  723. if (IsGeometry(argv[i]) == MagickFalse)
  724. ThrowDisplayInvalidArgumentException(option,argv[i]);
  725. resource_info.border_width=(unsigned int)
  726. StringToUnsignedLong(argv[i]);
  727. break;
  728. }
  729. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  730. }
  731. case 'c':
  732. {
  733. if (LocaleCompare("cache",option+1) == 0)
  734. {
  735. if (*option == '+')
  736. break;
  737. i++;
  738. if (i == (ssize_t) argc)
  739. ThrowDisplayException(OptionError,"MissingArgument",option);
  740. if (IsGeometry(argv[i]) == MagickFalse)
  741. ThrowDisplayInvalidArgumentException(option,argv[i]);
  742. break;
  743. }
  744. if (LocaleCompare("channel",option+1) == 0)
  745. {
  746. ssize_t
  747. channel;
  748. if (*option == '+')
  749. break;
  750. i++;
  751. if (i == (ssize_t) (argc-1))
  752. ThrowDisplayException(OptionError,"MissingArgument",option);
  753. channel=ParseChannelOption(argv[i]);
  754. if (channel < 0)
  755. ThrowDisplayException(OptionError,"UnrecognizedChannelType",
  756. argv[i]);
  757. break;
  758. }
  759. if (LocaleCompare("clip",option+1) == 0)
  760. break;
  761. if (LocaleCompare("clip-path",option+1) == 0)
  762. {
  763. i++;
  764. if (i == (ssize_t) argc)
  765. ThrowDisplayException(OptionError,"MissingArgument",option);
  766. break;
  767. }
  768. if (LocaleCompare("coalesce",option+1) == 0)
  769. break;
  770. if (LocaleCompare("colormap",option+1) == 0)
  771. {
  772. resource_info.colormap=PrivateColormap;
  773. if (*option == '+')
  774. break;
  775. i++;
  776. if (i == (ssize_t) argc)
  777. ThrowDisplayException(OptionError,"MissingArgument",option);
  778. resource_info.colormap=UndefinedColormap;
  779. if (LocaleCompare("private",argv[i]) == 0)
  780. resource_info.colormap=PrivateColormap;
  781. if (LocaleCompare("shared",argv[i]) == 0)
  782. resource_info.colormap=SharedColormap;
  783. if (resource_info.colormap == UndefinedColormap)
  784. ThrowDisplayException(OptionError,"UnrecognizedColormapType",
  785. argv[i]);
  786. break;
  787. }
  788. if (LocaleCompare("colors",option+1) == 0)
  789. {
  790. quantize_info->number_colors=0;
  791. if (*option == '+')
  792. break;
  793. i++;
  794. if (i == (ssize_t) argc)
  795. ThrowDisplayException(OptionError,"MissingArgument",option);
  796. if (IsGeometry(argv[i]) == MagickFalse)
  797. ThrowDisplayInvalidArgumentException(option,argv[i]);
  798. quantize_info->number_colors=StringToUnsignedLong(argv[i]);
  799. break;
  800. }
  801. if (LocaleCompare("colorspace",option+1) == 0)
  802. {
  803. ssize_t
  804. colorspace;
  805. if (*option == '+')
  806. break;
  807. i++;
  808. if (i == (ssize_t) argc)
  809. ThrowDisplayException(OptionError,"MissingArgument",option);
  810. colorspace=ParseMagickOption(MagickColorspaceOptions,
  811. MagickFalse,argv[i]);
  812. if (colorspace < 0)
  813. ThrowDisplayException(OptionError,"UnrecognizedColorspace",
  814. argv[i]);
  815. break;
  816. }
  817. if (LocaleCompare("comment",option+1) == 0)
  818. {
  819. if (*option == '+')
  820. break;
  821. i++;
  822. if (i == (ssize_t) argc)
  823. ThrowDisplayException(OptionError,"MissingArgument",option);
  824. break;
  825. }
  826. if (LocaleCompare("compress",option+1) == 0)
  827. {
  828. ssize_t
  829. compress;
  830. if (*option == '+')
  831. break;
  832. i++;
  833. if (i == (ssize_t) argc)
  834. ThrowDisplayException(OptionError,"MissingArgument",option);
  835. compress=ParseMagickOption(MagickCompressOptions,MagickFalse,
  836. argv[i]);
  837. if (compress < 0)
  838. ThrowDisplayException(OptionError,"UnrecognizedImageCompression",
  839. argv[i]);
  840. break;
  841. }
  842. if (LocaleCompare("concurrent",option+1) == 0)
  843. break;
  844. if (LocaleCompare("contrast",option+1) == 0)
  845. break;
  846. if (LocaleCompare("crop",option+1) == 0)
  847. {
  848. if (*option == '+')
  849. break;
  850. i++;
  851. if (i == (ssize_t) argc)
  852. ThrowDisplayException(OptionError,"MissingArgument",option);
  853. if (IsGeometry(argv[i]) == MagickFalse)
  854. ThrowDisplayInvalidArgumentException(option,argv[i]);
  855. break;
  856. }
  857. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  858. }
  859. case 'd':
  860. {
  861. if (LocaleCompare("debug",option+1) == 0)
  862. {
  863. ssize_t
  864. event;
  865. if (*option == '+')
  866. break;
  867. i++;
  868. if (i == (ssize_t) argc)
  869. ThrowDisplayException(OptionError,"MissingArgument",option);
  870. event=ParseMagickOption(MagickLogEventOptions,MagickFalse,argv[i]);
  871. if (event < 0)
  872. ThrowDisplayException(OptionError,"UnrecognizedEventType",
  873. argv[i]);
  874. (void) SetLogEventMask(argv[i]);
  875. break;
  876. }
  877. if (LocaleCompare("decipher",option+1) == 0)
  878. {
  879. if (*option == '+')
  880. break;
  881. i++;
  882. if (i == (ssize_t) (argc-1))
  883. ThrowDisplayException(OptionError,"MissingArgument",option);
  884. break;
  885. }
  886. if (LocaleCompare("define",option+1) == 0)
  887. {
  888. i++;
  889. if (i == (ssize_t) argc)
  890. ThrowDisplayException(OptionError,"MissingArgument",option);
  891. if (*option == '+')
  892. {
  893. const char
  894. *define;
  895. define=GetImageOption(image_info,argv[i]);
  896. if (define == (const char *) NULL)
  897. ThrowDisplayException(OptionError,"NoSuchOption",argv[i]);
  898. break;
  899. }
  900. break;
  901. }
  902. if (LocaleCompare("delay",option+1) == 0)
  903. {
  904. if (*option == '+')
  905. break;
  906. i++;
  907. if (i == (ssize_t) argc)
  908. ThrowDisplayException(OptionError,"MissingArgument",option);
  909. if (IsGeometry(argv[i]) == MagickFalse)
  910. ThrowDisplayInvalidArgumentException(option,argv[i]);
  911. break;
  912. }
  913. if (LocaleCompare("density",option+1) == 0)
  914. {
  915. if (*option == '+')
  916. break;
  917. i++;
  918. if (i == (ssize_t) argc)
  919. ThrowDisplayException(OptionError,"MissingArgument",option);
  920. if (IsGeometry(argv[i]) == MagickFalse)
  921. ThrowDisplayInvalidArgumentException(option,argv[i]);
  922. break;
  923. }
  924. if (LocaleCompare("depth",option+1) == 0)
  925. {
  926. if (*option == '+')
  927. break;
  928. i++;
  929. if (i == (ssize_t) argc)
  930. ThrowDisplayException(OptionError,"MissingArgument",option);
  931. if (IsGeometry(argv[i]) == MagickFalse)
  932. ThrowDisplayInvalidArgumentException(option,argv[i]);
  933. break;
  934. }
  935. if (LocaleCompare("deskew",option+1) == 0)
  936. {
  937. if (*option == '+')
  938. break;
  939. i++;
  940. if (i == (ssize_t) (argc-1))
  941. ThrowDisplayException(OptionError,"MissingArgument",option);
  942. if (IsGeometry(argv[i]) == MagickFalse)
  943. ThrowDisplayInvalidArgumentException(option,argv[i]);
  944. break;
  945. }
  946. if (LocaleCompare("despeckle",option+1) == 0)
  947. break;
  948. if (LocaleCompare("display",option+1) == 0)
  949. {
  950. if (*option == '+')
  951. break;
  952. i++;
  953. if (i == (ssize_t) argc)
  954. ThrowDisplayException(OptionError,"MissingArgument",option);
  955. break;
  956. }
  957. if (LocaleCompare("dispose",option+1) == 0)
  958. {
  959. ssize_t
  960. dispose;
  961. if (*option == '+')
  962. break;
  963. i++;
  964. if (i == (ssize_t) argc)
  965. ThrowDisplayException(OptionError,"MissingArgument",option);
  966. dispose=ParseMagickOption(MagickDisposeOptions,MagickFalse,argv[i]);
  967. if (dispose < 0)
  968. ThrowDisplayException(OptionError,"UnrecognizedDisposeMethod",
  969. argv[i]);
  970. break;
  971. }
  972. if (LocaleCompare("dither",option+1) == 0)
  973. {
  974. ssize_t
  975. method;
  976. quantize_info->dither=MagickFalse;
  977. if (*option == '+')
  978. break;
  979. i++;
  980. if (i == (ssize_t) argc)
  981. ThrowDisplayException(OptionError,"MissingArgument",option);
  982. method=ParseMagickOption(MagickDitherOptions,MagickFalse,argv[i]);
  983. if (method < 0)
  984. ThrowDisplayException(OptionError,"UnrecognizedDitherMethod",
  985. argv[i]);
  986. quantize_info->dither=MagickTrue;
  987. quantize_info->dither_method=(DitherMethod) method;
  988. break;
  989. }
  990. if (LocaleCompare("duration",option+1) == 0)
  991. {
  992. if (*option == '+')
  993. break;
  994. i++;
  995. if (i == (ssize_t) (argc-1))
  996. ThrowDisplayException(OptionError,"MissingArgument",option);
  997. if (IsGeometry(argv[i]) == MagickFalse)
  998. ThrowDisplayInvalidArgumentException(option,argv[i]);
  999. break;
  1000. }
  1001. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1002. }
  1003. case 'e':
  1004. {
  1005. if (LocaleCompare("edge",option+1) == 0)
  1006. {
  1007. if (*option == '+')
  1008. break;
  1009. i++;
  1010. if (i == (ssize_t) argc)
  1011. ThrowDisplayException(OptionError,"MissingArgument",option);
  1012. if (IsGeometry(argv[i]) == MagickFalse)
  1013. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1014. break;
  1015. }
  1016. if (LocaleCompare("endian",option+1) == 0)
  1017. {
  1018. ssize_t
  1019. endian;
  1020. if (*option == '+')
  1021. break;
  1022. i++;
  1023. if (i == (ssize_t) argc)
  1024. ThrowDisplayException(OptionError,"MissingArgument",option);
  1025. endian=ParseMagickOption(MagickEndianOptions,MagickFalse,
  1026. argv[i]);
  1027. if (endian < 0)
  1028. ThrowDisplayException(OptionError,"UnrecognizedEndianType",
  1029. argv[i]);
  1030. break;
  1031. }
  1032. if (LocaleCompare("enhance",option+1) == 0)
  1033. break;
  1034. if (LocaleCompare("equalize",option+1) == 0)
  1035. break;
  1036. if (LocaleCompare("extract",option+1) == 0)
  1037. {
  1038. if (*option == '+')
  1039. break;
  1040. i++;
  1041. if (i == (ssize_t) argc)
  1042. ThrowDisplayException(OptionError,"MissingArgument",option);
  1043. if (IsGeometry(argv[i]) == MagickFalse)
  1044. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1045. break;
  1046. }
  1047. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1048. }
  1049. case 'f':
  1050. {
  1051. if (LocaleCompare("filter",option+1) == 0)
  1052. {
  1053. ssize_t
  1054. filter;
  1055. if (*option == '+')
  1056. break;
  1057. i++;
  1058. if (i == (ssize_t) argc)
  1059. ThrowDisplayException(OptionError,"MissingArgument",option);
  1060. filter=ParseMagickOption(MagickFilterOptions,MagickFalse,argv[i]);
  1061. if (filter < 0)
  1062. ThrowDisplayException(OptionError,"UnrecognizedImageFilter",
  1063. argv[i]);
  1064. break;
  1065. }
  1066. if (LocaleCompare("flatten",option+1) == 0)
  1067. break;
  1068. if (LocaleCompare("flip",option+1) == 0)
  1069. break;
  1070. if (LocaleCompare("flop",option+1) == 0)
  1071. break;
  1072. if (LocaleCompare("font",option+1) == 0)
  1073. {
  1074. if (*option == '+')
  1075. break;
  1076. i++;
  1077. if (i == (ssize_t) argc)
  1078. ThrowDisplayException(OptionError,"MissingArgument",option);
  1079. resource_info.font=XGetResourceClass(resource_database,
  1080. GetClientName(),"font",argv[i]);
  1081. break;
  1082. }
  1083. if (LocaleCompare("foreground",option+1) == 0)
  1084. {
  1085. if (*option == '+')
  1086. break;
  1087. i++;
  1088. if (i == (ssize_t) argc)
  1089. ThrowDisplayException(OptionError,"MissingArgument",option);
  1090. resource_info.foreground_color=argv[i];
  1091. break;
  1092. }
  1093. if (LocaleCompare("format",option+1) == 0)
  1094. {
  1095. if (*option == '+')
  1096. break;
  1097. i++;
  1098. if (i == (ssize_t) (argc-1))
  1099. ThrowDisplayException(OptionError,"MissingArgument",option);
  1100. break;
  1101. }
  1102. if (LocaleCompare("frame",option+1) == 0)
  1103. {
  1104. if (*option == '+')
  1105. break;
  1106. i++;
  1107. if (i == (ssize_t) argc)
  1108. ThrowDisplayException(OptionError,"MissingArgument",option);
  1109. if (IsGeometry(argv[i]) == MagickFalse)
  1110. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1111. break;
  1112. }
  1113. if (LocaleCompare("fuzz",option+1) == 0)
  1114. {
  1115. if (*option == '+')
  1116. break;
  1117. i++;
  1118. if (i == (ssize_t) (argc-1))
  1119. ThrowDisplayException(OptionError,"MissingArgument",option);
  1120. if (IsGeometry(argv[i]) == MagickFalse)
  1121. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1122. break;
  1123. }
  1124. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1125. }
  1126. case 'g':
  1127. {
  1128. if (LocaleCompare("gamma",option+1) == 0)
  1129. {
  1130. i++;
  1131. if (i == (ssize_t) argc)
  1132. ThrowDisplayException(OptionError,"MissingArgument",option);
  1133. if (IsGeometry(argv[i]) == MagickFalse)
  1134. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1135. break;
  1136. }
  1137. if (LocaleCompare("geometry",option+1) == 0)
  1138. {
  1139. resource_info.image_geometry=(char *) NULL;
  1140. if (*option == '+')
  1141. break;
  1142. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  1143. i++;
  1144. if (i == (ssize_t) argc)
  1145. ThrowDisplayException(OptionError,"MissingArgument",option);
  1146. if (IsGeometry(argv[i]) == MagickFalse)
  1147. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1148. resource_info.image_geometry=ConstantString(argv[i]);
  1149. break;
  1150. }
  1151. if (LocaleCompare("gravity",option+1) == 0)
  1152. {
  1153. ssize_t
  1154. gravity;
  1155. if (*option == '+')
  1156. break;
  1157. i++;
  1158. if (i == (ssize_t) (argc-1))
  1159. ThrowDisplayException(OptionError,"MissingArgument",option);
  1160. gravity=ParseMagickOption(MagickGravityOptions,MagickFalse,
  1161. argv[i]);
  1162. if (gravity < 0)
  1163. ThrowDisplayException(OptionError,"UnrecognizedGravityType",
  1164. argv[i]);
  1165. break;
  1166. }
  1167. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1168. }
  1169. case 'h':
  1170. {
  1171. if ((LocaleCompare("help",option+1) == 0) ||
  1172. (LocaleCompare("-help",option+1) == 0))
  1173. break;
  1174. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1175. }
  1176. case 'i':
  1177. {
  1178. if (LocaleCompare("identify",option+1) == 0)
  1179. break;
  1180. if (LocaleCompare("iconGeometry",option+1) == 0)
  1181. {
  1182. resource_info.icon_geometry=(char *) NULL;
  1183. if (*option == '+')
  1184. break;
  1185. i++;
  1186. if (i == (ssize_t) argc)
  1187. ThrowDisplayException(OptionError,"MissingArgument",option);
  1188. if (IsGeometry(argv[i]) == MagickFalse)
  1189. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1190. resource_info.icon_geometry=argv[i];
  1191. break;
  1192. }
  1193. if (LocaleCompare("iconic",option+1) == 0)
  1194. {
  1195. resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse;
  1196. break;
  1197. }
  1198. if (LocaleCompare("immutable",option+1) == 0)
  1199. {
  1200. resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse;
  1201. break;
  1202. }
  1203. if (LocaleCompare("interlace",option+1) == 0)
  1204. {
  1205. ssize_t
  1206. interlace;
  1207. if (*option == '+')
  1208. break;
  1209. i++;
  1210. if (i == (ssize_t) argc)
  1211. ThrowDisplayException(OptionError,"MissingArgument",option);
  1212. interlace=ParseMagickOption(MagickInterlaceOptions,MagickFalse,
  1213. argv[i]);
  1214. if (interlace < 0)
  1215. ThrowDisplayException(OptionError,"UnrecognizedInterlaceType",
  1216. argv[i]);
  1217. break;
  1218. }
  1219. if (LocaleCompare("interpolate",option+1) == 0)
  1220. {
  1221. ssize_t
  1222. interpolate;
  1223. if (*option == '+')
  1224. break;
  1225. i++;
  1226. if (i == (ssize_t) argc)
  1227. ThrowDisplayException(OptionError,"MissingArgument",option);
  1228. interpolate=ParseMagickOption(MagickInterpolateOptions,MagickFalse,
  1229. argv[i]);
  1230. if (interpolate < 0)
  1231. ThrowDisplayException(OptionError,"UnrecognizedInterpolateMethod",
  1232. argv[i]);
  1233. break;
  1234. }
  1235. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1236. }
  1237. case 'l':
  1238. {
  1239. if (LocaleCompare("label",option+1) == 0)
  1240. {
  1241. if (*option == '+')
  1242. break;
  1243. i++;
  1244. if (i == (ssize_t) argc)
  1245. ThrowDisplayException(OptionError,"MissingArgument",option);
  1246. break;
  1247. }
  1248. if (LocaleCompare("limit",option+1) == 0)
  1249. {
  1250. char
  1251. *p;
  1252. double
  1253. value;
  1254. ssize_t
  1255. resource;
  1256. if (*option == '+')
  1257. break;
  1258. i++;
  1259. if (i == (ssize_t) argc)
  1260. ThrowDisplayException(OptionError,"MissingArgument",option);
  1261. resource=ParseMagickOption(MagickResourceOptions,MagickFalse,
  1262. argv[i]);
  1263. if (resource < 0)
  1264. ThrowDisplayException(OptionError,"UnrecognizedResourceType",
  1265. argv[i]);
  1266. i++;
  1267. if (i == (ssize_t) argc)
  1268. ThrowDisplayException(OptionError,"MissingArgument",option);
  1269. value=strtod(argv[i],&p);
  1270. (void) value;
  1271. if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
  1272. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1273. break;
  1274. }
  1275. if (LocaleCompare("list",option+1) == 0)
  1276. {
  1277. ssize_t
  1278. list;
  1279. if (*option == '+')
  1280. break;
  1281. i++;
  1282. if (i == (ssize_t) argc)
  1283. ThrowDisplayException(OptionError,"MissingArgument",option);
  1284. list=ParseMagickOption(MagickListOptions,MagickFalse,argv[i]);
  1285. if (list < 0)
  1286. ThrowDisplayException(OptionError,"UnrecognizedListType",argv[i]);
  1287. status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
  1288. argv+j,exception);
  1289. DestroyDisplay();
  1290. return(status != 0 ? MagickFalse : MagickTrue);
  1291. }
  1292. if (LocaleCompare("log",option+1) == 0)
  1293. {
  1294. if (*option == '+')
  1295. break;
  1296. i++;
  1297. if ((i == (ssize_t) argc) ||
  1298. (strchr(argv[i],'%') == (char *) NULL))
  1299. ThrowDisplayException(OptionError,"MissingArgument",option);
  1300. break;
  1301. }
  1302. if (LocaleCompare("loop",option+1) == 0)
  1303. {
  1304. if (*option == '+')
  1305. break;
  1306. i++;
  1307. if (i == (ssize_t) (argc-1))
  1308. ThrowDisplayException(OptionError,"MissingArgument",option);
  1309. if (IsGeometry(argv[i]) == MagickFalse)
  1310. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1311. iterations=StringToUnsignedLong(argv[i]);
  1312. break;
  1313. }
  1314. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1315. }
  1316. case 'm':
  1317. {
  1318. if (LocaleCompare("magnify",option+1) == 0)
  1319. {
  1320. resource_info.magnify=2;
  1321. if (*option == '+')
  1322. break;
  1323. i++;
  1324. if (i == (ssize_t) argc)
  1325. ThrowDisplayException(OptionError,"MissingArgument",option);
  1326. if (IsGeometry(argv[i]) == MagickFalse)
  1327. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1328. resource_info.magnify=(unsigned int) StringToUnsignedLong(argv[i]);
  1329. break;
  1330. }
  1331. if (LocaleCompare("map",option+1) == 0)
  1332. {
  1333. resource_info.map_type=(char *) NULL;
  1334. if (*option == '+')
  1335. break;
  1336. (void) strcpy(argv[i]+1,"san");
  1337. i++;
  1338. if (i == (ssize_t) argc)
  1339. ThrowDisplayException(OptionError,"MissingArgument",option);
  1340. resource_info.map_type=argv[i];
  1341. break;
  1342. }
  1343. if (LocaleCompare("matte",option+1) == 0)
  1344. break;
  1345. if (LocaleCompare("mattecolor",option+1) == 0)
  1346. {
  1347. if (*option == '+')
  1348. break;
  1349. i++;
  1350. if (i == (ssize_t) argc)
  1351. ThrowDisplayException(OptionError,"MissingArgument",option);
  1352. resource_info.matte_color=argv[i];
  1353. break;
  1354. }
  1355. if (LocaleCompare("monitor",option+1) == 0)
  1356. break;
  1357. if (LocaleCompare("monochrome",option+1) == 0)
  1358. {
  1359. if (*option == '+')
  1360. break;
  1361. quantize_info->number_colors=2;
  1362. quantize_info->colorspace=GRAYColorspace;
  1363. break;
  1364. }
  1365. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1366. }
  1367. case 'n':
  1368. {
  1369. if (LocaleCompare("name",option+1) == 0)
  1370. {
  1371. resource_info.name=(char *) NULL;
  1372. if (*option == '+')
  1373. break;
  1374. i++;
  1375. if (i == (ssize_t) argc)
  1376. ThrowDisplayException(OptionError,"MissingArgument",option);
  1377. resource_info.name=ConstantString(argv[i]);
  1378. break;
  1379. }
  1380. if (LocaleCompare("negate",option+1) == 0)
  1381. break;
  1382. if (LocaleCompare("noop",option+1) == 0)
  1383. break;
  1384. if (LocaleCompare("normalize",option+1) == 0)
  1385. break;
  1386. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1387. }
  1388. case 'p':
  1389. {
  1390. if (LocaleCompare("page",option+1) == 0)
  1391. {
  1392. resource_info.image_geometry=(char *) NULL;
  1393. if (*option == '+')
  1394. break;
  1395. i++;
  1396. if (i == (ssize_t) argc)
  1397. ThrowDisplayException(OptionError,"MissingArgument",option);
  1398. resource_info.image_geometry=ConstantString(argv[i]);
  1399. break;
  1400. }
  1401. if (LocaleCompare("profile",option+1) == 0)
  1402. {
  1403. i++;
  1404. if (i == (ssize_t) argc)
  1405. ThrowDisplayException(OptionError,"MissingArgument",option);
  1406. break;
  1407. }
  1408. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1409. }
  1410. case 'q':
  1411. {
  1412. if (LocaleCompare("quality",option+1) == 0)
  1413. {
  1414. if (*option == '+')
  1415. break;
  1416. i++;
  1417. if (i == (ssize_t) argc)
  1418. ThrowDisplayException(OptionError,"MissingArgument",option);
  1419. if (IsGeometry(argv[i]) == MagickFalse)
  1420. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1421. break;
  1422. }
  1423. if (LocaleCompare("quantize",option+1) == 0)
  1424. {
  1425. ssize_t
  1426. colorspace;
  1427. if (*option == '+')
  1428. break;
  1429. i++;
  1430. if (i == (ssize_t) (argc-1))
  1431. ThrowDisplayException(OptionError,"MissingArgument",option);
  1432. colorspace=ParseMagickOption(MagickColorspaceOptions,
  1433. MagickFalse,argv[i]);
  1434. if (colorspace < 0)
  1435. ThrowDisplayException(OptionError,"UnrecognizedColorspace",
  1436. argv[i]);
  1437. break;
  1438. }
  1439. if (LocaleCompare("quiet",option+1) == 0)
  1440. break;
  1441. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1442. }
  1443. case 'r':
  1444. {
  1445. if (LocaleCompare("raise",option+1) == 0)
  1446. {
  1447. i++;
  1448. if (i == (ssize_t) argc)
  1449. ThrowDisplayException(OptionError,"MissingArgument",option);
  1450. if (IsGeometry(argv[i]) == MagickFalse)
  1451. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1452. break;
  1453. }
  1454. if (LocaleCompare("regard-warnings",option+1) == 0)
  1455. break;
  1456. if (LocaleCompare("remote",option+1) == 0)
  1457. {
  1458. i++;
  1459. if (i == (ssize_t) argc)
  1460. ThrowDisplayException(OptionError,"MissingArgument",option);
  1461. if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0)
  1462. return(MagickFalse);
  1463. i--;
  1464. break;
  1465. }
  1466. if (LocaleCompare("repage",option+1) == 0)
  1467. {
  1468. if (*option == '+')
  1469. break;
  1470. i++;
  1471. if (i == (ssize_t) argc)
  1472. ThrowDisplayException(OptionError,"MissingArgument",option);
  1473. if (IsGeometry(argv[i]) == MagickFalse)
  1474. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1475. break;
  1476. }
  1477. if (LocaleCompare("resample",option+1) == 0)
  1478. {
  1479. if (*option == '+')
  1480. break;
  1481. i++;
  1482. if (i == (ssize_t) (argc-1))
  1483. ThrowDisplayException(OptionError,"MissingArgument",option);
  1484. if (IsGeometry(argv[i]) == MagickFalse)
  1485. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1486. break;
  1487. }
  1488. if (LocaleCompare("resize",option+1) == 0)
  1489. {
  1490. if (*option == '+')
  1491. break;
  1492. i++;
  1493. if (i == (ssize_t) argc)
  1494. ThrowDisplayException(OptionError,"MissingArgument",option);
  1495. if (IsGeometry(argv[i]) == MagickFalse)
  1496. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1497. break;
  1498. }
  1499. if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
  1500. {
  1501. respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
  1502. break;
  1503. }
  1504. if (LocaleCompare("roll",option+1) == 0)
  1505. {
  1506. if (*option == '+')
  1507. break;
  1508. i++;
  1509. if (i == (ssize_t) argc)
  1510. ThrowDisplayException(OptionError,"MissingArgument",option);
  1511. if (IsGeometry(argv[i]) == MagickFalse)
  1512. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1513. break;
  1514. }
  1515. if (LocaleCompare("rotate",option+1) == 0)
  1516. {
  1517. i++;
  1518. if (i == (ssize_t) argc)
  1519. ThrowDisplayException(OptionError,"MissingArgument",option);
  1520. if (IsGeometry(argv[i]) == MagickFalse)
  1521. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1522. break;
  1523. }
  1524. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1525. }
  1526. case 's':
  1527. {
  1528. if (LocaleCompare("sample",option+1) == 0)
  1529. {
  1530. if (*option == '+')
  1531. break;
  1532. i++;
  1533. if (i == (ssize_t) argc)
  1534. ThrowDisplayException(OptionError,"MissingArgument",option);
  1535. if (IsGeometry(argv[i]) == MagickFalse)
  1536. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1537. break;
  1538. }
  1539. if (LocaleCompare("sampling-factor",option+1) == 0)
  1540. {
  1541. if (*option == '+')
  1542. break;
  1543. i++;
  1544. if (i == (ssize_t) argc)
  1545. ThrowDisplayException(OptionError,"MissingArgument",option);
  1546. if (IsGeometry(argv[i]) == MagickFalse)
  1547. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1548. break;
  1549. }
  1550. if (LocaleCompare("scenes",option+1) == 0)
  1551. {
  1552. if (*option == '+')
  1553. break;
  1554. i++;
  1555. if (i == (ssize_t) argc)
  1556. ThrowDisplayException(OptionError,"MissingArgument",option);
  1557. if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
  1558. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1559. break;
  1560. }
  1561. if (LocaleCompare("seed",option+1) == 0)
  1562. {
  1563. if (*option == '+')
  1564. break;
  1565. i++;
  1566. if (i == (ssize_t) (argc-1))
  1567. ThrowDisplayException(OptionError,"MissingArgument",option);
  1568. if (IsGeometry(argv[i]) == MagickFalse)
  1569. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1570. break;
  1571. }
  1572. if (LocaleCompare("segment",option+1) == 0)
  1573. {
  1574. if (*option == '+')
  1575. break;
  1576. i++;
  1577. if (i == (ssize_t) argc)
  1578. ThrowDisplayException(OptionError,"MissingArgument",option);
  1579. if (IsGeometry(argv[i]) == MagickFalse)
  1580. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1581. break;
  1582. }
  1583. if (LocaleCompare("set",option+1) == 0)
  1584. {
  1585. i++;
  1586. if (i == (ssize_t) argc)
  1587. ThrowDisplayException(OptionError,"MissingArgument",option);
  1588. if (*option == '+')
  1589. break;
  1590. i++;
  1591. if (i == (ssize_t) argc)
  1592. ThrowDisplayException(OptionError,"MissingArgument",option);
  1593. break;
  1594. }
  1595. if (LocaleCompare("sharpen",option+1) == 0)
  1596. {
  1597. if (*option == '+')
  1598. break;
  1599. i++;
  1600. if (i == (ssize_t) argc)
  1601. ThrowDisplayException(OptionError,"MissingArgument",option);
  1602. if (IsGeometry(argv[i]) == MagickFalse)
  1603. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1604. break;
  1605. }
  1606. if (LocaleCompare("shared-memory",option+1) == 0)
  1607. {
  1608. resource_info.use_shared_memory= (*option == '-') ? MagickTrue :
  1609. MagickFalse;
  1610. break;
  1611. }
  1612. if (LocaleCompare("size",option+1) == 0)
  1613. {
  1614. if (*option == '+')
  1615. break;
  1616. i++;
  1617. if (i == (ssize_t) argc)
  1618. ThrowDisplayException(OptionError,"MissingArgument",option);
  1619. if (IsGeometry(argv[i]) == MagickFalse)
  1620. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1621. break;
  1622. }
  1623. if (LocaleCompare("strip",option+1) == 0)
  1624. break;
  1625. if (LocaleCompare("support",option+1) == 0)
  1626. {
  1627. i++; /* deprecated */
  1628. break;
  1629. }
  1630. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1631. }
  1632. case 't':
  1633. {
  1634. if (LocaleCompare("text-font",option+1) == 0)
  1635. {
  1636. resource_info.text_font=(char *) NULL;
  1637. if (*option == '+')
  1638. break;
  1639. i++;
  1640. if (i == (ssize_t) argc)
  1641. ThrowDisplayException(OptionError,"MissingArgument",option);
  1642. resource_info.text_font=XGetResourceClass(resource_database,
  1643. GetClientName(),"font",argv[i]);
  1644. break;
  1645. }
  1646. if (LocaleCompare("texture",option+1) == 0)
  1647. {
  1648. if (*option == '+')
  1649. break;
  1650. i++;
  1651. if (i == (ssize_t) argc)
  1652. ThrowDisplayException(OptionError,"MissingArgument",option);
  1653. break;
  1654. }
  1655. if (LocaleCompare("threshold",option+1) == 0)
  1656. {
  1657. if (*option == '+')
  1658. break;
  1659. i++;
  1660. if (i == (ssize_t) argc)
  1661. ThrowDisplayException(OptionError,"MissingArgument",option);
  1662. if (IsGeometry(argv[i]) == MagickFalse)
  1663. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1664. break;
  1665. }
  1666. if (LocaleCompare("thumbnail",option+1) == 0)
  1667. {
  1668. if (*option == '+')
  1669. break;
  1670. i++;
  1671. if (i == (ssize_t) argc)
  1672. ThrowDisplayException(OptionError,"MissingArgument",option);
  1673. if (IsGeometry(argv[i]) == MagickFalse)
  1674. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1675. break;
  1676. }
  1677. if (LocaleCompare("title",option+1) == 0)
  1678. {
  1679. resource_info.title=(char *) NULL;
  1680. if (*option == '+')
  1681. break;
  1682. i++;
  1683. if (i == (ssize_t) argc)
  1684. ThrowDisplayException(OptionError,"MissingArgument",option);
  1685. resource_info.title=argv[i];
  1686. break;
  1687. }
  1688. if (LocaleCompare("transparent-color",option+1) == 0)
  1689. {
  1690. if (*option == '+')
  1691. break;
  1692. i++;
  1693. if (i == (ssize_t) (argc-1))
  1694. ThrowDisplayException(OptionError,"MissingArgument",option);
  1695. break;
  1696. }
  1697. if (LocaleCompare("treedepth",option+1) == 0)
  1698. {
  1699. quantize_info->tree_depth=0;
  1700. if (*option == '+')
  1701. break;
  1702. i++;
  1703. if (i == (ssize_t) argc)
  1704. ThrowDisplayException(OptionError,"MissingArgument",option);
  1705. if (IsGeometry(argv[i]) == MagickFalse)
  1706. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1707. quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
  1708. break;
  1709. }
  1710. if (LocaleCompare("trim",option+1) == 0)
  1711. break;
  1712. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1713. }
  1714. case 'u':
  1715. {
  1716. if (LocaleCompare("update",option+1) == 0)
  1717. {
  1718. resource_info.update=(unsigned int) (*option == '-');
  1719. if (*option == '+')
  1720. break;
  1721. i++;
  1722. if (i == (ssize_t) argc)
  1723. ThrowDisplayException(OptionError,"MissingArgument",option);
  1724. if (IsGeometry(argv[i]) == MagickFalse)
  1725. ThrowDisplayInvalidArgumentException(option,argv[i]);
  1726. resource_info.update=(unsigned int) StringToUnsignedLong(argv[i]);
  1727. break;
  1728. }
  1729. if (LocaleCompare("use-pixmap",option+1) == 0)
  1730. {
  1731. resource_info.use_pixmap=(*option == '-') ? MagickTrue :
  1732. MagickFalse;
  1733. break;
  1734. }
  1735. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1736. }
  1737. case 'v':
  1738. {
  1739. if (LocaleCompare("verbose",option+1) == 0)
  1740. break;
  1741. if ((LocaleCompare("version",option+1) == 0) ||
  1742. (LocaleCompare("-version",option+1) == 0))
  1743. {
  1744. (void) fprintf(stdout,"Version: %s\n",
  1745. GetMagickVersion((size_t *) NULL));
  1746. (void) fprintf(stdout,"Copyright: %s\n",GetMagickCopyright());
  1747. (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
  1748. break;
  1749. }
  1750. if (LocaleCompare("visual",option+1) == 0)
  1751. {
  1752. resource_info.visual_type=(char *) NULL;
  1753. if (*option == '+')
  1754. break;
  1755. i++;
  1756. if (i == (ssize_t) argc)
  1757. ThrowDisplayException(OptionError,"MissingArgument",option);
  1758. resource_info.visual_type=argv[i];
  1759. break;
  1760. }
  1761. if (LocaleCompare("virtual-pixel",option+1) == 0)
  1762. {
  1763. ssize_t
  1764. method;
  1765. if (*option == '+')
  1766. break;
  1767. i++;
  1768. if (i == (ssize_t) (argc-1))
  1769. ThrowDisplayException(OptionError,"MissingArgument",option);
  1770. method=ParseMagickOption(MagickVirtualPixelOptions,MagickFalse,
  1771. argv[i]);
  1772. if (method < 0)
  1773. ThrowDisplayException(OptionError,
  1774. "UnrecognizedVirtualPixelMethod",argv[i]);
  1775. break;
  1776. }
  1777. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1778. }
  1779. case 'w':
  1780. {
  1781. if (LocaleCompare("window",option+1) == 0)
  1782. {
  1783. resource_info.window_id=(char *) NULL;
  1784. if (*option == '+')
  1785. break;
  1786. i++;
  1787. if (i == (ssize_t) argc)
  1788. ThrowDisplayException(OptionError,"MissingArgument",option);
  1789. resource_info.window_id=argv[i];
  1790. break;
  1791. }
  1792. if (LocaleCompare("window-group",option+1) == 0)
  1793. {
  1794. resource_info.window_group=(char *) NULL;
  1795. if (*option == '+')
  1796. break;
  1797. i++;
  1798. if (i == (ssize_t) argc)
  1799. ThrowDisplayException(OptionError,"MissingArgument",option);
  1800. if (strtod(argv[i],(char **) NULL) != 0)
  1801. resource_info.window_group=argv[i];
  1802. break;
  1803. }
  1804. if (LocaleCompare("write",option+1) == 0)
  1805. {
  1806. resource_info.write_filename=(char *) NULL;
  1807. if (*option == '+')
  1808. break;
  1809. i++;
  1810. if (i == (ssize_t) argc)
  1811. ThrowDisplayException(OptionError,"MissingArgument",option);
  1812. resource_info.write_filename=argv[i];
  1813. if (IsPathAccessible(resource_info.write_filename) != MagickFalse)
  1814. {
  1815. char
  1816. answer[2],
  1817. *p;
  1818. (void) fprintf(stderr,"Overwrite %s? ",
  1819. resource_info.write_filename);
  1820. p=fgets(answer,(int) sizeof(answer),stdin);
  1821. (void) p;
  1822. if (((*answer != 'y') && (*answer != 'Y')))
  1823. return(MagickFalse);
  1824. }
  1825. break;
  1826. }
  1827. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1828. }
  1829. case '?':
  1830. break;
  1831. default:
  1832. ThrowDisplayException(OptionError,"UnrecognizedOption",option);
  1833. }
  1834. fire=ParseMagickOption(MagickImageListOptions,MagickFalse,option+1) < 0 ?
  1835. MagickFalse : MagickTrue;
  1836. if (fire != MagickFalse)
  1837. FireImageStack(MagickFalse,MagickTrue,MagickTrue);
  1838. }
  1839. if (k != 0)
  1840. ThrowDisplayException(OptionError,"UnbalancedParenthesis",argv[i]);
  1841. if (state & RetainColorsState)
  1842. {
  1843. XRetainWindowColors(display,XRootWindow(display,XDefaultScreen(display)));
  1844. (void) XSync(display,MagickFalse);
  1845. }
  1846. DestroyDisplay();
  1847. return(status != 0 ? MagickTrue : MagickFalse);
  1848. #else
  1849. (void) argc;
  1850. (void) argv;
  1851. (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
  1852. "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
  1853. return(DisplayUsage());
  1854. #endif
  1855. }