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