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