00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "wand/studio.h"
00044 #include "wand/MagickWand.h"
00045 #include "wand/mogrify-private.h"
00046
00047
00048
00049
00050 typedef struct _CompositeOptions
00051 {
00052 ChannelType
00053 channel;
00054
00055 char
00056 *compose_args,
00057 *geometry;
00058
00059 CompositeOperator
00060 compose;
00061
00062 GravityType
00063 gravity;
00064
00065 long
00066 stegano;
00067
00068 RectangleInfo
00069 offset;
00070
00071 MagickBooleanType
00072 stereo,
00073 tile;
00074 } CompositeOptions;
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 static MagickBooleanType CompositeImageList(ImageInfo *image_info,Image **image,
00110 Image *composite_image,CompositeOptions *composite_options,
00111 ExceptionInfo *exception)
00112 {
00113 MagickStatusType
00114 status;
00115
00116 assert(image_info != (ImageInfo *) NULL);
00117 assert(image_info->signature == MagickSignature);
00118 assert(image != (Image **) NULL);
00119 assert((*image)->signature == MagickSignature);
00120 if ((*image)->debug != MagickFalse)
00121 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
00122 assert(exception != (ExceptionInfo *) NULL);
00123 status=MagickTrue;
00124 if (composite_image != (Image *) NULL)
00125 {
00126 assert(composite_image->signature == MagickSignature);
00127 switch( composite_options->compose )
00128 {
00129 case BlendCompositeOp:
00130 case BlurCompositeOp:
00131 case DisplaceCompositeOp:
00132 case DistortCompositeOp:
00133 case DissolveCompositeOp:
00134 case ModulateCompositeOp:
00135 case ThresholdCompositeOp:
00136 (void) SetImageArtifact(composite_image,"compose:args",
00137 composite_options->compose_args);
00138 break;
00139 default:
00140 break;
00141 }
00142
00143
00144
00145 if (composite_options->stegano != 0)
00146 {
00147 Image
00148 *stegano_image;
00149
00150 (*image)->offset=composite_options->stegano-1;
00151 stegano_image=SteganoImage(*image,composite_image,exception);
00152 if (stegano_image != (Image *) NULL)
00153 {
00154 *image=DestroyImageList(*image);
00155 *image=stegano_image;
00156 }
00157 }
00158 else
00159 if (composite_options->stereo != MagickFalse)
00160 {
00161 Image
00162 *stereo_image;
00163
00164 stereo_image=StereoAnaglyphImage(*image,composite_image,
00165 composite_options->offset.x,composite_options->offset.y,
00166 exception);
00167 if (stereo_image != (Image *) NULL)
00168 {
00169 *image=DestroyImageList(*image);
00170 *image=stereo_image;
00171 }
00172 }
00173 else
00174 if (composite_options->tile != MagickFalse)
00175 {
00176 long
00177 x,
00178 y;
00179
00180 unsigned long
00181 columns;
00182
00183
00184
00185
00186 (void) SetImageArtifact(composite_image,"compose:outside-overlay",
00187 "false");
00188 columns=composite_image->columns;
00189 for (y=0; y < (long) (*image)->rows; y+=composite_image->rows)
00190 for (x=0; x < (long) (*image)->columns; x+=columns)
00191 status&=CompositeImageChannel(*image,
00192 composite_options->channel,composite_options->compose,
00193 composite_image,x,y);
00194 GetImageException(*image,exception);
00195 }
00196 else
00197 {
00198 RectangleInfo
00199 geometry;
00200
00201
00202
00203
00204 SetGeometry(*image,&geometry);
00205 (void) ParseAbsoluteGeometry(composite_options->geometry,
00206 &geometry);
00207 geometry.width=composite_image->columns;
00208 geometry.height=composite_image->rows;
00209 GravityAdjustGeometry((*image)->columns,(*image)->rows,
00210 composite_options->gravity, &geometry);
00211 (*image)->gravity=(GravityType) composite_options->gravity;
00212
00213
00214
00215 status&=CompositeImageChannel(*image,composite_options->channel,
00216 composite_options->compose,composite_image,geometry.x,
00217 geometry.y);
00218 GetImageException(*image,exception);
00219 }
00220 }
00221 return(status != 0 ? MagickTrue : MagickFalse);
00222 }
00223
00224 static MagickBooleanType CompositeUsage(void)
00225 {
00226 const char
00227 **p;
00228
00229 static const char
00230 *miscellaneous[]=
00231 {
00232 "-debug events display copious debugging information",
00233 "-help print program options",
00234 "-list type print a list of supported option arguments",
00235 "-log format format of debugging information",
00236 "-version print version information",
00237 (char *) NULL
00238 },
00239 *operators[]=
00240 {
00241 "-blend geometry blend images",
00242 "-border geometry surround image with a border of color",
00243 "-bordercolor color border color",
00244 "-colors value preferred number of colors in the image",
00245 "-decipher filename convert cipher pixels to plain pixels",
00246 "-displace geometry shift lookup according to a relative displacement map",
00247 "-dissolve value dissolve the two images a given percent",
00248 "-distort geometry shift lookup according to a absolute distortion map",
00249 "-encipher filename convert plain pixels to cipher pixels",
00250 "-extract geometry extract area from image",
00251 "-geometry geometry location of the composite image",
00252 "-identify identify the format and characteristics of the image",
00253 "-monochrome transform image to black and white",
00254 "-negate replace every pixel with its complementary color ",
00255 "-profile filename add ICM or IPTC information profile to image",
00256 "-quantize colorspace reduce colors in this colorspace",
00257 "-repage geometry size and location of an image canvas (operator)",
00258 "-rotate degrees apply Paeth rotation to the image",
00259 "-resize geometry resize the image",
00260 "-sharpen geometry sharpen the image",
00261 "-shave geometry shave pixels from the image edges",
00262 "-stegano offset hide watermark within an image",
00263 "-stereo geometry combine two image to create a stereo anaglyph",
00264 "-strip strip image of all profiles and comments",
00265 "-thumbnail geometry create a thumbnail of the image",
00266 "-transform affine transform image",
00267 "-type type image type",
00268 "-unsharp geometry sharpen the image",
00269 "-watermark geometry percent brightness and saturation of a watermark",
00270 "-write filename write images to this file",
00271 (char *) NULL
00272 },
00273 *settings[]=
00274 {
00275 "-affine matrix affine transform matrix",
00276 "-alpha option on, activate, off, deactivate, set, opaque, copy",
00277 " transparent, extract, background, or shape",
00278 "-authenticate password",
00279 " decipher image with this password",
00280 "-blue-primary point chromaticity blue primary point",
00281 "-channel type apply option to select image channels",
00282 "-colorspace type alternate image colorspace",
00283 "-comment string annotate image with comment",
00284 "-compose operator composite operator",
00285 "-compress type type of pixel compression when writing the image",
00286 "-define format:option",
00287 " define one or more image format options",
00288 "-depth value image depth",
00289 "-density geometry horizontal and vertical density of the image",
00290 "-display server get image or font from this X server",
00291 "-dispose method layer disposal method",
00292 "-dither method apply error diffusion to image",
00293 "-encoding type text encoding type",
00294 "-endian type endianness (MSB or LSB) of the image",
00295 "-filter type use this filter when resizing an image",
00296 "-font name render text with this font",
00297 "-format \"string\" output formatted image characteristics",
00298 "-gravity type which direction to gravitate towards",
00299 "-green-primary point chromaticity green primary point",
00300 "-interlace type type of image interlacing scheme",
00301 "-interpolate method pixel color interpolation method",
00302 "-label string assign a label to an image",
00303 "-limit type value pixel cache resource limit",
00304 "-monitor monitor progress",
00305 "-page geometry size and location of an image canvas (setting)",
00306 "-pointsize value font point size",
00307 "-quality value JPEG/MIFF/PNG compression level",
00308 "-quiet suppress all warning messages",
00309 "-red-primary point chromaticity red primary point",
00310 "-regard-warnings pay attention to warning messages",
00311 "-respect-parentheses settings remain in effect until parenthesis boundary",
00312 "-sampling-factor geometry",
00313 " horizontal and vertical sampling factor",
00314 "-scene value image scene number",
00315 "-seed value seed a new sequence of pseudo-random numbers",
00316 "-size geometry width and height of image",
00317 "-transparent-color color",
00318 " transparent color",
00319 "-treedepth value color tree depth",
00320 "-tile repeat composite operation across and down image",
00321 "-units type the units of image resolution",
00322 "-verbose print detailed information about the image",
00323 "-virtual-pixel method",
00324 " virtual pixel access method",
00325 "-white-point point chromaticity white point",
00326 (char *) NULL
00327 },
00328 *stack_operators[]=
00329 {
00330 "-swap indexes swap two images in the image sequence",
00331 (char *) NULL
00332 };
00333
00334
00335 (void) printf("Version: %s\n",GetMagickVersion((unsigned long *) NULL));
00336 (void) printf("Copyright: %s\n",GetMagickCopyright());
00337 (void) printf("Features: %s\n\n",GetMagickFeatures());
00338 (void) printf("Usage: %s [options ...] image [options ...] composite\n"
00339 " [ [options ...] mask ] [options ...] composite\n",
00340 GetClientName());
00341 (void) printf("\nImage Settings:\n");
00342 for (p=settings; *p != (char *) NULL; p++)
00343 (void) printf(" %s\n",*p);
00344 (void) printf("\nImage Operators:\n");
00345 for (p=operators; *p != (char *) NULL; p++)
00346 (void) printf(" %s\n",*p);
00347 (void) printf("\nImage Stack Operators:\n");
00348 for (p=stack_operators; *p != (char *) NULL; p++)
00349 (void) printf(" %s\n",*p);
00350 (void) printf("\nMiscellaneous Options:\n");
00351 for (p=miscellaneous; *p != (char *) NULL; p++)
00352 (void) printf(" %s\n",*p);
00353 (void) printf(
00354 "\nBy default, the image format of `file' is determined by its magic\n");
00355 (void) printf(
00356 "number. To specify a particular image format, precede the filename\n");
00357 (void) printf(
00358 "with an image format name and a colon (i.e. ps:image) or specify the\n");
00359 (void) printf(
00360 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
00361 (void) printf("'-' for standard input or output.\n");
00362 return(MagickFalse);
00363 }
00364
00365 static void GetCompositeOptions(CompositeOptions *composite_options)
00366 {
00367 (void) ResetMagickMemory(composite_options,0,sizeof(*composite_options));
00368 composite_options->channel=DefaultChannels;
00369 composite_options->compose=OverCompositeOp;
00370 }
00371
00372 static void RelinquishCompositeOptions(CompositeOptions *composite_options)
00373 {
00374 if (composite_options->compose_args != (char *) NULL)
00375 composite_options->compose_args=(char *)
00376 RelinquishMagickMemory(composite_options->compose_args);
00377 }
00378
00379 WandExport MagickBooleanType CompositeImageCommand(ImageInfo *image_info,
00380 int argc,char **argv,char **metadata,ExceptionInfo *exception)
00381 {
00382 #define NotInitialized (unsigned int) (~0)
00383 #define DestroyComposite() \
00384 { \
00385 RelinquishCompositeOptions(&composite_options); \
00386 DestroyImageStack(); \
00387 for (i=0; i < (long) argc; i++) \
00388 argv[i]=DestroyString(argv[i]); \
00389 argv=(char **) RelinquishMagickMemory(argv); \
00390 }
00391 #define ThrowCompositeException(asperity,tag,option) \
00392 { \
00393 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
00394 option == (char *) NULL ? GetExceptionMessage(errno) : option); \
00395 DestroyComposite(); \
00396 return(MagickFalse); \
00397 }
00398 #define ThrowCompositeInvalidArgumentException(option,argument) \
00399 { \
00400 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
00401 "InvalidArgument","`%s': %s",option,argument); \
00402 DestroyComposite(); \
00403 return(MagickFalse); \
00404 }
00405
00406 char
00407 *filename,
00408 *option;
00409
00410 CompositeOptions
00411 composite_options;
00412
00413 const char
00414 *format;
00415
00416 Image
00417 *composite_image,
00418 *image,
00419 *images,
00420 *mask_image;
00421
00422 ImageStack
00423 image_stack[MaxImageStackDepth+1];
00424
00425 MagickBooleanType
00426 fire,
00427 pend;
00428
00429 MagickStatusType
00430 status;
00431
00432 long
00433 j,
00434 k;
00435
00436 register long
00437 i;
00438
00439
00440
00441
00442 assert(image_info != (ImageInfo *) NULL);
00443 assert(image_info->signature == MagickSignature);
00444 if (image_info->debug != MagickFalse)
00445 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00446 assert(exception != (ExceptionInfo *) NULL);
00447 if (argc == 2)
00448 {
00449 option=argv[1];
00450 if ((LocaleCompare("version",option+1) == 0) ||
00451 (LocaleCompare("-version",option+1) == 0))
00452 {
00453 (void) fprintf(stdout,"Version: %s\n",
00454 GetMagickVersion((unsigned long *) NULL));
00455 (void) fprintf(stdout,"Copyright: %s\n",GetMagickCopyright());
00456 (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
00457 return(MagickFalse);
00458 }
00459 }
00460 if (argc < 4)
00461 {
00462 (void) CompositeUsage();
00463 return(MagickTrue);
00464 }
00465 GetCompositeOptions(&composite_options);
00466 filename=(char *) NULL;
00467 format="%w,%h,%m";
00468 j=1;
00469 k=0;
00470 NewImageStack();
00471 option=(char *) NULL;
00472 pend=MagickFalse;
00473 status=MagickTrue;
00474
00475
00476
00477 composite_image=NewImageList();
00478 image=NewImageList();
00479 mask_image=NewImageList();
00480 ReadCommandlLine(argc,&argv);
00481 status=ExpandFilenames(&argc,&argv);
00482 if (status == MagickFalse)
00483 ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed",
00484 GetExceptionMessage(errno));
00485 for (i=1; i < (long) (argc-1); i++)
00486 {
00487 option=argv[i];
00488 if (LocaleCompare(option,"(") == 0)
00489 {
00490 FireImageStack(MagickFalse,MagickTrue,pend);
00491 if (k == MaxImageStackDepth)
00492 ThrowCompositeException(OptionError,"ParenthesisNestedTooDeeply",
00493 option);
00494 PushImageStack();
00495 continue;
00496 }
00497 if (LocaleCompare(option,")") == 0)
00498 {
00499 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
00500 if (k == 0)
00501 ThrowCompositeException(OptionError,"UnableToParseExpression",option);
00502 PopImageStack();
00503 continue;
00504 }
00505 if (IsMagickOption(option) == MagickFalse)
00506 {
00507 Image
00508 *images;
00509
00510
00511
00512
00513 FireImageStack(MagickFalse,MagickFalse,pend);
00514 filename=argv[i];
00515 if ((LocaleCompare(filename,"--") == 0) && (i < (argc-1)))
00516 filename=argv[++i];
00517 (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
00518 images=ReadImages(image_info,exception);
00519 status&=(images != (Image *) NULL) &&
00520 (exception->severity < ErrorException);
00521 if (images == (Image *) NULL)
00522 continue;
00523 AppendImageStack(images);
00524 continue;
00525 }
00526 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
00527 switch (*(option+1))
00528 {
00529 case 'a':
00530 {
00531 if (LocaleCompare("affine",option+1) == 0)
00532 {
00533 if (*option == '+')
00534 break;
00535 i++;
00536 if (i == (long) argc)
00537 ThrowCompositeException(OptionError,"MissingArgument",option);
00538 if (IsGeometry(argv[i]) == MagickFalse)
00539 ThrowCompositeInvalidArgumentException(option,argv[i]);
00540 break;
00541 }
00542 if (LocaleCompare("alpha",option+1) == 0)
00543 {
00544 long
00545 type;
00546
00547 if (*option == '+')
00548 break;
00549 i++;
00550 if (i == (long) argc)
00551 ThrowCompositeException(OptionError,"MissingArgument",option);
00552 type=ParseMagickOption(MagickAlphaOptions,MagickFalse,argv[i]);
00553 if (type < 0)
00554 ThrowCompositeException(OptionError,
00555 "UnrecognizedAlphaChannelType",argv[i]);
00556 break;
00557 }
00558 if (LocaleCompare("authenticate",option+1) == 0)
00559 {
00560 if (*option == '+')
00561 break;
00562 i++;
00563 if (i == (long) argc)
00564 ThrowCompositeException(OptionError,"MissingArgument",option);
00565 break;
00566 }
00567 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
00568 }
00569 case 'b':
00570 {
00571 if (LocaleCompare("background",option+1) == 0)
00572 {
00573 if (*option == '+')
00574 break;
00575 i++;
00576 if (i == (long) argc)
00577 ThrowCompositeException(OptionError,"MissingArgument",option);
00578 break;
00579 }
00580 if (LocaleCompare("blend",option+1) == 0)
00581 {
00582 (void) CloneString(&composite_options.compose_args,(char *) NULL);
00583 if (*option == '+')
00584 break;
00585 i++;
00586 if (i == (long) argc)
00587 ThrowCompositeException(OptionError,"MissingArgument",option);
00588 if (IsGeometry(argv[i]) == MagickFalse)
00589 ThrowCompositeInvalidArgumentException(option,argv[i]);
00590 (void) CloneString(&composite_options.compose_args,argv[i]);
00591 composite_options.compose=BlendCompositeOp;
00592 break;
00593 }
00594 if (LocaleCompare("blur",option+1) == 0)
00595 {
00596 (void) CloneString(&composite_options.compose_args,(char *) NULL);
00597 if (*option == '+')
00598 break;
00599 i++;
00600 if (i == (long) argc)
00601 ThrowCompositeException(OptionError,"MissingArgument",option);
00602 if (IsGeometry(argv[i]) == MagickFalse)
00603 ThrowCompositeInvalidArgumentException(option,argv[i]);
00604 (void) CloneString(&composite_options.compose_args,argv[i]);
00605 composite_options.compose=BlurCompositeOp;
00606 break;
00607 }
00608 if (LocaleCompare("blue-primary",option+1) == 0)
00609 {
00610 if (*option == '+')
00611 break;
00612 i++;
00613 if (i == (long) argc)
00614 ThrowCompositeException(OptionError,"MissingArgument",option);
00615 if (IsGeometry(argv[i]) == MagickFalse)
00616 ThrowCompositeInvalidArgumentException(option,argv[i]);
00617 break;
00618 }
00619 if (LocaleCompare("border",option+1) == 0)
00620 {
00621 if (*option == '+')
00622 break;
00623 i++;
00624 if (i == (long) (argc-1))
00625 ThrowCompositeException(OptionError,"MissingArgument",option);
00626 if (IsGeometry(argv[i]) == MagickFalse)
00627 ThrowCompositeInvalidArgumentException(option,argv[i]);
00628 break;
00629 }
00630 if (LocaleCompare("bordercolor",option+1) == 0)
00631 {
00632 if (*option == '+')
00633 break;
00634 i++;
00635 if (i == (long) (argc-1))
00636 ThrowCompositeException(OptionError,"MissingArgument",option);
00637 break;
00638 }
00639 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
00640 }
00641 case 'c':
00642 {
00643 if (LocaleCompare("cache",option+1) == 0)
00644 {
00645 if (*option == '+')
00646 break;
00647 i++;
00648 if (i == (long) argc)
00649 ThrowCompositeException(OptionError,"MissingArgument",option);
00650 if (IsGeometry(argv[i]) == MagickFalse)
00651 ThrowCompositeInvalidArgumentException(option,argv[i]);
00652 break;
00653 }
00654 if (LocaleCompare("channel",option+1) == 0)
00655 {
00656 long
00657 channel;
00658
00659 if (*option == '+')
00660 {
00661 composite_options.channel=DefaultChannels;
00662 break;
00663 }
00664 i++;
00665 if (i == (long) (argc-1))
00666 ThrowCompositeException(OptionError,"MissingArgument",option);
00667 channel=ParseChannelOption(argv[i]);
00668 if (channel < 0)
00669 ThrowCompositeException(OptionError,"UnrecognizedChannelType",
00670 argv[i]);
00671 composite_options.channel=(ChannelType) channel;
00672 break;
00673 }
00674 if (LocaleCompare("colors",option+1) == 0)
00675 {
00676 if (*option == '+')
00677 break;
00678 i++;
00679 if (i == (long) argc)
00680 ThrowCompositeException(OptionError,"MissingArgument",option);
00681 if (IsGeometry(argv[i]) == MagickFalse)
00682 ThrowCompositeInvalidArgumentException(option,argv[i]);
00683 break;
00684 }
00685 if (LocaleCompare("colorspace",option+1) == 0)
00686 {
00687 long
00688 colorspace;
00689
00690 if (*option == '+')
00691 break;
00692 i++;
00693 if (i == (long) argc)
00694 ThrowCompositeException(OptionError,"MissingArgument",option);
00695 colorspace=ParseMagickOption(MagickColorspaceOptions,
00696 MagickFalse,argv[i]);
00697 if (colorspace < 0)
00698 ThrowCompositeException(OptionError,"UnrecognizedColorspace",
00699 argv[i]);
00700 break;
00701 }
00702 if (LocaleCompare("comment",option+1) == 0)
00703 {
00704 if (*option == '+')
00705 break;
00706 i++;
00707 if (i == (long) argc)
00708 ThrowCompositeException(OptionError,"MissingArgument",option);
00709 break;
00710 }
00711 if (LocaleCompare("compose",option+1) == 0)
00712 {
00713 long
00714 compose;
00715
00716 composite_options.compose=UndefinedCompositeOp;
00717 if (*option == '+')
00718 break;
00719 i++;
00720 if (i == (long) argc)
00721 ThrowCompositeException(OptionError,"MissingArgument",option);
00722 compose=ParseMagickOption(MagickComposeOptions,MagickFalse,
00723 argv[i]);
00724 if (compose < 0)
00725 ThrowCompositeException(OptionError,"UnrecognizedComposeOperator",
00726 argv[i]);
00727 composite_options.compose=(CompositeOperator) compose;
00728 break;
00729 }
00730 if (LocaleCompare("compress",option+1) == 0)
00731 {
00732 long
00733 compress;
00734
00735 if (*option == '+')
00736 break;
00737 i++;
00738 if (i == (long) argc)
00739 ThrowCompositeException(OptionError,"MissingArgument",option);
00740 compress=ParseMagickOption(MagickCompressOptions,MagickFalse,
00741 argv[i]);
00742 if (compress < 0)
00743 ThrowCompositeException(OptionError,
00744 "UnrecognizedImageCompression",argv[i]);
00745 break;
00746 }
00747 if (LocaleCompare("concurrent",option+1) == 0)
00748 break;
00749 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
00750 }
00751 case 'd':
00752 {
00753 if (LocaleCompare("debug",option+1) == 0)
00754 {
00755 long
00756 event;
00757
00758 if (*option == '+')
00759 break;
00760 i++;
00761 if (i == (long) argc)
00762 ThrowCompositeException(OptionError,"MissingArgument",option);
00763 event=ParseMagickOption(MagickLogEventOptions,MagickFalse,argv[i]);
00764 if (event < 0)
00765 ThrowCompositeException(OptionError,"UnrecognizedEventType",
00766 argv[i]);
00767 (void) SetLogEventMask(argv[i]);
00768 break;
00769 }
00770 if (LocaleCompare("decipher",option+1) == 0)
00771 {
00772 if (*option == '+')
00773 break;
00774 i++;
00775 if (i == (long) (argc-1))
00776 ThrowCompositeException(OptionError,"MissingArgument",option);
00777 break;
00778 }
00779 if (LocaleCompare("define",option+1) == 0)
00780 {
00781 i++;
00782 if (i == (long) argc)
00783 ThrowCompositeException(OptionError,"MissingArgument",option);
00784 if (*option == '+')
00785 {
00786 const char
00787 *define;
00788
00789 define=GetImageOption(image_info,argv[i]);
00790 if (define == (const char *) NULL)
00791 ThrowCompositeException(OptionError,"NoSuchOption",argv[i]);
00792 break;
00793 }
00794 break;
00795 }
00796 if (LocaleCompare("density",option+1) == 0)
00797 {
00798 if (*option == '+')
00799 break;
00800 i++;
00801 if (i == (long) argc)
00802 ThrowCompositeException(OptionError,"MissingArgument",option);
00803 if (IsGeometry(argv[i]) == MagickFalse)
00804 ThrowCompositeInvalidArgumentException(option,argv[i]);
00805 break;
00806 }
00807 if (LocaleCompare("depth",option+1) == 0)
00808 {
00809 if (*option == '+')
00810 break;
00811 i++;
00812 if (i == (long) argc)
00813 ThrowCompositeException(OptionError,"MissingArgument",option);
00814 if (IsGeometry(argv[i]) == MagickFalse)
00815 ThrowCompositeInvalidArgumentException(option,argv[i]);
00816 break;
00817 }
00818 if (LocaleCompare("displace",option+1) == 0)
00819 {
00820 (void) CloneString(&composite_options.compose_args,(char *) NULL);
00821 if (*option == '+')
00822 break;
00823 i++;
00824 if (i == (long) argc)
00825 ThrowCompositeException(OptionError,"MissingArgument",option);
00826 if (IsGeometry(argv[i]) == MagickFalse)
00827 ThrowCompositeInvalidArgumentException(option,argv[i]);
00828 (void) CloneString(&composite_options.compose_args,argv[i]);
00829 composite_options.compose=DisplaceCompositeOp;
00830 break;
00831 }
00832 if (LocaleCompare("display",option+1) == 0)
00833 {
00834 if (*option == '+')
00835 break;
00836 i++;
00837 if (i == (long) argc)
00838 ThrowCompositeException(OptionError,"MissingArgument",option);
00839 break;
00840 }
00841 if (LocaleCompare("dispose",option+1) == 0)
00842 {
00843 long
00844 dispose;
00845
00846 if (*option == '+')
00847 break;
00848 i++;
00849 if (i == (long) argc)
00850 ThrowCompositeException(OptionError,"MissingArgument",option);
00851 dispose=ParseMagickOption(MagickDisposeOptions,MagickFalse,argv[i]);
00852 if (dispose < 0)
00853 ThrowCompositeException(OptionError,"UnrecognizedDisposeMethod",
00854 argv[i]);
00855 break;
00856 }
00857 if (LocaleCompare("dissolve",option+1) == 0)
00858 {
00859 (void) CloneString(&composite_options.compose_args,(char *) NULL);
00860 if (*option == '+')
00861 break;
00862 i++;
00863 if (i == (long) argc)
00864 ThrowCompositeException(OptionError,"MissingArgument",option);
00865 if (IsGeometry(argv[i]) == MagickFalse)
00866 ThrowCompositeInvalidArgumentException(option,argv[i]);
00867 (void) CloneString(&composite_options.compose_args,argv[i]);
00868 composite_options.compose=DissolveCompositeOp;
00869 break;
00870 }
00871 if (LocaleCompare("distort",option+1) == 0)
00872 {
00873 (void) CloneString(&composite_options.compose_args,(char *) NULL);
00874 if (*option == '+')
00875 break;
00876 i++;
00877 if (i == (long) argc)
00878 ThrowCompositeException(OptionError,"MissingArgument",option);
00879 if (IsGeometry(argv[i]) == MagickFalse)
00880 ThrowCompositeInvalidArgumentException(option,argv[i]);
00881 (void) CloneString(&composite_options.compose_args,argv[i]);
00882 composite_options.compose=DistortCompositeOp;
00883 break;
00884 }
00885 if (LocaleCompare("dither",option+1) == 0)
00886 {
00887 long
00888 method;
00889
00890 if (*option == '+')
00891 break;
00892 i++;
00893 if (i == (long) argc)
00894 ThrowCompositeException(OptionError,"MissingArgument",option);
00895 method=ParseMagickOption(MagickDitherOptions,MagickFalse,argv[i]);
00896 if (method < 0)
00897 ThrowCompositeException(OptionError,"UnrecognizedDitherMethod",
00898 argv[i]);
00899 break;
00900 }
00901 if (LocaleCompare("duration",option+1) == 0)
00902 {
00903 if (*option == '+')
00904 break;
00905 i++;
00906 if (i == (long) (argc-1))
00907 ThrowCompositeException(OptionError,"MissingArgument",option);
00908 if (IsGeometry(argv[i]) == MagickFalse)
00909 ThrowCompositeInvalidArgumentException(option,argv[i]);
00910 break;
00911 }
00912 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
00913 }
00914 case 'e':
00915 {
00916 if (LocaleCompare("encipher",option+1) == 0)
00917 {
00918 if (*option == '+')
00919 break;
00920 i++;
00921 if (i == (long) (argc-1))
00922 ThrowCompositeException(OptionError,"MissingArgument",option);
00923 break;
00924 }
00925 if (LocaleCompare("encoding",option+1) == 0)
00926 {
00927 if (*option == '+')
00928 break;
00929 i++;
00930 if (i == (long) argc)
00931 ThrowCompositeException(OptionError,"MissingArgument",option);
00932 break;
00933 }
00934 if (LocaleCompare("endian",option+1) == 0)
00935 {
00936 long
00937 endian;
00938
00939 if (*option == '+')
00940 break;
00941 i++;
00942 if (i == (long) argc)
00943 ThrowCompositeException(OptionError,"MissingArgument",option);
00944 endian=ParseMagickOption(MagickEndianOptions,MagickFalse,
00945 argv[i]);
00946 if (endian < 0)
00947 ThrowCompositeException(OptionError,"UnrecognizedEndianType",
00948 argv[i]);
00949 break;
00950 }
00951 if (LocaleCompare("extract",option+1) == 0)
00952 {
00953 if (*option == '+')
00954 break;
00955 i++;
00956 if (i == (long) argc)
00957 ThrowCompositeException(OptionError,"MissingArgument",option);
00958 if (IsGeometry(argv[i]) == MagickFalse)
00959 ThrowCompositeInvalidArgumentException(option,argv[i]);
00960 break;
00961 }
00962 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
00963 }
00964 case 'f':
00965 {
00966 if (LocaleCompare("filter",option+1) == 0)
00967 {
00968 long
00969 filter;
00970
00971 if (*option == '+')
00972 break;
00973 i++;
00974 if (i == (long) argc)
00975 ThrowCompositeException(OptionError,"MissingArgument",option);
00976 filter=ParseMagickOption(MagickFilterOptions,MagickFalse,argv[i]);
00977 if (filter < 0)
00978 ThrowCompositeException(OptionError,"UnrecognizedImageFilter",
00979 argv[i]);
00980 break;
00981 }
00982 if (LocaleCompare("font",option+1) == 0)
00983 {
00984 if (*option == '+')
00985 break;
00986 i++;
00987 if (i == (long) argc)
00988 ThrowCompositeException(OptionError,"MissingArgument",option);
00989 break;
00990 }
00991 if (LocaleCompare("format",option+1) == 0)
00992 {
00993 if (*option == '+')
00994 break;
00995 i++;
00996 if (i == (long) argc)
00997 ThrowCompositeException(OptionError,"MissingArgument",option);
00998 format=argv[i];
00999 break;
01000 }
01001 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01002 }
01003 case 'g':
01004 {
01005 if (LocaleCompare("geometry",option+1) == 0)
01006 {
01007 (void) CloneString(&composite_options.geometry,(char *) NULL);
01008 if (*option == '+')
01009 break;
01010 i++;
01011 if (i == (long) argc)
01012 ThrowCompositeException(OptionError,"MissingArgument",option);
01013 if (IsGeometry(argv[i]) == MagickFalse)
01014 ThrowCompositeInvalidArgumentException(option,argv[i]);
01015 (void) CloneString(&composite_options.geometry,argv[i]);
01016 break;
01017 }
01018 if (LocaleCompare("gravity",option+1) == 0)
01019 {
01020 long
01021 gravity;
01022
01023 composite_options.gravity=UndefinedGravity;
01024 if (*option == '+')
01025 break;
01026 i++;
01027 if (i == (long) argc)
01028 ThrowCompositeException(OptionError,"MissingArgument",option);
01029 gravity=ParseMagickOption(MagickGravityOptions,MagickFalse,
01030 argv[i]);
01031 if (gravity < 0)
01032 ThrowCompositeException(OptionError,"UnrecognizedGravityType",
01033 argv[i]);
01034 composite_options.gravity=(GravityType) gravity;
01035 break;
01036 }
01037 if (LocaleCompare("green-primary",option+1) == 0)
01038 {
01039 if (*option == '+')
01040 break;
01041 i++;
01042 if (i == (long) argc)
01043 ThrowCompositeException(OptionError,"MissingArgument",option);
01044 if (IsGeometry(argv[i]) == MagickFalse)
01045 ThrowCompositeInvalidArgumentException(option,argv[i]);
01046 break;
01047 }
01048 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01049 }
01050 case 'h':
01051 {
01052 if ((LocaleCompare("help",option+1) == 0) ||
01053 (LocaleCompare("-help",option+1) == 0))
01054 return(CompositeUsage());
01055 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01056 }
01057 case 'i':
01058 {
01059 if (LocaleCompare("identify",option+1) == 0)
01060 break;
01061 if (LocaleCompare("interlace",option+1) == 0)
01062 {
01063 long
01064 interlace;
01065
01066 if (*option == '+')
01067 break;
01068 i++;
01069 if (i == (long) argc)
01070 ThrowCompositeException(OptionError,"MissingArgument",option);
01071 interlace=ParseMagickOption(MagickInterlaceOptions,MagickFalse,
01072 argv[i]);
01073 if (interlace < 0)
01074 ThrowCompositeException(OptionError,
01075 "UnrecognizedInterlaceType",argv[i]);
01076 break;
01077 }
01078 if (LocaleCompare("interpolate",option+1) == 0)
01079 {
01080 long
01081 interpolate;
01082
01083 if (*option == '+')
01084 break;
01085 i++;
01086 if (i == (long) argc)
01087 ThrowCompositeException(OptionError,"MissingArgument",option);
01088 interpolate=ParseMagickOption(MagickInterpolateOptions,MagickFalse,
01089 argv[i]);
01090 if (interpolate < 0)
01091 ThrowCompositeException(OptionError,
01092 "UnrecognizedInterpolateMethod",argv[i]);
01093 break;
01094 }
01095 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01096 }
01097 case 'l':
01098 {
01099 if (LocaleCompare("label",option+1) == 0)
01100 {
01101 if (*option == '+')
01102 break;
01103 i++;
01104 if (i == (long) argc)
01105 ThrowCompositeException(OptionError,"MissingArgument",option);
01106 break;
01107 }
01108 if (LocaleCompare("limit",option+1) == 0)
01109 {
01110 char
01111 *p;
01112
01113 double
01114 value;
01115
01116 long
01117 resource;
01118
01119 if (*option == '+')
01120 break;
01121 i++;
01122 if (i == (long) argc)
01123 ThrowCompositeException(OptionError,"MissingArgument",option);
01124 resource=ParseMagickOption(MagickResourceOptions,MagickFalse,
01125 argv[i]);
01126 if (resource < 0)
01127 ThrowCompositeException(OptionError,"UnrecognizedResourceType",
01128 argv[i]);
01129 i++;
01130 if (i == (long) argc)
01131 ThrowCompositeException(OptionError,"MissingArgument",option);
01132 value=strtod(argv[i],&p);
01133 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
01134 ThrowCompositeInvalidArgumentException(option,argv[i]);
01135 break;
01136 }
01137 if (LocaleCompare("list",option+1) == 0)
01138 {
01139 long
01140 list;
01141
01142 if (*option == '+')
01143 break;
01144 i++;
01145 if (i == (long) argc)
01146 ThrowCompositeException(OptionError,"MissingArgument",option);
01147 list=ParseMagickOption(MagickListOptions,MagickFalse,argv[i]);
01148 if (list < 0)
01149 ThrowCompositeException(OptionError,"UnrecognizedListType",
01150 argv[i]);
01151 (void) MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
01152 argv+j,exception);
01153 DestroyComposite();
01154 return(MagickTrue);
01155 }
01156 if (LocaleCompare("log",option+1) == 0)
01157 {
01158 if (*option == '+')
01159 break;
01160 i++;
01161 if ((i == (long) argc) || (strchr(argv[i],'%') == (char *) NULL))
01162 ThrowCompositeException(OptionError,"MissingArgument",option);
01163 break;
01164 }
01165 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01166 }
01167 case 'm':
01168 {
01169 if (LocaleCompare("matte",option+1) == 0)
01170 break;
01171 if (LocaleCompare("monitor",option+1) == 0)
01172 break;
01173 if (LocaleCompare("monochrome",option+1) == 0)
01174 break;
01175 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01176 }
01177 case 'n':
01178 {
01179 if (LocaleCompare("negate",option+1) == 0)
01180 break;
01181 if (LocaleCompare("noop",option+1) == 0)
01182 break;
01183 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01184 }
01185 case 'p':
01186 {
01187 if (LocaleCompare("page",option+1) == 0)
01188 {
01189 if (*option == '+')
01190 break;
01191 i++;
01192 if (i == (long) argc)
01193 ThrowCompositeException(OptionError,"MissingArgument",option);
01194 break;
01195 }
01196 if (LocaleCompare("pointsize",option+1) == 0)
01197 {
01198 if (*option == '+')
01199 break;
01200 i++;
01201 if (i == (long) (argc-1))
01202 ThrowCompositeException(OptionError,"MissingArgument",option);
01203 if (IsGeometry(argv[i]) == MagickFalse)
01204 ThrowCompositeInvalidArgumentException(option,argv[i]);
01205 break;
01206 }
01207 if (LocaleCompare("process",option+1) == 0)
01208 {
01209 if (*option == '+')
01210 break;
01211 i++;
01212 if (i == (long) argc)
01213 ThrowCompositeException(OptionError,"MissingArgument",option);
01214 break;
01215 }
01216 if (LocaleCompare("profile",option+1) == 0)
01217 {
01218 i++;
01219 if (i == (long) argc)
01220 ThrowCompositeException(OptionError,"MissingArgument",option);
01221 break;
01222 }
01223 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01224 }
01225 case 'q':
01226 {
01227 if (LocaleCompare("quality",option+1) == 0)
01228 {
01229 if (*option == '+')
01230 break;
01231 i++;
01232 if (i == (long) argc)
01233 ThrowCompositeException(OptionError,"MissingArgument",option);
01234 if (IsGeometry(argv[i]) == MagickFalse)
01235 ThrowCompositeInvalidArgumentException(option,argv[i]);
01236 break;
01237 }
01238 if (LocaleCompare("quantize",option+1) == 0)
01239 {
01240 long
01241 colorspace;
01242
01243 if (*option == '+')
01244 break;
01245 i++;
01246 if (i == (long) (argc-1))
01247 ThrowCompositeException(OptionError,"MissingArgument",option);
01248 colorspace=ParseMagickOption(MagickColorspaceOptions,
01249 MagickFalse,argv[i]);
01250 if (colorspace < 0)
01251 ThrowCompositeException(OptionError,"UnrecognizedColorspace",
01252 argv[i]);
01253 break;
01254 }
01255 if (LocaleCompare("quiet",option+1) == 0)
01256 break;
01257 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01258 }
01259 case 'r':
01260 {
01261 if (LocaleCompare("red-primary",option+1) == 0)
01262 {
01263 if (*option == '+')
01264 break;
01265 i++;
01266 if (i == (long) argc)
01267 ThrowCompositeException(OptionError,"MissingArgument",option);
01268 if (IsGeometry(argv[i]) == MagickFalse)
01269 ThrowCompositeInvalidArgumentException(option,argv[i]);
01270 break;
01271 }
01272 if (LocaleCompare("regard-warnings",option+1) == 0)
01273 break;
01274 if (LocaleCompare("render",option+1) == 0)
01275 break;
01276 if (LocaleCompare("repage",option+1) == 0)
01277 {
01278 if (*option == '+')
01279 break;
01280 i++;
01281 if (i == (long) argc)
01282 ThrowCompositeException(OptionError,"MissingArgument",option);
01283 if (IsGeometry(argv[i]) == MagickFalse)
01284 ThrowCompositeInvalidArgumentException(option,argv[i]);
01285 break;
01286 }
01287 if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
01288 {
01289 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
01290 break;
01291 }
01292 if (LocaleCompare("resize",option+1) == 0)
01293 {
01294 if (*option == '+')
01295 break;
01296 i++;
01297 if (i == (long) argc)
01298 ThrowCompositeException(OptionError,"MissingArgument",option);
01299 if (IsGeometry(argv[i]) == MagickFalse)
01300 ThrowCompositeInvalidArgumentException(option,argv[i]);
01301 break;
01302 }
01303 if (LocaleCompare("rotate",option+1) == 0)
01304 {
01305 i++;
01306 if (i == (long) argc)
01307 ThrowCompositeException(OptionError,"MissingArgument",option);
01308 if (IsGeometry(argv[i]) == MagickFalse)
01309 ThrowCompositeInvalidArgumentException(option,argv[i]);
01310 break;
01311 }
01312 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01313 }
01314 case 's':
01315 {
01316 if (LocaleCompare("sampling-factor",option+1) == 0)
01317 {
01318 if (*option == '+')
01319 break;
01320 i++;
01321 if (i == (long) argc)
01322 ThrowCompositeException(OptionError,"MissingArgument",option);
01323 if (IsGeometry(argv[i]) == MagickFalse)
01324 ThrowCompositeInvalidArgumentException(option,argv[i]);
01325 break;
01326 }
01327 if (LocaleCompare("scene",option+1) == 0)
01328 {
01329 if (*option == '+')
01330 break;
01331 i++;
01332 if (i == (long) argc)
01333 ThrowCompositeException(OptionError,"MissingArgument",option);
01334 if (IsGeometry(argv[i]) == MagickFalse)
01335 ThrowCompositeInvalidArgumentException(option,argv[i]);
01336 break;
01337 }
01338 if (LocaleCompare("seed",option+1) == 0)
01339 {
01340 if (*option == '+')
01341 break;
01342 i++;
01343 if (i == (long) (argc-1))
01344 ThrowCompositeException(OptionError,"MissingArgument",option);
01345 if (IsGeometry(argv[i]) == MagickFalse)
01346 ThrowCompositeInvalidArgumentException(option,argv[i]);
01347 break;
01348 }
01349 if (LocaleCompare("sharpen",option+1) == 0)
01350 {
01351 i++;
01352 if (i == (long) argc)
01353 ThrowCompositeException(OptionError,"MissingArgument",option);
01354 if (IsGeometry(argv[i]) == MagickFalse)
01355 ThrowCompositeInvalidArgumentException(option,argv[i]);
01356 break;
01357 }
01358 if (LocaleCompare("shave",option+1) == 0)
01359 {
01360 if (*option == '+')
01361 break;
01362 i++;
01363 if (i == (long) (argc-1))
01364 ThrowCompositeException(OptionError,"MissingArgument",option);
01365 if (IsGeometry(argv[i]) == MagickFalse)
01366 ThrowCompositeInvalidArgumentException(option,argv[i]);
01367 break;
01368 }
01369 if (LocaleCompare("size",option+1) == 0)
01370 {
01371 if (*option == '+')
01372 break;
01373 i++;
01374 if (i == (long) argc)
01375 ThrowCompositeException(OptionError,"MissingArgument",option);
01376 if (IsGeometry(argv[i]) == MagickFalse)
01377 ThrowCompositeInvalidArgumentException(option,argv[i]);
01378 break;
01379 }
01380 if (LocaleCompare("stegano",option+1) == 0)
01381 {
01382 composite_options.stegano=0;
01383 if (*option == '+')
01384 break;
01385 i++;
01386 if (i == (long) argc)
01387 ThrowCompositeException(OptionError,"MissingArgument",option);
01388 if (IsGeometry(argv[i]) == MagickFalse)
01389 ThrowCompositeInvalidArgumentException(option,argv[i]);
01390 composite_options.stegano=atol(argv[i])+1;
01391 break;
01392 }
01393 if (LocaleCompare("stereo",option+1) == 0)
01394 {
01395 MagickStatusType
01396 flags;
01397
01398 composite_options.stereo=MagickFalse;
01399 if (*option == '+')
01400 break;
01401 i++;
01402 if (i == (long) argc)
01403 ThrowCompositeException(OptionError,"MissingArgument",option);
01404 if (IsGeometry(argv[i]) == MagickFalse)
01405 ThrowCompositeInvalidArgumentException(option,argv[i]);
01406 flags=ParseAbsoluteGeometry(argv[i],&composite_options.offset);
01407 if ((flags & YValue) == 0)
01408 composite_options.offset.y=composite_options.offset.x;
01409 composite_options.stereo=MagickTrue;
01410 break;
01411 }
01412 if (LocaleCompare("strip",option+1) == 0)
01413 break;
01414 if (LocaleCompare("support",option+1) == 0)
01415 {
01416 i++;
01417 break;
01418 }
01419 if (LocaleCompare("swap",option+1) == 0)
01420 {
01421 if (*option == '+')
01422 break;
01423 i++;
01424 if (i == (long) (argc-1))
01425 ThrowCompositeException(OptionError,"MissingArgument",option);
01426 if (IsGeometry(argv[i]) == MagickFalse)
01427 ThrowCompositeInvalidArgumentException(option,argv[i]);
01428 break;
01429 }
01430 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01431 }
01432 case 't':
01433 {
01434 if (LocaleCompare("thumbnail",option+1) == 0)
01435 {
01436 if (*option == '+')
01437 break;
01438 i++;
01439 if (i == (long) argc)
01440 ThrowCompositeException(OptionError,"MissingArgument",option);
01441 if (IsGeometry(argv[i]) == MagickFalse)
01442 ThrowCompositeInvalidArgumentException(option,argv[i]);
01443 break;
01444 }
01445 if (LocaleCompare("tile",option+1) == 0)
01446 {
01447 composite_options.tile=(*option == '-') ? MagickTrue : MagickFalse;
01448 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
01449 break;
01450 }
01451 if (LocaleCompare("transform",option+1) == 0)
01452 break;
01453 if (LocaleCompare("transparent-color",option+1) == 0)
01454 {
01455 if (*option == '+')
01456 break;
01457 i++;
01458 if (i == (long) (argc-1))
01459 ThrowCompositeException(OptionError,"MissingArgument",option);
01460 break;
01461 }
01462 if (LocaleCompare("treedepth",option+1) == 0)
01463 {
01464 if (*option == '+')
01465 break;
01466 i++;
01467 if (i == (long) argc)
01468 ThrowCompositeException(OptionError,"MissingArgument",option);
01469 if (IsGeometry(argv[i]) == MagickFalse)
01470 ThrowCompositeInvalidArgumentException(option,argv[i]);
01471 break;
01472 }
01473 if (LocaleCompare("type",option+1) == 0)
01474 {
01475 long
01476 type;
01477
01478 if (*option == '+')
01479 break;
01480 i++;
01481 if (i == (long) argc)
01482 ThrowCompositeException(OptionError,"MissingArgument",option);
01483 type=ParseMagickOption(MagickTypeOptions,MagickFalse,argv[i]);
01484 if (type < 0)
01485 ThrowCompositeException(OptionError,"UnrecognizedImageType",
01486 argv[i]);
01487 break;
01488 }
01489 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01490 }
01491 case 'u':
01492 {
01493 if (LocaleCompare("units",option+1) == 0)
01494 {
01495 long
01496 units;
01497
01498 if (*option == '+')
01499 break;
01500 i++;
01501 if (i == (long) argc)
01502 ThrowCompositeException(OptionError,"MissingArgument",option);
01503 units=ParseMagickOption(MagickResolutionOptions,MagickFalse,
01504 argv[i]);
01505 if (units < 0)
01506 ThrowCompositeException(OptionError,"UnrecognizedUnitsType",
01507 argv[i]);
01508 break;
01509 }
01510 if (LocaleCompare("unsharp",option+1) == 0)
01511 {
01512 (void) CloneString(&composite_options.compose_args,(char *) NULL);
01513 if (*option == '+')
01514 break;
01515 i++;
01516 if (i == (long) argc)
01517 ThrowCompositeException(OptionError,"MissingArgument",option);
01518 if (IsGeometry(argv[i]) == MagickFalse)
01519 ThrowCompositeInvalidArgumentException(option,argv[i]);
01520 (void) CloneString(&composite_options.compose_args,argv[i]);
01521 composite_options.compose=ThresholdCompositeOp;
01522 break;
01523 }
01524 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01525 }
01526 case 'v':
01527 {
01528 if (LocaleCompare("verbose",option+1) == 0)
01529 break;
01530 if ((LocaleCompare("version",option+1) == 0) ||
01531 (LocaleCompare("-version",option+1) == 0))
01532 {
01533 (void) fprintf(stdout,"Version: %s\n",
01534 GetMagickVersion((unsigned long *) NULL));
01535 (void) fprintf(stdout,"Copyright: %s\n",GetMagickCopyright());
01536 (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
01537 break;
01538 }
01539 if (LocaleCompare("virtual-pixel",option+1) == 0)
01540 {
01541 long
01542 method;
01543
01544 if (*option == '+')
01545 break;
01546 i++;
01547 if (i == (long) argc)
01548 ThrowCompositeException(OptionError,"MissingArgument",option);
01549 method=ParseMagickOption(MagickVirtualPixelOptions,MagickFalse,
01550 argv[i]);
01551 if (method < 0)
01552 ThrowCompositeException(OptionError,
01553 "UnrecognizedVirtualPixelMethod",argv[i]);
01554 break;
01555 }
01556 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01557 }
01558 case 'w':
01559 {
01560 if (LocaleCompare("watermark",option+1) == 0)
01561 {
01562 (void) CloneString(&composite_options.compose_args,(char *) NULL);
01563 if (*option == '+')
01564 break;
01565 i++;
01566 if (i == (long) argc)
01567 ThrowCompositeException(OptionError,"MissingArgument",option);
01568 if (IsGeometry(argv[i]) == MagickFalse)
01569 ThrowCompositeInvalidArgumentException(option,argv[i]);
01570 (void) CloneString(&composite_options.compose_args,argv[i]);
01571 composite_options.compose=ModulateCompositeOp;
01572 break;
01573 }
01574 if (LocaleCompare("white-point",option+1) == 0)
01575 {
01576 if (*option == '+')
01577 break;
01578 i++;
01579 if (i == (long) argc)
01580 ThrowCompositeException(OptionError,"MissingArgument",option);
01581 if (IsGeometry(argv[i]) == MagickFalse)
01582 ThrowCompositeInvalidArgumentException(option,argv[i]);
01583 break;
01584 }
01585 if (LocaleCompare("write",option+1) == 0)
01586 {
01587 i++;
01588 if (i == (long) argc)
01589 ThrowCompositeException(OptionError,"MissingArgument",option);
01590 break;
01591 }
01592 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01593 }
01594 case '?':
01595 break;
01596 default:
01597 ThrowCompositeException(OptionError,"UnrecognizedOption",option)
01598 }
01599 fire=ParseMagickOption(MagickImageListOptions,MagickFalse,option+1) < 0 ?
01600 MagickFalse : MagickTrue;
01601 if (fire != MagickFalse)
01602 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
01603 }
01604 if (k != 0)
01605 ThrowCompositeException(OptionError,"UnbalancedParenthesis",argv[i]);
01606 if (i-- != (long) (argc-1))
01607 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[i]);
01608 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
01609 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]);
01610 FinalizeImageSettings(image_info,image,MagickTrue);
01611 if ((image == (Image *) NULL) || (GetImageListLength(image) < 2))
01612 ThrowCompositeException(OptionError,"MissingAnImageFilename",argv[argc-1]);
01613
01614
01615
01616 RemoveImageStack(composite_image);
01617 RemoveImageStack(images);
01618 (void) TransformImage(&composite_image,(char *) NULL,
01619 composite_image->geometry);
01620 RemoveImageStack(mask_image);
01621 if (mask_image != (Image *) NULL)
01622 {
01623 if ((composite_options.compose == DisplaceCompositeOp) ||
01624 (composite_options.compose == DistortCompositeOp))
01625 {
01626
01627
01628
01629 (void) CompositeImage(composite_image,CopyGreenCompositeOp,mask_image,
01630 0,0);
01631 mask_image=DestroyImage(mask_image);
01632 }
01633 else
01634 {
01635
01636
01637
01638 images->mask=mask_image;
01639 (void) NegateImage(images->mask,MagickFalse);
01640 }
01641 }
01642 status&=CompositeImageList(image_info,&images,composite_image,
01643 &composite_options,exception);
01644 composite_image=DestroyImage(composite_image);
01645
01646
01647
01648 status&=WriteImages(image_info,images,argv[argc-1],exception);
01649 if (metadata != (char **) NULL)
01650 {
01651 char
01652 *text;
01653
01654 text=InterpretImageProperties(image_info,images,format);
01655 if (text == (char *) NULL)
01656 ThrowCompositeException(ResourceLimitError,"MemoryAllocationFailed",
01657 GetExceptionMessage(errno));
01658 (void) ConcatenateString(&(*metadata),text);
01659 (void) ConcatenateString(&(*metadata),"\n");
01660 text=DestroyString(text);
01661 }
01662 images=DestroyImage(images);
01663 RelinquishCompositeOptions(&composite_options);
01664 DestroyComposite();
01665 return(status != 0 ? MagickTrue : MagickFalse);
01666 }