mogrify.c revision 3884f69ac6f82e16fc379fb6c6521960c19045a2
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%              M   M   OOO   GGGGG  RRRR   IIIII  FFFFF  Y   Y                %
7%              MM MM  O   O  G      R   R    I    F       Y Y                 %
8%              M M M  O   O  G GGG  RRRR     I    FFF      Y                  %
9%              M   M  O   O  G   G  R R      I    F        Y                  %
10%              M   M   OOO   GGGG   R  R   IIIII  F        Y                  %
11%                                                                             %
12%                                                                             %
13%                         MagickWand Module Methods                           %
14%                                                                             %
15%                              Software Design                                %
16%                                John Cristy                                  %
17%                                March 2000                                   %
18%                                                                             %
19%                                                                             %
20%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
21%  dedicated to making software imaging solutions freely available.           %
22%                                                                             %
23%  You may not use this file except in compliance with the License.  You may  %
24%  obtain a copy of the License at                                            %
25%                                                                             %
26%    http://www.imagemagick.org/script/license.php                            %
27%                                                                             %
28%  Unless required by applicable law or agreed to in writing, software        %
29%  distributed under the License is distributed on an "AS IS" BASIS,          %
30%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31%  See the License for the specific language governing permissions and        %
32%  limitations under the License.                                             %
33%                                                                             %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%  Use the mogrify program to resize an image, blur, crop, despeckle, dither,
37%  draw on, flip, join, re-sample, and much more. This tool is similiar to
38%  convert except that the original image file is overwritten (unless you
39%  change the file suffix with the -format option) with any changes you
40%  request.
41%
42*/
43
44/*
45  Include declarations.
46*/
47#include "MagickWand/studio.h"
48#include "MagickWand/MagickWand.h"
49#include "MagickWand/mogrify-private.h"
50#undef DegreesToRadians
51#undef RadiansToDegrees
52#include "MagickCore/image-private.h"
53#include "MagickCore/monitor-private.h"
54#include "MagickCore/thread-private.h"
55#include "MagickCore/string-private.h"
56
57/*
58  Define declarations.
59*/
60#define UndefinedCompressionQuality  0UL
61
62/*
63%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64%                                                                             %
65%                                                                             %
66%                                                                             %
67%     M a g i c k C o m m a n d G e n e s i s                                 %
68%                                                                             %
69%                                                                             %
70%                                                                             %
71%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
72%
73%  MagickCommandGenesis() applies image processing options to an image as
74%  prescribed by command line options.
75%
76%  The format of the MagickCommandGenesis method is:
77%
78%      MagickBooleanType MagickCommandGenesis(ImageInfo *image_info,
79%        MagickCommand command,int argc,char **argv,char **metadata,
80%        ExceptionInfo *exception)
81%
82%  A description of each parameter follows:
83%
84%    o image_info: the image info.
85%
86%    o command: Choose from ConvertImageCommand, IdentifyImageCommand,
87%      MogrifyImageCommand, CompositeImageCommand, CompareImagesCommand,
88%      ConjureImageCommand, StreamImageCommand, ImportImageCommand,
89%      DisplayImageCommand, or AnimateImageCommand.
90%
91%    o argc: Specifies a pointer to an integer describing the number of
92%      elements in the argument vector.
93%
94%    o argv: Specifies a pointer to a text array containing the command line
95%      arguments.
96%
97%    o metadata: any metadata is returned here.
98%
99%    o exception: return any errors or warnings in this structure.
100%
101*/
102WandExport MagickBooleanType MagickCommandGenesis(ImageInfo *image_info,
103  MagickCommand command,int argc,char **argv,char **metadata,
104  ExceptionInfo *exception)
105{
106  char
107    *option;
108
109  double
110    duration,
111    elapsed_time,
112    user_time;
113
114  MagickBooleanType
115    concurrent,
116    regard_warnings,
117    status;
118
119  register ssize_t
120    i;
121
122  TimerInfo
123    *timer;
124
125  size_t
126    iterations;
127
128  (void) setlocale(LC_ALL,"");
129  (void) setlocale(LC_NUMERIC,"C");
130  concurrent=MagickFalse;
131  duration=(-1.0);
132  iterations=1;
133  status=MagickFalse;
134  regard_warnings=MagickFalse;
135  for (i=1; i < (ssize_t) (argc-1); i++)
136  {
137    option=argv[i];
138    if ((strlen(option) == 1) || ((*option != '-') && (*option != '+')))
139      continue;
140    if (LocaleCompare("bench",option+1) == 0)
141      iterations=StringToUnsignedLong(argv[++i]);
142    if (LocaleCompare("concurrent",option+1) == 0)
143      concurrent=MagickTrue;
144    if (LocaleCompare("debug",option+1) == 0)
145      (void) SetLogEventMask(argv[++i]);
146    if (LocaleCompare("duration",option+1) == 0)
147      duration=InterpretLocaleValue(argv[++i],(char **) NULL);
148    if (LocaleCompare("regard-warnings",option+1) == 0)
149      regard_warnings=MagickTrue;
150  }
151  timer=AcquireTimerInfo();
152  if (concurrent == MagickFalse)
153    {
154      for (i=0; i < (ssize_t) iterations; i++)
155      {
156        if (status != MagickFalse)
157          continue;
158        if (duration > 0)
159          {
160            if (GetElapsedTime(timer) > duration)
161              continue;
162            (void) ContinueTimer(timer);
163          }
164        status=command(image_info,argc,argv,metadata,exception);
165        if (exception->severity != UndefinedException)
166          {
167            if ((exception->severity > ErrorException) ||
168                (regard_warnings != MagickFalse))
169              status=MagickTrue;
170            CatchException(exception);
171          }
172        if ((metadata != (char **) NULL) && (*metadata != (char *) NULL))
173          {
174            (void) fputs(*metadata,stdout);
175            (void) fputc('\n',stdout);
176            *metadata=DestroyString(*metadata);
177          }
178      }
179    }
180  else
181    {
182      SetOpenMPNested(1);
183#if defined(MAGICKCORE_OPENMP_SUPPORT)
184  # pragma omp parallel for shared(status)
185#endif
186      for (i=0; i < (ssize_t) iterations; i++)
187      {
188        if (status != MagickFalse)
189          continue;
190        if (duration > 0)
191          {
192            if (GetElapsedTime(timer) > duration)
193              continue;
194            (void) ContinueTimer(timer);
195          }
196        status=command(image_info,argc,argv,metadata,exception);
197#if defined(MAGICKCORE_OPENMP_SUPPORT)
198  # pragma omp critical (MagickCore_CommandGenesis)
199#endif
200        {
201          if (exception->severity != UndefinedException)
202            {
203              if ((exception->severity > ErrorException) ||
204                  (regard_warnings != MagickFalse))
205                status=MagickTrue;
206              CatchException(exception);
207            }
208          if ((metadata != (char **) NULL) && (*metadata != (char *) NULL))
209            {
210              (void) fputs(*metadata,stdout);
211              (void) fputc('\n',stdout);
212              *metadata=DestroyString(*metadata);
213            }
214        }
215      }
216    }
217  if (iterations > 1)
218    {
219      elapsed_time=GetElapsedTime(timer);
220      user_time=GetUserTime(timer);
221      (void) FormatLocaleFile(stderr,
222        "Performance: %.20gi %gips %0.3fu %.20g:%02g.%03g\n",(double)
223        iterations,1.0*iterations/elapsed_time,user_time,(double)
224        (elapsed_time/60.0),floor(fmod(elapsed_time,60.0)),(double)
225        (1000.0*(elapsed_time-floor(elapsed_time))));
226      (void) fflush(stderr);
227    }
228  timer=DestroyTimerInfo(timer);
229  return(status);
230}
231
232/*
233%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
234%                                                                             %
235%                                                                             %
236%                                                                             %
237+     M o g r i f y I m a g e                                                 %
238%                                                                             %
239%                                                                             %
240%                                                                             %
241%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242%
243%  MogrifyImage() applies simple single image processing options to a single
244%  image that may be part of a large list, but also handles any 'region'
245%  image handling.
246%
247%  The image in the list may be modified in three different ways...
248%
249%    * directly modified (EG: -negate, -gamma, -level, -annotate, -draw),
250%    * replaced by a new image (EG: -spread, -resize, -rotate, -morphology)
251%    * replace by a list of images (only the -separate option!)
252%
253%  In each case the result is returned into the list, and a pointer to the
254%  modified image (last image added if replaced by a list of images) is
255%  returned.
256%
257%  ASIDE: The -crop is present but restricted to non-tile single image crops
258%
259%  This means if all the images are being processed (such as by
260%  MogrifyImages(), next image to be processed will be as per the pointer
261%  (*image)->next.  Also the image list may grow as a result of some specific
262%  operations but as images are never merged or deleted, it will never shrink
263%  in length.  Typically the list will remain the same length.
264%
265%  WARNING: As the image pointed to may be replaced, the first image in the
266%  list may also change.  GetFirstImageInList() should be used by caller if
267%  they wish return the Image pointer to the first image in list.
268%
269%
270%  The format of the MogrifyImage method is:
271%
272%      MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
273%        const char **argv,Image **image)
274%
275%  A description of each parameter follows:
276%
277%    o image_info: the image info..
278%
279%    o argc: Specifies a pointer to an integer describing the number of
280%      elements in the argument vector.
281%
282%    o argv: Specifies a pointer to a text array containing the command line
283%      arguments.
284%
285%    o image: the image.
286%
287%    o exception: return any errors or warnings in this structure.
288%
289*/
290
291/*
292** GetImageCache() will read an image into a image cache if not already
293** present then return the image that is in the cache under that filename.
294*/
295static inline Image *GetImageCache(const ImageInfo *image_info,const char *path,
296  ExceptionInfo *exception)
297{
298  char
299    key[MaxTextExtent];
300
301  ExceptionInfo
302    *sans_exception;
303
304  Image
305    *image;
306
307  ImageInfo
308    *read_info;
309
310  (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",path);
311  sans_exception=AcquireExceptionInfo();
312  image=(Image *) GetImageRegistry(ImageRegistryType,key,sans_exception);
313  sans_exception=DestroyExceptionInfo(sans_exception);
314  if (image != (Image *) NULL)
315    return(image);
316  read_info=CloneImageInfo(image_info);
317  (void) CopyMagickString(read_info->filename,path,MaxTextExtent);
318  image=ReadImage(read_info,exception);
319  read_info=DestroyImageInfo(read_info);
320  if (image != (Image *) NULL)
321    (void) SetImageRegistry(ImageRegistryType,key,image,exception);
322  return(image);
323}
324
325static MagickBooleanType IsPathWritable(const char *path)
326{
327  if (IsPathAccessible(path) == MagickFalse)
328    return(MagickFalse);
329  if (access(path,W_OK) != 0)
330    return(MagickFalse);
331  return(MagickTrue);
332}
333
334static inline ssize_t MagickMax(const ssize_t x,const ssize_t y)
335{
336  if (x > y)
337    return(x);
338  return(y);
339}
340
341static MagickBooleanType MonitorProgress(const char *text,
342  const MagickOffsetType offset,const MagickSizeType extent,
343  void *wand_unused(client_data))
344{
345  char
346    message[MaxTextExtent],
347    tag[MaxTextExtent];
348
349  const char
350    *locale_message;
351
352  register char
353    *p;
354
355  if (extent < 2)
356    return(MagickTrue);
357  (void) CopyMagickMemory(tag,text,MaxTextExtent);
358  p=strrchr(tag,'/');
359  if (p != (char *) NULL)
360    *p='\0';
361  (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
362  locale_message=GetLocaleMessage(message);
363  if (locale_message == message)
364    locale_message=tag;
365  if (p == (char *) NULL)
366    (void) FormatLocaleFile(stderr,"%s: %ld of %lu, %02ld%% complete\r",
367      locale_message,(long) offset,(unsigned long) extent,(long)
368      (100L*offset/(extent-1)));
369  else
370    (void) FormatLocaleFile(stderr,"%s[%s]: %ld of %lu, %02ld%% complete\r",
371      locale_message,p+1,(long) offset,(unsigned long) extent,(long)
372      (100L*offset/(extent-1)));
373  if (offset == (MagickOffsetType) (extent-1))
374    (void) FormatLocaleFile(stderr,"\n");
375  (void) fflush(stderr);
376  return(MagickTrue);
377}
378
379/*
380** SparseColorOption() parses the complex -sparse-color argument into an
381** an array of floating point values then calls SparseColorImage().
382** Argument is a complex mix of floating-point pixel coodinates, and color
383** specifications (or direct floating point numbers).  The number of floats
384** needed to represent a color varies depending on the current channel
385** setting.
386*/
387static Image *SparseColorOption(const Image *image,
388  const SparseColorMethod method,const char *arguments,
389  const MagickBooleanType color_from_image,ExceptionInfo *exception)
390{
391  char
392    token[MaxTextExtent];
393
394  const char
395    *p;
396
397  double
398    *sparse_arguments;
399
400  Image
401    *sparse_image;
402
403  PixelInfo
404    color;
405
406  MagickBooleanType
407    error;
408
409  register size_t
410    x;
411
412  size_t
413    number_arguments,
414    number_colors;
415
416  assert(image != (Image *) NULL);
417  assert(image->signature == MagickSignature);
418  if (image->debug != MagickFalse)
419    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
420  assert(exception != (ExceptionInfo *) NULL);
421  assert(exception->signature == MagickSignature);
422  /*
423    Limit channels according to image - and add up number of color channel.
424  */
425  number_colors=0;
426  if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
427    number_colors++;
428  if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
429    number_colors++;
430  if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
431    number_colors++;
432  if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
433      (image->colorspace == CMYKColorspace))
434    number_colors++;
435  if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
436      (image->matte != MagickFalse))
437    number_colors++;
438
439  /*
440    Read string, to determine number of arguments needed,
441  */
442  p=arguments;
443  x=0;
444  while( *p != '\0' )
445  {
446    GetMagickToken(p,&p,token);
447    if ( token[0] == ',' ) continue;
448    if ( isalpha((int) token[0]) || token[0] == '#' ) {
449      if ( color_from_image ) {
450        (void) ThrowMagickException(exception,GetMagickModule(),
451            OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
452            "Color arg given, when colors are coming from image");
453        return( (Image *)NULL);
454      }
455      x += number_colors;  /* color argument */
456    }
457    else {
458      x++;   /* floating point argument */
459    }
460  }
461  error=MagickTrue;
462  if ( color_from_image ) {
463    /* just the control points are being given */
464    error = ( x % 2 != 0 ) ? MagickTrue : MagickFalse;
465    number_arguments=(x/2)*(2+number_colors);
466  }
467  else {
468    /* control points and color values */
469    error = ( x % (2+number_colors) != 0 ) ? MagickTrue : MagickFalse;
470    number_arguments=x;
471  }
472  if ( error ) {
473    (void) ThrowMagickException(exception,GetMagickModule(),
474               OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
475               "Invalid number of Arguments");
476    return( (Image *)NULL);
477  }
478
479  /* Allocate and fill in the floating point arguments */
480  sparse_arguments=(double *) AcquireQuantumMemory(number_arguments,
481    sizeof(*sparse_arguments));
482  if (sparse_arguments == (double *) NULL) {
483    (void) ThrowMagickException(exception,GetMagickModule(),ResourceLimitError,
484      "MemoryAllocationFailed","%s","SparseColorOption");
485    return( (Image *)NULL);
486  }
487  (void) ResetMagickMemory(sparse_arguments,0,number_arguments*
488    sizeof(*sparse_arguments));
489  p=arguments;
490  x=0;
491  while( *p != '\0' && x < number_arguments ) {
492    /* X coordinate */
493    token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
494    if ( token[0] == '\0' ) break;
495    if ( isalpha((int) token[0]) || token[0] == '#' ) {
496      (void) ThrowMagickException(exception,GetMagickModule(),
497            OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
498            "Color found, instead of X-coord");
499      error = MagickTrue;
500      break;
501    }
502    sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
503    /* Y coordinate */
504    token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
505    if ( token[0] == '\0' ) break;
506    if ( isalpha((int) token[0]) || token[0] == '#' ) {
507      (void) ThrowMagickException(exception,GetMagickModule(),
508            OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
509            "Color found, instead of Y-coord");
510      error = MagickTrue;
511      break;
512    }
513    sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
514    /* color values for this control point */
515#if 0
516    if ( (color_from_image ) {
517      /* get color from image */
518      /* HOW??? */
519    }
520    else
521#endif
522    {
523      /* color name or function given in string argument */
524      token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
525      if ( token[0] == '\0' ) break;
526      if ( isalpha((int) token[0]) || token[0] == '#' ) {
527        /* Color string given */
528        (void) QueryMagickColor(token,&color,exception);
529        if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
530          sparse_arguments[x++] = QuantumScale*color.red;
531        if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
532          sparse_arguments[x++] = QuantumScale*color.green;
533        if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
534          sparse_arguments[x++] = QuantumScale*color.blue;
535        if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
536            (image->colorspace == CMYKColorspace))
537          sparse_arguments[x++] = QuantumScale*color.black;
538        if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
539            (image->matte != MagickFalse))
540          sparse_arguments[x++] = QuantumScale*color.alpha;
541      }
542      else {
543        /* Colors given as a set of floating point values - experimental */
544        /* NB: token contains the first floating point value to use! */
545        if ((GetPixelRedTraits(image) & ActivePixelTrait) != 0)
546          {
547          while ( token[0] == ',' ) GetMagickToken(p,&p,token);
548          if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
549            break;
550          sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
551          token[0] = ','; /* used this token - get another */
552        }
553        if ((GetPixelGreenTraits(image) & ActivePixelTrait) != 0)
554          {
555          while ( token[0] == ',' ) GetMagickToken(p,&p,token);
556          if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
557            break;
558          sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
559          token[0] = ','; /* used this token - get another */
560        }
561        if ((GetPixelBlueTraits(image) & ActivePixelTrait) != 0)
562          {
563          while ( token[0] == ',' ) GetMagickToken(p,&p,token);
564          if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
565            break;
566          sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
567          token[0] = ','; /* used this token - get another */
568        }
569        if (((GetPixelBlackTraits(image) & ActivePixelTrait) != 0) &&
570            (image->colorspace == CMYKColorspace))
571          {
572          while ( token[0] == ',' ) GetMagickToken(p,&p,token);
573          if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
574            break;
575          sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
576          token[0] = ','; /* used this token - get another */
577        }
578        if (((GetPixelAlphaTraits(image) & ActivePixelTrait) != 0) &&
579            (image->matte != MagickFalse))
580          {
581          while ( token[0] == ',' ) GetMagickToken(p,&p,token);
582          if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
583            break;
584          sparse_arguments[x++]=InterpretLocaleValue(token,(char **) NULL);
585          token[0] = ','; /* used this token - get another */
586        }
587      }
588    }
589  }
590  if ( number_arguments != x && !error ) {
591    (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
592      "InvalidArgument","`%s': %s","sparse-color","Argument Parsing Error");
593    sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments);
594    return( (Image *)NULL);
595  }
596  if ( error )
597    return( (Image *)NULL);
598
599  /* Call the Interpolation function with the parsed arguments */
600  sparse_image=SparseColorImage(image,method,number_arguments,sparse_arguments,
601    exception);
602  sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments);
603  return( sparse_image );
604}
605
606WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
607  const char **argv,Image **image,ExceptionInfo *exception)
608{
609  ChannelType
610    channel;
611
612  const char
613    *format,
614    *option;
615
616  DrawInfo
617    *draw_info;
618
619  GeometryInfo
620    geometry_info;
621
622  Image
623    *region_image;
624
625  ImageInfo
626    *mogrify_info;
627
628  MagickStatusType
629    status;
630
631  PixelInfo
632    fill;
633
634  MagickStatusType
635    flags;
636
637  QuantizeInfo
638    *quantize_info;
639
640  RectangleInfo
641    geometry,
642    region_geometry;
643
644  register ssize_t
645    i;
646
647  /*
648    Initialize method variables.
649  */
650  assert(image_info != (const ImageInfo *) NULL);
651  assert(image_info->signature == MagickSignature);
652  assert(image != (Image **) NULL);
653  assert((*image)->signature == MagickSignature);
654  if ((*image)->debug != MagickFalse)
655    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
656  if (argc < 0)
657    return(MagickTrue);
658  mogrify_info=CloneImageInfo(image_info);
659  draw_info=CloneDrawInfo(mogrify_info,(DrawInfo *) NULL);
660  quantize_info=AcquireQuantizeInfo(mogrify_info);
661  SetGeometryInfo(&geometry_info);
662  GetPixelInfo(*image,&fill);
663  SetPixelInfoPacket(*image,&(*image)->background_color,&fill);
664  channel=mogrify_info->channel;
665  format=GetImageOption(mogrify_info,"format");
666  SetGeometry(*image,&region_geometry);
667  region_image=NewImageList();
668  /*
669    Transmogrify the image.
670  */
671  for (i=0; i < (ssize_t) argc; i++)
672  {
673    Image
674      *mogrify_image;
675
676    ssize_t
677      count;
678
679    option=argv[i];
680    if (IsCommandOption(option) == MagickFalse)
681      continue;
682    count=MagickMax(ParseCommandOption(MagickCommandOptions,MagickFalse,option),
683      0L);
684    if ((i+count) >= (ssize_t) argc)
685      break;
686    status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception);
687    mogrify_image=(Image *)NULL;
688    switch (*(option+1))
689    {
690      case 'a':
691      {
692        if (LocaleCompare("adaptive-blur",option+1) == 0)
693          {
694            /*
695              Adaptive blur image.
696            */
697            (void) SyncImageSettings(mogrify_info,*image);
698            flags=ParseGeometry(argv[i+1],&geometry_info);
699            if ((flags & SigmaValue) == 0)
700              geometry_info.sigma=1.0;
701            mogrify_image=AdaptiveBlurImage(*image,geometry_info.rho,
702              geometry_info.sigma,exception);
703            break;
704          }
705        if (LocaleCompare("adaptive-resize",option+1) == 0)
706          {
707            /*
708              Adaptive resize image.
709            */
710            (void) SyncImageSettings(mogrify_info,*image);
711            (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
712            mogrify_image=AdaptiveResizeImage(*image,geometry.width,
713              geometry.height,exception);
714            break;
715          }
716        if (LocaleCompare("adaptive-sharpen",option+1) == 0)
717          {
718            /*
719              Adaptive sharpen image.
720            */
721            (void) SyncImageSettings(mogrify_info,*image);
722            flags=ParseGeometry(argv[i+1],&geometry_info);
723            if ((flags & SigmaValue) == 0)
724              geometry_info.sigma=1.0;
725            mogrify_image=AdaptiveSharpenImage(*image,geometry_info.rho,
726              geometry_info.sigma,exception);
727            break;
728          }
729        if (LocaleCompare("affine",option+1) == 0)
730          {
731            /*
732              Affine matrix.
733            */
734            if (*option == '+')
735              {
736                GetAffineMatrix(&draw_info->affine);
737                break;
738              }
739            (void) ParseAffineGeometry(argv[i+1],&draw_info->affine,exception);
740            break;
741          }
742        if (LocaleCompare("alpha",option+1) == 0)
743          {
744            AlphaChannelType
745              alpha_type;
746
747            (void) SyncImageSettings(mogrify_info,*image);
748            alpha_type=(AlphaChannelType) ParseCommandOption(MagickAlphaOptions,
749              MagickFalse,argv[i+1]);
750            (void) SetImageAlphaChannel(*image,alpha_type);
751            InheritException(exception,&(*image)->exception);
752            break;
753          }
754        if (LocaleCompare("annotate",option+1) == 0)
755          {
756            char
757              *text,
758              geometry[MaxTextExtent];
759
760            /*
761              Annotate image.
762            */
763            (void) SyncImageSettings(mogrify_info,*image);
764            SetGeometryInfo(&geometry_info);
765            flags=ParseGeometry(argv[i+1],&geometry_info);
766            if ((flags & SigmaValue) == 0)
767              geometry_info.sigma=geometry_info.rho;
768            text=InterpretImageProperties(mogrify_info,*image,argv[i+2]);
769            InheritException(exception,&(*image)->exception);
770            if (text == (char *) NULL)
771              break;
772            (void) CloneString(&draw_info->text,text);
773            text=DestroyString(text);
774            (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f",
775              geometry_info.xi,geometry_info.psi);
776            (void) CloneString(&draw_info->geometry,geometry);
777            draw_info->affine.sx=cos(DegreesToRadians(
778              fmod(geometry_info.rho,360.0)));
779            draw_info->affine.rx=sin(DegreesToRadians(
780              fmod(geometry_info.rho,360.0)));
781            draw_info->affine.ry=(-sin(DegreesToRadians(
782              fmod(geometry_info.sigma,360.0))));
783            draw_info->affine.sy=cos(DegreesToRadians(
784              fmod(geometry_info.sigma,360.0)));
785            (void) AnnotateImage(*image,draw_info);
786            InheritException(exception,&(*image)->exception);
787            break;
788          }
789        if (LocaleCompare("antialias",option+1) == 0)
790          {
791            draw_info->stroke_antialias=(*option == '-') ? MagickTrue :
792              MagickFalse;
793            draw_info->text_antialias=(*option == '-') ? MagickTrue :
794              MagickFalse;
795            break;
796          }
797        if (LocaleCompare("auto-gamma",option+1) == 0)
798          {
799            /*
800              Auto Adjust Gamma of image based on its mean
801            */
802            (void) SyncImageSettings(mogrify_info,*image);
803            (void) AutoGammaImage(*image);
804            break;
805          }
806        if (LocaleCompare("auto-level",option+1) == 0)
807          {
808            /*
809              Perfectly Normalize (max/min stretch) the image
810            */
811            (void) SyncImageSettings(mogrify_info,*image);
812            (void) AutoLevelImage(*image);
813            break;
814          }
815        if (LocaleCompare("auto-orient",option+1) == 0)
816          {
817            (void) SyncImageSettings(mogrify_info,*image);
818            switch ((*image)->orientation)
819            {
820              case TopRightOrientation:
821              {
822                mogrify_image=FlopImage(*image,exception);
823                break;
824              }
825              case BottomRightOrientation:
826              {
827                mogrify_image=RotateImage(*image,180.0,exception);
828                break;
829              }
830              case BottomLeftOrientation:
831              {
832                mogrify_image=FlipImage(*image,exception);
833                break;
834              }
835              case LeftTopOrientation:
836              {
837                mogrify_image=TransposeImage(*image,exception);
838                break;
839              }
840              case RightTopOrientation:
841              {
842                mogrify_image=RotateImage(*image,90.0,exception);
843                break;
844              }
845              case RightBottomOrientation:
846              {
847                mogrify_image=TransverseImage(*image,exception);
848                break;
849              }
850              case LeftBottomOrientation:
851              {
852                mogrify_image=RotateImage(*image,270.0,exception);
853                break;
854              }
855              default:
856                break;
857            }
858            if (mogrify_image != (Image *) NULL)
859              mogrify_image->orientation=TopLeftOrientation;
860            break;
861          }
862        break;
863      }
864      case 'b':
865      {
866        if (LocaleCompare("black-threshold",option+1) == 0)
867          {
868            /*
869              Black threshold image.
870            */
871            (void) SyncImageSettings(mogrify_info,*image);
872            (void) BlackThresholdImage(*image,argv[i+1],exception);
873            InheritException(exception,&(*image)->exception);
874            break;
875          }
876        if (LocaleCompare("blue-shift",option+1) == 0)
877          {
878            /*
879              Blue shift image.
880            */
881            (void) SyncImageSettings(mogrify_info,*image);
882            geometry_info.rho=1.5;
883            if (*option == '-')
884              flags=ParseGeometry(argv[i+1],&geometry_info);
885            mogrify_image=BlueShiftImage(*image,geometry_info.rho,exception);
886            break;
887          }
888        if (LocaleCompare("blur",option+1) == 0)
889          {
890            /*
891              Gaussian blur image.
892            */
893            (void) SyncImageSettings(mogrify_info,*image);
894            flags=ParseGeometry(argv[i+1],&geometry_info);
895            if ((flags & SigmaValue) == 0)
896              geometry_info.sigma=1.0;
897            mogrify_image=BlurImage(*image,geometry_info.rho,
898              geometry_info.sigma,exception);
899            break;
900          }
901        if (LocaleCompare("border",option+1) == 0)
902          {
903            /*
904              Surround image with a border of solid color.
905            */
906            (void) SyncImageSettings(mogrify_info,*image);
907            flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
908            if ((flags & SigmaValue) == 0)
909              geometry.height=geometry.width;
910            mogrify_image=BorderImage(*image,&geometry,exception);
911            break;
912          }
913        if (LocaleCompare("bordercolor",option+1) == 0)
914          {
915            if (*option == '+')
916              {
917                (void) QueryColorDatabase(BorderColor,&draw_info->border_color,
918                  exception);
919                break;
920              }
921            (void) QueryColorDatabase(argv[i+1],&draw_info->border_color,
922              exception);
923            break;
924          }
925        if (LocaleCompare("box",option+1) == 0)
926          {
927            (void) QueryColorDatabase(argv[i+1],&draw_info->undercolor,
928              exception);
929            break;
930          }
931        if (LocaleCompare("brightness-contrast",option+1) == 0)
932          {
933            double
934              brightness,
935              contrast;
936
937            GeometryInfo
938              geometry_info;
939
940            MagickStatusType
941              flags;
942
943            /*
944              Brightness / contrast image.
945            */
946            (void) SyncImageSettings(mogrify_info,*image);
947            flags=ParseGeometry(argv[i+1],&geometry_info);
948            brightness=geometry_info.rho;
949            contrast=0.0;
950            if ((flags & SigmaValue) != 0)
951              contrast=geometry_info.sigma;
952            (void) BrightnessContrastImage(*image,brightness,contrast);
953            InheritException(exception,&(*image)->exception);
954            break;
955          }
956        break;
957      }
958      case 'c':
959      {
960        if (LocaleCompare("cdl",option+1) == 0)
961          {
962            char
963              *color_correction_collection;
964
965            /*
966              Color correct with a color decision list.
967            */
968            (void) SyncImageSettings(mogrify_info,*image);
969            color_correction_collection=FileToString(argv[i+1],~0,exception);
970            if (color_correction_collection == (char *) NULL)
971              break;
972            (void) ColorDecisionListImage(*image,color_correction_collection);
973            InheritException(exception,&(*image)->exception);
974            break;
975          }
976        if (LocaleCompare("channel",option+1) == 0)
977          {
978            if (*option == '+')
979              channel=DefaultChannels;
980            else
981              channel=(ChannelType) ParseChannelOption(argv[i+1]);
982            SetPixelComponentMap(*image,channel);
983            break;
984          }
985        if (LocaleCompare("charcoal",option+1) == 0)
986          {
987            /*
988              Charcoal image.
989            */
990            (void) SyncImageSettings(mogrify_info,*image);
991            flags=ParseGeometry(argv[i+1],&geometry_info);
992            if ((flags & SigmaValue) == 0)
993              geometry_info.sigma=1.0;
994            mogrify_image=CharcoalImage(*image,geometry_info.rho,
995              geometry_info.sigma,exception);
996            break;
997          }
998        if (LocaleCompare("chop",option+1) == 0)
999          {
1000            /*
1001              Chop the image.
1002            */
1003            (void) SyncImageSettings(mogrify_info,*image);
1004            (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
1005            mogrify_image=ChopImage(*image,&geometry,exception);
1006            break;
1007          }
1008        if (LocaleCompare("clamp",option+1) == 0)
1009          {
1010            /*
1011              Clamp image.
1012            */
1013            (void) SyncImageSettings(mogrify_info,*image);
1014            (void) ClampImage(*image);
1015            InheritException(exception,&(*image)->exception);
1016            break;
1017          }
1018        if (LocaleCompare("clip",option+1) == 0)
1019          {
1020            (void) SyncImageSettings(mogrify_info,*image);
1021            if (*option == '+')
1022              {
1023                (void) SetImageClipMask(*image,(Image *) NULL);
1024                InheritException(exception,&(*image)->exception);
1025                break;
1026              }
1027            (void) ClipImage(*image);
1028            InheritException(exception,&(*image)->exception);
1029            break;
1030          }
1031        if (LocaleCompare("clip-mask",option+1) == 0)
1032          {
1033            CacheView
1034              *mask_view;
1035
1036            Image
1037              *mask_image;
1038
1039            register Quantum
1040              *restrict q;
1041
1042            register ssize_t
1043              x;
1044
1045            ssize_t
1046              y;
1047
1048            (void) SyncImageSettings(mogrify_info,*image);
1049            if (*option == '+')
1050              {
1051                /*
1052                  Remove a mask.
1053                */
1054                (void) SetImageMask(*image,(Image *) NULL);
1055                InheritException(exception,&(*image)->exception);
1056                break;
1057              }
1058            /*
1059              Set the image mask.
1060              FUTURE: This Should Be a SetImageAlphaChannel() call, Or two.
1061            */
1062            mask_image=GetImageCache(mogrify_info,argv[i+1],exception);
1063            if (mask_image == (Image *) NULL)
1064              break;
1065            if (SetImageStorageClass(mask_image,DirectClass) == MagickFalse)
1066              return(MagickFalse);
1067            mask_view=AcquireCacheView(mask_image);
1068            for (y=0; y < (ssize_t) mask_image->rows; y++)
1069            {
1070              q=GetCacheViewAuthenticPixels(mask_view,0,y,mask_image->columns,1,
1071                exception);
1072              if (q == (const Quantum *) NULL)
1073                break;
1074              for (x=0; x < (ssize_t) mask_image->columns; x++)
1075              {
1076                if (mask_image->matte == MagickFalse)
1077                  SetPixelAlpha(mask_image,GetPixelIntensity(mask_image,q),q);
1078                SetPixelRed(mask_image,GetPixelAlpha(mask_image,q),q);
1079                SetPixelGreen(mask_image,GetPixelAlpha(mask_image,q),q);
1080                SetPixelBlue(mask_image,GetPixelAlpha(mask_image,q),q);
1081                q+=GetPixelComponents(mask_image);
1082              }
1083              if (SyncCacheViewAuthenticPixels(mask_view,exception) == MagickFalse)
1084                break;
1085            }
1086            mask_view=DestroyCacheView(mask_view);
1087            mask_image->matte=MagickTrue;
1088            (void) SetImageClipMask(*image,mask_image);
1089            mask_image=DestroyImage(mask_image);
1090            InheritException(exception,&(*image)->exception);
1091            break;
1092          }
1093        if (LocaleCompare("clip-path",option+1) == 0)
1094          {
1095            (void) SyncImageSettings(mogrify_info,*image);
1096            (void) ClipImagePath(*image,argv[i+1],*option == '-' ? MagickTrue :
1097              MagickFalse);
1098            InheritException(exception,&(*image)->exception);
1099            break;
1100          }
1101        if (LocaleCompare("colorize",option+1) == 0)
1102          {
1103            /*
1104              Colorize the image.
1105            */
1106            (void) SyncImageSettings(mogrify_info,*image);
1107            mogrify_image=ColorizeImage(*image,argv[i+1],draw_info->fill,
1108              exception);
1109            break;
1110          }
1111        if (LocaleCompare("color-matrix",option+1) == 0)
1112          {
1113            KernelInfo
1114              *kernel;
1115
1116            (void) SyncImageSettings(mogrify_info,*image);
1117            kernel=AcquireKernelInfo(argv[i+1]);
1118            if (kernel == (KernelInfo *) NULL)
1119              break;
1120            mogrify_image=ColorMatrixImage(*image,kernel,exception);
1121            kernel=DestroyKernelInfo(kernel);
1122            break;
1123          }
1124        if (LocaleCompare("colors",option+1) == 0)
1125          {
1126            /*
1127              Reduce the number of colors in the image.
1128            */
1129            (void) SyncImageSettings(mogrify_info,*image);
1130            quantize_info->number_colors=StringToUnsignedLong(argv[i+1]);
1131            if (quantize_info->number_colors == 0)
1132              break;
1133            if (((*image)->storage_class == DirectClass) ||
1134                (*image)->colors > quantize_info->number_colors)
1135              (void) QuantizeImage(quantize_info,*image);
1136            else
1137              (void) CompressImageColormap(*image);
1138            InheritException(exception,&(*image)->exception);
1139            break;
1140          }
1141        if (LocaleCompare("colorspace",option+1) == 0)
1142          {
1143            ColorspaceType
1144              colorspace;
1145
1146            (void) SyncImageSettings(mogrify_info,*image);
1147            if (*option == '+')
1148              {
1149                (void) TransformImageColorspace(*image,RGBColorspace);
1150                InheritException(exception,&(*image)->exception);
1151                break;
1152              }
1153            colorspace=(ColorspaceType) ParseCommandOption(
1154              MagickColorspaceOptions,MagickFalse,argv[i+1]);
1155            (void) TransformImageColorspace(*image,colorspace);
1156            InheritException(exception,&(*image)->exception);
1157            break;
1158          }
1159        if (LocaleCompare("contrast",option+1) == 0)
1160          {
1161            (void) SyncImageSettings(mogrify_info,*image);
1162            (void) ContrastImage(*image,(*option == '-') ? MagickTrue :
1163              MagickFalse);
1164            InheritException(exception,&(*image)->exception);
1165            break;
1166          }
1167        if (LocaleCompare("contrast-stretch",option+1) == 0)
1168          {
1169            double
1170              black_point,
1171              white_point;
1172
1173            MagickStatusType
1174              flags;
1175
1176            /*
1177              Contrast stretch image.
1178            */
1179            (void) SyncImageSettings(mogrify_info,*image);
1180            flags=ParseGeometry(argv[i+1],&geometry_info);
1181            black_point=geometry_info.rho;
1182            white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma :
1183              black_point;
1184            if ((flags & PercentValue) != 0)
1185              {
1186                black_point*=(double) (*image)->columns*(*image)->rows/100.0;
1187                white_point*=(double) (*image)->columns*(*image)->rows/100.0;
1188              }
1189            white_point=(MagickRealType) (*image)->columns*(*image)->rows-
1190              white_point;
1191            (void) ContrastStretchImage(*image,black_point,white_point);
1192            InheritException(exception,&(*image)->exception);
1193            break;
1194          }
1195        if (LocaleCompare("convolve",option+1) == 0)
1196          {
1197            double
1198              gamma;
1199
1200            KernelInfo
1201              *kernel;
1202
1203            register ssize_t
1204              j;
1205
1206            (void) SyncImageSettings(mogrify_info,*image);
1207            kernel=AcquireKernelInfo(argv[i+1]);
1208            if (kernel == (KernelInfo *) NULL)
1209              break;
1210            gamma=0.0;
1211            for (j=0; j < (ssize_t) (kernel->width*kernel->height); j++)
1212              gamma+=kernel->values[j];
1213            gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
1214            for (j=0; j < (ssize_t) (kernel->width*kernel->height); j++)
1215              kernel->values[j]*=gamma;
1216            mogrify_image=FilterImage(*image,kernel,exception);
1217            kernel=DestroyKernelInfo(kernel);
1218            break;
1219          }
1220        if (LocaleCompare("crop",option+1) == 0)
1221          {
1222            /*
1223              Crop a image to a smaller size
1224            */
1225            (void) SyncImageSettings(mogrify_info,*image);
1226#if 0
1227            flags=ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
1228            if (((geometry.width != 0) || (geometry.height != 0)) &&
1229                ((flags & XValue) == 0) && ((flags & YValue) == 0))
1230              break;
1231#endif
1232#if 0
1233            mogrify_image=CloneImage(*image,0,0,MagickTrue,&(*image)->exception);
1234            mogrify_image->next = mogrify_image->previous = (Image *)NULL;
1235            (void) TransformImage(&mogrify_image,argv[i+1],(char *) NULL);
1236            InheritException(exception,&mogrify_image->exception);
1237#else
1238            mogrify_image=CropImageToTiles(*image,argv[i+1],exception);
1239#endif
1240            break;
1241          }
1242        if (LocaleCompare("cycle",option+1) == 0)
1243          {
1244            /*
1245              Cycle an image colormap.
1246            */
1247            (void) SyncImageSettings(mogrify_info,*image);
1248            (void) CycleColormapImage(*image,(ssize_t) StringToLong(argv[i+1]));
1249            InheritException(exception,&(*image)->exception);
1250            break;
1251          }
1252        break;
1253      }
1254      case 'd':
1255      {
1256        if (LocaleCompare("decipher",option+1) == 0)
1257          {
1258            StringInfo
1259              *passkey;
1260
1261            /*
1262              Decipher pixels.
1263            */
1264            (void) SyncImageSettings(mogrify_info,*image);
1265            passkey=FileToStringInfo(argv[i+1],~0,exception);
1266            if (passkey != (StringInfo *) NULL)
1267              {
1268                (void) PasskeyDecipherImage(*image,passkey,exception);
1269                passkey=DestroyStringInfo(passkey);
1270              }
1271            break;
1272          }
1273        if (LocaleCompare("density",option+1) == 0)
1274          {
1275            /*
1276              Set image density.
1277            */
1278            (void) CloneString(&draw_info->density,argv[i+1]);
1279            break;
1280          }
1281        if (LocaleCompare("depth",option+1) == 0)
1282          {
1283            (void) SyncImageSettings(mogrify_info,*image);
1284            if (*option == '+')
1285              {
1286                (void) SetImageDepth(*image,MAGICKCORE_QUANTUM_DEPTH);
1287                break;
1288              }
1289            (void) SetImageDepth(*image,StringToUnsignedLong(argv[i+1]));
1290            break;
1291          }
1292        if (LocaleCompare("deskew",option+1) == 0)
1293          {
1294            double
1295              threshold;
1296
1297            /*
1298              Straighten the image.
1299            */
1300            (void) SyncImageSettings(mogrify_info,*image);
1301            if (*option == '+')
1302              threshold=40.0*QuantumRange/100.0;
1303            else
1304              threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
1305            mogrify_image=DeskewImage(*image,threshold,exception);
1306            break;
1307          }
1308        if (LocaleCompare("despeckle",option+1) == 0)
1309          {
1310            /*
1311              Reduce the speckles within an image.
1312            */
1313            (void) SyncImageSettings(mogrify_info,*image);
1314            mogrify_image=DespeckleImage(*image,exception);
1315            break;
1316          }
1317        if (LocaleCompare("display",option+1) == 0)
1318          {
1319            (void) CloneString(&draw_info->server_name,argv[i+1]);
1320            break;
1321          }
1322        if (LocaleCompare("distort",option+1) == 0)
1323          {
1324            char
1325              *args,
1326              token[MaxTextExtent];
1327
1328            const char
1329              *p;
1330
1331            DistortImageMethod
1332              method;
1333
1334            double
1335              *arguments;
1336
1337            register ssize_t
1338              x;
1339
1340            size_t
1341              number_arguments;
1342
1343            /*
1344              Distort image.
1345            */
1346            (void) SyncImageSettings(mogrify_info,*image);
1347            method=(DistortImageMethod) ParseCommandOption(MagickDistortOptions,
1348              MagickFalse,argv[i+1]);
1349            if ( method == ResizeDistortion )
1350              {
1351                 /* Special Case - Argument is actually a resize geometry!
1352                 ** Convert that to an appropriate distortion argument array.
1353                 */
1354                 double
1355                   resize_args[2];
1356                 (void) ParseRegionGeometry(*image,argv[i+2],&geometry,
1357                      exception);
1358                 resize_args[0]=(double)geometry.width;
1359                 resize_args[1]=(double)geometry.height;
1360                 mogrify_image=DistortImage(*image,method,(size_t)2,
1361                      resize_args,MagickTrue,exception);
1362                 break;
1363              }
1364            args=InterpretImageProperties(mogrify_info,*image,argv[i+2]);
1365            InheritException(exception,&(*image)->exception);
1366            if (args == (char *) NULL)
1367              break;
1368            p=(char *) args;
1369            for (x=0; *p != '\0'; x++)
1370            {
1371              GetMagickToken(p,&p,token);
1372              if (*token == ',')
1373                GetMagickToken(p,&p,token);
1374            }
1375            number_arguments=(size_t) x;
1376            arguments=(double *) AcquireQuantumMemory(number_arguments,
1377              sizeof(*arguments));
1378            if (arguments == (double *) NULL)
1379              ThrowWandFatalException(ResourceLimitFatalError,
1380                "MemoryAllocationFailed",(*image)->filename);
1381            (void) ResetMagickMemory(arguments,0,number_arguments*
1382              sizeof(*arguments));
1383            p=(char *) args;
1384            for (x=0; (x < (ssize_t) number_arguments) && (*p != '\0'); x++)
1385            {
1386              GetMagickToken(p,&p,token);
1387              if (*token == ',')
1388                GetMagickToken(p,&p,token);
1389              arguments[x]=InterpretLocaleValue(token,(char **) NULL);
1390            }
1391            args=DestroyString(args);
1392            mogrify_image=DistortImage(*image,method,number_arguments,arguments,
1393              (*option == '+') ? MagickTrue : MagickFalse,exception);
1394            arguments=(double *) RelinquishMagickMemory(arguments);
1395            break;
1396          }
1397        if (LocaleCompare("dither",option+1) == 0)
1398          {
1399            if (*option == '+')
1400              {
1401                quantize_info->dither=MagickFalse;
1402                break;
1403              }
1404            quantize_info->dither=MagickTrue;
1405            quantize_info->dither_method=(DitherMethod) ParseCommandOption(
1406              MagickDitherOptions,MagickFalse,argv[i+1]);
1407            if (quantize_info->dither_method == NoDitherMethod)
1408              quantize_info->dither=MagickFalse;
1409            break;
1410          }
1411        if (LocaleCompare("draw",option+1) == 0)
1412          {
1413            /*
1414              Draw image.
1415            */
1416            (void) SyncImageSettings(mogrify_info,*image);
1417            (void) CloneString(&draw_info->primitive,argv[i+1]);
1418            (void) DrawImage(*image,draw_info);
1419            InheritException(exception,&(*image)->exception);
1420            break;
1421          }
1422        break;
1423      }
1424      case 'e':
1425      {
1426        if (LocaleCompare("edge",option+1) == 0)
1427          {
1428            /*
1429              Enhance edges in the image.
1430            */
1431            (void) SyncImageSettings(mogrify_info,*image);
1432            flags=ParseGeometry(argv[i+1],&geometry_info);
1433            if ((flags & SigmaValue) == 0)
1434              geometry_info.sigma=1.0;
1435            mogrify_image=EdgeImage(*image,geometry_info.rho,exception);
1436            break;
1437          }
1438        if (LocaleCompare("emboss",option+1) == 0)
1439          {
1440            /*
1441              Gaussian embossen image.
1442            */
1443            (void) SyncImageSettings(mogrify_info,*image);
1444            flags=ParseGeometry(argv[i+1],&geometry_info);
1445            if ((flags & SigmaValue) == 0)
1446              geometry_info.sigma=1.0;
1447            mogrify_image=EmbossImage(*image,geometry_info.rho,
1448              geometry_info.sigma,exception);
1449            break;
1450          }
1451        if (LocaleCompare("encipher",option+1) == 0)
1452          {
1453            StringInfo
1454              *passkey;
1455
1456            /*
1457              Encipher pixels.
1458            */
1459            (void) SyncImageSettings(mogrify_info,*image);
1460            passkey=FileToStringInfo(argv[i+1],~0,exception);
1461            if (passkey != (StringInfo *) NULL)
1462              {
1463                (void) PasskeyEncipherImage(*image,passkey,exception);
1464                passkey=DestroyStringInfo(passkey);
1465              }
1466            break;
1467          }
1468        if (LocaleCompare("encoding",option+1) == 0)
1469          {
1470            (void) CloneString(&draw_info->encoding,argv[i+1]);
1471            break;
1472          }
1473        if (LocaleCompare("enhance",option+1) == 0)
1474          {
1475            /*
1476              Enhance image.
1477            */
1478            (void) SyncImageSettings(mogrify_info,*image);
1479            mogrify_image=EnhanceImage(*image,exception);
1480            break;
1481          }
1482        if (LocaleCompare("equalize",option+1) == 0)
1483          {
1484            /*
1485              Equalize image.
1486            */
1487            (void) SyncImageSettings(mogrify_info,*image);
1488            (void) EqualizeImage(*image);
1489            InheritException(exception,&(*image)->exception);
1490            break;
1491          }
1492        if (LocaleCompare("evaluate",option+1) == 0)
1493          {
1494            double
1495              constant;
1496
1497            MagickEvaluateOperator
1498              op;
1499
1500            (void) SyncImageSettings(mogrify_info,*image);
1501            op=(MagickEvaluateOperator) ParseCommandOption(
1502              MagickEvaluateOptions,MagickFalse,argv[i+1]);
1503            constant=SiPrefixToDouble(argv[i+2],QuantumRange);
1504            (void) EvaluateImage(*image,op,constant,exception);
1505            break;
1506          }
1507        if (LocaleCompare("extent",option+1) == 0)
1508          {
1509            /*
1510              Set the image extent.
1511            */
1512            (void) SyncImageSettings(mogrify_info,*image);
1513            flags=ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
1514            if (geometry.width == 0)
1515              geometry.width=(*image)->columns;
1516            if (geometry.height == 0)
1517              geometry.height=(*image)->rows;
1518            mogrify_image=ExtentImage(*image,&geometry,exception);
1519            break;
1520          }
1521        break;
1522      }
1523      case 'f':
1524      {
1525        if (LocaleCompare("family",option+1) == 0)
1526          {
1527            if (*option == '+')
1528              {
1529                if (draw_info->family != (char *) NULL)
1530                  draw_info->family=DestroyString(draw_info->family);
1531                break;
1532              }
1533            (void) CloneString(&draw_info->family,argv[i+1]);
1534            break;
1535          }
1536        if (LocaleCompare("features",option+1) == 0)
1537          {
1538            if (*option == '+')
1539              {
1540                (void) DeleteImageArtifact(*image,"identify:features");
1541                break;
1542              }
1543            (void) SetImageArtifact(*image,"identify:features",argv[i+1]);
1544            break;
1545          }
1546        if (LocaleCompare("fill",option+1) == 0)
1547          {
1548            ExceptionInfo
1549              *sans;
1550
1551            GetPixelInfo(*image,&fill);
1552            if (*option == '+')
1553              {
1554                (void) QueryMagickColor("none",&fill,exception);
1555                (void) QueryColorDatabase("none",&draw_info->fill,exception);
1556                if (draw_info->fill_pattern != (Image *) NULL)
1557                  draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern);
1558                break;
1559              }
1560            sans=AcquireExceptionInfo();
1561            (void) QueryMagickColor(argv[i+1],&fill,sans);
1562            status=QueryColorDatabase(argv[i+1],&draw_info->fill,sans);
1563            sans=DestroyExceptionInfo(sans);
1564            if (status == MagickFalse)
1565              draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1],
1566                exception);
1567            break;
1568          }
1569        if (LocaleCompare("flip",option+1) == 0)
1570          {
1571            /*
1572              Flip image scanlines.
1573            */
1574            (void) SyncImageSettings(mogrify_info,*image);
1575            mogrify_image=FlipImage(*image,exception);
1576            break;
1577          }
1578        if (LocaleCompare("floodfill",option+1) == 0)
1579          {
1580            PixelInfo
1581              target;
1582
1583            /*
1584              Floodfill image.
1585            */
1586            (void) SyncImageSettings(mogrify_info,*image);
1587            (void) ParsePageGeometry(*image,argv[i+1],&geometry,exception);
1588            (void) QueryMagickColor(argv[i+2],&target,exception);
1589            (void) FloodfillPaintImage(*image,draw_info,&target,geometry.x,
1590              geometry.y,*option == '-' ? MagickFalse : MagickTrue);
1591            InheritException(exception,&(*image)->exception);
1592            break;
1593          }
1594        if (LocaleCompare("flop",option+1) == 0)
1595          {
1596            /*
1597              Flop image scanlines.
1598            */
1599            (void) SyncImageSettings(mogrify_info,*image);
1600            mogrify_image=FlopImage(*image,exception);
1601            break;
1602          }
1603        if (LocaleCompare("font",option+1) == 0)
1604          {
1605            if (*option == '+')
1606              {
1607                if (draw_info->font != (char *) NULL)
1608                  draw_info->font=DestroyString(draw_info->font);
1609                break;
1610              }
1611            (void) CloneString(&draw_info->font,argv[i+1]);
1612            break;
1613          }
1614        if (LocaleCompare("format",option+1) == 0)
1615          {
1616            format=argv[i+1];
1617            break;
1618          }
1619        if (LocaleCompare("frame",option+1) == 0)
1620          {
1621            FrameInfo
1622              frame_info;
1623
1624            /*
1625              Surround image with an ornamental border.
1626            */
1627            (void) SyncImageSettings(mogrify_info,*image);
1628            flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
1629            frame_info.width=geometry.width;
1630            frame_info.height=geometry.height;
1631            if ((flags & HeightValue) == 0)
1632              frame_info.height=geometry.width;
1633            frame_info.outer_bevel=geometry.x;
1634            frame_info.inner_bevel=geometry.y;
1635            frame_info.x=(ssize_t) frame_info.width;
1636            frame_info.y=(ssize_t) frame_info.height;
1637            frame_info.width=(*image)->columns+2*frame_info.width;
1638            frame_info.height=(*image)->rows+2*frame_info.height;
1639            mogrify_image=FrameImage(*image,&frame_info,exception);
1640            break;
1641          }
1642        if (LocaleCompare("function",option+1) == 0)
1643          {
1644            char
1645              *arguments,
1646              token[MaxTextExtent];
1647
1648            const char
1649              *p;
1650
1651            double
1652              *parameters;
1653
1654            MagickFunction
1655              function;
1656
1657            register ssize_t
1658              x;
1659
1660            size_t
1661              number_parameters;
1662
1663            /*
1664              Function Modify Image Values
1665            */
1666            (void) SyncImageSettings(mogrify_info,*image);
1667            function=(MagickFunction) ParseCommandOption(MagickFunctionOptions,
1668              MagickFalse,argv[i+1]);
1669            arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2]);
1670            InheritException(exception,&(*image)->exception);
1671            if (arguments == (char *) NULL)
1672              break;
1673            p=(char *) arguments;
1674            for (x=0; *p != '\0'; x++)
1675            {
1676              GetMagickToken(p,&p,token);
1677              if (*token == ',')
1678                GetMagickToken(p,&p,token);
1679            }
1680            number_parameters=(size_t) x;
1681            parameters=(double *) AcquireQuantumMemory(number_parameters,
1682              sizeof(*parameters));
1683            if (parameters == (double *) NULL)
1684              ThrowWandFatalException(ResourceLimitFatalError,
1685                "MemoryAllocationFailed",(*image)->filename);
1686            (void) ResetMagickMemory(parameters,0,number_parameters*
1687              sizeof(*parameters));
1688            p=(char *) arguments;
1689            for (x=0; (x < (ssize_t) number_parameters) && (*p != '\0'); x++)
1690            {
1691              GetMagickToken(p,&p,token);
1692              if (*token == ',')
1693                GetMagickToken(p,&p,token);
1694              parameters[x]=InterpretLocaleValue(token,(char **) NULL);
1695            }
1696            arguments=DestroyString(arguments);
1697            (void) FunctionImage(*image,function,number_parameters,parameters,
1698              exception);
1699            parameters=(double *) RelinquishMagickMemory(parameters);
1700            break;
1701          }
1702        break;
1703      }
1704      case 'g':
1705      {
1706        if (LocaleCompare("gamma",option+1) == 0)
1707          {
1708            /*
1709              Gamma image.
1710            */
1711            (void) SyncImageSettings(mogrify_info,*image);
1712            if (*option == '+')
1713              (*image)->gamma=InterpretLocaleValue(argv[i+1],(char **) NULL);
1714            else
1715              {
1716                (void) GammaImage(*image,InterpretLocaleValue(argv[i+1],
1717                  (char **) NULL));
1718                InheritException(exception,&(*image)->exception);
1719              }
1720            break;
1721          }
1722        if ((LocaleCompare("gaussian-blur",option+1) == 0) ||
1723            (LocaleCompare("gaussian",option+1) == 0))
1724          {
1725            /*
1726              Gaussian blur image.
1727            */
1728            (void) SyncImageSettings(mogrify_info,*image);
1729            flags=ParseGeometry(argv[i+1],&geometry_info);
1730            if ((flags & SigmaValue) == 0)
1731              geometry_info.sigma=1.0;
1732            mogrify_image=GaussianBlurImage(*image,geometry_info.rho,
1733              geometry_info.sigma,exception);
1734            break;
1735          }
1736        if (LocaleCompare("geometry",option+1) == 0)
1737          {
1738              /*
1739                Record Image offset, Resize last image.
1740              */
1741            (void) SyncImageSettings(mogrify_info,*image);
1742            if (*option == '+')
1743              {
1744                if ((*image)->geometry != (char *) NULL)
1745                  (*image)->geometry=DestroyString((*image)->geometry);
1746                break;
1747              }
1748            flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
1749            if (((flags & XValue) != 0) || ((flags & YValue) != 0))
1750              (void) CloneString(&(*image)->geometry,argv[i+1]);
1751            else
1752              mogrify_image=ResizeImage(*image,geometry.width,geometry.height,
1753                (*image)->filter,(*image)->blur,exception);
1754            break;
1755          }
1756        if (LocaleCompare("gravity",option+1) == 0)
1757          {
1758            if (*option == '+')
1759              {
1760                draw_info->gravity=UndefinedGravity;
1761                break;
1762              }
1763            draw_info->gravity=(GravityType) ParseCommandOption(
1764              MagickGravityOptions,MagickFalse,argv[i+1]);
1765            break;
1766          }
1767        break;
1768      }
1769      case 'h':
1770      {
1771        if (LocaleCompare("highlight-color",option+1) == 0)
1772          {
1773            (void) SetImageArtifact(*image,option+1,argv[i+1]);
1774            break;
1775          }
1776        break;
1777      }
1778      case 'i':
1779      {
1780        if (LocaleCompare("identify",option+1) == 0)
1781          {
1782            char
1783              *text;
1784
1785            (void) SyncImageSettings(mogrify_info,*image);
1786            if (format == (char *) NULL)
1787              {
1788                (void) IdentifyImage(*image,stdout,mogrify_info->verbose);
1789                InheritException(exception,&(*image)->exception);
1790                break;
1791              }
1792            text=InterpretImageProperties(mogrify_info,*image,format);
1793            InheritException(exception,&(*image)->exception);
1794            if (text == (char *) NULL)
1795              break;
1796            (void) fputs(text,stdout);
1797            (void) fputc('\n',stdout);
1798            text=DestroyString(text);
1799            break;
1800          }
1801        if (LocaleCompare("implode",option+1) == 0)
1802          {
1803            /*
1804              Implode image.
1805            */
1806            (void) SyncImageSettings(mogrify_info,*image);
1807            (void) ParseGeometry(argv[i+1],&geometry_info);
1808            mogrify_image=ImplodeImage(*image,geometry_info.rho,exception);
1809            break;
1810          }
1811        if (LocaleCompare("interline-spacing",option+1) == 0)
1812          {
1813            if (*option == '+')
1814              (void) ParseGeometry("0",&geometry_info);
1815            else
1816              (void) ParseGeometry(argv[i+1],&geometry_info);
1817            draw_info->interline_spacing=geometry_info.rho;
1818            break;
1819          }
1820        if (LocaleCompare("interword-spacing",option+1) == 0)
1821          {
1822            if (*option == '+')
1823              (void) ParseGeometry("0",&geometry_info);
1824            else
1825              (void) ParseGeometry(argv[i+1],&geometry_info);
1826            draw_info->interword_spacing=geometry_info.rho;
1827            break;
1828          }
1829        break;
1830      }
1831      case 'k':
1832      {
1833        if (LocaleCompare("kerning",option+1) == 0)
1834          {
1835            if (*option == '+')
1836              (void) ParseGeometry("0",&geometry_info);
1837            else
1838              (void) ParseGeometry(argv[i+1],&geometry_info);
1839            draw_info->kerning=geometry_info.rho;
1840            break;
1841          }
1842        break;
1843      }
1844      case 'l':
1845      {
1846        if (LocaleCompare("lat",option+1) == 0)
1847          {
1848            /*
1849              Local adaptive threshold image.
1850            */
1851            (void) SyncImageSettings(mogrify_info,*image);
1852            flags=ParseGeometry(argv[i+1],&geometry_info);
1853            if ((flags & PercentValue) != 0)
1854              geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0;
1855            mogrify_image=AdaptiveThresholdImage(*image,(size_t)
1856              geometry_info.rho,(size_t) geometry_info.sigma,(ssize_t)
1857              geometry_info.xi,exception);
1858            break;
1859          }
1860        if (LocaleCompare("level",option+1) == 0)
1861          {
1862            MagickRealType
1863              black_point,
1864              gamma,
1865              white_point;
1866
1867            MagickStatusType
1868              flags;
1869
1870            /*
1871              Parse levels.
1872            */
1873            (void) SyncImageSettings(mogrify_info,*image);
1874            flags=ParseGeometry(argv[i+1],&geometry_info);
1875            black_point=geometry_info.rho;
1876            white_point=(MagickRealType) QuantumRange;
1877            if ((flags & SigmaValue) != 0)
1878              white_point=geometry_info.sigma;
1879            gamma=1.0;
1880            if ((flags & XiValue) != 0)
1881              gamma=geometry_info.xi;
1882            if ((flags & PercentValue) != 0)
1883              {
1884                black_point*=(MagickRealType) (QuantumRange/100.0);
1885                white_point*=(MagickRealType) (QuantumRange/100.0);
1886              }
1887            if ((flags & SigmaValue) == 0)
1888              white_point=(MagickRealType) QuantumRange-black_point;
1889            if ((*option == '+') || ((flags & AspectValue) != 0))
1890              (void) LevelizeImage(*image,black_point,white_point,gamma);
1891            else
1892              (void) LevelImage(*image,black_point,white_point,gamma);
1893            InheritException(exception,&(*image)->exception);
1894            break;
1895          }
1896        if (LocaleCompare("level-colors",option+1) == 0)
1897          {
1898            char
1899              token[MaxTextExtent];
1900
1901            const char
1902              *p;
1903
1904            PixelInfo
1905              black_point,
1906              white_point;
1907
1908            p=(const char *) argv[i+1];
1909            GetMagickToken(p,&p,token);  /* get black point color */
1910            if ((isalpha((int) *token) != 0) || ((*token == '#') != 0))
1911              (void) QueryMagickColor(token,&black_point,exception);
1912            else
1913              (void) QueryMagickColor("#000000",&black_point,exception);
1914            if (isalpha((int) token[0]) || (token[0] == '#'))
1915              GetMagickToken(p,&p,token);
1916            if (*token == '\0')
1917              white_point=black_point; /* set everything to that color */
1918            else
1919              {
1920                if ((isalpha((int) *token) == 0) && ((*token == '#') == 0))
1921                  GetMagickToken(p,&p,token); /* Get white point color. */
1922                if ((isalpha((int) *token) != 0) || ((*token == '#') != 0))
1923                  (void) QueryMagickColor(token,&white_point,exception);
1924                else
1925                  (void) QueryMagickColor("#ffffff",&white_point,exception);
1926              }
1927            (void) LevelImageColors(*image,&black_point,&white_point,
1928              *option == '+' ? MagickTrue : MagickFalse);
1929            break;
1930          }
1931        if (LocaleCompare("linear-stretch",option+1) == 0)
1932          {
1933            double
1934              black_point,
1935              white_point;
1936
1937            MagickStatusType
1938              flags;
1939
1940            (void) SyncImageSettings(mogrify_info,*image);
1941            flags=ParseGeometry(argv[i+1],&geometry_info);
1942            black_point=geometry_info.rho;
1943            white_point=(MagickRealType) (*image)->columns*(*image)->rows;
1944            if ((flags & SigmaValue) != 0)
1945              white_point=geometry_info.sigma;
1946            if ((flags & PercentValue) != 0)
1947              {
1948                black_point*=(double) (*image)->columns*(*image)->rows/100.0;
1949                white_point*=(double) (*image)->columns*(*image)->rows/100.0;
1950              }
1951            if ((flags & SigmaValue) == 0)
1952              white_point=(MagickRealType) (*image)->columns*(*image)->rows-
1953                black_point;
1954            (void) LinearStretchImage(*image,black_point,white_point);
1955            InheritException(exception,&(*image)->exception);
1956            break;
1957          }
1958        if (LocaleCompare("linewidth",option+1) == 0)
1959          {
1960            draw_info->stroke_width=InterpretLocaleValue(argv[i+1],
1961              (char **) NULL);
1962            break;
1963          }
1964        if (LocaleCompare("liquid-rescale",option+1) == 0)
1965          {
1966            /*
1967              Liquid rescale image.
1968            */
1969            (void) SyncImageSettings(mogrify_info,*image);
1970            flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
1971            if ((flags & XValue) == 0)
1972              geometry.x=1;
1973            if ((flags & YValue) == 0)
1974              geometry.y=0;
1975            mogrify_image=LiquidRescaleImage(*image,geometry.width,
1976              geometry.height,1.0*geometry.x,1.0*geometry.y,exception);
1977            break;
1978          }
1979        if (LocaleCompare("lowlight-color",option+1) == 0)
1980          {
1981            (void) SetImageArtifact(*image,option+1,argv[i+1]);
1982            break;
1983          }
1984        break;
1985      }
1986      case 'm':
1987      {
1988        if (LocaleCompare("map",option+1) == 0)
1989          {
1990            Image
1991              *remap_image;
1992
1993            /*
1994              Transform image colors to match this set of colors.
1995            */
1996            (void) SyncImageSettings(mogrify_info,*image);
1997            if (*option == '+')
1998              break;
1999            remap_image=GetImageCache(mogrify_info,argv[i+1],exception);
2000            if (remap_image == (Image *) NULL)
2001              break;
2002            (void) RemapImage(quantize_info,*image,remap_image);
2003            InheritException(exception,&(*image)->exception);
2004            remap_image=DestroyImage(remap_image);
2005            break;
2006          }
2007        if (LocaleCompare("mask",option+1) == 0)
2008          {
2009            Image
2010              *mask;
2011
2012            (void) SyncImageSettings(mogrify_info,*image);
2013            if (*option == '+')
2014              {
2015                /*
2016                  Remove a mask.
2017                */
2018                (void) SetImageMask(*image,(Image *) NULL);
2019                InheritException(exception,&(*image)->exception);
2020                break;
2021              }
2022            /*
2023              Set the image mask.
2024            */
2025            mask=GetImageCache(mogrify_info,argv[i+1],exception);
2026            if (mask == (Image *) NULL)
2027              break;
2028            (void) SetImageMask(*image,mask);
2029            mask=DestroyImage(mask);
2030            InheritException(exception,&(*image)->exception);
2031            break;
2032          }
2033        if (LocaleCompare("matte",option+1) == 0)
2034          {
2035            (void) SetImageAlphaChannel(*image,(*option == '-') ?
2036              SetAlphaChannel : DeactivateAlphaChannel );
2037            InheritException(exception,&(*image)->exception);
2038            break;
2039          }
2040        if (LocaleCompare("median",option+1) == 0)
2041          {
2042            /*
2043              Median filter image.
2044            */
2045            (void) SyncImageSettings(mogrify_info,*image);
2046            (void) ParseGeometry(argv[i+1],&geometry_info);
2047            mogrify_image=StatisticImage(*image,MedianStatistic,(size_t)
2048              geometry_info.rho,(size_t) geometry_info.rho,exception);
2049            break;
2050          }
2051        if (LocaleCompare("mode",option+1) == 0)
2052          {
2053            /*
2054              Mode image.
2055            */
2056            (void) SyncImageSettings(mogrify_info,*image);
2057            (void) ParseGeometry(argv[i+1],&geometry_info);
2058            mogrify_image=StatisticImage(*image,ModeStatistic,(size_t)
2059              geometry_info.rho,(size_t) geometry_info.rho,exception);
2060            break;
2061          }
2062        if (LocaleCompare("modulate",option+1) == 0)
2063          {
2064            (void) SyncImageSettings(mogrify_info,*image);
2065            (void) ModulateImage(*image,argv[i+1]);
2066            InheritException(exception,&(*image)->exception);
2067            break;
2068          }
2069        if (LocaleCompare("monitor",option+1) == 0)
2070          {
2071            if (*option == '+')
2072              {
2073                (void) SetImageProgressMonitor(*image,
2074                  (MagickProgressMonitor) NULL,(void *) NULL);
2075                break;
2076              }
2077            (void) SetImageProgressMonitor(*image,MonitorProgress,
2078              (void *) NULL);
2079            break;
2080          }
2081        if (LocaleCompare("monochrome",option+1) == 0)
2082          {
2083            (void) SyncImageSettings(mogrify_info,*image);
2084            (void) SetImageType(*image,BilevelType);
2085            InheritException(exception,&(*image)->exception);
2086            break;
2087          }
2088        if (LocaleCompare("morphology",option+1) == 0)
2089          {
2090            char
2091              token[MaxTextExtent];
2092
2093            const char
2094              *p;
2095
2096            KernelInfo
2097              *kernel;
2098
2099            MorphologyMethod
2100              method;
2101
2102            ssize_t
2103              iterations;
2104
2105            /*
2106              Morphological Image Operation
2107            */
2108            (void) SyncImageSettings(mogrify_info,*image);
2109            p=argv[i+1];
2110            GetMagickToken(p,&p,token);
2111            method=(MorphologyMethod) ParseCommandOption(MagickMorphologyOptions,
2112              MagickFalse,token);
2113            iterations=1L;
2114            GetMagickToken(p,&p,token);
2115            if ((*p == ':') || (*p == ','))
2116              GetMagickToken(p,&p,token);
2117            if ((*p != '\0'))
2118              iterations=(ssize_t) StringToLong(p);
2119            kernel=AcquireKernelInfo(argv[i+2]);
2120            if (kernel == (KernelInfo *) NULL)
2121              {
2122                (void) ThrowMagickException(exception,GetMagickModule(),
2123                  OptionError,"UnabletoParseKernel","morphology");
2124                status=MagickFalse;
2125                break;
2126              }
2127            mogrify_image=MorphologyImage(*image,method,iterations,kernel,
2128              exception);
2129            kernel=DestroyKernelInfo(kernel);
2130            break;
2131          }
2132        if (LocaleCompare("motion-blur",option+1) == 0)
2133          {
2134            /*
2135              Motion blur image.
2136            */
2137            (void) SyncImageSettings(mogrify_info,*image);
2138            flags=ParseGeometry(argv[i+1],&geometry_info);
2139            if ((flags & SigmaValue) == 0)
2140              geometry_info.sigma=1.0;
2141            mogrify_image=MotionBlurImage(*image,geometry_info.rho,
2142              geometry_info.sigma,geometry_info.xi,exception);
2143            break;
2144          }
2145        break;
2146      }
2147      case 'n':
2148      {
2149        if (LocaleCompare("negate",option+1) == 0)
2150          {
2151            (void) SyncImageSettings(mogrify_info,*image);
2152            (void) NegateImage(*image,*option == '+' ? MagickTrue :
2153              MagickFalse);
2154            InheritException(exception,&(*image)->exception);
2155            break;
2156          }
2157        if (LocaleCompare("noise",option+1) == 0)
2158          {
2159            (void) SyncImageSettings(mogrify_info,*image);
2160            if (*option == '-')
2161              {
2162                (void) ParseGeometry(argv[i+1],&geometry_info);
2163                mogrify_image=StatisticImage(*image,NonpeakStatistic,(size_t)
2164                  geometry_info.rho,(size_t) geometry_info.rho,exception);
2165              }
2166            else
2167              {
2168                NoiseType
2169                  noise;
2170
2171                noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
2172                  MagickFalse,argv[i+1]);
2173                mogrify_image=AddNoiseImage(*image,noise,exception);
2174              }
2175            break;
2176          }
2177        if (LocaleCompare("normalize",option+1) == 0)
2178          {
2179            (void) SyncImageSettings(mogrify_info,*image);
2180            (void) NormalizeImage(*image);
2181            InheritException(exception,&(*image)->exception);
2182            break;
2183          }
2184        break;
2185      }
2186      case 'o':
2187      {
2188        if (LocaleCompare("opaque",option+1) == 0)
2189          {
2190            PixelInfo
2191              target;
2192
2193            (void) SyncImageSettings(mogrify_info,*image);
2194            (void) QueryMagickColor(argv[i+1],&target,exception);
2195            (void) OpaquePaintImage(*image,&target,&fill,*option == '-' ?
2196              MagickFalse : MagickTrue);
2197            break;
2198          }
2199        if (LocaleCompare("ordered-dither",option+1) == 0)
2200          {
2201            (void) SyncImageSettings(mogrify_info,*image);
2202            (void) OrderedPosterizeImage(*image,argv[i+1],exception);
2203            break;
2204          }
2205        break;
2206      }
2207      case 'p':
2208      {
2209        if (LocaleCompare("paint",option+1) == 0)
2210          {
2211            (void) SyncImageSettings(mogrify_info,*image);
2212            (void) ParseGeometry(argv[i+1],&geometry_info);
2213            mogrify_image=OilPaintImage(*image,geometry_info.rho,exception);
2214            break;
2215          }
2216        if (LocaleCompare("pen",option+1) == 0)
2217          {
2218            if (*option == '+')
2219              {
2220                (void) QueryColorDatabase("none",&draw_info->fill,exception);
2221                break;
2222              }
2223            (void) QueryColorDatabase(argv[i+1],&draw_info->fill,exception);
2224            break;
2225          }
2226        if (LocaleCompare("pointsize",option+1) == 0)
2227          {
2228            if (*option == '+')
2229              (void) ParseGeometry("12",&geometry_info);
2230            else
2231              (void) ParseGeometry(argv[i+1],&geometry_info);
2232            draw_info->pointsize=geometry_info.rho;
2233            break;
2234          }
2235        if (LocaleCompare("polaroid",option+1) == 0)
2236          {
2237            double
2238              angle;
2239
2240            RandomInfo
2241              *random_info;
2242
2243            /*
2244              Simulate a Polaroid picture.
2245            */
2246            (void) SyncImageSettings(mogrify_info,*image);
2247            random_info=AcquireRandomInfo();
2248            angle=22.5*(GetPseudoRandomValue(random_info)-0.5);
2249            random_info=DestroyRandomInfo(random_info);
2250            if (*option == '-')
2251              {
2252                SetGeometryInfo(&geometry_info);
2253                flags=ParseGeometry(argv[i+1],&geometry_info);
2254                angle=geometry_info.rho;
2255              }
2256            mogrify_image=PolaroidImage(*image,draw_info,angle,exception);
2257            break;
2258          }
2259        if (LocaleCompare("posterize",option+1) == 0)
2260          {
2261            /*
2262              Posterize image.
2263            */
2264            (void) SyncImageSettings(mogrify_info,*image);
2265            (void) PosterizeImage(*image,StringToUnsignedLong(argv[i+1]),
2266              quantize_info->dither);
2267            InheritException(exception,&(*image)->exception);
2268            break;
2269          }
2270        if (LocaleCompare("preview",option+1) == 0)
2271          {
2272            PreviewType
2273              preview_type;
2274
2275            /*
2276              Preview image.
2277            */
2278            (void) SyncImageSettings(mogrify_info,*image);
2279            if (*option == '+')
2280              preview_type=UndefinedPreview;
2281            else
2282              preview_type=(PreviewType) ParseCommandOption(MagickPreviewOptions,
2283                MagickFalse,argv[i+1]);
2284            mogrify_image=PreviewImage(*image,preview_type,exception);
2285            break;
2286          }
2287        if (LocaleCompare("profile",option+1) == 0)
2288          {
2289            const char
2290              *name;
2291
2292            const StringInfo
2293              *profile;
2294
2295            Image
2296              *profile_image;
2297
2298            ImageInfo
2299              *profile_info;
2300
2301            (void) SyncImageSettings(mogrify_info,*image);
2302            if (*option == '+')
2303              {
2304                /*
2305                  Remove a profile from the image.
2306                */
2307                (void) ProfileImage(*image,argv[i+1],(const unsigned char *)
2308                  NULL,0,MagickTrue);
2309                InheritException(exception,&(*image)->exception);
2310                break;
2311              }
2312            /*
2313              Associate a profile with the image.
2314            */
2315            profile_info=CloneImageInfo(mogrify_info);
2316            profile=GetImageProfile(*image,"iptc");
2317            if (profile != (StringInfo *) NULL)
2318              profile_info->profile=(void *) CloneStringInfo(profile);
2319            profile_image=GetImageCache(profile_info,argv[i+1],exception);
2320            profile_info=DestroyImageInfo(profile_info);
2321            if (profile_image == (Image *) NULL)
2322              {
2323                StringInfo
2324                  *profile;
2325
2326                profile_info=CloneImageInfo(mogrify_info);
2327                (void) CopyMagickString(profile_info->filename,argv[i+1],
2328                  MaxTextExtent);
2329                profile=FileToStringInfo(profile_info->filename,~0UL,exception);
2330                if (profile != (StringInfo *) NULL)
2331                  {
2332                    (void) ProfileImage(*image,profile_info->magick,
2333                      GetStringInfoDatum(profile),(size_t)
2334                      GetStringInfoLength(profile),MagickFalse);
2335                    profile=DestroyStringInfo(profile);
2336                  }
2337                profile_info=DestroyImageInfo(profile_info);
2338                break;
2339              }
2340            ResetImageProfileIterator(profile_image);
2341            name=GetNextImageProfile(profile_image);
2342            while (name != (const char *) NULL)
2343            {
2344              profile=GetImageProfile(profile_image,name);
2345              if (profile != (StringInfo *) NULL)
2346                (void) ProfileImage(*image,name,GetStringInfoDatum(profile),
2347                  (size_t) GetStringInfoLength(profile),MagickFalse);
2348              name=GetNextImageProfile(profile_image);
2349            }
2350            profile_image=DestroyImage(profile_image);
2351            break;
2352          }
2353        break;
2354      }
2355      case 'q':
2356      {
2357        if (LocaleCompare("quantize",option+1) == 0)
2358          {
2359            if (*option == '+')
2360              {
2361                quantize_info->colorspace=UndefinedColorspace;
2362                break;
2363              }
2364            quantize_info->colorspace=(ColorspaceType) ParseCommandOption(
2365              MagickColorspaceOptions,MagickFalse,argv[i+1]);
2366            break;
2367          }
2368        break;
2369      }
2370      case 'r':
2371      {
2372        if (LocaleCompare("radial-blur",option+1) == 0)
2373          {
2374            /*
2375              Radial blur image.
2376            */
2377            (void) SyncImageSettings(mogrify_info,*image);
2378            mogrify_image=RadialBlurImage(*image,InterpretLocaleValue(argv[i+1],
2379              (char **) NULL),exception);
2380            break;
2381          }
2382        if (LocaleCompare("raise",option+1) == 0)
2383          {
2384            /*
2385              Surround image with a raise of solid color.
2386            */
2387            flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2388            if ((flags & SigmaValue) == 0)
2389              geometry.height=geometry.width;
2390            (void) RaiseImage(*image,&geometry,*option == '-' ? MagickTrue :
2391              MagickFalse);
2392            InheritException(exception,&(*image)->exception);
2393            break;
2394          }
2395        if (LocaleCompare("random-threshold",option+1) == 0)
2396          {
2397            /*
2398              Threshold image.
2399            */
2400            (void) SyncImageSettings(mogrify_info,*image);
2401            (void) RandomThresholdImage(*image,argv[i+1],exception);
2402            break;
2403          }
2404        if (LocaleCompare("recolor",option+1) == 0)
2405          {
2406            KernelInfo
2407              *kernel;
2408
2409            (void) SyncImageSettings(mogrify_info,*image);
2410            kernel=AcquireKernelInfo(argv[i+1]);
2411            if (kernel == (KernelInfo *) NULL)
2412              break;
2413            mogrify_image=ColorMatrixImage(*image,kernel,exception);
2414            kernel=DestroyKernelInfo(kernel);
2415            break;
2416          }
2417        if (LocaleCompare("region",option+1) == 0)
2418          {
2419            (void) SyncImageSettings(mogrify_info,*image);
2420            if (region_image != (Image *) NULL)
2421              {
2422                /*
2423                  Composite region.
2424                */
2425                (void) CompositeImage(region_image,region_image->matte !=
2426                   MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
2427                   region_geometry.x,region_geometry.y);
2428                InheritException(exception,&region_image->exception);
2429                *image=DestroyImage(*image);
2430                *image=region_image;
2431                region_image = (Image *) NULL;
2432              }
2433            if (*option == '+')
2434              break;
2435            /*
2436              Apply transformations to a selected region of the image.
2437            */
2438            (void) ParseGravityGeometry(*image,argv[i+1],&region_geometry,
2439              exception);
2440            mogrify_image=CropImage(*image,&region_geometry,exception);
2441            if (mogrify_image == (Image *) NULL)
2442              break;
2443            region_image=(*image);
2444            *image=mogrify_image;
2445            mogrify_image=(Image *) NULL;
2446            break;
2447          }
2448        if (LocaleCompare("render",option+1) == 0)
2449          {
2450            (void) SyncImageSettings(mogrify_info,*image);
2451            draw_info->render=(*option == '+') ? MagickTrue : MagickFalse;
2452            break;
2453          }
2454        if (LocaleCompare("remap",option+1) == 0)
2455          {
2456            Image
2457              *remap_image;
2458
2459            /*
2460              Transform image colors to match this set of colors.
2461            */
2462            (void) SyncImageSettings(mogrify_info,*image);
2463            if (*option == '+')
2464              break;
2465            remap_image=GetImageCache(mogrify_info,argv[i+1],exception);
2466            if (remap_image == (Image *) NULL)
2467              break;
2468            (void) RemapImage(quantize_info,*image,remap_image);
2469            InheritException(exception,&(*image)->exception);
2470            remap_image=DestroyImage(remap_image);
2471            break;
2472          }
2473        if (LocaleCompare("repage",option+1) == 0)
2474          {
2475            if (*option == '+')
2476              {
2477                (void) ParseAbsoluteGeometry("0x0+0+0",&(*image)->page);
2478                break;
2479              }
2480            (void) ResetImagePage(*image,argv[i+1]);
2481            InheritException(exception,&(*image)->exception);
2482            break;
2483          }
2484        if (LocaleCompare("resample",option+1) == 0)
2485          {
2486            /*
2487              Resample image.
2488            */
2489            (void) SyncImageSettings(mogrify_info,*image);
2490            flags=ParseGeometry(argv[i+1],&geometry_info);
2491            if ((flags & SigmaValue) == 0)
2492              geometry_info.sigma=geometry_info.rho;
2493            mogrify_image=ResampleImage(*image,geometry_info.rho,
2494              geometry_info.sigma,(*image)->filter,(*image)->blur,exception);
2495            break;
2496          }
2497        if (LocaleCompare("resize",option+1) == 0)
2498          {
2499            /*
2500              Resize image.
2501            */
2502            (void) SyncImageSettings(mogrify_info,*image);
2503            (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2504            mogrify_image=ResizeImage(*image,geometry.width,geometry.height,
2505              (*image)->filter,(*image)->blur,exception);
2506            break;
2507          }
2508        if (LocaleCompare("roll",option+1) == 0)
2509          {
2510            /*
2511              Roll image.
2512            */
2513            (void) SyncImageSettings(mogrify_info,*image);
2514            (void) ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2515            mogrify_image=RollImage(*image,geometry.x,geometry.y,exception);
2516            break;
2517          }
2518        if (LocaleCompare("rotate",option+1) == 0)
2519          {
2520            char
2521              *geometry;
2522
2523            /*
2524              Check for conditional image rotation.
2525            */
2526            (void) SyncImageSettings(mogrify_info,*image);
2527            if (strchr(argv[i+1],'>') != (char *) NULL)
2528              if ((*image)->columns <= (*image)->rows)
2529                break;
2530            if (strchr(argv[i+1],'<') != (char *) NULL)
2531              if ((*image)->columns >= (*image)->rows)
2532                break;
2533            /*
2534              Rotate image.
2535            */
2536            geometry=ConstantString(argv[i+1]);
2537            (void) SubstituteString(&geometry,">","");
2538            (void) SubstituteString(&geometry,"<","");
2539            (void) ParseGeometry(geometry,&geometry_info);
2540            geometry=DestroyString(geometry);
2541            mogrify_image=RotateImage(*image,geometry_info.rho,exception);
2542            break;
2543          }
2544        break;
2545      }
2546      case 's':
2547      {
2548        if (LocaleCompare("sample",option+1) == 0)
2549          {
2550            /*
2551              Sample image with pixel replication.
2552            */
2553            (void) SyncImageSettings(mogrify_info,*image);
2554            (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2555            mogrify_image=SampleImage(*image,geometry.width,geometry.height,
2556              exception);
2557            break;
2558          }
2559        if (LocaleCompare("scale",option+1) == 0)
2560          {
2561            /*
2562              Resize image.
2563            */
2564            (void) SyncImageSettings(mogrify_info,*image);
2565            (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2566            mogrify_image=ScaleImage(*image,geometry.width,geometry.height,
2567              exception);
2568            break;
2569          }
2570        if (LocaleCompare("selective-blur",option+1) == 0)
2571          {
2572            /*
2573              Selectively blur pixels within a contrast threshold.
2574            */
2575            (void) SyncImageSettings(mogrify_info,*image);
2576            flags=ParseGeometry(argv[i+1],&geometry_info);
2577            if ((flags & PercentValue) != 0)
2578              geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0;
2579            mogrify_image=SelectiveBlurImage(*image,geometry_info.rho,
2580              geometry_info.sigma,geometry_info.xi,exception);
2581            break;
2582          }
2583        if (LocaleCompare("separate",option+1) == 0)
2584          {
2585            /*
2586              Break channels into separate images.
2587            */
2588            (void) SyncImageSettings(mogrify_info,*image);
2589            mogrify_image=SeparateImages(*image,exception);
2590            break;
2591          }
2592        if (LocaleCompare("sepia-tone",option+1) == 0)
2593          {
2594            double
2595              threshold;
2596
2597            /*
2598              Sepia-tone image.
2599            */
2600            (void) SyncImageSettings(mogrify_info,*image);
2601            threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
2602            mogrify_image=SepiaToneImage(*image,threshold,exception);
2603            break;
2604          }
2605        if (LocaleCompare("segment",option+1) == 0)
2606          {
2607            /*
2608              Segment image.
2609            */
2610            (void) SyncImageSettings(mogrify_info,*image);
2611            flags=ParseGeometry(argv[i+1],&geometry_info);
2612            if ((flags & SigmaValue) == 0)
2613              geometry_info.sigma=1.0;
2614            (void) SegmentImage(*image,(*image)->colorspace,
2615              mogrify_info->verbose,geometry_info.rho,geometry_info.sigma);
2616            InheritException(exception,&(*image)->exception);
2617            break;
2618          }
2619        if (LocaleCompare("set",option+1) == 0)
2620          {
2621            char
2622              *value;
2623
2624            /*
2625              Set image option.
2626            */
2627            if (*option == '+')
2628              {
2629                if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
2630                  (void) DeleteImageRegistry(argv[i+1]+9);
2631                else
2632                  if (LocaleNCompare(argv[i+1],"option:",7) == 0)
2633                    {
2634                      (void) DeleteImageOption(mogrify_info,argv[i+1]+7);
2635                      (void) DeleteImageArtifact(*image,argv[i+1]+7);
2636                    }
2637                  else
2638                    (void) DeleteImageProperty(*image,argv[i+1]);
2639                break;
2640              }
2641            value=InterpretImageProperties(mogrify_info,*image,argv[i+2]);
2642            if (value == (char *) NULL)
2643              break;
2644            if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
2645              (void) SetImageRegistry(StringRegistryType,argv[i+1]+9,value,
2646                exception);
2647            else
2648              if (LocaleNCompare(argv[i+1],"option:",7) == 0)
2649                {
2650                  (void) SetImageOption(image_info,argv[i+1]+7,value);
2651                  (void) SetImageOption(mogrify_info,argv[i+1]+7,value);
2652                  (void) SetImageArtifact(*image,argv[i+1]+7,value);
2653                }
2654              else
2655                (void) SetImageProperty(*image,argv[i+1],value);
2656            value=DestroyString(value);
2657            break;
2658          }
2659        if (LocaleCompare("shade",option+1) == 0)
2660          {
2661            /*
2662              Shade image.
2663            */
2664            (void) SyncImageSettings(mogrify_info,*image);
2665            flags=ParseGeometry(argv[i+1],&geometry_info);
2666            if ((flags & SigmaValue) == 0)
2667              geometry_info.sigma=1.0;
2668            mogrify_image=ShadeImage(*image,(*option == '-') ? MagickTrue :
2669              MagickFalse,geometry_info.rho,geometry_info.sigma,exception);
2670            break;
2671          }
2672        if (LocaleCompare("shadow",option+1) == 0)
2673          {
2674            /*
2675              Shadow image.
2676            */
2677            (void) SyncImageSettings(mogrify_info,*image);
2678            flags=ParseGeometry(argv[i+1],&geometry_info);
2679            if ((flags & SigmaValue) == 0)
2680              geometry_info.sigma=1.0;
2681            if ((flags & XiValue) == 0)
2682              geometry_info.xi=4.0;
2683            if ((flags & PsiValue) == 0)
2684              geometry_info.psi=4.0;
2685            mogrify_image=ShadowImage(*image,geometry_info.rho,
2686              geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t)
2687              ceil(geometry_info.psi-0.5),exception);
2688            break;
2689          }
2690        if (LocaleCompare("sharpen",option+1) == 0)
2691          {
2692            /*
2693              Sharpen image.
2694            */
2695            (void) SyncImageSettings(mogrify_info,*image);
2696            flags=ParseGeometry(argv[i+1],&geometry_info);
2697            if ((flags & SigmaValue) == 0)
2698              geometry_info.sigma=1.0;
2699            mogrify_image=SharpenImage(*image,geometry_info.rho,
2700              geometry_info.sigma,exception);
2701            break;
2702          }
2703        if (LocaleCompare("shave",option+1) == 0)
2704          {
2705            /*
2706              Shave the image edges.
2707            */
2708            (void) SyncImageSettings(mogrify_info,*image);
2709            flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2710            mogrify_image=ShaveImage(*image,&geometry,exception);
2711            break;
2712          }
2713        if (LocaleCompare("shear",option+1) == 0)
2714          {
2715            /*
2716              Shear image.
2717            */
2718            (void) SyncImageSettings(mogrify_info,*image);
2719            flags=ParseGeometry(argv[i+1],&geometry_info);
2720            if ((flags & SigmaValue) == 0)
2721              geometry_info.sigma=geometry_info.rho;
2722            mogrify_image=ShearImage(*image,geometry_info.rho,
2723              geometry_info.sigma,exception);
2724            break;
2725          }
2726        if (LocaleCompare("sigmoidal-contrast",option+1) == 0)
2727          {
2728            /*
2729              Sigmoidal non-linearity contrast control.
2730            */
2731            (void) SyncImageSettings(mogrify_info,*image);
2732            flags=ParseGeometry(argv[i+1],&geometry_info);
2733            if ((flags & SigmaValue) == 0)
2734              geometry_info.sigma=(double) QuantumRange/2.0;
2735            if ((flags & PercentValue) != 0)
2736              geometry_info.sigma=(double) QuantumRange*geometry_info.sigma/
2737                100.0;
2738            (void) SigmoidalContrastImage(*image,(*option == '-') ?
2739              MagickTrue : MagickFalse,geometry_info.rho,geometry_info.sigma);
2740            InheritException(exception,&(*image)->exception);
2741            break;
2742          }
2743        if (LocaleCompare("sketch",option+1) == 0)
2744          {
2745            /*
2746              Sketch image.
2747            */
2748            (void) SyncImageSettings(mogrify_info,*image);
2749            flags=ParseGeometry(argv[i+1],&geometry_info);
2750            if ((flags & SigmaValue) == 0)
2751              geometry_info.sigma=1.0;
2752            mogrify_image=SketchImage(*image,geometry_info.rho,
2753              geometry_info.sigma,geometry_info.xi,exception);
2754            break;
2755          }
2756        if (LocaleCompare("solarize",option+1) == 0)
2757          {
2758            double
2759              threshold;
2760
2761            (void) SyncImageSettings(mogrify_info,*image);
2762            threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
2763            (void) SolarizeImage(*image,threshold);
2764            InheritException(exception,&(*image)->exception);
2765            break;
2766          }
2767        if (LocaleCompare("sparse-color",option+1) == 0)
2768          {
2769            SparseColorMethod
2770              method;
2771
2772            char
2773              *arguments;
2774
2775            /*
2776              Sparse Color Interpolated Gradient
2777            */
2778            (void) SyncImageSettings(mogrify_info,*image);
2779            method=(SparseColorMethod) ParseCommandOption(
2780              MagickSparseColorOptions,MagickFalse,argv[i+1]);
2781            arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2]);
2782            InheritException(exception,&(*image)->exception);
2783            if (arguments == (char *) NULL)
2784              break;
2785            mogrify_image=SparseColorOption(*image,method,arguments,
2786              option[0] == '+' ? MagickTrue : MagickFalse,exception);
2787            arguments=DestroyString(arguments);
2788            break;
2789          }
2790        if (LocaleCompare("splice",option+1) == 0)
2791          {
2792            /*
2793              Splice a solid color into the image.
2794            */
2795            (void) SyncImageSettings(mogrify_info,*image);
2796            (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
2797            mogrify_image=SpliceImage(*image,&geometry,exception);
2798            break;
2799          }
2800        if (LocaleCompare("spread",option+1) == 0)
2801          {
2802            /*
2803              Spread an image.
2804            */
2805            (void) SyncImageSettings(mogrify_info,*image);
2806            (void) ParseGeometry(argv[i+1],&geometry_info);
2807            mogrify_image=SpreadImage(*image,geometry_info.rho,exception);
2808            break;
2809          }
2810        if (LocaleCompare("statistic",option+1) == 0)
2811          {
2812            StatisticType
2813              type;
2814
2815            (void) SyncImageSettings(mogrify_info,*image);
2816            type=(StatisticType) ParseCommandOption(MagickStatisticOptions,
2817              MagickFalse,argv[i+1]);
2818            (void) ParseGeometry(argv[i+2],&geometry_info);
2819            mogrify_image=StatisticImage(*image,type,(size_t) geometry_info.rho,
2820              (size_t) geometry_info.sigma,exception);
2821            break;
2822          }
2823        if (LocaleCompare("stretch",option+1) == 0)
2824          {
2825            if (*option == '+')
2826              {
2827                draw_info->stretch=UndefinedStretch;
2828                break;
2829              }
2830            draw_info->stretch=(StretchType) ParseCommandOption(
2831              MagickStretchOptions,MagickFalse,argv[i+1]);
2832            break;
2833          }
2834        if (LocaleCompare("strip",option+1) == 0)
2835          {
2836            /*
2837              Strip image of profiles and comments.
2838            */
2839            (void) SyncImageSettings(mogrify_info,*image);
2840            (void) StripImage(*image);
2841            InheritException(exception,&(*image)->exception);
2842            break;
2843          }
2844        if (LocaleCompare("stroke",option+1) == 0)
2845          {
2846            ExceptionInfo
2847              *sans;
2848
2849            if (*option == '+')
2850              {
2851                (void) QueryColorDatabase("none",&draw_info->stroke,exception);
2852                if (draw_info->stroke_pattern != (Image *) NULL)
2853                  draw_info->stroke_pattern=DestroyImage(
2854                    draw_info->stroke_pattern);
2855                break;
2856              }
2857            sans=AcquireExceptionInfo();
2858            status=QueryColorDatabase(argv[i+1],&draw_info->stroke,sans);
2859            sans=DestroyExceptionInfo(sans);
2860            if (status == MagickFalse)
2861              draw_info->stroke_pattern=GetImageCache(mogrify_info,argv[i+1],
2862                exception);
2863            break;
2864          }
2865        if (LocaleCompare("strokewidth",option+1) == 0)
2866          {
2867            draw_info->stroke_width=InterpretLocaleValue(argv[i+1],
2868              (char **) NULL);
2869            break;
2870          }
2871        if (LocaleCompare("style",option+1) == 0)
2872          {
2873            if (*option == '+')
2874              {
2875                draw_info->style=UndefinedStyle;
2876                break;
2877              }
2878            draw_info->style=(StyleType) ParseCommandOption(MagickStyleOptions,
2879              MagickFalse,argv[i+1]);
2880            break;
2881          }
2882        if (LocaleCompare("swirl",option+1) == 0)
2883          {
2884            /*
2885              Swirl image.
2886            */
2887            (void) SyncImageSettings(mogrify_info,*image);
2888            (void) ParseGeometry(argv[i+1],&geometry_info);
2889            mogrify_image=SwirlImage(*image,geometry_info.rho,exception);
2890            break;
2891          }
2892        break;
2893      }
2894      case 't':
2895      {
2896        if (LocaleCompare("threshold",option+1) == 0)
2897          {
2898            double
2899              threshold;
2900
2901            /*
2902              Threshold image.
2903            */
2904            (void) SyncImageSettings(mogrify_info,*image);
2905            if (*option == '+')
2906              threshold=(double) QuantumRange/2;
2907            else
2908              threshold=SiPrefixToDouble(argv[i+1],QuantumRange);
2909            (void) BilevelImage(*image,threshold);
2910            InheritException(exception,&(*image)->exception);
2911            break;
2912          }
2913        if (LocaleCompare("thumbnail",option+1) == 0)
2914          {
2915            /*
2916              Thumbnail image.
2917            */
2918            (void) SyncImageSettings(mogrify_info,*image);
2919            (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2920            mogrify_image=ThumbnailImage(*image,geometry.width,geometry.height,
2921              exception);
2922            break;
2923          }
2924        if (LocaleCompare("tile",option+1) == 0)
2925          {
2926            if (*option == '+')
2927              {
2928                if (draw_info->fill_pattern != (Image *) NULL)
2929                  draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern);
2930                break;
2931              }
2932            draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1],
2933              exception);
2934            break;
2935          }
2936        if (LocaleCompare("tint",option+1) == 0)
2937          {
2938            /*
2939              Tint the image.
2940            */
2941            (void) SyncImageSettings(mogrify_info,*image);
2942            mogrify_image=TintImage(*image,argv[i+1],draw_info->fill,exception);
2943            break;
2944          }
2945        if (LocaleCompare("transform",option+1) == 0)
2946          {
2947            /*
2948              Affine transform image.
2949            */
2950            (void) SyncImageSettings(mogrify_info,*image);
2951            mogrify_image=AffineTransformImage(*image,&draw_info->affine,
2952              exception);
2953            break;
2954          }
2955        if (LocaleCompare("transparent",option+1) == 0)
2956          {
2957            PixelInfo
2958              target;
2959
2960            (void) SyncImageSettings(mogrify_info,*image);
2961            (void) QueryMagickColor(argv[i+1],&target,exception);
2962            (void) TransparentPaintImage(*image,&target,(Quantum)
2963              TransparentAlpha,*option == '-' ? MagickFalse : MagickTrue);
2964            InheritException(exception,&(*image)->exception);
2965            break;
2966          }
2967        if (LocaleCompare("transpose",option+1) == 0)
2968          {
2969            /*
2970              Transpose image scanlines.
2971            */
2972            (void) SyncImageSettings(mogrify_info,*image);
2973            mogrify_image=TransposeImage(*image,exception);
2974            break;
2975          }
2976        if (LocaleCompare("transverse",option+1) == 0)
2977          {
2978            /*
2979              Transverse image scanlines.
2980            */
2981            (void) SyncImageSettings(mogrify_info,*image);
2982            mogrify_image=TransverseImage(*image,exception);
2983            break;
2984          }
2985        if (LocaleCompare("treedepth",option+1) == 0)
2986          {
2987            quantize_info->tree_depth=StringToUnsignedLong(argv[i+1]);
2988            break;
2989          }
2990        if (LocaleCompare("trim",option+1) == 0)
2991          {
2992            /*
2993              Trim image.
2994            */
2995            (void) SyncImageSettings(mogrify_info,*image);
2996            mogrify_image=TrimImage(*image,exception);
2997            break;
2998          }
2999        if (LocaleCompare("type",option+1) == 0)
3000          {
3001            ImageType
3002              type;
3003
3004            (void) SyncImageSettings(mogrify_info,*image);
3005            if (*option == '+')
3006              type=UndefinedType;
3007            else
3008              type=(ImageType) ParseCommandOption(MagickTypeOptions,MagickFalse,
3009                argv[i+1]);
3010            (*image)->type=UndefinedType;
3011            (void) SetImageType(*image,type);
3012            InheritException(exception,&(*image)->exception);
3013            break;
3014          }
3015        break;
3016      }
3017      case 'u':
3018      {
3019        if (LocaleCompare("undercolor",option+1) == 0)
3020          {
3021            (void) QueryColorDatabase(argv[i+1],&draw_info->undercolor,
3022              exception);
3023            break;
3024          }
3025        if (LocaleCompare("unique",option+1) == 0)
3026          {
3027            if (*option == '+')
3028              {
3029                (void) DeleteImageArtifact(*image,"identify:unique-colors");
3030                break;
3031              }
3032            (void) SetImageArtifact(*image,"identify:unique-colors","true");
3033            (void) SetImageArtifact(*image,"verbose","true");
3034            break;
3035          }
3036        if (LocaleCompare("unique-colors",option+1) == 0)
3037          {
3038            /*
3039              Unique image colors.
3040            */
3041            (void) SyncImageSettings(mogrify_info,*image);
3042            mogrify_image=UniqueImageColors(*image,exception);
3043            break;
3044          }
3045        if (LocaleCompare("unsharp",option+1) == 0)
3046          {
3047            /*
3048              Unsharp mask image.
3049            */
3050            (void) SyncImageSettings(mogrify_info,*image);
3051            flags=ParseGeometry(argv[i+1],&geometry_info);
3052            if ((flags & SigmaValue) == 0)
3053              geometry_info.sigma=1.0;
3054            if ((flags & XiValue) == 0)
3055              geometry_info.xi=1.0;
3056            if ((flags & PsiValue) == 0)
3057              geometry_info.psi=0.05;
3058            mogrify_image=UnsharpMaskImage(*image,geometry_info.rho,
3059              geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
3060            break;
3061          }
3062        break;
3063      }
3064      case 'v':
3065      {
3066        if (LocaleCompare("verbose",option+1) == 0)
3067          {
3068            (void) SetImageArtifact(*image,option+1,
3069              *option == '+' ? "false" : "true");
3070            break;
3071          }
3072        if (LocaleCompare("vignette",option+1) == 0)
3073          {
3074            /*
3075              Vignette image.
3076            */
3077            (void) SyncImageSettings(mogrify_info,*image);
3078            flags=ParseGeometry(argv[i+1],&geometry_info);
3079            if ((flags & SigmaValue) == 0)
3080              geometry_info.sigma=1.0;
3081            if ((flags & XiValue) == 0)
3082              geometry_info.xi=0.1*(*image)->columns;
3083            if ((flags & PsiValue) == 0)
3084              geometry_info.psi=0.1*(*image)->rows;
3085            mogrify_image=VignetteImage(*image,geometry_info.rho,
3086              geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t)
3087              ceil(geometry_info.psi-0.5),exception);
3088            break;
3089          }
3090        if (LocaleCompare("virtual-pixel",option+1) == 0)
3091          {
3092            if (*option == '+')
3093              {
3094                (void) SetImageVirtualPixelMethod(*image,
3095                  UndefinedVirtualPixelMethod);
3096                break;
3097              }
3098            (void) SetImageVirtualPixelMethod(*image,(VirtualPixelMethod)
3099              ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
3100              argv[i+1]));
3101            break;
3102          }
3103        break;
3104      }
3105      case 'w':
3106      {
3107        if (LocaleCompare("wave",option+1) == 0)
3108          {
3109            /*
3110              Wave image.
3111            */
3112            (void) SyncImageSettings(mogrify_info,*image);
3113            flags=ParseGeometry(argv[i+1],&geometry_info);
3114            if ((flags & SigmaValue) == 0)
3115              geometry_info.sigma=1.0;
3116            mogrify_image=WaveImage(*image,geometry_info.rho,
3117              geometry_info.sigma,exception);
3118            break;
3119          }
3120        if (LocaleCompare("weight",option+1) == 0)
3121          {
3122            draw_info->weight=StringToUnsignedLong(argv[i+1]);
3123            if (LocaleCompare(argv[i+1],"all") == 0)
3124              draw_info->weight=0;
3125            if (LocaleCompare(argv[i+1],"bold") == 0)
3126              draw_info->weight=700;
3127            if (LocaleCompare(argv[i+1],"bolder") == 0)
3128              if (draw_info->weight <= 800)
3129                draw_info->weight+=100;
3130            if (LocaleCompare(argv[i+1],"lighter") == 0)
3131              if (draw_info->weight >= 100)
3132                draw_info->weight-=100;
3133            if (LocaleCompare(argv[i+1],"normal") == 0)
3134              draw_info->weight=400;
3135            break;
3136          }
3137        if (LocaleCompare("white-threshold",option+1) == 0)
3138          {
3139            /*
3140              White threshold image.
3141            */
3142            (void) SyncImageSettings(mogrify_info,*image);
3143            (void) WhiteThresholdImage(*image,argv[i+1],exception);
3144            InheritException(exception,&(*image)->exception);
3145            break;
3146          }
3147        break;
3148      }
3149      default:
3150        break;
3151    }
3152    /*
3153       Replace current image with any image that was generated
3154    */
3155    if (mogrify_image != (Image *) NULL)
3156      ReplaceImageInListReturnLast(image,mogrify_image);
3157    i+=count;
3158  }
3159  if (region_image != (Image *) NULL)
3160    {
3161      /*
3162        Composite transformed region onto image.
3163      */
3164      (void) SyncImageSettings(mogrify_info,*image);
3165      (void) CompositeImage(region_image,region_image->matte !=
3166         MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
3167         region_geometry.x,region_geometry.y);
3168      InheritException(exception,&region_image->exception);
3169      *image=DestroyImage(*image);
3170      *image=region_image;
3171      region_image = (Image *) NULL;
3172    }
3173  /*
3174    Free resources.
3175  */
3176  quantize_info=DestroyQuantizeInfo(quantize_info);
3177  draw_info=DestroyDrawInfo(draw_info);
3178  mogrify_info=DestroyImageInfo(mogrify_info);
3179  status=(MagickStatusType) ((*image)->exception.severity ==
3180    UndefinedException ? 1 : 0);
3181  return(status == 0 ? MagickFalse : MagickTrue);
3182}
3183
3184/*
3185%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3186%                                                                             %
3187%                                                                             %
3188%                                                                             %
3189+    M o g r i f y I m a g e C o m m a n d                                    %
3190%                                                                             %
3191%                                                                             %
3192%                                                                             %
3193%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3194%
3195%  MogrifyImageCommand() transforms an image or a sequence of images. These
3196%  transforms include image scaling, image rotation, color reduction, and
3197%  others. The transmogrified image overwrites the original image.
3198%
3199%  The format of the MogrifyImageCommand method is:
3200%
3201%      MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,int argc,
3202%        const char **argv,char **metadata,ExceptionInfo *exception)
3203%
3204%  A description of each parameter follows:
3205%
3206%    o image_info: the image info.
3207%
3208%    o argc: the number of elements in the argument vector.
3209%
3210%    o argv: A text array containing the command line arguments.
3211%
3212%    o metadata: any metadata is returned here.
3213%
3214%    o exception: return any errors or warnings in this structure.
3215%
3216*/
3217
3218static MagickBooleanType MogrifyUsage(void)
3219{
3220  static const char
3221    *miscellaneous[]=
3222    {
3223      "-debug events        display copious debugging information",
3224      "-help                print program options",
3225      "-list type           print a list of supported option arguments",
3226      "-log format          format of debugging information",
3227      "-version             print version information",
3228      (char *) NULL
3229    },
3230    *operators[]=
3231    {
3232      "-adaptive-blur geometry",
3233      "                     adaptively blur pixels; decrease effect near edges",
3234      "-adaptive-resize geometry",
3235      "                     adaptively resize image using 'mesh' interpolation",
3236      "-adaptive-sharpen geometry",
3237      "                     adaptively sharpen pixels; increase effect near edges",
3238      "-alpha option        on, activate, off, deactivate, set, opaque, copy",
3239      "                     transparent, extract, background, or shape",
3240      "-annotate geometry text",
3241      "                     annotate the image with text",
3242      "-auto-gamma          automagically adjust gamma level of image",
3243      "-auto-level          automagically adjust color levels of image",
3244      "-auto-orient         automagically orient (rotate) image",
3245      "-bench iterations    measure performance",
3246      "-black-threshold value",
3247      "                     force all pixels below the threshold into black",
3248      "-blue-shift          simulate a scene at nighttime in the moonlight",
3249      "-blur geometry       reduce image noise and reduce detail levels",
3250      "-border geometry     surround image with a border of color",
3251      "-bordercolor color   border color",
3252      "-brightness-contrast geometry",
3253      "                     improve brightness / contrast of the image",
3254      "-cdl filename        color correct with a color decision list",
3255      "-charcoal radius     simulate a charcoal drawing",
3256      "-chop geometry       remove pixels from the image interior",
3257      "-clamp               restrict pixel range from 0 to the quantum depth",
3258      "-clip                clip along the first path from the 8BIM profile",
3259      "-clip-mask filename  associate a clip mask with the image",
3260      "-clip-path id        clip along a named path from the 8BIM profile",
3261      "-colorize value      colorize the image with the fill color",
3262      "-color-matrix matrix apply color correction to the image",
3263      "-contrast            enhance or reduce the image contrast",
3264      "-contrast-stretch geometry",
3265      "                     improve contrast by `stretching' the intensity range",
3266      "-convolve coefficients",
3267      "                     apply a convolution kernel to the image",
3268      "-cycle amount        cycle the image colormap",
3269      "-decipher filename   convert cipher pixels to plain pixels",
3270      "-deskew threshold    straighten an image",
3271      "-despeckle           reduce the speckles within an image",
3272      "-distort method args",
3273      "                     distort images according to given method ad args",
3274      "-draw string         annotate the image with a graphic primitive",
3275      "-edge radius         apply a filter to detect edges in the image",
3276      "-encipher filename   convert plain pixels to cipher pixels",
3277      "-emboss radius       emboss an image",
3278      "-enhance             apply a digital filter to enhance a noisy image",
3279      "-equalize            perform histogram equalization to an image",
3280      "-evaluate operator value",
3281      "                     evaluate an arithmetic, relational, or logical expression",
3282      "-extent geometry     set the image size",
3283      "-extract geometry    extract area from image",
3284      "-fft                 implements the discrete Fourier transform (DFT)",
3285      "-flip                flip image vertically",
3286      "-floodfill geometry color",
3287      "                     floodfill the image with color",
3288      "-flop                flop image horizontally",
3289      "-frame geometry      surround image with an ornamental border",
3290      "-function name parameters",
3291      "                     apply function over image values",
3292      "-gamma value         level of gamma correction",
3293      "-gaussian-blur geometry",
3294      "                     reduce image noise and reduce detail levels",
3295      "-geometry geometry   preferred size or location of the image",
3296      "-identify            identify the format and characteristics of the image",
3297      "-ift                 implements the inverse discrete Fourier transform (DFT)",
3298      "-implode amount      implode image pixels about the center",
3299      "-lat geometry        local adaptive thresholding",
3300      "-layers method       optimize, merge,  or compare image layers",
3301      "-level value         adjust the level of image contrast",
3302      "-level-colors color,color",
3303      "                     level image with the given colors",
3304      "-linear-stretch geometry",
3305      "                     improve contrast by `stretching with saturation'",
3306      "-liquid-rescale geometry",
3307      "                     rescale image with seam-carving",
3308      "-median geometry     apply a median filter to the image",
3309      "-mode geometry       make each pixel the 'predominant color' of the neighborhood",
3310      "-modulate value      vary the brightness, saturation, and hue",
3311      "-monochrome          transform image to black and white",
3312      "-morphology method kernel",
3313      "                     apply a morphology method to the image",
3314      "-motion-blur geometry",
3315      "                     simulate motion blur",
3316      "-negate              replace every pixel with its complementary color ",
3317      "-noise geometry      add or reduce noise in an image",
3318      "-normalize           transform image to span the full range of colors",
3319      "-opaque color        change this color to the fill color",
3320      "-ordered-dither NxN",
3321      "                     add a noise pattern to the image with specific",
3322      "                     amplitudes",
3323      "-paint radius        simulate an oil painting",
3324      "-polaroid angle      simulate a Polaroid picture",
3325      "-posterize levels    reduce the image to a limited number of color levels",
3326      "-profile filename    add, delete, or apply an image profile",
3327      "-quantize colorspace reduce colors in this colorspace",
3328      "-radial-blur angle   radial blur the image",
3329      "-raise value         lighten/darken image edges to create a 3-D effect",
3330      "-random-threshold low,high",
3331      "                     random threshold the image",
3332      "-region geometry     apply options to a portion of the image",
3333      "-render              render vector graphics",
3334      "-repage geometry     size and location of an image canvas",
3335      "-resample geometry   change the resolution of an image",
3336      "-resize geometry     resize the image",
3337      "-roll geometry       roll an image vertically or horizontally",
3338      "-rotate degrees      apply Paeth rotation to the image",
3339      "-sample geometry     scale image with pixel sampling",
3340      "-scale geometry      scale the image",
3341      "-segment values      segment an image",
3342      "-selective-blur geometry",
3343      "                     selectively blur pixels within a contrast threshold",
3344      "-sepia-tone threshold",
3345      "                     simulate a sepia-toned photo",
3346      "-set property value  set an image property",
3347      "-shade degrees       shade the image using a distant light source",
3348      "-shadow geometry     simulate an image shadow",
3349      "-sharpen geometry    sharpen the image",
3350      "-shave geometry      shave pixels from the image edges",
3351      "-shear geometry      slide one edge of the image along the X or Y axis",
3352      "-sigmoidal-contrast geometry",
3353      "                     increase the contrast without saturating highlights or shadows",
3354      "-sketch geometry     simulate a pencil sketch",
3355      "-solarize threshold  negate all pixels above the threshold level",
3356      "-sparse-color method args",
3357      "                     fill in a image based on a few color points",
3358      "-splice geometry     splice the background color into the image",
3359      "-spread radius       displace image pixels by a random amount",
3360      "-statistic type radius",
3361      "                     replace each pixel with corresponding statistic from the neighborhood",
3362      "-strip               strip image of all profiles and comments",
3363      "-swirl degrees       swirl image pixels about the center",
3364      "-threshold value     threshold the image",
3365      "-thumbnail geometry  create a thumbnail of the image",
3366      "-tile filename       tile image when filling a graphic primitive",
3367      "-tint value          tint the image with the fill color",
3368      "-transform           affine transform image",
3369      "-transparent color   make this color transparent within the image",
3370      "-transpose           flip image vertically and rotate 90 degrees",
3371      "-transverse          flop image horizontally and rotate 270 degrees",
3372      "-trim                trim image edges",
3373      "-type type           image type",
3374      "-unique-colors       discard all but one of any pixel color",
3375      "-unsharp geometry    sharpen the image",
3376      "-vignette geometry   soften the edges of the image in vignette style",
3377      "-wave geometry       alter an image along a sine wave",
3378      "-white-threshold value",
3379      "                     force all pixels above the threshold into white",
3380      (char *) NULL
3381    },
3382    *sequence_operators[]=
3383    {
3384      "-append              append an image sequence",
3385      "-clut                apply a color lookup table to the image",
3386      "-coalesce            merge a sequence of images",
3387      "-combine             combine a sequence of images",
3388      "-composite           composite image",
3389      "-crop geometry       cut out a rectangular region of the image",
3390      "-deconstruct         break down an image sequence into constituent parts",
3391      "-evaluate-sequence operator",
3392      "                     evaluate an arithmetic, relational, or logical expression",
3393      "-flatten             flatten a sequence of images",
3394      "-fx expression       apply mathematical expression to an image channel(s)",
3395      "-hald-clut           apply a Hald color lookup table to the image",
3396      "-morph value         morph an image sequence",
3397      "-mosaic              create a mosaic from an image sequence",
3398      "-print string        interpret string and print to console",
3399      "-process arguments   process the image with a custom image filter",
3400      "-separate            separate an image channel into a grayscale image",
3401      "-smush geometry      smush an image sequence together",
3402      "-write filename      write images to this file",
3403      (char *) NULL
3404    },
3405    *settings[]=
3406    {
3407      "-adjoin              join images into a single multi-image file",
3408      "-affine matrix       affine transform matrix",
3409      "-alpha option        activate, deactivate, reset, or set the alpha channel",
3410      "-antialias           remove pixel-aliasing",
3411      "-authenticate password",
3412      "                     decipher image with this password",
3413      "-attenuate value     lessen (or intensify) when adding noise to an image",
3414      "-background color    background color",
3415      "-bias value          add bias when convolving an image",
3416      "-black-point-compensation",
3417      "                     use black point compensation",
3418      "-blue-primary point  chromaticity blue primary point",
3419      "-bordercolor color   border color",
3420      "-caption string      assign a caption to an image",
3421      "-channel type        apply option to select image channels",
3422      "-colors value        preferred number of colors in the image",
3423      "-colorspace type     alternate image colorspace",
3424      "-comment string      annotate image with comment",
3425      "-compose operator    set image composite operator",
3426      "-compress type       type of pixel compression when writing the image",
3427      "-define format:option",
3428      "                     define one or more image format options",
3429      "-delay value         display the next image after pausing",
3430      "-density geometry    horizontal and vertical density of the image",
3431      "-depth value         image depth",
3432      "-direction type      render text right-to-left or left-to-right",
3433      "-display server      get image or font from this X server",
3434      "-dispose method      layer disposal method",
3435      "-dither method       apply error diffusion to image",
3436      "-encoding type       text encoding type",
3437      "-endian type         endianness (MSB or LSB) of the image",
3438      "-family name         render text with this font family",
3439      "-fill color          color to use when filling a graphic primitive",
3440      "-filter type         use this filter when resizing an image",
3441      "-font name           render text with this font",
3442      "-format \"string\"     output formatted image characteristics",
3443      "-fuzz distance       colors within this distance are considered equal",
3444      "-gravity type        horizontal and vertical text placement",
3445      "-green-primary point chromaticity green primary point",
3446      "-intent type         type of rendering intent when managing the image color",
3447      "-interlace type      type of image interlacing scheme",
3448      "-interline-spacing value",
3449      "                     set the space between two text lines",
3450      "-interpolate method  pixel color interpolation method",
3451      "-interword-spacing value",
3452      "                     set the space between two words",
3453      "-kerning value       set the space between two letters",
3454      "-label string        assign a label to an image",
3455      "-limit type value    pixel cache resource limit",
3456      "-loop iterations     add Netscape loop extension to your GIF animation",
3457      "-mask filename       associate a mask with the image",
3458      "-mattecolor color    frame color",
3459      "-monitor             monitor progress",
3460      "-orient type         image orientation",
3461      "-page geometry       size and location of an image canvas (setting)",
3462      "-ping                efficiently determine image attributes",
3463      "-pointsize value     font point size",
3464      "-precision value     maximum number of significant digits to print",
3465      "-preview type        image preview type",
3466      "-quality value       JPEG/MIFF/PNG compression level",
3467      "-quiet               suppress all warning messages",
3468      "-red-primary point   chromaticity red primary point",
3469      "-regard-warnings     pay attention to warning messages",
3470      "-remap filename      transform image colors to match this set of colors",
3471      "-respect-parentheses settings remain in effect until parenthesis boundary",
3472      "-sampling-factor geometry",
3473      "                     horizontal and vertical sampling factor",
3474      "-scene value         image scene number",
3475      "-seed value          seed a new sequence of pseudo-random numbers",
3476      "-size geometry       width and height of image",
3477      "-stretch type        render text with this font stretch",
3478      "-stroke color        graphic primitive stroke color",
3479      "-strokewidth value   graphic primitive stroke width",
3480      "-style type          render text with this font style",
3481      "-synchronize         synchronize image to storage device",
3482      "-taint               declare the image as modified",
3483      "-texture filename    name of texture to tile onto the image background",
3484      "-tile-offset geometry",
3485      "                     tile offset",
3486      "-treedepth value     color tree depth",
3487      "-transparent-color color",
3488      "                     transparent color",
3489      "-undercolor color    annotation bounding box color",
3490      "-units type          the units of image resolution",
3491      "-verbose             print detailed information about the image",
3492      "-view                FlashPix viewing transforms",
3493      "-virtual-pixel method",
3494      "                     virtual pixel access method",
3495      "-weight type         render text with this font weight",
3496      "-white-point point   chromaticity white point",
3497      (char *) NULL
3498    },
3499    *stack_operators[]=
3500    {
3501      "-delete indexes      delete the image from the image sequence",
3502      "-duplicate count,indexes",
3503      "                     duplicate an image one or more times",
3504      "-insert index        insert last image into the image sequence",
3505      "-reverse             reverse image sequence",
3506      "-swap indexes        swap two images in the image sequence",
3507      (char *) NULL
3508    };
3509
3510  const char
3511    **p;
3512
3513  (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
3514  (void) printf("Copyright: %s\n",GetMagickCopyright());
3515  (void) printf("Features: %s\n\n",GetMagickFeatures());
3516  (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n",
3517    GetClientName());
3518  (void) printf("\nImage Settings:\n");
3519  for (p=settings; *p != (char *) NULL; p++)
3520    (void) printf("  %s\n",*p);
3521  (void) printf("\nImage Operators:\n");
3522  for (p=operators; *p != (char *) NULL; p++)
3523    (void) printf("  %s\n",*p);
3524  (void) printf("\nImage Sequence Operators:\n");
3525  for (p=sequence_operators; *p != (char *) NULL; p++)
3526    (void) printf("  %s\n",*p);
3527  (void) printf("\nImage Stack Operators:\n");
3528  for (p=stack_operators; *p != (char *) NULL; p++)
3529    (void) printf("  %s\n",*p);
3530  (void) printf("\nMiscellaneous Options:\n");
3531  for (p=miscellaneous; *p != (char *) NULL; p++)
3532    (void) printf("  %s\n",*p);
3533  (void) printf(
3534    "\nBy default, the image format of `file' is determined by its magic\n");
3535  (void) printf(
3536    "number.  To specify a particular image format, precede the filename\n");
3537  (void) printf(
3538    "with an image format name and a colon (i.e. ps:image) or specify the\n");
3539  (void) printf(
3540    "image type as the filename suffix (i.e. image.ps).  Specify 'file' as\n");
3541  (void) printf("'-' for standard input or output.\n");
3542  return(MagickFalse);
3543}
3544
3545WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
3546  int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
3547{
3548#define DestroyMogrify() \
3549{ \
3550  if (format != (char *) NULL) \
3551    format=DestroyString(format); \
3552  if (path != (char *) NULL) \
3553    path=DestroyString(path); \
3554  DestroyImageStack(); \
3555  for (i=0; i < (ssize_t) argc; i++) \
3556    argv[i]=DestroyString(argv[i]); \
3557  argv=(char **) RelinquishMagickMemory(argv); \
3558}
3559#define ThrowMogrifyException(asperity,tag,option) \
3560{ \
3561  (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
3562    option); \
3563  DestroyMogrify(); \
3564  return(MagickFalse); \
3565}
3566#define ThrowMogrifyInvalidArgumentException(option,argument) \
3567{ \
3568  (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
3569    "InvalidArgument","`%s': %s",argument,option); \
3570  DestroyMogrify(); \
3571  return(MagickFalse); \
3572}
3573
3574  char
3575    *format,
3576    *option,
3577    *path;
3578
3579  Image
3580    *image;
3581
3582  ImageStack
3583    image_stack[MaxImageStackDepth+1];
3584
3585  MagickBooleanType
3586    global_colormap;
3587
3588  MagickBooleanType
3589    fire,
3590    pend,
3591    respect_parenthesis;
3592
3593  MagickStatusType
3594    status;
3595
3596  register ssize_t
3597    i;
3598
3599  ssize_t
3600    j,
3601    k;
3602
3603  /*
3604    Set defaults.
3605  */
3606  assert(image_info != (ImageInfo *) NULL);
3607  assert(image_info->signature == MagickSignature);
3608  if (image_info->debug != MagickFalse)
3609    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3610  assert(exception != (ExceptionInfo *) NULL);
3611  if (argc == 2)
3612    {
3613      option=argv[1];
3614      if ((LocaleCompare("version",option+1) == 0) ||
3615          (LocaleCompare("-version",option+1) == 0))
3616        {
3617          (void) FormatLocaleFile(stdout,"Version: %s\n",
3618            GetMagickVersion((size_t *) NULL));
3619          (void) FormatLocaleFile(stdout,"Copyright: %s\n",
3620            GetMagickCopyright());
3621          (void) FormatLocaleFile(stdout,"Features: %s\n\n",
3622            GetMagickFeatures());
3623          return(MagickFalse);
3624        }
3625    }
3626  if (argc < 2)
3627    return(MogrifyUsage());
3628  format=(char *) NULL;
3629  path=(char *) NULL;
3630  global_colormap=MagickFalse;
3631  k=0;
3632  j=1;
3633  NewImageStack();
3634  option=(char *) NULL;
3635  pend=MagickFalse;
3636  respect_parenthesis=MagickFalse;
3637  status=MagickTrue;
3638  /*
3639    Parse command line.
3640  */
3641  ReadCommandlLine(argc,&argv);
3642  status=ExpandFilenames(&argc,&argv);
3643  if (status == MagickFalse)
3644    ThrowMogrifyException(ResourceLimitError,"MemoryAllocationFailed",
3645      GetExceptionMessage(errno));
3646  for (i=1; i < (ssize_t) argc; i++)
3647  {
3648    option=argv[i];
3649    if (LocaleCompare(option,"(") == 0)
3650      {
3651        FireImageStack(MagickFalse,MagickTrue,pend);
3652        if (k == MaxImageStackDepth)
3653          ThrowMogrifyException(OptionError,"ParenthesisNestedTooDeeply",
3654            option);
3655        PushImageStack();
3656        continue;
3657      }
3658    if (LocaleCompare(option,")") == 0)
3659      {
3660        FireImageStack(MagickFalse,MagickTrue,MagickTrue);
3661        if (k == 0)
3662          ThrowMogrifyException(OptionError,"UnableToParseExpression",option);
3663        PopImageStack();
3664        continue;
3665      }
3666    if (IsCommandOption(option) == MagickFalse)
3667      {
3668        char
3669          backup_filename[MaxTextExtent],
3670          *filename;
3671
3672        Image
3673          *images;
3674
3675        /*
3676          Option is a file name: begin by reading image from specified file.
3677        */
3678        FireImageStack(MagickFalse,MagickFalse,pend);
3679        filename=argv[i];
3680        if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
3681          filename=argv[++i];
3682        (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
3683        images=ReadImages(image_info,exception);
3684        status&=(images != (Image *) NULL) &&
3685          (exception->severity < ErrorException);
3686        if (images == (Image *) NULL)
3687          continue;
3688        if (format != (char *) NULL)
3689          (void) CopyMagickString(images->filename,images->magick_filename,
3690            MaxTextExtent);
3691        if (path != (char *) NULL)
3692          {
3693            GetPathComponent(option,TailPath,filename);
3694            (void) FormatLocaleString(images->filename,MaxTextExtent,"%s%c%s",
3695              path,*DirectorySeparator,filename);
3696          }
3697        if (format != (char *) NULL)
3698          AppendImageFormat(format,images->filename);
3699        AppendImageStack(images);
3700        FinalizeImageSettings(image_info,image,MagickFalse);
3701        if (global_colormap != MagickFalse)
3702          {
3703            QuantizeInfo
3704              *quantize_info;
3705
3706            quantize_info=AcquireQuantizeInfo(image_info);
3707            (void) RemapImages(quantize_info,images,(Image *) NULL);
3708            quantize_info=DestroyQuantizeInfo(quantize_info);
3709          }
3710        *backup_filename='\0';
3711        if ((LocaleCompare(image->filename,"-") != 0) &&
3712            (IsPathWritable(image->filename) != MagickFalse))
3713          {
3714            register ssize_t
3715              i;
3716
3717            /*
3718              Rename image file as backup.
3719            */
3720            (void) CopyMagickString(backup_filename,image->filename,
3721              MaxTextExtent);
3722            for (i=0; i < 6; i++)
3723            {
3724              (void) ConcatenateMagickString(backup_filename,"~",MaxTextExtent);
3725              if (IsPathAccessible(backup_filename) == MagickFalse)
3726                break;
3727            }
3728            if ((IsPathAccessible(backup_filename) != MagickFalse) ||
3729                (rename(image->filename,backup_filename) != 0))
3730              *backup_filename='\0';
3731          }
3732        /*
3733          Write transmogrified image to disk.
3734        */
3735        image_info->synchronize=MagickTrue;
3736        status&=WriteImages(image_info,image,image->filename,exception);
3737        if ((status == MagickFalse) && (*backup_filename != '\0'))
3738          (void) remove(backup_filename);
3739        RemoveAllImageStack();
3740        continue;
3741      }
3742    pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
3743    switch (*(option+1))
3744    {
3745      case 'a':
3746      {
3747        if (LocaleCompare("adaptive-blur",option+1) == 0)
3748          {
3749            i++;
3750            if (i == (ssize_t) argc)
3751              ThrowMogrifyException(OptionError,"MissingArgument",option);
3752            if (IsGeometry(argv[i]) == MagickFalse)
3753              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3754            break;
3755          }
3756        if (LocaleCompare("adaptive-resize",option+1) == 0)
3757          {
3758            i++;
3759            if (i == (ssize_t) argc)
3760              ThrowMogrifyException(OptionError,"MissingArgument",option);
3761            if (IsGeometry(argv[i]) == MagickFalse)
3762              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3763            break;
3764          }
3765        if (LocaleCompare("adaptive-sharpen",option+1) == 0)
3766          {
3767            i++;
3768            if (i == (ssize_t) argc)
3769              ThrowMogrifyException(OptionError,"MissingArgument",option);
3770            if (IsGeometry(argv[i]) == MagickFalse)
3771              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3772            break;
3773          }
3774        if (LocaleCompare("affine",option+1) == 0)
3775          {
3776            if (*option == '+')
3777              break;
3778            i++;
3779            if (i == (ssize_t) argc)
3780              ThrowMogrifyException(OptionError,"MissingArgument",option);
3781            break;
3782          }
3783        if (LocaleCompare("alpha",option+1) == 0)
3784          {
3785            ssize_t
3786              type;
3787
3788            if (*option == '+')
3789              break;
3790            i++;
3791            if (i == (ssize_t) argc)
3792              ThrowMogrifyException(OptionError,"MissingArgument",option);
3793            type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
3794            if (type < 0)
3795              ThrowMogrifyException(OptionError,"UnrecognizedAlphaChannelType",
3796                argv[i]);
3797            break;
3798          }
3799        if (LocaleCompare("annotate",option+1) == 0)
3800          {
3801            if (*option == '+')
3802              break;
3803            i++;
3804            if (i == (ssize_t) argc)
3805              ThrowMogrifyException(OptionError,"MissingArgument",option);
3806            if (IsGeometry(argv[i]) == MagickFalse)
3807              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3808            if (i == (ssize_t) argc)
3809              ThrowMogrifyException(OptionError,"MissingArgument",option);
3810            i++;
3811            break;
3812          }
3813        if (LocaleCompare("antialias",option+1) == 0)
3814          break;
3815        if (LocaleCompare("append",option+1) == 0)
3816          break;
3817        if (LocaleCompare("attenuate",option+1) == 0)
3818          {
3819            if (*option == '+')
3820              break;
3821            i++;
3822            if (i == (ssize_t) (argc-1))
3823              ThrowMogrifyException(OptionError,"MissingArgument",option);
3824            if (IsGeometry(argv[i]) == MagickFalse)
3825              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3826            break;
3827          }
3828        if (LocaleCompare("authenticate",option+1) == 0)
3829          {
3830            if (*option == '+')
3831              break;
3832            i++;
3833            if (i == (ssize_t) argc)
3834              ThrowMogrifyException(OptionError,"MissingArgument",option);
3835            break;
3836          }
3837        if (LocaleCompare("auto-gamma",option+1) == 0)
3838          break;
3839        if (LocaleCompare("auto-level",option+1) == 0)
3840          break;
3841        if (LocaleCompare("auto-orient",option+1) == 0)
3842          break;
3843        if (LocaleCompare("average",option+1) == 0)
3844          break;
3845        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
3846      }
3847      case 'b':
3848      {
3849        if (LocaleCompare("background",option+1) == 0)
3850          {
3851            if (*option == '+')
3852              break;
3853            i++;
3854            if (i == (ssize_t) argc)
3855              ThrowMogrifyException(OptionError,"MissingArgument",option);
3856            break;
3857          }
3858        if (LocaleCompare("bias",option+1) == 0)
3859          {
3860            if (*option == '+')
3861              break;
3862            i++;
3863            if (i == (ssize_t) (argc-1))
3864              ThrowMogrifyException(OptionError,"MissingArgument",option);
3865            if (IsGeometry(argv[i]) == MagickFalse)
3866              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3867            break;
3868          }
3869        if (LocaleCompare("black-point-compensation",option+1) == 0)
3870          break;
3871        if (LocaleCompare("black-threshold",option+1) == 0)
3872          {
3873            if (*option == '+')
3874              break;
3875            i++;
3876            if (i == (ssize_t) argc)
3877              ThrowMogrifyException(OptionError,"MissingArgument",option);
3878            if (IsGeometry(argv[i]) == MagickFalse)
3879              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3880            break;
3881          }
3882        if (LocaleCompare("blue-primary",option+1) == 0)
3883          {
3884            if (*option == '+')
3885              break;
3886            i++;
3887            if (i == (ssize_t) argc)
3888              ThrowMogrifyException(OptionError,"MissingArgument",option);
3889            if (IsGeometry(argv[i]) == MagickFalse)
3890              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3891            break;
3892          }
3893        if (LocaleCompare("blue-shift",option+1) == 0)
3894          {
3895            i++;
3896            if (i == (ssize_t) argc)
3897              ThrowMogrifyException(OptionError,"MissingArgument",option);
3898            if (IsGeometry(argv[i]) == MagickFalse)
3899              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3900            break;
3901          }
3902        if (LocaleCompare("blur",option+1) == 0)
3903          {
3904            i++;
3905            if (i == (ssize_t) argc)
3906              ThrowMogrifyException(OptionError,"MissingArgument",option);
3907            if (IsGeometry(argv[i]) == MagickFalse)
3908              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3909            break;
3910          }
3911        if (LocaleCompare("border",option+1) == 0)
3912          {
3913            if (*option == '+')
3914              break;
3915            i++;
3916            if (i == (ssize_t) argc)
3917              ThrowMogrifyException(OptionError,"MissingArgument",option);
3918            if (IsGeometry(argv[i]) == MagickFalse)
3919              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3920            break;
3921          }
3922        if (LocaleCompare("bordercolor",option+1) == 0)
3923          {
3924            if (*option == '+')
3925              break;
3926            i++;
3927            if (i == (ssize_t) argc)
3928              ThrowMogrifyException(OptionError,"MissingArgument",option);
3929            break;
3930          }
3931        if (LocaleCompare("box",option+1) == 0)
3932          {
3933            if (*option == '+')
3934              break;
3935            i++;
3936            if (i == (ssize_t) argc)
3937              ThrowMogrifyException(OptionError,"MissingArgument",option);
3938            break;
3939          }
3940        if (LocaleCompare("brightness-contrast",option+1) == 0)
3941          {
3942            i++;
3943            if (i == (ssize_t) argc)
3944              ThrowMogrifyException(OptionError,"MissingArgument",option);
3945            if (IsGeometry(argv[i]) == MagickFalse)
3946              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3947            break;
3948          }
3949        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
3950      }
3951      case 'c':
3952      {
3953        if (LocaleCompare("cache",option+1) == 0)
3954          {
3955            if (*option == '+')
3956              break;
3957            i++;
3958            if (i == (ssize_t) argc)
3959              ThrowMogrifyException(OptionError,"MissingArgument",option);
3960            if (IsGeometry(argv[i]) == MagickFalse)
3961              ThrowMogrifyInvalidArgumentException(option,argv[i]);
3962            break;
3963          }
3964        if (LocaleCompare("caption",option+1) == 0)
3965          {
3966            if (*option == '+')
3967              break;
3968            i++;
3969            if (i == (ssize_t) argc)
3970              ThrowMogrifyException(OptionError,"MissingArgument",option);
3971            break;
3972          }
3973        if (LocaleCompare("channel",option+1) == 0)
3974          {
3975            ssize_t
3976              channel;
3977
3978            if (*option == '+')
3979              break;
3980            i++;
3981            if (i == (ssize_t) (argc-1))
3982              ThrowMogrifyException(OptionError,"MissingArgument",option);
3983            channel=ParseChannelOption(argv[i]);
3984            if (channel < 0)
3985              ThrowMogrifyException(OptionError,"UnrecognizedChannelType",
3986                argv[i]);
3987            break;
3988          }
3989        if (LocaleCompare("cdl",option+1) == 0)
3990          {
3991            if (*option == '+')
3992              break;
3993            i++;
3994            if (i == (ssize_t) (argc-1))
3995              ThrowMogrifyException(OptionError,"MissingArgument",option);
3996            break;
3997          }
3998        if (LocaleCompare("charcoal",option+1) == 0)
3999          {
4000            if (*option == '+')
4001              break;
4002            i++;
4003            if (i == (ssize_t) argc)
4004              ThrowMogrifyException(OptionError,"MissingArgument",option);
4005            if (IsGeometry(argv[i]) == MagickFalse)
4006              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4007            break;
4008          }
4009        if (LocaleCompare("chop",option+1) == 0)
4010          {
4011            if (*option == '+')
4012              break;
4013            i++;
4014            if (i == (ssize_t) argc)
4015              ThrowMogrifyException(OptionError,"MissingArgument",option);
4016            if (IsGeometry(argv[i]) == MagickFalse)
4017              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4018            break;
4019          }
4020        if (LocaleCompare("clamp",option+1) == 0)
4021          break;
4022        if (LocaleCompare("clip",option+1) == 0)
4023          break;
4024        if (LocaleCompare("clip-mask",option+1) == 0)
4025          {
4026            if (*option == '+')
4027              break;
4028            i++;
4029            if (i == (ssize_t) argc)
4030              ThrowMogrifyException(OptionError,"MissingArgument",option);
4031            break;
4032          }
4033        if (LocaleCompare("clut",option+1) == 0)
4034          break;
4035        if (LocaleCompare("coalesce",option+1) == 0)
4036          break;
4037        if (LocaleCompare("colorize",option+1) == 0)
4038          {
4039            if (*option == '+')
4040              break;
4041            i++;
4042            if (i == (ssize_t) argc)
4043              ThrowMogrifyException(OptionError,"MissingArgument",option);
4044            if (IsGeometry(argv[i]) == MagickFalse)
4045              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4046            break;
4047          }
4048        if (LocaleCompare("color-matrix",option+1) == 0)
4049          {
4050            KernelInfo
4051              *kernel_info;
4052
4053            if (*option == '+')
4054              break;
4055            i++;
4056            if (i == (ssize_t) (argc-1))
4057              ThrowMogrifyException(OptionError,"MissingArgument",option);
4058            kernel_info=AcquireKernelInfo(argv[i]);
4059            if (kernel_info == (KernelInfo *) NULL)
4060              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4061            kernel_info=DestroyKernelInfo(kernel_info);
4062            break;
4063          }
4064        if (LocaleCompare("colors",option+1) == 0)
4065          {
4066            if (*option == '+')
4067              break;
4068            i++;
4069            if (i == (ssize_t) argc)
4070              ThrowMogrifyException(OptionError,"MissingArgument",option);
4071            if (IsGeometry(argv[i]) == MagickFalse)
4072              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4073            break;
4074          }
4075        if (LocaleCompare("colorspace",option+1) == 0)
4076          {
4077            ssize_t
4078              colorspace;
4079
4080            if (*option == '+')
4081              break;
4082            i++;
4083            if (i == (ssize_t) argc)
4084              ThrowMogrifyException(OptionError,"MissingArgument",option);
4085            colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
4086              argv[i]);
4087            if (colorspace < 0)
4088              ThrowMogrifyException(OptionError,"UnrecognizedColorspace",
4089                argv[i]);
4090            break;
4091          }
4092        if (LocaleCompare("combine",option+1) == 0)
4093          break;
4094        if (LocaleCompare("comment",option+1) == 0)
4095          {
4096            if (*option == '+')
4097              break;
4098            i++;
4099            if (i == (ssize_t) argc)
4100              ThrowMogrifyException(OptionError,"MissingArgument",option);
4101            break;
4102          }
4103        if (LocaleCompare("composite",option+1) == 0)
4104          break;
4105        if (LocaleCompare("compress",option+1) == 0)
4106          {
4107            ssize_t
4108              compress;
4109
4110            if (*option == '+')
4111              break;
4112            i++;
4113            if (i == (ssize_t) argc)
4114              ThrowMogrifyException(OptionError,"MissingArgument",option);
4115            compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
4116              argv[i]);
4117            if (compress < 0)
4118              ThrowMogrifyException(OptionError,"UnrecognizedImageCompression",
4119                argv[i]);
4120            break;
4121          }
4122        if (LocaleCompare("concurrent",option+1) == 0)
4123          break;
4124        if (LocaleCompare("contrast",option+1) == 0)
4125          break;
4126        if (LocaleCompare("contrast-stretch",option+1) == 0)
4127          {
4128            i++;
4129            if (i == (ssize_t) argc)
4130              ThrowMogrifyException(OptionError,"MissingArgument",option);
4131            if (IsGeometry(argv[i]) == MagickFalse)
4132              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4133            break;
4134          }
4135        if (LocaleCompare("convolve",option+1) == 0)
4136          {
4137            KernelInfo
4138              *kernel_info;
4139
4140            if (*option == '+')
4141              break;
4142            i++;
4143            if (i == (ssize_t) argc)
4144              ThrowMogrifyException(OptionError,"MissingArgument",option);
4145            kernel_info=AcquireKernelInfo(argv[i]);
4146            if (kernel_info == (KernelInfo *) NULL)
4147              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4148            kernel_info=DestroyKernelInfo(kernel_info);
4149            break;
4150          }
4151        if (LocaleCompare("crop",option+1) == 0)
4152          {
4153            if (*option == '+')
4154              break;
4155            i++;
4156            if (i == (ssize_t) argc)
4157              ThrowMogrifyException(OptionError,"MissingArgument",option);
4158            if (IsGeometry(argv[i]) == MagickFalse)
4159              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4160            break;
4161          }
4162        if (LocaleCompare("cycle",option+1) == 0)
4163          {
4164            if (*option == '+')
4165              break;
4166            i++;
4167            if (i == (ssize_t) argc)
4168              ThrowMogrifyException(OptionError,"MissingArgument",option);
4169            if (IsGeometry(argv[i]) == MagickFalse)
4170              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4171            break;
4172          }
4173        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4174      }
4175      case 'd':
4176      {
4177        if (LocaleCompare("decipher",option+1) == 0)
4178          {
4179            if (*option == '+')
4180              break;
4181            i++;
4182            if (i == (ssize_t) (argc-1))
4183              ThrowMogrifyException(OptionError,"MissingArgument",option);
4184            break;
4185          }
4186        if (LocaleCompare("deconstruct",option+1) == 0)
4187          break;
4188        if (LocaleCompare("debug",option+1) == 0)
4189          {
4190            ssize_t
4191              event;
4192
4193            if (*option == '+')
4194              break;
4195            i++;
4196            if (i == (ssize_t) argc)
4197              ThrowMogrifyException(OptionError,"MissingArgument",option);
4198            event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
4199            if (event < 0)
4200              ThrowMogrifyException(OptionError,"UnrecognizedEventType",
4201                argv[i]);
4202            (void) SetLogEventMask(argv[i]);
4203            break;
4204          }
4205        if (LocaleCompare("define",option+1) == 0)
4206          {
4207            i++;
4208            if (i == (ssize_t) argc)
4209              ThrowMogrifyException(OptionError,"MissingArgument",option);
4210            if (*option == '+')
4211              {
4212                const char
4213                  *define;
4214
4215                define=GetImageOption(image_info,argv[i]);
4216                if (define == (const char *) NULL)
4217                  ThrowMogrifyException(OptionError,"NoSuchOption",argv[i]);
4218                break;
4219              }
4220            break;
4221          }
4222        if (LocaleCompare("delay",option+1) == 0)
4223          {
4224            if (*option == '+')
4225              break;
4226            i++;
4227            if (i == (ssize_t) argc)
4228              ThrowMogrifyException(OptionError,"MissingArgument",option);
4229            if (IsGeometry(argv[i]) == MagickFalse)
4230              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4231            break;
4232          }
4233        if (LocaleCompare("delete",option+1) == 0)
4234          {
4235            if (*option == '+')
4236              break;
4237            i++;
4238            if (i == (ssize_t) (argc-1))
4239              ThrowMogrifyException(OptionError,"MissingArgument",option);
4240            if (IsGeometry(argv[i]) == MagickFalse)
4241              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4242            break;
4243          }
4244        if (LocaleCompare("density",option+1) == 0)
4245          {
4246            if (*option == '+')
4247              break;
4248            i++;
4249            if (i == (ssize_t) argc)
4250              ThrowMogrifyException(OptionError,"MissingArgument",option);
4251            if (IsGeometry(argv[i]) == MagickFalse)
4252              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4253            break;
4254          }
4255        if (LocaleCompare("depth",option+1) == 0)
4256          {
4257            if (*option == '+')
4258              break;
4259            i++;
4260            if (i == (ssize_t) argc)
4261              ThrowMogrifyException(OptionError,"MissingArgument",option);
4262            if (IsGeometry(argv[i]) == MagickFalse)
4263              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4264            break;
4265          }
4266        if (LocaleCompare("deskew",option+1) == 0)
4267          {
4268            if (*option == '+')
4269              break;
4270            i++;
4271            if (i == (ssize_t) argc)
4272              ThrowMogrifyException(OptionError,"MissingArgument",option);
4273            if (IsGeometry(argv[i]) == MagickFalse)
4274              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4275            break;
4276          }
4277        if (LocaleCompare("despeckle",option+1) == 0)
4278          break;
4279        if (LocaleCompare("dft",option+1) == 0)
4280          break;
4281        if (LocaleCompare("direction",option+1) == 0)
4282          {
4283            ssize_t
4284              direction;
4285
4286            if (*option == '+')
4287              break;
4288            i++;
4289            if (i == (ssize_t) argc)
4290              ThrowMogrifyException(OptionError,"MissingArgument",option);
4291            direction=ParseCommandOption(MagickDirectionOptions,MagickFalse,
4292              argv[i]);
4293            if (direction < 0)
4294              ThrowMogrifyException(OptionError,"UnrecognizedDirectionType",
4295                argv[i]);
4296            break;
4297          }
4298        if (LocaleCompare("display",option+1) == 0)
4299          {
4300            if (*option == '+')
4301              break;
4302            i++;
4303            if (i == (ssize_t) argc)
4304              ThrowMogrifyException(OptionError,"MissingArgument",option);
4305            break;
4306          }
4307        if (LocaleCompare("dispose",option+1) == 0)
4308          {
4309            ssize_t
4310              dispose;
4311
4312            if (*option == '+')
4313              break;
4314            i++;
4315            if (i == (ssize_t) argc)
4316              ThrowMogrifyException(OptionError,"MissingArgument",option);
4317            dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
4318            if (dispose < 0)
4319              ThrowMogrifyException(OptionError,"UnrecognizedDisposeMethod",
4320                argv[i]);
4321            break;
4322          }
4323        if (LocaleCompare("distort",option+1) == 0)
4324          {
4325            ssize_t
4326              op;
4327
4328            i++;
4329            if (i == (ssize_t) argc)
4330              ThrowMogrifyException(OptionError,"MissingArgument",option);
4331            op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]);
4332            if (op < 0)
4333              ThrowMogrifyException(OptionError,"UnrecognizedDistortMethod",
4334                argv[i]);
4335            i++;
4336            if (i == (ssize_t) (argc-1))
4337              ThrowMogrifyException(OptionError,"MissingArgument",option);
4338            break;
4339          }
4340        if (LocaleCompare("dither",option+1) == 0)
4341          {
4342            ssize_t
4343              method;
4344
4345            if (*option == '+')
4346              break;
4347            i++;
4348            if (i == (ssize_t) argc)
4349              ThrowMogrifyException(OptionError,"MissingArgument",option);
4350            method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
4351            if (method < 0)
4352              ThrowMogrifyException(OptionError,"UnrecognizedDitherMethod",
4353                argv[i]);
4354            break;
4355          }
4356        if (LocaleCompare("draw",option+1) == 0)
4357          {
4358            if (*option == '+')
4359              break;
4360            i++;
4361            if (i == (ssize_t) argc)
4362              ThrowMogrifyException(OptionError,"MissingArgument",option);
4363            break;
4364          }
4365        if (LocaleCompare("duplicate",option+1) == 0)
4366          {
4367            if (*option == '+')
4368              break;
4369            i++;
4370            if (i == (ssize_t) (argc-1))
4371              ThrowMogrifyException(OptionError,"MissingArgument",option);
4372            if (IsGeometry(argv[i]) == MagickFalse)
4373              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4374            break;
4375          }
4376        if (LocaleCompare("duration",option+1) == 0)
4377          {
4378            if (*option == '+')
4379              break;
4380            i++;
4381            if (i == (ssize_t) (argc-1))
4382              ThrowMogrifyException(OptionError,"MissingArgument",option);
4383            if (IsGeometry(argv[i]) == MagickFalse)
4384              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4385            break;
4386          }
4387        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4388      }
4389      case 'e':
4390      {
4391        if (LocaleCompare("edge",option+1) == 0)
4392          {
4393            if (*option == '+')
4394              break;
4395            i++;
4396            if (i == (ssize_t) argc)
4397              ThrowMogrifyException(OptionError,"MissingArgument",option);
4398            if (IsGeometry(argv[i]) == MagickFalse)
4399              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4400            break;
4401          }
4402        if (LocaleCompare("emboss",option+1) == 0)
4403          {
4404            if (*option == '+')
4405              break;
4406            i++;
4407            if (i == (ssize_t) argc)
4408              ThrowMogrifyException(OptionError,"MissingArgument",option);
4409            if (IsGeometry(argv[i]) == MagickFalse)
4410              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4411            break;
4412          }
4413        if (LocaleCompare("encipher",option+1) == 0)
4414          {
4415            if (*option == '+')
4416              break;
4417            i++;
4418            if (i == (ssize_t) argc)
4419              ThrowMogrifyException(OptionError,"MissingArgument",option);
4420            break;
4421          }
4422        if (LocaleCompare("encoding",option+1) == 0)
4423          {
4424            if (*option == '+')
4425              break;
4426            i++;
4427            if (i == (ssize_t) argc)
4428              ThrowMogrifyException(OptionError,"MissingArgument",option);
4429            break;
4430          }
4431        if (LocaleCompare("endian",option+1) == 0)
4432          {
4433            ssize_t
4434              endian;
4435
4436            if (*option == '+')
4437              break;
4438            i++;
4439            if (i == (ssize_t) argc)
4440              ThrowMogrifyException(OptionError,"MissingArgument",option);
4441            endian=ParseCommandOption(MagickEndianOptions,MagickFalse,argv[i]);
4442            if (endian < 0)
4443              ThrowMogrifyException(OptionError,"UnrecognizedEndianType",
4444                argv[i]);
4445            break;
4446          }
4447        if (LocaleCompare("enhance",option+1) == 0)
4448          break;
4449        if (LocaleCompare("equalize",option+1) == 0)
4450          break;
4451        if (LocaleCompare("evaluate",option+1) == 0)
4452          {
4453            ssize_t
4454              op;
4455
4456            if (*option == '+')
4457              break;
4458            i++;
4459            if (i == (ssize_t) argc)
4460              ThrowMogrifyException(OptionError,"MissingArgument",option);
4461            op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]);
4462            if (op < 0)
4463              ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator",
4464                argv[i]);
4465            i++;
4466            if (i == (ssize_t) (argc-1))
4467              ThrowMogrifyException(OptionError,"MissingArgument",option);
4468            if (IsGeometry(argv[i]) == MagickFalse)
4469              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4470            break;
4471          }
4472        if (LocaleCompare("evaluate-sequence",option+1) == 0)
4473          {
4474            ssize_t
4475              op;
4476
4477            if (*option == '+')
4478              break;
4479            i++;
4480            if (i == (ssize_t) argc)
4481              ThrowMogrifyException(OptionError,"MissingArgument",option);
4482            op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]);
4483            if (op < 0)
4484              ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator",
4485                argv[i]);
4486            break;
4487          }
4488        if (LocaleCompare("extent",option+1) == 0)
4489          {
4490            if (*option == '+')
4491              break;
4492            i++;
4493            if (i == (ssize_t) argc)
4494              ThrowMogrifyException(OptionError,"MissingArgument",option);
4495            if (IsGeometry(argv[i]) == MagickFalse)
4496              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4497            break;
4498          }
4499        if (LocaleCompare("extract",option+1) == 0)
4500          {
4501            if (*option == '+')
4502              break;
4503            i++;
4504            if (i == (ssize_t) argc)
4505              ThrowMogrifyException(OptionError,"MissingArgument",option);
4506            if (IsGeometry(argv[i]) == MagickFalse)
4507              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4508            break;
4509          }
4510        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4511      }
4512      case 'f':
4513      {
4514        if (LocaleCompare("family",option+1) == 0)
4515          {
4516            if (*option == '+')
4517              break;
4518            i++;
4519            if (i == (ssize_t) (argc-1))
4520              ThrowMogrifyException(OptionError,"MissingArgument",option);
4521            break;
4522          }
4523        if (LocaleCompare("fill",option+1) == 0)
4524          {
4525            if (*option == '+')
4526              break;
4527            i++;
4528            if (i == (ssize_t) argc)
4529              ThrowMogrifyException(OptionError,"MissingArgument",option);
4530            break;
4531          }
4532        if (LocaleCompare("filter",option+1) == 0)
4533          {
4534            ssize_t
4535              filter;
4536
4537            if (*option == '+')
4538              break;
4539            i++;
4540            if (i == (ssize_t) argc)
4541              ThrowMogrifyException(OptionError,"MissingArgument",option);
4542            filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
4543            if (filter < 0)
4544              ThrowMogrifyException(OptionError,"UnrecognizedImageFilter",
4545                argv[i]);
4546            break;
4547          }
4548        if (LocaleCompare("flatten",option+1) == 0)
4549          break;
4550        if (LocaleCompare("flip",option+1) == 0)
4551          break;
4552        if (LocaleCompare("flop",option+1) == 0)
4553          break;
4554        if (LocaleCompare("floodfill",option+1) == 0)
4555          {
4556            if (*option == '+')
4557              break;
4558            i++;
4559            if (i == (ssize_t) argc)
4560              ThrowMogrifyException(OptionError,"MissingArgument",option);
4561            if (IsGeometry(argv[i]) == MagickFalse)
4562              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4563            i++;
4564            if (i == (ssize_t) argc)
4565              ThrowMogrifyException(OptionError,"MissingArgument",option);
4566            break;
4567          }
4568        if (LocaleCompare("font",option+1) == 0)
4569          {
4570            if (*option == '+')
4571              break;
4572            i++;
4573            if (i == (ssize_t) argc)
4574              ThrowMogrifyException(OptionError,"MissingArgument",option);
4575            break;
4576          }
4577        if (LocaleCompare("format",option+1) == 0)
4578          {
4579            (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
4580            (void) CloneString(&format,(char *) NULL);
4581            if (*option == '+')
4582              break;
4583            i++;
4584            if (i == (ssize_t) argc)
4585              ThrowMogrifyException(OptionError,"MissingArgument",option);
4586            (void) CloneString(&format,argv[i]);
4587            (void) CopyMagickString(image_info->filename,format,MaxTextExtent);
4588            (void) ConcatenateMagickString(image_info->filename,":",
4589              MaxTextExtent);
4590            (void) SetImageInfo(image_info,0,exception);
4591            if (*image_info->magick == '\0')
4592              ThrowMogrifyException(OptionError,"UnrecognizedImageFormat",
4593                format);
4594            break;
4595          }
4596        if (LocaleCompare("frame",option+1) == 0)
4597          {
4598            if (*option == '+')
4599              break;
4600            i++;
4601            if (i == (ssize_t) argc)
4602              ThrowMogrifyException(OptionError,"MissingArgument",option);
4603            if (IsGeometry(argv[i]) == MagickFalse)
4604              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4605            break;
4606          }
4607        if (LocaleCompare("function",option+1) == 0)
4608          {
4609            ssize_t
4610              op;
4611
4612            if (*option == '+')
4613              break;
4614            i++;
4615            if (i == (ssize_t) argc)
4616              ThrowMogrifyException(OptionError,"MissingArgument",option);
4617            op=ParseCommandOption(MagickFunctionOptions,MagickFalse,argv[i]);
4618            if (op < 0)
4619              ThrowMogrifyException(OptionError,"UnrecognizedFunction",argv[i]);
4620             i++;
4621             if (i == (ssize_t) (argc-1))
4622               ThrowMogrifyException(OptionError,"MissingArgument",option);
4623            break;
4624          }
4625        if (LocaleCompare("fuzz",option+1) == 0)
4626          {
4627            if (*option == '+')
4628              break;
4629            i++;
4630            if (i == (ssize_t) argc)
4631              ThrowMogrifyException(OptionError,"MissingArgument",option);
4632            if (IsGeometry(argv[i]) == MagickFalse)
4633              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4634            break;
4635          }
4636        if (LocaleCompare("fx",option+1) == 0)
4637          {
4638            if (*option == '+')
4639              break;
4640            i++;
4641            if (i == (ssize_t) (argc-1))
4642              ThrowMogrifyException(OptionError,"MissingArgument",option);
4643            break;
4644          }
4645        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4646      }
4647      case 'g':
4648      {
4649        if (LocaleCompare("gamma",option+1) == 0)
4650          {
4651            i++;
4652            if (i == (ssize_t) argc)
4653              ThrowMogrifyException(OptionError,"MissingArgument",option);
4654            if (IsGeometry(argv[i]) == MagickFalse)
4655              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4656            break;
4657          }
4658        if ((LocaleCompare("gaussian-blur",option+1) == 0) ||
4659            (LocaleCompare("gaussian",option+1) == 0))
4660          {
4661            i++;
4662            if (i == (ssize_t) argc)
4663              ThrowMogrifyException(OptionError,"MissingArgument",option);
4664            if (IsGeometry(argv[i]) == MagickFalse)
4665              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4666            break;
4667          }
4668        if (LocaleCompare("geometry",option+1) == 0)
4669          {
4670            if (*option == '+')
4671              break;
4672            i++;
4673            if (i == (ssize_t) argc)
4674              ThrowMogrifyException(OptionError,"MissingArgument",option);
4675            if (IsGeometry(argv[i]) == MagickFalse)
4676              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4677            break;
4678          }
4679        if (LocaleCompare("gravity",option+1) == 0)
4680          {
4681            ssize_t
4682              gravity;
4683
4684            if (*option == '+')
4685              break;
4686            i++;
4687            if (i == (ssize_t) argc)
4688              ThrowMogrifyException(OptionError,"MissingArgument",option);
4689            gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
4690            if (gravity < 0)
4691              ThrowMogrifyException(OptionError,"UnrecognizedGravityType",
4692                argv[i]);
4693            break;
4694          }
4695        if (LocaleCompare("green-primary",option+1) == 0)
4696          {
4697            if (*option == '+')
4698              break;
4699            i++;
4700            if (i == (ssize_t) argc)
4701              ThrowMogrifyException(OptionError,"MissingArgument",option);
4702            if (IsGeometry(argv[i]) == MagickFalse)
4703              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4704            break;
4705          }
4706        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4707      }
4708      case 'h':
4709      {
4710        if (LocaleCompare("hald-clut",option+1) == 0)
4711          break;
4712        if ((LocaleCompare("help",option+1) == 0) ||
4713            (LocaleCompare("-help",option+1) == 0))
4714          return(MogrifyUsage());
4715        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4716      }
4717      case 'i':
4718      {
4719        if (LocaleCompare("identify",option+1) == 0)
4720          break;
4721        if (LocaleCompare("idft",option+1) == 0)
4722          break;
4723        if (LocaleCompare("implode",option+1) == 0)
4724          {
4725            if (*option == '+')
4726              break;
4727            i++;
4728            if (i == (ssize_t) argc)
4729              ThrowMogrifyException(OptionError,"MissingArgument",option);
4730            if (IsGeometry(argv[i]) == MagickFalse)
4731              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4732            break;
4733          }
4734        if (LocaleCompare("intent",option+1) == 0)
4735          {
4736            ssize_t
4737              intent;
4738
4739            if (*option == '+')
4740              break;
4741            i++;
4742            if (i == (ssize_t) (argc-1))
4743              ThrowMogrifyException(OptionError,"MissingArgument",option);
4744            intent=ParseCommandOption(MagickIntentOptions,MagickFalse,argv[i]);
4745            if (intent < 0)
4746              ThrowMogrifyException(OptionError,"UnrecognizedIntentType",
4747                argv[i]);
4748            break;
4749          }
4750        if (LocaleCompare("interlace",option+1) == 0)
4751          {
4752            ssize_t
4753              interlace;
4754
4755            if (*option == '+')
4756              break;
4757            i++;
4758            if (i == (ssize_t) argc)
4759              ThrowMogrifyException(OptionError,"MissingArgument",option);
4760            interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
4761              argv[i]);
4762            if (interlace < 0)
4763              ThrowMogrifyException(OptionError,"UnrecognizedInterlaceType",
4764                argv[i]);
4765            break;
4766          }
4767        if (LocaleCompare("interline-spacing",option+1) == 0)
4768          {
4769            if (*option == '+')
4770              break;
4771            i++;
4772            if (i == (ssize_t) (argc-1))
4773              ThrowMogrifyException(OptionError,"MissingArgument",option);
4774            if (IsGeometry(argv[i]) == MagickFalse)
4775              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4776            break;
4777          }
4778        if (LocaleCompare("interpolate",option+1) == 0)
4779          {
4780            ssize_t
4781              interpolate;
4782
4783            if (*option == '+')
4784              break;
4785            i++;
4786            if (i == (ssize_t) argc)
4787              ThrowMogrifyException(OptionError,"MissingArgument",option);
4788            interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
4789              argv[i]);
4790            if (interpolate < 0)
4791              ThrowMogrifyException(OptionError,"UnrecognizedInterpolateMethod",
4792                argv[i]);
4793            break;
4794          }
4795        if (LocaleCompare("interword-spacing",option+1) == 0)
4796          {
4797            if (*option == '+')
4798              break;
4799            i++;
4800            if (i == (ssize_t) (argc-1))
4801              ThrowMogrifyException(OptionError,"MissingArgument",option);
4802            if (IsGeometry(argv[i]) == MagickFalse)
4803              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4804            break;
4805          }
4806        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4807      }
4808      case 'k':
4809      {
4810        if (LocaleCompare("kerning",option+1) == 0)
4811          {
4812            if (*option == '+')
4813              break;
4814            i++;
4815            if (i == (ssize_t) (argc-1))
4816              ThrowMogrifyException(OptionError,"MissingArgument",option);
4817            if (IsGeometry(argv[i]) == MagickFalse)
4818              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4819            break;
4820          }
4821        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4822      }
4823      case 'l':
4824      {
4825        if (LocaleCompare("label",option+1) == 0)
4826          {
4827            if (*option == '+')
4828              break;
4829            i++;
4830            if (i == (ssize_t) argc)
4831              ThrowMogrifyException(OptionError,"MissingArgument",option);
4832            break;
4833          }
4834        if (LocaleCompare("lat",option+1) == 0)
4835          {
4836            if (*option == '+')
4837              break;
4838            i++;
4839            if (i == (ssize_t) argc)
4840              ThrowMogrifyException(OptionError,"MissingArgument",option);
4841            if (IsGeometry(argv[i]) == MagickFalse)
4842              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4843          }
4844        if (LocaleCompare("layers",option+1) == 0)
4845          {
4846            ssize_t
4847              type;
4848
4849            if (*option == '+')
4850              break;
4851            i++;
4852            if (i == (ssize_t) (argc-1))
4853              ThrowMogrifyException(OptionError,"MissingArgument",option);
4854            type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]);
4855            if (type < 0)
4856              ThrowMogrifyException(OptionError,"UnrecognizedLayerMethod",
4857                argv[i]);
4858            break;
4859          }
4860        if (LocaleCompare("level",option+1) == 0)
4861          {
4862            i++;
4863            if (i == (ssize_t) argc)
4864              ThrowMogrifyException(OptionError,"MissingArgument",option);
4865            if (IsGeometry(argv[i]) == MagickFalse)
4866              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4867            break;
4868          }
4869        if (LocaleCompare("level-colors",option+1) == 0)
4870          {
4871            i++;
4872            if (i == (ssize_t) argc)
4873              ThrowMogrifyException(OptionError,"MissingArgument",option);
4874            break;
4875          }
4876        if (LocaleCompare("linewidth",option+1) == 0)
4877          {
4878            if (*option == '+')
4879              break;
4880            i++;
4881            if (i == (ssize_t) argc)
4882              ThrowMogrifyException(OptionError,"MissingArgument",option);
4883            if (IsGeometry(argv[i]) == MagickFalse)
4884              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4885            break;
4886          }
4887        if (LocaleCompare("limit",option+1) == 0)
4888          {
4889            char
4890              *p;
4891
4892            double
4893              value;
4894
4895            ssize_t
4896              resource;
4897
4898            if (*option == '+')
4899              break;
4900            i++;
4901            if (i == (ssize_t) argc)
4902              ThrowMogrifyException(OptionError,"MissingArgument",option);
4903            resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
4904              argv[i]);
4905            if (resource < 0)
4906              ThrowMogrifyException(OptionError,"UnrecognizedResourceType",
4907                argv[i]);
4908            i++;
4909            if (i == (ssize_t) argc)
4910              ThrowMogrifyException(OptionError,"MissingArgument",option);
4911            value=InterpretLocaleValue(argv[i],&p);
4912            (void) value;
4913            if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
4914              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4915            break;
4916          }
4917        if (LocaleCompare("liquid-rescale",option+1) == 0)
4918          {
4919            i++;
4920            if (i == (ssize_t) argc)
4921              ThrowMogrifyException(OptionError,"MissingArgument",option);
4922            if (IsGeometry(argv[i]) == MagickFalse)
4923              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4924            break;
4925          }
4926        if (LocaleCompare("list",option+1) == 0)
4927          {
4928            ssize_t
4929              list;
4930
4931            if (*option == '+')
4932              break;
4933            i++;
4934            if (i == (ssize_t) argc)
4935              ThrowMogrifyException(OptionError,"MissingArgument",option);
4936            list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
4937            if (list < 0)
4938              ThrowMogrifyException(OptionError,"UnrecognizedListType",argv[i]);
4939            status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
4940              argv+j,exception);
4941            return(status != 0 ? MagickFalse : MagickTrue);
4942          }
4943        if (LocaleCompare("log",option+1) == 0)
4944          {
4945            if (*option == '+')
4946              break;
4947            i++;
4948            if ((i == (ssize_t) argc) ||
4949                (strchr(argv[i],'%') == (char *) NULL))
4950              ThrowMogrifyException(OptionError,"MissingArgument",option);
4951            break;
4952          }
4953        if (LocaleCompare("loop",option+1) == 0)
4954          {
4955            if (*option == '+')
4956              break;
4957            i++;
4958            if (i == (ssize_t) argc)
4959              ThrowMogrifyException(OptionError,"MissingArgument",option);
4960            if (IsGeometry(argv[i]) == MagickFalse)
4961              ThrowMogrifyInvalidArgumentException(option,argv[i]);
4962            break;
4963          }
4964        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4965      }
4966      case 'm':
4967      {
4968        if (LocaleCompare("map",option+1) == 0)
4969          {
4970            global_colormap=(*option == '+') ? MagickTrue : MagickFalse;
4971            if (*option == '+')
4972              break;
4973            i++;
4974            if (i == (ssize_t) argc)
4975              ThrowMogrifyException(OptionError,"MissingArgument",option);
4976            break;
4977          }
4978        if (LocaleCompare("mask",option+1) == 0)
4979          {
4980            if (*option == '+')
4981              break;
4982            i++;
4983            if (i == (ssize_t) argc)
4984              ThrowMogrifyException(OptionError,"MissingArgument",option);
4985            break;
4986          }
4987        if (LocaleCompare("matte",option+1) == 0)
4988          break;
4989        if (LocaleCompare("mattecolor",option+1) == 0)
4990          {
4991            if (*option == '+')
4992              break;
4993            i++;
4994            if (i == (ssize_t) argc)
4995              ThrowMogrifyException(OptionError,"MissingArgument",option);
4996            break;
4997          }
4998        if (LocaleCompare("maximum",option+1) == 0)
4999          break;
5000        if (LocaleCompare("minimum",option+1) == 0)
5001          break;
5002        if (LocaleCompare("modulate",option+1) == 0)
5003          {
5004            if (*option == '+')
5005              break;
5006            i++;
5007            if (i == (ssize_t) argc)
5008              ThrowMogrifyException(OptionError,"MissingArgument",option);
5009            if (IsGeometry(argv[i]) == MagickFalse)
5010              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5011            break;
5012          }
5013        if (LocaleCompare("median",option+1) == 0)
5014          {
5015            if (*option == '+')
5016              break;
5017            i++;
5018            if (i == (ssize_t) argc)
5019              ThrowMogrifyException(OptionError,"MissingArgument",option);
5020            if (IsGeometry(argv[i]) == MagickFalse)
5021              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5022            break;
5023          }
5024        if (LocaleCompare("mode",option+1) == 0)
5025          {
5026            if (*option == '+')
5027              break;
5028            i++;
5029            if (i == (ssize_t) argc)
5030              ThrowMogrifyException(OptionError,"MissingArgument",option);
5031            if (IsGeometry(argv[i]) == MagickFalse)
5032              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5033            break;
5034          }
5035        if (LocaleCompare("monitor",option+1) == 0)
5036          break;
5037        if (LocaleCompare("monochrome",option+1) == 0)
5038          break;
5039        if (LocaleCompare("morph",option+1) == 0)
5040          {
5041            if (*option == '+')
5042              break;
5043            i++;
5044            if (i == (ssize_t) (argc-1))
5045              ThrowMogrifyException(OptionError,"MissingArgument",option);
5046            if (IsGeometry(argv[i]) == MagickFalse)
5047              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5048            break;
5049          }
5050        if (LocaleCompare("morphology",option+1) == 0)
5051          {
5052            char
5053              token[MaxTextExtent];
5054
5055            KernelInfo
5056              *kernel_info;
5057
5058            ssize_t
5059              op;
5060
5061            i++;
5062            if (i == (ssize_t) argc)
5063              ThrowMogrifyException(OptionError,"MissingArgument",option);
5064            GetMagickToken(argv[i],NULL,token);
5065            op=ParseCommandOption(MagickMorphologyOptions,MagickFalse,token);
5066            if (op < 0)
5067              ThrowMogrifyException(OptionError,"UnrecognizedMorphologyMethod",
5068                token);
5069            i++;
5070            if (i == (ssize_t) (argc-1))
5071              ThrowMogrifyException(OptionError,"MissingArgument",option);
5072            kernel_info=AcquireKernelInfo(argv[i]);
5073            if (kernel_info == (KernelInfo *) NULL)
5074              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5075            kernel_info=DestroyKernelInfo(kernel_info);
5076            break;
5077          }
5078        if (LocaleCompare("mosaic",option+1) == 0)
5079          break;
5080        if (LocaleCompare("motion-blur",option+1) == 0)
5081          {
5082            if (*option == '+')
5083              break;
5084            i++;
5085            if (i == (ssize_t) argc)
5086              ThrowMogrifyException(OptionError,"MissingArgument",option);
5087            if (IsGeometry(argv[i]) == MagickFalse)
5088              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5089            break;
5090          }
5091        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5092      }
5093      case 'n':
5094      {
5095        if (LocaleCompare("negate",option+1) == 0)
5096          break;
5097        if (LocaleCompare("noise",option+1) == 0)
5098          {
5099            i++;
5100            if (i == (ssize_t) argc)
5101              ThrowMogrifyException(OptionError,"MissingArgument",option);
5102            if (*option == '+')
5103              {
5104                ssize_t
5105                  noise;
5106
5107                noise=ParseCommandOption(MagickNoiseOptions,MagickFalse,argv[i]);
5108                if (noise < 0)
5109                  ThrowMogrifyException(OptionError,"UnrecognizedNoiseType",
5110                    argv[i]);
5111                break;
5112              }
5113            if (IsGeometry(argv[i]) == MagickFalse)
5114              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5115            break;
5116          }
5117        if (LocaleCompare("noop",option+1) == 0)
5118          break;
5119        if (LocaleCompare("normalize",option+1) == 0)
5120          break;
5121        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5122      }
5123      case 'o':
5124      {
5125        if (LocaleCompare("opaque",option+1) == 0)
5126          {
5127            i++;
5128            if (i == (ssize_t) argc)
5129              ThrowMogrifyException(OptionError,"MissingArgument",option);
5130            break;
5131          }
5132        if (LocaleCompare("ordered-dither",option+1) == 0)
5133          {
5134            if (*option == '+')
5135              break;
5136            i++;
5137            if (i == (ssize_t) argc)
5138              ThrowMogrifyException(OptionError,"MissingArgument",option);
5139            break;
5140          }
5141        if (LocaleCompare("orient",option+1) == 0)
5142          {
5143            ssize_t
5144              orientation;
5145
5146            orientation=UndefinedOrientation;
5147            if (*option == '+')
5148              break;
5149            i++;
5150            if (i == (ssize_t) (argc-1))
5151              ThrowMogrifyException(OptionError,"MissingArgument",option);
5152            orientation=ParseCommandOption(MagickOrientationOptions,MagickFalse,
5153              argv[i]);
5154            if (orientation < 0)
5155              ThrowMogrifyException(OptionError,"UnrecognizedImageOrientation",
5156                argv[i]);
5157            break;
5158          }
5159        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5160      }
5161      case 'p':
5162      {
5163        if (LocaleCompare("page",option+1) == 0)
5164          {
5165            if (*option == '+')
5166              break;
5167            i++;
5168            if (i == (ssize_t) argc)
5169              ThrowMogrifyException(OptionError,"MissingArgument",option);
5170            break;
5171          }
5172        if (LocaleCompare("paint",option+1) == 0)
5173          {
5174            if (*option == '+')
5175              break;
5176            i++;
5177            if (i == (ssize_t) argc)
5178              ThrowMogrifyException(OptionError,"MissingArgument",option);
5179            if (IsGeometry(argv[i]) == MagickFalse)
5180              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5181            break;
5182          }
5183        if (LocaleCompare("path",option+1) == 0)
5184          {
5185            (void) CloneString(&path,(char *) NULL);
5186            if (*option == '+')
5187              break;
5188            i++;
5189            if (i == (ssize_t) argc)
5190              ThrowMogrifyException(OptionError,"MissingArgument",option);
5191            (void) CloneString(&path,argv[i]);
5192            break;
5193          }
5194        if (LocaleCompare("pointsize",option+1) == 0)
5195          {
5196            if (*option == '+')
5197              break;
5198            i++;
5199            if (i == (ssize_t) argc)
5200              ThrowMogrifyException(OptionError,"MissingArgument",option);
5201            if (IsGeometry(argv[i]) == MagickFalse)
5202              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5203            break;
5204          }
5205        if (LocaleCompare("polaroid",option+1) == 0)
5206          {
5207            if (*option == '+')
5208              break;
5209            i++;
5210            if (i == (ssize_t) argc)
5211              ThrowMogrifyException(OptionError,"MissingArgument",option);
5212            if (IsGeometry(argv[i]) == MagickFalse)
5213              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5214            break;
5215          }
5216        if (LocaleCompare("posterize",option+1) == 0)
5217          {
5218            if (*option == '+')
5219              break;
5220            i++;
5221            if (i == (ssize_t) argc)
5222              ThrowMogrifyException(OptionError,"MissingArgument",option);
5223            if (IsGeometry(argv[i]) == MagickFalse)
5224              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5225            break;
5226          }
5227        if (LocaleCompare("precision",option+1) == 0)
5228          {
5229            if (*option == '+')
5230              break;
5231            i++;
5232            if (i == (ssize_t) argc)
5233              ThrowMogrifyException(OptionError,"MissingArgument",option);
5234            if (IsGeometry(argv[i]) == MagickFalse)
5235              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5236            break;
5237          }
5238        if (LocaleCompare("print",option+1) == 0)
5239          {
5240            if (*option == '+')
5241              break;
5242            i++;
5243            if (i == (ssize_t) argc)
5244              ThrowMogrifyException(OptionError,"MissingArgument",option);
5245            break;
5246          }
5247        if (LocaleCompare("process",option+1) == 0)
5248          {
5249            if (*option == '+')
5250              break;
5251            i++;
5252            if (i == (ssize_t) (argc-1))
5253              ThrowMogrifyException(OptionError,"MissingArgument",option);
5254            break;
5255          }
5256        if (LocaleCompare("profile",option+1) == 0)
5257          {
5258            i++;
5259            if (i == (ssize_t) argc)
5260              ThrowMogrifyException(OptionError,"MissingArgument",option);
5261            break;
5262          }
5263        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5264      }
5265      case 'q':
5266      {
5267        if (LocaleCompare("quality",option+1) == 0)
5268          {
5269            if (*option == '+')
5270              break;
5271            i++;
5272            if (i == (ssize_t) argc)
5273              ThrowMogrifyException(OptionError,"MissingArgument",option);
5274            if (IsGeometry(argv[i]) == MagickFalse)
5275              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5276            break;
5277          }
5278        if (LocaleCompare("quantize",option+1) == 0)
5279          {
5280            ssize_t
5281              colorspace;
5282
5283            if (*option == '+')
5284              break;
5285            i++;
5286            if (i == (ssize_t) (argc-1))
5287              ThrowMogrifyException(OptionError,"MissingArgument",option);
5288            colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
5289              argv[i]);
5290            if (colorspace < 0)
5291              ThrowMogrifyException(OptionError,"UnrecognizedColorspace",
5292                argv[i]);
5293            break;
5294          }
5295        if (LocaleCompare("quiet",option+1) == 0)
5296          break;
5297        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5298      }
5299      case 'r':
5300      {
5301        if (LocaleCompare("radial-blur",option+1) == 0)
5302          {
5303            i++;
5304            if (i == (ssize_t) argc)
5305              ThrowMogrifyException(OptionError,"MissingArgument",option);
5306            if (IsGeometry(argv[i]) == MagickFalse)
5307              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5308            break;
5309          }
5310        if (LocaleCompare("raise",option+1) == 0)
5311          {
5312            i++;
5313            if (i == (ssize_t) argc)
5314              ThrowMogrifyException(OptionError,"MissingArgument",option);
5315            if (IsGeometry(argv[i]) == MagickFalse)
5316              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5317            break;
5318          }
5319        if (LocaleCompare("random-threshold",option+1) == 0)
5320          {
5321            if (*option == '+')
5322              break;
5323            i++;
5324            if (i == (ssize_t) argc)
5325              ThrowMogrifyException(OptionError,"MissingArgument",option);
5326            if (IsGeometry(argv[i]) == MagickFalse)
5327              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5328            break;
5329          }
5330        if (LocaleCompare("recolor",option+1) == 0)
5331          {
5332            if (*option == '+')
5333              break;
5334            i++;
5335            if (i == (ssize_t) (argc-1))
5336              ThrowMogrifyException(OptionError,"MissingArgument",option);
5337            if (IsGeometry(argv[i]) == MagickFalse)
5338              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5339            break;
5340          }
5341        if (LocaleCompare("red-primary",option+1) == 0)
5342          {
5343            if (*option == '+')
5344              break;
5345            i++;
5346            if (i == (ssize_t) argc)
5347              ThrowMogrifyException(OptionError,"MissingArgument",option);
5348            if (IsGeometry(argv[i]) == MagickFalse)
5349              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5350          }
5351        if (LocaleCompare("regard-warnings",option+1) == 0)
5352          break;
5353        if (LocaleCompare("region",option+1) == 0)
5354          {
5355            if (*option == '+')
5356              break;
5357            i++;
5358            if (i == (ssize_t) argc)
5359              ThrowMogrifyException(OptionError,"MissingArgument",option);
5360            if (IsGeometry(argv[i]) == MagickFalse)
5361              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5362            break;
5363          }
5364        if (LocaleCompare("remap",option+1) == 0)
5365          {
5366            if (*option == '+')
5367              break;
5368            i++;
5369            if (i == (ssize_t) (argc-1))
5370              ThrowMogrifyException(OptionError,"MissingArgument",option);
5371            break;
5372          }
5373        if (LocaleCompare("render",option+1) == 0)
5374          break;
5375        if (LocaleCompare("repage",option+1) == 0)
5376          {
5377            if (*option == '+')
5378              break;
5379            i++;
5380            if (i == (ssize_t) argc)
5381              ThrowMogrifyException(OptionError,"MissingArgument",option);
5382            if (IsGeometry(argv[i]) == MagickFalse)
5383              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5384            break;
5385          }
5386        if (LocaleCompare("resample",option+1) == 0)
5387          {
5388            if (*option == '+')
5389              break;
5390            i++;
5391            if (i == (ssize_t) argc)
5392              ThrowMogrifyException(OptionError,"MissingArgument",option);
5393            if (IsGeometry(argv[i]) == MagickFalse)
5394              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5395            break;
5396          }
5397        if (LocaleCompare("resize",option+1) == 0)
5398          {
5399            if (*option == '+')
5400              break;
5401            i++;
5402            if (i == (ssize_t) argc)
5403              ThrowMogrifyException(OptionError,"MissingArgument",option);
5404            if (IsGeometry(argv[i]) == MagickFalse)
5405              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5406            break;
5407          }
5408        if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
5409          {
5410            respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
5411            break;
5412          }
5413        if (LocaleCompare("reverse",option+1) == 0)
5414          break;
5415        if (LocaleCompare("roll",option+1) == 0)
5416          {
5417            if (*option == '+')
5418              break;
5419            i++;
5420            if (i == (ssize_t) argc)
5421              ThrowMogrifyException(OptionError,"MissingArgument",option);
5422            if (IsGeometry(argv[i]) == MagickFalse)
5423              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5424            break;
5425          }
5426        if (LocaleCompare("rotate",option+1) == 0)
5427          {
5428            i++;
5429            if (i == (ssize_t) argc)
5430              ThrowMogrifyException(OptionError,"MissingArgument",option);
5431            if (IsGeometry(argv[i]) == MagickFalse)
5432              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5433            break;
5434          }
5435        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5436      }
5437      case 's':
5438      {
5439        if (LocaleCompare("sample",option+1) == 0)
5440          {
5441            if (*option == '+')
5442              break;
5443            i++;
5444            if (i == (ssize_t) argc)
5445              ThrowMogrifyException(OptionError,"MissingArgument",option);
5446            if (IsGeometry(argv[i]) == MagickFalse)
5447              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5448            break;
5449          }
5450        if (LocaleCompare("sampling-factor",option+1) == 0)
5451          {
5452            if (*option == '+')
5453              break;
5454            i++;
5455            if (i == (ssize_t) argc)
5456              ThrowMogrifyException(OptionError,"MissingArgument",option);
5457            if (IsGeometry(argv[i]) == MagickFalse)
5458              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5459            break;
5460          }
5461        if (LocaleCompare("scale",option+1) == 0)
5462          {
5463            if (*option == '+')
5464              break;
5465            i++;
5466            if (i == (ssize_t) argc)
5467              ThrowMogrifyException(OptionError,"MissingArgument",option);
5468            if (IsGeometry(argv[i]) == MagickFalse)
5469              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5470            break;
5471          }
5472        if (LocaleCompare("scene",option+1) == 0)
5473          {
5474            if (*option == '+')
5475              break;
5476            i++;
5477            if (i == (ssize_t) argc)
5478              ThrowMogrifyException(OptionError,"MissingArgument",option);
5479            if (IsGeometry(argv[i]) == MagickFalse)
5480              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5481            break;
5482          }
5483        if (LocaleCompare("seed",option+1) == 0)
5484          {
5485            if (*option == '+')
5486              break;
5487            i++;
5488            if (i == (ssize_t) argc)
5489              ThrowMogrifyException(OptionError,"MissingArgument",option);
5490            if (IsGeometry(argv[i]) == MagickFalse)
5491              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5492            break;
5493          }
5494        if (LocaleCompare("segment",option+1) == 0)
5495          {
5496            if (*option == '+')
5497              break;
5498            i++;
5499            if (i == (ssize_t) argc)
5500              ThrowMogrifyException(OptionError,"MissingArgument",option);
5501            if (IsGeometry(argv[i]) == MagickFalse)
5502              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5503            break;
5504          }
5505        if (LocaleCompare("selective-blur",option+1) == 0)
5506          {
5507            i++;
5508            if (i == (ssize_t) argc)
5509              ThrowMogrifyException(OptionError,"MissingArgument",option);
5510            if (IsGeometry(argv[i]) == MagickFalse)
5511              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5512            break;
5513          }
5514        if (LocaleCompare("separate",option+1) == 0)
5515          break;
5516        if (LocaleCompare("sepia-tone",option+1) == 0)
5517          {
5518            if (*option == '+')
5519              break;
5520            i++;
5521            if (i == (ssize_t) argc)
5522              ThrowMogrifyException(OptionError,"MissingArgument",option);
5523            if (IsGeometry(argv[i]) == MagickFalse)
5524              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5525            break;
5526          }
5527        if (LocaleCompare("set",option+1) == 0)
5528          {
5529            i++;
5530            if (i == (ssize_t) argc)
5531              ThrowMogrifyException(OptionError,"MissingArgument",option);
5532            if (*option == '+')
5533              break;
5534            i++;
5535            if (i == (ssize_t) argc)
5536              ThrowMogrifyException(OptionError,"MissingArgument",option);
5537            break;
5538          }
5539        if (LocaleCompare("shade",option+1) == 0)
5540          {
5541            i++;
5542            if (i == (ssize_t) argc)
5543              ThrowMogrifyException(OptionError,"MissingArgument",option);
5544            if (IsGeometry(argv[i]) == MagickFalse)
5545              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5546            break;
5547          }
5548        if (LocaleCompare("shadow",option+1) == 0)
5549          {
5550            if (*option == '+')
5551              break;
5552            i++;
5553            if (i == (ssize_t) argc)
5554              ThrowMogrifyException(OptionError,"MissingArgument",option);
5555            if (IsGeometry(argv[i]) == MagickFalse)
5556              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5557            break;
5558          }
5559        if (LocaleCompare("sharpen",option+1) == 0)
5560          {
5561            i++;
5562            if (i == (ssize_t) argc)
5563              ThrowMogrifyException(OptionError,"MissingArgument",option);
5564            if (IsGeometry(argv[i]) == MagickFalse)
5565              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5566            break;
5567          }
5568        if (LocaleCompare("shave",option+1) == 0)
5569          {
5570            if (*option == '+')
5571              break;
5572            i++;
5573            if (i == (ssize_t) argc)
5574              ThrowMogrifyException(OptionError,"MissingArgument",option);
5575            if (IsGeometry(argv[i]) == MagickFalse)
5576              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5577            break;
5578          }
5579        if (LocaleCompare("shear",option+1) == 0)
5580          {
5581            i++;
5582            if (i == (ssize_t) argc)
5583              ThrowMogrifyException(OptionError,"MissingArgument",option);
5584            if (IsGeometry(argv[i]) == MagickFalse)
5585              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5586            break;
5587          }
5588        if (LocaleCompare("sigmoidal-contrast",option+1) == 0)
5589          {
5590            i++;
5591            if (i == (ssize_t) (argc-1))
5592              ThrowMogrifyException(OptionError,"MissingArgument",option);
5593            if (IsGeometry(argv[i]) == MagickFalse)
5594              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5595            break;
5596          }
5597        if (LocaleCompare("size",option+1) == 0)
5598          {
5599            if (*option == '+')
5600              break;
5601            i++;
5602            if (i == (ssize_t) argc)
5603              ThrowMogrifyException(OptionError,"MissingArgument",option);
5604            if (IsGeometry(argv[i]) == MagickFalse)
5605              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5606            break;
5607          }
5608        if (LocaleCompare("sketch",option+1) == 0)
5609          {
5610            if (*option == '+')
5611              break;
5612            i++;
5613            if (i == (ssize_t) argc)
5614              ThrowMogrifyException(OptionError,"MissingArgument",option);
5615            if (IsGeometry(argv[i]) == MagickFalse)
5616              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5617            break;
5618          }
5619        if (LocaleCompare("smush",option+1) == 0)
5620          {
5621            i++;
5622            if (i == (ssize_t) argc)
5623              ThrowMogrifyException(OptionError,"MissingArgument",option);
5624            if (IsGeometry(argv[i]) == MagickFalse)
5625              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5626            i++;
5627            break;
5628          }
5629        if (LocaleCompare("solarize",option+1) == 0)
5630          {
5631            if (*option == '+')
5632              break;
5633            i++;
5634            if (i == (ssize_t) argc)
5635              ThrowMogrifyException(OptionError,"MissingArgument",option);
5636            if (IsGeometry(argv[i]) == MagickFalse)
5637              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5638            break;
5639          }
5640        if (LocaleCompare("sparse-color",option+1) == 0)
5641          {
5642            ssize_t
5643              op;
5644
5645            i++;
5646            if (i == (ssize_t) argc)
5647              ThrowMogrifyException(OptionError,"MissingArgument",option);
5648            op=ParseCommandOption(MagickSparseColorOptions,MagickFalse,argv[i]);
5649            if (op < 0)
5650              ThrowMogrifyException(OptionError,"UnrecognizedSparseColorMethod",
5651                argv[i]);
5652            i++;
5653            if (i == (ssize_t) (argc-1))
5654              ThrowMogrifyException(OptionError,"MissingArgument",option);
5655            break;
5656          }
5657        if (LocaleCompare("spread",option+1) == 0)
5658          {
5659            if (*option == '+')
5660              break;
5661            i++;
5662            if (i == (ssize_t) argc)
5663              ThrowMogrifyException(OptionError,"MissingArgument",option);
5664            if (IsGeometry(argv[i]) == MagickFalse)
5665              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5666            break;
5667          }
5668        if (LocaleCompare("statistic",option+1) == 0)
5669          {
5670            ssize_t
5671              op;
5672
5673            if (*option == '+')
5674              break;
5675            i++;
5676            if (i == (ssize_t) argc)
5677              ThrowMogrifyException(OptionError,"MissingArgument",option);
5678            op=ParseCommandOption(MagickStatisticOptions,MagickFalse,argv[i]);
5679            if (op < 0)
5680              ThrowMogrifyException(OptionError,"UnrecognizedStatisticType",
5681                argv[i]);
5682            i++;
5683            if (i == (ssize_t) (argc-1))
5684              ThrowMogrifyException(OptionError,"MissingArgument",option);
5685            if (IsGeometry(argv[i]) == MagickFalse)
5686              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5687            break;
5688          }
5689        if (LocaleCompare("stretch",option+1) == 0)
5690          {
5691            ssize_t
5692              stretch;
5693
5694            if (*option == '+')
5695              break;
5696            i++;
5697            if (i == (ssize_t) (argc-1))
5698              ThrowMogrifyException(OptionError,"MissingArgument",option);
5699            stretch=ParseCommandOption(MagickStretchOptions,MagickFalse,argv[i]);
5700            if (stretch < 0)
5701              ThrowMogrifyException(OptionError,"UnrecognizedStyleType",
5702                argv[i]);
5703            break;
5704          }
5705        if (LocaleCompare("strip",option+1) == 0)
5706          break;
5707        if (LocaleCompare("stroke",option+1) == 0)
5708          {
5709            if (*option == '+')
5710              break;
5711            i++;
5712            if (i == (ssize_t) argc)
5713              ThrowMogrifyException(OptionError,"MissingArgument",option);
5714            break;
5715          }
5716        if (LocaleCompare("strokewidth",option+1) == 0)
5717          {
5718            if (*option == '+')
5719              break;
5720            i++;
5721            if (i == (ssize_t) argc)
5722              ThrowMogrifyException(OptionError,"MissingArgument",option);
5723            if (IsGeometry(argv[i]) == MagickFalse)
5724              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5725            break;
5726          }
5727        if (LocaleCompare("style",option+1) == 0)
5728          {
5729            ssize_t
5730              style;
5731
5732            if (*option == '+')
5733              break;
5734            i++;
5735            if (i == (ssize_t) (argc-1))
5736              ThrowMogrifyException(OptionError,"MissingArgument",option);
5737            style=ParseCommandOption(MagickStyleOptions,MagickFalse,argv[i]);
5738            if (style < 0)
5739              ThrowMogrifyException(OptionError,"UnrecognizedStyleType",
5740                argv[i]);
5741            break;
5742          }
5743        if (LocaleCompare("swap",option+1) == 0)
5744          {
5745            if (*option == '+')
5746              break;
5747            i++;
5748            if (i == (ssize_t) (argc-1))
5749              ThrowMogrifyException(OptionError,"MissingArgument",option);
5750            if (IsGeometry(argv[i]) == MagickFalse)
5751              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5752            break;
5753          }
5754        if (LocaleCompare("swirl",option+1) == 0)
5755          {
5756            if (*option == '+')
5757              break;
5758            i++;
5759            if (i == (ssize_t) argc)
5760              ThrowMogrifyException(OptionError,"MissingArgument",option);
5761            if (IsGeometry(argv[i]) == MagickFalse)
5762              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5763            break;
5764          }
5765        if (LocaleCompare("synchronize",option+1) == 0)
5766          break;
5767        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5768      }
5769      case 't':
5770      {
5771        if (LocaleCompare("taint",option+1) == 0)
5772          break;
5773        if (LocaleCompare("texture",option+1) == 0)
5774          {
5775            if (*option == '+')
5776              break;
5777            i++;
5778            if (i == (ssize_t) argc)
5779              ThrowMogrifyException(OptionError,"MissingArgument",option);
5780            break;
5781          }
5782        if (LocaleCompare("tile",option+1) == 0)
5783          {
5784            if (*option == '+')
5785              break;
5786            i++;
5787            if (i == (ssize_t) (argc-1))
5788              ThrowMogrifyException(OptionError,"MissingArgument",option);
5789            break;
5790          }
5791        if (LocaleCompare("tile-offset",option+1) == 0)
5792          {
5793            if (*option == '+')
5794              break;
5795            i++;
5796            if (i == (ssize_t) argc)
5797              ThrowMogrifyException(OptionError,"MissingArgument",option);
5798            if (IsGeometry(argv[i]) == MagickFalse)
5799              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5800            break;
5801          }
5802        if (LocaleCompare("tint",option+1) == 0)
5803          {
5804            if (*option == '+')
5805              break;
5806            i++;
5807            if (i == (ssize_t) (argc-1))
5808              ThrowMogrifyException(OptionError,"MissingArgument",option);
5809            if (IsGeometry(argv[i]) == MagickFalse)
5810              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5811            break;
5812          }
5813        if (LocaleCompare("transform",option+1) == 0)
5814          break;
5815        if (LocaleCompare("transpose",option+1) == 0)
5816          break;
5817        if (LocaleCompare("transverse",option+1) == 0)
5818          break;
5819        if (LocaleCompare("threshold",option+1) == 0)
5820          {
5821            if (*option == '+')
5822              break;
5823            i++;
5824            if (i == (ssize_t) argc)
5825              ThrowMogrifyException(OptionError,"MissingArgument",option);
5826            if (IsGeometry(argv[i]) == MagickFalse)
5827              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5828            break;
5829          }
5830        if (LocaleCompare("thumbnail",option+1) == 0)
5831          {
5832            if (*option == '+')
5833              break;
5834            i++;
5835            if (i == (ssize_t) argc)
5836              ThrowMogrifyException(OptionError,"MissingArgument",option);
5837            if (IsGeometry(argv[i]) == MagickFalse)
5838              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5839            break;
5840          }
5841        if (LocaleCompare("transparent",option+1) == 0)
5842          {
5843            i++;
5844            if (i == (ssize_t) argc)
5845              ThrowMogrifyException(OptionError,"MissingArgument",option);
5846            break;
5847          }
5848        if (LocaleCompare("transparent-color",option+1) == 0)
5849          {
5850            if (*option == '+')
5851              break;
5852            i++;
5853            if (i == (ssize_t) (argc-1))
5854              ThrowMogrifyException(OptionError,"MissingArgument",option);
5855            break;
5856          }
5857        if (LocaleCompare("treedepth",option+1) == 0)
5858          {
5859            if (*option == '+')
5860              break;
5861            i++;
5862            if (i == (ssize_t) argc)
5863              ThrowMogrifyException(OptionError,"MissingArgument",option);
5864            if (IsGeometry(argv[i]) == MagickFalse)
5865              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5866            break;
5867          }
5868        if (LocaleCompare("trim",option+1) == 0)
5869          break;
5870        if (LocaleCompare("type",option+1) == 0)
5871          {
5872            ssize_t
5873              type;
5874
5875            if (*option == '+')
5876              break;
5877            i++;
5878            if (i == (ssize_t) argc)
5879              ThrowMogrifyException(OptionError,"MissingArgument",option);
5880            type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
5881            if (type < 0)
5882              ThrowMogrifyException(OptionError,"UnrecognizedImageType",
5883                argv[i]);
5884            break;
5885          }
5886        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5887      }
5888      case 'u':
5889      {
5890        if (LocaleCompare("undercolor",option+1) == 0)
5891          {
5892            if (*option == '+')
5893              break;
5894            i++;
5895            if (i == (ssize_t) argc)
5896              ThrowMogrifyException(OptionError,"MissingArgument",option);
5897            break;
5898          }
5899        if (LocaleCompare("unique-colors",option+1) == 0)
5900          break;
5901        if (LocaleCompare("units",option+1) == 0)
5902          {
5903            ssize_t
5904              units;
5905
5906            if (*option == '+')
5907              break;
5908            i++;
5909            if (i == (ssize_t) argc)
5910              ThrowMogrifyException(OptionError,"MissingArgument",option);
5911            units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
5912              argv[i]);
5913            if (units < 0)
5914              ThrowMogrifyException(OptionError,"UnrecognizedUnitsType",
5915                argv[i]);
5916            break;
5917          }
5918        if (LocaleCompare("unsharp",option+1) == 0)
5919          {
5920            i++;
5921            if (i == (ssize_t) argc)
5922              ThrowMogrifyException(OptionError,"MissingArgument",option);
5923            if (IsGeometry(argv[i]) == MagickFalse)
5924              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5925            break;
5926          }
5927        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5928      }
5929      case 'v':
5930      {
5931        if (LocaleCompare("verbose",option+1) == 0)
5932          {
5933            image_info->verbose=(*option == '-') ? MagickTrue : MagickFalse;
5934            break;
5935          }
5936        if ((LocaleCompare("version",option+1) == 0) ||
5937            (LocaleCompare("-version",option+1) == 0))
5938          {
5939            (void) FormatLocaleFile(stdout,"Version: %s\n",
5940              GetMagickVersion((size_t *) NULL));
5941            (void) FormatLocaleFile(stdout,"Copyright: %s\n",
5942              GetMagickCopyright());
5943            (void) FormatLocaleFile(stdout,"Features: %s\n\n",
5944              GetMagickFeatures());
5945            break;
5946          }
5947        if (LocaleCompare("view",option+1) == 0)
5948          {
5949            if (*option == '+')
5950              break;
5951            i++;
5952            if (i == (ssize_t) argc)
5953              ThrowMogrifyException(OptionError,"MissingArgument",option);
5954            break;
5955          }
5956        if (LocaleCompare("vignette",option+1) == 0)
5957          {
5958            if (*option == '+')
5959              break;
5960            i++;
5961            if (i == (ssize_t) argc)
5962              ThrowMogrifyException(OptionError,"MissingArgument",option);
5963            if (IsGeometry(argv[i]) == MagickFalse)
5964              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5965            break;
5966          }
5967        if (LocaleCompare("virtual-pixel",option+1) == 0)
5968          {
5969            ssize_t
5970              method;
5971
5972            if (*option == '+')
5973              break;
5974            i++;
5975            if (i == (ssize_t) argc)
5976              ThrowMogrifyException(OptionError,"MissingArgument",option);
5977            method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
5978              argv[i]);
5979            if (method < 0)
5980              ThrowMogrifyException(OptionError,
5981                "UnrecognizedVirtualPixelMethod",argv[i]);
5982            break;
5983          }
5984        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5985      }
5986      case 'w':
5987      {
5988        if (LocaleCompare("wave",option+1) == 0)
5989          {
5990            i++;
5991            if (i == (ssize_t) argc)
5992              ThrowMogrifyException(OptionError,"MissingArgument",option);
5993            if (IsGeometry(argv[i]) == MagickFalse)
5994              ThrowMogrifyInvalidArgumentException(option,argv[i]);
5995            break;
5996          }
5997        if (LocaleCompare("weight",option+1) == 0)
5998          {
5999            if (*option == '+')
6000              break;
6001            i++;
6002            if (i == (ssize_t) (argc-1))
6003              ThrowMogrifyException(OptionError,"MissingArgument",option);
6004            break;
6005          }
6006        if (LocaleCompare("white-point",option+1) == 0)
6007          {
6008            if (*option == '+')
6009              break;
6010            i++;
6011            if (i == (ssize_t) argc)
6012              ThrowMogrifyException(OptionError,"MissingArgument",option);
6013            if (IsGeometry(argv[i]) == MagickFalse)
6014              ThrowMogrifyInvalidArgumentException(option,argv[i]);
6015            break;
6016          }
6017        if (LocaleCompare("white-threshold",option+1) == 0)
6018          {
6019            if (*option == '+')
6020              break;
6021            i++;
6022            if (i == (ssize_t) argc)
6023              ThrowMogrifyException(OptionError,"MissingArgument",option);
6024            if (IsGeometry(argv[i]) == MagickFalse)
6025              ThrowMogrifyInvalidArgumentException(option,argv[i]);
6026            break;
6027          }
6028        if (LocaleCompare("write",option+1) == 0)
6029          {
6030            i++;
6031            if (i == (ssize_t) (argc-1))
6032              ThrowMogrifyException(OptionError,"MissingArgument",option);
6033            break;
6034          }
6035        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
6036      }
6037      case '?':
6038        break;
6039      default:
6040        ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
6041    }
6042    fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
6043      FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
6044    if (fire != MagickFalse)
6045      FireImageStack(MagickFalse,MagickTrue,MagickTrue);
6046  }
6047  if (k != 0)
6048    ThrowMogrifyException(OptionError,"UnbalancedParenthesis",argv[i]);
6049  if (i != (ssize_t) argc)
6050    ThrowMogrifyException(OptionError,"MissingAnImageFilename",argv[i]);
6051  DestroyMogrify();
6052  return(status != 0 ? MagickTrue : MagickFalse);
6053}
6054
6055/*
6056%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6057%                                                                             %
6058%                                                                             %
6059%                                                                             %
6060+     M o g r i f y I m a g e I n f o                                         %
6061%                                                                             %
6062%                                                                             %
6063%                                                                             %
6064%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6065%
6066%  MogrifyImageInfo() applies image processing settings to the image as
6067%  prescribed by command line options.
6068%
6069%  The format of the MogrifyImageInfo method is:
6070%
6071%      MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,const int argc,
6072%        const char **argv,ExceptionInfo *exception)
6073%
6074%  A description of each parameter follows:
6075%
6076%    o image_info: the image info..
6077%
6078%    o argc: Specifies a pointer to an integer describing the number of
6079%      elements in the argument vector.
6080%
6081%    o argv: Specifies a pointer to a text array containing the command line
6082%      arguments.
6083%
6084%    o exception: return any errors or warnings in this structure.
6085%
6086*/
6087WandExport MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,
6088  const int argc,const char **argv,ExceptionInfo *exception)
6089{
6090  const char
6091    *option;
6092
6093  GeometryInfo
6094    geometry_info;
6095
6096  ssize_t
6097    count;
6098
6099  register ssize_t
6100    i;
6101
6102  /*
6103    Initialize method variables.
6104  */
6105  assert(image_info != (ImageInfo *) NULL);
6106  assert(image_info->signature == MagickSignature);
6107  if (image_info->debug != MagickFalse)
6108    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
6109      image_info->filename);
6110  if (argc < 0)
6111    return(MagickTrue);
6112  /*
6113    Set the image settings.
6114  */
6115  for (i=0; i < (ssize_t) argc; i++)
6116  {
6117    option=argv[i];
6118    if (IsCommandOption(option) == MagickFalse)
6119      continue;
6120    count=ParseCommandOption(MagickCommandOptions,MagickFalse,option);
6121    count=MagickMax(count,0L);
6122    if ((i+count) >= (ssize_t) argc)
6123      break;
6124    switch (*(option+1))
6125    {
6126      case 'a':
6127      {
6128        if (LocaleCompare("adjoin",option+1) == 0)
6129          {
6130            image_info->adjoin=(*option == '-') ? MagickTrue : MagickFalse;
6131            break;
6132          }
6133        if (LocaleCompare("antialias",option+1) == 0)
6134          {
6135            image_info->antialias=(*option == '-') ? MagickTrue : MagickFalse;
6136            break;
6137          }
6138        if (LocaleCompare("attenuate",option+1) == 0)
6139          {
6140            if (*option == '+')
6141              {
6142                (void) DeleteImageOption(image_info,option+1);
6143                break;
6144              }
6145            (void) SetImageOption(image_info,option+1,argv[i+1]);
6146            break;
6147          }
6148        if (LocaleCompare("authenticate",option+1) == 0)
6149          {
6150            if (*option == '+')
6151              (void) CloneString(&image_info->authenticate,(char *) NULL);
6152            else
6153              (void) CloneString(&image_info->authenticate,argv[i+1]);
6154            break;
6155          }
6156        break;
6157      }
6158      case 'b':
6159      {
6160        if (LocaleCompare("background",option+1) == 0)
6161          {
6162            if (*option == '+')
6163              {
6164                (void) DeleteImageOption(image_info,option+1);
6165                (void) QueryColorDatabase(BackgroundColor,
6166                  &image_info->background_color,exception);
6167                break;
6168              }
6169            (void) SetImageOption(image_info,option+1,argv[i+1]);
6170            (void) QueryColorDatabase(argv[i+1],&image_info->background_color,
6171              exception);
6172            break;
6173          }
6174        if (LocaleCompare("bias",option+1) == 0)
6175          {
6176            if (*option == '+')
6177              {
6178                (void) SetImageOption(image_info,option+1,"0.0");
6179                break;
6180              }
6181            (void) SetImageOption(image_info,option+1,argv[i+1]);
6182            break;
6183          }
6184        if (LocaleCompare("black-point-compensation",option+1) == 0)
6185          {
6186            if (*option == '+')
6187              {
6188                (void) SetImageOption(image_info,option+1,"false");
6189                break;
6190              }
6191            (void) SetImageOption(image_info,option+1,"true");
6192            break;
6193          }
6194        if (LocaleCompare("blue-primary",option+1) == 0)
6195          {
6196            if (*option == '+')
6197              {
6198                (void) SetImageOption(image_info,option+1,"0.0");
6199                break;
6200              }
6201            (void) SetImageOption(image_info,option+1,argv[i+1]);
6202            break;
6203          }
6204        if (LocaleCompare("bordercolor",option+1) == 0)
6205          {
6206            if (*option == '+')
6207              {
6208                (void) DeleteImageOption(image_info,option+1);
6209                (void) QueryColorDatabase(BorderColor,&image_info->border_color,
6210                  exception);
6211                break;
6212              }
6213            (void) QueryColorDatabase(argv[i+1],&image_info->border_color,
6214              exception);
6215            (void) SetImageOption(image_info,option+1,argv[i+1]);
6216            break;
6217          }
6218        if (LocaleCompare("box",option+1) == 0)
6219          {
6220            if (*option == '+')
6221              {
6222                (void) SetImageOption(image_info,"undercolor","none");
6223                break;
6224              }
6225            (void) SetImageOption(image_info,"undercolor",argv[i+1]);
6226            break;
6227          }
6228        break;
6229      }
6230      case 'c':
6231      {
6232        if (LocaleCompare("cache",option+1) == 0)
6233          {
6234            MagickSizeType
6235              limit;
6236
6237            limit=MagickResourceInfinity;
6238            if (LocaleCompare("unlimited",argv[i+1]) != 0)
6239              limit=(MagickSizeType) SiPrefixToDouble(argv[i+1],100.0);
6240            (void) SetMagickResourceLimit(MemoryResource,limit);
6241            (void) SetMagickResourceLimit(MapResource,2*limit);
6242            break;
6243          }
6244        if (LocaleCompare("caption",option+1) == 0)
6245          {
6246            if (*option == '+')
6247              {
6248                (void) DeleteImageOption(image_info,option+1);
6249                break;
6250              }
6251            (void) SetImageOption(image_info,option+1,argv[i+1]);
6252            break;
6253          }
6254        if (LocaleCompare("channel",option+1) == 0)
6255          {
6256            if (*option == '+')
6257              {
6258                image_info->channel=DefaultChannels;
6259                break;
6260              }
6261            image_info->channel=(ChannelType) ParseChannelOption(argv[i+1]);
6262            break;
6263          }
6264        if (LocaleCompare("colors",option+1) == 0)
6265          {
6266            image_info->colors=StringToUnsignedLong(argv[i+1]);
6267            break;
6268          }
6269        if (LocaleCompare("colorspace",option+1) == 0)
6270          {
6271            if (*option == '+')
6272              {
6273                image_info->colorspace=UndefinedColorspace;
6274                (void) SetImageOption(image_info,option+1,"undefined");
6275                break;
6276              }
6277            image_info->colorspace=(ColorspaceType) ParseCommandOption(
6278              MagickColorspaceOptions,MagickFalse,argv[i+1]);
6279            (void) SetImageOption(image_info,option+1,argv[i+1]);
6280            break;
6281          }
6282        if (LocaleCompare("comment",option+1) == 0)
6283          {
6284            if (*option == '+')
6285              {
6286                (void) DeleteImageOption(image_info,option+1);
6287                break;
6288              }
6289            (void) SetImageOption(image_info,option+1,argv[i+1]);
6290            break;
6291          }
6292        if (LocaleCompare("compose",option+1) == 0)
6293          {
6294            if (*option == '+')
6295              {
6296                (void) SetImageOption(image_info,option+1,"undefined");
6297                break;
6298              }
6299            (void) SetImageOption(image_info,option+1,argv[i+1]);
6300            break;
6301          }
6302        if (LocaleCompare("compress",option+1) == 0)
6303          {
6304            if (*option == '+')
6305              {
6306                image_info->compression=UndefinedCompression;
6307                (void) SetImageOption(image_info,option+1,"undefined");
6308                break;
6309              }
6310            image_info->compression=(CompressionType) ParseCommandOption(
6311              MagickCompressOptions,MagickFalse,argv[i+1]);
6312            (void) SetImageOption(image_info,option+1,argv[i+1]);
6313            break;
6314          }
6315        break;
6316      }
6317      case 'd':
6318      {
6319        if (LocaleCompare("debug",option+1) == 0)
6320          {
6321            if (*option == '+')
6322              (void) SetLogEventMask("none");
6323            else
6324              (void) SetLogEventMask(argv[i+1]);
6325            image_info->debug=IsEventLogging();
6326            break;
6327          }
6328        if (LocaleCompare("define",option+1) == 0)
6329          {
6330            if (*option == '+')
6331              {
6332                if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
6333                  (void) DeleteImageRegistry(argv[i+1]+9);
6334                else
6335                  (void) DeleteImageOption(image_info,argv[i+1]);
6336                break;
6337              }
6338            if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
6339              {
6340                (void) DefineImageRegistry(StringRegistryType,argv[i+1]+9,
6341                  exception);
6342                break;
6343              }
6344            (void) DefineImageOption(image_info,argv[i+1]);
6345            break;
6346          }
6347        if (LocaleCompare("delay",option+1) == 0)
6348          {
6349            if (*option == '+')
6350              {
6351                (void) SetImageOption(image_info,option+1,"0");
6352                break;
6353              }
6354            (void) SetImageOption(image_info,option+1,argv[i+1]);
6355            break;
6356          }
6357        if (LocaleCompare("density",option+1) == 0)
6358          {
6359            /*
6360              Set image density.
6361            */
6362            if (*option == '+')
6363              {
6364                if (image_info->density != (char *) NULL)
6365                  image_info->density=DestroyString(image_info->density);
6366                (void) SetImageOption(image_info,option+1,"72");
6367                break;
6368              }
6369            (void) CloneString(&image_info->density,argv[i+1]);
6370            (void) SetImageOption(image_info,option+1,argv[i+1]);
6371            break;
6372          }
6373        if (LocaleCompare("depth",option+1) == 0)
6374          {
6375            if (*option == '+')
6376              {
6377                image_info->depth=MAGICKCORE_QUANTUM_DEPTH;
6378                break;
6379              }
6380            image_info->depth=StringToUnsignedLong(argv[i+1]);
6381            break;
6382          }
6383        if (LocaleCompare("direction",option+1) == 0)
6384          {
6385            if (*option == '+')
6386              {
6387                (void) SetImageOption(image_info,option+1,"undefined");
6388                break;
6389              }
6390            (void) SetImageOption(image_info,option+1,argv[i+1]);
6391            break;
6392          }
6393        if (LocaleCompare("display",option+1) == 0)
6394          {
6395            if (*option == '+')
6396              {
6397                if (image_info->server_name != (char *) NULL)
6398                  image_info->server_name=DestroyString(
6399                    image_info->server_name);
6400                break;
6401              }
6402            (void) CloneString(&image_info->server_name,argv[i+1]);
6403            break;
6404          }
6405        if (LocaleCompare("dispose",option+1) == 0)
6406          {
6407            if (*option == '+')
6408              {
6409                (void) SetImageOption(image_info,option+1,"undefined");
6410                break;
6411              }
6412            (void) SetImageOption(image_info,option+1,argv[i+1]);
6413            break;
6414          }
6415        if (LocaleCompare("dither",option+1) == 0)
6416          {
6417            if (*option == '+')
6418              {
6419                image_info->dither=MagickFalse;
6420                (void) SetImageOption(image_info,option+1,"none");
6421                break;
6422              }
6423            (void) SetImageOption(image_info,option+1,argv[i+1]);
6424            image_info->dither=MagickTrue;
6425            break;
6426          }
6427        break;
6428      }
6429      case 'e':
6430      {
6431        if (LocaleCompare("encoding",option+1) == 0)
6432          {
6433            if (*option == '+')
6434              {
6435                (void) SetImageOption(image_info,option+1,"undefined");
6436                break;
6437              }
6438            (void) SetImageOption(image_info,option+1,argv[i+1]);
6439            break;
6440          }
6441        if (LocaleCompare("endian",option+1) == 0)
6442          {
6443            if (*option == '+')
6444              {
6445                image_info->endian=UndefinedEndian;
6446                (void) SetImageOption(image_info,option+1,"undefined");
6447                break;
6448              }
6449            image_info->endian=(EndianType) ParseCommandOption(
6450              MagickEndianOptions,MagickFalse,argv[i+1]);
6451            (void) SetImageOption(image_info,option+1,argv[i+1]);
6452            break;
6453          }
6454        if (LocaleCompare("extract",option+1) == 0)
6455          {
6456            /*
6457              Set image extract geometry.
6458            */
6459            if (*option == '+')
6460              {
6461                if (image_info->extract != (char *) NULL)
6462                  image_info->extract=DestroyString(image_info->extract);
6463                break;
6464              }
6465            (void) CloneString(&image_info->extract,argv[i+1]);
6466            break;
6467          }
6468        break;
6469      }
6470      case 'f':
6471      {
6472        if (LocaleCompare("fill",option+1) == 0)
6473          {
6474            if (*option == '+')
6475              {
6476                (void) SetImageOption(image_info,option+1,"none");
6477                break;
6478              }
6479            (void) SetImageOption(image_info,option+1,argv[i+1]);
6480            break;
6481          }
6482        if (LocaleCompare("filter",option+1) == 0)
6483          {
6484            if (*option == '+')
6485              {
6486                (void) SetImageOption(image_info,option+1,"undefined");
6487                break;
6488              }
6489            (void) SetImageOption(image_info,option+1,argv[i+1]);
6490            break;
6491          }
6492        if (LocaleCompare("font",option+1) == 0)
6493          {
6494            if (*option == '+')
6495              {
6496                if (image_info->font != (char *) NULL)
6497                  image_info->font=DestroyString(image_info->font);
6498                break;
6499              }
6500            (void) CloneString(&image_info->font,argv[i+1]);
6501            break;
6502          }
6503        if (LocaleCompare("format",option+1) == 0)
6504          {
6505            register const char
6506              *q;
6507
6508            for (q=strchr(argv[i+1],'%'); q != (char *) NULL; q=strchr(q+1,'%'))
6509              if (strchr("Agkrz@[#",*(q+1)) != (char *) NULL)
6510                image_info->ping=MagickFalse;
6511            (void) SetImageOption(image_info,option+1,argv[i+1]);
6512            break;
6513          }
6514        if (LocaleCompare("fuzz",option+1) == 0)
6515          {
6516            if (*option == '+')
6517              {
6518                image_info->fuzz=0.0;
6519                (void) SetImageOption(image_info,option+1,"0");
6520                break;
6521              }
6522            image_info->fuzz=SiPrefixToDouble(argv[i+1],(double) QuantumRange+
6523              1.0);
6524            (void) SetImageOption(image_info,option+1,argv[i+1]);
6525            break;
6526          }
6527        break;
6528      }
6529      case 'g':
6530      {
6531        if (LocaleCompare("gravity",option+1) == 0)
6532          {
6533            if (*option == '+')
6534              {
6535                (void) SetImageOption(image_info,option+1,"undefined");
6536                break;
6537              }
6538            (void) SetImageOption(image_info,option+1,argv[i+1]);
6539            break;
6540          }
6541        if (LocaleCompare("green-primary",option+1) == 0)
6542          {
6543            if (*option == '+')
6544              {
6545                (void) SetImageOption(image_info,option+1,"0.0");
6546                break;
6547              }
6548            (void) SetImageOption(image_info,option+1,argv[i+1]);
6549            break;
6550          }
6551        break;
6552      }
6553      case 'i':
6554      {
6555        if (LocaleCompare("intent",option+1) == 0)
6556          {
6557            if (*option == '+')
6558              {
6559                (void) SetImageOption(image_info,option+1,"undefined");
6560                break;
6561              }
6562            (void) SetImageOption(image_info,option+1,argv[i+1]);
6563            break;
6564          }
6565        if (LocaleCompare("interlace",option+1) == 0)
6566          {
6567            if (*option == '+')
6568              {
6569                image_info->interlace=UndefinedInterlace;
6570                (void) SetImageOption(image_info,option+1,"undefined");
6571                break;
6572              }
6573            image_info->interlace=(InterlaceType) ParseCommandOption(
6574              MagickInterlaceOptions,MagickFalse,argv[i+1]);
6575            (void) SetImageOption(image_info,option+1,argv[i+1]);
6576            break;
6577          }
6578        if (LocaleCompare("interline-spacing",option+1) == 0)
6579          {
6580            if (*option == '+')
6581              {
6582                (void) SetImageOption(image_info,option+1,"undefined");
6583                break;
6584              }
6585            (void) SetImageOption(image_info,option+1,argv[i+1]);
6586            break;
6587          }
6588        if (LocaleCompare("interpolate",option+1) == 0)
6589          {
6590            if (*option == '+')
6591              {
6592                (void) SetImageOption(image_info,option+1,"undefined");
6593                break;
6594              }
6595            (void) SetImageOption(image_info,option+1,argv[i+1]);
6596            break;
6597          }
6598        if (LocaleCompare("interword-spacing",option+1) == 0)
6599          {
6600            if (*option == '+')
6601              {
6602                (void) SetImageOption(image_info,option+1,"undefined");
6603                break;
6604              }
6605            (void) SetImageOption(image_info,option+1,argv[i+1]);
6606            break;
6607          }
6608        break;
6609      }
6610      case 'k':
6611      {
6612        if (LocaleCompare("kerning",option+1) == 0)
6613          {
6614            if (*option == '+')
6615              {
6616                (void) SetImageOption(image_info,option+1,"undefined");
6617                break;
6618              }
6619            (void) SetImageOption(image_info,option+1,argv[i+1]);
6620            break;
6621          }
6622        break;
6623      }
6624      case 'l':
6625      {
6626        if (LocaleCompare("label",option+1) == 0)
6627          {
6628            if (*option == '+')
6629              {
6630                (void) DeleteImageOption(image_info,option+1);
6631                break;
6632              }
6633            (void) SetImageOption(image_info,option+1,argv[i+1]);
6634            break;
6635          }
6636        if (LocaleCompare("limit",option+1) == 0)
6637          {
6638            MagickSizeType
6639              limit;
6640
6641            ResourceType
6642              type;
6643
6644            if (*option == '+')
6645              break;
6646            type=(ResourceType) ParseCommandOption(MagickResourceOptions,
6647              MagickFalse,argv[i+1]);
6648            limit=MagickResourceInfinity;
6649            if (LocaleCompare("unlimited",argv[i+2]) != 0)
6650              limit=(MagickSizeType) SiPrefixToDouble(argv[i+2],100.0);
6651            (void) SetMagickResourceLimit(type,limit);
6652            break;
6653          }
6654        if (LocaleCompare("list",option+1) == 0)
6655          {
6656            ssize_t
6657              list;
6658
6659            /*
6660              Display configuration list.
6661            */
6662            list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i+1]);
6663            switch (list)
6664            {
6665              case MagickCoderOptions:
6666              {
6667                (void) ListCoderInfo((FILE *) NULL,exception);
6668                break;
6669              }
6670              case MagickColorOptions:
6671              {
6672                (void) ListColorInfo((FILE *) NULL,exception);
6673                break;
6674              }
6675              case MagickConfigureOptions:
6676              {
6677                (void) ListConfigureInfo((FILE *) NULL,exception);
6678                break;
6679              }
6680              case MagickDelegateOptions:
6681              {
6682                (void) ListDelegateInfo((FILE *) NULL,exception);
6683                break;
6684              }
6685              case MagickFontOptions:
6686              {
6687                (void) ListTypeInfo((FILE *) NULL,exception);
6688                break;
6689              }
6690              case MagickFormatOptions:
6691              {
6692                (void) ListMagickInfo((FILE *) NULL,exception);
6693                break;
6694              }
6695              case MagickLocaleOptions:
6696              {
6697                (void) ListLocaleInfo((FILE *) NULL,exception);
6698                break;
6699              }
6700              case MagickLogOptions:
6701              {
6702                (void) ListLogInfo((FILE *) NULL,exception);
6703                break;
6704              }
6705              case MagickMagicOptions:
6706              {
6707                (void) ListMagicInfo((FILE *) NULL,exception);
6708                break;
6709              }
6710              case MagickMimeOptions:
6711              {
6712                (void) ListMimeInfo((FILE *) NULL,exception);
6713                break;
6714              }
6715              case MagickModuleOptions:
6716              {
6717                (void) ListModuleInfo((FILE *) NULL,exception);
6718                break;
6719              }
6720              case MagickPolicyOptions:
6721              {
6722                (void) ListPolicyInfo((FILE *) NULL,exception);
6723                break;
6724              }
6725              case MagickResourceOptions:
6726              {
6727                (void) ListMagickResourceInfo((FILE *) NULL,exception);
6728                break;
6729              }
6730              case MagickThresholdOptions:
6731              {
6732                (void) ListThresholdMaps((FILE *) NULL,exception);
6733                break;
6734              }
6735              default:
6736              {
6737                (void) ListCommandOptions((FILE *) NULL,(CommandOption) list,
6738                  exception);
6739                break;
6740              }
6741            }
6742            break;
6743          }
6744        if (LocaleCompare("log",option+1) == 0)
6745          {
6746            if (*option == '+')
6747              break;
6748            (void) SetLogFormat(argv[i+1]);
6749            break;
6750          }
6751        if (LocaleCompare("loop",option+1) == 0)
6752          {
6753            if (*option == '+')
6754              {
6755                (void) SetImageOption(image_info,option+1,"0");
6756                break;
6757              }
6758            (void) SetImageOption(image_info,option+1,argv[i+1]);
6759            break;
6760          }
6761        break;
6762      }
6763      case 'm':
6764      {
6765        if (LocaleCompare("matte",option+1) == 0)
6766          {
6767            if (*option == '+')
6768              {
6769                (void) SetImageOption(image_info,option+1,"false");
6770                break;
6771              }
6772            (void) SetImageOption(image_info,option+1,"true");
6773            break;
6774          }
6775        if (LocaleCompare("mattecolor",option+1) == 0)
6776          {
6777            if (*option == '+')
6778              {
6779                (void) SetImageOption(image_info,option+1,argv[i+1]);
6780                (void) QueryColorDatabase(MatteColor,&image_info->matte_color,
6781                  exception);
6782                break;
6783              }
6784            (void) SetImageOption(image_info,option+1,argv[i+1]);
6785            (void) QueryColorDatabase(argv[i+1],&image_info->matte_color,
6786              exception);
6787            break;
6788          }
6789        if (LocaleCompare("monitor",option+1) == 0)
6790          {
6791            (void) SetImageInfoProgressMonitor(image_info,MonitorProgress,
6792              (void *) NULL);
6793            break;
6794          }
6795        if (LocaleCompare("monochrome",option+1) == 0)
6796          {
6797            image_info->monochrome=(*option == '-') ? MagickTrue : MagickFalse;
6798            break;
6799          }
6800        break;
6801      }
6802      case 'o':
6803      {
6804        if (LocaleCompare("orient",option+1) == 0)
6805          {
6806            if (*option == '+')
6807              {
6808                image_info->orientation=UndefinedOrientation;
6809                (void) SetImageOption(image_info,option+1,"undefined");
6810                break;
6811              }
6812            image_info->orientation=(OrientationType) ParseCommandOption(
6813              MagickOrientationOptions,MagickFalse,argv[i+1]);
6814            (void) SetImageOption(image_info,option+1,argv[i+1]);
6815            break;
6816          }
6817      }
6818      case 'p':
6819      {
6820        if (LocaleCompare("page",option+1) == 0)
6821          {
6822            char
6823              *canonical_page,
6824              page[MaxTextExtent];
6825
6826            const char
6827              *image_option;
6828
6829            MagickStatusType
6830              flags;
6831
6832            RectangleInfo
6833              geometry;
6834
6835            if (*option == '+')
6836              {
6837                (void) DeleteImageOption(image_info,option+1);
6838                (void) CloneString(&image_info->page,(char *) NULL);
6839                break;
6840              }
6841            (void) ResetMagickMemory(&geometry,0,sizeof(geometry));
6842            image_option=GetImageOption(image_info,"page");
6843            if (image_option != (const char *) NULL)
6844              flags=ParseAbsoluteGeometry(image_option,&geometry);
6845            canonical_page=GetPageGeometry(argv[i+1]);
6846            flags=ParseAbsoluteGeometry(canonical_page,&geometry);
6847            canonical_page=DestroyString(canonical_page);
6848            (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu",
6849              (unsigned long) geometry.width,(unsigned long) geometry.height);
6850            if (((flags & XValue) != 0) || ((flags & YValue) != 0))
6851              (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu%+ld%+ld",
6852                (unsigned long) geometry.width,(unsigned long) geometry.height,
6853                (long) geometry.x,(long) geometry.y);
6854            (void) SetImageOption(image_info,option+1,page);
6855            (void) CloneString(&image_info->page,page);
6856            break;
6857          }
6858        if (LocaleCompare("pen",option+1) == 0)
6859          {
6860            if (*option == '+')
6861              {
6862                (void) SetImageOption(image_info,option+1,"none");
6863                break;
6864              }
6865            (void) SetImageOption(image_info,option+1,argv[i+1]);
6866            break;
6867          }
6868        if (LocaleCompare("ping",option+1) == 0)
6869          {
6870            image_info->ping=(*option == '-') ? MagickTrue : MagickFalse;
6871            break;
6872          }
6873        if (LocaleCompare("pointsize",option+1) == 0)
6874          {
6875            if (*option == '+')
6876              geometry_info.rho=0.0;
6877            else
6878              (void) ParseGeometry(argv[i+1],&geometry_info);
6879            image_info->pointsize=geometry_info.rho;
6880            break;
6881          }
6882        if (LocaleCompare("precision",option+1) == 0)
6883          {
6884            (void) SetMagickPrecision(StringToInteger(argv[i+1]));
6885            break;
6886          }
6887        if (LocaleCompare("preview",option+1) == 0)
6888          {
6889            /*
6890              Preview image.
6891            */
6892            if (*option == '+')
6893              {
6894                image_info->preview_type=UndefinedPreview;
6895                break;
6896              }
6897            image_info->preview_type=(PreviewType) ParseCommandOption(
6898              MagickPreviewOptions,MagickFalse,argv[i+1]);
6899            break;
6900          }
6901        break;
6902      }
6903      case 'q':
6904      {
6905        if (LocaleCompare("quality",option+1) == 0)
6906          {
6907            /*
6908              Set image compression quality.
6909            */
6910            if (*option == '+')
6911              {
6912                image_info->quality=UndefinedCompressionQuality;
6913                (void) SetImageOption(image_info,option+1,"0");
6914                break;
6915              }
6916            image_info->quality=StringToUnsignedLong(argv[i+1]);
6917            (void) SetImageOption(image_info,option+1,argv[i+1]);
6918            break;
6919          }
6920        if (LocaleCompare("quiet",option+1) == 0)
6921          {
6922            static WarningHandler
6923              warning_handler = (WarningHandler) NULL;
6924
6925            if (*option == '+')
6926              {
6927                /*
6928                  Restore error or warning messages.
6929                */
6930                warning_handler=SetWarningHandler(warning_handler);
6931                break;
6932              }
6933            /*
6934              Suppress error or warning messages.
6935            */
6936            warning_handler=SetWarningHandler((WarningHandler) NULL);
6937            break;
6938          }
6939        break;
6940      }
6941      case 'r':
6942      {
6943        if (LocaleCompare("red-primary",option+1) == 0)
6944          {
6945            if (*option == '+')
6946              {
6947                (void) SetImageOption(image_info,option+1,"0.0");
6948                break;
6949              }
6950            (void) SetImageOption(image_info,option+1,argv[i+1]);
6951            break;
6952          }
6953        break;
6954      }
6955      case 's':
6956      {
6957        if (LocaleCompare("sampling-factor",option+1) == 0)
6958          {
6959            /*
6960              Set image sampling factor.
6961            */
6962            if (*option == '+')
6963              {
6964                if (image_info->sampling_factor != (char *) NULL)
6965                  image_info->sampling_factor=DestroyString(
6966                    image_info->sampling_factor);
6967                break;
6968              }
6969            (void) CloneString(&image_info->sampling_factor,argv[i+1]);
6970            break;
6971          }
6972        if (LocaleCompare("scene",option+1) == 0)
6973          {
6974            /*
6975              Set image scene.
6976            */
6977            if (*option == '+')
6978              {
6979                image_info->scene=0;
6980                (void) SetImageOption(image_info,option+1,"0");
6981                break;
6982              }
6983            image_info->scene=StringToUnsignedLong(argv[i+1]);
6984            (void) SetImageOption(image_info,option+1,argv[i+1]);
6985            break;
6986          }
6987        if (LocaleCompare("seed",option+1) == 0)
6988          {
6989            size_t
6990              seed;
6991
6992            if (*option == '+')
6993              {
6994                seed=(size_t) time((time_t *) NULL);
6995                SeedPseudoRandomGenerator(seed);
6996                break;
6997              }
6998            seed=StringToUnsignedLong(argv[i+1]);
6999            SeedPseudoRandomGenerator(seed);
7000            break;
7001          }
7002        if (LocaleCompare("size",option+1) == 0)
7003          {
7004            if (*option == '+')
7005              {
7006                if (image_info->size != (char *) NULL)
7007                  image_info->size=DestroyString(image_info->size);
7008                break;
7009              }
7010            (void) CloneString(&image_info->size,argv[i+1]);
7011            break;
7012          }
7013        if (LocaleCompare("stroke",option+1) == 0)
7014          {
7015            if (*option == '+')
7016              {
7017                (void) SetImageOption(image_info,option+1,"none");
7018                break;
7019              }
7020            (void) SetImageOption(image_info,option+1,argv[i+1]);
7021            break;
7022          }
7023        if (LocaleCompare("strokewidth",option+1) == 0)
7024          {
7025            if (*option == '+')
7026              {
7027                (void) SetImageOption(image_info,option+1,"0");
7028                break;
7029              }
7030            (void) SetImageOption(image_info,option+1,argv[i+1]);
7031            break;
7032          }
7033        if (LocaleCompare("synchronize",option+1) == 0)
7034          {
7035            if (*option == '+')
7036              {
7037                image_info->synchronize=MagickFalse;
7038                break;
7039              }
7040            image_info->synchronize=MagickTrue;
7041            break;
7042          }
7043        break;
7044      }
7045      case 't':
7046      {
7047        if (LocaleCompare("taint",option+1) == 0)
7048          {
7049            if (*option == '+')
7050              {
7051                (void) SetImageOption(image_info,option+1,"false");
7052                break;
7053              }
7054            (void) SetImageOption(image_info,option+1,"true");
7055            break;
7056          }
7057        if (LocaleCompare("texture",option+1) == 0)
7058          {
7059            if (*option == '+')
7060              {
7061                if (image_info->texture != (char *) NULL)
7062                  image_info->texture=DestroyString(image_info->texture);
7063                break;
7064              }
7065            (void) CloneString(&image_info->texture,argv[i+1]);
7066            break;
7067          }
7068        if (LocaleCompare("tile-offset",option+1) == 0)
7069          {
7070            if (*option == '+')
7071              {
7072                (void) SetImageOption(image_info,option+1,"0");
7073                break;
7074              }
7075            (void) SetImageOption(image_info,option+1,argv[i+1]);
7076            break;
7077          }
7078        if (LocaleCompare("transparent-color",option+1) == 0)
7079          {
7080            if (*option == '+')
7081              {
7082                (void) QueryColorDatabase("none",&image_info->transparent_color,                  exception);
7083                (void) SetImageOption(image_info,option+1,"none");
7084                break;
7085              }
7086            (void) QueryColorDatabase(argv[i+1],&image_info->transparent_color,
7087              exception);
7088            (void) SetImageOption(image_info,option+1,argv[i+1]);
7089            break;
7090          }
7091        if (LocaleCompare("type",option+1) == 0)
7092          {
7093            if (*option == '+')
7094              {
7095                image_info->type=UndefinedType;
7096                (void) SetImageOption(image_info,option+1,"undefined");
7097                break;
7098              }
7099            image_info->type=(ImageType) ParseCommandOption(MagickTypeOptions,
7100              MagickFalse,argv[i+1]);
7101            (void) SetImageOption(image_info,option+1,argv[i+1]);
7102            break;
7103          }
7104        break;
7105      }
7106      case 'u':
7107      {
7108        if (LocaleCompare("undercolor",option+1) == 0)
7109          {
7110            if (*option == '+')
7111              {
7112                (void) DeleteImageOption(image_info,option+1);
7113                break;
7114              }
7115            (void) SetImageOption(image_info,option+1,argv[i+1]);
7116            break;
7117          }
7118        if (LocaleCompare("units",option+1) == 0)
7119          {
7120            if (*option == '+')
7121              {
7122                image_info->units=UndefinedResolution;
7123                (void) SetImageOption(image_info,option+1,"undefined");
7124                break;
7125              }
7126            image_info->units=(ResolutionType) ParseCommandOption(
7127              MagickResolutionOptions,MagickFalse,argv[i+1]);
7128            (void) SetImageOption(image_info,option+1,argv[i+1]);
7129            break;
7130          }
7131        break;
7132      }
7133      case 'v':
7134      {
7135        if (LocaleCompare("verbose",option+1) == 0)
7136          {
7137            if (*option == '+')
7138              {
7139                image_info->verbose=MagickFalse;
7140                break;
7141              }
7142            image_info->verbose=MagickTrue;
7143            image_info->ping=MagickFalse;
7144            break;
7145          }
7146        if (LocaleCompare("view",option+1) == 0)
7147          {
7148            if (*option == '+')
7149              {
7150                if (image_info->view != (char *) NULL)
7151                  image_info->view=DestroyString(image_info->view);
7152                break;
7153              }
7154            (void) CloneString(&image_info->view,argv[i+1]);
7155            break;
7156          }
7157        if (LocaleCompare("virtual-pixel",option+1) == 0)
7158          {
7159            if (*option == '+')
7160              {
7161                image_info->virtual_pixel_method=UndefinedVirtualPixelMethod;
7162                (void) SetImageOption(image_info,option+1,"undefined");
7163                break;
7164              }
7165            image_info->virtual_pixel_method=(VirtualPixelMethod)
7166              ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
7167              argv[i+1]);
7168            (void) SetImageOption(image_info,option+1,argv[i+1]);
7169            break;
7170          }
7171        break;
7172      }
7173      case 'w':
7174      {
7175        if (LocaleCompare("white-point",option+1) == 0)
7176          {
7177            if (*option == '+')
7178              {
7179                (void) SetImageOption(image_info,option+1,"0.0");
7180                break;
7181              }
7182            (void) SetImageOption(image_info,option+1,argv[i+1]);
7183            break;
7184          }
7185        break;
7186      }
7187      default:
7188        break;
7189    }
7190    i+=count;
7191  }
7192  return(MagickTrue);
7193}
7194
7195/*
7196%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7197%                                                                             %
7198%                                                                             %
7199%                                                                             %
7200+     M o g r i f y I m a g e L i s t                                         %
7201%                                                                             %
7202%                                                                             %
7203%                                                                             %
7204%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7205%
7206%  MogrifyImageList() applies any command line options that might affect the
7207%  entire image list (e.g. -append, -coalesce, etc.).
7208%
7209%  The format of the MogrifyImage method is:
7210%
7211%      MagickBooleanType MogrifyImageList(ImageInfo *image_info,const int argc,
7212%        const char **argv,Image **images,ExceptionInfo *exception)
7213%
7214%  A description of each parameter follows:
7215%
7216%    o image_info: the image info..
7217%
7218%    o argc: Specifies a pointer to an integer describing the number of
7219%      elements in the argument vector.
7220%
7221%    o argv: Specifies a pointer to a text array containing the command line
7222%      arguments.
7223%
7224%    o images: pointer to pointer of the first image in image list.
7225%
7226%    o exception: return any errors or warnings in this structure.
7227%
7228*/
7229WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
7230  const int argc,const char **argv,Image **images,ExceptionInfo *exception)
7231{
7232  const char
7233    *option;
7234
7235  ImageInfo
7236    *mogrify_info;
7237
7238  MagickStatusType
7239    status;
7240
7241  QuantizeInfo
7242    *quantize_info;
7243
7244  register ssize_t
7245    i;
7246
7247  ssize_t
7248    count,
7249    index;
7250
7251  /*
7252    Apply options to the image list.
7253  */
7254  assert(image_info != (ImageInfo *) NULL);
7255  assert(image_info->signature == MagickSignature);
7256  assert(images != (Image **) NULL);
7257  assert((*images)->previous == (Image *) NULL);
7258  assert((*images)->signature == MagickSignature);
7259  if ((*images)->debug != MagickFalse)
7260    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
7261      (*images)->filename);
7262  if ((argc <= 0) || (*argv == (char *) NULL))
7263    return(MagickTrue);
7264  mogrify_info=CloneImageInfo(image_info);
7265  quantize_info=AcquireQuantizeInfo(mogrify_info);
7266  status=MagickTrue;
7267  for (i=0; i < (ssize_t) argc; i++)
7268  {
7269    if (*images == (Image *) NULL)
7270      break;
7271    option=argv[i];
7272    if (IsCommandOption(option) == MagickFalse)
7273      continue;
7274    count=ParseCommandOption(MagickCommandOptions,MagickFalse,option);
7275    count=MagickMax(count,0L);
7276    if ((i+count) >= (ssize_t) argc)
7277      break;
7278    status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception);
7279    switch (*(option+1))
7280    {
7281      case 'a':
7282      {
7283        if (LocaleCompare("affinity",option+1) == 0)
7284          {
7285            (void) SyncImagesSettings(mogrify_info,*images);
7286            if (*option == '+')
7287              {
7288                (void) RemapImages(quantize_info,*images,(Image *) NULL);
7289                InheritException(exception,&(*images)->exception);
7290                break;
7291              }
7292            i++;
7293            break;
7294          }
7295        if (LocaleCompare("append",option+1) == 0)
7296          {
7297            Image
7298              *append_image;
7299
7300            (void) SyncImagesSettings(mogrify_info,*images);
7301            append_image=AppendImages(*images,*option == '-' ? MagickTrue :
7302              MagickFalse,exception);
7303            if (append_image == (Image *) NULL)
7304              {
7305                status=MagickFalse;
7306                break;
7307              }
7308            *images=DestroyImageList(*images);
7309            *images=append_image;
7310            break;
7311          }
7312        if (LocaleCompare("average",option+1) == 0)
7313          {
7314            Image
7315              *average_image;
7316
7317            /*
7318              Average an image sequence (deprecated).
7319            */
7320            (void) SyncImagesSettings(mogrify_info,*images);
7321            average_image=EvaluateImages(*images,MeanEvaluateOperator,
7322              exception);
7323            if (average_image == (Image *) NULL)
7324              {
7325                status=MagickFalse;
7326                break;
7327              }
7328            *images=DestroyImageList(*images);
7329            *images=average_image;
7330            break;
7331          }
7332        break;
7333      }
7334      case 'c':
7335      {
7336        if (LocaleCompare("channel",option+1) == 0)
7337          {
7338            ChannelType
7339              channel;
7340
7341            if (*option == '+')
7342              {
7343                channel=DefaultChannels;
7344                break;
7345              }
7346            channel=(ChannelType) ParseChannelOption(argv[i+1]);
7347            SetPixelComponentMap(*images,channel);
7348            break;
7349          }
7350        if (LocaleCompare("clut",option+1) == 0)
7351          {
7352            Image
7353              *clut_image,
7354              *image;
7355
7356            (void) SyncImagesSettings(mogrify_info,*images);
7357            image=RemoveFirstImageFromList(images);
7358            clut_image=RemoveFirstImageFromList(images);
7359            if (clut_image == (Image *) NULL)
7360              {
7361                status=MagickFalse;
7362                break;
7363              }
7364            (void) ClutImage(image,clut_image);
7365            clut_image=DestroyImage(clut_image);
7366            InheritException(exception,&image->exception);
7367            *images=DestroyImageList(*images);
7368            *images=image;
7369            break;
7370          }
7371        if (LocaleCompare("coalesce",option+1) == 0)
7372          {
7373            Image
7374              *coalesce_image;
7375
7376            (void) SyncImagesSettings(mogrify_info,*images);
7377            coalesce_image=CoalesceImages(*images,exception);
7378            if (coalesce_image == (Image *) NULL)
7379              {
7380                status=MagickFalse;
7381                break;
7382              }
7383            *images=DestroyImageList(*images);
7384            *images=coalesce_image;
7385            break;
7386          }
7387        if (LocaleCompare("combine",option+1) == 0)
7388          {
7389            Image
7390              *combine_image;
7391
7392            (void) SyncImagesSettings(mogrify_info,*images);
7393            combine_image=CombineImages(*images,exception);
7394            if (combine_image == (Image *) NULL)
7395              {
7396                status=MagickFalse;
7397                break;
7398              }
7399            *images=DestroyImageList(*images);
7400            *images=combine_image;
7401            break;
7402          }
7403        if (LocaleCompare("composite",option+1) == 0)
7404          {
7405            Image
7406              *mask_image,
7407              *composite_image,
7408              *image;
7409
7410            RectangleInfo
7411              geometry;
7412
7413            (void) SyncImagesSettings(mogrify_info,*images);
7414            image=RemoveFirstImageFromList(images);
7415            composite_image=RemoveFirstImageFromList(images);
7416            if (composite_image == (Image *) NULL)
7417              {
7418                status=MagickFalse;
7419                break;
7420              }
7421            (void) TransformImage(&composite_image,(char *) NULL,
7422              composite_image->geometry);
7423            SetGeometry(composite_image,&geometry);
7424            (void) ParseAbsoluteGeometry(composite_image->geometry,&geometry);
7425            GravityAdjustGeometry(image->columns,image->rows,image->gravity,
7426              &geometry);
7427            mask_image=RemoveFirstImageFromList(images);
7428            if (mask_image != (Image *) NULL)
7429              {
7430                if ((image->compose == DisplaceCompositeOp) ||
7431                    (image->compose == DistortCompositeOp))
7432                  {
7433                    /*
7434                      Merge Y displacement into X displacement image.
7435                    */
7436                    (void) CompositeImage(composite_image,CopyGreenCompositeOp,
7437                      mask_image,0,0);
7438                    mask_image=DestroyImage(mask_image);
7439                  }
7440                else
7441                  {
7442                    /*
7443                      Set a blending mask for the composition.
7444                    */
7445                    /* POSIBLE ERROR; what if image->mask already set */
7446                    image->mask=mask_image;
7447                    (void) NegateImage(image->mask,MagickFalse);
7448                  }
7449              }
7450            (void) CompositeImage(image,image->compose,composite_image,
7451              geometry.x,geometry.y);
7452            if (mask_image != (Image *) NULL)
7453              mask_image=image->mask=DestroyImage(image->mask);
7454            composite_image=DestroyImage(composite_image);
7455            InheritException(exception,&image->exception);
7456            *images=DestroyImageList(*images);
7457            *images=image;
7458            break;
7459          }
7460#if 0
7461This has been merged completely into MogrifyImage()
7462        if (LocaleCompare("crop",option+1) == 0)
7463          {
7464            MagickStatusType
7465              flags;
7466
7467            RectangleInfo
7468              geometry;
7469
7470            /*
7471              Crop Image.
7472            */
7473            (void) SyncImagesSettings(mogrify_info,*images);
7474            flags=ParseGravityGeometry(*images,argv[i+1],&geometry,exception);
7475            if (((geometry.width == 0) && (geometry.height == 0)) ||
7476                ((flags & XValue) != 0) || ((flags & YValue) != 0))
7477              break;
7478            (void) TransformImages(images,argv[i+1],(char *) NULL);
7479            InheritException(exception,&(*images)->exception);
7480            break;
7481          }
7482#endif
7483        break;
7484      }
7485      case 'd':
7486      {
7487        if (LocaleCompare("deconstruct",option+1) == 0)
7488          {
7489            Image
7490              *deconstruct_image;
7491
7492            (void) SyncImagesSettings(mogrify_info,*images);
7493            deconstruct_image=CompareImagesLayers(*images,CompareAnyLayer,
7494              exception);
7495            if (deconstruct_image == (Image *) NULL)
7496              {
7497                status=MagickFalse;
7498                break;
7499              }
7500            *images=DestroyImageList(*images);
7501            *images=deconstruct_image;
7502            break;
7503          }
7504        if (LocaleCompare("delete",option+1) == 0)
7505          {
7506            if (*option == '+')
7507              DeleteImages(images,"-1",exception);
7508            else
7509              DeleteImages(images,argv[i+1],exception);
7510            break;
7511          }
7512        if (LocaleCompare("dither",option+1) == 0)
7513          {
7514            if (*option == '+')
7515              {
7516                quantize_info->dither=MagickFalse;
7517                break;
7518              }
7519            quantize_info->dither=MagickTrue;
7520            quantize_info->dither_method=(DitherMethod) ParseCommandOption(
7521              MagickDitherOptions,MagickFalse,argv[i+1]);
7522            break;
7523          }
7524        if (LocaleCompare("duplicate",option+1) == 0)
7525          {
7526            Image
7527              *duplicate_images;
7528
7529            if (*option == '+')
7530              duplicate_images=DuplicateImages(*images,1,"-1",exception);
7531            else
7532              {
7533                const char
7534                  *p;
7535
7536                size_t
7537                  number_duplicates;
7538
7539                number_duplicates=(size_t) StringToLong(argv[i+1]);
7540                p=strchr(argv[i+1],',');
7541                if (p == (const char *) NULL)
7542                  duplicate_images=DuplicateImages(*images,number_duplicates,
7543                    "-1",exception);
7544                else
7545                  duplicate_images=DuplicateImages(*images,number_duplicates,p,
7546                    exception);
7547              }
7548            AppendImageToList(images, duplicate_images);
7549            (void) SyncImagesSettings(mogrify_info,*images);
7550            break;
7551          }
7552        break;
7553      }
7554      case 'e':
7555      {
7556        if (LocaleCompare("evaluate-sequence",option+1) == 0)
7557          {
7558            Image
7559              *evaluate_image;
7560
7561            MagickEvaluateOperator
7562              op;
7563
7564            (void) SyncImageSettings(mogrify_info,*images);
7565            op=(MagickEvaluateOperator) ParseCommandOption(MagickEvaluateOptions,
7566              MagickFalse,argv[i+1]);
7567            evaluate_image=EvaluateImages(*images,op,exception);
7568            if (evaluate_image == (Image *) NULL)
7569              {
7570                status=MagickFalse;
7571                break;
7572              }
7573            *images=DestroyImageList(*images);
7574            *images=evaluate_image;
7575            break;
7576          }
7577        break;
7578      }
7579      case 'f':
7580      {
7581        if (LocaleCompare("fft",option+1) == 0)
7582          {
7583            Image
7584              *fourier_image;
7585
7586            /*
7587              Implements the discrete Fourier transform (DFT).
7588            */
7589            (void) SyncImageSettings(mogrify_info,*images);
7590            fourier_image=ForwardFourierTransformImage(*images,*option == '-' ?
7591              MagickTrue : MagickFalse,exception);
7592            if (fourier_image == (Image *) NULL)
7593              break;
7594            *images=DestroyImage(*images);
7595            *images=fourier_image;
7596            break;
7597          }
7598        if (LocaleCompare("flatten",option+1) == 0)
7599          {
7600            Image
7601              *flatten_image;
7602
7603            (void) SyncImagesSettings(mogrify_info,*images);
7604            flatten_image=MergeImageLayers(*images,FlattenLayer,exception);
7605            if (flatten_image == (Image *) NULL)
7606              break;
7607            *images=DestroyImageList(*images);
7608            *images=flatten_image;
7609            break;
7610          }
7611        if (LocaleCompare("fx",option+1) == 0)
7612          {
7613            Image
7614              *fx_image;
7615
7616            (void) SyncImagesSettings(mogrify_info,*images);
7617            fx_image=FxImage(*images,argv[i+1],exception);
7618            if (fx_image == (Image *) NULL)
7619              {
7620                status=MagickFalse;
7621                break;
7622              }
7623            *images=DestroyImageList(*images);
7624            *images=fx_image;
7625            break;
7626          }
7627        break;
7628      }
7629      case 'h':
7630      {
7631        if (LocaleCompare("hald-clut",option+1) == 0)
7632          {
7633            Image
7634              *hald_image,
7635              *image;
7636
7637            (void) SyncImagesSettings(mogrify_info,*images);
7638            image=RemoveFirstImageFromList(images);
7639            hald_image=RemoveFirstImageFromList(images);
7640            if (hald_image == (Image *) NULL)
7641              {
7642                status=MagickFalse;
7643                break;
7644              }
7645            (void) HaldClutImage(image,hald_image);
7646            hald_image=DestroyImage(hald_image);
7647            InheritException(exception,&image->exception);
7648            if (*images != (Image *) NULL)
7649              *images=DestroyImageList(*images);
7650            *images=image;
7651            break;
7652          }
7653        break;
7654      }
7655      case 'i':
7656      {
7657        if (LocaleCompare("ift",option+1) == 0)
7658          {
7659            Image
7660              *fourier_image,
7661              *magnitude_image,
7662              *phase_image;
7663
7664            /*
7665              Implements the inverse fourier discrete Fourier transform (DFT).
7666            */
7667            (void) SyncImagesSettings(mogrify_info,*images);
7668            magnitude_image=RemoveFirstImageFromList(images);
7669            phase_image=RemoveFirstImageFromList(images);
7670            if (phase_image == (Image *) NULL)
7671              {
7672                status=MagickFalse;
7673                break;
7674              }
7675            fourier_image=InverseFourierTransformImage(magnitude_image,
7676              phase_image,*option == '-' ? MagickTrue : MagickFalse,exception);
7677            if (fourier_image == (Image *) NULL)
7678              break;
7679            if (*images != (Image *) NULL)
7680              *images=DestroyImage(*images);
7681            *images=fourier_image;
7682            break;
7683          }
7684        if (LocaleCompare("insert",option+1) == 0)
7685          {
7686            Image
7687              *p,
7688              *q;
7689
7690            index=0;
7691            if (*option != '+')
7692              index=(ssize_t) StringToLong(argv[i+1]);
7693            p=RemoveLastImageFromList(images);
7694            if (p == (Image *) NULL)
7695              {
7696                (void) ThrowMagickException(exception,GetMagickModule(),
7697                  OptionError,"NoSuchImage","`%s'",argv[i+1]);
7698                status=MagickFalse;
7699                break;
7700              }
7701            q=p;
7702            if (index == 0)
7703              PrependImageToList(images,q);
7704            else
7705              if (index == (ssize_t) GetImageListLength(*images))
7706                AppendImageToList(images,q);
7707              else
7708                {
7709                   q=GetImageFromList(*images,index-1);
7710                   if (q == (Image *) NULL)
7711                     {
7712                       (void) ThrowMagickException(exception,GetMagickModule(),
7713                         OptionError,"NoSuchImage","`%s'",argv[i+1]);
7714                       status=MagickFalse;
7715                       break;
7716                     }
7717                  InsertImageInList(&q,p);
7718                }
7719            *images=GetFirstImageInList(q);
7720            break;
7721          }
7722        break;
7723      }
7724      case 'l':
7725      {
7726        if (LocaleCompare("layers",option+1) == 0)
7727          {
7728            Image
7729              *layers;
7730
7731            ImageLayerMethod
7732              method;
7733
7734            (void) SyncImagesSettings(mogrify_info,*images);
7735            layers=(Image *) NULL;
7736            method=(ImageLayerMethod) ParseCommandOption(MagickLayerOptions,
7737              MagickFalse,argv[i+1]);
7738            switch (method)
7739            {
7740              case CoalesceLayer:
7741              {
7742                layers=CoalesceImages(*images,exception);
7743                break;
7744              }
7745              case CompareAnyLayer:
7746              case CompareClearLayer:
7747              case CompareOverlayLayer:
7748              default:
7749              {
7750                layers=CompareImagesLayers(*images,method,exception);
7751                break;
7752              }
7753              case MergeLayer:
7754              case FlattenLayer:
7755              case MosaicLayer:
7756              case TrimBoundsLayer:
7757              {
7758                layers=MergeImageLayers(*images,method,exception);
7759                break;
7760              }
7761              case DisposeLayer:
7762              {
7763                layers=DisposeImages(*images,exception);
7764                break;
7765              }
7766              case OptimizeImageLayer:
7767              {
7768                layers=OptimizeImageLayers(*images,exception);
7769                break;
7770              }
7771              case OptimizePlusLayer:
7772              {
7773                layers=OptimizePlusImageLayers(*images,exception);
7774                break;
7775              }
7776              case OptimizeTransLayer:
7777              {
7778                OptimizeImageTransparency(*images,exception);
7779                break;
7780              }
7781              case RemoveDupsLayer:
7782              {
7783                RemoveDuplicateLayers(images,exception);
7784                break;
7785              }
7786              case RemoveZeroLayer:
7787              {
7788                RemoveZeroDelayLayers(images,exception);
7789                break;
7790              }
7791              case OptimizeLayer:
7792              {
7793                /*
7794                  General Purpose, GIF Animation Optimizer.
7795                */
7796                layers=CoalesceImages(*images,exception);
7797                if (layers == (Image *) NULL)
7798                  {
7799                    status=MagickFalse;
7800                    break;
7801                  }
7802                InheritException(exception,&layers->exception);
7803                *images=DestroyImageList(*images);
7804                *images=layers;
7805                layers=OptimizeImageLayers(*images,exception);
7806                if (layers == (Image *) NULL)
7807                  {
7808                    status=MagickFalse;
7809                    break;
7810                  }
7811                InheritException(exception,&layers->exception);
7812                *images=DestroyImageList(*images);
7813                *images=layers;
7814                layers=(Image *) NULL;
7815                OptimizeImageTransparency(*images,exception);
7816                InheritException(exception,&(*images)->exception);
7817                (void) RemapImages(quantize_info,*images,(Image *) NULL);
7818                break;
7819              }
7820              case CompositeLayer:
7821              {
7822                CompositeOperator
7823                  compose;
7824
7825                Image
7826                  *source;
7827
7828                RectangleInfo
7829                  geometry;
7830
7831                /*
7832                  Split image sequence at the first 'NULL:' image.
7833                */
7834                source=(*images);
7835                while (source != (Image *) NULL)
7836                {
7837                  source=GetNextImageInList(source);
7838                  if ((source != (Image *) NULL) &&
7839                      (LocaleCompare(source->magick,"NULL") == 0))
7840                    break;
7841                }
7842                if (source != (Image *) NULL)
7843                  {
7844                    if ((GetPreviousImageInList(source) == (Image *) NULL) ||
7845                        (GetNextImageInList(source) == (Image *) NULL))
7846                      source=(Image *) NULL;
7847                    else
7848                      {
7849                        /*
7850                          Separate the two lists, junk the null: image.
7851                        */
7852                        source=SplitImageList(source->previous);
7853                        DeleteImageFromList(&source);
7854                      }
7855                  }
7856                if (source == (Image *) NULL)
7857                  {
7858                    (void) ThrowMagickException(exception,GetMagickModule(),
7859                      OptionError,"MissingNullSeparator","layers Composite");
7860                    status=MagickFalse;
7861                    break;
7862                  }
7863                /*
7864                  Adjust offset with gravity and virtual canvas.
7865                */
7866                SetGeometry(*images,&geometry);
7867                (void) ParseAbsoluteGeometry((*images)->geometry,&geometry);
7868                geometry.width=source->page.width != 0 ?
7869                  source->page.width : source->columns;
7870                geometry.height=source->page.height != 0 ?
7871                 source->page.height : source->rows;
7872                GravityAdjustGeometry((*images)->page.width != 0 ?
7873                  (*images)->page.width : (*images)->columns,
7874                  (*images)->page.height != 0 ? (*images)->page.height :
7875                  (*images)->rows,(*images)->gravity,&geometry);
7876                compose=OverCompositeOp;
7877                option=GetImageOption(mogrify_info,"compose");
7878                if (option != (const char *) NULL)
7879                  compose=(CompositeOperator) ParseCommandOption(
7880                    MagickComposeOptions,MagickFalse,option);
7881                CompositeLayers(*images,compose,source,geometry.x,geometry.y,
7882                  exception);
7883                source=DestroyImageList(source);
7884                break;
7885              }
7886            }
7887            if (layers == (Image *) NULL)
7888              break;
7889            InheritException(exception,&layers->exception);
7890            *images=DestroyImageList(*images);
7891            *images=layers;
7892            break;
7893          }
7894        break;
7895      }
7896      case 'm':
7897      {
7898        if (LocaleCompare("map",option+1) == 0)
7899          {
7900            (void) SyncImagesSettings(mogrify_info,*images);
7901            if (*option == '+')
7902              {
7903                (void) RemapImages(quantize_info,*images,(Image *) NULL);
7904                InheritException(exception,&(*images)->exception);
7905                break;
7906              }
7907            i++;
7908            break;
7909          }
7910        if (LocaleCompare("maximum",option+1) == 0)
7911          {
7912            Image
7913              *maximum_image;
7914
7915            /*
7916              Maximum image sequence (deprecated).
7917            */
7918            (void) SyncImagesSettings(mogrify_info,*images);
7919            maximum_image=EvaluateImages(*images,MaxEvaluateOperator,exception);
7920            if (maximum_image == (Image *) NULL)
7921              {
7922                status=MagickFalse;
7923                break;
7924              }
7925            *images=DestroyImageList(*images);
7926            *images=maximum_image;
7927            break;
7928          }
7929        if (LocaleCompare("minimum",option+1) == 0)
7930          {
7931            Image
7932              *minimum_image;
7933
7934            /*
7935              Minimum image sequence (deprecated).
7936            */
7937            (void) SyncImagesSettings(mogrify_info,*images);
7938            minimum_image=EvaluateImages(*images,MinEvaluateOperator,exception);
7939            if (minimum_image == (Image *) NULL)
7940              {
7941                status=MagickFalse;
7942                break;
7943              }
7944            *images=DestroyImageList(*images);
7945            *images=minimum_image;
7946            break;
7947          }
7948        if (LocaleCompare("morph",option+1) == 0)
7949          {
7950            Image
7951              *morph_image;
7952
7953            (void) SyncImagesSettings(mogrify_info,*images);
7954            morph_image=MorphImages(*images,StringToUnsignedLong(argv[i+1]),
7955              exception);
7956            if (morph_image == (Image *) NULL)
7957              {
7958                status=MagickFalse;
7959                break;
7960              }
7961            *images=DestroyImageList(*images);
7962            *images=morph_image;
7963            break;
7964          }
7965        if (LocaleCompare("mosaic",option+1) == 0)
7966          {
7967            Image
7968              *mosaic_image;
7969
7970            (void) SyncImagesSettings(mogrify_info,*images);
7971            mosaic_image=MergeImageLayers(*images,MosaicLayer,exception);
7972            if (mosaic_image == (Image *) NULL)
7973              {
7974                status=MagickFalse;
7975                break;
7976              }
7977            *images=DestroyImageList(*images);
7978            *images=mosaic_image;
7979            break;
7980          }
7981        break;
7982      }
7983      case 'p':
7984      {
7985        if (LocaleCompare("print",option+1) == 0)
7986          {
7987            char
7988              *string;
7989
7990            (void) SyncImagesSettings(mogrify_info,*images);
7991            string=InterpretImageProperties(mogrify_info,*images,argv[i+1]);
7992            if (string == (char *) NULL)
7993              break;
7994            InheritException(exception,&(*images)->exception);
7995            (void) FormatLocaleFile(stdout,"%s",string);
7996            string=DestroyString(string);
7997          }
7998        if (LocaleCompare("process",option+1) == 0)
7999          {
8000            char
8001              **arguments;
8002
8003            int
8004              j,
8005              number_arguments;
8006
8007            (void) SyncImagesSettings(mogrify_info,*images);
8008            arguments=StringToArgv(argv[i+1],&number_arguments);
8009            if (arguments == (char **) NULL)
8010              break;
8011            if ((argc > 1) && (strchr(arguments[1],'=') != (char *) NULL))
8012              {
8013                char
8014                  breaker,
8015                  quote,
8016                  *token;
8017
8018                const char
8019                  *arguments;
8020
8021                int
8022                  next,
8023                  status;
8024
8025                size_t
8026                  length;
8027
8028                TokenInfo
8029                  *token_info;
8030
8031                /*
8032                  Support old style syntax, filter="-option arg".
8033                */
8034                length=strlen(argv[i+1]);
8035                token=(char *) NULL;
8036                if (~length >= (MaxTextExtent-1))
8037                  token=(char *) AcquireQuantumMemory(length+MaxTextExtent,
8038                    sizeof(*token));
8039                if (token == (char *) NULL)
8040                  break;
8041                next=0;
8042                arguments=argv[i+1];
8043                token_info=AcquireTokenInfo();
8044                status=Tokenizer(token_info,0,token,length,arguments,"","=",
8045                  "\"",'\0',&breaker,&next,&quote);
8046                token_info=DestroyTokenInfo(token_info);
8047                if (status == 0)
8048                  {
8049                    const char
8050                      *argv;
8051
8052                    argv=(&(arguments[next]));
8053                    (void) InvokeDynamicImageFilter(token,&(*images),1,&argv,
8054                      exception);
8055                  }
8056                token=DestroyString(token);
8057                break;
8058              }
8059            (void) SubstituteString(&arguments[1],"-","");
8060            (void) InvokeDynamicImageFilter(arguments[1],&(*images),
8061              number_arguments-2,(const char **) arguments+2,exception);
8062            for (j=0; j < number_arguments; j++)
8063              arguments[j]=DestroyString(arguments[j]);
8064            arguments=(char **) RelinquishMagickMemory(arguments);
8065            break;
8066          }
8067        break;
8068      }
8069      case 'r':
8070      {
8071        if (LocaleCompare("reverse",option+1) == 0)
8072          {
8073            ReverseImageList(images);
8074            InheritException(exception,&(*images)->exception);
8075            break;
8076          }
8077        break;
8078      }
8079      case 's':
8080      {
8081        if (LocaleCompare("smush",option+1) == 0)
8082          {
8083            Image
8084              *smush_image;
8085
8086            ssize_t
8087              offset;
8088
8089            (void) SyncImagesSettings(mogrify_info,*images);
8090            offset=(ssize_t) StringToLong(argv[i+1]);
8091            smush_image=SmushImages(*images,*option == '-' ? MagickTrue :
8092              MagickFalse,offset,exception);
8093            if (smush_image == (Image *) NULL)
8094              {
8095                status=MagickFalse;
8096                break;
8097              }
8098            *images=DestroyImageList(*images);
8099            *images=smush_image;
8100            break;
8101          }
8102        if (LocaleCompare("swap",option+1) == 0)
8103          {
8104            Image
8105              *p,
8106              *q,
8107              *swap;
8108
8109            ssize_t
8110              swap_index;
8111
8112            index=(-1);
8113            swap_index=(-2);
8114            if (*option != '+')
8115              {
8116                GeometryInfo
8117                  geometry_info;
8118
8119                MagickStatusType
8120                  flags;
8121
8122                swap_index=(-1);
8123                flags=ParseGeometry(argv[i+1],&geometry_info);
8124                index=(ssize_t) geometry_info.rho;
8125                if ((flags & SigmaValue) != 0)
8126                  swap_index=(ssize_t) geometry_info.sigma;
8127              }
8128            p=GetImageFromList(*images,index);
8129            q=GetImageFromList(*images,swap_index);
8130            if ((p == (Image *) NULL) || (q == (Image *) NULL))
8131              {
8132                (void) ThrowMagickException(exception,GetMagickModule(),
8133                  OptionError,"NoSuchImage","`%s'",(*images)->filename);
8134                status=MagickFalse;
8135                break;
8136              }
8137            if (p == q)
8138              break;
8139            swap=CloneImage(p,0,0,MagickTrue,exception);
8140            ReplaceImageInList(&p,CloneImage(q,0,0,MagickTrue,exception));
8141            ReplaceImageInList(&q,swap);
8142            *images=GetFirstImageInList(q);
8143            break;
8144          }
8145        break;
8146      }
8147      case 'w':
8148      {
8149        if (LocaleCompare("write",option+1) == 0)
8150          {
8151            char
8152              key[MaxTextExtent];
8153
8154            Image
8155              *write_images;
8156
8157            ImageInfo
8158              *write_info;
8159
8160            (void) SyncImagesSettings(mogrify_info,*images);
8161            (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",argv[i+1]);
8162            (void) DeleteImageRegistry(key);
8163            write_images=(*images);
8164            if (*option == '+')
8165              write_images=CloneImageList(*images,exception);
8166            write_info=CloneImageInfo(mogrify_info);
8167            status&=WriteImages(write_info,write_images,argv[i+1],exception);
8168            write_info=DestroyImageInfo(write_info);
8169            if (*option == '+')
8170              write_images=DestroyImageList(write_images);
8171            break;
8172          }
8173        break;
8174      }
8175      default:
8176        break;
8177    }
8178    i+=count;
8179  }
8180  quantize_info=DestroyQuantizeInfo(quantize_info);
8181  mogrify_info=DestroyImageInfo(mogrify_info);
8182  status&=MogrifyImageInfo(image_info,argc,argv,exception);
8183  return(status != 0 ? MagickTrue : MagickFalse);
8184}
8185
8186/*
8187%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8188%                                                                             %
8189%                                                                             %
8190%                                                                             %
8191+     M o g r i f y I m a g e s                                               %
8192%                                                                             %
8193%                                                                             %
8194%                                                                             %
8195%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8196%
8197%  MogrifyImages() applies image processing options to a sequence of images as
8198%  prescribed by command line options.
8199%
8200%  The format of the MogrifyImage method is:
8201%
8202%      MagickBooleanType MogrifyImages(ImageInfo *image_info,
8203%        const MagickBooleanType post,const int argc,const char **argv,
8204%        Image **images,Exceptioninfo *exception)
8205%
8206%  A description of each parameter follows:
8207%
8208%    o image_info: the image info..
8209%
8210%    o post: If true, post process image list operators otherwise pre-process.
8211%
8212%    o argc: Specifies a pointer to an integer describing the number of
8213%      elements in the argument vector.
8214%
8215%    o argv: Specifies a pointer to a text array containing the command line
8216%      arguments.
8217%
8218%    o images: pointer to a pointer of the first image in image list.
8219%
8220%    o exception: return any errors or warnings in this structure.
8221%
8222*/
8223WandExport MagickBooleanType MogrifyImages(ImageInfo *image_info,
8224  const MagickBooleanType post,const int argc,const char **argv,
8225  Image **images,ExceptionInfo *exception)
8226{
8227#define MogrifyImageTag  "Mogrify/Image"
8228
8229  MagickStatusType
8230    status;
8231
8232  MagickBooleanType
8233    proceed;
8234
8235  size_t
8236    n;
8237
8238  register ssize_t
8239    i;
8240
8241  assert(image_info != (ImageInfo *) NULL);
8242  assert(image_info->signature == MagickSignature);
8243  if (images == (Image **) NULL)
8244    return(MogrifyImage(image_info,argc,argv,images,exception));
8245  assert((*images)->previous == (Image *) NULL);
8246  assert((*images)->signature == MagickSignature);
8247  if ((*images)->debug != MagickFalse)
8248    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
8249      (*images)->filename);
8250  if ((argc <= 0) || (*argv == (char *) NULL))
8251    return(MagickTrue);
8252  (void) SetImageInfoProgressMonitor(image_info,(MagickProgressMonitor) NULL,
8253    (void *) NULL);
8254  status=0;
8255
8256#if 0
8257  (void) FormatLocaleFile(stderr, "mogrify start %s %d (%s)\n",argv[0],argc,
8258    post?"post":"pre");
8259#endif
8260
8261  /*
8262    Pre-process multi-image sequence operators
8263  */
8264  if (post == MagickFalse)
8265    status&=MogrifyImageList(image_info,argc,argv,images,exception);
8266  /*
8267    For each image, process simple single image operators
8268  */
8269  i=0;
8270  n=GetImageListLength(*images);
8271  for (;;)
8272  {
8273#if 0
8274  (void) FormatLocaleFile(stderr,"mogrify %ld of %ld\n",(long)
8275    GetImageIndexInList(*images),(long)GetImageListLength(*images));
8276#endif
8277    status&=MogrifyImage(image_info,argc,argv,images,exception);
8278    proceed=SetImageProgress(*images,MogrifyImageTag,(MagickOffsetType) i, n);
8279    if (proceed == MagickFalse)
8280      break;
8281    if ( (*images)->next == (Image *) NULL )
8282      break;
8283    *images=(*images)->next;
8284    i++;
8285  }
8286  assert( *images != (Image *) NULL );
8287#if 0
8288  (void) FormatLocaleFile(stderr,"mogrify end %ld of %ld\n",(long)
8289    GetImageIndexInList(*images),(long)GetImageListLength(*images));
8290#endif
8291
8292  /*
8293    Post-process, multi-image sequence operators
8294  */
8295  *images=GetFirstImageInList(*images);
8296  if (post != MagickFalse)
8297    status&=MogrifyImageList(image_info,argc,argv,images,exception);
8298  return(status != 0 ? MagickTrue : MagickFalse);
8299}
8300