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

/ImageMagick-6.7.7-5/wand/montage.c

#
C | 1828 lines | 1694 code | 43 blank | 91 comment | 811 complexity | e52761936148fd75637cde43effcd8d2 MD5 | raw file
Possible License(s): 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-2012 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. "-kerning value set the space between two letters",
  163. "-label string assign a label to an image",
  164. "-limit type value pixel cache resource limit",
  165. "-mattecolor color frame color",
  166. "-mode type framing style",
  167. "-monitor monitor progress",
  168. "-origin geometry image origin",
  169. "-page geometry size and location of an image canvas (setting)",
  170. "-pointsize value font point size",
  171. "-profile filename add, delete, or apply an image profile",
  172. "-quality value JPEG/MIFF/PNG compression level",
  173. "-quantize colorspace reduce colors in this colorspace",
  174. "-quiet suppress all warning messages",
  175. "-red-primary point chromaticity red primary point",
  176. "-regard-warnings pay attention to warning messages",
  177. "-respect-parentheses settings remain in effect until parenthesis boundary",
  178. "-sampling-factor geometry",
  179. " horizontal and vertical sampling factor",
  180. "-scenes range image scene range",
  181. "-seed value seed a new sequence of pseudo-random numbers",
  182. "-set attribute value set an image attribute",
  183. "-shadow add a shadow beneath a tile to simulate depth",
  184. "-size geometry width and height of image",
  185. "-stroke color color to use when stroking a graphic primitive",
  186. "-synchronize synchronize image to storage device",
  187. "-taint declare the image as modified",
  188. "-texture filename name of texture to tile onto the image background",
  189. "-thumbnail geometry create a thumbnail of the image",
  190. "-tile geometry number of tiles per row and column",
  191. "-title string decorate the montage image with a title",
  192. "-transparent-color color",
  193. " transparent color",
  194. "-treedepth value color tree depth",
  195. "-trim trim image edges",
  196. "-units type the units of image resolution",
  197. "-verbose print detailed information about the image",
  198. "-virtual-pixel method",
  199. " virtual pixel access method",
  200. "-white-point point chromaticity white point",
  201. (char *) NULL
  202. },
  203. *sequence_operators[]=
  204. {
  205. "-coalesce merge a sequence of images",
  206. "-composite composite image",
  207. (char *) NULL
  208. },
  209. *stack_operators[]=
  210. {
  211. "-clone indexes clone an image",
  212. "-delete indexes delete the image from the image sequence",
  213. "-duplicate count,indexes",
  214. " duplicate an image one or more times",
  215. "-insert index insert last image into the image sequence",
  216. "-reverse reverse image sequence",
  217. "-swap indexes swap two images in the image sequence",
  218. (char *) NULL
  219. };
  220. (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
  221. (void) printf("Copyright: %s\n",GetMagickCopyright());
  222. (void) printf("Features: %s\n\n",GetMagickFeatures());
  223. (void) printf("Usage: %s [options ...] file [ [options ...] file ...] file\n",
  224. GetClientName());
  225. (void) printf("\nImage Settings:\n");
  226. for (p=settings; *p != (char *) NULL; p++)
  227. (void) printf(" %s\n",*p);
  228. (void) printf("\nImage Operators:\n");
  229. for (p=operators; *p != (char *) NULL; p++)
  230. (void) printf(" %s\n",*p);
  231. (void) printf("\nImage Sequence Operators:\n");
  232. for (p=sequence_operators; *p != (char *) NULL; p++)
  233. (void) printf(" %s\n",*p);
  234. (void) printf("\nImage Stack Operators:\n");
  235. for (p=stack_operators; *p != (char *) NULL; p++)
  236. (void) printf(" %s\n",*p);
  237. (void) printf("\nMiscellaneous Options:\n");
  238. for (p=miscellaneous; *p != (char *) NULL; p++)
  239. (void) printf(" %s\n",*p);
  240. (void) printf(
  241. "\nIn addition to those listed above, you can specify these standard X\n");
  242. (void) printf(
  243. "resources as command line options: -background, -bordercolor,\n");
  244. (void) printf(
  245. "-borderwidth, -font, -mattecolor, or -title\n");
  246. (void) printf(
  247. "\nBy default, the image format of `file' is determined by its magic\n");
  248. (void) printf(
  249. "number. To specify a particular image format, precede the filename\n");
  250. (void) printf(
  251. "with an image format name and a colon (i.e. ps:image) or specify the\n");
  252. (void) printf(
  253. "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
  254. (void) printf("'-' for standard input or output.\n");
  255. return(MagickFalse);
  256. }
  257. WandExport MagickBooleanType MontageImageCommand(ImageInfo *image_info,
  258. int argc,char **argv,char **metadata,ExceptionInfo *exception)
  259. {
  260. #define DestroyMontage() \
  261. { \
  262. if (montage_image != (Image *) NULL) \
  263. montage_image=DestroyImageList(montage_image); \
  264. DestroyImageStack(); \
  265. for (i=0; i < (ssize_t) argc; i++) \
  266. argv[i]=DestroyString(argv[i]); \
  267. argv=(char **) RelinquishMagickMemory(argv); \
  268. }
  269. #define ThrowMontageException(asperity,tag,option) \
  270. { \
  271. (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
  272. option); \
  273. DestroyMontage(); \
  274. return(MagickFalse); \
  275. }
  276. #define ThrowMontageInvalidArgumentException(option,argument) \
  277. { \
  278. (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
  279. "InvalidArgument","`%s': %s",option,argument); \
  280. DestroyMontage(); \
  281. return(MagickFalse); \
  282. }
  283. char
  284. *option,
  285. *transparent_color;
  286. const char
  287. *format;
  288. Image
  289. *image,
  290. *montage_image;
  291. ImageStack
  292. image_stack[MaxImageStackDepth+1];
  293. long
  294. first_scene,
  295. last_scene;
  296. MagickBooleanType
  297. fire,
  298. pend,
  299. respect_parenthesis;
  300. MagickStatusType
  301. status;
  302. MontageInfo
  303. *montage_info;
  304. register ssize_t
  305. i;
  306. ssize_t
  307. j,
  308. k,
  309. scene;
  310. /*
  311. Set defaults.
  312. */
  313. assert(image_info != (ImageInfo *) NULL);
  314. assert(image_info->signature == MagickSignature);
  315. if (image_info->debug != MagickFalse)
  316. (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
  317. assert(exception != (ExceptionInfo *) NULL);
  318. if (argc == 2)
  319. {
  320. option=argv[1];
  321. if ((LocaleCompare("version",option+1) == 0) ||
  322. (LocaleCompare("-version",option+1) == 0))
  323. {
  324. (void) FormatLocaleFile(stdout,"Version: %s\n",
  325. GetMagickVersion((size_t *) NULL));
  326. (void) FormatLocaleFile(stdout,"Copyright: %s\n",
  327. GetMagickCopyright());
  328. (void) FormatLocaleFile(stdout,"Features: %s\n\n",
  329. GetMagickFeatures());
  330. return(MagickFalse);
  331. }
  332. }
  333. if (argc < 3)
  334. return(MontageUsage());
  335. format="%w,%h,%m";
  336. first_scene=0;
  337. j=1;
  338. k=0;
  339. last_scene=0;
  340. montage_image=NewImageList();
  341. montage_info=CloneMontageInfo(image_info,(MontageInfo *) NULL);
  342. NewImageStack();
  343. option=(char *) NULL;
  344. pend=MagickFalse;
  345. respect_parenthesis=MagickFalse;
  346. scene=0;
  347. status=MagickFalse;
  348. transparent_color=(char *) NULL;
  349. /*
  350. Parse command line.
  351. */
  352. ReadCommandlLine(argc,&argv);
  353. status=ExpandFilenames(&argc,&argv);
  354. if (status == MagickFalse)
  355. ThrowMontageException(ResourceLimitError,"MemoryAllocationFailed",
  356. GetExceptionMessage(errno));
  357. for (i=1; i < (ssize_t) (argc-1); i++)
  358. {
  359. option=argv[i];
  360. if (LocaleCompare(option,"(") == 0)
  361. {
  362. FireImageStack(MagickTrue,MagickTrue,pend);
  363. if (k == MaxImageStackDepth)
  364. ThrowMontageException(OptionError,"ParenthesisNestedTooDeeply",
  365. option);
  366. PushImageStack();
  367. continue;
  368. }
  369. if (LocaleCompare(option,")") == 0)
  370. {
  371. FireImageStack(MagickTrue,MagickTrue,MagickTrue);
  372. if (k == 0)
  373. ThrowMontageException(OptionError,"UnableToParseExpression",option);
  374. PopImageStack();
  375. continue;
  376. }
  377. if (IsCommandOption(option) == MagickFalse)
  378. {
  379. Image
  380. *images;
  381. FireImageStack(MagickFalse,MagickFalse,pend);
  382. for (scene=(ssize_t) first_scene; scene <= (ssize_t) last_scene ; scene++)
  383. {
  384. char
  385. *filename;
  386. /*
  387. Option is a file name: begin by reading image from specified file.
  388. */
  389. filename=argv[i];
  390. if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
  391. filename=argv[++i];
  392. (void) SetImageOption(image_info,"filename",filename);
  393. (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
  394. if (first_scene != last_scene)
  395. {
  396. char
  397. filename[MaxTextExtent];
  398. /*
  399. Form filename for multi-part images.
  400. */
  401. (void) InterpretImageFilename(image_info,(Image *) NULL,
  402. image_info->filename,(int) scene,filename);
  403. if (LocaleCompare(filename,image_info->filename) == 0)
  404. (void) FormatLocaleString(filename,MaxTextExtent,"%s.%.20g",
  405. image_info->filename,(double) scene);
  406. (void) CopyMagickString(image_info->filename,filename,
  407. MaxTextExtent);
  408. }
  409. (void) CloneString(&image_info->font,montage_info->font);
  410. images=ReadImages(image_info,exception);
  411. status&=(images != (Image *) NULL) &&
  412. (exception->severity < ErrorException);
  413. if (images == (Image *) NULL)
  414. continue;
  415. AppendImageStack(images);
  416. }
  417. continue;
  418. }
  419. pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
  420. switch (*(option+1))
  421. {
  422. case 'a':
  423. {
  424. if (LocaleCompare("adaptive-sharpen",option+1) == 0)
  425. {
  426. i++;
  427. if (i == (ssize_t) (argc-1))
  428. ThrowMontageException(OptionError,"MissingArgument",option);
  429. if (IsGeometry(argv[i]) == MagickFalse)
  430. ThrowMontageInvalidArgumentException(option,argv[i]);
  431. break;
  432. }
  433. if (LocaleCompare("adjoin",option+1) == 0)
  434. break;
  435. if (LocaleCompare("affine",option+1) == 0)
  436. {
  437. if (*option == '+')
  438. break;
  439. i++;
  440. if (i == (ssize_t) (argc-1))
  441. ThrowMontageException(OptionError,"MissingArgument",option);
  442. if (IsGeometry(argv[i]) == MagickFalse)
  443. ThrowMontageInvalidArgumentException(option,argv[i]);
  444. break;
  445. }
  446. if (LocaleCompare("alpha",option+1) == 0)
  447. {
  448. ssize_t
  449. type;
  450. if (*option == '+')
  451. break;
  452. i++;
  453. if (i == (ssize_t) argc)
  454. ThrowMontageException(OptionError,"MissingArgument",option);
  455. type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
  456. if (type < 0)
  457. ThrowMontageException(OptionError,"UnrecognizedAlphaChannelType",
  458. argv[i]);
  459. break;
  460. }
  461. if (LocaleCompare("annotate",option+1) == 0)
  462. {
  463. if (*option == '+')
  464. break;
  465. i++;
  466. if (i == (ssize_t) (argc-1))
  467. ThrowMontageException(OptionError,"MissingArgument",option);
  468. if (IsGeometry(argv[i]) == MagickFalse)
  469. ThrowMontageInvalidArgumentException(option,argv[i]);
  470. if (i == (ssize_t) (argc-1))
  471. ThrowMontageException(OptionError,"MissingArgument",option);
  472. i++;
  473. break;
  474. }
  475. if (LocaleCompare("auto-orient",option+1) == 0)
  476. break;
  477. if (LocaleCompare("authenticate",option+1) == 0)
  478. {
  479. if (*option == '+')
  480. break;
  481. i++;
  482. if (i == (ssize_t) argc)
  483. ThrowMontageException(OptionError,"MissingArgument",option);
  484. break;
  485. }
  486. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  487. }
  488. case 'b':
  489. {
  490. if (LocaleCompare("background",option+1) == 0)
  491. {
  492. if (*option == '+')
  493. break;
  494. i++;
  495. if (i == (ssize_t) argc)
  496. ThrowMontageException(OptionError,"MissingArgument",option);
  497. (void) QueryColorDatabase(argv[i],
  498. &montage_info->background_color,exception);
  499. break;
  500. }
  501. if (LocaleCompare("blue-primary",option+1) == 0)
  502. {
  503. if (*option == '+')
  504. break;
  505. i++;
  506. if (i == (ssize_t) argc)
  507. ThrowMontageException(OptionError,"MissingArgument",option);
  508. if (IsGeometry(argv[i]) == MagickFalse)
  509. ThrowMontageInvalidArgumentException(option,argv[i]);
  510. break;
  511. }
  512. if (LocaleCompare("blur",option+1) == 0)
  513. {
  514. if (*option == '+')
  515. break;
  516. i++;
  517. if (i == (ssize_t) argc)
  518. ThrowMontageException(OptionError,"MissingArgument",option);
  519. if (IsGeometry(argv[i]) == MagickFalse)
  520. ThrowMontageInvalidArgumentException(option,argv[i]);
  521. break;
  522. }
  523. if (LocaleCompare("border",option+1) == 0)
  524. {
  525. if (k == 0)
  526. {
  527. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  528. montage_info->border_width=0;
  529. }
  530. if (*option == '+')
  531. break;
  532. i++;
  533. if (i == (ssize_t) argc)
  534. ThrowMontageException(OptionError,"MissingArgument",option);
  535. if (IsGeometry(argv[i]) == MagickFalse)
  536. ThrowMontageInvalidArgumentException(option,argv[i]);
  537. if (k == 0)
  538. montage_info->border_width=StringToUnsignedLong(argv[i]);
  539. break;
  540. }
  541. if (LocaleCompare("bordercolor",option+1) == 0)
  542. {
  543. if (*option == '+')
  544. break;
  545. i++;
  546. if (i == (ssize_t) argc)
  547. ThrowMontageException(OptionError,"MissingArgument",option);
  548. (void) QueryColorDatabase(argv[i],&montage_info->border_color,
  549. exception);
  550. break;
  551. }
  552. if (LocaleCompare("borderwidth",option+1) == 0)
  553. {
  554. montage_info->border_width=0;
  555. if (*option == '+')
  556. break;
  557. i++;
  558. if (i == (ssize_t) argc)
  559. ThrowMontageException(OptionError,"MissingArgument",option);
  560. if (IsGeometry(argv[i]) == MagickFalse)
  561. ThrowMontageInvalidArgumentException(option,argv[i]);
  562. montage_info->border_width=StringToUnsignedLong(argv[i]);
  563. break;
  564. }
  565. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  566. }
  567. case 'c':
  568. {
  569. if (LocaleCompare("cache",option+1) == 0)
  570. {
  571. if (*option == '+')
  572. break;
  573. i++;
  574. if (i == (ssize_t) argc)
  575. ThrowMontageException(OptionError,"MissingArgument",option);
  576. if (IsGeometry(argv[i]) == MagickFalse)
  577. ThrowMontageInvalidArgumentException(option,argv[i]);
  578. break;
  579. }
  580. if (LocaleCompare("caption",option+1) == 0)
  581. {
  582. if (*option == '+')
  583. break;
  584. i++;
  585. if (i == (ssize_t) argc)
  586. ThrowMontageException(OptionError,"MissingArgument",option);
  587. break;
  588. }
  589. if (LocaleCompare("channel",option+1) == 0)
  590. {
  591. ssize_t
  592. channel;
  593. if (*option == '+')
  594. break;
  595. i++;
  596. if (i == (ssize_t) (argc-1))
  597. ThrowMontageException(OptionError,"MissingArgument",option);
  598. channel=ParseChannelOption(argv[i]);
  599. if (channel < 0)
  600. ThrowMontageException(OptionError,"UnrecognizedChannelType",
  601. argv[i]);
  602. break;
  603. }
  604. if (LocaleCompare("clone",option+1) == 0)
  605. {
  606. Image
  607. *clone_images;
  608. clone_images=image;
  609. if (k != 0)
  610. clone_images=image_stack[k-1].image;
  611. if (clone_images == (Image *) NULL)
  612. ThrowMontageException(ImageError,"ImageSequenceRequired",option);
  613. FireImageStack(MagickTrue,MagickTrue,MagickTrue);
  614. if (*option == '+')
  615. clone_images=CloneImages(clone_images,"-1",exception);
  616. else
  617. {
  618. i++;
  619. if (i == (ssize_t) (argc-1))
  620. ThrowMontageException(OptionError,"MissingArgument",option);
  621. if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
  622. ThrowMontageInvalidArgumentException(option,argv[i]);
  623. clone_images=CloneImages(clone_images,argv[i],exception);
  624. }
  625. if (clone_images == (Image *) NULL)
  626. ThrowMontageException(OptionError,"NoSuchImage",option);
  627. AppendImageStack(clone_images);
  628. break;
  629. }
  630. if (LocaleCompare("coalesce",option+1) == 0)
  631. break;
  632. if (LocaleCompare("colors",option+1) == 0)
  633. {
  634. if (*option == '+')
  635. break;
  636. i++;
  637. if (i == (ssize_t) argc)
  638. ThrowMontageException(OptionError,"MissingArgument",option);
  639. if (IsGeometry(argv[i]) == MagickFalse)
  640. ThrowMontageInvalidArgumentException(option,argv[i]);
  641. break;
  642. }
  643. if (LocaleCompare("colorspace",option+1) == 0)
  644. {
  645. ssize_t
  646. colorspace;
  647. if (*option == '+')
  648. break;
  649. i++;
  650. if (i == (ssize_t) argc)
  651. ThrowMontageException(OptionError,"MissingArgument",option);
  652. colorspace=ParseCommandOption(MagickColorspaceOptions,
  653. MagickFalse,argv[i]);
  654. if (colorspace < 0)
  655. ThrowMontageException(OptionError,"UnrecognizedColorspace",
  656. argv[i]);
  657. break;
  658. }
  659. if (LocaleCompare("comment",option+1) == 0)
  660. {
  661. if (*option == '+')
  662. break;
  663. i++;
  664. if (i == (ssize_t) argc)
  665. ThrowMontageException(OptionError,"MissingArgument",option);
  666. break;
  667. }
  668. if (LocaleCompare("compose",option+1) == 0)
  669. {
  670. ssize_t
  671. compose;
  672. if (*option == '+')
  673. break;
  674. i++;
  675. if (i == (ssize_t) argc)
  676. ThrowMontageException(OptionError,"MissingArgument",option);
  677. compose=ParseCommandOption(MagickComposeOptions,MagickFalse,argv[i]);
  678. if (compose < 0)
  679. ThrowMontageException(OptionError,"UnrecognizedComposeOperator",
  680. argv[i]);
  681. break;
  682. }
  683. if (LocaleCompare("composite",option+1) == 0)
  684. break;
  685. if (LocaleCompare("compress",option+1) == 0)
  686. {
  687. ssize_t
  688. compress;
  689. if (*option == '+')
  690. break;
  691. i++;
  692. if (i == (ssize_t) argc)
  693. ThrowMontageException(OptionError,"MissingArgument",option);
  694. compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
  695. argv[i]);
  696. if (compress < 0)
  697. ThrowMontageException(OptionError,"UnrecognizedCompressType",
  698. argv[i]);
  699. break;
  700. }
  701. if (LocaleCompare("concurrent",option+1) == 0)
  702. break;
  703. if (LocaleCompare("crop",option+1) == 0)
  704. {
  705. if (*option == '+')
  706. break;
  707. i++;
  708. if (i == (ssize_t) argc)
  709. ThrowMontageException(OptionError,"MissingArgument",option);
  710. if (IsGeometry(argv[i]) == MagickFalse)
  711. ThrowMontageInvalidArgumentException(option,argv[i]);
  712. break;
  713. }
  714. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  715. }
  716. case 'd':
  717. {
  718. if (LocaleCompare("debug",option+1) == 0)
  719. {
  720. ssize_t
  721. event;
  722. if (*option == '+')
  723. break;
  724. i++;
  725. if (i == (ssize_t) argc)
  726. ThrowMontageException(OptionError,"MissingArgument",option);
  727. event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
  728. if (event < 0)
  729. ThrowMontageException(OptionError,"UnrecognizedEventType",
  730. argv[i]);
  731. (void) SetLogEventMask(argv[i]);
  732. break;
  733. }
  734. if (LocaleCompare("define",option+1) == 0)
  735. {
  736. i++;
  737. if (i == (ssize_t) argc)
  738. ThrowMontageException(OptionError,"MissingArgument",option);
  739. if (*option == '+')
  740. {
  741. const char
  742. *define;
  743. define=GetImageOption(image_info,argv[i]);
  744. if (define == (const char *) NULL)
  745. ThrowMontageException(OptionError,"NoSuchOption",argv[i]);
  746. break;
  747. }
  748. break;
  749. }
  750. if (LocaleCompare("delete",option+1) == 0)
  751. {
  752. if (*option == '+')
  753. break;
  754. i++;
  755. if (i == (ssize_t) (argc-1))
  756. ThrowMontageException(OptionError,"MissingArgument",option);
  757. if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse)
  758. ThrowMontageInvalidArgumentException(option,argv[i]);
  759. break;
  760. }
  761. if (LocaleCompare("density",option+1) == 0)
  762. {
  763. if (*option == '+')
  764. break;
  765. i++;
  766. if (i == (ssize_t) argc)
  767. ThrowMontageException(OptionError,"MissingArgument",option);
  768. if (IsGeometry(argv[i]) == MagickFalse)
  769. ThrowMontageInvalidArgumentException(option,argv[i]);
  770. break;
  771. }
  772. if (LocaleCompare("depth",option+1) == 0)
  773. {
  774. if (*option == '+')
  775. break;
  776. i++;
  777. if (i == (ssize_t) argc)
  778. ThrowMontageException(OptionError,"MissingArgument",option);
  779. if (IsGeometry(argv[i]) == MagickFalse)
  780. ThrowMontageInvalidArgumentException(option,argv[i]);
  781. break;
  782. }
  783. if (LocaleCompare("display",option+1) == 0)
  784. {
  785. if (*option == '+')
  786. break;
  787. i++;
  788. if (i == (ssize_t) argc)
  789. ThrowMontageException(OptionError,"MissingArgument",option);
  790. break;
  791. }
  792. if (LocaleCompare("dispose",option+1) == 0)
  793. {
  794. ssize_t
  795. dispose;
  796. if (*option == '+')
  797. break;
  798. i++;
  799. if (i == (ssize_t) argc)
  800. ThrowMontageException(OptionError,"MissingArgument",option);
  801. dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
  802. if (dispose < 0)
  803. ThrowMontageException(OptionError,"UnrecognizedDisposeMethod",
  804. argv[i]);
  805. break;
  806. }
  807. if (LocaleCompare("dither",option+1) == 0)
  808. {
  809. ssize_t
  810. method;
  811. if (*option == '+')
  812. break;
  813. i++;
  814. if (i == (ssize_t) argc)
  815. ThrowMontageException(OptionError,"MissingArgument",option);
  816. method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
  817. if (method < 0)
  818. ThrowMontageException(OptionError,"UnrecognizedDitherMethod",
  819. argv[i]);
  820. break;
  821. }
  822. if (LocaleCompare("draw",option+1) == 0)
  823. {
  824. if (*option == '+')
  825. break;
  826. i++;
  827. if (i == (ssize_t) argc)
  828. ThrowMontageException(OptionError,"MissingArgument",option);
  829. break;
  830. }
  831. if (LocaleCompare("duplicate",option+1) == 0)
  832. {
  833. if (*option == '+')
  834. break;
  835. i++;
  836. if (i == (ssize_t) (argc-1))
  837. ThrowMontageException(OptionError,"MissingArgument",option);
  838. if (IsGeometry(argv[i]) == MagickFalse)
  839. ThrowMontageInvalidArgumentException(option,argv[i]);
  840. break;
  841. }
  842. if (LocaleCompare("duration",option+1) == 0)
  843. {
  844. if (*option == '+')
  845. break;
  846. i++;
  847. if (i == (ssize_t) (argc-1))
  848. ThrowMontageException(OptionError,"MissingArgument",option);
  849. if (IsGeometry(argv[i]) == MagickFalse)
  850. ThrowMontageInvalidArgumentException(option,argv[i]);
  851. break;
  852. }
  853. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  854. }
  855. case 'e':
  856. {
  857. if (LocaleCompare("encoding",option+1) == 0)
  858. {
  859. if (*option == '+')
  860. break;
  861. i++;
  862. if (i == (ssize_t) argc)
  863. ThrowMontageException(OptionError,"MissingArgument",option);
  864. break;
  865. }
  866. if (LocaleCompare("endian",option+1) == 0)
  867. {
  868. ssize_t
  869. endian;
  870. if (*option == '+')
  871. break;
  872. i++;
  873. if (i == (ssize_t) argc)
  874. ThrowMontageException(OptionError,"MissingArgument",option);
  875. endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
  876. argv[i]);
  877. if (endian < 0)
  878. ThrowMontageException(OptionError,"UnrecognizedEndianType",
  879. argv[i]);
  880. break;
  881. }
  882. if (LocaleCompare("extent",option+1) == 0)
  883. {
  884. if (*option == '+')
  885. break;
  886. i++;
  887. if (i == (ssize_t) (argc-1))
  888. ThrowMontageException(OptionError,"MissingArgument",option);
  889. if (IsGeometry(argv[i]) == MagickFalse)
  890. ThrowMontageInvalidArgumentException(option,argv[i]);
  891. break;
  892. }
  893. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  894. }
  895. case 'f':
  896. {
  897. if (LocaleCompare("fill",option+1) == 0)
  898. {
  899. (void) QueryColorDatabase("none",&montage_info->fill,exception);
  900. if (*option == '+')
  901. break;
  902. i++;
  903. if (i == (ssize_t) argc)
  904. ThrowMontageException(OptionError,"MissingArgument",option);
  905. (void) QueryColorDatabase(argv[i],&montage_info->fill,
  906. exception);
  907. break;
  908. }
  909. if (LocaleCompare("filter",option+1) == 0)
  910. {
  911. ssize_t
  912. filter;
  913. if (*option == '+')
  914. break;
  915. i++;
  916. if (i == (ssize_t) argc)
  917. ThrowMontageException(OptionError,"MissingArgument",option);
  918. filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
  919. if (filter < 0)
  920. ThrowMontageException(OptionError,"UnrecognizedImageFilter",
  921. argv[i]);
  922. break;
  923. }
  924. if (LocaleCompare("flatten",option+1) == 0)
  925. break;
  926. if (LocaleCompare("flip",option+1) == 0)
  927. break;
  928. if (LocaleCompare("flop",option+1) == 0)
  929. break;
  930. if (LocaleCompare("font",option+1) == 0)
  931. {
  932. if (*option == '+')
  933. break;
  934. i++;
  935. if (i == (ssize_t) argc)
  936. ThrowMontageException(OptionError,"MissingArgument",option);
  937. (void) CloneString(&montage_info->font,argv[i]);
  938. break;
  939. }
  940. if (LocaleCompare("format",option+1) == 0)
  941. {
  942. if (*option == '+')
  943. break;
  944. i++;
  945. if (i == (ssize_t) argc)
  946. ThrowMontageException(OptionError,"MissingArgument",option);
  947. format=argv[i];
  948. break;
  949. }
  950. if (LocaleCompare("frame",option+1) == 0)
  951. {
  952. if (k == 0)
  953. {
  954. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  955. (void) CloneString(&montage_info->frame,(char *) NULL);
  956. }
  957. if (*option == '+')
  958. break;
  959. i++;
  960. if (i == (ssize_t) argc)
  961. ThrowMontageException(OptionError,"MissingArgument",option);
  962. if (IsGeometry(argv[i]) == MagickFalse)
  963. ThrowMontageInvalidArgumentException(option,argv[i]);
  964. if (k == 0)
  965. (void) CloneString(&montage_info->frame,argv[i]);
  966. break;
  967. }
  968. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  969. }
  970. case 'g':
  971. {
  972. if (LocaleCompare("gamma",option+1) == 0)
  973. {
  974. i++;
  975. if (i == (ssize_t) argc)
  976. ThrowMontageException(OptionError,"MissingArgument",option);
  977. if (IsGeometry(argv[i]) == MagickFalse)
  978. ThrowMontageInvalidArgumentException(option,argv[i]);
  979. break;
  980. }
  981. if (LocaleCompare("geometry",option+1) == 0)
  982. {
  983. (void) CloneString(&montage_info->geometry,(char *) NULL);
  984. if (*option == '+')
  985. break;
  986. i++;
  987. if (i == (ssize_t) argc)
  988. ThrowMontageException(OptionError,"MissingArgument",option);
  989. if (IsGeometry(argv[i]) == MagickFalse)
  990. ThrowMontageInvalidArgumentException(option,argv[i]);
  991. (void) CloneString(&montage_info->geometry,argv[i]);
  992. break;
  993. }
  994. if (LocaleCompare("gravity",option+1) == 0)
  995. {
  996. ssize_t
  997. gravity;
  998. montage_info->gravity=UndefinedGravity;
  999. if (*option == '+')
  1000. break;
  1001. i++;
  1002. if (i == (ssize_t) argc)
  1003. ThrowMontageException(OptionError,"MissingArgument",option);
  1004. gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,
  1005. argv[i]);
  1006. if (gravity < 0)
  1007. ThrowMontageException(OptionError,"UnrecognizedGravityType",
  1008. argv[i]);
  1009. montage_info->gravity=(GravityType) gravity;
  1010. break;
  1011. }
  1012. if (LocaleCompare("green-primary",option+1) == 0)
  1013. {
  1014. if (*option == '+')
  1015. break;
  1016. i++;
  1017. if (i == (ssize_t) argc)
  1018. ThrowMontageException(OptionError,"MissingArgument",option);
  1019. if (IsGeometry(argv[i]) == MagickFalse)
  1020. ThrowMontageInvalidArgumentException(option,argv[i]);
  1021. break;
  1022. }
  1023. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1024. }
  1025. case 'h':
  1026. {
  1027. if ((LocaleCompare("help",option+1) == 0) ||
  1028. (LocaleCompare("-help",option+1) == 0))
  1029. return(MontageUsage());
  1030. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1031. }
  1032. case 'i':
  1033. {
  1034. if (LocaleCompare("identify",option+1) == 0)
  1035. break;
  1036. if (LocaleCompare("insert",option+1) == 0)
  1037. {
  1038. if (*option == '+')
  1039. break;
  1040. i++;
  1041. if (i == (ssize_t) (argc-1))
  1042. ThrowMontageException(OptionError,"MissingArgument",option);
  1043. if (IsGeometry(argv[i]) == MagickFalse)
  1044. ThrowMontageInvalidArgumentException(option,argv[i]);
  1045. break;
  1046. }
  1047. if (LocaleCompare("interlace",option+1) == 0)
  1048. {
  1049. ssize_t
  1050. interlace;
  1051. if (*option == '+')
  1052. break;
  1053. i++;
  1054. if (i == (ssize_t) argc)
  1055. ThrowMontageException(OptionError,"MissingArgument",option);
  1056. interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
  1057. argv[i]);
  1058. if (interlace < 0)
  1059. ThrowMontageException(OptionError,"UnrecognizedInterlaceType",
  1060. argv[i]);
  1061. break;
  1062. }
  1063. if (LocaleCompare("interpolate",option+1) == 0)
  1064. {
  1065. ssize_t
  1066. interpolate;
  1067. if (*option == '+')
  1068. break;
  1069. i++;
  1070. if (i == (ssize_t) argc)
  1071. ThrowMontageException(OptionError,"MissingArgument",option);
  1072. interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
  1073. argv[i]);
  1074. if (interpolate < 0)
  1075. ThrowMontageException(OptionError,"UnrecognizedInterpolateMethod",
  1076. argv[i]);
  1077. break;
  1078. }
  1079. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1080. }
  1081. case 'k':
  1082. {
  1083. if (LocaleCompare("kerning",option+1) == 0)
  1084. {
  1085. if (*option == '+')
  1086. break;
  1087. i++;
  1088. if (i == (ssize_t) (argc-1))
  1089. ThrowMontageException(OptionError,"MissingArgument",option);
  1090. if (IsGeometry(argv[i]) == MagickFalse)
  1091. ThrowMontageInvalidArgumentException(option,argv[i]);
  1092. break;
  1093. }
  1094. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1095. }
  1096. case 'l':
  1097. {
  1098. if (LocaleCompare("label",option+1) == 0)
  1099. {
  1100. if (*option == '+')
  1101. break;
  1102. i++;
  1103. if (i == (ssize_t) argc)
  1104. ThrowMontageException(OptionError,"MissingArgument",option);
  1105. break;
  1106. }
  1107. if (LocaleCompare("limit",option+1) == 0)
  1108. {
  1109. char
  1110. *p;
  1111. double
  1112. value;
  1113. ssize_t
  1114. resource;
  1115. if (*option == '+')
  1116. break;
  1117. i++;
  1118. if (i == (ssize_t) argc)
  1119. ThrowMontageException(OptionError,"MissingArgument",option);
  1120. resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
  1121. argv[i]);
  1122. if (resource < 0)
  1123. ThrowMontageException(OptionError,"UnrecognizedResourceType",
  1124. argv[i]);
  1125. i++;
  1126. if (i == (ssize_t) argc)
  1127. ThrowMontageException(OptionError,"MissingArgument",option);
  1128. value=StringToDouble(argv[i],&p);
  1129. (void) value;
  1130. if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
  1131. ThrowMontageInvalidArgumentException(option,argv[i]);
  1132. break;
  1133. }
  1134. if (LocaleCompare("list",option+1) == 0)
  1135. {
  1136. ssize_t
  1137. list;
  1138. if (*option == '+')
  1139. break;
  1140. i++;
  1141. if (i == (ssize_t) argc)
  1142. ThrowMontageException(OptionError,"MissingArgument",option);
  1143. list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
  1144. if (list < 0)
  1145. ThrowMontageException(OptionError,"UnrecognizedListType",argv[i]);
  1146. status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
  1147. argv+j,exception);
  1148. DestroyMontage();
  1149. return(status != 0 ? MagickFalse : MagickTrue);
  1150. }
  1151. if (LocaleCompare("log",option+1) == 0)
  1152. {
  1153. if (*option == '+')
  1154. break;
  1155. i++;
  1156. if ((i == (ssize_t) argc) ||
  1157. (strchr(argv[i],'%') == (char *) NULL))
  1158. ThrowMontageException(OptionError,"MissingArgument",option);
  1159. break;
  1160. }
  1161. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1162. }
  1163. case 'm':
  1164. {
  1165. if (LocaleCompare("matte",option+1) == 0)
  1166. break;
  1167. if (LocaleCompare("mattecolor",option+1) == 0)
  1168. {
  1169. if (*option == '+')
  1170. break;
  1171. i++;
  1172. if (i == (ssize_t) argc)
  1173. ThrowMontageException(OptionError,"MissingArgument",option);
  1174. (void) QueryColorDatabase(argv[i],&montage_info->matte_color,
  1175. exception);
  1176. break;
  1177. }
  1178. if (LocaleCompare("mode",option+1) == 0)
  1179. {
  1180. MontageMode
  1181. mode;
  1182. (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
  1183. if (*option == '+')
  1184. break;
  1185. i++;
  1186. if (i == (ssize_t) argc)
  1187. ThrowMontageException(OptionError,"MissingArgument",option);
  1188. mode=UndefinedMode;
  1189. if (LocaleCompare("frame",argv[i]) == 0)
  1190. {
  1191. mode=FrameMode;
  1192. (void) CloneString(&montage_info->frame,"15x15+3+3");
  1193. montage_info->shadow=MagickTrue;
  1194. break;
  1195. }
  1196. if (LocaleCompare("unframe",argv[i]) == 0)
  1197. {
  1198. mode=UnframeMode;
  1199. montage_info->frame=(char *) NULL;
  1200. montage_info->shadow=MagickFalse;
  1201. montage_info->border_width=0;
  1202. break;
  1203. }
  1204. if (LocaleCompare("concatenate",argv[i]) == 0)
  1205. {
  1206. mode=ConcatenateMode;
  1207. montage_info->frame=(char *) NULL;
  1208. montage_info->shadow=MagickFalse;
  1209. montage_info->gravity=(GravityType) NorthWestGravity;
  1210. (void) CloneString(&montage_info->geometry,"+0+0");
  1211. montage_info->border_width=0;
  1212. break;
  1213. }
  1214. if (mode == UndefinedMode)
  1215. ThrowMontageException(OptionError,"UnrecognizedImageMode",
  1216. argv[i]);
  1217. break;
  1218. }
  1219. if (LocaleCompare("monitor",option+1) == 0)
  1220. break;
  1221. if (LocaleCompare("monochrome",option+1) == 0)
  1222. {
  1223. if (*option == '+')
  1224. break;
  1225. break;
  1226. }
  1227. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1228. }
  1229. case 'n':
  1230. {
  1231. if (LocaleCompare("noop",option+1) == 0)
  1232. break;
  1233. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1234. }
  1235. case 'o':
  1236. {
  1237. if (LocaleCompare("origin",option+1) == 0)
  1238. {
  1239. if (*option == '+')
  1240. break;
  1241. i++;
  1242. if (i == (ssize_t) argc)
  1243. ThrowMontageException(OptionError,"MissingArgument",option);
  1244. if (IsGeometry(argv[i]) == MagickFalse)
  1245. ThrowMontageInvalidArgumentException(option,argv[i]);
  1246. break;
  1247. }
  1248. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1249. }
  1250. case 'p':
  1251. {
  1252. if (LocaleCompare("page",option+1) == 0)
  1253. {
  1254. if (*option == '+')
  1255. break;
  1256. i++;
  1257. if (i == (ssize_t) argc)
  1258. ThrowMontageException(OptionError,"MissingArgument",option);
  1259. break;
  1260. }
  1261. if (LocaleCompare("pointsize",option+1) == 0)
  1262. {
  1263. montage_info->pointsize=12;
  1264. if (*option == '+')
  1265. break;
  1266. i++;
  1267. if (i == (ssize_t) argc)
  1268. ThrowMontageException(OptionError,"MissingArgument",option);
  1269. if (IsGeometry(argv[i]) == MagickFalse)
  1270. ThrowMontageInvalidArgumentException(option,argv[i]);
  1271. montage_info->pointsize=StringToDouble(argv[i],(char **) NULL);
  1272. break;
  1273. }
  1274. if (LocaleCompare("polaroid",option+1) == 0)
  1275. {
  1276. if (*option == '+')
  1277. break;
  1278. i++;
  1279. if (i == (ssize_t) (argc-1))
  1280. ThrowMontageException(OptionError,"MissingArgument",option);
  1281. if (IsGeometry(argv[i]) == MagickFalse)
  1282. ThrowMontageInvalidArgumentException(option,argv[i]);
  1283. break;
  1284. }
  1285. if (LocaleCompare("profile",option+1) == 0)
  1286. {
  1287. i++;
  1288. if (i == (ssize_t) (argc-1))
  1289. ThrowMontageException(OptionError,"MissingArgument",option);
  1290. break;
  1291. }
  1292. ThrowMontageException(OptionError,"UnrecognizedOption",option)
  1293. }
  1294. case 'q':
  1295. {
  1296. if (LocaleCompare("quality",option+1) == 0)
  1297. {
  1298. if (*option == '+')
  1299. break;
  1300. i++;
  1301. if (i == (ssize_t) argc)
  1302. ThrowMontageException(OptionError,"MissingArgument",option);
  1303. if (IsGeometry(argv[i]) == MagickFalse)
  1304. ThrowMontageInvalidArgumentException(option,argv[i]);
  1305. break;
  1306. }
  1307. if (LocaleCompare("quantize",option+1) == 0)
  1308. {
  1309. ssize_t
  1310. colorspace;
  1311. if (*option == '+')
  1312. break;
  1313. i++;
  1314. if (i == (ssize_t) (argc-1))
  1315. ThrowMontageException(OptionError,"MissingArgument",option);
  1316. colorspace=ParseCommandOption(MagickColorspaceOptions,
  1317. MagickFalse,argv[i]);
  1318. if (colorspace < 0)
  1319. ThrowMontageException(OptionError,"UnrecognizedColorspace",
  1320. argv[i]);
  1321. break;
  1322. }
  1323. if (LocaleCompare(

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