PageRenderTime 57ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/MagickWand/composite.c

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

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