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