PageRenderTime 55ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://bitbucket.org/JasonGross/alphabets
C | 1745 lines | 1611 code | 43 blank | 91 comment | 764 complexity | e95f3804afc9c6a86a31adc476a691e3 MD5 | raw file
Possible License(s): BSD-3-Clause-No-Nuclear-License-2014, Apache-2.0, MPL-2.0-no-copyleft-exception

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % %
  4. % %
  5. % %
  6. % M M OOO N N TTTTT AAA GGGG EEEEE %
  7. % MM MM O O NN N T A A G E %
  8. % M M M O O N N N T AAAAA G GG EEE %
  9. % M M O O N NN T A A G G E %
  10. % M M OOO N N T A A GGG EEEEE %
  11. % %
  12. % %
  13. % MagickWand Methods to Create Image Thumbnails %
  14. % %
  15. % Software Design %
  16. % John Cristy %
  17. % July 1992 %
  18. % %
  19. % %
  20. % Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization %
  21. % dedicated to making software imaging solutions freely available. %
  22. % %
  23. % You may not use this file except in compliance with the License. You may %
  24. % obtain a copy of the License at %
  25. % %
  26. % http://www.imagemagick.org/script/license.php %
  27. % %
  28. % Unless required by applicable law or agreed to in writing, software %
  29. % distributed under the License is distributed on an "AS IS" BASIS, %
  30. % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
  31. % See the License for the specific language governing permissions and %
  32. % limitations under the License. %
  33. % %
  34. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  35. %
  36. % Use the montage program to create a composite image by combining several
  37. % separate images. The images are tiled on the composite image optionally
  38. % adorned with a border, frame, image name, and more.
  39. %
  40. */
  41. /*
  42. Include declarations.
  43. */
  44. #include "wand/studio.h"
  45. #include "wand/MagickWand.h"
  46. #include "wand/mogrify-private.h"
  47. #include "magick/string-private.h"
  48. /*
  49. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  50. % %
  51. % %
  52. % %
  53. + M o n t a g e I m a g e C o m m a n d %
  54. % %
  55. % %
  56. % %
  57. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  58. %
  59. % MontageImageCommand() reads one or more images, applies one or more image
  60. % processing operations, and writes out the image in the same or
  61. % differing format.
  62. %
  63. % The format of the MontageImageCommand method is:
  64. %
  65. % MagickBooleanType MontageImageCommand(ImageInfo *image_info,int argc,
  66. % char **argv,char **metadata,ExceptionInfo *exception)
  67. %
  68. % A description of each parameter follows:
  69. %
  70. % o image_info: the image info.
  71. %
  72. % o argc: the number of elements in the argument vector.
  73. %
  74. % o argv: A text array containing the command line arguments.
  75. %
  76. % o metadata: any metadata is returned here.
  77. %
  78. % o exception: return any errors or warnings in this structure.
  79. %
  80. */
  81. static MagickBooleanType MontageUsage(void)
  82. {
  83. const char
  84. **p;
  85. static const char
  86. *miscellaneous[]=
  87. {
  88. "-debug events display copious debugging information",
  89. "-help print program options",
  90. "-list type print a list of supported option arguments",
  91. "-log format format of debugging information",
  92. "-version print version information",
  93. (char *) NULL
  94. },
  95. *operators[]=
  96. {
  97. "-adaptive-sharpen geometry",
  98. " adaptively sharpen pixels; increase effect near edges",
  99. " annotate geometry text",
  100. " annotate the image with text",
  101. "-auto-orient automagically orient image",
  102. "-blur geometry reduce image noise and reduce detail levels",
  103. "-border geometry surround image with a border of color",
  104. "-crop geometry preferred size and location of the cropped image",
  105. "-extent geometry set the image size",
  106. "-flatten flatten a sequence of images",
  107. "-flip flip image in the vertical direction",
  108. "-flop flop image in the horizontal direction",
  109. "-frame geometry surround image with an ornamental border",
  110. "-monochrome transform image to black and white",
  111. "-polaroid angle simulate a Polaroid picture",
  112. "-repage geometry size and location of an image canvas (operator)",
  113. "-resize geometry resize the image",
  114. "-rotate degrees apply Paeth rotation to the image",
  115. "-strip strip image of all profiles and comments",
  116. "-transform affine transform image",
  117. "-transpose flip image vertically and rotate 90 degrees",
  118. "-transparent color make this color transparent within the image",
  119. "-type type image type",
  120. "-unsharp geometry sharpen the image",
  121. (char *) NULL
  122. },
  123. *settings[]=
  124. {
  125. "-adjoin join images into a single multi-image file",
  126. "-affine matrix affine transform matrix",
  127. "-alpha option on, activate, off, deactivate, set, opaque, copy",
  128. " transparent, extract, background, or shape",
  129. "-authenticate password",
  130. " decipher image with this password",
  131. "-blue-primary point chromaticity blue primary point",
  132. "-bordercolor color border color",
  133. "-caption string assign a caption to an image",
  134. "-channel type apply option to select image channels",
  135. "-colors value preferred number of colors in the image",
  136. "-colorspace type alternate image colorsapce",
  137. "-comment string annotate image with comment",
  138. "-compose operator composite operator",
  139. "-compress type type of pixel compression when writing the image",
  140. "-define format:option",
  141. " define one or more image format options",
  142. "-density geometry horizontal and vertical density of the image",
  143. "-depth value image depth",
  144. "-display server query font from this X server",
  145. "-dispose method layer disposal method",
  146. "-dither method apply error diffusion to image",
  147. "-draw string annotate the image with a graphic primitive",
  148. "-encoding type text encoding type",
  149. "-endian type endianness (MSB or LSB) of the image",
  150. "-extract geometry extract area from image",
  151. "-fill color color to use when filling a graphic primitive",
  152. "-filter type use this filter when resizing an image",
  153. "-font name render text with this font",
  154. "-format \"string\" output formatted image characteristics",
  155. "-gamma value level of gamma correction",
  156. "-geometry geometry preferred tile and border sizes",
  157. "-gravity direction which direction to gravitate towards",
  158. "-green-primary point chromaticity green primary point",
  159. "-identify identify the format and characteristics of the image",
  160. "-interlace type type of image interlacing scheme",
  161. "-interpolate method pixel color interpolation method",
  162. "-label string assign a label to an image",
  163. "-limit type value pixel cache resource limit",
  164. "-mattecolor color frame color",
  165. "-mode type framing style",
  166. "-monitor monitor progress",
  167. "-origin geometry image origin",
  168. "-page geometry size and location of an image canvas (setting)",
  169. "-pointsize value font point size",
  170. "-profile filename add, delete, or apply an image profile",
  171. "-quality value JPEG/MIFF/PNG compression level",
  172. "-quantize colorspace reduce colors in this colorspace",
  173. "-quiet suppress all warning messages",
  174. "-red-primary point chromaticity red primary point",
  175. "-regard-warnings pay attention to warning messages",
  176. "-respect-parentheses settings remain in effect until parenthesis boundary",
  177. "-sampling-factor geometry",
  178. " horizontal and vertical sampling factor",
  179. "-scenes range image scene range",
  180. "-seed value seed a new sequence of pseudo-random numbers",
  181. "-set attribute value set an image attribute",
  182. "-shadow add a shadow beneath a tile to simulate depth",
  183. "-size geometry width and height of image",
  184. "-stroke color color to use when stroking a graphic primitive",
  185. "-texture filename name of texture to tile onto the image background",
  186. "-thumbnail geometry create a thumbnail of the image",
  187. "-tile geometry number of tiles per row and column",
  188. "-title string decorate the montage image with a title",
  189. "-transparent-color color",
  190. " transparent color",
  191. "-treedepth value color tree depth",
  192. "-trim trim image edges",
  193. "-units type the units of image resolution",
  194. "-verbose print detailed information about the image",
  195. "-virtual-pixel method",
  196. " virtual pixel access method",
  197. "-white-point point chromaticity white point",
  198. (char *) NULL
  199. },
  200. *sequence_operators[]=
  201. {
  202. "-coalesce merge a sequence of images",
  203. "-composite composite image",
  204. (char *) NULL
  205. },
  206. *stack_operators[]=
  207. {
  208. "-clone index clone an image",
  209. (char *) NULL
  210. };
  211. (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
  212. (void) printf("Copyright: %s\n",GetMagickCopyright());
  213. (void) printf("Features: %s\n\n",GetMagickFeatures());
  214. (void) printf("Usage: %s [options ...] file [ [options ...] file ...] file\n",
  215. GetClientName());
  216. (void) printf("\nImage Settings:\n");
  217. for (p=settings; *p != (char *) NULL; p++)
  218. (void) printf(" %s\n",*p);
  219. (void) printf("\nImage Operators:\n");
  220. for (p=operators; *p != (char *) NULL; p++)
  221. (void) printf(" %s\n",*p);
  222. (void) printf("\nImage Sequence Operators:\n");
  223. for (p=sequence_operators; *p != (char *) NULL; p++)
  224. (void) printf(" %s\n",*p);
  225. (void) printf("\nImage Stack Operators:\n");
  226. for (p=stack_operators; *p != (char *) NULL; p++)
  227. (void) printf(" %s\n",*p);
  228. (void) printf("\nMiscellaneous Options:\n");
  229. for (p=miscellaneous; *p != (char *) NULL; p++)
  230. (void) printf(" %s\n",*p);
  231. (void) printf(
  232. "\nIn addition to those listed above, you can specify these standard X\n");
  233. (void) printf(
  234. "resources as command line options: -background, -bordercolor,\n");
  235. (void) printf(
  236. "-borderwidth, -font, -mattecolor, or -title\n");
  237. (void) printf(
  238. "\nBy default, the image format of `file' is determined by its magic\n");
  239. (void) printf(
  240. "number. To specify a particular image format, precede the filename\n");
  241. (void) printf(
  242. "with an image format name and a colon (i.e. ps:image) or specify the\n");
  243. (void) printf(
  244. "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
  245. (void) printf("'-' for standard input or output.\n");
  246. return(MagickFalse);
  247. }
  248. WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info,
  249. int argc,char **argv,char **metadata,ExceptionInfo *exception)
  250. {
  251. #define DestroyMontage() \
  252. { \
  253. if (montage_image != (Image *) NULL) \
  254. montage_image=DestroyImageList(montage_image); \
  255. DestroyImageStack(); \
  256. for (i=0; i < (ssize_t) argc; i++) \
  257. argv[i]=DestroyString(argv[i]); \
  258. argv=(char **) RelinquishMagickMemory(argv); \
  259. }
  260. #define ThrowMontageException(asperity,tag,option) \
  261. { \
  262. (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
  263. option); \
  264. DestroyMontage(); \
  265. return(MagickFalse); \
  266. }
  267. #define ThrowMontageInvalidArgumentException(option,argument) \
  268. { \
  269. (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
  270. "InvalidArgument","`%s': %s",option,argument); \
  271. DestroyMontage(); \
  272. return(MagickFalse); \
  273. }
  274. char
  275. *option,
  276. *transparent_color;
  277. const char
  278. *format;
  279. Image
  280. *image,
  281. *montage_image;
  282. ImageStack
  283. image_stack[MaxImageStackDepth+1];
  284. long
  285. first_scene,
  286. last_scene;
  287. ssize_t
  288. j,
  289. k,
  290. scene;
  291. MagickBooleanType
  292. fire,
  293. pend;
  294. MagickStatusType
  295. status;
  296. MontageInfo
  297. *montage_info;
  298. register ssize_t
  299. i;
  300. /*
  301. Set defaults.
  302. */
  303. assert(image_info != (ImageInfo *) NULL);
  304. assert(image_info->signature == MagickSignature);
  305. if (image_info->debug != MagickFalse)
  306. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
  307. assert(exception != (ExceptionInfo *) NULL);
  308. if (argc == 2)
  309. {
  310. option=argv[1];
  311. if ((LocaleCompare("version",option+1) == 0) ||
  312. (LocaleCompare("-version",option+1) == 0))
  313. {
  314. (void) fprintf(stdout,"Version: %s\n",
  315. GetMagickVersion((size_t *) NULL));
  316. (void) fprintf(stdout,"Copyright: %s\n",GetMagickCopyright());
  317. (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
  318. return(MagickFalse);
  319. }
  320. }
  321. if (argc < 3)
  322. return(MontageUsage());
  323. format="%w,%h,%m";
  324. first_scene=0;
  325. j=1;
  326. k=0;
  327. last_scene=0;
  328. montage_image=NewImageList();
  329. montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
  330. NewImageStack();
  331. option=(char *) NULL;
  332. pend=MagickFalse;
  333. scene=0;
  334. status=MagickFalse;
  335. transparent_color=(char *) NULL;
  336. /*
  337. Parse command line.
  338. */
  339. ReadCommandlLine(argc,&argv);
  340. status=ExpandFilenames(&argc,&argv);
  341. if (status == MagickFalse)
  342. ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
  343. GetExceptionMessage(errno));
  344. for (i=1; i < (ssize_t) (argc-1); i++)
  345. {
  346. option=argv[i];
  347. if (LocaleCompare(option,"(") == 0)
  348. {
  349. FireImageStack(MagickTrue,MagickTrue,pend);
  350. if (k == MaxImageStackDepth)
  351. ThrowMontageException(OptionError,"ParenthesisNestedTooDeeply",
  352. option);
  353. PushImageStack();
  354. continue;
  355. }
  356. if (LocaleCompare(option,")") == 0)
  357. {
  358. FireImageStack(MagickTrue,MagickTrue,MagickTrue);
  359. if (k == 0)
  360. ThrowMontageException(OptionError,"UnableToParseExpression",option);
  361. PopImageStack();
  362. continue;
  363. }
  364. if (IsMagickOption(option) == MagickFalse)
  365. {
  366. Image
  367. *images;
  368. FireImageStack(MagickFalse,MagickFalse,pend);
  369. for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++)
  370. {
  371. char
  372. *filename;
  373. /*
  374. Option is a file name: begin by reading image from specified file.
  375. */
  376. filename=argv[i];
  377. if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
  378. filename=argv[++i];
  379. (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
  380. if (first_scene != last_scene)
  381. {
  382. char
  383. filename[MaxTextExtent];
  384. /*
  385. Form filename for multi-part images.
  386. */
  387. (void) InterpretImageFilename(image_info,(Image *) NULL,
  388. image_info->filename,(int) scene,filename);
  389. if (LocaleCompare(filename,image_info->filename) == 0)
  390. (void) FormatMagickString(filename,MaxTextExtent,"%s.%.20g",
  391. image_info->filename,(double) scene);
  392. (void) CopyMagickString(image_info->filename,filename,
  393. MaxTextExtent);
  394. }
  395. (void) CloneString(&image_info->font,montage_info->font);
  396. images=ReadImages(image_info,exception);
  397. status&=(images != (Image *) NULL) &&
  398. (exception->severity < ErrorException);
  399. if (images == (Image *) NULL)
  400. continue;
  401. AppendImageStack(images);
  402. }
  403. continue;
  404. }
  405. pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
  406. switch (*(option+1))
  407. {
  408. case 'a':
  409. {
  410. if (LocaleCompare("adaptive-sharpen",option+1) == 0)
  411. {
  412. i++;
  413. if (i == (ssize_t) (argc-1))
  414. ThrowMontageException(OptionError,"MissingArgument",option);
  415. if (IsGeometry(argv[i]) == MagickFalse)
  416. ThrowMontageInvalidArgumentException(option,argv[i]);
  417. break;
  418. }
  419. if (LocaleCompare("adjoin",option+1) == 0)
  420. break;
  421. if (LocaleCompare("affine",option+1) == 0)
  422. {
  423. if (*option == '+')
  424. break;
  425. i++;
  426. if (i == (ssize_t) (argc-1))
  427. ThrowMontageException(OptionError,"MissingArgument",option);
  428. if (IsGeometry(argv[i]) == MagickFalse)
  429. ThrowMontageInvalidArgumentException(option,argv[i]);
  430. break;
  431. }
  432. if (LocaleCompare("alpha",option+1) == 0)
  433. {
  434. ssize_t
  435. type;
  436. if (*option == '+')
  437. break;
  438. i++;
  439. if (i == (ssize_t) argc)
  440. ThrowMontageException(OptionError,"MissingArgument",option);
  441. type=ParseMagickOption(MagickAlphaOptions,MagickFalse,argv[i]);
  442. if (type < 0)
  443. ThrowMontageException(OptionError,"UnrecognizedAlphaChannelType",
  444. argv[i]);
  445. break;
  446. }
  447. if (LocaleCompare("annotate",option+1) == 0)
  448. {
  449. if (*option == '+')
  450. break;
  451. i++;
  452. if (i == (ssize_t) (argc-1))
  453. ThrowMontageException(OptionError,"MissingArgument",option);
  454. if (IsGeometry(argv[i]) == MagickFalse)
  455. ThrowMontageInvalidArgumentException(option,argv[i]);
  456. if (i == (ssize_t) (argc-1))
  457. ThrowMontageException(OptionError,"MissingArgument",option);
  458. i++;
  459. break;
  460. }
  461. if (LocaleCompare("auto-orient",option+1) == 0)
  462. break;
  463. if (LocaleCompare("authenticate",option+1) == 0)
  464. {
  465. if (*option == '+')
  466. break;
  467. i++;
  468. if (i == (ssize_t) argc)
  469. ThrowMontageException(OptionError,"MissingArgument",option);
  470. break;
  471. }
  472. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  473. }
  474. case 'b':
  475. {
  476. if (LocaleCompare("background",option+1) == 0)
  477. {
  478. if (*option == '+')
  479. break;
  480. i++;
  481. if (i == (ssize_t) argc)
  482. ThrowMontageException(OptionError,"MissingArgument",option);
  483. (void) QueryColorDatabase(argv[i],
  484. &montage_info->background_color,exception);
  485. break;
  486. }
  487. if (LocaleCompare("blue-primary",option+1) == 0)
  488. {
  489. if (*option == '+')
  490. break;
  491. i++;
  492. if (i == (ssize_t) argc)
  493. ThrowMontageException(OptionError,"MissingArgument",option);
  494. if (IsGeometry(argv[i]) == MagickFalse)
  495. ThrowMontageInvalidArgumentException(option,argv[i]);
  496. break;
  497. }
  498. if (LocaleCompare("blur",option+1) == 0)
  499. {
  500. if (*option == '+')
  501. break;
  502. i++;
  503. if (i == (ssize_t) argc)
  504. ThrowMontageException(OptionError,"MissingArgument",option);
  505. if (IsGeometry(argv[i]) == MagickFalse)
  506. ThrowMontageInvalidArgumentException(option,argv[i]);
  507. break;
  508. }
  509. if (LocaleCompare("border",option+1) == 0)
  510. {
  511. if (k == 0)
  512. {
  513. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  514. montage_info->border_width=0;
  515. }
  516. if (*option == '+')
  517. break;
  518. i++;
  519. if (i == (ssize_t) argc)
  520. ThrowMontageException(OptionError,"MissingArgument",option);
  521. if (IsGeometry(argv[i]) == MagickFalse)
  522. ThrowMontageInvalidArgumentException(option,argv[i]);
  523. if (k == 0)
  524. montage_info->border_width=StringToUnsignedLong(argv[i]);
  525. break;
  526. }
  527. if (LocaleCompare("bordercolor",option+1) == 0)
  528. {
  529. if (*option == '+')
  530. break;
  531. i++;
  532. if (i == (ssize_t) argc)
  533. ThrowMontageException(OptionError,"MissingArgument",option);
  534. (void) QueryColorDatabase(argv[i],&montage_info->border_color,
  535. exception);
  536. break;
  537. }
  538. if (LocaleCompare("borderwidth",option+1) == 0)
  539. {
  540. montage_info->border_width=0;
  541. if (*option == '+')
  542. break;
  543. i++;
  544. if (i == (ssize_t) argc)
  545. ThrowMontageException(OptionError,"MissingArgument",option);
  546. if (IsGeometry(argv[i]) == MagickFalse)
  547. ThrowMontageInvalidArgumentException(option,argv[i]);
  548. montage_info->border_width=StringToUnsignedLong(argv[i]);
  549. break;
  550. }
  551. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  552. }
  553. case 'c':
  554. {
  555. if (LocaleCompare("cache",option+1) == 0)
  556. {
  557. if (*option == '+')
  558. break;
  559. i++;
  560. if (i == (ssize_t) argc)
  561. ThrowMontageException(OptionError,"MissingArgument",option);
  562. if (IsGeometry(argv[i]) == MagickFalse)
  563. ThrowMontageInvalidArgumentException(option,argv[i]);
  564. break;
  565. }
  566. if (LocaleCompare("caption",option+1) == 0)
  567. {
  568. if (*option == '+')
  569. break;
  570. i++;
  571. if (i == (ssize_t) argc)
  572. ThrowMontageException(OptionError,"MissingArgument",option);
  573. break;
  574. }
  575. if (LocaleCompare("channel",option+1) == 0)
  576. {
  577. ssize_t
  578. channel;
  579. if (*option == '+')
  580. break;
  581. i++;
  582. if (i == (ssize_t) (argc-1))
  583. ThrowMontageException(OptionError,"MissingArgument",option);
  584. channel=ParseChannelOption(argv[i]);
  585. if (channel < 0)
  586. ThrowMontageException(OptionError,"UnrecognizedChannelType",
  587. argv[i]);
  588. break;
  589. }
  590. if (LocaleCompare("clone",option+1) == 0)
  591. {
  592. Image
  593. *clone_images;
  594. clone_images=image;
  595. if (k != 0)
  596. clone_images=image_stack[k-1].image;
  597. if (clone_images == (Image *) NULL)
  598. ThrowMontageException(ImageError,"ImageSequenceRequired",option);
  599. FireImageStack(MagickTrue,MagickTrue,MagickTrue);
  600. if (*option == '+')
  601. clone_images=CloneImages(clone_images,"-1",exception);
  602. else
  603. {
  604. i++;
  605. if (i == (ssize_t) (argc-1))
  606. ThrowMontageException(OptionError,"MissingArgument",option);
  607. if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
  608. ThrowMontageInvalidArgumentException(option,argv[i]);
  609. clone_images=CloneImages(clone_images,argv[i],exception);
  610. }
  611. if (clone_images == (Image *) NULL)
  612. ThrowMontageException(OptionError,"NoSuchImage",option);
  613. AppendImageStack(clone_images);
  614. break;
  615. }
  616. if (LocaleCompare("coalesce",option+1) == 0)
  617. break;
  618. if (LocaleCompare("colors",option+1) == 0)
  619. {
  620. if (*option == '+')
  621. break;
  622. i++;
  623. if (i == (ssize_t) argc)
  624. ThrowMontageException(OptionError,"MissingArgument",option);
  625. if (IsGeometry(argv[i]) == MagickFalse)
  626. ThrowMontageInvalidArgumentException(option,argv[i]);
  627. break;
  628. }
  629. if (LocaleCompare("colorspace",option+1) == 0)
  630. {
  631. ssize_t
  632. colorspace;
  633. if (*option == '+')
  634. break;
  635. i++;
  636. if (i == (ssize_t) argc)
  637. ThrowMontageException(OptionError,"MissingArgument",option);
  638. colorspace=ParseMagickOption(MagickColorspaceOptions,
  639. MagickFalse,argv[i]);
  640. if (colorspace < 0)
  641. ThrowMontageException(OptionError,"UnrecognizedColorspace",
  642. argv[i]);
  643. break;
  644. }
  645. if (LocaleCompare("comment",option+1) == 0)
  646. {
  647. if (*option == '+')
  648. break;
  649. i++;
  650. if (i == (ssize_t) argc)
  651. ThrowMontageException(OptionError,"MissingArgument",option);
  652. break;
  653. }
  654. if (LocaleCompare("compose",option+1) == 0)
  655. {
  656. ssize_t
  657. compose;
  658. if (*option == '+')
  659. break;
  660. i++;
  661. if (i == (ssize_t) argc)
  662. ThrowMontageException(OptionError,"MissingArgument",option);
  663. compose=ParseMagickOption(MagickComposeOptions,MagickFalse,argv[i]);
  664. if (compose < 0)
  665. ThrowMontageException(OptionError,"UnrecognizedComposeOperator",
  666. argv[i]);
  667. break;
  668. }
  669. if (LocaleCompare("composite",option+1) == 0)
  670. break;
  671. if (LocaleCompare("compress",option+1) == 0)
  672. {
  673. ssize_t
  674. compress;
  675. if (*option == '+')
  676. break;
  677. i++;
  678. if (i == (ssize_t) argc)
  679. ThrowMontageException(OptionError,"MissingArgument",option);
  680. compress=ParseMagickOption(MagickCompressOptions,MagickFalse,
  681. argv[i]);
  682. if (compress < 0)
  683. ThrowMontageException(OptionError,"UnrecognizedCompressType",
  684. argv[i]);
  685. break;
  686. }
  687. if (LocaleCompare("concurrent",option+1) == 0)
  688. break;
  689. if (LocaleCompare("crop",option+1) == 0)
  690. {
  691. if (*option == '+')
  692. break;
  693. i++;
  694. if (i == (ssize_t) argc)
  695. ThrowMontageException(OptionError,"MissingArgument",option);
  696. if (IsGeometry(argv[i]) == MagickFalse)
  697. ThrowMontageInvalidArgumentException(option,argv[i]);
  698. break;
  699. }
  700. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  701. }
  702. case 'd':
  703. {
  704. if (LocaleCompare("debug",option+1) == 0)
  705. {
  706. ssize_t
  707. event;
  708. if (*option == '+')
  709. break;
  710. i++;
  711. if (i == (ssize_t) argc)
  712. ThrowMontageException(OptionError,"MissingArgument",option);
  713. event=ParseMagickOption(MagickLogEventOptions,MagickFalse,argv[i]);
  714. if (event < 0)
  715. ThrowMontageException(OptionError,"UnrecognizedEventType",
  716. argv[i]);
  717. (void) SetLogEventMask(argv[i]);
  718. break;
  719. }
  720. if (LocaleCompare("define",option+1) == 0)
  721. {
  722. i++;
  723. if (i == (ssize_t) argc)
  724. ThrowMontageException(OptionError,"MissingArgument",option);
  725. if (*option == '+')
  726. {
  727. const char
  728. *define;
  729. define=GetImageOption(image_info,argv[i]);
  730. if (define == (const char *) NULL)
  731. ThrowMontageException(OptionError,"NoSuchOption",argv[i]);
  732. break;
  733. }
  734. break;
  735. }
  736. if (LocaleCompare("density",option+1) == 0)
  737. {
  738. if (*option == '+')
  739. break;
  740. i++;
  741. if (i == (ssize_t) argc)
  742. ThrowMontageException(OptionError,"MissingArgument",option);
  743. if (IsGeometry(argv[i]) == MagickFalse)
  744. ThrowMontageInvalidArgumentException(option,argv[i]);
  745. break;
  746. }
  747. if (LocaleCompare("depth",option+1) == 0)
  748. {
  749. if (*option == '+')
  750. break;
  751. i++;
  752. if (i == (ssize_t) argc)
  753. ThrowMontageException(OptionError,"MissingArgument",option);
  754. if (IsGeometry(argv[i]) == MagickFalse)
  755. ThrowMontageInvalidArgumentException(option,argv[i]);
  756. break;
  757. }
  758. if (LocaleCompare("display",option+1) == 0)
  759. {
  760. if (*option == '+')
  761. break;
  762. i++;
  763. if (i == (ssize_t) argc)
  764. ThrowMontageException(OptionError,"MissingArgument",option);
  765. break;
  766. }
  767. if (LocaleCompare("dispose",option+1) == 0)
  768. {
  769. ssize_t
  770. dispose;
  771. if (*option == '+')
  772. break;
  773. i++;
  774. if (i == (ssize_t) argc)
  775. ThrowMontageException(OptionError,"MissingArgument",option);
  776. dispose=ParseMagickOption(MagickDisposeOptions,MagickFalse,argv[i]);
  777. if (dispose < 0)
  778. ThrowMontageException(OptionError,"UnrecognizedDisposeMethod",
  779. argv[i]);
  780. break;
  781. }
  782. if (LocaleCompare("dither",option+1) == 0)
  783. {
  784. ssize_t
  785. method;
  786. if (*option == '+')
  787. break;
  788. i++;
  789. if (i == (ssize_t) argc)
  790. ThrowMontageException(OptionError,"MissingArgument",option);
  791. method=ParseMagickOption(MagickDitherOptions,MagickFalse,argv[i]);
  792. if (method < 0)
  793. ThrowMontageException(OptionError,"UnrecognizedDitherMethod",
  794. argv[i]);
  795. break;
  796. }
  797. if (LocaleCompare("draw",option+1) == 0)
  798. {
  799. if (*option == '+')
  800. break;
  801. i++;
  802. if (i == (ssize_t) argc)
  803. ThrowMontageException(OptionError,"MissingArgument",option);
  804. break;
  805. }
  806. if (LocaleCompare("duration",option+1) == 0)
  807. {
  808. if (*option == '+')
  809. break;
  810. i++;
  811. if (i == (ssize_t) (argc-1))
  812. ThrowMontageException(OptionError,"MissingArgument",option);
  813. if (IsGeometry(argv[i]) == MagickFalse)
  814. ThrowMontageInvalidArgumentException(option,argv[i]);
  815. break;
  816. }
  817. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  818. }
  819. case 'e':
  820. {
  821. if (LocaleCompare("encoding",option+1) == 0)
  822. {
  823. if (*option == '+')
  824. break;
  825. i++;
  826. if (i == (ssize_t) argc)
  827. ThrowMontageException(OptionError,"MissingArgument",option);
  828. break;
  829. }
  830. if (LocaleCompare("endian",option+1) == 0)
  831. {
  832. ssize_t
  833. endian;
  834. if (*option == '+')
  835. break;
  836. i++;
  837. if (i == (ssize_t) argc)
  838. ThrowMontageException(OptionError,"MissingArgument",option);
  839. endian=ParseMagickOption(MagickEndianOptions,MagickFalse,
  840. argv[i]);
  841. if (endian < 0)
  842. ThrowMontageException(OptionError,"UnrecognizedEndianType",
  843. argv[i]);
  844. break;
  845. }
  846. if (LocaleCompare("extent",option+1) == 0)
  847. {
  848. if (*option == '+')
  849. break;
  850. i++;
  851. if (i == (ssize_t) (argc-1))
  852. ThrowMontageException(OptionError,"MissingArgument",option);
  853. if (IsGeometry(argv[i]) == MagickFalse)
  854. ThrowMontageInvalidArgumentException(option,argv[i]);
  855. break;
  856. }
  857. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  858. }
  859. case 'f':
  860. {
  861. if (LocaleCompare("fill",option+1) == 0)
  862. {
  863. (void) QueryColorDatabase("none",&montage_info->fill,exception);
  864. if (*option == '+')
  865. break;
  866. i++;
  867. if (i == (ssize_t) argc)
  868. ThrowMontageException(OptionError,"MissingArgument",option);
  869. (void) QueryColorDatabase(argv[i],&montage_info->fill,
  870. exception);
  871. break;
  872. }
  873. if (LocaleCompare("filter",option+1) == 0)
  874. {
  875. ssize_t
  876. filter;
  877. if (*option == '+')
  878. break;
  879. i++;
  880. if (i == (ssize_t) argc)
  881. ThrowMontageException(OptionError,"MissingArgument",option);
  882. filter=ParseMagickOption(MagickFilterOptions,MagickFalse,argv[i]);
  883. if (filter < 0)
  884. ThrowMontageException(OptionError,"UnrecognizedImageFilter",
  885. argv[i]);
  886. break;
  887. }
  888. if (LocaleCompare("flatten",option+1) == 0)
  889. break;
  890. if (LocaleCompare("flip",option+1) == 0)
  891. break;
  892. if (LocaleCompare("flop",option+1) == 0)
  893. break;
  894. if (LocaleCompare("font",option+1) == 0)
  895. {
  896. if (*option == '+')
  897. break;
  898. i++;
  899. if (i == (ssize_t) argc)
  900. ThrowMontageException(OptionError,"MissingArgument",option);
  901. (void) CloneString(&montage_info->font,argv[i]);
  902. break;
  903. }
  904. if (LocaleCompare("format",option+1) == 0)
  905. {
  906. if (*option == '+')
  907. break;
  908. i++;
  909. if (i == (ssize_t) argc)
  910. ThrowMontageException(OptionError,"MissingArgument",option);
  911. format=argv[i];
  912. break;
  913. }
  914. if (LocaleCompare("frame",option+1) == 0)
  915. {
  916. if (k == 0)
  917. {
  918. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  919. (void) CloneString(&montage_info->frame,(char *) NULL);
  920. }
  921. if (*option == '+')
  922. break;
  923. i++;
  924. if (i == (ssize_t) argc)
  925. ThrowMontageException(OptionError,"MissingArgument",option);
  926. if (IsGeometry(argv[i]) == MagickFalse)
  927. ThrowMontageInvalidArgumentException(option,argv[i]);
  928. if (k == 0)
  929. (void) CloneString(&montage_info->frame,argv[i]);
  930. break;
  931. }
  932. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  933. }
  934. case 'g':
  935. {
  936. if (LocaleCompare("gamma",option+1) == 0)
  937. {
  938. i++;
  939. if (i == (ssize_t) argc)
  940. ThrowMontageException(OptionError,"MissingArgument",option);
  941. if (IsGeometry(argv[i]) == MagickFalse)
  942. ThrowMontageInvalidArgumentException(option,argv[i]);
  943. break;
  944. }
  945. if (LocaleCompare("geometry",option+1) == 0)
  946. {
  947. (void) CloneString(&montage_info->geometry,(char *) NULL);
  948. if (*option == '+')
  949. break;
  950. i++;
  951. if (i == (ssize_t) argc)
  952. ThrowMontageException(OptionError,"MissingArgument",option);
  953. if (IsGeometry(argv[i]) == MagickFalse)
  954. ThrowMontageInvalidArgumentException(option,argv[i]);
  955. (void) CloneString(&montage_info->geometry,argv[i]);
  956. break;
  957. }
  958. if (LocaleCompare("gravity",option+1) == 0)
  959. {
  960. ssize_t
  961. gravity;
  962. montage_info->gravity=UndefinedGravity;
  963. if (*option == '+')
  964. break;
  965. i++;
  966. if (i == (ssize_t) argc)
  967. ThrowMontageException(OptionError,"MissingArgument",option);
  968. gravity=ParseMagickOption(MagickGravityOptions,MagickFalse,
  969. argv[i]);
  970. if (gravity < 0)
  971. ThrowMontageException(OptionError,"UnrecognizedGravityType",
  972. argv[i]);
  973. montage_info->gravity=(GravityType) gravity;
  974. break;
  975. }
  976. if (LocaleCompare("green-primary",option+1) == 0)
  977. {
  978. if (*option == '+')
  979. break;
  980. i++;
  981. if (i == (ssize_t) argc)
  982. ThrowMontageException(OptionError,"MissingArgument",option);
  983. if (IsGeometry(argv[i]) == MagickFalse)
  984. ThrowMontageInvalidArgumentException(option,argv[i]);
  985. break;
  986. }
  987. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  988. }
  989. case 'h':
  990. {
  991. if ((LocaleCompare("help",option+1) == 0) ||
  992. (LocaleCompare("-help",option+1) == 0))
  993. return(MontageUsage());
  994. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  995. }
  996. case 'i':
  997. {
  998. if (LocaleCompare("identify",option+1) == 0)
  999. break;
  1000. if (LocaleCompare("interlace",option+1) == 0)
  1001. {
  1002. ssize_t
  1003. interlace;
  1004. if (*option == '+')
  1005. break;
  1006. i++;
  1007. if (i == (ssize_t) argc)
  1008. ThrowMontageException(OptionError,"MissingArgument",option);
  1009. interlace=ParseMagickOption(MagickInterlaceOptions,MagickFalse,
  1010. argv[i]);
  1011. if (interlace < 0)
  1012. ThrowMontageException(OptionError,"UnrecognizedInterlaceType",
  1013. argv[i]);
  1014. break;
  1015. }
  1016. if (LocaleCompare("interpolate",option+1) == 0)
  1017. {
  1018. ssize_t
  1019. interpolate;
  1020. if (*option == '+')
  1021. break;
  1022. i++;
  1023. if (i == (ssize_t) argc)
  1024. ThrowMontageException(OptionError,"MissingArgument",option);
  1025. interpolate=ParseMagickOption(MagickInterpolateOptions,MagickFalse,
  1026. argv[i]);
  1027. if (interpolate < 0)
  1028. ThrowMontageException(OptionError,"UnrecognizedInterpolateMethod",
  1029. argv[i]);
  1030. break;
  1031. }
  1032. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1033. }
  1034. case 'l':
  1035. {
  1036. if (LocaleCompare("label",option+1) == 0)
  1037. {
  1038. if (*option == '+')
  1039. break;
  1040. i++;
  1041. if (i == (ssize_t) argc)
  1042. ThrowMontageException(OptionError,"MissingArgument",option);
  1043. break;
  1044. }
  1045. if (LocaleCompare("limit",option+1) == 0)
  1046. {
  1047. char
  1048. *p;
  1049. double
  1050. value;
  1051. ssize_t
  1052. resource;
  1053. if (*option == '+')
  1054. break;
  1055. i++;
  1056. if (i == (ssize_t) argc)
  1057. ThrowMontageException(OptionError,"MissingArgument",option);
  1058. resource=ParseMagickOption(MagickResourceOptions,MagickFalse,
  1059. argv[i]);
  1060. if (resource < 0)
  1061. ThrowMontageException(OptionError,"UnrecognizedResourceType",
  1062. argv[i]);
  1063. i++;
  1064. if (i == (ssize_t) argc)
  1065. ThrowMontageException(OptionError,"MissingArgument",option);
  1066. value=strtod(argv[i],&p);
  1067. if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
  1068. ThrowMontageInvalidArgumentException(option,argv[i]);
  1069. break;
  1070. }
  1071. if (LocaleCompare("list",option+1) == 0)
  1072. {
  1073. ssize_t
  1074. list;
  1075. if (*option == '+')
  1076. break;
  1077. i++;
  1078. if (i == (ssize_t) argc)
  1079. ThrowMontageException(OptionError,"MissingArgument",option);
  1080. list=ParseMagickOption(MagickListOptions,MagickFalse,argv[i]);
  1081. if (list < 0)
  1082. ThrowMontageException(OptionError,"UnrecognizedListType",argv[i]);
  1083. status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
  1084. argv+j,exception);
  1085. DestroyMontage();
  1086. return(status != 0 ? MagickFalse : MagickTrue);
  1087. }
  1088. if (LocaleCompare("log",option+1) == 0)
  1089. {
  1090. if (*option == '+')
  1091. break;
  1092. i++;
  1093. if ((i == (ssize_t) argc) ||
  1094. (strchr(argv[i],'%') == (char *) NULL))
  1095. ThrowMontageException(OptionError,"MissingArgument",option);
  1096. break;
  1097. }
  1098. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1099. }
  1100. case 'm':
  1101. {
  1102. if (LocaleCompare("matte",option+1) == 0)
  1103. break;
  1104. if (LocaleCompare("mattecolor",option+1) == 0)
  1105. {
  1106. if (*option == '+')
  1107. break;
  1108. i++;
  1109. if (i == (ssize_t) argc)
  1110. ThrowMontageException(OptionError,"MissingArgument",option);
  1111. (void) QueryColorDatabase(argv[i],&montage_info->matte_color,
  1112. exception);
  1113. break;
  1114. }
  1115. if (LocaleCompare("mode",option+1) == 0)
  1116. {
  1117. MontageMode
  1118. mode;
  1119. if (*option == '+')
  1120. break;
  1121. i++;
  1122. if (i == (ssize_t) argc)
  1123. ThrowMontageException(OptionError,"MissingArgument",option);
  1124. mode=UndefinedMode;
  1125. if (LocaleCompare("frame",argv[i]) == 0)
  1126. {
  1127. mode=FrameMode;
  1128. (void) CloneString(&montage_info->frame,"15x15+3+3");
  1129. montage_info->shadow=MagickTrue;
  1130. break;
  1131. }
  1132. if (LocaleCompare("unframe",argv[i]) == 0)
  1133. {
  1134. mode=UnframeMode;
  1135. montage_info->frame=(char *) NULL;
  1136. montage_info->shadow=MagickFalse;
  1137. montage_info->border_width=0;
  1138. break;
  1139. }
  1140. if (LocaleCompare("concatenate",argv[i]) == 0)
  1141. {
  1142. mode=ConcatenateMode;
  1143. montage_info->frame=(char *) NULL;
  1144. montage_info->shadow=MagickFalse;
  1145. montage_info->gravity=(GravityType) NorthWestGravity;
  1146. (void) CloneString(&montage_info->geometry,"+0+0");
  1147. montage_info->border_width=0;
  1148. break;
  1149. }
  1150. if (mode == UndefinedMode)
  1151. ThrowMontageException(OptionError,"UnrecognizedImageMode",
  1152. argv[i]);
  1153. break;
  1154. }
  1155. if (LocaleCompare("monitor",option+1) == 0)
  1156. break;
  1157. if (LocaleCompare("monochrome",option+1) == 0)
  1158. {
  1159. if (*option == '+')
  1160. break;
  1161. break;
  1162. }
  1163. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1164. }
  1165. case 'n':
  1166. {
  1167. if (LocaleCompare("noop",option+1) == 0)
  1168. break;
  1169. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1170. }
  1171. case 'o':
  1172. {
  1173. if (LocaleCompare("origin",option+1) == 0)
  1174. {
  1175. if (*option == '+')
  1176. break;
  1177. i++;
  1178. if (i == (ssize_t) argc)
  1179. ThrowMontageException(OptionError,"MissingArgument",option);
  1180. if (IsGeometry(argv[i]) == MagickFalse)
  1181. ThrowMontageInvalidArgumentException(option,argv[i]);
  1182. break;
  1183. }
  1184. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1185. }
  1186. case 'p':
  1187. {
  1188. if (LocaleCompare("page",option+1) == 0)
  1189. {
  1190. if (*option == '+')
  1191. break;
  1192. i++;
  1193. if (i == (ssize_t) argc)
  1194. ThrowMontageException(OptionError,"MissingArgument",option);
  1195. break;
  1196. }
  1197. if (LocaleCompare("pointsize",option+1) == 0)
  1198. {
  1199. montage_info->pointsize=12;
  1200. if (*option == '+')
  1201. break;
  1202. i++;
  1203. if (i == (ssize_t) argc)
  1204. ThrowMontageException(OptionError,"MissingArgument",option);
  1205. if (IsGeometry(argv[i]) == MagickFalse)
  1206. ThrowMontageInvalidArgumentException(option,argv[i]);
  1207. montage_info->pointsize=StringToDouble(argv[i]);
  1208. break;
  1209. }
  1210. if (LocaleCompare("polaroid",option+1) == 0)
  1211. {
  1212. if (*option == '+')
  1213. break;
  1214. i++;
  1215. if (i == (ssize_t) (argc-1))
  1216. ThrowMontageException(OptionError,"MissingArgument",option);
  1217. if (IsGeometry(argv[i]) == MagickFalse)
  1218. ThrowMontageInvalidArgumentException(option,argv[i]);
  1219. break;
  1220. }
  1221. if (LocaleCompare("profile",option+1) == 0)
  1222. {
  1223. i++;
  1224. if (i == (ssize_t) (argc-1))
  1225. ThrowMontageException(OptionError,"MissingArgument",option);
  1226. break;
  1227. }
  1228. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1229. }
  1230. case 'q':
  1231. {
  1232. if (LocaleCompare("quality",option+1) == 0)
  1233. {
  1234. if (*option == '+')
  1235. break;
  1236. i++;
  1237. if (i == (ssize_t) argc)
  1238. ThrowMontageException(OptionError,"MissingArgument",option);
  1239. if (IsGeometry(argv[i]) == MagickFalse)
  1240. ThrowMontageInvalidArgumentException(option,argv[i]);
  1241. break;
  1242. }
  1243. if (LocaleCompare("quantize",option+1) == 0)
  1244. {
  1245. ssize_t
  1246. colorspace;
  1247. if (*option == '+')
  1248. break;
  1249. i++;
  1250. if (i == (ssize_t) (argc-1))
  1251. ThrowMontageException(OptionError,"MissingArgument",option);
  1252. colorspace=ParseMagickOption(MagickColorspaceOptions,
  1253. MagickFalse,argv[i]);
  1254. if (colorspace < 0)
  1255. ThrowMontageException(OptionError,"UnrecognizedColorspace",
  1256. argv[i]);
  1257. break;
  1258. }
  1259. if (LocaleCompare("quiet",option+1) == 0)
  1260. break;
  1261. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1262. }
  1263. case 'r':
  1264. {
  1265. if (LocaleCompare("red-primary",option+1) == 0)
  1266. {
  1267. if (*option == '+')
  1268. break;
  1269. i++;
  1270. if (i == (ssize_t) argc)
  1271. ThrowMontageException(OptionError,"MissingArgument",option);
  1272. if (IsGeometry(argv[i]) == MagickFalse)
  1273. ThrowMontageInvalidArgumentException(option,argv[i]);
  1274. break;
  1275. }
  1276. if (LocaleCompare("regard-warnings",option+1) == 0)
  1277. break;
  1278. if (LocaleCompare("render",option+1) == 0)
  1279. break;
  1280. if (LocaleCompare("repage",option+1) == 0)
  1281. {
  1282. if (*option == '+')
  1283. break;
  1284. i++;
  1285. if (i == (ssize_t) argc)
  1286. ThrowMontageException(OptionError,"MissingArgument",option);
  1287. if (IsGeometry(argv[i]) == MagickFalse)
  1288. ThrowMontageInvalidArgumentException(option,argv[i]);
  1289. break;
  1290. }
  1291. if (LocaleCompare("resize",option+1) == 0)
  1292. {
  1293. if (*option == '+')
  1294. break;
  1295. i++;
  1296. if (i == (ssize_t) argc)
  1297. ThrowMontageException(OptionError,"MissingArgument",option);
  1298. if (IsGeometry(argv[i]) == MagickFalse)
  1299. ThrowMontageInvalidArgumentException(option,argv[i]);
  1300. break;
  1301. }
  1302. if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
  1303. {
  1304. respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
  1305. break;
  1306. }
  1307. if (LocaleCompare("rotate",option+1) == 0)
  1308. {
  1309. i++;
  1310. if (i == (ssize_t) argc)
  1311. ThrowMontageException(OptionError,"MissingArgument",option);
  1312. if (IsGeometry(argv[i]) == MagickFalse)
  1313. ThrowMontageInvalidArgumentException(option,argv[i]);
  1314. break;
  1315. }
  1316. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1317. }
  1318. case 's':
  1319. {
  1320. if (LocaleCompare("sampling-factor",option+1) == 0)
  1321. {
  1322. if (*option == '+')
  1323. break;
  1324. i++;
  1325. if (i == (ssize_t) argc)
  1326. ThrowMontageException(OptionError,"MissingArgument",option);
  1327. if (IsGeometry(argv[i]) == MagickFalse)
  1328. ThrowMontageInvalidArgumentException(option,argv[i]);
  1329. break;
  1330. }
  1331. if (LocaleCompare("seed",option+1) == 0)
  1332. {

Large files files are truncated, but you can click here to view the full file