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