PageRenderTime 62ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/MagickWand/montage.c

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

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