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