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

Generated on 19 Nov 2009 for MagickWand by  doxygen 1.6.1