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

/lib/wand/montage.c

http://github.com/idaunis/binarytiers
C | 1771 lines | 1637 code | 43 blank | 91 comment | 776 complexity | 5d35b4b1cc696cd9167917239ddab824 MD5 | raw file

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

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