blob: e194c1ec6a3fb4dfbea6fb303e6ee62000ccb925 [file] [log] [blame]
cristy3ed852e2009-09-05 21:47:34 +00001/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% M M OOO GGGGG RRRR IIIII FFFFF Y Y %
7% MM MM O O G R R I F Y Y %
8% M M M O O G GGG RRRR I FFF Y %
9% M M O O G G R R I F Y %
10% M M OOO GGGG R R IIIII F Y %
11% %
12% %
13% MagickWand Module Methods %
14% %
15% Software Design %
16% John Cristy %
17% March 2000 %
18% %
19% %
cristy7e41fe82010-12-04 23:12:08 +000020% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
cristy3ed852e2009-09-05 21:47:34 +000021% 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
cristy6a917d92009-10-06 19:23:54 +000040% request.
cristy3ed852e2009-09-05 21:47:34 +000041%
42*/
43
44/*
45 Include declarations.
46*/
cristy4c08aed2011-07-01 19:47:50 +000047#include "MagickWand/studio.h"
48#include "MagickWand/MagickWand.h"
49#include "MagickWand/mogrify-private.h"
50#undef DegreesToRadians
51#undef RadiansToDegrees
52#include "MagickCore/image-private.h"
53#include "MagickCore/monitor-private.h"
cristy4c08aed2011-07-01 19:47:50 +000054#include "MagickCore/string-private.h"
cristy0740a982011-10-13 15:01:01 +000055#include "MagickCore/thread-private.h"
cristy18c6c272011-09-23 14:40:37 +000056#include "MagickCore/utility-private.h"
cristy3ed852e2009-09-05 21:47:34 +000057
58/*
cristy154fa9d2011-08-05 14:25:15 +000059 Constant declaration.
60*/
cristy3a557c02011-08-06 19:48:02 +000061static const char
cristy638895a2011-08-06 23:19:14 +000062 MogrifyBackgroundColor[] = "#ffffff", /* white */
63 MogrifyBorderColor[] = "#dfdfdf", /* gray */
64 MogrifyMatteColor[] = "#bdbdbd"; /* gray */
cristy154fa9d2011-08-05 14:25:15 +000065
66/*
cristy3ed852e2009-09-05 21:47:34 +000067 Define declarations.
68*/
69#define UndefinedCompressionQuality 0UL
70
71/*
cristy3ed852e2009-09-05 21:47:34 +000072%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73% %
74% %
75% %
cristy5063d812010-10-19 16:28:10 +000076% M a g i c k C o m m a n d G e n e s i s %
cristy3980b0d2009-10-25 14:37:13 +000077% %
78% %
79% %
80%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
81%
82% MagickCommandGenesis() applies image processing options to an image as
83% prescribed by command line options.
84%
85% The format of the MagickCommandGenesis method is:
86%
87% MagickBooleanType MagickCommandGenesis(ImageInfo *image_info,
cristy5063d812010-10-19 16:28:10 +000088% MagickCommand command,int argc,char **argv,char **metadata,
89% ExceptionInfo *exception)
cristy3980b0d2009-10-25 14:37:13 +000090%
91% A description of each parameter follows:
92%
93% o image_info: the image info.
94%
cristy5063d812010-10-19 16:28:10 +000095% o command: Choose from ConvertImageCommand, IdentifyImageCommand,
cristy8a9106f2011-07-05 14:39:26 +000096% MogrifyImageCommand, CompositeImageCommand, CompareImagesCommand,
cristy5063d812010-10-19 16:28:10 +000097% ConjureImageCommand, StreamImageCommand, ImportImageCommand,
98% DisplayImageCommand, or AnimateImageCommand.
cristy3980b0d2009-10-25 14:37:13 +000099%
100% o argc: Specifies a pointer to an integer describing the number of
101% elements in the argument vector.
102%
103% o argv: Specifies a pointer to a text array containing the command line
104% arguments.
105%
cristy5063d812010-10-19 16:28:10 +0000106% o metadata: any metadata is returned here.
cristy3980b0d2009-10-25 14:37:13 +0000107%
108% o exception: return any errors or warnings in this structure.
109%
110*/
111WandExport MagickBooleanType MagickCommandGenesis(ImageInfo *image_info,
112 MagickCommand command,int argc,char **argv,char **metadata,
113 ExceptionInfo *exception)
114{
115 char
116 *option;
117
118 double
119 duration,
120 elapsed_time,
121 user_time;
122
cristy3980b0d2009-10-25 14:37:13 +0000123 MagickBooleanType
124 concurrent,
125 regard_warnings,
126 status;
127
cristybb503372010-05-27 20:51:26 +0000128 register ssize_t
cristy3980b0d2009-10-25 14:37:13 +0000129 i;
130
131 TimerInfo
132 *timer;
133
cristybb503372010-05-27 20:51:26 +0000134 size_t
cristy3980b0d2009-10-25 14:37:13 +0000135 iterations;
136
cristyd0a94fa2010-03-12 14:18:11 +0000137 (void) setlocale(LC_ALL,"");
138 (void) setlocale(LC_NUMERIC,"C");
cristy3980b0d2009-10-25 14:37:13 +0000139 concurrent=MagickFalse;
140 duration=(-1.0);
141 iterations=1;
cristy33557d72009-11-06 00:54:33 +0000142 status=MagickFalse;
cristy3980b0d2009-10-25 14:37:13 +0000143 regard_warnings=MagickFalse;
cristybb503372010-05-27 20:51:26 +0000144 for (i=1; i < (ssize_t) (argc-1); i++)
cristy3980b0d2009-10-25 14:37:13 +0000145 {
146 option=argv[i];
147 if ((strlen(option) == 1) || ((*option != '-') && (*option != '+')))
148 continue;
149 if (LocaleCompare("bench",option+1) == 0)
cristye27293e2009-12-18 02:53:20 +0000150 iterations=StringToUnsignedLong(argv[++i]);
cristy3980b0d2009-10-25 14:37:13 +0000151 if (LocaleCompare("concurrent",option+1) == 0)
152 concurrent=MagickTrue;
153 if (LocaleCompare("debug",option+1) == 0)
154 (void) SetLogEventMask(argv[++i]);
155 if (LocaleCompare("duration",option+1) == 0)
cristydbdd0e32011-11-04 23:29:40 +0000156 duration=StringToDouble(argv[++i],(char **) NULL);
cristy3980b0d2009-10-25 14:37:13 +0000157 if (LocaleCompare("regard-warnings",option+1) == 0)
158 regard_warnings=MagickTrue;
159 }
160 timer=AcquireTimerInfo();
cristyceae09d2009-10-28 17:18:47 +0000161 if (concurrent == MagickFalse)
cristy3980b0d2009-10-25 14:37:13 +0000162 {
cristybb503372010-05-27 20:51:26 +0000163 for (i=0; i < (ssize_t) iterations; i++)
cristy3980b0d2009-10-25 14:37:13 +0000164 {
cristy33557d72009-11-06 00:54:33 +0000165 if (status != MagickFalse)
cristyceae09d2009-10-28 17:18:47 +0000166 continue;
167 if (duration > 0)
168 {
169 if (GetElapsedTime(timer) > duration)
170 continue;
171 (void) ContinueTimer(timer);
172 }
173 status=command(image_info,argc,argv,metadata,exception);
cristy3980b0d2009-10-25 14:37:13 +0000174 if (exception->severity != UndefinedException)
175 {
176 if ((exception->severity > ErrorException) ||
177 (regard_warnings != MagickFalse))
178 status=MagickTrue;
179 CatchException(exception);
180 }
cristy3d1a5512009-10-25 21:23:27 +0000181 if ((metadata != (char **) NULL) && (*metadata != (char *) NULL))
cristy3980b0d2009-10-25 14:37:13 +0000182 {
183 (void) fputs(*metadata,stdout);
184 (void) fputc('\n',stdout);
185 *metadata=DestroyString(*metadata);
186 }
187 }
188 }
cristyceae09d2009-10-28 17:18:47 +0000189 else
190 {
191 SetOpenMPNested(1);
cristyb5d5f722009-11-04 03:03:49 +0000192#if defined(MAGICKCORE_OPENMP_SUPPORT)
cristyceae09d2009-10-28 17:18:47 +0000193 # pragma omp parallel for shared(status)
194#endif
cristybb503372010-05-27 20:51:26 +0000195 for (i=0; i < (ssize_t) iterations; i++)
cristyceae09d2009-10-28 17:18:47 +0000196 {
cristy33557d72009-11-06 00:54:33 +0000197 if (status != MagickFalse)
cristyceae09d2009-10-28 17:18:47 +0000198 continue;
199 if (duration > 0)
200 {
201 if (GetElapsedTime(timer) > duration)
202 continue;
203 (void) ContinueTimer(timer);
204 }
205 status=command(image_info,argc,argv,metadata,exception);
cristyb5d5f722009-11-04 03:03:49 +0000206#if defined(MAGICKCORE_OPENMP_SUPPORT)
cristy524549f2010-06-20 21:10:20 +0000207 # pragma omp critical (MagickCore_CommandGenesis)
cristyceae09d2009-10-28 17:18:47 +0000208#endif
209 {
210 if (exception->severity != UndefinedException)
211 {
212 if ((exception->severity > ErrorException) ||
213 (regard_warnings != MagickFalse))
214 status=MagickTrue;
215 CatchException(exception);
216 }
217 if ((metadata != (char **) NULL) && (*metadata != (char *) NULL))
218 {
219 (void) fputs(*metadata,stdout);
220 (void) fputc('\n',stdout);
221 *metadata=DestroyString(*metadata);
222 }
223 }
224 }
225 }
cristy3980b0d2009-10-25 14:37:13 +0000226 if (iterations > 1)
227 {
228 elapsed_time=GetElapsedTime(timer);
229 user_time=GetUserTime(timer);
cristyb51dff52011-05-19 16:55:47 +0000230 (void) FormatLocaleFile(stderr,
cristye8c25f92010-06-03 00:53:06 +0000231 "Performance: %.20gi %gips %0.3fu %.20g:%02g.%03g\n",(double)
232 iterations,1.0*iterations/elapsed_time,user_time,(double)
233 (elapsed_time/60.0),floor(fmod(elapsed_time,60.0)),(double)
234 (1000.0*(elapsed_time-floor(elapsed_time))));
cristy524549f2010-06-20 21:10:20 +0000235 (void) fflush(stderr);
cristy3980b0d2009-10-25 14:37:13 +0000236 }
237 timer=DestroyTimerInfo(timer);
cristy1f9e1ed2009-11-18 04:09:38 +0000238 return(status);
cristy3980b0d2009-10-25 14:37:13 +0000239}
240
241/*
242%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
243% %
244% %
245% %
cristy3ed852e2009-09-05 21:47:34 +0000246+ M o g r i f y I m a g e %
247% %
248% %
249% %
250%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
251%
anthonye9c27192011-03-27 08:07:06 +0000252% MogrifyImage() applies simple single image processing options to a single
anthonydf8ebac2011-04-27 09:03:19 +0000253% image that may be part of a large list, but also handles any 'region'
254% image handling.
anthonye9c27192011-03-27 08:07:06 +0000255%
256% The image in the list may be modified in three different ways...
257%
258% * directly modified (EG: -negate, -gamma, -level, -annotate, -draw),
259% * replaced by a new image (EG: -spread, -resize, -rotate, -morphology)
260% * replace by a list of images (only the -separate option!)
261%
262% In each case the result is returned into the list, and a pointer to the
263% modified image (last image added if replaced by a list of images) is
264% returned.
265%
266% ASIDE: The -crop is present but restricted to non-tile single image crops
267%
268% This means if all the images are being processed (such as by
269% MogrifyImages(), next image to be processed will be as per the pointer
270% (*image)->next. Also the image list may grow as a result of some specific
271% operations but as images are never merged or deleted, it will never shrink
272% in length. Typically the list will remain the same length.
273%
274% WARNING: As the image pointed to may be replaced, the first image in the
275% list may also change. GetFirstImageInList() should be used by caller if
276% they wish return the Image pointer to the first image in list.
277%
cristy3ed852e2009-09-05 21:47:34 +0000278%
279% The format of the MogrifyImage method is:
280%
281% MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
282% const char **argv,Image **image)
283%
284% A description of each parameter follows:
285%
286% o image_info: the image info..
287%
288% o argc: Specifies a pointer to an integer describing the number of
289% elements in the argument vector.
290%
291% o argv: Specifies a pointer to a text array containing the command line
292% arguments.
293%
294% o image: the image.
295%
296% o exception: return any errors or warnings in this structure.
297%
298*/
299
cristy4c08aed2011-07-01 19:47:50 +0000300/*
anthony0d0fd352011-10-04 11:09:07 +0000301 GetImageCache() will read an image into a image cache if not already
302 present then return the image that is in the cache under that filename.
cristy4c08aed2011-07-01 19:47:50 +0000303*/
anthonydf8ebac2011-04-27 09:03:19 +0000304static inline Image *GetImageCache(const ImageInfo *image_info,const char *path,
305 ExceptionInfo *exception)
306{
307 char
308 key[MaxTextExtent];
309
310 ExceptionInfo
311 *sans_exception;
312
313 Image
314 *image;
315
316 ImageInfo
317 *read_info;
318
cristyb51dff52011-05-19 16:55:47 +0000319 (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",path);
anthonydf8ebac2011-04-27 09:03:19 +0000320 sans_exception=AcquireExceptionInfo();
321 image=(Image *) GetImageRegistry(ImageRegistryType,key,sans_exception);
322 sans_exception=DestroyExceptionInfo(sans_exception);
323 if (image != (Image *) NULL)
324 return(image);
325 read_info=CloneImageInfo(image_info);
326 (void) CopyMagickString(read_info->filename,path,MaxTextExtent);
327 image=ReadImage(read_info,exception);
328 read_info=DestroyImageInfo(read_info);
329 if (image != (Image *) NULL)
330 (void) SetImageRegistry(ImageRegistryType,key,image,exception);
331 return(image);
332}
333
cristy3ed852e2009-09-05 21:47:34 +0000334static MagickBooleanType IsPathWritable(const char *path)
335{
336 if (IsPathAccessible(path) == MagickFalse)
337 return(MagickFalse);
cristy18c6c272011-09-23 14:40:37 +0000338 if (access_utf8(path,W_OK) != 0)
cristy3ed852e2009-09-05 21:47:34 +0000339 return(MagickFalse);
340 return(MagickTrue);
341}
342
cristybb503372010-05-27 20:51:26 +0000343static inline ssize_t MagickMax(const ssize_t x,const ssize_t y)
cristy3ed852e2009-09-05 21:47:34 +0000344{
345 if (x > y)
346 return(x);
347 return(y);
348}
349
anthonydf8ebac2011-04-27 09:03:19 +0000350static MagickBooleanType MonitorProgress(const char *text,
351 const MagickOffsetType offset,const MagickSizeType extent,
352 void *wand_unused(client_data))
353{
354 char
355 message[MaxTextExtent],
356 tag[MaxTextExtent];
357
358 const char
359 *locale_message;
360
361 register char
362 *p;
363
364 if (extent < 2)
365 return(MagickTrue);
366 (void) CopyMagickMemory(tag,text,MaxTextExtent);
367 p=strrchr(tag,'/');
368 if (p != (char *) NULL)
369 *p='\0';
cristyb51dff52011-05-19 16:55:47 +0000370 (void) FormatLocaleString(message,MaxTextExtent,"Monitor/%s",tag);
anthonydf8ebac2011-04-27 09:03:19 +0000371 locale_message=GetLocaleMessage(message);
372 if (locale_message == message)
373 locale_message=tag;
374 if (p == (char *) NULL)
cristy1e604812011-05-19 18:07:50 +0000375 (void) FormatLocaleFile(stderr,"%s: %ld of %lu, %02ld%% complete\r",
376 locale_message,(long) offset,(unsigned long) extent,(long)
377 (100L*offset/(extent-1)));
anthonydf8ebac2011-04-27 09:03:19 +0000378 else
cristyb51dff52011-05-19 16:55:47 +0000379 (void) FormatLocaleFile(stderr,"%s[%s]: %ld of %lu, %02ld%% complete\r",
anthonydf8ebac2011-04-27 09:03:19 +0000380 locale_message,p+1,(long) offset,(unsigned long) extent,(long)
381 (100L*offset/(extent-1)));
382 if (offset == (MagickOffsetType) (extent-1))
cristyb51dff52011-05-19 16:55:47 +0000383 (void) FormatLocaleFile(stderr,"\n");
anthonydf8ebac2011-04-27 09:03:19 +0000384 (void) fflush(stderr);
385 return(MagickTrue);
386}
387
anthony0d0fd352011-10-04 11:09:07 +0000388 /*
389 SparseColorOption() parses the complex -sparse-color argument into an
390 an array of floating point values then calls SparseColorImage().
391 Argument is a complex mix of floating-point pixel coodinates, and color
392 specifications (or direct floating point numbers). The number of floats
393 needed to represent a color varies depending on the current channel
394 setting.
395 */
cristy3884f692011-07-08 18:00:18 +0000396static Image *SparseColorOption(const Image *image,
anthonydf8ebac2011-04-27 09:03:19 +0000397 const SparseColorMethod method,const char *arguments,
398 const MagickBooleanType color_from_image,ExceptionInfo *exception)
399{
anthonydf8ebac2011-04-27 09:03:19 +0000400 char
401 token[MaxTextExtent];
402
403 const char
404 *p;
405
406 double
407 *sparse_arguments;
408
anthonydf8ebac2011-04-27 09:03:19 +0000409 Image
410 *sparse_image;
411
cristy4c08aed2011-07-01 19:47:50 +0000412 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +0000413 color;
414
415 MagickBooleanType
416 error;
417
cristy5f09d852011-05-29 01:39:29 +0000418 register size_t
419 x;
420
421 size_t
422 number_arguments,
423 number_colors;
424
anthonydf8ebac2011-04-27 09:03:19 +0000425 assert(image != (Image *) NULL);
426 assert(image->signature == MagickSignature);
427 if (image->debug != MagickFalse)
428 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
429 assert(exception != (ExceptionInfo *) NULL);
430 assert(exception->signature == MagickSignature);
431 /*
432 Limit channels according to image - and add up number of color channel.
433 */
anthonydf8ebac2011-04-27 09:03:19 +0000434 number_colors=0;
cristyed231572011-07-14 02:18:59 +0000435 if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000436 number_colors++;
cristyed231572011-07-14 02:18:59 +0000437 if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000438 number_colors++;
cristyed231572011-07-14 02:18:59 +0000439 if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000440 number_colors++;
cristyed231572011-07-14 02:18:59 +0000441 if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000442 (image->colorspace == CMYKColorspace))
anthonydf8ebac2011-04-27 09:03:19 +0000443 number_colors++;
cristyed231572011-07-14 02:18:59 +0000444 if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000445 (image->matte != MagickFalse))
anthonydf8ebac2011-04-27 09:03:19 +0000446 number_colors++;
447
448 /*
449 Read string, to determine number of arguments needed,
450 */
451 p=arguments;
452 x=0;
453 while( *p != '\0' )
454 {
455 GetMagickToken(p,&p,token);
456 if ( token[0] == ',' ) continue;
457 if ( isalpha((int) token[0]) || token[0] == '#' ) {
458 if ( color_from_image ) {
459 (void) ThrowMagickException(exception,GetMagickModule(),
460 OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
461 "Color arg given, when colors are coming from image");
462 return( (Image *)NULL);
463 }
464 x += number_colors; /* color argument */
465 }
466 else {
467 x++; /* floating point argument */
468 }
469 }
470 error=MagickTrue;
471 if ( color_from_image ) {
472 /* just the control points are being given */
473 error = ( x % 2 != 0 ) ? MagickTrue : MagickFalse;
474 number_arguments=(x/2)*(2+number_colors);
475 }
476 else {
477 /* control points and color values */
478 error = ( x % (2+number_colors) != 0 ) ? MagickTrue : MagickFalse;
479 number_arguments=x;
480 }
481 if ( error ) {
482 (void) ThrowMagickException(exception,GetMagickModule(),
483 OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
484 "Invalid number of Arguments");
485 return( (Image *)NULL);
486 }
487
488 /* Allocate and fill in the floating point arguments */
489 sparse_arguments=(double *) AcquireQuantumMemory(number_arguments,
490 sizeof(*sparse_arguments));
491 if (sparse_arguments == (double *) NULL) {
492 (void) ThrowMagickException(exception,GetMagickModule(),ResourceLimitError,
493 "MemoryAllocationFailed","%s","SparseColorOption");
494 return( (Image *)NULL);
495 }
496 (void) ResetMagickMemory(sparse_arguments,0,number_arguments*
497 sizeof(*sparse_arguments));
498 p=arguments;
499 x=0;
500 while( *p != '\0' && x < number_arguments ) {
501 /* X coordinate */
502 token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
503 if ( token[0] == '\0' ) break;
504 if ( isalpha((int) token[0]) || token[0] == '#' ) {
505 (void) ThrowMagickException(exception,GetMagickModule(),
506 OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
507 "Color found, instead of X-coord");
508 error = MagickTrue;
509 break;
510 }
cristydbdd0e32011-11-04 23:29:40 +0000511 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000512 /* Y coordinate */
513 token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
514 if ( token[0] == '\0' ) break;
515 if ( isalpha((int) token[0]) || token[0] == '#' ) {
516 (void) ThrowMagickException(exception,GetMagickModule(),
517 OptionError, "InvalidArgument", "`%s': %s", "sparse-color",
518 "Color found, instead of Y-coord");
519 error = MagickTrue;
520 break;
521 }
cristydbdd0e32011-11-04 23:29:40 +0000522 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000523 /* color values for this control point */
524#if 0
525 if ( (color_from_image ) {
526 /* get color from image */
527 /* HOW??? */
528 }
529 else
530#endif
531 {
532 /* color name or function given in string argument */
533 token[0]=','; while ( token[0] == ',' ) GetMagickToken(p,&p,token);
534 if ( token[0] == '\0' ) break;
535 if ( isalpha((int) token[0]) || token[0] == '#' ) {
536 /* Color string given */
cristy269c9412011-10-13 23:41:15 +0000537 (void) QueryColorCompliance(token,AllCompliance,&color,exception);
cristyed231572011-07-14 02:18:59 +0000538 if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000539 sparse_arguments[x++] = QuantumScale*color.red;
cristyed231572011-07-14 02:18:59 +0000540 if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000541 sparse_arguments[x++] = QuantumScale*color.green;
cristyed231572011-07-14 02:18:59 +0000542 if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
anthonydf8ebac2011-04-27 09:03:19 +0000543 sparse_arguments[x++] = QuantumScale*color.blue;
cristyed231572011-07-14 02:18:59 +0000544 if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000545 (image->colorspace == CMYKColorspace))
cristy4c08aed2011-07-01 19:47:50 +0000546 sparse_arguments[x++] = QuantumScale*color.black;
cristyed231572011-07-14 02:18:59 +0000547 if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000548 (image->matte != MagickFalse))
cristy4c08aed2011-07-01 19:47:50 +0000549 sparse_arguments[x++] = QuantumScale*color.alpha;
anthonydf8ebac2011-04-27 09:03:19 +0000550 }
551 else {
552 /* Colors given as a set of floating point values - experimental */
553 /* NB: token contains the first floating point value to use! */
cristyed231572011-07-14 02:18:59 +0000554 if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
cristy3884f692011-07-08 18:00:18 +0000555 {
anthonydf8ebac2011-04-27 09:03:19 +0000556 while ( token[0] == ',' ) GetMagickToken(p,&p,token);
557 if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
558 break;
cristydbdd0e32011-11-04 23:29:40 +0000559 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000560 token[0] = ','; /* used this token - get another */
561 }
cristyed231572011-07-14 02:18:59 +0000562 if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
cristy3884f692011-07-08 18:00:18 +0000563 {
anthonydf8ebac2011-04-27 09:03:19 +0000564 while ( token[0] == ',' ) GetMagickToken(p,&p,token);
565 if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
566 break;
cristydbdd0e32011-11-04 23:29:40 +0000567 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000568 token[0] = ','; /* used this token - get another */
569 }
cristyed231572011-07-14 02:18:59 +0000570 if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
cristy3884f692011-07-08 18:00:18 +0000571 {
anthonydf8ebac2011-04-27 09:03:19 +0000572 while ( token[0] == ',' ) GetMagickToken(p,&p,token);
573 if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
574 break;
cristydbdd0e32011-11-04 23:29:40 +0000575 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000576 token[0] = ','; /* used this token - get another */
577 }
cristyed231572011-07-14 02:18:59 +0000578 if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000579 (image->colorspace == CMYKColorspace))
580 {
anthonydf8ebac2011-04-27 09:03:19 +0000581 while ( token[0] == ',' ) GetMagickToken(p,&p,token);
582 if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
583 break;
cristydbdd0e32011-11-04 23:29:40 +0000584 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000585 token[0] = ','; /* used this token - get another */
586 }
cristyed231572011-07-14 02:18:59 +0000587 if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0) &&
cristy3884f692011-07-08 18:00:18 +0000588 (image->matte != MagickFalse))
589 {
anthonydf8ebac2011-04-27 09:03:19 +0000590 while ( token[0] == ',' ) GetMagickToken(p,&p,token);
591 if ( token[0] == '\0' || isalpha((int)token[0]) || token[0] == '#' )
592 break;
cristydbdd0e32011-11-04 23:29:40 +0000593 sparse_arguments[x++]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +0000594 token[0] = ','; /* used this token - get another */
595 }
596 }
597 }
598 }
599 if ( number_arguments != x && !error ) {
600 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
601 "InvalidArgument","`%s': %s","sparse-color","Argument Parsing Error");
602 sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments);
603 return( (Image *)NULL);
604 }
605 if ( error )
606 return( (Image *)NULL);
607
608 /* Call the Interpolation function with the parsed arguments */
cristy3884f692011-07-08 18:00:18 +0000609 sparse_image=SparseColorImage(image,method,number_arguments,sparse_arguments,
610 exception);
anthonydf8ebac2011-04-27 09:03:19 +0000611 sparse_arguments=(double *) RelinquishMagickMemory(sparse_arguments);
612 return( sparse_image );
613}
614
cristy3ed852e2009-09-05 21:47:34 +0000615WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc,
616 const char **argv,Image **image,ExceptionInfo *exception)
617{
anthonydf8ebac2011-04-27 09:03:19 +0000618 ChannelType
619 channel;
620
cristy633f0c62011-09-15 13:27:36 +0000621 CompositeOperator
622 compose;
623
anthonydf8ebac2011-04-27 09:03:19 +0000624 const char
625 *format,
626 *option;
627
cristy9ed1f812011-10-08 02:00:08 +0000628 double
629 attenuate;
630
anthonydf8ebac2011-04-27 09:03:19 +0000631 DrawInfo
632 *draw_info;
633
634 GeometryInfo
635 geometry_info;
636
cristy3ed852e2009-09-05 21:47:34 +0000637 Image
638 *region_image;
639
anthonydf8ebac2011-04-27 09:03:19 +0000640 ImageInfo
641 *mogrify_info;
642
cristyebbcfea2011-02-25 02:43:54 +0000643 MagickStatusType
cristy3ed852e2009-09-05 21:47:34 +0000644 status;
645
cristy4c08aed2011-07-01 19:47:50 +0000646 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +0000647 fill;
cristy3ed852e2009-09-05 21:47:34 +0000648
anthonydf8ebac2011-04-27 09:03:19 +0000649 MagickStatusType
650 flags;
651
cristy28474bf2011-09-11 23:32:52 +0000652 PixelInterpolateMethod
653 interpolate_method;
654
anthonydf8ebac2011-04-27 09:03:19 +0000655 QuantizeInfo
656 *quantize_info;
657
658 RectangleInfo
659 geometry,
660 region_geometry;
anthony56ad4222011-04-25 11:04:27 +0000661
cristybb503372010-05-27 20:51:26 +0000662 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +0000663 i;
664
665 /*
666 Initialize method variables.
667 */
668 assert(image_info != (const ImageInfo *) NULL);
669 assert(image_info->signature == MagickSignature);
670 assert(image != (Image **) NULL);
671 assert((*image)->signature == MagickSignature);
672 if ((*image)->debug != MagickFalse)
673 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",(*image)->filename);
674 if (argc < 0)
675 return(MagickTrue);
cristy6b3da3a2010-06-20 02:21:46 +0000676 mogrify_info=CloneImageInfo(image_info);
anthonydf8ebac2011-04-27 09:03:19 +0000677 draw_info=CloneDrawInfo(mogrify_info,(DrawInfo *) NULL);
678 quantize_info=AcquireQuantizeInfo(mogrify_info);
679 SetGeometryInfo(&geometry_info);
cristy4c08aed2011-07-01 19:47:50 +0000680 GetPixelInfo(*image,&fill);
cristy9d8c8ce2011-10-25 16:13:52 +0000681 fill=(*image)->background_color;
cristy9ed1f812011-10-08 02:00:08 +0000682 attenuate=1.0;
cristy633f0c62011-09-15 13:27:36 +0000683 compose=(*image)->compose;
cristy28474bf2011-09-11 23:32:52 +0000684 interpolate_method=UndefinedInterpolatePixel;
anthonydf8ebac2011-04-27 09:03:19 +0000685 channel=mogrify_info->channel;
686 format=GetImageOption(mogrify_info,"format");
cristy3ed852e2009-09-05 21:47:34 +0000687 SetGeometry(*image,&region_geometry);
688 region_image=NewImageList();
689 /*
690 Transmogrify the image.
691 */
cristybb503372010-05-27 20:51:26 +0000692 for (i=0; i < (ssize_t) argc; i++)
cristy3ed852e2009-09-05 21:47:34 +0000693 {
anthonydf8ebac2011-04-27 09:03:19 +0000694 Image
695 *mogrify_image;
696
anthonye9c27192011-03-27 08:07:06 +0000697 ssize_t
698 count;
699
anthonydf8ebac2011-04-27 09:03:19 +0000700 option=argv[i];
701 if (IsCommandOption(option) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +0000702 continue;
anthonydf8ebac2011-04-27 09:03:19 +0000703 count=MagickMax(ParseCommandOption(MagickCommandOptions,MagickFalse,option),
704 0L);
cristycee97112010-05-28 00:44:52 +0000705 if ((i+count) >= (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +0000706 break;
cristy6b3da3a2010-06-20 02:21:46 +0000707 status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000708 mogrify_image=(Image *)NULL;
709 switch (*(option+1))
710 {
711 case 'a':
cristy3ed852e2009-09-05 21:47:34 +0000712 {
anthonydf8ebac2011-04-27 09:03:19 +0000713 if (LocaleCompare("adaptive-blur",option+1) == 0)
cristy3ed852e2009-09-05 21:47:34 +0000714 {
anthonydf8ebac2011-04-27 09:03:19 +0000715 /*
716 Adaptive blur image.
717 */
cristy6fccee12011-10-20 18:43:18 +0000718 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000719 flags=ParseGeometry(argv[i+1],&geometry_info);
720 if ((flags & SigmaValue) == 0)
721 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +0000722 if ((flags & XiValue) == 0)
723 geometry_info.xi=0.0;
cristyf4ad9df2011-07-08 16:49:03 +0000724 mogrify_image=AdaptiveBlurImage(*image,geometry_info.rho,
cristy4c11c2b2011-09-05 20:17:07 +0000725 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000726 break;
cristy3ed852e2009-09-05 21:47:34 +0000727 }
anthonydf8ebac2011-04-27 09:03:19 +0000728 if (LocaleCompare("adaptive-resize",option+1) == 0)
729 {
730 /*
731 Adaptive resize image.
732 */
cristy6fccee12011-10-20 18:43:18 +0000733 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000734 (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
735 mogrify_image=AdaptiveResizeImage(*image,geometry.width,
cristy28474bf2011-09-11 23:32:52 +0000736 geometry.height,interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000737 break;
738 }
739 if (LocaleCompare("adaptive-sharpen",option+1) == 0)
740 {
741 /*
742 Adaptive sharpen image.
743 */
cristy6fccee12011-10-20 18:43:18 +0000744 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000745 flags=ParseGeometry(argv[i+1],&geometry_info);
746 if ((flags & SigmaValue) == 0)
747 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +0000748 if ((flags & XiValue) == 0)
749 geometry_info.xi=0.0;
cristyf4ad9df2011-07-08 16:49:03 +0000750 mogrify_image=AdaptiveSharpenImage(*image,geometry_info.rho,
cristy4c11c2b2011-09-05 20:17:07 +0000751 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000752 break;
753 }
754 if (LocaleCompare("affine",option+1) == 0)
755 {
756 /*
757 Affine matrix.
758 */
759 if (*option == '+')
760 {
761 GetAffineMatrix(&draw_info->affine);
762 break;
763 }
764 (void) ParseAffineGeometry(argv[i+1],&draw_info->affine,exception);
765 break;
766 }
767 if (LocaleCompare("alpha",option+1) == 0)
768 {
769 AlphaChannelType
770 alpha_type;
cristy3ed852e2009-09-05 21:47:34 +0000771
cristy6fccee12011-10-20 18:43:18 +0000772 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000773 alpha_type=(AlphaChannelType) ParseCommandOption(MagickAlphaOptions,
774 MagickFalse,argv[i+1]);
cristy63240882011-08-05 19:05:27 +0000775 (void) SetImageAlphaChannel(*image,alpha_type,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000776 break;
777 }
778 if (LocaleCompare("annotate",option+1) == 0)
779 {
780 char
781 *text,
782 geometry[MaxTextExtent];
783
784 /*
785 Annotate image.
786 */
cristy6fccee12011-10-20 18:43:18 +0000787 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000788 SetGeometryInfo(&geometry_info);
789 flags=ParseGeometry(argv[i+1],&geometry_info);
790 if ((flags & SigmaValue) == 0)
791 geometry_info.sigma=geometry_info.rho;
cristy018f07f2011-09-04 21:15:19 +0000792 text=InterpretImageProperties(mogrify_info,*image,argv[i+2],
793 exception);
anthonydf8ebac2011-04-27 09:03:19 +0000794 if (text == (char *) NULL)
795 break;
796 (void) CloneString(&draw_info->text,text);
797 text=DestroyString(text);
cristyb51dff52011-05-19 16:55:47 +0000798 (void) FormatLocaleString(geometry,MaxTextExtent,"%+f%+f",
anthonydf8ebac2011-04-27 09:03:19 +0000799 geometry_info.xi,geometry_info.psi);
800 (void) CloneString(&draw_info->geometry,geometry);
801 draw_info->affine.sx=cos(DegreesToRadians(
802 fmod(geometry_info.rho,360.0)));
803 draw_info->affine.rx=sin(DegreesToRadians(
804 fmod(geometry_info.rho,360.0)));
805 draw_info->affine.ry=(-sin(DegreesToRadians(
806 fmod(geometry_info.sigma,360.0))));
807 draw_info->affine.sy=cos(DegreesToRadians(
808 fmod(geometry_info.sigma,360.0)));
cristy5cbc0162011-08-29 00:36:28 +0000809 (void) AnnotateImage(*image,draw_info,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000810 break;
811 }
812 if (LocaleCompare("antialias",option+1) == 0)
813 {
814 draw_info->stroke_antialias=(*option == '-') ? MagickTrue :
815 MagickFalse;
816 draw_info->text_antialias=(*option == '-') ? MagickTrue :
817 MagickFalse;
818 break;
819 }
cristy9ed1f812011-10-08 02:00:08 +0000820 if (LocaleCompare("attenuate",option+1) == 0)
821 {
822 if (*option == '+')
823 {
824 attenuate=1.0;
825 break;
826 }
cristydbdd0e32011-11-04 23:29:40 +0000827 attenuate=StringToDouble(argv[i+1],(char **) NULL);
cristy9ed1f812011-10-08 02:00:08 +0000828 break;
829 }
anthonydf8ebac2011-04-27 09:03:19 +0000830 if (LocaleCompare("auto-gamma",option+1) == 0)
831 {
832 /*
833 Auto Adjust Gamma of image based on its mean
834 */
cristy6fccee12011-10-20 18:43:18 +0000835 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy95111202011-08-09 19:41:42 +0000836 (void) AutoGammaImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000837 break;
838 }
839 if (LocaleCompare("auto-level",option+1) == 0)
840 {
841 /*
842 Perfectly Normalize (max/min stretch) the image
843 */
cristy6fccee12011-10-20 18:43:18 +0000844 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy95111202011-08-09 19:41:42 +0000845 (void) AutoLevelImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000846 break;
847 }
848 if (LocaleCompare("auto-orient",option+1) == 0)
849 {
cristy6fccee12011-10-20 18:43:18 +0000850 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000851 switch ((*image)->orientation)
852 {
853 case TopRightOrientation:
854 {
855 mogrify_image=FlopImage(*image,exception);
856 break;
857 }
858 case BottomRightOrientation:
859 {
860 mogrify_image=RotateImage(*image,180.0,exception);
861 break;
862 }
863 case BottomLeftOrientation:
864 {
865 mogrify_image=FlipImage(*image,exception);
866 break;
867 }
868 case LeftTopOrientation:
869 {
870 mogrify_image=TransposeImage(*image,exception);
871 break;
872 }
873 case RightTopOrientation:
874 {
875 mogrify_image=RotateImage(*image,90.0,exception);
876 break;
877 }
878 case RightBottomOrientation:
879 {
880 mogrify_image=TransverseImage(*image,exception);
881 break;
882 }
883 case LeftBottomOrientation:
884 {
885 mogrify_image=RotateImage(*image,270.0,exception);
886 break;
887 }
888 default:
889 break;
890 }
891 if (mogrify_image != (Image *) NULL)
892 mogrify_image->orientation=TopLeftOrientation;
893 break;
894 }
895 break;
896 }
897 case 'b':
898 {
899 if (LocaleCompare("black-threshold",option+1) == 0)
900 {
901 /*
902 Black threshold image.
903 */
cristy6fccee12011-10-20 18:43:18 +0000904 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyf4ad9df2011-07-08 16:49:03 +0000905 (void) BlackThresholdImage(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +0000906 break;
907 }
908 if (LocaleCompare("blue-shift",option+1) == 0)
909 {
910 /*
911 Blue shift image.
912 */
cristy6fccee12011-10-20 18:43:18 +0000913 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000914 geometry_info.rho=1.5;
915 if (*option == '-')
916 flags=ParseGeometry(argv[i+1],&geometry_info);
917 mogrify_image=BlueShiftImage(*image,geometry_info.rho,exception);
918 break;
919 }
920 if (LocaleCompare("blur",option+1) == 0)
921 {
922 /*
923 Gaussian blur image.
924 */
cristy6fccee12011-10-20 18:43:18 +0000925 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000926 flags=ParseGeometry(argv[i+1],&geometry_info);
927 if ((flags & SigmaValue) == 0)
928 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +0000929 if ((flags & XiValue) == 0)
930 geometry_info.xi=0.0;
cristyf4ad9df2011-07-08 16:49:03 +0000931 mogrify_image=BlurImage(*image,geometry_info.rho,
cristy05c0c9a2011-09-05 23:16:13 +0000932 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000933 break;
934 }
935 if (LocaleCompare("border",option+1) == 0)
936 {
937 /*
938 Surround image with a border of solid color.
939 */
cristy6fccee12011-10-20 18:43:18 +0000940 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000941 flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
942 if ((flags & SigmaValue) == 0)
943 geometry.height=geometry.width;
cristy633f0c62011-09-15 13:27:36 +0000944 mogrify_image=BorderImage(*image,&geometry,compose,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000945 break;
946 }
947 if (LocaleCompare("bordercolor",option+1) == 0)
948 {
949 if (*option == '+')
950 {
cristy9950d572011-10-01 18:22:35 +0000951 (void) QueryColorCompliance(MogrifyBorderColor,AllCompliance,
cristy05c0c9a2011-09-05 23:16:13 +0000952 &draw_info->border_color,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000953 break;
954 }
cristy9950d572011-10-01 18:22:35 +0000955 (void) QueryColorCompliance(argv[i+1],AllCompliance,
956 &draw_info->border_color,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000957 break;
958 }
959 if (LocaleCompare("box",option+1) == 0)
960 {
cristy9950d572011-10-01 18:22:35 +0000961 (void) QueryColorCompliance(argv[i+1],AllCompliance,
962 &draw_info->undercolor,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000963 break;
964 }
965 if (LocaleCompare("brightness-contrast",option+1) == 0)
966 {
967 double
968 brightness,
969 contrast;
970
971 GeometryInfo
972 geometry_info;
973
974 MagickStatusType
975 flags;
976
977 /*
978 Brightness / contrast image.
979 */
cristy6fccee12011-10-20 18:43:18 +0000980 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +0000981 flags=ParseGeometry(argv[i+1],&geometry_info);
982 brightness=geometry_info.rho;
983 contrast=0.0;
984 if ((flags & SigmaValue) != 0)
985 contrast=geometry_info.sigma;
cristy444eda62011-08-10 02:07:46 +0000986 (void) BrightnessContrastImage(*image,brightness,contrast,
987 exception);
anthonydf8ebac2011-04-27 09:03:19 +0000988 break;
989 }
990 break;
991 }
992 case 'c':
993 {
994 if (LocaleCompare("cdl",option+1) == 0)
995 {
996 char
997 *color_correction_collection;
998
999 /*
1000 Color correct with a color decision list.
1001 */
cristy6fccee12011-10-20 18:43:18 +00001002 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001003 color_correction_collection=FileToString(argv[i+1],~0,exception);
1004 if (color_correction_collection == (char *) NULL)
1005 break;
cristy1bfa9f02011-08-11 02:35:43 +00001006 (void) ColorDecisionListImage(*image,color_correction_collection,
1007 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001008 break;
1009 }
1010 if (LocaleCompare("channel",option+1) == 0)
1011 {
1012 if (*option == '+')
cristyfa806a72011-07-04 02:06:13 +00001013 channel=DefaultChannels;
anthonydf8ebac2011-04-27 09:03:19 +00001014 else
cristyfa806a72011-07-04 02:06:13 +00001015 channel=(ChannelType) ParseChannelOption(argv[i+1]);
cristyed231572011-07-14 02:18:59 +00001016 SetPixelChannelMap(*image,channel);
anthonydf8ebac2011-04-27 09:03:19 +00001017 break;
1018 }
1019 if (LocaleCompare("charcoal",option+1) == 0)
1020 {
1021 /*
1022 Charcoal image.
1023 */
cristy6fccee12011-10-20 18:43:18 +00001024 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001025 flags=ParseGeometry(argv[i+1],&geometry_info);
1026 if ((flags & SigmaValue) == 0)
1027 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +00001028 if ((flags & XiValue) == 0)
1029 geometry_info.xi=1.0;
anthonydf8ebac2011-04-27 09:03:19 +00001030 mogrify_image=CharcoalImage(*image,geometry_info.rho,
cristy05c0c9a2011-09-05 23:16:13 +00001031 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001032 break;
1033 }
1034 if (LocaleCompare("chop",option+1) == 0)
1035 {
1036 /*
1037 Chop the image.
1038 */
cristy6fccee12011-10-20 18:43:18 +00001039 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001040 (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
1041 mogrify_image=ChopImage(*image,&geometry,exception);
1042 break;
1043 }
1044 if (LocaleCompare("clamp",option+1) == 0)
1045 {
1046 /*
1047 Clamp image.
1048 */
cristy6fccee12011-10-20 18:43:18 +00001049 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy092d71c2011-10-14 18:01:29 +00001050 (void) ClampImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001051 break;
1052 }
1053 if (LocaleCompare("clip",option+1) == 0)
1054 {
cristy6fccee12011-10-20 18:43:18 +00001055 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001056 if (*option == '+')
1057 {
cristy018f07f2011-09-04 21:15:19 +00001058 (void) SetImageClipMask(*image,(Image *) NULL,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001059 break;
1060 }
cristy018f07f2011-09-04 21:15:19 +00001061 (void) ClipImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001062 break;
1063 }
1064 if (LocaleCompare("clip-mask",option+1) == 0)
1065 {
1066 CacheView
1067 *mask_view;
1068
1069 Image
1070 *mask_image;
1071
cristy4c08aed2011-07-01 19:47:50 +00001072 register Quantum
anthonydf8ebac2011-04-27 09:03:19 +00001073 *restrict q;
1074
1075 register ssize_t
1076 x;
1077
1078 ssize_t
1079 y;
1080
cristy6fccee12011-10-20 18:43:18 +00001081 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001082 if (*option == '+')
1083 {
1084 /*
1085 Remove a mask.
1086 */
cristy018f07f2011-09-04 21:15:19 +00001087 (void) SetImageMask(*image,(Image *) NULL,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001088 break;
1089 }
1090 /*
1091 Set the image mask.
1092 FUTURE: This Should Be a SetImageAlphaChannel() call, Or two.
1093 */
1094 mask_image=GetImageCache(mogrify_info,argv[i+1],exception);
1095 if (mask_image == (Image *) NULL)
1096 break;
cristy574cc262011-08-05 01:23:58 +00001097 if (SetImageStorageClass(mask_image,DirectClass,exception) == MagickFalse)
anthonydf8ebac2011-04-27 09:03:19 +00001098 return(MagickFalse);
1099 mask_view=AcquireCacheView(mask_image);
1100 for (y=0; y < (ssize_t) mask_image->rows; y++)
1101 {
1102 q=GetCacheViewAuthenticPixels(mask_view,0,y,mask_image->columns,1,
1103 exception);
cristyacd2ed22011-08-30 01:44:23 +00001104 if (q == (Quantum *) NULL)
anthonydf8ebac2011-04-27 09:03:19 +00001105 break;
1106 for (x=0; x < (ssize_t) mask_image->columns; x++)
1107 {
1108 if (mask_image->matte == MagickFalse)
cristy4c08aed2011-07-01 19:47:50 +00001109 SetPixelAlpha(mask_image,GetPixelIntensity(mask_image,q),q);
1110 SetPixelRed(mask_image,GetPixelAlpha(mask_image,q),q);
1111 SetPixelGreen(mask_image,GetPixelAlpha(mask_image,q),q);
1112 SetPixelBlue(mask_image,GetPixelAlpha(mask_image,q),q);
cristyed231572011-07-14 02:18:59 +00001113 q+=GetPixelChannels(mask_image);
anthonydf8ebac2011-04-27 09:03:19 +00001114 }
1115 if (SyncCacheViewAuthenticPixels(mask_view,exception) == MagickFalse)
1116 break;
1117 }
1118 mask_view=DestroyCacheView(mask_view);
1119 mask_image->matte=MagickTrue;
cristy018f07f2011-09-04 21:15:19 +00001120 (void) SetImageClipMask(*image,mask_image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001121 break;
1122 }
1123 if (LocaleCompare("clip-path",option+1) == 0)
1124 {
cristy6fccee12011-10-20 18:43:18 +00001125 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001126 (void) ClipImagePath(*image,argv[i+1],*option == '-' ? MagickTrue :
cristy018f07f2011-09-04 21:15:19 +00001127 MagickFalse,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001128 break;
1129 }
1130 if (LocaleCompare("colorize",option+1) == 0)
1131 {
1132 /*
1133 Colorize the image.
1134 */
cristy6fccee12011-10-20 18:43:18 +00001135 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyc7e6ff62011-10-03 13:46:11 +00001136 mogrify_image=ColorizeImage(*image,argv[i+1],&fill,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001137 break;
1138 }
1139 if (LocaleCompare("color-matrix",option+1) == 0)
1140 {
1141 KernelInfo
1142 *kernel;
1143
cristy6fccee12011-10-20 18:43:18 +00001144 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001145 kernel=AcquireKernelInfo(argv[i+1]);
1146 if (kernel == (KernelInfo *) NULL)
1147 break;
1148 mogrify_image=ColorMatrixImage(*image,kernel,exception);
1149 kernel=DestroyKernelInfo(kernel);
1150 break;
1151 }
1152 if (LocaleCompare("colors",option+1) == 0)
1153 {
1154 /*
1155 Reduce the number of colors in the image.
1156 */
cristy6fccee12011-10-20 18:43:18 +00001157 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001158 quantize_info->number_colors=StringToUnsignedLong(argv[i+1]);
1159 if (quantize_info->number_colors == 0)
1160 break;
1161 if (((*image)->storage_class == DirectClass) ||
1162 (*image)->colors > quantize_info->number_colors)
cristy018f07f2011-09-04 21:15:19 +00001163 (void) QuantizeImage(quantize_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001164 else
cristy018f07f2011-09-04 21:15:19 +00001165 (void) CompressImageColormap(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001166 break;
1167 }
1168 if (LocaleCompare("colorspace",option+1) == 0)
1169 {
1170 ColorspaceType
1171 colorspace;
1172
cristy6fccee12011-10-20 18:43:18 +00001173 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001174 if (*option == '+')
1175 {
cristye941a752011-10-15 01:52:48 +00001176 (void) TransformImageColorspace(*image,RGBColorspace,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001177 break;
1178 }
1179 colorspace=(ColorspaceType) ParseCommandOption(
1180 MagickColorspaceOptions,MagickFalse,argv[i+1]);
cristye941a752011-10-15 01:52:48 +00001181 (void) TransformImageColorspace(*image,colorspace,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001182 break;
1183 }
cristy633f0c62011-09-15 13:27:36 +00001184 if (LocaleCompare("compose",option+1) == 0)
1185 {
cristy6fccee12011-10-20 18:43:18 +00001186 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy633f0c62011-09-15 13:27:36 +00001187 compose=(CompositeOperator) ParseCommandOption(MagickComposeOptions,
1188 MagickFalse,argv[i+1]);
1189 break;
1190 }
anthonydf8ebac2011-04-27 09:03:19 +00001191 if (LocaleCompare("contrast",option+1) == 0)
1192 {
cristy6fccee12011-10-20 18:43:18 +00001193 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001194 (void) ContrastImage(*image,(*option == '-') ? MagickTrue :
cristye23ec9d2011-08-16 18:15:40 +00001195 MagickFalse,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001196 break;
1197 }
1198 if (LocaleCompare("contrast-stretch",option+1) == 0)
1199 {
1200 double
1201 black_point,
1202 white_point;
1203
1204 MagickStatusType
1205 flags;
1206
1207 /*
1208 Contrast stretch image.
1209 */
cristy6fccee12011-10-20 18:43:18 +00001210 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001211 flags=ParseGeometry(argv[i+1],&geometry_info);
1212 black_point=geometry_info.rho;
1213 white_point=(flags & SigmaValue) != 0 ? geometry_info.sigma :
1214 black_point;
1215 if ((flags & PercentValue) != 0)
1216 {
1217 black_point*=(double) (*image)->columns*(*image)->rows/100.0;
1218 white_point*=(double) (*image)->columns*(*image)->rows/100.0;
1219 }
1220 white_point=(MagickRealType) (*image)->columns*(*image)->rows-
1221 white_point;
cristye23ec9d2011-08-16 18:15:40 +00001222 (void) ContrastStretchImage(*image,black_point,white_point,
1223 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001224 break;
1225 }
1226 if (LocaleCompare("convolve",option+1) == 0)
1227 {
anthonydf8ebac2011-04-27 09:03:19 +00001228 KernelInfo
cristy41cbe682011-07-15 19:12:37 +00001229 *kernel_info;
anthonydf8ebac2011-04-27 09:03:19 +00001230
cristy6fccee12011-10-20 18:43:18 +00001231 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy41cbe682011-07-15 19:12:37 +00001232 kernel_info=AcquireKernelInfo(argv[i+1]);
1233 if (kernel_info == (KernelInfo *) NULL)
anthonydf8ebac2011-04-27 09:03:19 +00001234 break;
cristy0a922382011-07-16 15:30:34 +00001235 kernel_info->bias=(*image)->bias;
cristy5e6be1e2011-07-16 01:23:39 +00001236 mogrify_image=ConvolveImage(*image,kernel_info,exception);
cristy41cbe682011-07-15 19:12:37 +00001237 kernel_info=DestroyKernelInfo(kernel_info);
anthonydf8ebac2011-04-27 09:03:19 +00001238 break;
1239 }
1240 if (LocaleCompare("crop",option+1) == 0)
1241 {
1242 /*
1243 Crop a image to a smaller size
1244 */
cristy6fccee12011-10-20 18:43:18 +00001245 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001246 mogrify_image=CropImageToTiles(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +00001247 break;
1248 }
1249 if (LocaleCompare("cycle",option+1) == 0)
1250 {
1251 /*
1252 Cycle an image colormap.
1253 */
cristy6fccee12011-10-20 18:43:18 +00001254 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy018f07f2011-09-04 21:15:19 +00001255 (void) CycleColormapImage(*image,(ssize_t) StringToLong(argv[i+1]),
1256 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001257 break;
1258 }
1259 break;
1260 }
1261 case 'd':
1262 {
1263 if (LocaleCompare("decipher",option+1) == 0)
1264 {
1265 StringInfo
1266 *passkey;
1267
1268 /*
1269 Decipher pixels.
1270 */
cristy6fccee12011-10-20 18:43:18 +00001271 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001272 passkey=FileToStringInfo(argv[i+1],~0,exception);
1273 if (passkey != (StringInfo *) NULL)
1274 {
1275 (void) PasskeyDecipherImage(*image,passkey,exception);
1276 passkey=DestroyStringInfo(passkey);
1277 }
1278 break;
1279 }
1280 if (LocaleCompare("density",option+1) == 0)
1281 {
1282 /*
1283 Set image density.
1284 */
1285 (void) CloneString(&draw_info->density,argv[i+1]);
1286 break;
1287 }
1288 if (LocaleCompare("depth",option+1) == 0)
1289 {
cristy6fccee12011-10-20 18:43:18 +00001290 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001291 if (*option == '+')
1292 {
cristy8a11cb12011-10-19 23:53:34 +00001293 (void) SetImageDepth(*image,MAGICKCORE_QUANTUM_DEPTH,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001294 break;
1295 }
cristy8a11cb12011-10-19 23:53:34 +00001296 (void) SetImageDepth(*image,StringToUnsignedLong(argv[i+1]),
1297 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001298 break;
1299 }
1300 if (LocaleCompare("deskew",option+1) == 0)
1301 {
1302 double
1303 threshold;
1304
1305 /*
1306 Straighten the image.
1307 */
cristy6fccee12011-10-20 18:43:18 +00001308 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001309 if (*option == '+')
1310 threshold=40.0*QuantumRange/100.0;
1311 else
cristy9b34e302011-11-05 02:15:45 +00001312 threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+
1313 1.0);
anthonydf8ebac2011-04-27 09:03:19 +00001314 mogrify_image=DeskewImage(*image,threshold,exception);
1315 break;
1316 }
1317 if (LocaleCompare("despeckle",option+1) == 0)
1318 {
1319 /*
1320 Reduce the speckles within an image.
1321 */
cristy6fccee12011-10-20 18:43:18 +00001322 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001323 mogrify_image=DespeckleImage(*image,exception);
1324 break;
1325 }
1326 if (LocaleCompare("display",option+1) == 0)
1327 {
1328 (void) CloneString(&draw_info->server_name,argv[i+1]);
1329 break;
1330 }
1331 if (LocaleCompare("distort",option+1) == 0)
1332 {
1333 char
1334 *args,
1335 token[MaxTextExtent];
1336
1337 const char
1338 *p;
1339
1340 DistortImageMethod
1341 method;
1342
1343 double
1344 *arguments;
1345
1346 register ssize_t
1347 x;
1348
1349 size_t
1350 number_arguments;
1351
1352 /*
1353 Distort image.
1354 */
cristy6fccee12011-10-20 18:43:18 +00001355 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001356 method=(DistortImageMethod) ParseCommandOption(MagickDistortOptions,
1357 MagickFalse,argv[i+1]);
cristy56835872011-11-06 01:19:13 +00001358 if (method == ResizeDistortion)
anthonydf8ebac2011-04-27 09:03:19 +00001359 {
anthonydf8ebac2011-04-27 09:03:19 +00001360 double
1361 resize_args[2];
cristy56835872011-11-06 01:19:13 +00001362
1363 /*
1364 Special Case - Argument is actually a resize geometry!
1365 Convert that to an appropriate distortion argument array.
1366 */
anthonydf8ebac2011-04-27 09:03:19 +00001367 (void) ParseRegionGeometry(*image,argv[i+2],&geometry,
cristy56835872011-11-06 01:19:13 +00001368 exception);
1369 resize_args[0]=(double) geometry.width;
1370 resize_args[1]=(double) geometry.height;
anthonydf8ebac2011-04-27 09:03:19 +00001371 mogrify_image=DistortImage(*image,method,(size_t)2,
cristy56835872011-11-06 01:19:13 +00001372 resize_args,MagickTrue,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001373 break;
1374 }
cristy018f07f2011-09-04 21:15:19 +00001375 args=InterpretImageProperties(mogrify_info,*image,argv[i+2],
1376 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001377 if (args == (char *) NULL)
1378 break;
1379 p=(char *) args;
1380 for (x=0; *p != '\0'; x++)
1381 {
1382 GetMagickToken(p,&p,token);
1383 if (*token == ',')
1384 GetMagickToken(p,&p,token);
1385 }
1386 number_arguments=(size_t) x;
1387 arguments=(double *) AcquireQuantumMemory(number_arguments,
1388 sizeof(*arguments));
1389 if (arguments == (double *) NULL)
1390 ThrowWandFatalException(ResourceLimitFatalError,
1391 "MemoryAllocationFailed",(*image)->filename);
1392 (void) ResetMagickMemory(arguments,0,number_arguments*
1393 sizeof(*arguments));
1394 p=(char *) args;
1395 for (x=0; (x < (ssize_t) number_arguments) && (*p != '\0'); x++)
1396 {
1397 GetMagickToken(p,&p,token);
1398 if (*token == ',')
1399 GetMagickToken(p,&p,token);
cristydbdd0e32011-11-04 23:29:40 +00001400 arguments[x]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +00001401 }
1402 args=DestroyString(args);
1403 mogrify_image=DistortImage(*image,method,number_arguments,arguments,
1404 (*option == '+') ? MagickTrue : MagickFalse,exception);
1405 arguments=(double *) RelinquishMagickMemory(arguments);
1406 break;
1407 }
1408 if (LocaleCompare("dither",option+1) == 0)
1409 {
1410 if (*option == '+')
1411 {
1412 quantize_info->dither=MagickFalse;
1413 break;
1414 }
1415 quantize_info->dither=MagickTrue;
1416 quantize_info->dither_method=(DitherMethod) ParseCommandOption(
1417 MagickDitherOptions,MagickFalse,argv[i+1]);
1418 if (quantize_info->dither_method == NoDitherMethod)
1419 quantize_info->dither=MagickFalse;
1420 break;
1421 }
1422 if (LocaleCompare("draw",option+1) == 0)
1423 {
1424 /*
1425 Draw image.
1426 */
cristy6fccee12011-10-20 18:43:18 +00001427 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001428 (void) CloneString(&draw_info->primitive,argv[i+1]);
cristy018f07f2011-09-04 21:15:19 +00001429 (void) DrawImage(*image,draw_info,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001430 break;
1431 }
1432 break;
1433 }
1434 case 'e':
1435 {
1436 if (LocaleCompare("edge",option+1) == 0)
1437 {
1438 /*
1439 Enhance edges in the image.
1440 */
cristy6fccee12011-10-20 18:43:18 +00001441 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001442 flags=ParseGeometry(argv[i+1],&geometry_info);
1443 if ((flags & SigmaValue) == 0)
1444 geometry_info.sigma=1.0;
cristy8ae632d2011-09-05 17:29:53 +00001445 mogrify_image=EdgeImage(*image,geometry_info.rho,
1446 geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001447 break;
1448 }
1449 if (LocaleCompare("emboss",option+1) == 0)
1450 {
1451 /*
1452 Gaussian embossen image.
1453 */
cristy6fccee12011-10-20 18:43:18 +00001454 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001455 flags=ParseGeometry(argv[i+1],&geometry_info);
1456 if ((flags & SigmaValue) == 0)
1457 geometry_info.sigma=1.0;
1458 mogrify_image=EmbossImage(*image,geometry_info.rho,
1459 geometry_info.sigma,exception);
1460 break;
1461 }
1462 if (LocaleCompare("encipher",option+1) == 0)
1463 {
1464 StringInfo
1465 *passkey;
1466
1467 /*
1468 Encipher pixels.
1469 */
cristy6fccee12011-10-20 18:43:18 +00001470 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001471 passkey=FileToStringInfo(argv[i+1],~0,exception);
1472 if (passkey != (StringInfo *) NULL)
1473 {
1474 (void) PasskeyEncipherImage(*image,passkey,exception);
1475 passkey=DestroyStringInfo(passkey);
1476 }
1477 break;
1478 }
1479 if (LocaleCompare("encoding",option+1) == 0)
1480 {
1481 (void) CloneString(&draw_info->encoding,argv[i+1]);
1482 break;
1483 }
1484 if (LocaleCompare("enhance",option+1) == 0)
1485 {
1486 /*
1487 Enhance image.
1488 */
cristy6fccee12011-10-20 18:43:18 +00001489 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001490 mogrify_image=EnhanceImage(*image,exception);
1491 break;
1492 }
1493 if (LocaleCompare("equalize",option+1) == 0)
1494 {
1495 /*
1496 Equalize image.
1497 */
cristy6fccee12011-10-20 18:43:18 +00001498 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy6d8c3d72011-08-22 01:20:01 +00001499 (void) EqualizeImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001500 break;
1501 }
1502 if (LocaleCompare("evaluate",option+1) == 0)
1503 {
1504 double
1505 constant;
1506
1507 MagickEvaluateOperator
1508 op;
1509
cristy6fccee12011-10-20 18:43:18 +00001510 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyd42d9952011-07-08 14:21:50 +00001511 op=(MagickEvaluateOperator) ParseCommandOption(
1512 MagickEvaluateOptions,MagickFalse,argv[i+1]);
cristy9b34e302011-11-05 02:15:45 +00001513 constant=StringToDoubleInterval(argv[i+2],(double) QuantumRange+
1514 1.0);
cristyd42d9952011-07-08 14:21:50 +00001515 (void) EvaluateImage(*image,op,constant,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001516 break;
1517 }
1518 if (LocaleCompare("extent",option+1) == 0)
1519 {
1520 /*
1521 Set the image extent.
1522 */
cristy6fccee12011-10-20 18:43:18 +00001523 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001524 flags=ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
1525 if (geometry.width == 0)
1526 geometry.width=(*image)->columns;
1527 if (geometry.height == 0)
1528 geometry.height=(*image)->rows;
1529 mogrify_image=ExtentImage(*image,&geometry,exception);
1530 break;
1531 }
1532 break;
1533 }
1534 case 'f':
1535 {
1536 if (LocaleCompare("family",option+1) == 0)
1537 {
1538 if (*option == '+')
1539 {
1540 if (draw_info->family != (char *) NULL)
1541 draw_info->family=DestroyString(draw_info->family);
1542 break;
1543 }
1544 (void) CloneString(&draw_info->family,argv[i+1]);
1545 break;
1546 }
1547 if (LocaleCompare("features",option+1) == 0)
1548 {
1549 if (*option == '+')
1550 {
1551 (void) DeleteImageArtifact(*image,"identify:features");
1552 break;
1553 }
1554 (void) SetImageArtifact(*image,"identify:features",argv[i+1]);
1555 break;
1556 }
1557 if (LocaleCompare("fill",option+1) == 0)
1558 {
1559 ExceptionInfo
1560 *sans;
1561
cristy4c08aed2011-07-01 19:47:50 +00001562 GetPixelInfo(*image,&fill);
anthonydf8ebac2011-04-27 09:03:19 +00001563 if (*option == '+')
1564 {
cristy269c9412011-10-13 23:41:15 +00001565 (void) QueryColorCompliance("none",AllCompliance,&fill,
cristy9950d572011-10-01 18:22:35 +00001566 exception);
1567 (void) QueryColorCompliance("none",AllCompliance,
1568 &draw_info->fill,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001569 if (draw_info->fill_pattern != (Image *) NULL)
1570 draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern);
1571 break;
1572 }
1573 sans=AcquireExceptionInfo();
cristy269c9412011-10-13 23:41:15 +00001574 (void) QueryColorCompliance(argv[i+1],AllCompliance,&fill,
cristy9950d572011-10-01 18:22:35 +00001575 sans);
1576 status=QueryColorCompliance(argv[i+1],AllCompliance,
1577 &draw_info->fill,sans);
anthonydf8ebac2011-04-27 09:03:19 +00001578 sans=DestroyExceptionInfo(sans);
1579 if (status == MagickFalse)
1580 draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1],
1581 exception);
1582 break;
1583 }
1584 if (LocaleCompare("flip",option+1) == 0)
1585 {
1586 /*
1587 Flip image scanlines.
1588 */
cristy6fccee12011-10-20 18:43:18 +00001589 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001590 mogrify_image=FlipImage(*image,exception);
1591 break;
1592 }
anthonydf8ebac2011-04-27 09:03:19 +00001593 if (LocaleCompare("floodfill",option+1) == 0)
1594 {
cristy4c08aed2011-07-01 19:47:50 +00001595 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +00001596 target;
1597
1598 /*
1599 Floodfill image.
1600 */
cristy6fccee12011-10-20 18:43:18 +00001601 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001602 (void) ParsePageGeometry(*image,argv[i+1],&geometry,exception);
cristy269c9412011-10-13 23:41:15 +00001603 (void) QueryColorCompliance(argv[i+2],AllCompliance,&target,
cristy9950d572011-10-01 18:22:35 +00001604 exception);
cristyd42d9952011-07-08 14:21:50 +00001605 (void) FloodfillPaintImage(*image,draw_info,&target,geometry.x,
cristy189e84c2011-08-27 18:08:53 +00001606 geometry.y,*option == '-' ? MagickFalse : MagickTrue,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001607 break;
1608 }
anthony3d2f4862011-05-01 13:48:16 +00001609 if (LocaleCompare("flop",option+1) == 0)
1610 {
1611 /*
1612 Flop image scanlines.
1613 */
cristy6fccee12011-10-20 18:43:18 +00001614 (void) SyncImageSettings(mogrify_info,*image,exception);
anthony3d2f4862011-05-01 13:48:16 +00001615 mogrify_image=FlopImage(*image,exception);
1616 break;
1617 }
anthonydf8ebac2011-04-27 09:03:19 +00001618 if (LocaleCompare("font",option+1) == 0)
1619 {
1620 if (*option == '+')
1621 {
1622 if (draw_info->font != (char *) NULL)
1623 draw_info->font=DestroyString(draw_info->font);
1624 break;
1625 }
1626 (void) CloneString(&draw_info->font,argv[i+1]);
1627 break;
1628 }
1629 if (LocaleCompare("format",option+1) == 0)
1630 {
1631 format=argv[i+1];
1632 break;
1633 }
1634 if (LocaleCompare("frame",option+1) == 0)
1635 {
1636 FrameInfo
1637 frame_info;
1638
1639 /*
1640 Surround image with an ornamental border.
1641 */
cristy6fccee12011-10-20 18:43:18 +00001642 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001643 flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
1644 frame_info.width=geometry.width;
1645 frame_info.height=geometry.height;
1646 if ((flags & HeightValue) == 0)
1647 frame_info.height=geometry.width;
1648 frame_info.outer_bevel=geometry.x;
1649 frame_info.inner_bevel=geometry.y;
1650 frame_info.x=(ssize_t) frame_info.width;
1651 frame_info.y=(ssize_t) frame_info.height;
1652 frame_info.width=(*image)->columns+2*frame_info.width;
1653 frame_info.height=(*image)->rows+2*frame_info.height;
cristy633f0c62011-09-15 13:27:36 +00001654 mogrify_image=FrameImage(*image,&frame_info,compose,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001655 break;
1656 }
1657 if (LocaleCompare("function",option+1) == 0)
1658 {
1659 char
1660 *arguments,
1661 token[MaxTextExtent];
1662
1663 const char
1664 *p;
1665
1666 double
1667 *parameters;
1668
1669 MagickFunction
1670 function;
1671
1672 register ssize_t
1673 x;
1674
1675 size_t
1676 number_parameters;
1677
1678 /*
1679 Function Modify Image Values
1680 */
cristy6fccee12011-10-20 18:43:18 +00001681 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001682 function=(MagickFunction) ParseCommandOption(MagickFunctionOptions,
1683 MagickFalse,argv[i+1]);
cristy018f07f2011-09-04 21:15:19 +00001684 arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2],
1685 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001686 if (arguments == (char *) NULL)
1687 break;
1688 p=(char *) arguments;
1689 for (x=0; *p != '\0'; x++)
1690 {
1691 GetMagickToken(p,&p,token);
1692 if (*token == ',')
1693 GetMagickToken(p,&p,token);
1694 }
1695 number_parameters=(size_t) x;
1696 parameters=(double *) AcquireQuantumMemory(number_parameters,
1697 sizeof(*parameters));
1698 if (parameters == (double *) NULL)
1699 ThrowWandFatalException(ResourceLimitFatalError,
1700 "MemoryAllocationFailed",(*image)->filename);
1701 (void) ResetMagickMemory(parameters,0,number_parameters*
1702 sizeof(*parameters));
1703 p=(char *) arguments;
1704 for (x=0; (x < (ssize_t) number_parameters) && (*p != '\0'); x++)
1705 {
1706 GetMagickToken(p,&p,token);
1707 if (*token == ',')
1708 GetMagickToken(p,&p,token);
cristydbdd0e32011-11-04 23:29:40 +00001709 parameters[x]=StringToDouble(token,(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +00001710 }
1711 arguments=DestroyString(arguments);
cristyd42d9952011-07-08 14:21:50 +00001712 (void) FunctionImage(*image,function,number_parameters,parameters,
1713 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001714 parameters=(double *) RelinquishMagickMemory(parameters);
1715 break;
1716 }
1717 break;
1718 }
1719 case 'g':
1720 {
1721 if (LocaleCompare("gamma",option+1) == 0)
1722 {
1723 /*
1724 Gamma image.
1725 */
cristy6fccee12011-10-20 18:43:18 +00001726 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001727 if (*option == '+')
cristydbdd0e32011-11-04 23:29:40 +00001728 (*image)->gamma=StringToDouble(argv[i+1],(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +00001729 else
cristydbdd0e32011-11-04 23:29:40 +00001730 (void) GammaImage(*image,StringToDouble(argv[i+1],
cristyb3e7c6c2011-07-24 01:43:55 +00001731 (char **) NULL),exception);
anthonydf8ebac2011-04-27 09:03:19 +00001732 break;
1733 }
1734 if ((LocaleCompare("gaussian-blur",option+1) == 0) ||
1735 (LocaleCompare("gaussian",option+1) == 0))
1736 {
1737 /*
1738 Gaussian blur image.
1739 */
cristy6fccee12011-10-20 18:43:18 +00001740 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001741 flags=ParseGeometry(argv[i+1],&geometry_info);
1742 if ((flags & SigmaValue) == 0)
1743 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +00001744 if ((flags & XiValue) == 0)
1745 geometry_info.xi=0.0;
cristyf4ad9df2011-07-08 16:49:03 +00001746 mogrify_image=GaussianBlurImage(*image,geometry_info.rho,
cristy05c0c9a2011-09-05 23:16:13 +00001747 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001748 break;
1749 }
1750 if (LocaleCompare("geometry",option+1) == 0)
1751 {
1752 /*
1753 Record Image offset, Resize last image.
1754 */
cristy6fccee12011-10-20 18:43:18 +00001755 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001756 if (*option == '+')
1757 {
1758 if ((*image)->geometry != (char *) NULL)
1759 (*image)->geometry=DestroyString((*image)->geometry);
1760 break;
1761 }
1762 flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
1763 if (((flags & XValue) != 0) || ((flags & YValue) != 0))
1764 (void) CloneString(&(*image)->geometry,argv[i+1]);
1765 else
1766 mogrify_image=ResizeImage(*image,geometry.width,geometry.height,
1767 (*image)->filter,(*image)->blur,exception);
1768 break;
1769 }
1770 if (LocaleCompare("gravity",option+1) == 0)
1771 {
1772 if (*option == '+')
1773 {
1774 draw_info->gravity=UndefinedGravity;
1775 break;
1776 }
1777 draw_info->gravity=(GravityType) ParseCommandOption(
1778 MagickGravityOptions,MagickFalse,argv[i+1]);
1779 break;
1780 }
1781 break;
1782 }
1783 case 'h':
1784 {
1785 if (LocaleCompare("highlight-color",option+1) == 0)
1786 {
1787 (void) SetImageArtifact(*image,option+1,argv[i+1]);
1788 break;
1789 }
1790 break;
1791 }
1792 case 'i':
1793 {
1794 if (LocaleCompare("identify",option+1) == 0)
1795 {
1796 char
1797 *text;
1798
cristy6fccee12011-10-20 18:43:18 +00001799 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001800 if (format == (char *) NULL)
1801 {
cristya4037272011-08-28 15:11:39 +00001802 (void) IdentifyImage(*image,stdout,mogrify_info->verbose,
1803 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001804 break;
1805 }
cristy018f07f2011-09-04 21:15:19 +00001806 text=InterpretImageProperties(mogrify_info,*image,format,
1807 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001808 if (text == (char *) NULL)
1809 break;
1810 (void) fputs(text,stdout);
1811 (void) fputc('\n',stdout);
1812 text=DestroyString(text);
1813 break;
1814 }
1815 if (LocaleCompare("implode",option+1) == 0)
1816 {
1817 /*
1818 Implode image.
1819 */
cristy6fccee12011-10-20 18:43:18 +00001820 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001821 (void) ParseGeometry(argv[i+1],&geometry_info);
cristy76f512e2011-09-12 01:26:56 +00001822 mogrify_image=ImplodeImage(*image,geometry_info.rho,
1823 interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001824 break;
1825 }
1826 if (LocaleCompare("interline-spacing",option+1) == 0)
1827 {
1828 if (*option == '+')
1829 (void) ParseGeometry("0",&geometry_info);
1830 else
1831 (void) ParseGeometry(argv[i+1],&geometry_info);
1832 draw_info->interline_spacing=geometry_info.rho;
1833 break;
1834 }
cristy28474bf2011-09-11 23:32:52 +00001835 if (LocaleCompare("interpolate",option+1) == 0)
1836 {
1837 interpolate_method=(PixelInterpolateMethod) ParseCommandOption(
1838 MagickInterpolateOptions,MagickFalse,argv[i+1]);
1839 break;
1840 }
anthonydf8ebac2011-04-27 09:03:19 +00001841 if (LocaleCompare("interword-spacing",option+1) == 0)
1842 {
1843 if (*option == '+')
1844 (void) ParseGeometry("0",&geometry_info);
1845 else
1846 (void) ParseGeometry(argv[i+1],&geometry_info);
1847 draw_info->interword_spacing=geometry_info.rho;
1848 break;
1849 }
1850 break;
1851 }
1852 case 'k':
1853 {
1854 if (LocaleCompare("kerning",option+1) == 0)
1855 {
1856 if (*option == '+')
1857 (void) ParseGeometry("0",&geometry_info);
1858 else
1859 (void) ParseGeometry(argv[i+1],&geometry_info);
1860 draw_info->kerning=geometry_info.rho;
1861 break;
1862 }
1863 break;
1864 }
1865 case 'l':
1866 {
1867 if (LocaleCompare("lat",option+1) == 0)
1868 {
1869 /*
1870 Local adaptive threshold image.
1871 */
cristy6fccee12011-10-20 18:43:18 +00001872 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001873 flags=ParseGeometry(argv[i+1],&geometry_info);
1874 if ((flags & PercentValue) != 0)
1875 geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0;
1876 mogrify_image=AdaptiveThresholdImage(*image,(size_t)
cristyde5cc632011-07-18 14:47:00 +00001877 geometry_info.rho,(size_t) geometry_info.sigma,(double)
anthonydf8ebac2011-04-27 09:03:19 +00001878 geometry_info.xi,exception);
1879 break;
1880 }
1881 if (LocaleCompare("level",option+1) == 0)
1882 {
1883 MagickRealType
1884 black_point,
1885 gamma,
1886 white_point;
1887
1888 MagickStatusType
1889 flags;
1890
1891 /*
1892 Parse levels.
1893 */
cristy6fccee12011-10-20 18:43:18 +00001894 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001895 flags=ParseGeometry(argv[i+1],&geometry_info);
1896 black_point=geometry_info.rho;
1897 white_point=(MagickRealType) QuantumRange;
1898 if ((flags & SigmaValue) != 0)
1899 white_point=geometry_info.sigma;
1900 gamma=1.0;
1901 if ((flags & XiValue) != 0)
1902 gamma=geometry_info.xi;
1903 if ((flags & PercentValue) != 0)
1904 {
1905 black_point*=(MagickRealType) (QuantumRange/100.0);
1906 white_point*=(MagickRealType) (QuantumRange/100.0);
1907 }
1908 if ((flags & SigmaValue) == 0)
1909 white_point=(MagickRealType) QuantumRange-black_point;
1910 if ((*option == '+') || ((flags & AspectValue) != 0))
cristy7c0a0a42011-08-23 17:57:25 +00001911 (void) LevelizeImage(*image,black_point,white_point,gamma,
1912 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001913 else
cristy01e9afd2011-08-10 17:38:41 +00001914 (void) LevelImage(*image,black_point,white_point,gamma,
1915 exception);
anthonydf8ebac2011-04-27 09:03:19 +00001916 break;
1917 }
1918 if (LocaleCompare("level-colors",option+1) == 0)
1919 {
1920 char
1921 token[MaxTextExtent];
1922
1923 const char
1924 *p;
1925
cristy4c08aed2011-07-01 19:47:50 +00001926 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +00001927 black_point,
1928 white_point;
1929
1930 p=(const char *) argv[i+1];
1931 GetMagickToken(p,&p,token); /* get black point color */
1932 if ((isalpha((int) *token) != 0) || ((*token == '#') != 0))
cristy269c9412011-10-13 23:41:15 +00001933 (void) QueryColorCompliance(token,AllCompliance,
cristy9950d572011-10-01 18:22:35 +00001934 &black_point,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001935 else
cristy269c9412011-10-13 23:41:15 +00001936 (void) QueryColorCompliance("#000000",AllCompliance,
cristy9950d572011-10-01 18:22:35 +00001937 &black_point,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001938 if (isalpha((int) token[0]) || (token[0] == '#'))
1939 GetMagickToken(p,&p,token);
1940 if (*token == '\0')
1941 white_point=black_point; /* set everything to that color */
1942 else
1943 {
1944 if ((isalpha((int) *token) == 0) && ((*token == '#') == 0))
1945 GetMagickToken(p,&p,token); /* Get white point color. */
1946 if ((isalpha((int) *token) != 0) || ((*token == '#') != 0))
cristy269c9412011-10-13 23:41:15 +00001947 (void) QueryColorCompliance(token,AllCompliance,
cristy9950d572011-10-01 18:22:35 +00001948 &white_point,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001949 else
cristy269c9412011-10-13 23:41:15 +00001950 (void) QueryColorCompliance("#ffffff",AllCompliance,
cristy9950d572011-10-01 18:22:35 +00001951 &white_point,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001952 }
cristy490408a2011-07-07 14:42:05 +00001953 (void) LevelImageColors(*image,&black_point,&white_point,
cristy7c0a0a42011-08-23 17:57:25 +00001954 *option == '+' ? MagickTrue : MagickFalse,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001955 break;
1956 }
1957 if (LocaleCompare("linear-stretch",option+1) == 0)
1958 {
1959 double
1960 black_point,
1961 white_point;
1962
1963 MagickStatusType
1964 flags;
1965
cristy6fccee12011-10-20 18:43:18 +00001966 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001967 flags=ParseGeometry(argv[i+1],&geometry_info);
1968 black_point=geometry_info.rho;
1969 white_point=(MagickRealType) (*image)->columns*(*image)->rows;
1970 if ((flags & SigmaValue) != 0)
1971 white_point=geometry_info.sigma;
1972 if ((flags & PercentValue) != 0)
1973 {
1974 black_point*=(double) (*image)->columns*(*image)->rows/100.0;
1975 white_point*=(double) (*image)->columns*(*image)->rows/100.0;
1976 }
1977 if ((flags & SigmaValue) == 0)
1978 white_point=(MagickRealType) (*image)->columns*(*image)->rows-
1979 black_point;
cristy33bd5152011-08-24 01:42:24 +00001980 (void) LinearStretchImage(*image,black_point,white_point,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001981 break;
1982 }
1983 if (LocaleCompare("linewidth",option+1) == 0)
1984 {
cristy9b34e302011-11-05 02:15:45 +00001985 draw_info->stroke_width=StringToDouble(argv[i+1],(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +00001986 break;
1987 }
1988 if (LocaleCompare("liquid-rescale",option+1) == 0)
1989 {
1990 /*
1991 Liquid rescale image.
1992 */
cristy6fccee12011-10-20 18:43:18 +00001993 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00001994 flags=ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
1995 if ((flags & XValue) == 0)
1996 geometry.x=1;
1997 if ((flags & YValue) == 0)
1998 geometry.y=0;
1999 mogrify_image=LiquidRescaleImage(*image,geometry.width,
2000 geometry.height,1.0*geometry.x,1.0*geometry.y,exception);
2001 break;
2002 }
2003 if (LocaleCompare("lowlight-color",option+1) == 0)
2004 {
2005 (void) SetImageArtifact(*image,option+1,argv[i+1]);
2006 break;
2007 }
2008 break;
2009 }
2010 case 'm':
2011 {
2012 if (LocaleCompare("map",option+1) == 0)
cristy3ed852e2009-09-05 21:47:34 +00002013 {
cristy3ed852e2009-09-05 21:47:34 +00002014 Image
anthonydf8ebac2011-04-27 09:03:19 +00002015 *remap_image;
cristy3ed852e2009-09-05 21:47:34 +00002016
anthonydf8ebac2011-04-27 09:03:19 +00002017 /*
2018 Transform image colors to match this set of colors.
2019 */
cristy6fccee12011-10-20 18:43:18 +00002020 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002021 if (*option == '+')
2022 break;
2023 remap_image=GetImageCache(mogrify_info,argv[i+1],exception);
2024 if (remap_image == (Image *) NULL)
2025 break;
cristy018f07f2011-09-04 21:15:19 +00002026 (void) RemapImage(quantize_info,*image,remap_image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002027 remap_image=DestroyImage(remap_image);
2028 break;
2029 }
2030 if (LocaleCompare("mask",option+1) == 0)
2031 {
2032 Image
2033 *mask;
2034
cristy6fccee12011-10-20 18:43:18 +00002035 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002036 if (*option == '+')
2037 {
2038 /*
2039 Remove a mask.
2040 */
cristy018f07f2011-09-04 21:15:19 +00002041 (void) SetImageMask(*image,(Image *) NULL,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002042 break;
2043 }
2044 /*
2045 Set the image mask.
2046 */
2047 mask=GetImageCache(mogrify_info,argv[i+1],exception);
2048 if (mask == (Image *) NULL)
2049 break;
cristy018f07f2011-09-04 21:15:19 +00002050 (void) SetImageMask(*image,mask,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002051 mask=DestroyImage(mask);
anthonydf8ebac2011-04-27 09:03:19 +00002052 break;
2053 }
2054 if (LocaleCompare("matte",option+1) == 0)
2055 {
2056 (void) SetImageAlphaChannel(*image,(*option == '-') ?
cristy63240882011-08-05 19:05:27 +00002057 SetAlphaChannel : DeactivateAlphaChannel,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002058 break;
2059 }
2060 if (LocaleCompare("median",option+1) == 0)
2061 {
2062 /*
2063 Median filter image.
2064 */
cristy6fccee12011-10-20 18:43:18 +00002065 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyf36cbcb2011-09-07 13:28:22 +00002066 flags=ParseGeometry(argv[i+1],&geometry_info);
2067 if ((flags & SigmaValue) == 0)
2068 geometry_info.sigma=geometry_info.rho;
cristyf4ad9df2011-07-08 16:49:03 +00002069 mogrify_image=StatisticImage(*image,MedianStatistic,(size_t)
cristyf36cbcb2011-09-07 13:28:22 +00002070 geometry_info.rho,(size_t) geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002071 break;
2072 }
2073 if (LocaleCompare("mode",option+1) == 0)
2074 {
2075 /*
2076 Mode image.
2077 */
cristy6fccee12011-10-20 18:43:18 +00002078 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyf36cbcb2011-09-07 13:28:22 +00002079 flags=ParseGeometry(argv[i+1],&geometry_info);
2080 if ((flags & SigmaValue) == 0)
2081 geometry_info.sigma=geometry_info.rho;
cristyf4ad9df2011-07-08 16:49:03 +00002082 mogrify_image=StatisticImage(*image,ModeStatistic,(size_t)
cristyf36cbcb2011-09-07 13:28:22 +00002083 geometry_info.rho,(size_t) geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002084 break;
2085 }
2086 if (LocaleCompare("modulate",option+1) == 0)
2087 {
cristy6fccee12011-10-20 18:43:18 +00002088 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy33bd5152011-08-24 01:42:24 +00002089 (void) ModulateImage(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +00002090 break;
2091 }
2092 if (LocaleCompare("monitor",option+1) == 0)
2093 {
2094 if (*option == '+')
2095 {
2096 (void) SetImageProgressMonitor(*image,
2097 (MagickProgressMonitor) NULL,(void *) NULL);
2098 break;
2099 }
2100 (void) SetImageProgressMonitor(*image,MonitorProgress,
2101 (void *) NULL);
2102 break;
2103 }
2104 if (LocaleCompare("monochrome",option+1) == 0)
2105 {
cristy6fccee12011-10-20 18:43:18 +00002106 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy018f07f2011-09-04 21:15:19 +00002107 (void) SetImageType(*image,BilevelType,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002108 break;
2109 }
2110 if (LocaleCompare("morphology",option+1) == 0)
2111 {
2112 char
2113 token[MaxTextExtent];
2114
2115 const char
2116 *p;
2117
2118 KernelInfo
2119 *kernel;
2120
2121 MorphologyMethod
2122 method;
2123
2124 ssize_t
2125 iterations;
2126
2127 /*
2128 Morphological Image Operation
2129 */
cristy6fccee12011-10-20 18:43:18 +00002130 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002131 p=argv[i+1];
2132 GetMagickToken(p,&p,token);
cristy28474bf2011-09-11 23:32:52 +00002133 method=(MorphologyMethod) ParseCommandOption(
2134 MagickMorphologyOptions,MagickFalse,token);
anthonydf8ebac2011-04-27 09:03:19 +00002135 iterations=1L;
2136 GetMagickToken(p,&p,token);
2137 if ((*p == ':') || (*p == ','))
2138 GetMagickToken(p,&p,token);
2139 if ((*p != '\0'))
2140 iterations=(ssize_t) StringToLong(p);
2141 kernel=AcquireKernelInfo(argv[i+2]);
2142 if (kernel == (KernelInfo *) NULL)
2143 {
2144 (void) ThrowMagickException(exception,GetMagickModule(),
2145 OptionError,"UnabletoParseKernel","morphology");
2146 status=MagickFalse;
2147 break;
2148 }
cristyf4ad9df2011-07-08 16:49:03 +00002149 mogrify_image=MorphologyImage(*image,method,iterations,kernel,
2150 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002151 kernel=DestroyKernelInfo(kernel);
2152 break;
2153 }
2154 if (LocaleCompare("motion-blur",option+1) == 0)
2155 {
2156 /*
2157 Motion blur image.
2158 */
cristy6fccee12011-10-20 18:43:18 +00002159 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002160 flags=ParseGeometry(argv[i+1],&geometry_info);
2161 if ((flags & SigmaValue) == 0)
2162 geometry_info.sigma=1.0;
cristyf4ad9df2011-07-08 16:49:03 +00002163 mogrify_image=MotionBlurImage(*image,geometry_info.rho,
cristyf7ef0252011-09-09 14:50:06 +00002164 geometry_info.sigma,geometry_info.xi,geometry_info.psi,
2165 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002166 break;
2167 }
2168 break;
2169 }
2170 case 'n':
2171 {
2172 if (LocaleCompare("negate",option+1) == 0)
2173 {
cristy6fccee12011-10-20 18:43:18 +00002174 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy50fbc382011-07-07 02:19:17 +00002175 (void) NegateImage(*image,*option == '+' ? MagickTrue :
cristyb3e7c6c2011-07-24 01:43:55 +00002176 MagickFalse,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002177 break;
2178 }
2179 if (LocaleCompare("noise",option+1) == 0)
2180 {
cristy6fccee12011-10-20 18:43:18 +00002181 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002182 if (*option == '-')
2183 {
cristyf36cbcb2011-09-07 13:28:22 +00002184 flags=ParseGeometry(argv[i+1],&geometry_info);
2185 if ((flags & SigmaValue) == 0)
2186 geometry_info.sigma=geometry_info.rho;
cristyf4ad9df2011-07-08 16:49:03 +00002187 mogrify_image=StatisticImage(*image,NonpeakStatistic,(size_t)
cristyf36cbcb2011-09-07 13:28:22 +00002188 geometry_info.rho,(size_t) geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002189 }
2190 else
2191 {
2192 NoiseType
2193 noise;
2194
2195 noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
2196 MagickFalse,argv[i+1]);
cristy9ed1f812011-10-08 02:00:08 +00002197 mogrify_image=AddNoiseImage(*image,noise,attenuate,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002198 }
2199 break;
2200 }
2201 if (LocaleCompare("normalize",option+1) == 0)
2202 {
cristy6fccee12011-10-20 18:43:18 +00002203 (void) SyncImageSettings(mogrify_info,*image,exception);
cristye23ec9d2011-08-16 18:15:40 +00002204 (void) NormalizeImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002205 break;
2206 }
2207 break;
2208 }
2209 case 'o':
2210 {
2211 if (LocaleCompare("opaque",option+1) == 0)
2212 {
cristy4c08aed2011-07-01 19:47:50 +00002213 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +00002214 target;
2215
cristy6fccee12011-10-20 18:43:18 +00002216 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy269c9412011-10-13 23:41:15 +00002217 (void) QueryColorCompliance(argv[i+1],AllCompliance,&target,
cristy9950d572011-10-01 18:22:35 +00002218 exception);
cristyd42d9952011-07-08 14:21:50 +00002219 (void) OpaquePaintImage(*image,&target,&fill,*option == '-' ?
cristy189e84c2011-08-27 18:08:53 +00002220 MagickFalse : MagickTrue,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002221 break;
2222 }
2223 if (LocaleCompare("ordered-dither",option+1) == 0)
2224 {
cristy6fccee12011-10-20 18:43:18 +00002225 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy13020672011-07-08 02:33:26 +00002226 (void) OrderedPosterizeImage(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +00002227 break;
2228 }
2229 break;
2230 }
2231 case 'p':
2232 {
2233 if (LocaleCompare("paint",option+1) == 0)
2234 {
cristy6fccee12011-10-20 18:43:18 +00002235 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002236 (void) ParseGeometry(argv[i+1],&geometry_info);
cristy14973ba2011-08-27 23:48:07 +00002237 mogrify_image=OilPaintImage(*image,geometry_info.rho,
2238 geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002239 break;
2240 }
2241 if (LocaleCompare("pen",option+1) == 0)
2242 {
2243 if (*option == '+')
2244 {
cristy9950d572011-10-01 18:22:35 +00002245 (void) QueryColorCompliance("none",AllCompliance,
2246 &draw_info->fill,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002247 break;
2248 }
cristy9950d572011-10-01 18:22:35 +00002249 (void) QueryColorCompliance(argv[i+1],AllCompliance,
2250 &draw_info->fill,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002251 break;
2252 }
2253 if (LocaleCompare("pointsize",option+1) == 0)
2254 {
2255 if (*option == '+')
2256 (void) ParseGeometry("12",&geometry_info);
2257 else
2258 (void) ParseGeometry(argv[i+1],&geometry_info);
2259 draw_info->pointsize=geometry_info.rho;
2260 break;
2261 }
2262 if (LocaleCompare("polaroid",option+1) == 0)
2263 {
2264 double
2265 angle;
2266
2267 RandomInfo
2268 *random_info;
2269
2270 /*
2271 Simulate a Polaroid picture.
2272 */
cristy6fccee12011-10-20 18:43:18 +00002273 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002274 random_info=AcquireRandomInfo();
2275 angle=22.5*(GetPseudoRandomValue(random_info)-0.5);
2276 random_info=DestroyRandomInfo(random_info);
2277 if (*option == '-')
2278 {
2279 SetGeometryInfo(&geometry_info);
2280 flags=ParseGeometry(argv[i+1],&geometry_info);
2281 angle=geometry_info.rho;
2282 }
cristy5c4e2582011-09-11 19:21:03 +00002283 mogrify_image=PolaroidImage(*image,draw_info,angle,
cristy28474bf2011-09-11 23:32:52 +00002284 interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002285 break;
2286 }
2287 if (LocaleCompare("posterize",option+1) == 0)
2288 {
2289 /*
2290 Posterize image.
2291 */
cristy6fccee12011-10-20 18:43:18 +00002292 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002293 (void) PosterizeImage(*image,StringToUnsignedLong(argv[i+1]),
cristy018f07f2011-09-04 21:15:19 +00002294 quantize_info->dither,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002295 break;
2296 }
2297 if (LocaleCompare("preview",option+1) == 0)
2298 {
2299 PreviewType
2300 preview_type;
2301
2302 /*
2303 Preview image.
2304 */
cristy6fccee12011-10-20 18:43:18 +00002305 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002306 if (*option == '+')
2307 preview_type=UndefinedPreview;
2308 else
cristy28474bf2011-09-11 23:32:52 +00002309 preview_type=(PreviewType) ParseCommandOption(
2310 MagickPreviewOptions,MagickFalse,argv[i+1]);
anthonydf8ebac2011-04-27 09:03:19 +00002311 mogrify_image=PreviewImage(*image,preview_type,exception);
2312 break;
2313 }
2314 if (LocaleCompare("profile",option+1) == 0)
2315 {
2316 const char
2317 *name;
2318
2319 const StringInfo
2320 *profile;
2321
2322 Image
2323 *profile_image;
2324
2325 ImageInfo
2326 *profile_info;
2327
cristy6fccee12011-10-20 18:43:18 +00002328 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002329 if (*option == '+')
2330 {
2331 /*
2332 Remove a profile from the image.
2333 */
2334 (void) ProfileImage(*image,argv[i+1],(const unsigned char *)
cristy092d71c2011-10-14 18:01:29 +00002335 NULL,0,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002336 break;
2337 }
2338 /*
2339 Associate a profile with the image.
2340 */
2341 profile_info=CloneImageInfo(mogrify_info);
2342 profile=GetImageProfile(*image,"iptc");
2343 if (profile != (StringInfo *) NULL)
2344 profile_info->profile=(void *) CloneStringInfo(profile);
2345 profile_image=GetImageCache(profile_info,argv[i+1],exception);
2346 profile_info=DestroyImageInfo(profile_info);
2347 if (profile_image == (Image *) NULL)
2348 {
2349 StringInfo
2350 *profile;
2351
2352 profile_info=CloneImageInfo(mogrify_info);
2353 (void) CopyMagickString(profile_info->filename,argv[i+1],
2354 MaxTextExtent);
2355 profile=FileToStringInfo(profile_info->filename,~0UL,exception);
2356 if (profile != (StringInfo *) NULL)
2357 {
2358 (void) ProfileImage(*image,profile_info->magick,
2359 GetStringInfoDatum(profile),(size_t)
2360 GetStringInfoLength(profile),MagickFalse);
2361 profile=DestroyStringInfo(profile);
2362 }
2363 profile_info=DestroyImageInfo(profile_info);
2364 break;
2365 }
2366 ResetImageProfileIterator(profile_image);
2367 name=GetNextImageProfile(profile_image);
2368 while (name != (const char *) NULL)
2369 {
2370 profile=GetImageProfile(profile_image,name);
2371 if (profile != (StringInfo *) NULL)
2372 (void) ProfileImage(*image,name,GetStringInfoDatum(profile),
2373 (size_t) GetStringInfoLength(profile),MagickFalse);
2374 name=GetNextImageProfile(profile_image);
2375 }
2376 profile_image=DestroyImage(profile_image);
2377 break;
2378 }
2379 break;
2380 }
2381 case 'q':
2382 {
2383 if (LocaleCompare("quantize",option+1) == 0)
2384 {
2385 if (*option == '+')
2386 {
2387 quantize_info->colorspace=UndefinedColorspace;
2388 break;
2389 }
2390 quantize_info->colorspace=(ColorspaceType) ParseCommandOption(
2391 MagickColorspaceOptions,MagickFalse,argv[i+1]);
2392 break;
2393 }
2394 break;
2395 }
2396 case 'r':
2397 {
2398 if (LocaleCompare("radial-blur",option+1) == 0)
2399 {
2400 /*
2401 Radial blur image.
2402 */
cristy6fccee12011-10-20 18:43:18 +00002403 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy6435bd92011-09-10 02:10:07 +00002404 flags=ParseGeometry(argv[i+1],&geometry_info);
2405 mogrify_image=RadialBlurImage(*image,geometry_info.rho,
2406 geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002407 break;
2408 }
2409 if (LocaleCompare("raise",option+1) == 0)
2410 {
2411 /*
2412 Surround image with a raise of solid color.
2413 */
2414 flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2415 if ((flags & SigmaValue) == 0)
2416 geometry.height=geometry.width;
2417 (void) RaiseImage(*image,&geometry,*option == '-' ? MagickTrue :
cristy6170ac32011-08-28 14:15:37 +00002418 MagickFalse,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002419 break;
2420 }
2421 if (LocaleCompare("random-threshold",option+1) == 0)
2422 {
2423 /*
2424 Threshold image.
2425 */
cristy6fccee12011-10-20 18:43:18 +00002426 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyf4ad9df2011-07-08 16:49:03 +00002427 (void) RandomThresholdImage(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +00002428 break;
2429 }
2430 if (LocaleCompare("recolor",option+1) == 0)
2431 {
2432 KernelInfo
2433 *kernel;
2434
cristy6fccee12011-10-20 18:43:18 +00002435 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002436 kernel=AcquireKernelInfo(argv[i+1]);
2437 if (kernel == (KernelInfo *) NULL)
2438 break;
2439 mogrify_image=ColorMatrixImage(*image,kernel,exception);
2440 kernel=DestroyKernelInfo(kernel);
2441 break;
2442 }
2443 if (LocaleCompare("region",option+1) == 0)
2444 {
cristy6fccee12011-10-20 18:43:18 +00002445 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002446 if (region_image != (Image *) NULL)
2447 {
2448 /*
2449 Composite region.
2450 */
2451 (void) CompositeImage(region_image,region_image->matte !=
cristyf4ad9df2011-07-08 16:49:03 +00002452 MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
cristye941a752011-10-15 01:52:48 +00002453 region_geometry.x,region_geometry.y,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002454 *image=DestroyImage(*image);
2455 *image=region_image;
2456 region_image = (Image *) NULL;
2457 }
2458 if (*option == '+')
2459 break;
2460 /*
2461 Apply transformations to a selected region of the image.
2462 */
cristy3ed852e2009-09-05 21:47:34 +00002463 (void) ParseGravityGeometry(*image,argv[i+1],&region_geometry,
2464 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002465 mogrify_image=CropImage(*image,&region_geometry,exception);
2466 if (mogrify_image == (Image *) NULL)
2467 break;
2468 region_image=(*image);
2469 *image=mogrify_image;
2470 mogrify_image=(Image *) NULL;
2471 break;
cristy3ed852e2009-09-05 21:47:34 +00002472 }
anthonydf8ebac2011-04-27 09:03:19 +00002473 if (LocaleCompare("render",option+1) == 0)
2474 {
cristy6fccee12011-10-20 18:43:18 +00002475 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002476 draw_info->render=(*option == '+') ? MagickTrue : MagickFalse;
2477 break;
2478 }
2479 if (LocaleCompare("remap",option+1) == 0)
2480 {
2481 Image
2482 *remap_image;
cristy3ed852e2009-09-05 21:47:34 +00002483
anthonydf8ebac2011-04-27 09:03:19 +00002484 /*
2485 Transform image colors to match this set of colors.
2486 */
cristy6fccee12011-10-20 18:43:18 +00002487 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002488 if (*option == '+')
2489 break;
2490 remap_image=GetImageCache(mogrify_info,argv[i+1],exception);
2491 if (remap_image == (Image *) NULL)
2492 break;
cristy018f07f2011-09-04 21:15:19 +00002493 (void) RemapImage(quantize_info,*image,remap_image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002494 remap_image=DestroyImage(remap_image);
2495 break;
2496 }
2497 if (LocaleCompare("repage",option+1) == 0)
2498 {
2499 if (*option == '+')
2500 {
2501 (void) ParseAbsoluteGeometry("0x0+0+0",&(*image)->page);
2502 break;
2503 }
2504 (void) ResetImagePage(*image,argv[i+1]);
anthonydf8ebac2011-04-27 09:03:19 +00002505 break;
2506 }
2507 if (LocaleCompare("resample",option+1) == 0)
2508 {
2509 /*
2510 Resample image.
2511 */
cristy6fccee12011-10-20 18:43:18 +00002512 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002513 flags=ParseGeometry(argv[i+1],&geometry_info);
2514 if ((flags & SigmaValue) == 0)
2515 geometry_info.sigma=geometry_info.rho;
2516 mogrify_image=ResampleImage(*image,geometry_info.rho,
2517 geometry_info.sigma,(*image)->filter,(*image)->blur,exception);
2518 break;
2519 }
2520 if (LocaleCompare("resize",option+1) == 0)
2521 {
2522 /*
2523 Resize image.
2524 */
cristy6fccee12011-10-20 18:43:18 +00002525 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002526 (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2527 mogrify_image=ResizeImage(*image,geometry.width,geometry.height,
2528 (*image)->filter,(*image)->blur,exception);
2529 break;
2530 }
2531 if (LocaleCompare("roll",option+1) == 0)
2532 {
2533 /*
2534 Roll image.
2535 */
cristy6fccee12011-10-20 18:43:18 +00002536 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002537 (void) ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2538 mogrify_image=RollImage(*image,geometry.x,geometry.y,exception);
2539 break;
2540 }
2541 if (LocaleCompare("rotate",option+1) == 0)
2542 {
2543 char
2544 *geometry;
2545
2546 /*
2547 Check for conditional image rotation.
2548 */
cristy6fccee12011-10-20 18:43:18 +00002549 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002550 if (strchr(argv[i+1],'>') != (char *) NULL)
2551 if ((*image)->columns <= (*image)->rows)
2552 break;
2553 if (strchr(argv[i+1],'<') != (char *) NULL)
2554 if ((*image)->columns >= (*image)->rows)
2555 break;
2556 /*
2557 Rotate image.
2558 */
2559 geometry=ConstantString(argv[i+1]);
2560 (void) SubstituteString(&geometry,">","");
2561 (void) SubstituteString(&geometry,"<","");
2562 (void) ParseGeometry(geometry,&geometry_info);
2563 geometry=DestroyString(geometry);
2564 mogrify_image=RotateImage(*image,geometry_info.rho,exception);
2565 break;
2566 }
2567 break;
2568 }
2569 case 's':
2570 {
2571 if (LocaleCompare("sample",option+1) == 0)
2572 {
2573 /*
2574 Sample image with pixel replication.
2575 */
cristy6fccee12011-10-20 18:43:18 +00002576 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002577 (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2578 mogrify_image=SampleImage(*image,geometry.width,geometry.height,
2579 exception);
2580 break;
2581 }
2582 if (LocaleCompare("scale",option+1) == 0)
2583 {
2584 /*
2585 Resize image.
2586 */
cristy6fccee12011-10-20 18:43:18 +00002587 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002588 (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2589 mogrify_image=ScaleImage(*image,geometry.width,geometry.height,
2590 exception);
2591 break;
2592 }
2593 if (LocaleCompare("selective-blur",option+1) == 0)
2594 {
2595 /*
2596 Selectively blur pixels within a contrast threshold.
2597 */
cristy6fccee12011-10-20 18:43:18 +00002598 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002599 flags=ParseGeometry(argv[i+1],&geometry_info);
2600 if ((flags & PercentValue) != 0)
2601 geometry_info.xi=(double) QuantumRange*geometry_info.xi/100.0;
cristyf4ad9df2011-07-08 16:49:03 +00002602 mogrify_image=SelectiveBlurImage(*image,geometry_info.rho,
cristy1e7aa312011-09-10 20:01:36 +00002603 geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002604 break;
2605 }
2606 if (LocaleCompare("separate",option+1) == 0)
2607 {
2608 /*
2609 Break channels into separate images.
anthonydf8ebac2011-04-27 09:03:19 +00002610 */
cristy6fccee12011-10-20 18:43:18 +00002611 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy3139dc22011-07-08 00:11:42 +00002612 mogrify_image=SeparateImages(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002613 break;
2614 }
2615 if (LocaleCompare("sepia-tone",option+1) == 0)
2616 {
2617 double
2618 threshold;
2619
2620 /*
2621 Sepia-tone image.
2622 */
cristy6fccee12011-10-20 18:43:18 +00002623 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy9b34e302011-11-05 02:15:45 +00002624 threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+
2625 1.0);
anthonydf8ebac2011-04-27 09:03:19 +00002626 mogrify_image=SepiaToneImage(*image,threshold,exception);
2627 break;
2628 }
2629 if (LocaleCompare("segment",option+1) == 0)
2630 {
2631 /*
2632 Segment image.
2633 */
cristy6fccee12011-10-20 18:43:18 +00002634 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002635 flags=ParseGeometry(argv[i+1],&geometry_info);
2636 if ((flags & SigmaValue) == 0)
2637 geometry_info.sigma=1.0;
2638 (void) SegmentImage(*image,(*image)->colorspace,
cristy018f07f2011-09-04 21:15:19 +00002639 mogrify_info->verbose,geometry_info.rho,geometry_info.sigma,
2640 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002641 break;
2642 }
2643 if (LocaleCompare("set",option+1) == 0)
2644 {
2645 char
2646 *value;
2647
2648 /*
2649 Set image option.
2650 */
2651 if (*option == '+')
2652 {
2653 if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
2654 (void) DeleteImageRegistry(argv[i+1]+9);
2655 else
2656 if (LocaleNCompare(argv[i+1],"option:",7) == 0)
2657 {
2658 (void) DeleteImageOption(mogrify_info,argv[i+1]+7);
2659 (void) DeleteImageArtifact(*image,argv[i+1]+7);
2660 }
2661 else
2662 (void) DeleteImageProperty(*image,argv[i+1]);
2663 break;
2664 }
cristy018f07f2011-09-04 21:15:19 +00002665 value=InterpretImageProperties(mogrify_info,*image,argv[i+2],
2666 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002667 if (value == (char *) NULL)
2668 break;
2669 if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
2670 (void) SetImageRegistry(StringRegistryType,argv[i+1]+9,value,
2671 exception);
2672 else
2673 if (LocaleNCompare(argv[i+1],"option:",7) == 0)
2674 {
2675 (void) SetImageOption(image_info,argv[i+1]+7,value);
2676 (void) SetImageOption(mogrify_info,argv[i+1]+7,value);
2677 (void) SetImageArtifact(*image,argv[i+1]+7,value);
2678 }
2679 else
cristyd15e6592011-10-15 00:13:06 +00002680 (void) SetImageProperty(*image,argv[i+1],value,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002681 value=DestroyString(value);
2682 break;
2683 }
2684 if (LocaleCompare("shade",option+1) == 0)
2685 {
2686 /*
2687 Shade image.
2688 */
cristy6fccee12011-10-20 18:43:18 +00002689 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002690 flags=ParseGeometry(argv[i+1],&geometry_info);
2691 if ((flags & SigmaValue) == 0)
2692 geometry_info.sigma=1.0;
2693 mogrify_image=ShadeImage(*image,(*option == '-') ? MagickTrue :
2694 MagickFalse,geometry_info.rho,geometry_info.sigma,exception);
2695 break;
2696 }
2697 if (LocaleCompare("shadow",option+1) == 0)
2698 {
2699 /*
2700 Shadow image.
2701 */
cristy6fccee12011-10-20 18:43:18 +00002702 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002703 flags=ParseGeometry(argv[i+1],&geometry_info);
2704 if ((flags & SigmaValue) == 0)
2705 geometry_info.sigma=1.0;
2706 if ((flags & XiValue) == 0)
2707 geometry_info.xi=4.0;
2708 if ((flags & PsiValue) == 0)
2709 geometry_info.psi=4.0;
2710 mogrify_image=ShadowImage(*image,geometry_info.rho,
2711 geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t)
2712 ceil(geometry_info.psi-0.5),exception);
2713 break;
2714 }
2715 if (LocaleCompare("sharpen",option+1) == 0)
2716 {
2717 /*
2718 Sharpen image.
2719 */
cristy6fccee12011-10-20 18:43:18 +00002720 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002721 flags=ParseGeometry(argv[i+1],&geometry_info);
2722 if ((flags & SigmaValue) == 0)
2723 geometry_info.sigma=1.0;
cristy05c0c9a2011-09-05 23:16:13 +00002724 if ((flags & XiValue) == 0)
2725 geometry_info.xi=0.0;
cristyf4ad9df2011-07-08 16:49:03 +00002726 mogrify_image=SharpenImage(*image,geometry_info.rho,
cristy05c0c9a2011-09-05 23:16:13 +00002727 geometry_info.sigma,geometry_info.xi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002728 break;
2729 }
2730 if (LocaleCompare("shave",option+1) == 0)
2731 {
2732 /*
2733 Shave the image edges.
2734 */
cristy6fccee12011-10-20 18:43:18 +00002735 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002736 flags=ParsePageGeometry(*image,argv[i+1],&geometry,exception);
2737 mogrify_image=ShaveImage(*image,&geometry,exception);
2738 break;
2739 }
2740 if (LocaleCompare("shear",option+1) == 0)
2741 {
2742 /*
2743 Shear image.
2744 */
cristy6fccee12011-10-20 18:43:18 +00002745 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002746 flags=ParseGeometry(argv[i+1],&geometry_info);
2747 if ((flags & SigmaValue) == 0)
2748 geometry_info.sigma=geometry_info.rho;
2749 mogrify_image=ShearImage(*image,geometry_info.rho,
2750 geometry_info.sigma,exception);
2751 break;
2752 }
2753 if (LocaleCompare("sigmoidal-contrast",option+1) == 0)
2754 {
2755 /*
2756 Sigmoidal non-linearity contrast control.
2757 */
cristy6fccee12011-10-20 18:43:18 +00002758 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002759 flags=ParseGeometry(argv[i+1],&geometry_info);
2760 if ((flags & SigmaValue) == 0)
2761 geometry_info.sigma=(double) QuantumRange/2.0;
2762 if ((flags & PercentValue) != 0)
2763 geometry_info.sigma=(double) QuantumRange*geometry_info.sigma/
2764 100.0;
cristy9ee60942011-07-06 14:54:38 +00002765 (void) SigmoidalContrastImage(*image,(*option == '-') ?
cristy33bd5152011-08-24 01:42:24 +00002766 MagickTrue : MagickFalse,geometry_info.rho,geometry_info.sigma,
2767 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002768 break;
2769 }
2770 if (LocaleCompare("sketch",option+1) == 0)
2771 {
2772 /*
2773 Sketch image.
2774 */
cristy6fccee12011-10-20 18:43:18 +00002775 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002776 flags=ParseGeometry(argv[i+1],&geometry_info);
2777 if ((flags & SigmaValue) == 0)
2778 geometry_info.sigma=1.0;
2779 mogrify_image=SketchImage(*image,geometry_info.rho,
cristyf7ef0252011-09-09 14:50:06 +00002780 geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002781 break;
2782 }
2783 if (LocaleCompare("solarize",option+1) == 0)
2784 {
2785 double
2786 threshold;
2787
cristy6fccee12011-10-20 18:43:18 +00002788 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy9b34e302011-11-05 02:15:45 +00002789 threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+
2790 1.0);
cristy5cbc0162011-08-29 00:36:28 +00002791 (void) SolarizeImage(*image,threshold,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002792 break;
2793 }
2794 if (LocaleCompare("sparse-color",option+1) == 0)
2795 {
2796 SparseColorMethod
2797 method;
2798
2799 char
2800 *arguments;
2801
2802 /*
2803 Sparse Color Interpolated Gradient
2804 */
cristy6fccee12011-10-20 18:43:18 +00002805 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002806 method=(SparseColorMethod) ParseCommandOption(
2807 MagickSparseColorOptions,MagickFalse,argv[i+1]);
cristy018f07f2011-09-04 21:15:19 +00002808 arguments=InterpretImageProperties(mogrify_info,*image,argv[i+2],
2809 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002810 if (arguments == (char *) NULL)
2811 break;
cristy3884f692011-07-08 18:00:18 +00002812 mogrify_image=SparseColorOption(*image,method,arguments,
anthonydf8ebac2011-04-27 09:03:19 +00002813 option[0] == '+' ? MagickTrue : MagickFalse,exception);
2814 arguments=DestroyString(arguments);
2815 break;
2816 }
2817 if (LocaleCompare("splice",option+1) == 0)
2818 {
2819 /*
2820 Splice a solid color into the image.
2821 */
cristy6fccee12011-10-20 18:43:18 +00002822 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002823 (void) ParseGravityGeometry(*image,argv[i+1],&geometry,exception);
2824 mogrify_image=SpliceImage(*image,&geometry,exception);
2825 break;
2826 }
2827 if (LocaleCompare("spread",option+1) == 0)
2828 {
2829 /*
2830 Spread an image.
2831 */
cristy6fccee12011-10-20 18:43:18 +00002832 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002833 (void) ParseGeometry(argv[i+1],&geometry_info);
cristy5c4e2582011-09-11 19:21:03 +00002834 mogrify_image=SpreadImage(*image,geometry_info.rho,
cristy28474bf2011-09-11 23:32:52 +00002835 interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002836 break;
2837 }
2838 if (LocaleCompare("statistic",option+1) == 0)
2839 {
2840 StatisticType
2841 type;
2842
cristy6fccee12011-10-20 18:43:18 +00002843 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002844 type=(StatisticType) ParseCommandOption(MagickStatisticOptions,
2845 MagickFalse,argv[i+1]);
2846 (void) ParseGeometry(argv[i+2],&geometry_info);
cristyf4ad9df2011-07-08 16:49:03 +00002847 mogrify_image=StatisticImage(*image,type,(size_t) geometry_info.rho,
2848 (size_t) geometry_info.sigma,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002849 break;
2850 }
2851 if (LocaleCompare("stretch",option+1) == 0)
2852 {
2853 if (*option == '+')
2854 {
2855 draw_info->stretch=UndefinedStretch;
2856 break;
2857 }
2858 draw_info->stretch=(StretchType) ParseCommandOption(
2859 MagickStretchOptions,MagickFalse,argv[i+1]);
2860 break;
2861 }
2862 if (LocaleCompare("strip",option+1) == 0)
2863 {
2864 /*
2865 Strip image of profiles and comments.
2866 */
cristy6fccee12011-10-20 18:43:18 +00002867 (void) SyncImageSettings(mogrify_info,*image,exception);
cristye941a752011-10-15 01:52:48 +00002868 (void) StripImage(*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002869 break;
2870 }
2871 if (LocaleCompare("stroke",option+1) == 0)
2872 {
2873 ExceptionInfo
2874 *sans;
2875
2876 if (*option == '+')
2877 {
cristy9950d572011-10-01 18:22:35 +00002878 (void) QueryColorCompliance("none",AllCompliance,
2879 &draw_info->stroke,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002880 if (draw_info->stroke_pattern != (Image *) NULL)
2881 draw_info->stroke_pattern=DestroyImage(
2882 draw_info->stroke_pattern);
2883 break;
2884 }
2885 sans=AcquireExceptionInfo();
cristy9950d572011-10-01 18:22:35 +00002886 status=QueryColorCompliance(argv[i+1],AllCompliance,
2887 &draw_info->stroke,sans);
anthonydf8ebac2011-04-27 09:03:19 +00002888 sans=DestroyExceptionInfo(sans);
2889 if (status == MagickFalse)
2890 draw_info->stroke_pattern=GetImageCache(mogrify_info,argv[i+1],
2891 exception);
2892 break;
2893 }
2894 if (LocaleCompare("strokewidth",option+1) == 0)
2895 {
cristy9b34e302011-11-05 02:15:45 +00002896 draw_info->stroke_width=StringToDouble(argv[i+1],(char **) NULL);
anthonydf8ebac2011-04-27 09:03:19 +00002897 break;
2898 }
2899 if (LocaleCompare("style",option+1) == 0)
2900 {
2901 if (*option == '+')
2902 {
2903 draw_info->style=UndefinedStyle;
2904 break;
2905 }
2906 draw_info->style=(StyleType) ParseCommandOption(MagickStyleOptions,
2907 MagickFalse,argv[i+1]);
2908 break;
2909 }
2910 if (LocaleCompare("swirl",option+1) == 0)
2911 {
2912 /*
2913 Swirl image.
2914 */
cristy6fccee12011-10-20 18:43:18 +00002915 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002916 (void) ParseGeometry(argv[i+1],&geometry_info);
cristy76f512e2011-09-12 01:26:56 +00002917 mogrify_image=SwirlImage(*image,geometry_info.rho,
2918 interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002919 break;
2920 }
2921 break;
2922 }
2923 case 't':
2924 {
2925 if (LocaleCompare("threshold",option+1) == 0)
2926 {
2927 double
2928 threshold;
2929
2930 /*
2931 Threshold image.
2932 */
cristy6fccee12011-10-20 18:43:18 +00002933 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002934 if (*option == '+')
anthony247a86d2011-05-03 13:18:18 +00002935 threshold=(double) QuantumRange/2;
anthonydf8ebac2011-04-27 09:03:19 +00002936 else
cristy9b34e302011-11-05 02:15:45 +00002937 threshold=StringToDoubleInterval(argv[i+1],(double) QuantumRange+
2938 1.0);
cristye941a752011-10-15 01:52:48 +00002939 (void) BilevelImage(*image,threshold,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002940 break;
2941 }
2942 if (LocaleCompare("thumbnail",option+1) == 0)
2943 {
2944 /*
2945 Thumbnail image.
2946 */
cristy6fccee12011-10-20 18:43:18 +00002947 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002948 (void) ParseRegionGeometry(*image,argv[i+1],&geometry,exception);
2949 mogrify_image=ThumbnailImage(*image,geometry.width,geometry.height,
2950 exception);
2951 break;
2952 }
2953 if (LocaleCompare("tile",option+1) == 0)
2954 {
2955 if (*option == '+')
2956 {
2957 if (draw_info->fill_pattern != (Image *) NULL)
2958 draw_info->fill_pattern=DestroyImage(draw_info->fill_pattern);
2959 break;
2960 }
2961 draw_info->fill_pattern=GetImageCache(mogrify_info,argv[i+1],
2962 exception);
2963 break;
2964 }
2965 if (LocaleCompare("tint",option+1) == 0)
2966 {
2967 /*
2968 Tint the image.
2969 */
cristy6fccee12011-10-20 18:43:18 +00002970 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy28474bf2011-09-11 23:32:52 +00002971 mogrify_image=TintImage(*image,argv[i+1],&fill,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002972 break;
2973 }
2974 if (LocaleCompare("transform",option+1) == 0)
2975 {
2976 /*
2977 Affine transform image.
2978 */
cristy6fccee12011-10-20 18:43:18 +00002979 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00002980 mogrify_image=AffineTransformImage(*image,&draw_info->affine,
2981 exception);
2982 break;
2983 }
2984 if (LocaleCompare("transparent",option+1) == 0)
2985 {
cristy4c08aed2011-07-01 19:47:50 +00002986 PixelInfo
anthonydf8ebac2011-04-27 09:03:19 +00002987 target;
2988
cristy6fccee12011-10-20 18:43:18 +00002989 (void) SyncImageSettings(mogrify_info,*image,exception);
cristy269c9412011-10-13 23:41:15 +00002990 (void) QueryColorCompliance(argv[i+1],AllCompliance,&target,
cristy9950d572011-10-01 18:22:35 +00002991 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002992 (void) TransparentPaintImage(*image,&target,(Quantum)
cristy189e84c2011-08-27 18:08:53 +00002993 TransparentAlpha,*option == '-' ? MagickFalse : MagickTrue,
cristy82d7af52011-10-16 16:26:41 +00002994 exception);
anthonydf8ebac2011-04-27 09:03:19 +00002995 break;
2996 }
2997 if (LocaleCompare("transpose",option+1) == 0)
2998 {
2999 /*
3000 Transpose image scanlines.
3001 */
cristy6fccee12011-10-20 18:43:18 +00003002 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003003 mogrify_image=TransposeImage(*image,exception);
3004 break;
3005 }
3006 if (LocaleCompare("transverse",option+1) == 0)
3007 {
3008 /*
3009 Transverse image scanlines.
3010 */
cristy6fccee12011-10-20 18:43:18 +00003011 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003012 mogrify_image=TransverseImage(*image,exception);
3013 break;
3014 }
3015 if (LocaleCompare("treedepth",option+1) == 0)
3016 {
3017 quantize_info->tree_depth=StringToUnsignedLong(argv[i+1]);
3018 break;
3019 }
3020 if (LocaleCompare("trim",option+1) == 0)
3021 {
3022 /*
3023 Trim image.
3024 */
cristy6fccee12011-10-20 18:43:18 +00003025 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003026 mogrify_image=TrimImage(*image,exception);
3027 break;
3028 }
3029 if (LocaleCompare("type",option+1) == 0)
3030 {
3031 ImageType
3032 type;
3033
cristy6fccee12011-10-20 18:43:18 +00003034 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003035 if (*option == '+')
3036 type=UndefinedType;
3037 else
3038 type=(ImageType) ParseCommandOption(MagickTypeOptions,MagickFalse,
3039 argv[i+1]);
3040 (*image)->type=UndefinedType;
cristy018f07f2011-09-04 21:15:19 +00003041 (void) SetImageType(*image,type,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003042 break;
3043 }
3044 break;
3045 }
3046 case 'u':
3047 {
3048 if (LocaleCompare("undercolor",option+1) == 0)
3049 {
cristy9950d572011-10-01 18:22:35 +00003050 (void) QueryColorCompliance(argv[i+1],AllCompliance,
3051 &draw_info->undercolor,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003052 break;
3053 }
3054 if (LocaleCompare("unique",option+1) == 0)
3055 {
3056 if (*option == '+')
3057 {
3058 (void) DeleteImageArtifact(*image,"identify:unique-colors");
3059 break;
3060 }
3061 (void) SetImageArtifact(*image,"identify:unique-colors","true");
3062 (void) SetImageArtifact(*image,"verbose","true");
3063 break;
3064 }
3065 if (LocaleCompare("unique-colors",option+1) == 0)
3066 {
3067 /*
3068 Unique image colors.
3069 */
cristy6fccee12011-10-20 18:43:18 +00003070 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003071 mogrify_image=UniqueImageColors(*image,exception);
3072 break;
3073 }
3074 if (LocaleCompare("unsharp",option+1) == 0)
3075 {
3076 /*
3077 Unsharp mask image.
3078 */
cristy6fccee12011-10-20 18:43:18 +00003079 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003080 flags=ParseGeometry(argv[i+1],&geometry_info);
3081 if ((flags & SigmaValue) == 0)
3082 geometry_info.sigma=1.0;
3083 if ((flags & XiValue) == 0)
3084 geometry_info.xi=1.0;
3085 if ((flags & PsiValue) == 0)
3086 geometry_info.psi=0.05;
cristyf4ad9df2011-07-08 16:49:03 +00003087 mogrify_image=UnsharpMaskImage(*image,geometry_info.rho,
3088 geometry_info.sigma,geometry_info.xi,geometry_info.psi,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003089 break;
3090 }
3091 break;
3092 }
3093 case 'v':
3094 {
3095 if (LocaleCompare("verbose",option+1) == 0)
3096 {
3097 (void) SetImageArtifact(*image,option+1,
3098 *option == '+' ? "false" : "true");
3099 break;
3100 }
3101 if (LocaleCompare("vignette",option+1) == 0)
3102 {
3103 /*
3104 Vignette image.
3105 */
cristy6fccee12011-10-20 18:43:18 +00003106 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003107 flags=ParseGeometry(argv[i+1],&geometry_info);
3108 if ((flags & SigmaValue) == 0)
3109 geometry_info.sigma=1.0;
3110 if ((flags & XiValue) == 0)
3111 geometry_info.xi=0.1*(*image)->columns;
3112 if ((flags & PsiValue) == 0)
3113 geometry_info.psi=0.1*(*image)->rows;
3114 mogrify_image=VignetteImage(*image,geometry_info.rho,
3115 geometry_info.sigma,(ssize_t) ceil(geometry_info.xi-0.5),(ssize_t)
3116 ceil(geometry_info.psi-0.5),exception);
3117 break;
3118 }
3119 if (LocaleCompare("virtual-pixel",option+1) == 0)
3120 {
3121 if (*option == '+')
3122 {
3123 (void) SetImageVirtualPixelMethod(*image,
3124 UndefinedVirtualPixelMethod);
3125 break;
3126 }
3127 (void) SetImageVirtualPixelMethod(*image,(VirtualPixelMethod)
3128 ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
3129 argv[i+1]));
3130 break;
3131 }
3132 break;
3133 }
3134 case 'w':
3135 {
3136 if (LocaleCompare("wave",option+1) == 0)
3137 {
3138 /*
3139 Wave image.
3140 */
cristy6fccee12011-10-20 18:43:18 +00003141 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003142 flags=ParseGeometry(argv[i+1],&geometry_info);
3143 if ((flags & SigmaValue) == 0)
3144 geometry_info.sigma=1.0;
3145 mogrify_image=WaveImage(*image,geometry_info.rho,
cristy28474bf2011-09-11 23:32:52 +00003146 geometry_info.sigma,interpolate_method,exception);
anthonydf8ebac2011-04-27 09:03:19 +00003147 break;
3148 }
3149 if (LocaleCompare("weight",option+1) == 0)
3150 {
3151 draw_info->weight=StringToUnsignedLong(argv[i+1]);
3152 if (LocaleCompare(argv[i+1],"all") == 0)
3153 draw_info->weight=0;
3154 if (LocaleCompare(argv[i+1],"bold") == 0)
3155 draw_info->weight=700;
3156 if (LocaleCompare(argv[i+1],"bolder") == 0)
3157 if (draw_info->weight <= 800)
3158 draw_info->weight+=100;
3159 if (LocaleCompare(argv[i+1],"lighter") == 0)
3160 if (draw_info->weight >= 100)
3161 draw_info->weight-=100;
3162 if (LocaleCompare(argv[i+1],"normal") == 0)
3163 draw_info->weight=400;
3164 break;
3165 }
3166 if (LocaleCompare("white-threshold",option+1) == 0)
3167 {
3168 /*
3169 White threshold image.
3170 */
cristy6fccee12011-10-20 18:43:18 +00003171 (void) SyncImageSettings(mogrify_info,*image,exception);
cristyf4ad9df2011-07-08 16:49:03 +00003172 (void) WhiteThresholdImage(*image,argv[i+1],exception);
anthonydf8ebac2011-04-27 09:03:19 +00003173 break;
3174 }
3175 break;
3176 }
3177 default:
3178 break;
3179 }
3180 /*
3181 Replace current image with any image that was generated
3182 */
3183 if (mogrify_image != (Image *) NULL)
3184 ReplaceImageInListReturnLast(image,mogrify_image);
cristy3ed852e2009-09-05 21:47:34 +00003185 i+=count;
3186 }
3187 if (region_image != (Image *) NULL)
3188 {
anthonydf8ebac2011-04-27 09:03:19 +00003189 /*
3190 Composite transformed region onto image.
3191 */
cristy6fccee12011-10-20 18:43:18 +00003192 (void) SyncImageSettings(mogrify_info,*image,exception);
anthonya129f702011-04-14 01:08:48 +00003193 (void) CompositeImage(region_image,region_image->matte !=
cristyf4ad9df2011-07-08 16:49:03 +00003194 MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
cristye941a752011-10-15 01:52:48 +00003195 region_geometry.x,region_geometry.y,exception);
cristy3ed852e2009-09-05 21:47:34 +00003196 *image=DestroyImage(*image);
3197 *image=region_image;
anthonye9c27192011-03-27 08:07:06 +00003198 region_image = (Image *) NULL;
cristy3ed852e2009-09-05 21:47:34 +00003199 }
3200 /*
3201 Free resources.
3202 */
anthonydf8ebac2011-04-27 09:03:19 +00003203 quantize_info=DestroyQuantizeInfo(quantize_info);
3204 draw_info=DestroyDrawInfo(draw_info);
cristy6b3da3a2010-06-20 02:21:46 +00003205 mogrify_info=DestroyImageInfo(mogrify_info);
cristy82d7af52011-10-16 16:26:41 +00003206 status=(MagickStatusType) (exception->severity == UndefinedException ? 1 : 0);
cristy72988482011-03-29 16:34:38 +00003207 return(status == 0 ? MagickFalse : MagickTrue);
cristy3ed852e2009-09-05 21:47:34 +00003208}
3209
3210/*
3211%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3212% %
3213% %
3214% %
cristy5063d812010-10-19 16:28:10 +00003215+ M o g r i f y I m a g e C o m m a n d %
cristy3ed852e2009-09-05 21:47:34 +00003216% %
3217% %
3218% %
3219%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3220%
3221% MogrifyImageCommand() transforms an image or a sequence of images. These
3222% transforms include image scaling, image rotation, color reduction, and
3223% others. The transmogrified image overwrites the original image.
3224%
3225% The format of the MogrifyImageCommand method is:
3226%
3227% MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,int argc,
3228% const char **argv,char **metadata,ExceptionInfo *exception)
3229%
3230% A description of each parameter follows:
3231%
3232% o image_info: the image info.
3233%
3234% o argc: the number of elements in the argument vector.
3235%
3236% o argv: A text array containing the command line arguments.
3237%
3238% o metadata: any metadata is returned here.
3239%
3240% o exception: return any errors or warnings in this structure.
3241%
3242*/
3243
3244static MagickBooleanType MogrifyUsage(void)
3245{
3246 static const char
3247 *miscellaneous[]=
3248 {
3249 "-debug events display copious debugging information",
3250 "-help print program options",
3251 "-list type print a list of supported option arguments",
3252 "-log format format of debugging information",
3253 "-version print version information",
3254 (char *) NULL
3255 },
3256 *operators[]=
3257 {
3258 "-adaptive-blur geometry",
3259 " adaptively blur pixels; decrease effect near edges",
3260 "-adaptive-resize geometry",
3261 " adaptively resize image using 'mesh' interpolation",
3262 "-adaptive-sharpen geometry",
3263 " adaptively sharpen pixels; increase effect near edges",
3264 "-alpha option on, activate, off, deactivate, set, opaque, copy",
3265 " transparent, extract, background, or shape",
3266 "-annotate geometry text",
3267 " annotate the image with text",
3268 "-auto-gamma automagically adjust gamma level of image",
3269 "-auto-level automagically adjust color levels of image",
3270 "-auto-orient automagically orient (rotate) image",
3271 "-bench iterations measure performance",
3272 "-black-threshold value",
3273 " force all pixels below the threshold into black",
3274 "-blue-shift simulate a scene at nighttime in the moonlight",
3275 "-blur geometry reduce image noise and reduce detail levels",
3276 "-border geometry surround image with a border of color",
3277 "-bordercolor color border color",
cristya28d6b82010-01-11 20:03:47 +00003278 "-brightness-contrast geometry",
3279 " improve brightness / contrast of the image",
cristy3ed852e2009-09-05 21:47:34 +00003280 "-cdl filename color correct with a color decision list",
cristy05c0c9a2011-09-05 23:16:13 +00003281 "-charcoal geometry simulate a charcoal drawing",
cristy3ed852e2009-09-05 21:47:34 +00003282 "-chop geometry remove pixels from the image interior",
cristyecb0c6d2009-09-25 16:50:09 +00003283 "-clamp restrict pixel range from 0 to the quantum depth",
cristycee97112010-05-28 00:44:52 +00003284 "-clip clip along the first path from the 8BIM profile",
cristy3ed852e2009-09-05 21:47:34 +00003285 "-clip-mask filename associate a clip mask with the image",
cristycee97112010-05-28 00:44:52 +00003286 "-clip-path id clip along a named path from the 8BIM profile",
cristy3ed852e2009-09-05 21:47:34 +00003287 "-colorize value colorize the image with the fill color",
cristye6365592010-04-02 17:31:23 +00003288 "-color-matrix matrix apply color correction to the image",
cristy3ed852e2009-09-05 21:47:34 +00003289 "-contrast enhance or reduce the image contrast",
3290 "-contrast-stretch geometry",
3291 " improve contrast by `stretching' the intensity range",
3292 "-convolve coefficients",
3293 " apply a convolution kernel to the image",
3294 "-cycle amount cycle the image colormap",
3295 "-decipher filename convert cipher pixels to plain pixels",
3296 "-deskew threshold straighten an image",
3297 "-despeckle reduce the speckles within an image",
3298 "-distort method args",
3299 " distort images according to given method ad args",
3300 "-draw string annotate the image with a graphic primitive",
3301 "-edge radius apply a filter to detect edges in the image",
3302 "-encipher filename convert plain pixels to cipher pixels",
3303 "-emboss radius emboss an image",
3304 "-enhance apply a digital filter to enhance a noisy image",
3305 "-equalize perform histogram equalization to an image",
3306 "-evaluate operator value",
cristyd18ae7c2010-03-07 17:39:52 +00003307 " evaluate an arithmetic, relational, or logical expression",
cristy3ed852e2009-09-05 21:47:34 +00003308 "-extent geometry set the image size",
3309 "-extract geometry extract area from image",
3310 "-fft implements the discrete Fourier transform (DFT)",
3311 "-flip flip image vertically",
3312 "-floodfill geometry color",
3313 " floodfill the image with color",
3314 "-flop flop image horizontally",
3315 "-frame geometry surround image with an ornamental border",
cristyc2b730e2009-11-24 14:32:09 +00003316 "-function name parameters",
cristy3ed852e2009-09-05 21:47:34 +00003317 " apply function over image values",
3318 "-gamma value level of gamma correction",
3319 "-gaussian-blur geometry",
3320 " reduce image noise and reduce detail levels",
cristy901f09d2009-10-16 22:56:10 +00003321 "-geometry geometry preferred size or location of the image",
cristy3ed852e2009-09-05 21:47:34 +00003322 "-identify identify the format and characteristics of the image",
3323 "-ift implements the inverse discrete Fourier transform (DFT)",
3324 "-implode amount implode image pixels about the center",
3325 "-lat geometry local adaptive thresholding",
3326 "-layers method optimize, merge, or compare image layers",
3327 "-level value adjust the level of image contrast",
3328 "-level-colors color,color",
cristyee0f8d72009-09-19 00:58:29 +00003329 " level image with the given colors",
cristy3ed852e2009-09-05 21:47:34 +00003330 "-linear-stretch geometry",
3331 " improve contrast by `stretching with saturation'",
3332 "-liquid-rescale geometry",
3333 " rescale image with seam-carving",
cristy3c741502011-04-01 23:21:16 +00003334 "-median geometry apply a median filter to the image",
glennrp30d2dc62011-06-25 03:17:16 +00003335 "-mode geometry make each pixel the 'predominant color' of the neighborhood",
cristy3ed852e2009-09-05 21:47:34 +00003336 "-modulate value vary the brightness, saturation, and hue",
3337 "-monochrome transform image to black and white",
cristy7c1b9fd2010-02-02 14:36:00 +00003338 "-morphology method kernel",
anthony29188a82010-01-22 10:12:34 +00003339 " apply a morphology method to the image",
cristy3ed852e2009-09-05 21:47:34 +00003340 "-motion-blur geometry",
3341 " simulate motion blur",
3342 "-negate replace every pixel with its complementary color ",
cristy3c741502011-04-01 23:21:16 +00003343 "-noise geometry add or reduce noise in an image",
cristy3ed852e2009-09-05 21:47:34 +00003344 "-normalize transform image to span the full range of colors",
3345 "-opaque color change this color to the fill color",
3346 "-ordered-dither NxN",
3347 " add a noise pattern to the image with specific",
3348 " amplitudes",
3349 "-paint radius simulate an oil painting",
3350 "-polaroid angle simulate a Polaroid picture",
3351 "-posterize levels reduce the image to a limited number of color levels",
cristy3ed852e2009-09-05 21:47:34 +00003352 "-profile filename add, delete, or apply an image profile",
3353 "-quantize colorspace reduce colors in this colorspace",
3354 "-radial-blur angle radial blur the image",
3355 "-raise value lighten/darken image edges to create a 3-D effect",
3356 "-random-threshold low,high",
3357 " random threshold the image",
cristy3ed852e2009-09-05 21:47:34 +00003358 "-region geometry apply options to a portion of the image",
3359 "-render render vector graphics",
3360 "-repage geometry size and location of an image canvas",
3361 "-resample geometry change the resolution of an image",
3362 "-resize geometry resize the image",
3363 "-roll geometry roll an image vertically or horizontally",
3364 "-rotate degrees apply Paeth rotation to the image",
3365 "-sample geometry scale image with pixel sampling",
3366 "-scale geometry scale the image",
3367 "-segment values segment an image",
3368 "-selective-blur geometry",
3369 " selectively blur pixels within a contrast threshold",
3370 "-sepia-tone threshold",
3371 " simulate a sepia-toned photo",
3372 "-set property value set an image property",
3373 "-shade degrees shade the image using a distant light source",
3374 "-shadow geometry simulate an image shadow",
3375 "-sharpen geometry sharpen the image",
3376 "-shave geometry shave pixels from the image edges",
cristycee97112010-05-28 00:44:52 +00003377 "-shear geometry slide one edge of the image along the X or Y axis",
cristy3ed852e2009-09-05 21:47:34 +00003378 "-sigmoidal-contrast geometry",
3379 " increase the contrast without saturating highlights or shadows",
3380 "-sketch geometry simulate a pencil sketch",
3381 "-solarize threshold negate all pixels above the threshold level",
3382 "-sparse-color method args",
3383 " fill in a image based on a few color points",
3384 "-splice geometry splice the background color into the image",
3385 "-spread radius displace image pixels by a random amount",
cristy0834d642011-03-18 18:26:08 +00003386 "-statistic type radius",
3387 " replace each pixel with corresponding statistic from the neighborhood",
cristy3ed852e2009-09-05 21:47:34 +00003388 "-strip strip image of all profiles and comments",
3389 "-swirl degrees swirl image pixels about the center",
3390 "-threshold value threshold the image",
3391 "-thumbnail geometry create a thumbnail of the image",
3392 "-tile filename tile image when filling a graphic primitive",
3393 "-tint value tint the image with the fill color",
3394 "-transform affine transform image",
3395 "-transparent color make this color transparent within the image",
3396 "-transpose flip image vertically and rotate 90 degrees",
3397 "-transverse flop image horizontally and rotate 270 degrees",
3398 "-trim trim image edges",
3399 "-type type image type",
3400 "-unique-colors discard all but one of any pixel color",
3401 "-unsharp geometry sharpen the image",
3402 "-vignette geometry soften the edges of the image in vignette style",
cristycee97112010-05-28 00:44:52 +00003403 "-wave geometry alter an image along a sine wave",
cristy3ed852e2009-09-05 21:47:34 +00003404 "-white-threshold value",
3405 " force all pixels above the threshold into white",
3406 (char *) NULL
3407 },
3408 *sequence_operators[]=
3409 {
cristy4285d782011-02-09 20:12:28 +00003410 "-append append an image sequence",
cristy3ed852e2009-09-05 21:47:34 +00003411 "-clut apply a color lookup table to the image",
3412 "-coalesce merge a sequence of images",
3413 "-combine combine a sequence of images",
3414 "-composite composite image",
3415 "-crop geometry cut out a rectangular region of the image",
3416 "-deconstruct break down an image sequence into constituent parts",
cristyd18ae7c2010-03-07 17:39:52 +00003417 "-evaluate-sequence operator",
3418 " evaluate an arithmetic, relational, or logical expression",
cristy3ed852e2009-09-05 21:47:34 +00003419 "-flatten flatten a sequence of images",
3420 "-fx expression apply mathematical expression to an image channel(s)",
3421 "-hald-clut apply a Hald color lookup table to the image",
3422 "-morph value morph an image sequence",
3423 "-mosaic create a mosaic from an image sequence",
cristy36b94822010-05-20 12:48:16 +00003424 "-print string interpret string and print to console",
cristy3ed852e2009-09-05 21:47:34 +00003425 "-process arguments process the image with a custom image filter",
cristy3ed852e2009-09-05 21:47:34 +00003426 "-separate separate an image channel into a grayscale image",
cristy4285d782011-02-09 20:12:28 +00003427 "-smush geometry smush an image sequence together",
cristy3ed852e2009-09-05 21:47:34 +00003428 "-write filename write images to this file",
3429 (char *) NULL
3430 },
3431 *settings[]=
3432 {
3433 "-adjoin join images into a single multi-image file",
3434 "-affine matrix affine transform matrix",
3435 "-alpha option activate, deactivate, reset, or set the alpha channel",
3436 "-antialias remove pixel-aliasing",
3437 "-authenticate password",
3438 " decipher image with this password",
3439 "-attenuate value lessen (or intensify) when adding noise to an image",
3440 "-background color background color",
3441 "-bias value add bias when convolving an image",
3442 "-black-point-compensation",
3443 " use black point compensation",
3444 "-blue-primary point chromaticity blue primary point",
3445 "-bordercolor color border color",
3446 "-caption string assign a caption to an image",
3447 "-channel type apply option to select image channels",
3448 "-colors value preferred number of colors in the image",
3449 "-colorspace type alternate image colorspace",
3450 "-comment string annotate image with comment",
3451 "-compose operator set image composite operator",
3452 "-compress type type of pixel compression when writing the image",
3453 "-define format:option",
3454 " define one or more image format options",
3455 "-delay value display the next image after pausing",
3456 "-density geometry horizontal and vertical density of the image",
3457 "-depth value image depth",
cristyc9b12952010-03-28 01:12:28 +00003458 "-direction type render text right-to-left or left-to-right",
cristy3ed852e2009-09-05 21:47:34 +00003459 "-display server get image or font from this X server",
3460 "-dispose method layer disposal method",
3461 "-dither method apply error diffusion to image",
3462 "-encoding type text encoding type",
3463 "-endian type endianness (MSB or LSB) of the image",
3464 "-family name render text with this font family",
3465 "-fill color color to use when filling a graphic primitive",
3466 "-filter type use this filter when resizing an image",
3467 "-font name render text with this font",
3468 "-format \"string\" output formatted image characteristics",
3469 "-fuzz distance colors within this distance are considered equal",
3470 "-gravity type horizontal and vertical text placement",
3471 "-green-primary point chromaticity green primary point",
3472 "-intent type type of rendering intent when managing the image color",
3473 "-interlace type type of image interlacing scheme",
cristyb32b90a2009-09-07 21:45:48 +00003474 "-interline-spacing value",
3475 " set the space between two text lines",
cristy3ed852e2009-09-05 21:47:34 +00003476 "-interpolate method pixel color interpolation method",
3477 "-interword-spacing value",
3478 " set the space between two words",
3479 "-kerning value set the space between two letters",
3480 "-label string assign a label to an image",
3481 "-limit type value pixel cache resource limit",
3482 "-loop iterations add Netscape loop extension to your GIF animation",
3483 "-mask filename associate a mask with the image",
3484 "-mattecolor color frame color",
3485 "-monitor monitor progress",
3486 "-orient type image orientation",
3487 "-page geometry size and location of an image canvas (setting)",
3488 "-ping efficiently determine image attributes",
3489 "-pointsize value font point size",
cristy7c1b9fd2010-02-02 14:36:00 +00003490 "-precision value maximum number of significant digits to print",
cristy3ed852e2009-09-05 21:47:34 +00003491 "-preview type image preview type",
3492 "-quality value JPEG/MIFF/PNG compression level",
3493 "-quiet suppress all warning messages",
3494 "-red-primary point chromaticity red primary point",
3495 "-regard-warnings pay attention to warning messages",
3496 "-remap filename transform image colors to match this set of colors",
3497 "-respect-parentheses settings remain in effect until parenthesis boundary",
3498 "-sampling-factor geometry",
3499 " horizontal and vertical sampling factor",
3500 "-scene value image scene number",
3501 "-seed value seed a new sequence of pseudo-random numbers",
3502 "-size geometry width and height of image",
3503 "-stretch type render text with this font stretch",
3504 "-stroke color graphic primitive stroke color",
3505 "-strokewidth value graphic primitive stroke width",
3506 "-style type render text with this font style",
cristyd9a29192010-10-16 16:49:53 +00003507 "-synchronize synchronize image to storage device",
3508 "-taint declare the image as modified",
cristy3ed852e2009-09-05 21:47:34 +00003509 "-texture filename name of texture to tile onto the image background",
3510 "-tile-offset geometry",
3511 " tile offset",
3512 "-treedepth value color tree depth",
3513 "-transparent-color color",
3514 " transparent color",
3515 "-undercolor color annotation bounding box color",
3516 "-units type the units of image resolution",
3517 "-verbose print detailed information about the image",
3518 "-view FlashPix viewing transforms",
3519 "-virtual-pixel method",
3520 " virtual pixel access method",
3521 "-weight type render text with this font weight",
3522 "-white-point point chromaticity white point",
3523 (char *) NULL
3524 },
3525 *stack_operators[]=
3526 {
anthonyb69c4b32011-03-23 04:37:44 +00003527 "-delete indexes delete the image from the image sequence",
3528 "-duplicate count,indexes",
cristyecb10ff2011-03-22 13:14:03 +00003529 " duplicate an image one or more times",
cristy3ed852e2009-09-05 21:47:34 +00003530 "-insert index insert last image into the image sequence",
anthony9bd15492011-03-23 02:11:13 +00003531 "-reverse reverse image sequence",
cristy3ed852e2009-09-05 21:47:34 +00003532 "-swap indexes swap two images in the image sequence",
3533 (char *) NULL
3534 };
3535
3536 const char
3537 **p;
3538
cristybb503372010-05-27 20:51:26 +00003539 (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
cristy610b2e22009-10-22 14:59:43 +00003540 (void) printf("Copyright: %s\n",GetMagickCopyright());
3541 (void) printf("Features: %s\n\n",GetMagickFeatures());
cristy3ed852e2009-09-05 21:47:34 +00003542 (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n",
3543 GetClientName());
3544 (void) printf("\nImage Settings:\n");
3545 for (p=settings; *p != (char *) NULL; p++)
3546 (void) printf(" %s\n",*p);
3547 (void) printf("\nImage Operators:\n");
3548 for (p=operators; *p != (char *) NULL; p++)
3549 (void) printf(" %s\n",*p);
3550 (void) printf("\nImage Sequence Operators:\n");
3551 for (p=sequence_operators; *p != (char *) NULL; p++)
3552 (void) printf(" %s\n",*p);
3553 (void) printf("\nImage Stack Operators:\n");
3554 for (p=stack_operators; *p != (char *) NULL; p++)
3555 (void) printf(" %s\n",*p);
3556 (void) printf("\nMiscellaneous Options:\n");
3557 for (p=miscellaneous; *p != (char *) NULL; p++)
3558 (void) printf(" %s\n",*p);
3559 (void) printf(
3560 "\nBy default, the image format of `file' is determined by its magic\n");
3561 (void) printf(
3562 "number. To specify a particular image format, precede the filename\n");
3563 (void) printf(
3564 "with an image format name and a colon (i.e. ps:image) or specify the\n");
3565 (void) printf(
3566 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
3567 (void) printf("'-' for standard input or output.\n");
3568 return(MagickFalse);
3569}
3570
3571WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
3572 int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
3573{
3574#define DestroyMogrify() \
3575{ \
3576 if (format != (char *) NULL) \
3577 format=DestroyString(format); \
3578 if (path != (char *) NULL) \
3579 path=DestroyString(path); \
3580 DestroyImageStack(); \
cristybb503372010-05-27 20:51:26 +00003581 for (i=0; i < (ssize_t) argc; i++) \
cristy3ed852e2009-09-05 21:47:34 +00003582 argv[i]=DestroyString(argv[i]); \
3583 argv=(char **) RelinquishMagickMemory(argv); \
3584}
3585#define ThrowMogrifyException(asperity,tag,option) \
3586{ \
3587 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
3588 option); \
3589 DestroyMogrify(); \
3590 return(MagickFalse); \
3591}
3592#define ThrowMogrifyInvalidArgumentException(option,argument) \
3593{ \
3594 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
3595 "InvalidArgument","`%s': %s",argument,option); \
3596 DestroyMogrify(); \
3597 return(MagickFalse); \
3598}
3599
3600 char
3601 *format,
3602 *option,
3603 *path;
3604
3605 Image
3606 *image;
3607
3608 ImageStack
3609 image_stack[MaxImageStackDepth+1];
3610
cristy3ed852e2009-09-05 21:47:34 +00003611 MagickBooleanType
3612 global_colormap;
3613
3614 MagickBooleanType
3615 fire,
cristyebbcfea2011-02-25 02:43:54 +00003616 pend,
3617 respect_parenthesis;
cristy3ed852e2009-09-05 21:47:34 +00003618
3619 MagickStatusType
3620 status;
3621
cristyebbcfea2011-02-25 02:43:54 +00003622 register ssize_t
3623 i;
3624
3625 ssize_t
3626 j,
3627 k;
3628
cristy3ed852e2009-09-05 21:47:34 +00003629 /*
3630 Set defaults.
3631 */
3632 assert(image_info != (ImageInfo *) NULL);
3633 assert(image_info->signature == MagickSignature);
3634 if (image_info->debug != MagickFalse)
3635 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
3636 assert(exception != (ExceptionInfo *) NULL);
3637 if (argc == 2)
3638 {
3639 option=argv[1];
3640 if ((LocaleCompare("version",option+1) == 0) ||
3641 (LocaleCompare("-version",option+1) == 0))
3642 {
cristyb51dff52011-05-19 16:55:47 +00003643 (void) FormatLocaleFile(stdout,"Version: %s\n",
cristybb503372010-05-27 20:51:26 +00003644 GetMagickVersion((size_t *) NULL));
cristy1e604812011-05-19 18:07:50 +00003645 (void) FormatLocaleFile(stdout,"Copyright: %s\n",
3646 GetMagickCopyright());
3647 (void) FormatLocaleFile(stdout,"Features: %s\n\n",
3648 GetMagickFeatures());
cristy3ed852e2009-09-05 21:47:34 +00003649 return(MagickFalse);
3650 }
3651 }
3652 if (argc < 2)
cristy13e61a12010-02-04 20:19:00 +00003653 return(MogrifyUsage());
cristy3ed852e2009-09-05 21:47:34 +00003654 format=(char *) NULL;
3655 path=(char *) NULL;
3656 global_colormap=MagickFalse;
3657 k=0;
3658 j=1;
3659 NewImageStack();
3660 option=(char *) NULL;
3661 pend=MagickFalse;
cristyebbcfea2011-02-25 02:43:54 +00003662 respect_parenthesis=MagickFalse;
cristy3ed852e2009-09-05 21:47:34 +00003663 status=MagickTrue;
3664 /*
3665 Parse command line.
3666 */
3667 ReadCommandlLine(argc,&argv);
3668 status=ExpandFilenames(&argc,&argv);
3669 if (status == MagickFalse)
3670 ThrowMogrifyException(ResourceLimitError,"MemoryAllocationFailed",
3671 GetExceptionMessage(errno));
cristybb503372010-05-27 20:51:26 +00003672 for (i=1; i < (ssize_t) argc; i++)
cristy3ed852e2009-09-05 21:47:34 +00003673 {
3674 option=argv[i];
3675 if (LocaleCompare(option,"(") == 0)
3676 {
3677 FireImageStack(MagickFalse,MagickTrue,pend);
3678 if (k == MaxImageStackDepth)
3679 ThrowMogrifyException(OptionError,"ParenthesisNestedTooDeeply",
3680 option);
3681 PushImageStack();
3682 continue;
3683 }
3684 if (LocaleCompare(option,")") == 0)
3685 {
3686 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
3687 if (k == 0)
3688 ThrowMogrifyException(OptionError,"UnableToParseExpression",option);
3689 PopImageStack();
3690 continue;
3691 }
cristy042ee782011-04-22 18:48:30 +00003692 if (IsCommandOption(option) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +00003693 {
3694 char
3695 backup_filename[MaxTextExtent],
3696 *filename;
3697
3698 Image
3699 *images;
3700
3701 /*
3702 Option is a file name: begin by reading image from specified file.
3703 */
3704 FireImageStack(MagickFalse,MagickFalse,pend);
3705 filename=argv[i];
cristycee97112010-05-28 00:44:52 +00003706 if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
cristy3ed852e2009-09-05 21:47:34 +00003707 filename=argv[++i];
3708 (void) CopyMagickString(image_info->filename,filename,MaxTextExtent);
3709 images=ReadImages(image_info,exception);
3710 status&=(images != (Image *) NULL) &&
3711 (exception->severity < ErrorException);
3712 if (images == (Image *) NULL)
3713 continue;
cristydaa76602010-06-30 13:05:11 +00003714 if (format != (char *) NULL)
3715 (void) CopyMagickString(images->filename,images->magick_filename,
3716 MaxTextExtent);
cristy3ed852e2009-09-05 21:47:34 +00003717 if (path != (char *) NULL)
3718 {
3719 GetPathComponent(option,TailPath,filename);
cristyb51dff52011-05-19 16:55:47 +00003720 (void) FormatLocaleString(images->filename,MaxTextExtent,"%s%c%s",
cristy3ed852e2009-09-05 21:47:34 +00003721 path,*DirectorySeparator,filename);
3722 }
3723 if (format != (char *) NULL)
cristydaa76602010-06-30 13:05:11 +00003724 AppendImageFormat(format,images->filename);
cristy3ed852e2009-09-05 21:47:34 +00003725 AppendImageStack(images);
3726 FinalizeImageSettings(image_info,image,MagickFalse);
3727 if (global_colormap != MagickFalse)
3728 {
3729 QuantizeInfo
3730 *quantize_info;
3731
3732 quantize_info=AcquireQuantizeInfo(image_info);
cristy018f07f2011-09-04 21:15:19 +00003733 (void) RemapImages(quantize_info,images,(Image *) NULL,exception);
cristy3ed852e2009-09-05 21:47:34 +00003734 quantize_info=DestroyQuantizeInfo(quantize_info);
3735 }
3736 *backup_filename='\0';
3737 if ((LocaleCompare(image->filename,"-") != 0) &&
3738 (IsPathWritable(image->filename) != MagickFalse))
3739 {
cristybb503372010-05-27 20:51:26 +00003740 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +00003741 i;
3742
3743 /*
3744 Rename image file as backup.
3745 */
3746 (void) CopyMagickString(backup_filename,image->filename,
3747 MaxTextExtent);
3748 for (i=0; i < 6; i++)
3749 {
3750 (void) ConcatenateMagickString(backup_filename,"~",MaxTextExtent);
3751 if (IsPathAccessible(backup_filename) == MagickFalse)
3752 break;
3753 }
3754 if ((IsPathAccessible(backup_filename) != MagickFalse) ||
cristy320684d2011-09-23 14:55:47 +00003755 (rename_utf8(image->filename,backup_filename) != 0))
cristy3ed852e2009-09-05 21:47:34 +00003756 *backup_filename='\0';
3757 }
3758 /*
3759 Write transmogrified image to disk.
3760 */
3761 image_info->synchronize=MagickTrue;
3762 status&=WriteImages(image_info,image,image->filename,exception);
3763 if ((status == MagickFalse) && (*backup_filename != '\0'))
cristy18c6c272011-09-23 14:40:37 +00003764 (void) remove_utf8(backup_filename);
cristy3ed852e2009-09-05 21:47:34 +00003765 RemoveAllImageStack();
3766 continue;
3767 }
3768 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
3769 switch (*(option+1))
3770 {
3771 case 'a':
3772 {
3773 if (LocaleCompare("adaptive-blur",option+1) == 0)
3774 {
3775 i++;
cristybb503372010-05-27 20:51:26 +00003776 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003777 ThrowMogrifyException(OptionError,"MissingArgument",option);
3778 if (IsGeometry(argv[i]) == MagickFalse)
3779 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3780 break;
3781 }
3782 if (LocaleCompare("adaptive-resize",option+1) == 0)
3783 {
3784 i++;
cristybb503372010-05-27 20:51:26 +00003785 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003786 ThrowMogrifyException(OptionError,"MissingArgument",option);
3787 if (IsGeometry(argv[i]) == MagickFalse)
3788 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3789 break;
3790 }
3791 if (LocaleCompare("adaptive-sharpen",option+1) == 0)
3792 {
3793 i++;
cristybb503372010-05-27 20:51:26 +00003794 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003795 ThrowMogrifyException(OptionError,"MissingArgument",option);
3796 if (IsGeometry(argv[i]) == MagickFalse)
3797 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3798 break;
3799 }
3800 if (LocaleCompare("affine",option+1) == 0)
3801 {
3802 if (*option == '+')
3803 break;
3804 i++;
cristybb503372010-05-27 20:51:26 +00003805 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003806 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy3ed852e2009-09-05 21:47:34 +00003807 break;
3808 }
3809 if (LocaleCompare("alpha",option+1) == 0)
3810 {
cristybb503372010-05-27 20:51:26 +00003811 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00003812 type;
3813
3814 if (*option == '+')
3815 break;
3816 i++;
cristybb503372010-05-27 20:51:26 +00003817 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003818 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00003819 type=ParseCommandOption(MagickAlphaOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00003820 if (type < 0)
3821 ThrowMogrifyException(OptionError,"UnrecognizedAlphaChannelType",
3822 argv[i]);
3823 break;
3824 }
3825 if (LocaleCompare("annotate",option+1) == 0)
3826 {
3827 if (*option == '+')
3828 break;
3829 i++;
cristybb503372010-05-27 20:51:26 +00003830 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003831 ThrowMogrifyException(OptionError,"MissingArgument",option);
3832 if (IsGeometry(argv[i]) == MagickFalse)
3833 ThrowMogrifyInvalidArgumentException(option,argv[i]);
cristybb503372010-05-27 20:51:26 +00003834 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003835 ThrowMogrifyException(OptionError,"MissingArgument",option);
3836 i++;
3837 break;
3838 }
3839 if (LocaleCompare("antialias",option+1) == 0)
3840 break;
3841 if (LocaleCompare("append",option+1) == 0)
3842 break;
3843 if (LocaleCompare("attenuate",option+1) == 0)
3844 {
3845 if (*option == '+')
3846 break;
3847 i++;
cristybb503372010-05-27 20:51:26 +00003848 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00003849 ThrowMogrifyException(OptionError,"MissingArgument",option);
3850 if (IsGeometry(argv[i]) == MagickFalse)
3851 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3852 break;
3853 }
3854 if (LocaleCompare("authenticate",option+1) == 0)
3855 {
3856 if (*option == '+')
3857 break;
3858 i++;
cristybb503372010-05-27 20:51:26 +00003859 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003860 ThrowMogrifyException(OptionError,"MissingArgument",option);
3861 break;
3862 }
3863 if (LocaleCompare("auto-gamma",option+1) == 0)
3864 break;
3865 if (LocaleCompare("auto-level",option+1) == 0)
3866 break;
3867 if (LocaleCompare("auto-orient",option+1) == 0)
3868 break;
3869 if (LocaleCompare("average",option+1) == 0)
3870 break;
3871 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
3872 }
3873 case 'b':
3874 {
3875 if (LocaleCompare("background",option+1) == 0)
3876 {
3877 if (*option == '+')
3878 break;
3879 i++;
cristybb503372010-05-27 20:51:26 +00003880 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003881 ThrowMogrifyException(OptionError,"MissingArgument",option);
3882 break;
3883 }
3884 if (LocaleCompare("bias",option+1) == 0)
3885 {
3886 if (*option == '+')
3887 break;
3888 i++;
cristybb503372010-05-27 20:51:26 +00003889 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00003890 ThrowMogrifyException(OptionError,"MissingArgument",option);
3891 if (IsGeometry(argv[i]) == MagickFalse)
3892 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3893 break;
3894 }
3895 if (LocaleCompare("black-point-compensation",option+1) == 0)
3896 break;
3897 if (LocaleCompare("black-threshold",option+1) == 0)
3898 {
3899 if (*option == '+')
3900 break;
3901 i++;
cristybb503372010-05-27 20:51:26 +00003902 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003903 ThrowMogrifyException(OptionError,"MissingArgument",option);
3904 if (IsGeometry(argv[i]) == MagickFalse)
3905 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3906 break;
3907 }
3908 if (LocaleCompare("blue-primary",option+1) == 0)
3909 {
3910 if (*option == '+')
3911 break;
3912 i++;
cristybb503372010-05-27 20:51:26 +00003913 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003914 ThrowMogrifyException(OptionError,"MissingArgument",option);
3915 if (IsGeometry(argv[i]) == MagickFalse)
3916 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3917 break;
3918 }
3919 if (LocaleCompare("blue-shift",option+1) == 0)
3920 {
3921 i++;
cristybb503372010-05-27 20:51:26 +00003922 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003923 ThrowMogrifyException(OptionError,"MissingArgument",option);
3924 if (IsGeometry(argv[i]) == MagickFalse)
3925 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3926 break;
3927 }
3928 if (LocaleCompare("blur",option+1) == 0)
3929 {
3930 i++;
cristybb503372010-05-27 20:51:26 +00003931 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003932 ThrowMogrifyException(OptionError,"MissingArgument",option);
3933 if (IsGeometry(argv[i]) == MagickFalse)
3934 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3935 break;
3936 }
3937 if (LocaleCompare("border",option+1) == 0)
3938 {
3939 if (*option == '+')
3940 break;
3941 i++;
cristybb503372010-05-27 20:51:26 +00003942 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003943 ThrowMogrifyException(OptionError,"MissingArgument",option);
3944 if (IsGeometry(argv[i]) == MagickFalse)
3945 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3946 break;
3947 }
3948 if (LocaleCompare("bordercolor",option+1) == 0)
3949 {
3950 if (*option == '+')
3951 break;
3952 i++;
cristybb503372010-05-27 20:51:26 +00003953 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003954 ThrowMogrifyException(OptionError,"MissingArgument",option);
3955 break;
3956 }
3957 if (LocaleCompare("box",option+1) == 0)
3958 {
3959 if (*option == '+')
3960 break;
3961 i++;
cristybb503372010-05-27 20:51:26 +00003962 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003963 ThrowMogrifyException(OptionError,"MissingArgument",option);
3964 break;
3965 }
cristya28d6b82010-01-11 20:03:47 +00003966 if (LocaleCompare("brightness-contrast",option+1) == 0)
3967 {
3968 i++;
cristybb503372010-05-27 20:51:26 +00003969 if (i == (ssize_t) argc)
cristya28d6b82010-01-11 20:03:47 +00003970 ThrowMogrifyException(OptionError,"MissingArgument",option);
3971 if (IsGeometry(argv[i]) == MagickFalse)
3972 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3973 break;
3974 }
cristy3ed852e2009-09-05 21:47:34 +00003975 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
3976 }
3977 case 'c':
3978 {
3979 if (LocaleCompare("cache",option+1) == 0)
3980 {
3981 if (*option == '+')
3982 break;
3983 i++;
cristybb503372010-05-27 20:51:26 +00003984 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003985 ThrowMogrifyException(OptionError,"MissingArgument",option);
3986 if (IsGeometry(argv[i]) == MagickFalse)
3987 ThrowMogrifyInvalidArgumentException(option,argv[i]);
3988 break;
3989 }
3990 if (LocaleCompare("caption",option+1) == 0)
3991 {
3992 if (*option == '+')
3993 break;
3994 i++;
cristybb503372010-05-27 20:51:26 +00003995 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00003996 ThrowMogrifyException(OptionError,"MissingArgument",option);
3997 break;
3998 }
3999 if (LocaleCompare("channel",option+1) == 0)
4000 {
cristybb503372010-05-27 20:51:26 +00004001 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004002 channel;
4003
4004 if (*option == '+')
4005 break;
4006 i++;
cristybb503372010-05-27 20:51:26 +00004007 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004008 ThrowMogrifyException(OptionError,"MissingArgument",option);
4009 channel=ParseChannelOption(argv[i]);
4010 if (channel < 0)
4011 ThrowMogrifyException(OptionError,"UnrecognizedChannelType",
4012 argv[i]);
4013 break;
4014 }
4015 if (LocaleCompare("cdl",option+1) == 0)
4016 {
4017 if (*option == '+')
4018 break;
4019 i++;
cristybb503372010-05-27 20:51:26 +00004020 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004021 ThrowMogrifyException(OptionError,"MissingArgument",option);
4022 break;
4023 }
4024 if (LocaleCompare("charcoal",option+1) == 0)
4025 {
4026 if (*option == '+')
4027 break;
4028 i++;
cristybb503372010-05-27 20:51:26 +00004029 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004030 ThrowMogrifyException(OptionError,"MissingArgument",option);
4031 if (IsGeometry(argv[i]) == MagickFalse)
4032 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4033 break;
4034 }
4035 if (LocaleCompare("chop",option+1) == 0)
4036 {
4037 if (*option == '+')
4038 break;
4039 i++;
cristybb503372010-05-27 20:51:26 +00004040 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004041 ThrowMogrifyException(OptionError,"MissingArgument",option);
4042 if (IsGeometry(argv[i]) == MagickFalse)
4043 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4044 break;
4045 }
cristy1eb45dd2009-09-25 16:38:06 +00004046 if (LocaleCompare("clamp",option+1) == 0)
4047 break;
4048 if (LocaleCompare("clip",option+1) == 0)
4049 break;
cristy3ed852e2009-09-05 21:47:34 +00004050 if (LocaleCompare("clip-mask",option+1) == 0)
4051 {
4052 if (*option == '+')
4053 break;
4054 i++;
cristybb503372010-05-27 20:51:26 +00004055 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004056 ThrowMogrifyException(OptionError,"MissingArgument",option);
4057 break;
4058 }
4059 if (LocaleCompare("clut",option+1) == 0)
4060 break;
4061 if (LocaleCompare("coalesce",option+1) == 0)
4062 break;
4063 if (LocaleCompare("colorize",option+1) == 0)
4064 {
4065 if (*option == '+')
4066 break;
4067 i++;
cristybb503372010-05-27 20:51:26 +00004068 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004069 ThrowMogrifyException(OptionError,"MissingArgument",option);
4070 if (IsGeometry(argv[i]) == MagickFalse)
4071 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4072 break;
4073 }
cristye6365592010-04-02 17:31:23 +00004074 if (LocaleCompare("color-matrix",option+1) == 0)
4075 {
cristyb6bd4ad2010-08-08 01:12:27 +00004076 KernelInfo
4077 *kernel_info;
4078
cristye6365592010-04-02 17:31:23 +00004079 if (*option == '+')
4080 break;
4081 i++;
cristybb503372010-05-27 20:51:26 +00004082 if (i == (ssize_t) (argc-1))
cristye6365592010-04-02 17:31:23 +00004083 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristyb6bd4ad2010-08-08 01:12:27 +00004084 kernel_info=AcquireKernelInfo(argv[i]);
4085 if (kernel_info == (KernelInfo *) NULL)
cristyf4e8c912010-08-08 01:51:19 +00004086 ThrowMogrifyInvalidArgumentException(option,argv[i]);
cristyb6bd4ad2010-08-08 01:12:27 +00004087 kernel_info=DestroyKernelInfo(kernel_info);
cristye6365592010-04-02 17:31:23 +00004088 break;
4089 }
cristy3ed852e2009-09-05 21:47:34 +00004090 if (LocaleCompare("colors",option+1) == 0)
4091 {
4092 if (*option == '+')
4093 break;
4094 i++;
cristybb503372010-05-27 20:51:26 +00004095 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004096 ThrowMogrifyException(OptionError,"MissingArgument",option);
4097 if (IsGeometry(argv[i]) == MagickFalse)
4098 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4099 break;
4100 }
4101 if (LocaleCompare("colorspace",option+1) == 0)
4102 {
cristybb503372010-05-27 20:51:26 +00004103 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004104 colorspace;
4105
4106 if (*option == '+')
4107 break;
4108 i++;
cristybb503372010-05-27 20:51:26 +00004109 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004110 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004111 colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00004112 argv[i]);
4113 if (colorspace < 0)
4114 ThrowMogrifyException(OptionError,"UnrecognizedColorspace",
4115 argv[i]);
4116 break;
4117 }
4118 if (LocaleCompare("combine",option+1) == 0)
4119 break;
4120 if (LocaleCompare("comment",option+1) == 0)
4121 {
4122 if (*option == '+')
4123 break;
4124 i++;
cristybb503372010-05-27 20:51:26 +00004125 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004126 ThrowMogrifyException(OptionError,"MissingArgument",option);
4127 break;
4128 }
4129 if (LocaleCompare("composite",option+1) == 0)
4130 break;
4131 if (LocaleCompare("compress",option+1) == 0)
4132 {
cristybb503372010-05-27 20:51:26 +00004133 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004134 compress;
4135
4136 if (*option == '+')
4137 break;
4138 i++;
cristybb503372010-05-27 20:51:26 +00004139 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004140 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004141 compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00004142 argv[i]);
4143 if (compress < 0)
4144 ThrowMogrifyException(OptionError,"UnrecognizedImageCompression",
4145 argv[i]);
4146 break;
4147 }
cristy22879752009-10-25 23:55:40 +00004148 if (LocaleCompare("concurrent",option+1) == 0)
4149 break;
cristy3ed852e2009-09-05 21:47:34 +00004150 if (LocaleCompare("contrast",option+1) == 0)
4151 break;
4152 if (LocaleCompare("contrast-stretch",option+1) == 0)
4153 {
4154 i++;
cristybb503372010-05-27 20:51:26 +00004155 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004156 ThrowMogrifyException(OptionError,"MissingArgument",option);
4157 if (IsGeometry(argv[i]) == MagickFalse)
4158 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4159 break;
4160 }
4161 if (LocaleCompare("convolve",option+1) == 0)
4162 {
cristyb6bd4ad2010-08-08 01:12:27 +00004163 KernelInfo
4164 *kernel_info;
4165
cristy3ed852e2009-09-05 21:47:34 +00004166 if (*option == '+')
4167 break;
4168 i++;
cristybb503372010-05-27 20:51:26 +00004169 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004170 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristyb6bd4ad2010-08-08 01:12:27 +00004171 kernel_info=AcquireKernelInfo(argv[i]);
4172 if (kernel_info == (KernelInfo *) NULL)
cristyf4e8c912010-08-08 01:51:19 +00004173 ThrowMogrifyInvalidArgumentException(option,argv[i]);
cristyb6bd4ad2010-08-08 01:12:27 +00004174 kernel_info=DestroyKernelInfo(kernel_info);
cristy3ed852e2009-09-05 21:47:34 +00004175 break;
4176 }
4177 if (LocaleCompare("crop",option+1) == 0)
4178 {
4179 if (*option == '+')
4180 break;
4181 i++;
cristybb503372010-05-27 20:51:26 +00004182 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004183 ThrowMogrifyException(OptionError,"MissingArgument",option);
4184 if (IsGeometry(argv[i]) == MagickFalse)
4185 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4186 break;
4187 }
4188 if (LocaleCompare("cycle",option+1) == 0)
4189 {
4190 if (*option == '+')
4191 break;
4192 i++;
cristybb503372010-05-27 20:51:26 +00004193 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004194 ThrowMogrifyException(OptionError,"MissingArgument",option);
4195 if (IsGeometry(argv[i]) == MagickFalse)
4196 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4197 break;
4198 }
4199 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4200 }
4201 case 'd':
4202 {
4203 if (LocaleCompare("decipher",option+1) == 0)
4204 {
4205 if (*option == '+')
4206 break;
4207 i++;
cristybb503372010-05-27 20:51:26 +00004208 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004209 ThrowMogrifyException(OptionError,"MissingArgument",option);
4210 break;
4211 }
4212 if (LocaleCompare("deconstruct",option+1) == 0)
4213 break;
4214 if (LocaleCompare("debug",option+1) == 0)
4215 {
cristybb503372010-05-27 20:51:26 +00004216 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004217 event;
4218
4219 if (*option == '+')
4220 break;
4221 i++;
cristybb503372010-05-27 20:51:26 +00004222 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004223 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004224 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004225 if (event < 0)
4226 ThrowMogrifyException(OptionError,"UnrecognizedEventType",
4227 argv[i]);
4228 (void) SetLogEventMask(argv[i]);
4229 break;
4230 }
4231 if (LocaleCompare("define",option+1) == 0)
4232 {
4233 i++;
cristybb503372010-05-27 20:51:26 +00004234 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004235 ThrowMogrifyException(OptionError,"MissingArgument",option);
4236 if (*option == '+')
4237 {
4238 const char
4239 *define;
4240
4241 define=GetImageOption(image_info,argv[i]);
4242 if (define == (const char *) NULL)
4243 ThrowMogrifyException(OptionError,"NoSuchOption",argv[i]);
4244 break;
4245 }
4246 break;
4247 }
4248 if (LocaleCompare("delay",option+1) == 0)
4249 {
4250 if (*option == '+')
4251 break;
4252 i++;
cristybb503372010-05-27 20:51:26 +00004253 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004254 ThrowMogrifyException(OptionError,"MissingArgument",option);
4255 if (IsGeometry(argv[i]) == MagickFalse)
4256 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4257 break;
4258 }
cristyecb10ff2011-03-22 13:14:03 +00004259 if (LocaleCompare("delete",option+1) == 0)
4260 {
4261 if (*option == '+')
4262 break;
4263 i++;
4264 if (i == (ssize_t) (argc-1))
4265 ThrowMogrifyException(OptionError,"MissingArgument",option);
4266 if (IsGeometry(argv[i]) == MagickFalse)
4267 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4268 break;
4269 }
cristy3ed852e2009-09-05 21:47:34 +00004270 if (LocaleCompare("density",option+1) == 0)
4271 {
4272 if (*option == '+')
4273 break;
4274 i++;
cristybb503372010-05-27 20:51:26 +00004275 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004276 ThrowMogrifyException(OptionError,"MissingArgument",option);
4277 if (IsGeometry(argv[i]) == MagickFalse)
4278 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4279 break;
4280 }
4281 if (LocaleCompare("depth",option+1) == 0)
4282 {
4283 if (*option == '+')
4284 break;
4285 i++;
cristybb503372010-05-27 20:51:26 +00004286 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004287 ThrowMogrifyException(OptionError,"MissingArgument",option);
4288 if (IsGeometry(argv[i]) == MagickFalse)
4289 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4290 break;
4291 }
4292 if (LocaleCompare("deskew",option+1) == 0)
4293 {
4294 if (*option == '+')
4295 break;
4296 i++;
cristybb503372010-05-27 20:51:26 +00004297 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004298 ThrowMogrifyException(OptionError,"MissingArgument",option);
4299 if (IsGeometry(argv[i]) == MagickFalse)
4300 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4301 break;
4302 }
4303 if (LocaleCompare("despeckle",option+1) == 0)
4304 break;
4305 if (LocaleCompare("dft",option+1) == 0)
4306 break;
cristyc9b12952010-03-28 01:12:28 +00004307 if (LocaleCompare("direction",option+1) == 0)
4308 {
cristybb503372010-05-27 20:51:26 +00004309 ssize_t
cristyc9b12952010-03-28 01:12:28 +00004310 direction;
4311
4312 if (*option == '+')
4313 break;
4314 i++;
cristybb503372010-05-27 20:51:26 +00004315 if (i == (ssize_t) argc)
cristyc9b12952010-03-28 01:12:28 +00004316 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004317 direction=ParseCommandOption(MagickDirectionOptions,MagickFalse,
cristyc9b12952010-03-28 01:12:28 +00004318 argv[i]);
4319 if (direction < 0)
4320 ThrowMogrifyException(OptionError,"UnrecognizedDirectionType",
4321 argv[i]);
4322 break;
4323 }
cristy3ed852e2009-09-05 21:47:34 +00004324 if (LocaleCompare("display",option+1) == 0)
4325 {
4326 if (*option == '+')
4327 break;
4328 i++;
cristybb503372010-05-27 20:51:26 +00004329 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004330 ThrowMogrifyException(OptionError,"MissingArgument",option);
4331 break;
4332 }
4333 if (LocaleCompare("dispose",option+1) == 0)
4334 {
cristybb503372010-05-27 20:51:26 +00004335 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004336 dispose;
4337
4338 if (*option == '+')
4339 break;
4340 i++;
cristybb503372010-05-27 20:51:26 +00004341 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004342 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004343 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004344 if (dispose < 0)
4345 ThrowMogrifyException(OptionError,"UnrecognizedDisposeMethod",
4346 argv[i]);
4347 break;
4348 }
4349 if (LocaleCompare("distort",option+1) == 0)
4350 {
cristybb503372010-05-27 20:51:26 +00004351 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004352 op;
4353
4354 i++;
cristybb503372010-05-27 20:51:26 +00004355 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004356 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004357 op=ParseCommandOption(MagickDistortOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004358 if (op < 0)
4359 ThrowMogrifyException(OptionError,"UnrecognizedDistortMethod",
4360 argv[i]);
4361 i++;
cristybb503372010-05-27 20:51:26 +00004362 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004363 ThrowMogrifyException(OptionError,"MissingArgument",option);
4364 break;
4365 }
4366 if (LocaleCompare("dither",option+1) == 0)
4367 {
cristybb503372010-05-27 20:51:26 +00004368 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004369 method;
4370
4371 if (*option == '+')
4372 break;
4373 i++;
cristybb503372010-05-27 20:51:26 +00004374 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004375 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004376 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004377 if (method < 0)
4378 ThrowMogrifyException(OptionError,"UnrecognizedDitherMethod",
4379 argv[i]);
4380 break;
4381 }
4382 if (LocaleCompare("draw",option+1) == 0)
4383 {
4384 if (*option == '+')
4385 break;
4386 i++;
cristybb503372010-05-27 20:51:26 +00004387 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004388 ThrowMogrifyException(OptionError,"MissingArgument",option);
4389 break;
4390 }
cristyecb10ff2011-03-22 13:14:03 +00004391 if (LocaleCompare("duplicate",option+1) == 0)
4392 {
4393 if (*option == '+')
4394 break;
4395 i++;
4396 if (i == (ssize_t) (argc-1))
4397 ThrowMogrifyException(OptionError,"MissingArgument",option);
4398 if (IsGeometry(argv[i]) == MagickFalse)
4399 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4400 break;
4401 }
cristy22879752009-10-25 23:55:40 +00004402 if (LocaleCompare("duration",option+1) == 0)
4403 {
4404 if (*option == '+')
4405 break;
4406 i++;
cristybb503372010-05-27 20:51:26 +00004407 if (i == (ssize_t) (argc-1))
cristy22879752009-10-25 23:55:40 +00004408 ThrowMogrifyException(OptionError,"MissingArgument",option);
4409 if (IsGeometry(argv[i]) == MagickFalse)
4410 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4411 break;
4412 }
cristy3ed852e2009-09-05 21:47:34 +00004413 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4414 }
4415 case 'e':
4416 {
4417 if (LocaleCompare("edge",option+1) == 0)
4418 {
4419 if (*option == '+')
4420 break;
4421 i++;
cristybb503372010-05-27 20:51:26 +00004422 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004423 ThrowMogrifyException(OptionError,"MissingArgument",option);
4424 if (IsGeometry(argv[i]) == MagickFalse)
4425 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4426 break;
4427 }
4428 if (LocaleCompare("emboss",option+1) == 0)
4429 {
4430 if (*option == '+')
4431 break;
4432 i++;
cristybb503372010-05-27 20:51:26 +00004433 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004434 ThrowMogrifyException(OptionError,"MissingArgument",option);
4435 if (IsGeometry(argv[i]) == MagickFalse)
4436 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4437 break;
4438 }
4439 if (LocaleCompare("encipher",option+1) == 0)
4440 {
4441 if (*option == '+')
4442 break;
4443 i++;
cristybb503372010-05-27 20:51:26 +00004444 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004445 ThrowMogrifyException(OptionError,"MissingArgument",option);
4446 break;
4447 }
4448 if (LocaleCompare("encoding",option+1) == 0)
4449 {
4450 if (*option == '+')
4451 break;
4452 i++;
cristybb503372010-05-27 20:51:26 +00004453 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004454 ThrowMogrifyException(OptionError,"MissingArgument",option);
4455 break;
4456 }
4457 if (LocaleCompare("endian",option+1) == 0)
4458 {
cristybb503372010-05-27 20:51:26 +00004459 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004460 endian;
4461
4462 if (*option == '+')
4463 break;
4464 i++;
cristybb503372010-05-27 20:51:26 +00004465 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004466 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004467 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004468 if (endian < 0)
4469 ThrowMogrifyException(OptionError,"UnrecognizedEndianType",
4470 argv[i]);
4471 break;
4472 }
4473 if (LocaleCompare("enhance",option+1) == 0)
4474 break;
4475 if (LocaleCompare("equalize",option+1) == 0)
4476 break;
4477 if (LocaleCompare("evaluate",option+1) == 0)
4478 {
cristybb503372010-05-27 20:51:26 +00004479 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004480 op;
4481
4482 if (*option == '+')
4483 break;
4484 i++;
cristybb503372010-05-27 20:51:26 +00004485 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004486 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004487 op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004488 if (op < 0)
4489 ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator",
4490 argv[i]);
4491 i++;
cristybb503372010-05-27 20:51:26 +00004492 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004493 ThrowMogrifyException(OptionError,"MissingArgument",option);
4494 if (IsGeometry(argv[i]) == MagickFalse)
4495 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4496 break;
4497 }
cristyd18ae7c2010-03-07 17:39:52 +00004498 if (LocaleCompare("evaluate-sequence",option+1) == 0)
4499 {
cristybb503372010-05-27 20:51:26 +00004500 ssize_t
cristyd18ae7c2010-03-07 17:39:52 +00004501 op;
4502
4503 if (*option == '+')
4504 break;
4505 i++;
cristybb503372010-05-27 20:51:26 +00004506 if (i == (ssize_t) argc)
cristyd18ae7c2010-03-07 17:39:52 +00004507 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004508 op=ParseCommandOption(MagickEvaluateOptions,MagickFalse,argv[i]);
cristyd18ae7c2010-03-07 17:39:52 +00004509 if (op < 0)
4510 ThrowMogrifyException(OptionError,"UnrecognizedEvaluateOperator",
4511 argv[i]);
4512 break;
4513 }
cristy3ed852e2009-09-05 21:47:34 +00004514 if (LocaleCompare("extent",option+1) == 0)
4515 {
4516 if (*option == '+')
4517 break;
4518 i++;
cristybb503372010-05-27 20:51:26 +00004519 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004520 ThrowMogrifyException(OptionError,"MissingArgument",option);
4521 if (IsGeometry(argv[i]) == MagickFalse)
4522 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4523 break;
4524 }
4525 if (LocaleCompare("extract",option+1) == 0)
4526 {
4527 if (*option == '+')
4528 break;
4529 i++;
cristybb503372010-05-27 20:51:26 +00004530 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004531 ThrowMogrifyException(OptionError,"MissingArgument",option);
4532 if (IsGeometry(argv[i]) == MagickFalse)
4533 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4534 break;
4535 }
4536 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4537 }
4538 case 'f':
4539 {
4540 if (LocaleCompare("family",option+1) == 0)
4541 {
4542 if (*option == '+')
4543 break;
4544 i++;
cristybb503372010-05-27 20:51:26 +00004545 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004546 ThrowMogrifyException(OptionError,"MissingArgument",option);
4547 break;
4548 }
4549 if (LocaleCompare("fill",option+1) == 0)
4550 {
4551 if (*option == '+')
4552 break;
4553 i++;
cristybb503372010-05-27 20:51:26 +00004554 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004555 ThrowMogrifyException(OptionError,"MissingArgument",option);
4556 break;
4557 }
4558 if (LocaleCompare("filter",option+1) == 0)
4559 {
cristybb503372010-05-27 20:51:26 +00004560 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004561 filter;
4562
4563 if (*option == '+')
4564 break;
4565 i++;
cristybb503372010-05-27 20:51:26 +00004566 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004567 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004568 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004569 if (filter < 0)
4570 ThrowMogrifyException(OptionError,"UnrecognizedImageFilter",
4571 argv[i]);
4572 break;
4573 }
4574 if (LocaleCompare("flatten",option+1) == 0)
4575 break;
4576 if (LocaleCompare("flip",option+1) == 0)
4577 break;
4578 if (LocaleCompare("flop",option+1) == 0)
4579 break;
4580 if (LocaleCompare("floodfill",option+1) == 0)
4581 {
4582 if (*option == '+')
4583 break;
4584 i++;
cristybb503372010-05-27 20:51:26 +00004585 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004586 ThrowMogrifyException(OptionError,"MissingArgument",option);
4587 if (IsGeometry(argv[i]) == MagickFalse)
4588 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4589 i++;
cristybb503372010-05-27 20:51:26 +00004590 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004591 ThrowMogrifyException(OptionError,"MissingArgument",option);
4592 break;
4593 }
4594 if (LocaleCompare("font",option+1) == 0)
4595 {
4596 if (*option == '+')
4597 break;
4598 i++;
cristybb503372010-05-27 20:51:26 +00004599 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004600 ThrowMogrifyException(OptionError,"MissingArgument",option);
4601 break;
4602 }
4603 if (LocaleCompare("format",option+1) == 0)
4604 {
4605 (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
4606 (void) CloneString(&format,(char *) NULL);
4607 if (*option == '+')
4608 break;
4609 i++;
cristybb503372010-05-27 20:51:26 +00004610 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004611 ThrowMogrifyException(OptionError,"MissingArgument",option);
4612 (void) CloneString(&format,argv[i]);
4613 (void) CopyMagickString(image_info->filename,format,MaxTextExtent);
4614 (void) ConcatenateMagickString(image_info->filename,":",
4615 MaxTextExtent);
cristyd965a422010-03-03 17:47:35 +00004616 (void) SetImageInfo(image_info,0,exception);
cristy3ed852e2009-09-05 21:47:34 +00004617 if (*image_info->magick == '\0')
4618 ThrowMogrifyException(OptionError,"UnrecognizedImageFormat",
4619 format);
4620 break;
4621 }
4622 if (LocaleCompare("frame",option+1) == 0)
4623 {
4624 if (*option == '+')
4625 break;
4626 i++;
cristybb503372010-05-27 20:51:26 +00004627 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004628 ThrowMogrifyException(OptionError,"MissingArgument",option);
4629 if (IsGeometry(argv[i]) == MagickFalse)
4630 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4631 break;
4632 }
4633 if (LocaleCompare("function",option+1) == 0)
4634 {
cristybb503372010-05-27 20:51:26 +00004635 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004636 op;
4637
4638 if (*option == '+')
4639 break;
4640 i++;
cristybb503372010-05-27 20:51:26 +00004641 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004642 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004643 op=ParseCommandOption(MagickFunctionOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004644 if (op < 0)
4645 ThrowMogrifyException(OptionError,"UnrecognizedFunction",argv[i]);
4646 i++;
cristybb503372010-05-27 20:51:26 +00004647 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004648 ThrowMogrifyException(OptionError,"MissingArgument",option);
4649 break;
4650 }
4651 if (LocaleCompare("fuzz",option+1) == 0)
4652 {
4653 if (*option == '+')
4654 break;
4655 i++;
cristybb503372010-05-27 20:51:26 +00004656 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004657 ThrowMogrifyException(OptionError,"MissingArgument",option);
4658 if (IsGeometry(argv[i]) == MagickFalse)
4659 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4660 break;
4661 }
4662 if (LocaleCompare("fx",option+1) == 0)
4663 {
4664 if (*option == '+')
4665 break;
4666 i++;
cristybb503372010-05-27 20:51:26 +00004667 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004668 ThrowMogrifyException(OptionError,"MissingArgument",option);
4669 break;
4670 }
4671 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4672 }
4673 case 'g':
4674 {
4675 if (LocaleCompare("gamma",option+1) == 0)
4676 {
4677 i++;
cristybb503372010-05-27 20:51:26 +00004678 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004679 ThrowMogrifyException(OptionError,"MissingArgument",option);
4680 if (IsGeometry(argv[i]) == MagickFalse)
4681 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4682 break;
4683 }
4684 if ((LocaleCompare("gaussian-blur",option+1) == 0) ||
4685 (LocaleCompare("gaussian",option+1) == 0))
4686 {
4687 i++;
cristybb503372010-05-27 20:51:26 +00004688 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004689 ThrowMogrifyException(OptionError,"MissingArgument",option);
4690 if (IsGeometry(argv[i]) == MagickFalse)
4691 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4692 break;
4693 }
4694 if (LocaleCompare("geometry",option+1) == 0)
4695 {
4696 if (*option == '+')
4697 break;
4698 i++;
cristybb503372010-05-27 20:51:26 +00004699 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004700 ThrowMogrifyException(OptionError,"MissingArgument",option);
4701 if (IsGeometry(argv[i]) == MagickFalse)
4702 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4703 break;
4704 }
4705 if (LocaleCompare("gravity",option+1) == 0)
4706 {
cristybb503372010-05-27 20:51:26 +00004707 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004708 gravity;
4709
4710 if (*option == '+')
4711 break;
4712 i++;
cristybb503372010-05-27 20:51:26 +00004713 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004714 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004715 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004716 if (gravity < 0)
4717 ThrowMogrifyException(OptionError,"UnrecognizedGravityType",
4718 argv[i]);
4719 break;
4720 }
4721 if (LocaleCompare("green-primary",option+1) == 0)
4722 {
4723 if (*option == '+')
4724 break;
4725 i++;
cristybb503372010-05-27 20:51:26 +00004726 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004727 ThrowMogrifyException(OptionError,"MissingArgument",option);
4728 if (IsGeometry(argv[i]) == MagickFalse)
4729 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4730 break;
4731 }
4732 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4733 }
4734 case 'h':
4735 {
4736 if (LocaleCompare("hald-clut",option+1) == 0)
4737 break;
4738 if ((LocaleCompare("help",option+1) == 0) ||
4739 (LocaleCompare("-help",option+1) == 0))
4740 return(MogrifyUsage());
4741 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4742 }
4743 case 'i':
4744 {
4745 if (LocaleCompare("identify",option+1) == 0)
4746 break;
4747 if (LocaleCompare("idft",option+1) == 0)
4748 break;
4749 if (LocaleCompare("implode",option+1) == 0)
4750 {
4751 if (*option == '+')
4752 break;
4753 i++;
cristybb503372010-05-27 20:51:26 +00004754 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004755 ThrowMogrifyException(OptionError,"MissingArgument",option);
4756 if (IsGeometry(argv[i]) == MagickFalse)
4757 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4758 break;
4759 }
4760 if (LocaleCompare("intent",option+1) == 0)
4761 {
cristybb503372010-05-27 20:51:26 +00004762 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004763 intent;
4764
4765 if (*option == '+')
4766 break;
4767 i++;
cristybb503372010-05-27 20:51:26 +00004768 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004769 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004770 intent=ParseCommandOption(MagickIntentOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004771 if (intent < 0)
4772 ThrowMogrifyException(OptionError,"UnrecognizedIntentType",
4773 argv[i]);
4774 break;
4775 }
4776 if (LocaleCompare("interlace",option+1) == 0)
4777 {
cristybb503372010-05-27 20:51:26 +00004778 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004779 interlace;
4780
4781 if (*option == '+')
4782 break;
4783 i++;
cristybb503372010-05-27 20:51:26 +00004784 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004785 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004786 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00004787 argv[i]);
4788 if (interlace < 0)
4789 ThrowMogrifyException(OptionError,"UnrecognizedInterlaceType",
4790 argv[i]);
4791 break;
4792 }
cristyb32b90a2009-09-07 21:45:48 +00004793 if (LocaleCompare("interline-spacing",option+1) == 0)
4794 {
4795 if (*option == '+')
4796 break;
4797 i++;
cristybb503372010-05-27 20:51:26 +00004798 if (i == (ssize_t) (argc-1))
cristyb32b90a2009-09-07 21:45:48 +00004799 ThrowMogrifyException(OptionError,"MissingArgument",option);
4800 if (IsGeometry(argv[i]) == MagickFalse)
4801 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4802 break;
4803 }
cristy3ed852e2009-09-05 21:47:34 +00004804 if (LocaleCompare("interpolate",option+1) == 0)
4805 {
cristybb503372010-05-27 20:51:26 +00004806 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004807 interpolate;
4808
4809 if (*option == '+')
4810 break;
4811 i++;
cristybb503372010-05-27 20:51:26 +00004812 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004813 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004814 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00004815 argv[i]);
4816 if (interpolate < 0)
4817 ThrowMogrifyException(OptionError,"UnrecognizedInterpolateMethod",
4818 argv[i]);
4819 break;
4820 }
4821 if (LocaleCompare("interword-spacing",option+1) == 0)
4822 {
4823 if (*option == '+')
4824 break;
4825 i++;
cristybb503372010-05-27 20:51:26 +00004826 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004827 ThrowMogrifyException(OptionError,"MissingArgument",option);
4828 if (IsGeometry(argv[i]) == MagickFalse)
4829 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4830 break;
4831 }
4832 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4833 }
4834 case 'k':
4835 {
4836 if (LocaleCompare("kerning",option+1) == 0)
4837 {
4838 if (*option == '+')
4839 break;
4840 i++;
cristybb503372010-05-27 20:51:26 +00004841 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004842 ThrowMogrifyException(OptionError,"MissingArgument",option);
4843 if (IsGeometry(argv[i]) == MagickFalse)
4844 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4845 break;
4846 }
4847 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4848 }
4849 case 'l':
4850 {
4851 if (LocaleCompare("label",option+1) == 0)
4852 {
4853 if (*option == '+')
4854 break;
4855 i++;
cristybb503372010-05-27 20:51:26 +00004856 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004857 ThrowMogrifyException(OptionError,"MissingArgument",option);
4858 break;
4859 }
4860 if (LocaleCompare("lat",option+1) == 0)
4861 {
4862 if (*option == '+')
4863 break;
4864 i++;
cristybb503372010-05-27 20:51:26 +00004865 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004866 ThrowMogrifyException(OptionError,"MissingArgument",option);
4867 if (IsGeometry(argv[i]) == MagickFalse)
4868 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4869 }
4870 if (LocaleCompare("layers",option+1) == 0)
4871 {
cristybb503372010-05-27 20:51:26 +00004872 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004873 type;
4874
4875 if (*option == '+')
4876 break;
4877 i++;
cristybb503372010-05-27 20:51:26 +00004878 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00004879 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004880 type=ParseCommandOption(MagickLayerOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004881 if (type < 0)
4882 ThrowMogrifyException(OptionError,"UnrecognizedLayerMethod",
4883 argv[i]);
4884 break;
4885 }
4886 if (LocaleCompare("level",option+1) == 0)
4887 {
4888 i++;
cristybb503372010-05-27 20:51:26 +00004889 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004890 ThrowMogrifyException(OptionError,"MissingArgument",option);
4891 if (IsGeometry(argv[i]) == MagickFalse)
4892 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4893 break;
4894 }
4895 if (LocaleCompare("level-colors",option+1) == 0)
4896 {
4897 i++;
cristybb503372010-05-27 20:51:26 +00004898 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004899 ThrowMogrifyException(OptionError,"MissingArgument",option);
4900 break;
4901 }
4902 if (LocaleCompare("linewidth",option+1) == 0)
4903 {
4904 if (*option == '+')
4905 break;
4906 i++;
cristybb503372010-05-27 20:51:26 +00004907 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004908 ThrowMogrifyException(OptionError,"MissingArgument",option);
4909 if (IsGeometry(argv[i]) == MagickFalse)
4910 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4911 break;
4912 }
4913 if (LocaleCompare("limit",option+1) == 0)
4914 {
4915 char
4916 *p;
4917
4918 double
4919 value;
4920
cristybb503372010-05-27 20:51:26 +00004921 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004922 resource;
4923
4924 if (*option == '+')
4925 break;
4926 i++;
cristybb503372010-05-27 20:51:26 +00004927 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004928 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004929 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00004930 argv[i]);
4931 if (resource < 0)
4932 ThrowMogrifyException(OptionError,"UnrecognizedResourceType",
4933 argv[i]);
4934 i++;
cristybb503372010-05-27 20:51:26 +00004935 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004936 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristydbdd0e32011-11-04 23:29:40 +00004937 value=StringToDouble(argv[i],&p);
cristyda16f162011-02-19 23:52:17 +00004938 (void) value;
cristy3ed852e2009-09-05 21:47:34 +00004939 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
4940 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4941 break;
4942 }
4943 if (LocaleCompare("liquid-rescale",option+1) == 0)
4944 {
4945 i++;
cristybb503372010-05-27 20:51:26 +00004946 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004947 ThrowMogrifyException(OptionError,"MissingArgument",option);
4948 if (IsGeometry(argv[i]) == MagickFalse)
4949 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4950 break;
4951 }
4952 if (LocaleCompare("list",option+1) == 0)
4953 {
cristybb503372010-05-27 20:51:26 +00004954 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00004955 list;
4956
4957 if (*option == '+')
4958 break;
4959 i++;
cristybb503372010-05-27 20:51:26 +00004960 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004961 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00004962 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00004963 if (list < 0)
4964 ThrowMogrifyException(OptionError,"UnrecognizedListType",argv[i]);
cristyaeb2cbc2010-05-07 13:28:58 +00004965 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
cristy3ed852e2009-09-05 21:47:34 +00004966 argv+j,exception);
cristyaeb2cbc2010-05-07 13:28:58 +00004967 return(status != 0 ? MagickFalse : MagickTrue);
cristy3ed852e2009-09-05 21:47:34 +00004968 }
4969 if (LocaleCompare("log",option+1) == 0)
4970 {
4971 if (*option == '+')
4972 break;
4973 i++;
cristybb503372010-05-27 20:51:26 +00004974 if ((i == (ssize_t) argc) ||
cristy3ed852e2009-09-05 21:47:34 +00004975 (strchr(argv[i],'%') == (char *) NULL))
4976 ThrowMogrifyException(OptionError,"MissingArgument",option);
4977 break;
4978 }
4979 if (LocaleCompare("loop",option+1) == 0)
4980 {
4981 if (*option == '+')
4982 break;
4983 i++;
cristybb503372010-05-27 20:51:26 +00004984 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00004985 ThrowMogrifyException(OptionError,"MissingArgument",option);
4986 if (IsGeometry(argv[i]) == MagickFalse)
4987 ThrowMogrifyInvalidArgumentException(option,argv[i]);
4988 break;
4989 }
4990 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
4991 }
4992 case 'm':
4993 {
4994 if (LocaleCompare("map",option+1) == 0)
4995 {
4996 global_colormap=(*option == '+') ? MagickTrue : MagickFalse;
4997 if (*option == '+')
4998 break;
4999 i++;
cristybb503372010-05-27 20:51:26 +00005000 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005001 ThrowMogrifyException(OptionError,"MissingArgument",option);
5002 break;
5003 }
5004 if (LocaleCompare("mask",option+1) == 0)
5005 {
5006 if (*option == '+')
5007 break;
5008 i++;
cristybb503372010-05-27 20:51:26 +00005009 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005010 ThrowMogrifyException(OptionError,"MissingArgument",option);
5011 break;
5012 }
5013 if (LocaleCompare("matte",option+1) == 0)
5014 break;
5015 if (LocaleCompare("mattecolor",option+1) == 0)
5016 {
5017 if (*option == '+')
5018 break;
5019 i++;
cristybb503372010-05-27 20:51:26 +00005020 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005021 ThrowMogrifyException(OptionError,"MissingArgument",option);
5022 break;
5023 }
cristyf40785b2010-03-06 02:27:27 +00005024 if (LocaleCompare("maximum",option+1) == 0)
cristy1c274c92010-03-06 02:06:45 +00005025 break;
cristyf40785b2010-03-06 02:27:27 +00005026 if (LocaleCompare("minimum",option+1) == 0)
cristy1c274c92010-03-06 02:06:45 +00005027 break;
cristy3ed852e2009-09-05 21:47:34 +00005028 if (LocaleCompare("modulate",option+1) == 0)
5029 {
5030 if (*option == '+')
5031 break;
5032 i++;
cristybb503372010-05-27 20:51:26 +00005033 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005034 ThrowMogrifyException(OptionError,"MissingArgument",option);
5035 if (IsGeometry(argv[i]) == MagickFalse)
5036 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5037 break;
5038 }
5039 if (LocaleCompare("median",option+1) == 0)
5040 {
5041 if (*option == '+')
5042 break;
5043 i++;
cristybb503372010-05-27 20:51:26 +00005044 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005045 ThrowMogrifyException(OptionError,"MissingArgument",option);
5046 if (IsGeometry(argv[i]) == MagickFalse)
5047 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5048 break;
5049 }
cristy69ec32d2011-02-27 23:57:09 +00005050 if (LocaleCompare("mode",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 }
cristy3ed852e2009-09-05 21:47:34 +00005061 if (LocaleCompare("monitor",option+1) == 0)
5062 break;
5063 if (LocaleCompare("monochrome",option+1) == 0)
5064 break;
5065 if (LocaleCompare("morph",option+1) == 0)
5066 {
5067 if (*option == '+')
5068 break;
5069 i++;
cristybb503372010-05-27 20:51:26 +00005070 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005071 ThrowMogrifyException(OptionError,"MissingArgument",option);
5072 if (IsGeometry(argv[i]) == MagickFalse)
5073 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5074 break;
5075 }
anthony29188a82010-01-22 10:12:34 +00005076 if (LocaleCompare("morphology",option+1) == 0)
5077 {
anthony29188a82010-01-22 10:12:34 +00005078 char
5079 token[MaxTextExtent];
5080
cristyb6bd4ad2010-08-08 01:12:27 +00005081 KernelInfo
5082 *kernel_info;
5083
5084 ssize_t
5085 op;
5086
anthony29188a82010-01-22 10:12:34 +00005087 i++;
cristybb503372010-05-27 20:51:26 +00005088 if (i == (ssize_t) argc)
anthony29188a82010-01-22 10:12:34 +00005089 ThrowMogrifyException(OptionError,"MissingArgument",option);
5090 GetMagickToken(argv[i],NULL,token);
cristy042ee782011-04-22 18:48:30 +00005091 op=ParseCommandOption(MagickMorphologyOptions,MagickFalse,token);
anthony29188a82010-01-22 10:12:34 +00005092 if (op < 0)
5093 ThrowMogrifyException(OptionError,"UnrecognizedMorphologyMethod",
cristyf0c78232010-03-15 12:53:40 +00005094 token);
anthony29188a82010-01-22 10:12:34 +00005095 i++;
cristybb503372010-05-27 20:51:26 +00005096 if (i == (ssize_t) (argc-1))
anthony29188a82010-01-22 10:12:34 +00005097 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristyb6bd4ad2010-08-08 01:12:27 +00005098 kernel_info=AcquireKernelInfo(argv[i]);
5099 if (kernel_info == (KernelInfo *) NULL)
cristyf4e8c912010-08-08 01:51:19 +00005100 ThrowMogrifyInvalidArgumentException(option,argv[i]);
cristyb6bd4ad2010-08-08 01:12:27 +00005101 kernel_info=DestroyKernelInfo(kernel_info);
anthony29188a82010-01-22 10:12:34 +00005102 break;
5103 }
cristy3ed852e2009-09-05 21:47:34 +00005104 if (LocaleCompare("mosaic",option+1) == 0)
5105 break;
5106 if (LocaleCompare("motion-blur",option+1) == 0)
5107 {
5108 if (*option == '+')
5109 break;
5110 i++;
cristybb503372010-05-27 20:51:26 +00005111 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005112 ThrowMogrifyException(OptionError,"MissingArgument",option);
5113 if (IsGeometry(argv[i]) == MagickFalse)
5114 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5115 break;
5116 }
5117 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5118 }
5119 case 'n':
5120 {
5121 if (LocaleCompare("negate",option+1) == 0)
5122 break;
5123 if (LocaleCompare("noise",option+1) == 0)
5124 {
5125 i++;
cristybb503372010-05-27 20:51:26 +00005126 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005127 ThrowMogrifyException(OptionError,"MissingArgument",option);
5128 if (*option == '+')
5129 {
cristybb503372010-05-27 20:51:26 +00005130 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005131 noise;
5132
cristy042ee782011-04-22 18:48:30 +00005133 noise=ParseCommandOption(MagickNoiseOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00005134 if (noise < 0)
5135 ThrowMogrifyException(OptionError,"UnrecognizedNoiseType",
5136 argv[i]);
5137 break;
5138 }
5139 if (IsGeometry(argv[i]) == MagickFalse)
5140 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5141 break;
5142 }
5143 if (LocaleCompare("noop",option+1) == 0)
5144 break;
5145 if (LocaleCompare("normalize",option+1) == 0)
5146 break;
5147 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5148 }
5149 case 'o':
5150 {
5151 if (LocaleCompare("opaque",option+1) == 0)
5152 {
cristy3ed852e2009-09-05 21:47:34 +00005153 i++;
cristybb503372010-05-27 20:51:26 +00005154 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005155 ThrowMogrifyException(OptionError,"MissingArgument",option);
5156 break;
5157 }
5158 if (LocaleCompare("ordered-dither",option+1) == 0)
5159 {
5160 if (*option == '+')
5161 break;
5162 i++;
cristybb503372010-05-27 20:51:26 +00005163 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005164 ThrowMogrifyException(OptionError,"MissingArgument",option);
5165 break;
5166 }
5167 if (LocaleCompare("orient",option+1) == 0)
5168 {
cristybb503372010-05-27 20:51:26 +00005169 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005170 orientation;
5171
5172 orientation=UndefinedOrientation;
5173 if (*option == '+')
5174 break;
5175 i++;
cristybb503372010-05-27 20:51:26 +00005176 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005177 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005178 orientation=ParseCommandOption(MagickOrientationOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00005179 argv[i]);
5180 if (orientation < 0)
5181 ThrowMogrifyException(OptionError,"UnrecognizedImageOrientation",
5182 argv[i]);
5183 break;
5184 }
5185 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5186 }
5187 case 'p':
5188 {
5189 if (LocaleCompare("page",option+1) == 0)
5190 {
5191 if (*option == '+')
5192 break;
5193 i++;
cristybb503372010-05-27 20:51:26 +00005194 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005195 ThrowMogrifyException(OptionError,"MissingArgument",option);
5196 break;
5197 }
5198 if (LocaleCompare("paint",option+1) == 0)
5199 {
5200 if (*option == '+')
5201 break;
5202 i++;
cristybb503372010-05-27 20:51:26 +00005203 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005204 ThrowMogrifyException(OptionError,"MissingArgument",option);
5205 if (IsGeometry(argv[i]) == MagickFalse)
5206 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5207 break;
5208 }
5209 if (LocaleCompare("path",option+1) == 0)
5210 {
5211 (void) CloneString(&path,(char *) NULL);
5212 if (*option == '+')
5213 break;
5214 i++;
cristybb503372010-05-27 20:51:26 +00005215 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005216 ThrowMogrifyException(OptionError,"MissingArgument",option);
5217 (void) CloneString(&path,argv[i]);
5218 break;
5219 }
5220 if (LocaleCompare("pointsize",option+1) == 0)
5221 {
5222 if (*option == '+')
5223 break;
5224 i++;
cristybb503372010-05-27 20:51:26 +00005225 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005226 ThrowMogrifyException(OptionError,"MissingArgument",option);
5227 if (IsGeometry(argv[i]) == MagickFalse)
5228 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5229 break;
5230 }
5231 if (LocaleCompare("polaroid",option+1) == 0)
5232 {
5233 if (*option == '+')
5234 break;
5235 i++;
cristybb503372010-05-27 20:51:26 +00005236 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005237 ThrowMogrifyException(OptionError,"MissingArgument",option);
5238 if (IsGeometry(argv[i]) == MagickFalse)
5239 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5240 break;
5241 }
5242 if (LocaleCompare("posterize",option+1) == 0)
5243 {
5244 if (*option == '+')
5245 break;
5246 i++;
cristybb503372010-05-27 20:51:26 +00005247 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005248 ThrowMogrifyException(OptionError,"MissingArgument",option);
5249 if (IsGeometry(argv[i]) == MagickFalse)
5250 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5251 break;
5252 }
cristye7f51092010-01-17 00:39:37 +00005253 if (LocaleCompare("precision",option+1) == 0)
5254 {
5255 if (*option == '+')
5256 break;
5257 i++;
cristybb503372010-05-27 20:51:26 +00005258 if (i == (ssize_t) argc)
cristye7f51092010-01-17 00:39:37 +00005259 ThrowMogrifyException(OptionError,"MissingArgument",option);
5260 if (IsGeometry(argv[i]) == MagickFalse)
5261 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5262 break;
5263 }
cristy3ed852e2009-09-05 21:47:34 +00005264 if (LocaleCompare("print",option+1) == 0)
5265 {
5266 if (*option == '+')
5267 break;
5268 i++;
cristybb503372010-05-27 20:51:26 +00005269 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005270 ThrowMogrifyException(OptionError,"MissingArgument",option);
5271 break;
5272 }
5273 if (LocaleCompare("process",option+1) == 0)
5274 {
5275 if (*option == '+')
5276 break;
5277 i++;
cristybb503372010-05-27 20:51:26 +00005278 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005279 ThrowMogrifyException(OptionError,"MissingArgument",option);
5280 break;
5281 }
5282 if (LocaleCompare("profile",option+1) == 0)
5283 {
5284 i++;
cristybb503372010-05-27 20:51:26 +00005285 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005286 ThrowMogrifyException(OptionError,"MissingArgument",option);
5287 break;
5288 }
5289 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5290 }
5291 case 'q':
5292 {
5293 if (LocaleCompare("quality",option+1) == 0)
5294 {
5295 if (*option == '+')
5296 break;
5297 i++;
cristybb503372010-05-27 20:51:26 +00005298 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005299 ThrowMogrifyException(OptionError,"MissingArgument",option);
5300 if (IsGeometry(argv[i]) == MagickFalse)
5301 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5302 break;
5303 }
5304 if (LocaleCompare("quantize",option+1) == 0)
5305 {
cristybb503372010-05-27 20:51:26 +00005306 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005307 colorspace;
5308
5309 if (*option == '+')
5310 break;
5311 i++;
cristybb503372010-05-27 20:51:26 +00005312 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005313 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005314 colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00005315 argv[i]);
5316 if (colorspace < 0)
5317 ThrowMogrifyException(OptionError,"UnrecognizedColorspace",
5318 argv[i]);
5319 break;
5320 }
5321 if (LocaleCompare("quiet",option+1) == 0)
5322 break;
5323 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5324 }
5325 case 'r':
5326 {
5327 if (LocaleCompare("radial-blur",option+1) == 0)
5328 {
5329 i++;
cristybb503372010-05-27 20:51:26 +00005330 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005331 ThrowMogrifyException(OptionError,"MissingArgument",option);
5332 if (IsGeometry(argv[i]) == MagickFalse)
5333 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5334 break;
5335 }
5336 if (LocaleCompare("raise",option+1) == 0)
5337 {
5338 i++;
cristybb503372010-05-27 20:51:26 +00005339 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005340 ThrowMogrifyException(OptionError,"MissingArgument",option);
5341 if (IsGeometry(argv[i]) == MagickFalse)
5342 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5343 break;
5344 }
5345 if (LocaleCompare("random-threshold",option+1) == 0)
5346 {
5347 if (*option == '+')
5348 break;
5349 i++;
cristybb503372010-05-27 20:51:26 +00005350 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005351 ThrowMogrifyException(OptionError,"MissingArgument",option);
5352 if (IsGeometry(argv[i]) == MagickFalse)
5353 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5354 break;
5355 }
cristye6365592010-04-02 17:31:23 +00005356 if (LocaleCompare("recolor",option+1) == 0)
5357 {
5358 if (*option == '+')
5359 break;
5360 i++;
cristybb503372010-05-27 20:51:26 +00005361 if (i == (ssize_t) (argc-1))
cristye6365592010-04-02 17:31:23 +00005362 ThrowMogrifyException(OptionError,"MissingArgument",option);
5363 if (IsGeometry(argv[i]) == MagickFalse)
5364 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5365 break;
5366 }
cristy3ed852e2009-09-05 21:47:34 +00005367 if (LocaleCompare("red-primary",option+1) == 0)
5368 {
5369 if (*option == '+')
5370 break;
5371 i++;
cristybb503372010-05-27 20:51:26 +00005372 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005373 ThrowMogrifyException(OptionError,"MissingArgument",option);
5374 if (IsGeometry(argv[i]) == MagickFalse)
5375 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5376 }
cristy9f2083a2010-04-22 19:48:05 +00005377 if (LocaleCompare("regard-warnings",option+1) == 0)
5378 break;
cristy3ed852e2009-09-05 21:47:34 +00005379 if (LocaleCompare("region",option+1) == 0)
5380 {
5381 if (*option == '+')
5382 break;
5383 i++;
cristybb503372010-05-27 20:51:26 +00005384 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005385 ThrowMogrifyException(OptionError,"MissingArgument",option);
5386 if (IsGeometry(argv[i]) == MagickFalse)
5387 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5388 break;
5389 }
cristyf0c78232010-03-15 12:53:40 +00005390 if (LocaleCompare("remap",option+1) == 0)
5391 {
5392 if (*option == '+')
5393 break;
5394 i++;
cristybb503372010-05-27 20:51:26 +00005395 if (i == (ssize_t) (argc-1))
cristyf0c78232010-03-15 12:53:40 +00005396 ThrowMogrifyException(OptionError,"MissingArgument",option);
5397 break;
5398 }
cristy3ed852e2009-09-05 21:47:34 +00005399 if (LocaleCompare("render",option+1) == 0)
5400 break;
5401 if (LocaleCompare("repage",option+1) == 0)
5402 {
5403 if (*option == '+')
5404 break;
5405 i++;
cristybb503372010-05-27 20:51:26 +00005406 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005407 ThrowMogrifyException(OptionError,"MissingArgument",option);
5408 if (IsGeometry(argv[i]) == MagickFalse)
5409 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5410 break;
5411 }
5412 if (LocaleCompare("resample",option+1) == 0)
5413 {
5414 if (*option == '+')
5415 break;
5416 i++;
cristybb503372010-05-27 20:51:26 +00005417 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005418 ThrowMogrifyException(OptionError,"MissingArgument",option);
5419 if (IsGeometry(argv[i]) == MagickFalse)
5420 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5421 break;
5422 }
5423 if (LocaleCompare("resize",option+1) == 0)
5424 {
5425 if (*option == '+')
5426 break;
5427 i++;
cristybb503372010-05-27 20:51:26 +00005428 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005429 ThrowMogrifyException(OptionError,"MissingArgument",option);
5430 if (IsGeometry(argv[i]) == MagickFalse)
5431 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5432 break;
5433 }
cristyebbcfea2011-02-25 02:43:54 +00005434 if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
5435 {
5436 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
5437 break;
5438 }
cristy3ed852e2009-09-05 21:47:34 +00005439 if (LocaleCompare("reverse",option+1) == 0)
5440 break;
5441 if (LocaleCompare("roll",option+1) == 0)
5442 {
5443 if (*option == '+')
5444 break;
5445 i++;
cristybb503372010-05-27 20:51:26 +00005446 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005447 ThrowMogrifyException(OptionError,"MissingArgument",option);
5448 if (IsGeometry(argv[i]) == MagickFalse)
5449 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5450 break;
5451 }
5452 if (LocaleCompare("rotate",option+1) == 0)
5453 {
5454 i++;
cristybb503372010-05-27 20:51:26 +00005455 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005456 ThrowMogrifyException(OptionError,"MissingArgument",option);
5457 if (IsGeometry(argv[i]) == MagickFalse)
5458 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5459 break;
5460 }
5461 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5462 }
5463 case 's':
5464 {
5465 if (LocaleCompare("sample",option+1) == 0)
5466 {
5467 if (*option == '+')
5468 break;
5469 i++;
cristybb503372010-05-27 20:51:26 +00005470 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005471 ThrowMogrifyException(OptionError,"MissingArgument",option);
5472 if (IsGeometry(argv[i]) == MagickFalse)
5473 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5474 break;
5475 }
5476 if (LocaleCompare("sampling-factor",option+1) == 0)
5477 {
5478 if (*option == '+')
5479 break;
5480 i++;
cristybb503372010-05-27 20:51:26 +00005481 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005482 ThrowMogrifyException(OptionError,"MissingArgument",option);
5483 if (IsGeometry(argv[i]) == MagickFalse)
5484 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5485 break;
5486 }
5487 if (LocaleCompare("scale",option+1) == 0)
5488 {
5489 if (*option == '+')
5490 break;
5491 i++;
cristybb503372010-05-27 20:51:26 +00005492 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005493 ThrowMogrifyException(OptionError,"MissingArgument",option);
5494 if (IsGeometry(argv[i]) == MagickFalse)
5495 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5496 break;
5497 }
5498 if (LocaleCompare("scene",option+1) == 0)
5499 {
5500 if (*option == '+')
5501 break;
5502 i++;
cristybb503372010-05-27 20:51:26 +00005503 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005504 ThrowMogrifyException(OptionError,"MissingArgument",option);
5505 if (IsGeometry(argv[i]) == MagickFalse)
5506 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5507 break;
5508 }
5509 if (LocaleCompare("seed",option+1) == 0)
5510 {
5511 if (*option == '+')
5512 break;
5513 i++;
cristybb503372010-05-27 20:51:26 +00005514 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005515 ThrowMogrifyException(OptionError,"MissingArgument",option);
5516 if (IsGeometry(argv[i]) == MagickFalse)
5517 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5518 break;
5519 }
5520 if (LocaleCompare("segment",option+1) == 0)
5521 {
5522 if (*option == '+')
5523 break;
5524 i++;
cristybb503372010-05-27 20:51:26 +00005525 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005526 ThrowMogrifyException(OptionError,"MissingArgument",option);
5527 if (IsGeometry(argv[i]) == MagickFalse)
5528 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5529 break;
5530 }
5531 if (LocaleCompare("selective-blur",option+1) == 0)
5532 {
5533 i++;
cristybb503372010-05-27 20:51:26 +00005534 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005535 ThrowMogrifyException(OptionError,"MissingArgument",option);
5536 if (IsGeometry(argv[i]) == MagickFalse)
5537 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5538 break;
5539 }
5540 if (LocaleCompare("separate",option+1) == 0)
5541 break;
5542 if (LocaleCompare("sepia-tone",option+1) == 0)
5543 {
5544 if (*option == '+')
5545 break;
5546 i++;
cristybb503372010-05-27 20:51:26 +00005547 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005548 ThrowMogrifyException(OptionError,"MissingArgument",option);
5549 if (IsGeometry(argv[i]) == MagickFalse)
5550 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5551 break;
5552 }
5553 if (LocaleCompare("set",option+1) == 0)
5554 {
5555 i++;
cristybb503372010-05-27 20:51:26 +00005556 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005557 ThrowMogrifyException(OptionError,"MissingArgument",option);
5558 if (*option == '+')
5559 break;
5560 i++;
cristybb503372010-05-27 20:51:26 +00005561 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005562 ThrowMogrifyException(OptionError,"MissingArgument",option);
5563 break;
5564 }
5565 if (LocaleCompare("shade",option+1) == 0)
5566 {
5567 i++;
cristybb503372010-05-27 20:51:26 +00005568 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005569 ThrowMogrifyException(OptionError,"MissingArgument",option);
5570 if (IsGeometry(argv[i]) == MagickFalse)
5571 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5572 break;
5573 }
5574 if (LocaleCompare("shadow",option+1) == 0)
5575 {
5576 if (*option == '+')
5577 break;
5578 i++;
cristybb503372010-05-27 20:51:26 +00005579 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005580 ThrowMogrifyException(OptionError,"MissingArgument",option);
5581 if (IsGeometry(argv[i]) == MagickFalse)
5582 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5583 break;
5584 }
5585 if (LocaleCompare("sharpen",option+1) == 0)
5586 {
5587 i++;
cristybb503372010-05-27 20:51:26 +00005588 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005589 ThrowMogrifyException(OptionError,"MissingArgument",option);
5590 if (IsGeometry(argv[i]) == MagickFalse)
5591 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5592 break;
5593 }
5594 if (LocaleCompare("shave",option+1) == 0)
5595 {
5596 if (*option == '+')
5597 break;
5598 i++;
cristybb503372010-05-27 20:51:26 +00005599 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005600 ThrowMogrifyException(OptionError,"MissingArgument",option);
5601 if (IsGeometry(argv[i]) == MagickFalse)
5602 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5603 break;
5604 }
5605 if (LocaleCompare("shear",option+1) == 0)
5606 {
5607 i++;
cristybb503372010-05-27 20:51:26 +00005608 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005609 ThrowMogrifyException(OptionError,"MissingArgument",option);
5610 if (IsGeometry(argv[i]) == MagickFalse)
5611 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5612 break;
5613 }
5614 if (LocaleCompare("sigmoidal-contrast",option+1) == 0)
5615 {
5616 i++;
cristybb503372010-05-27 20:51:26 +00005617 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005618 ThrowMogrifyException(OptionError,"MissingArgument",option);
5619 if (IsGeometry(argv[i]) == MagickFalse)
5620 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5621 break;
5622 }
5623 if (LocaleCompare("size",option+1) == 0)
5624 {
5625 if (*option == '+')
5626 break;
5627 i++;
cristybb503372010-05-27 20:51:26 +00005628 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005629 ThrowMogrifyException(OptionError,"MissingArgument",option);
5630 if (IsGeometry(argv[i]) == MagickFalse)
5631 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5632 break;
5633 }
5634 if (LocaleCompare("sketch",option+1) == 0)
5635 {
5636 if (*option == '+')
5637 break;
5638 i++;
cristybb503372010-05-27 20:51:26 +00005639 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005640 ThrowMogrifyException(OptionError,"MissingArgument",option);
5641 if (IsGeometry(argv[i]) == MagickFalse)
5642 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5643 break;
5644 }
cristy4285d782011-02-09 20:12:28 +00005645 if (LocaleCompare("smush",option+1) == 0)
5646 {
cristy4285d782011-02-09 20:12:28 +00005647 i++;
5648 if (i == (ssize_t) argc)
5649 ThrowMogrifyException(OptionError,"MissingArgument",option);
5650 if (IsGeometry(argv[i]) == MagickFalse)
5651 ThrowMogrifyInvalidArgumentException(option,argv[i]);
cristy4285d782011-02-09 20:12:28 +00005652 i++;
5653 break;
5654 }
cristy3ed852e2009-09-05 21:47:34 +00005655 if (LocaleCompare("solarize",option+1) == 0)
5656 {
5657 if (*option == '+')
5658 break;
5659 i++;
cristybb503372010-05-27 20:51:26 +00005660 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005661 ThrowMogrifyException(OptionError,"MissingArgument",option);
5662 if (IsGeometry(argv[i]) == MagickFalse)
5663 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5664 break;
5665 }
5666 if (LocaleCompare("sparse-color",option+1) == 0)
5667 {
cristybb503372010-05-27 20:51:26 +00005668 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005669 op;
5670
5671 i++;
cristybb503372010-05-27 20:51:26 +00005672 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005673 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005674 op=ParseCommandOption(MagickSparseColorOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00005675 if (op < 0)
5676 ThrowMogrifyException(OptionError,"UnrecognizedSparseColorMethod",
5677 argv[i]);
5678 i++;
cristybb503372010-05-27 20:51:26 +00005679 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005680 ThrowMogrifyException(OptionError,"MissingArgument",option);
5681 break;
5682 }
5683 if (LocaleCompare("spread",option+1) == 0)
5684 {
5685 if (*option == '+')
5686 break;
5687 i++;
cristybb503372010-05-27 20:51:26 +00005688 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005689 ThrowMogrifyException(OptionError,"MissingArgument",option);
5690 if (IsGeometry(argv[i]) == MagickFalse)
5691 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5692 break;
5693 }
cristy0834d642011-03-18 18:26:08 +00005694 if (LocaleCompare("statistic",option+1) == 0)
5695 {
5696 ssize_t
5697 op;
5698
5699 if (*option == '+')
5700 break;
5701 i++;
5702 if (i == (ssize_t) argc)
5703 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005704 op=ParseCommandOption(MagickStatisticOptions,MagickFalse,argv[i]);
cristy0834d642011-03-18 18:26:08 +00005705 if (op < 0)
5706 ThrowMogrifyException(OptionError,"UnrecognizedStatisticType",
5707 argv[i]);
5708 i++;
5709 if (i == (ssize_t) (argc-1))
5710 ThrowMogrifyException(OptionError,"MissingArgument",option);
5711 if (IsGeometry(argv[i]) == MagickFalse)
5712 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5713 break;
5714 }
cristy3ed852e2009-09-05 21:47:34 +00005715 if (LocaleCompare("stretch",option+1) == 0)
5716 {
cristybb503372010-05-27 20:51:26 +00005717 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005718 stretch;
5719
5720 if (*option == '+')
5721 break;
5722 i++;
cristybb503372010-05-27 20:51:26 +00005723 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005724 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005725 stretch=ParseCommandOption(MagickStretchOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00005726 if (stretch < 0)
5727 ThrowMogrifyException(OptionError,"UnrecognizedStyleType",
5728 argv[i]);
5729 break;
5730 }
5731 if (LocaleCompare("strip",option+1) == 0)
5732 break;
5733 if (LocaleCompare("stroke",option+1) == 0)
5734 {
5735 if (*option == '+')
5736 break;
5737 i++;
cristybb503372010-05-27 20:51:26 +00005738 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005739 ThrowMogrifyException(OptionError,"MissingArgument",option);
5740 break;
5741 }
5742 if (LocaleCompare("strokewidth",option+1) == 0)
5743 {
5744 if (*option == '+')
5745 break;
5746 i++;
cristybb503372010-05-27 20:51:26 +00005747 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005748 ThrowMogrifyException(OptionError,"MissingArgument",option);
5749 if (IsGeometry(argv[i]) == MagickFalse)
5750 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5751 break;
5752 }
5753 if (LocaleCompare("style",option+1) == 0)
5754 {
cristybb503372010-05-27 20:51:26 +00005755 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005756 style;
5757
5758 if (*option == '+')
5759 break;
5760 i++;
cristybb503372010-05-27 20:51:26 +00005761 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005762 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005763 style=ParseCommandOption(MagickStyleOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00005764 if (style < 0)
5765 ThrowMogrifyException(OptionError,"UnrecognizedStyleType",
5766 argv[i]);
5767 break;
5768 }
cristyecb10ff2011-03-22 13:14:03 +00005769 if (LocaleCompare("swap",option+1) == 0)
5770 {
5771 if (*option == '+')
5772 break;
5773 i++;
5774 if (i == (ssize_t) (argc-1))
5775 ThrowMogrifyException(OptionError,"MissingArgument",option);
5776 if (IsGeometry(argv[i]) == MagickFalse)
5777 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5778 break;
5779 }
cristy3ed852e2009-09-05 21:47:34 +00005780 if (LocaleCompare("swirl",option+1) == 0)
5781 {
5782 if (*option == '+')
5783 break;
5784 i++;
cristybb503372010-05-27 20:51:26 +00005785 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005786 ThrowMogrifyException(OptionError,"MissingArgument",option);
5787 if (IsGeometry(argv[i]) == MagickFalse)
5788 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5789 break;
5790 }
cristyd9a29192010-10-16 16:49:53 +00005791 if (LocaleCompare("synchronize",option+1) == 0)
5792 break;
cristy3ed852e2009-09-05 21:47:34 +00005793 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5794 }
5795 case 't':
5796 {
5797 if (LocaleCompare("taint",option+1) == 0)
5798 break;
5799 if (LocaleCompare("texture",option+1) == 0)
5800 {
5801 if (*option == '+')
5802 break;
5803 i++;
cristybb503372010-05-27 20:51:26 +00005804 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005805 ThrowMogrifyException(OptionError,"MissingArgument",option);
5806 break;
5807 }
5808 if (LocaleCompare("tile",option+1) == 0)
5809 {
5810 if (*option == '+')
5811 break;
5812 i++;
cristybb503372010-05-27 20:51:26 +00005813 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005814 ThrowMogrifyException(OptionError,"MissingArgument",option);
5815 break;
5816 }
5817 if (LocaleCompare("tile-offset",option+1) == 0)
5818 {
5819 if (*option == '+')
5820 break;
5821 i++;
cristybb503372010-05-27 20:51:26 +00005822 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005823 ThrowMogrifyException(OptionError,"MissingArgument",option);
5824 if (IsGeometry(argv[i]) == MagickFalse)
5825 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5826 break;
5827 }
5828 if (LocaleCompare("tint",option+1) == 0)
5829 {
5830 if (*option == '+')
5831 break;
5832 i++;
cristybb503372010-05-27 20:51:26 +00005833 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005834 ThrowMogrifyException(OptionError,"MissingArgument",option);
5835 if (IsGeometry(argv[i]) == MagickFalse)
5836 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5837 break;
5838 }
5839 if (LocaleCompare("transform",option+1) == 0)
5840 break;
5841 if (LocaleCompare("transpose",option+1) == 0)
5842 break;
5843 if (LocaleCompare("transverse",option+1) == 0)
5844 break;
5845 if (LocaleCompare("threshold",option+1) == 0)
5846 {
5847 if (*option == '+')
5848 break;
5849 i++;
cristybb503372010-05-27 20:51:26 +00005850 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005851 ThrowMogrifyException(OptionError,"MissingArgument",option);
5852 if (IsGeometry(argv[i]) == MagickFalse)
5853 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5854 break;
5855 }
5856 if (LocaleCompare("thumbnail",option+1) == 0)
5857 {
5858 if (*option == '+')
5859 break;
5860 i++;
cristybb503372010-05-27 20:51:26 +00005861 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005862 ThrowMogrifyException(OptionError,"MissingArgument",option);
5863 if (IsGeometry(argv[i]) == MagickFalse)
5864 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5865 break;
5866 }
5867 if (LocaleCompare("transparent",option+1) == 0)
5868 {
5869 i++;
cristybb503372010-05-27 20:51:26 +00005870 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005871 ThrowMogrifyException(OptionError,"MissingArgument",option);
5872 break;
5873 }
5874 if (LocaleCompare("transparent-color",option+1) == 0)
5875 {
5876 if (*option == '+')
5877 break;
5878 i++;
cristybb503372010-05-27 20:51:26 +00005879 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00005880 ThrowMogrifyException(OptionError,"MissingArgument",option);
5881 break;
5882 }
5883 if (LocaleCompare("treedepth",option+1) == 0)
5884 {
5885 if (*option == '+')
5886 break;
5887 i++;
cristybb503372010-05-27 20:51:26 +00005888 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005889 ThrowMogrifyException(OptionError,"MissingArgument",option);
5890 if (IsGeometry(argv[i]) == MagickFalse)
5891 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5892 break;
5893 }
5894 if (LocaleCompare("trim",option+1) == 0)
5895 break;
5896 if (LocaleCompare("type",option+1) == 0)
5897 {
cristybb503372010-05-27 20:51:26 +00005898 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005899 type;
5900
5901 if (*option == '+')
5902 break;
5903 i++;
cristybb503372010-05-27 20:51:26 +00005904 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005905 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005906 type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
cristy3ed852e2009-09-05 21:47:34 +00005907 if (type < 0)
5908 ThrowMogrifyException(OptionError,"UnrecognizedImageType",
5909 argv[i]);
5910 break;
5911 }
5912 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5913 }
5914 case 'u':
5915 {
5916 if (LocaleCompare("undercolor",option+1) == 0)
5917 {
5918 if (*option == '+')
5919 break;
5920 i++;
cristybb503372010-05-27 20:51:26 +00005921 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005922 ThrowMogrifyException(OptionError,"MissingArgument",option);
5923 break;
5924 }
5925 if (LocaleCompare("unique-colors",option+1) == 0)
5926 break;
5927 if (LocaleCompare("units",option+1) == 0)
5928 {
cristybb503372010-05-27 20:51:26 +00005929 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005930 units;
5931
5932 if (*option == '+')
5933 break;
5934 i++;
cristybb503372010-05-27 20:51:26 +00005935 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005936 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00005937 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00005938 argv[i]);
5939 if (units < 0)
5940 ThrowMogrifyException(OptionError,"UnrecognizedUnitsType",
5941 argv[i]);
5942 break;
5943 }
5944 if (LocaleCompare("unsharp",option+1) == 0)
5945 {
5946 i++;
cristybb503372010-05-27 20:51:26 +00005947 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005948 ThrowMogrifyException(OptionError,"MissingArgument",option);
5949 if (IsGeometry(argv[i]) == MagickFalse)
5950 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5951 break;
5952 }
5953 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
5954 }
5955 case 'v':
5956 {
5957 if (LocaleCompare("verbose",option+1) == 0)
5958 {
5959 image_info->verbose=(*option == '-') ? MagickTrue : MagickFalse;
5960 break;
5961 }
5962 if ((LocaleCompare("version",option+1) == 0) ||
5963 (LocaleCompare("-version",option+1) == 0))
5964 {
cristyb51dff52011-05-19 16:55:47 +00005965 (void) FormatLocaleFile(stdout,"Version: %s\n",
cristybb503372010-05-27 20:51:26 +00005966 GetMagickVersion((size_t *) NULL));
cristy1e604812011-05-19 18:07:50 +00005967 (void) FormatLocaleFile(stdout,"Copyright: %s\n",
5968 GetMagickCopyright());
5969 (void) FormatLocaleFile(stdout,"Features: %s\n\n",
5970 GetMagickFeatures());
cristy3ed852e2009-09-05 21:47:34 +00005971 break;
5972 }
5973 if (LocaleCompare("view",option+1) == 0)
5974 {
5975 if (*option == '+')
5976 break;
5977 i++;
cristybb503372010-05-27 20:51:26 +00005978 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005979 ThrowMogrifyException(OptionError,"MissingArgument",option);
5980 break;
5981 }
5982 if (LocaleCompare("vignette",option+1) == 0)
5983 {
5984 if (*option == '+')
5985 break;
5986 i++;
cristybb503372010-05-27 20:51:26 +00005987 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00005988 ThrowMogrifyException(OptionError,"MissingArgument",option);
5989 if (IsGeometry(argv[i]) == MagickFalse)
5990 ThrowMogrifyInvalidArgumentException(option,argv[i]);
5991 break;
5992 }
5993 if (LocaleCompare("virtual-pixel",option+1) == 0)
5994 {
cristybb503372010-05-27 20:51:26 +00005995 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00005996 method;
5997
5998 if (*option == '+')
5999 break;
6000 i++;
cristybb503372010-05-27 20:51:26 +00006001 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006002 ThrowMogrifyException(OptionError,"MissingArgument",option);
cristy042ee782011-04-22 18:48:30 +00006003 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00006004 argv[i]);
6005 if (method < 0)
6006 ThrowMogrifyException(OptionError,
6007 "UnrecognizedVirtualPixelMethod",argv[i]);
6008 break;
6009 }
6010 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
6011 }
6012 case 'w':
6013 {
6014 if (LocaleCompare("wave",option+1) == 0)
6015 {
6016 i++;
cristybb503372010-05-27 20:51:26 +00006017 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006018 ThrowMogrifyException(OptionError,"MissingArgument",option);
6019 if (IsGeometry(argv[i]) == MagickFalse)
6020 ThrowMogrifyInvalidArgumentException(option,argv[i]);
6021 break;
6022 }
6023 if (LocaleCompare("weight",option+1) == 0)
6024 {
6025 if (*option == '+')
6026 break;
6027 i++;
cristybb503372010-05-27 20:51:26 +00006028 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00006029 ThrowMogrifyException(OptionError,"MissingArgument",option);
6030 break;
6031 }
6032 if (LocaleCompare("white-point",option+1) == 0)
6033 {
6034 if (*option == '+')
6035 break;
6036 i++;
cristybb503372010-05-27 20:51:26 +00006037 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006038 ThrowMogrifyException(OptionError,"MissingArgument",option);
6039 if (IsGeometry(argv[i]) == MagickFalse)
6040 ThrowMogrifyInvalidArgumentException(option,argv[i]);
6041 break;
6042 }
6043 if (LocaleCompare("white-threshold",option+1) == 0)
6044 {
6045 if (*option == '+')
6046 break;
6047 i++;
cristybb503372010-05-27 20:51:26 +00006048 if (i == (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006049 ThrowMogrifyException(OptionError,"MissingArgument",option);
6050 if (IsGeometry(argv[i]) == MagickFalse)
6051 ThrowMogrifyInvalidArgumentException(option,argv[i]);
6052 break;
6053 }
6054 if (LocaleCompare("write",option+1) == 0)
6055 {
6056 i++;
cristybb503372010-05-27 20:51:26 +00006057 if (i == (ssize_t) (argc-1))
cristy3ed852e2009-09-05 21:47:34 +00006058 ThrowMogrifyException(OptionError,"MissingArgument",option);
6059 break;
6060 }
6061 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
6062 }
6063 case '?':
6064 break;
6065 default:
6066 ThrowMogrifyException(OptionError,"UnrecognizedOption",option)
6067 }
cristy042ee782011-04-22 18:48:30 +00006068 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
6069 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
cristy3ed852e2009-09-05 21:47:34 +00006070 if (fire != MagickFalse)
6071 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
6072 }
6073 if (k != 0)
6074 ThrowMogrifyException(OptionError,"UnbalancedParenthesis",argv[i]);
cristycee97112010-05-28 00:44:52 +00006075 if (i != (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006076 ThrowMogrifyException(OptionError,"MissingAnImageFilename",argv[i]);
6077 DestroyMogrify();
6078 return(status != 0 ? MagickTrue : MagickFalse);
6079}
6080
6081/*
6082%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6083% %
6084% %
6085% %
6086+ M o g r i f y I m a g e I n f o %
6087% %
6088% %
6089% %
6090%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6091%
6092% MogrifyImageInfo() applies image processing settings to the image as
6093% prescribed by command line options.
6094%
6095% The format of the MogrifyImageInfo method is:
6096%
6097% MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,const int argc,
6098% const char **argv,ExceptionInfo *exception)
6099%
6100% A description of each parameter follows:
6101%
6102% o image_info: the image info..
6103%
6104% o argc: Specifies a pointer to an integer describing the number of
6105% elements in the argument vector.
6106%
6107% o argv: Specifies a pointer to a text array containing the command line
6108% arguments.
6109%
6110% o exception: return any errors or warnings in this structure.
6111%
6112*/
6113WandExport MagickBooleanType MogrifyImageInfo(ImageInfo *image_info,
6114 const int argc,const char **argv,ExceptionInfo *exception)
6115{
6116 const char
6117 *option;
6118
6119 GeometryInfo
6120 geometry_info;
6121
cristybb503372010-05-27 20:51:26 +00006122 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00006123 count;
6124
cristybb503372010-05-27 20:51:26 +00006125 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +00006126 i;
6127
6128 /*
6129 Initialize method variables.
6130 */
6131 assert(image_info != (ImageInfo *) NULL);
6132 assert(image_info->signature == MagickSignature);
6133 if (image_info->debug != MagickFalse)
6134 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
6135 image_info->filename);
6136 if (argc < 0)
6137 return(MagickTrue);
6138 /*
6139 Set the image settings.
6140 */
cristybb503372010-05-27 20:51:26 +00006141 for (i=0; i < (ssize_t) argc; i++)
cristy3ed852e2009-09-05 21:47:34 +00006142 {
6143 option=argv[i];
cristy042ee782011-04-22 18:48:30 +00006144 if (IsCommandOption(option) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +00006145 continue;
cristy042ee782011-04-22 18:48:30 +00006146 count=ParseCommandOption(MagickCommandOptions,MagickFalse,option);
anthonyce2716b2011-04-22 09:51:34 +00006147 count=MagickMax(count,0L);
cristycee97112010-05-28 00:44:52 +00006148 if ((i+count) >= (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00006149 break;
6150 switch (*(option+1))
6151 {
6152 case 'a':
6153 {
6154 if (LocaleCompare("adjoin",option+1) == 0)
6155 {
6156 image_info->adjoin=(*option == '-') ? MagickTrue : MagickFalse;
6157 break;
6158 }
6159 if (LocaleCompare("antialias",option+1) == 0)
6160 {
6161 image_info->antialias=(*option == '-') ? MagickTrue : MagickFalse;
6162 break;
6163 }
cristy3ed852e2009-09-05 21:47:34 +00006164 if (LocaleCompare("authenticate",option+1) == 0)
6165 {
6166 if (*option == '+')
anthony1afdc7a2011-10-05 11:54:28 +00006167 (void) DeleteImageOption(image_info,option+1);
cristy3ed852e2009-09-05 21:47:34 +00006168 else
anthony1afdc7a2011-10-05 11:54:28 +00006169 (void) SetImageOption(image_info,option+1,argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006170 break;
6171 }
6172 break;
6173 }
6174 case 'b':
6175 {
6176 if (LocaleCompare("background",option+1) == 0)
6177 {
6178 if (*option == '+')
6179 {
6180 (void) DeleteImageOption(image_info,option+1);
cristy9950d572011-10-01 18:22:35 +00006181 (void) QueryColorCompliance(MogrifyBackgroundColor,
6182 AllCompliance,&image_info->background_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006183 break;
6184 }
6185 (void) SetImageOption(image_info,option+1,argv[i+1]);
cristy9950d572011-10-01 18:22:35 +00006186 (void) QueryColorCompliance(argv[i+1],AllCompliance,
6187 &image_info->background_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006188 break;
6189 }
6190 if (LocaleCompare("bias",option+1) == 0)
6191 {
6192 if (*option == '+')
6193 {
6194 (void) SetImageOption(image_info,option+1,"0.0");
6195 break;
6196 }
6197 (void) SetImageOption(image_info,option+1,argv[i+1]);
6198 break;
6199 }
6200 if (LocaleCompare("black-point-compensation",option+1) == 0)
6201 {
6202 if (*option == '+')
6203 {
6204 (void) SetImageOption(image_info,option+1,"false");
6205 break;
6206 }
6207 (void) SetImageOption(image_info,option+1,"true");
6208 break;
6209 }
6210 if (LocaleCompare("blue-primary",option+1) == 0)
6211 {
6212 if (*option == '+')
6213 {
6214 (void) SetImageOption(image_info,option+1,"0.0");
6215 break;
6216 }
6217 (void) SetImageOption(image_info,option+1,argv[i+1]);
6218 break;
6219 }
6220 if (LocaleCompare("bordercolor",option+1) == 0)
6221 {
6222 if (*option == '+')
6223 {
6224 (void) DeleteImageOption(image_info,option+1);
cristy9950d572011-10-01 18:22:35 +00006225 (void) QueryColorCompliance(MogrifyBorderColor,AllCompliance,
cristy638895a2011-08-06 23:19:14 +00006226 &image_info->border_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006227 break;
6228 }
cristy9950d572011-10-01 18:22:35 +00006229 (void) QueryColorCompliance(argv[i+1],AllCompliance,
6230 &image_info->border_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006231 (void) SetImageOption(image_info,option+1,argv[i+1]);
6232 break;
6233 }
6234 if (LocaleCompare("box",option+1) == 0)
6235 {
6236 if (*option == '+')
6237 {
6238 (void) SetImageOption(image_info,"undercolor","none");
6239 break;
6240 }
6241 (void) SetImageOption(image_info,"undercolor",argv[i+1]);
6242 break;
6243 }
6244 break;
6245 }
6246 case 'c':
6247 {
6248 if (LocaleCompare("cache",option+1) == 0)
6249 {
6250 MagickSizeType
6251 limit;
6252
6253 limit=MagickResourceInfinity;
6254 if (LocaleCompare("unlimited",argv[i+1]) != 0)
cristy9b34e302011-11-05 02:15:45 +00006255 limit=(MagickSizeType) SiPrefixToDoubleInterval(argv[i+1],
6256 100.0);
cristy3ed852e2009-09-05 21:47:34 +00006257 (void) SetMagickResourceLimit(MemoryResource,limit);
6258 (void) SetMagickResourceLimit(MapResource,2*limit);
6259 break;
6260 }
6261 if (LocaleCompare("caption",option+1) == 0)
6262 {
6263 if (*option == '+')
6264 {
6265 (void) DeleteImageOption(image_info,option+1);
6266 break;
6267 }
6268 (void) SetImageOption(image_info,option+1,argv[i+1]);
6269 break;
6270 }
6271 if (LocaleCompare("channel",option+1) == 0)
6272 {
6273 if (*option == '+')
6274 {
6275 image_info->channel=DefaultChannels;
6276 break;
6277 }
6278 image_info->channel=(ChannelType) ParseChannelOption(argv[i+1]);
6279 break;
6280 }
cristy3ed852e2009-09-05 21:47:34 +00006281 if (LocaleCompare("colorspace",option+1) == 0)
6282 {
6283 if (*option == '+')
6284 {
6285 image_info->colorspace=UndefinedColorspace;
6286 (void) SetImageOption(image_info,option+1,"undefined");
6287 break;
6288 }
cristy042ee782011-04-22 18:48:30 +00006289 image_info->colorspace=(ColorspaceType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006290 MagickColorspaceOptions,MagickFalse,argv[i+1]);
6291 (void) SetImageOption(image_info,option+1,argv[i+1]);
6292 break;
6293 }
cristy3ed852e2009-09-05 21:47:34 +00006294 if (LocaleCompare("comment",option+1) == 0)
6295 {
6296 if (*option == '+')
6297 {
6298 (void) DeleteImageOption(image_info,option+1);
6299 break;
6300 }
6301 (void) SetImageOption(image_info,option+1,argv[i+1]);
6302 break;
6303 }
6304 if (LocaleCompare("compose",option+1) == 0)
6305 {
6306 if (*option == '+')
6307 {
6308 (void) SetImageOption(image_info,option+1,"undefined");
6309 break;
6310 }
6311 (void) SetImageOption(image_info,option+1,argv[i+1]);
6312 break;
6313 }
6314 if (LocaleCompare("compress",option+1) == 0)
6315 {
6316 if (*option == '+')
6317 {
6318 image_info->compression=UndefinedCompression;
6319 (void) SetImageOption(image_info,option+1,"undefined");
6320 break;
6321 }
cristy042ee782011-04-22 18:48:30 +00006322 image_info->compression=(CompressionType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006323 MagickCompressOptions,MagickFalse,argv[i+1]);
6324 (void) SetImageOption(image_info,option+1,argv[i+1]);
6325 break;
6326 }
6327 break;
6328 }
6329 case 'd':
6330 {
6331 if (LocaleCompare("debug",option+1) == 0)
6332 {
6333 if (*option == '+')
6334 (void) SetLogEventMask("none");
6335 else
6336 (void) SetLogEventMask(argv[i+1]);
6337 image_info->debug=IsEventLogging();
6338 break;
6339 }
6340 if (LocaleCompare("define",option+1) == 0)
6341 {
6342 if (*option == '+')
6343 {
6344 if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
6345 (void) DeleteImageRegistry(argv[i+1]+9);
6346 else
6347 (void) DeleteImageOption(image_info,argv[i+1]);
6348 break;
6349 }
6350 if (LocaleNCompare(argv[i+1],"registry:",9) == 0)
6351 {
6352 (void) DefineImageRegistry(StringRegistryType,argv[i+1]+9,
6353 exception);
6354 break;
6355 }
6356 (void) DefineImageOption(image_info,argv[i+1]);
6357 break;
6358 }
6359 if (LocaleCompare("delay",option+1) == 0)
6360 {
6361 if (*option == '+')
6362 {
6363 (void) SetImageOption(image_info,option+1,"0");
6364 break;
6365 }
6366 (void) SetImageOption(image_info,option+1,argv[i+1]);
6367 break;
6368 }
6369 if (LocaleCompare("density",option+1) == 0)
6370 {
6371 /*
6372 Set image density.
6373 */
6374 if (*option == '+')
6375 {
6376 if (image_info->density != (char *) NULL)
6377 image_info->density=DestroyString(image_info->density);
6378 (void) SetImageOption(image_info,option+1,"72");
6379 break;
6380 }
6381 (void) CloneString(&image_info->density,argv[i+1]);
6382 (void) SetImageOption(image_info,option+1,argv[i+1]);
6383 break;
6384 }
6385 if (LocaleCompare("depth",option+1) == 0)
6386 {
6387 if (*option == '+')
6388 {
6389 image_info->depth=MAGICKCORE_QUANTUM_DEPTH;
6390 break;
6391 }
cristye27293e2009-12-18 02:53:20 +00006392 image_info->depth=StringToUnsignedLong(argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006393 break;
6394 }
cristyc9b12952010-03-28 01:12:28 +00006395 if (LocaleCompare("direction",option+1) == 0)
6396 {
6397 if (*option == '+')
6398 {
6399 (void) SetImageOption(image_info,option+1,"undefined");
6400 break;
6401 }
6402 (void) SetImageOption(image_info,option+1,argv[i+1]);
6403 break;
6404 }
cristy3ed852e2009-09-05 21:47:34 +00006405 if (LocaleCompare("display",option+1) == 0)
6406 {
6407 if (*option == '+')
6408 {
6409 if (image_info->server_name != (char *) NULL)
6410 image_info->server_name=DestroyString(
6411 image_info->server_name);
6412 break;
6413 }
6414 (void) CloneString(&image_info->server_name,argv[i+1]);
6415 break;
6416 }
6417 if (LocaleCompare("dispose",option+1) == 0)
6418 {
6419 if (*option == '+')
6420 {
6421 (void) SetImageOption(image_info,option+1,"undefined");
6422 break;
6423 }
6424 (void) SetImageOption(image_info,option+1,argv[i+1]);
6425 break;
6426 }
6427 if (LocaleCompare("dither",option+1) == 0)
6428 {
6429 if (*option == '+')
6430 {
6431 image_info->dither=MagickFalse;
cristyd5acfd12010-06-15 00:11:38 +00006432 (void) SetImageOption(image_info,option+1,"none");
cristy3ed852e2009-09-05 21:47:34 +00006433 break;
6434 }
6435 (void) SetImageOption(image_info,option+1,argv[i+1]);
6436 image_info->dither=MagickTrue;
6437 break;
6438 }
6439 break;
6440 }
6441 case 'e':
6442 {
6443 if (LocaleCompare("encoding",option+1) == 0)
6444 {
6445 if (*option == '+')
6446 {
6447 (void) SetImageOption(image_info,option+1,"undefined");
6448 break;
6449 }
6450 (void) SetImageOption(image_info,option+1,argv[i+1]);
6451 break;
6452 }
6453 if (LocaleCompare("endian",option+1) == 0)
6454 {
6455 if (*option == '+')
6456 {
6457 image_info->endian=UndefinedEndian;
6458 (void) SetImageOption(image_info,option+1,"undefined");
6459 break;
6460 }
cristy042ee782011-04-22 18:48:30 +00006461 image_info->endian=(EndianType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006462 MagickEndianOptions,MagickFalse,argv[i+1]);
6463 (void) SetImageOption(image_info,option+1,argv[i+1]);
6464 break;
6465 }
6466 if (LocaleCompare("extract",option+1) == 0)
6467 {
6468 /*
6469 Set image extract geometry.
6470 */
6471 if (*option == '+')
6472 {
6473 if (image_info->extract != (char *) NULL)
6474 image_info->extract=DestroyString(image_info->extract);
6475 break;
6476 }
6477 (void) CloneString(&image_info->extract,argv[i+1]);
6478 break;
6479 }
6480 break;
6481 }
6482 case 'f':
6483 {
6484 if (LocaleCompare("fill",option+1) == 0)
6485 {
6486 if (*option == '+')
6487 {
6488 (void) SetImageOption(image_info,option+1,"none");
6489 break;
6490 }
6491 (void) SetImageOption(image_info,option+1,argv[i+1]);
6492 break;
6493 }
6494 if (LocaleCompare("filter",option+1) == 0)
6495 {
6496 if (*option == '+')
6497 {
6498 (void) SetImageOption(image_info,option+1,"undefined");
6499 break;
6500 }
6501 (void) SetImageOption(image_info,option+1,argv[i+1]);
6502 break;
6503 }
6504 if (LocaleCompare("font",option+1) == 0)
6505 {
6506 if (*option == '+')
6507 {
6508 if (image_info->font != (char *) NULL)
6509 image_info->font=DestroyString(image_info->font);
6510 break;
6511 }
6512 (void) CloneString(&image_info->font,argv[i+1]);
6513 break;
6514 }
6515 if (LocaleCompare("format",option+1) == 0)
6516 {
6517 register const char
6518 *q;
6519
6520 for (q=strchr(argv[i+1],'%'); q != (char *) NULL; q=strchr(q+1,'%'))
cristy9ed85672011-03-02 00:19:13 +00006521 if (strchr("Agkrz@[#",*(q+1)) != (char *) NULL)
cristy3ed852e2009-09-05 21:47:34 +00006522 image_info->ping=MagickFalse;
6523 (void) SetImageOption(image_info,option+1,argv[i+1]);
6524 break;
6525 }
6526 if (LocaleCompare("fuzz",option+1) == 0)
6527 {
6528 if (*option == '+')
6529 {
6530 image_info->fuzz=0.0;
6531 (void) SetImageOption(image_info,option+1,"0");
6532 break;
6533 }
cristydbdd0e32011-11-04 23:29:40 +00006534 image_info->fuzz=StringToDoubleInterval(argv[i+1],(double)
6535 QuantumRange+1.0);
cristy3ed852e2009-09-05 21:47:34 +00006536 (void) SetImageOption(image_info,option+1,argv[i+1]);
6537 break;
6538 }
6539 break;
6540 }
6541 case 'g':
6542 {
6543 if (LocaleCompare("gravity",option+1) == 0)
6544 {
6545 if (*option == '+')
6546 {
6547 (void) SetImageOption(image_info,option+1,"undefined");
6548 break;
6549 }
6550 (void) SetImageOption(image_info,option+1,argv[i+1]);
6551 break;
6552 }
6553 if (LocaleCompare("green-primary",option+1) == 0)
6554 {
6555 if (*option == '+')
6556 {
6557 (void) SetImageOption(image_info,option+1,"0.0");
6558 break;
6559 }
6560 (void) SetImageOption(image_info,option+1,argv[i+1]);
6561 break;
6562 }
6563 break;
6564 }
6565 case 'i':
6566 {
6567 if (LocaleCompare("intent",option+1) == 0)
6568 {
6569 if (*option == '+')
6570 {
6571 (void) SetImageOption(image_info,option+1,"undefined");
6572 break;
6573 }
6574 (void) SetImageOption(image_info,option+1,argv[i+1]);
6575 break;
6576 }
6577 if (LocaleCompare("interlace",option+1) == 0)
6578 {
6579 if (*option == '+')
6580 {
6581 image_info->interlace=UndefinedInterlace;
6582 (void) SetImageOption(image_info,option+1,"undefined");
6583 break;
6584 }
cristy042ee782011-04-22 18:48:30 +00006585 image_info->interlace=(InterlaceType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006586 MagickInterlaceOptions,MagickFalse,argv[i+1]);
6587 (void) SetImageOption(image_info,option+1,argv[i+1]);
6588 break;
6589 }
cristyb32b90a2009-09-07 21:45:48 +00006590 if (LocaleCompare("interline-spacing",option+1) == 0)
6591 {
6592 if (*option == '+')
6593 {
6594 (void) SetImageOption(image_info,option+1,"undefined");
6595 break;
6596 }
6597 (void) SetImageOption(image_info,option+1,argv[i+1]);
6598 break;
6599 }
cristy3ed852e2009-09-05 21:47:34 +00006600 if (LocaleCompare("interpolate",option+1) == 0)
6601 {
6602 if (*option == '+')
6603 {
6604 (void) SetImageOption(image_info,option+1,"undefined");
6605 break;
6606 }
6607 (void) SetImageOption(image_info,option+1,argv[i+1]);
6608 break;
6609 }
6610 if (LocaleCompare("interword-spacing",option+1) == 0)
6611 {
6612 if (*option == '+')
6613 {
6614 (void) SetImageOption(image_info,option+1,"undefined");
6615 break;
6616 }
6617 (void) SetImageOption(image_info,option+1,argv[i+1]);
6618 break;
6619 }
6620 break;
6621 }
6622 case 'k':
6623 {
6624 if (LocaleCompare("kerning",option+1) == 0)
6625 {
6626 if (*option == '+')
6627 {
6628 (void) SetImageOption(image_info,option+1,"undefined");
6629 break;
6630 }
6631 (void) SetImageOption(image_info,option+1,argv[i+1]);
6632 break;
6633 }
6634 break;
6635 }
6636 case 'l':
6637 {
6638 if (LocaleCompare("label",option+1) == 0)
6639 {
6640 if (*option == '+')
6641 {
6642 (void) DeleteImageOption(image_info,option+1);
6643 break;
6644 }
6645 (void) SetImageOption(image_info,option+1,argv[i+1]);
6646 break;
6647 }
6648 if (LocaleCompare("limit",option+1) == 0)
6649 {
6650 MagickSizeType
6651 limit;
6652
6653 ResourceType
6654 type;
6655
6656 if (*option == '+')
6657 break;
cristy042ee782011-04-22 18:48:30 +00006658 type=(ResourceType) ParseCommandOption(MagickResourceOptions,
cristy3ed852e2009-09-05 21:47:34 +00006659 MagickFalse,argv[i+1]);
6660 limit=MagickResourceInfinity;
6661 if (LocaleCompare("unlimited",argv[i+2]) != 0)
cristy9b34e302011-11-05 02:15:45 +00006662 limit=(MagickSizeType) SiPrefixToDoubleInterval(argv[i+2],
6663 100.0);
cristy3ed852e2009-09-05 21:47:34 +00006664 (void) SetMagickResourceLimit(type,limit);
6665 break;
6666 }
6667 if (LocaleCompare("list",option+1) == 0)
6668 {
cristybb503372010-05-27 20:51:26 +00006669 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00006670 list;
6671
6672 /*
6673 Display configuration list.
6674 */
cristy042ee782011-04-22 18:48:30 +00006675 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006676 switch (list)
6677 {
6678 case MagickCoderOptions:
6679 {
6680 (void) ListCoderInfo((FILE *) NULL,exception);
6681 break;
6682 }
6683 case MagickColorOptions:
6684 {
6685 (void) ListColorInfo((FILE *) NULL,exception);
6686 break;
6687 }
6688 case MagickConfigureOptions:
6689 {
6690 (void) ListConfigureInfo((FILE *) NULL,exception);
6691 break;
6692 }
6693 case MagickDelegateOptions:
6694 {
6695 (void) ListDelegateInfo((FILE *) NULL,exception);
6696 break;
6697 }
6698 case MagickFontOptions:
6699 {
6700 (void) ListTypeInfo((FILE *) NULL,exception);
6701 break;
6702 }
6703 case MagickFormatOptions:
6704 {
6705 (void) ListMagickInfo((FILE *) NULL,exception);
6706 break;
6707 }
6708 case MagickLocaleOptions:
6709 {
6710 (void) ListLocaleInfo((FILE *) NULL,exception);
6711 break;
6712 }
6713 case MagickLogOptions:
6714 {
6715 (void) ListLogInfo((FILE *) NULL,exception);
6716 break;
6717 }
6718 case MagickMagicOptions:
6719 {
6720 (void) ListMagicInfo((FILE *) NULL,exception);
6721 break;
6722 }
6723 case MagickMimeOptions:
6724 {
6725 (void) ListMimeInfo((FILE *) NULL,exception);
6726 break;
6727 }
6728 case MagickModuleOptions:
6729 {
6730 (void) ListModuleInfo((FILE *) NULL,exception);
6731 break;
6732 }
6733 case MagickPolicyOptions:
6734 {
6735 (void) ListPolicyInfo((FILE *) NULL,exception);
6736 break;
6737 }
6738 case MagickResourceOptions:
6739 {
6740 (void) ListMagickResourceInfo((FILE *) NULL,exception);
6741 break;
6742 }
6743 case MagickThresholdOptions:
6744 {
6745 (void) ListThresholdMaps((FILE *) NULL,exception);
6746 break;
6747 }
6748 default:
6749 {
cristy042ee782011-04-22 18:48:30 +00006750 (void) ListCommandOptions((FILE *) NULL,(CommandOption) list,
cristy3ed852e2009-09-05 21:47:34 +00006751 exception);
6752 break;
6753 }
6754 }
cristyaeb2cbc2010-05-07 13:28:58 +00006755 break;
cristy3ed852e2009-09-05 21:47:34 +00006756 }
6757 if (LocaleCompare("log",option+1) == 0)
6758 {
6759 if (*option == '+')
6760 break;
6761 (void) SetLogFormat(argv[i+1]);
6762 break;
6763 }
6764 if (LocaleCompare("loop",option+1) == 0)
6765 {
6766 if (*option == '+')
6767 {
6768 (void) SetImageOption(image_info,option+1,"0");
6769 break;
6770 }
6771 (void) SetImageOption(image_info,option+1,argv[i+1]);
6772 break;
6773 }
6774 break;
6775 }
6776 case 'm':
6777 {
6778 if (LocaleCompare("matte",option+1) == 0)
6779 {
6780 if (*option == '+')
6781 {
6782 (void) SetImageOption(image_info,option+1,"false");
6783 break;
6784 }
6785 (void) SetImageOption(image_info,option+1,"true");
6786 break;
6787 }
6788 if (LocaleCompare("mattecolor",option+1) == 0)
6789 {
6790 if (*option == '+')
6791 {
6792 (void) SetImageOption(image_info,option+1,argv[i+1]);
cristy9950d572011-10-01 18:22:35 +00006793 (void) QueryColorCompliance(MogrifyMatteColor,AllCompliance,
cristy638895a2011-08-06 23:19:14 +00006794 &image_info->matte_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006795 break;
6796 }
6797 (void) SetImageOption(image_info,option+1,argv[i+1]);
cristy9950d572011-10-01 18:22:35 +00006798 (void) QueryColorCompliance(argv[i+1],AllCompliance,
6799 &image_info->matte_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00006800 break;
6801 }
6802 if (LocaleCompare("monitor",option+1) == 0)
6803 {
6804 (void) SetImageInfoProgressMonitor(image_info,MonitorProgress,
6805 (void *) NULL);
6806 break;
6807 }
6808 if (LocaleCompare("monochrome",option+1) == 0)
6809 {
6810 image_info->monochrome=(*option == '-') ? MagickTrue : MagickFalse;
6811 break;
6812 }
6813 break;
6814 }
6815 case 'o':
6816 {
6817 if (LocaleCompare("orient",option+1) == 0)
6818 {
6819 if (*option == '+')
6820 {
6821 image_info->orientation=UndefinedOrientation;
6822 (void) SetImageOption(image_info,option+1,"undefined");
6823 break;
6824 }
cristy042ee782011-04-22 18:48:30 +00006825 image_info->orientation=(OrientationType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006826 MagickOrientationOptions,MagickFalse,argv[i+1]);
cristyc6e214d2010-08-08 00:31:08 +00006827 (void) SetImageOption(image_info,option+1,argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006828 break;
6829 }
6830 }
6831 case 'p':
6832 {
6833 if (LocaleCompare("page",option+1) == 0)
6834 {
6835 char
6836 *canonical_page,
6837 page[MaxTextExtent];
6838
6839 const char
6840 *image_option;
6841
6842 MagickStatusType
6843 flags;
6844
6845 RectangleInfo
6846 geometry;
6847
6848 if (*option == '+')
6849 {
6850 (void) DeleteImageOption(image_info,option+1);
6851 (void) CloneString(&image_info->page,(char *) NULL);
6852 break;
6853 }
6854 (void) ResetMagickMemory(&geometry,0,sizeof(geometry));
6855 image_option=GetImageOption(image_info,"page");
6856 if (image_option != (const char *) NULL)
6857 flags=ParseAbsoluteGeometry(image_option,&geometry);
6858 canonical_page=GetPageGeometry(argv[i+1]);
6859 flags=ParseAbsoluteGeometry(canonical_page,&geometry);
6860 canonical_page=DestroyString(canonical_page);
cristyb51dff52011-05-19 16:55:47 +00006861 (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu",
cristyf2faecf2010-05-28 19:19:36 +00006862 (unsigned long) geometry.width,(unsigned long) geometry.height);
cristy3ed852e2009-09-05 21:47:34 +00006863 if (((flags & XValue) != 0) || ((flags & YValue) != 0))
cristyb51dff52011-05-19 16:55:47 +00006864 (void) FormatLocaleString(page,MaxTextExtent,"%lux%lu%+ld%+ld",
cristyf2faecf2010-05-28 19:19:36 +00006865 (unsigned long) geometry.width,(unsigned long) geometry.height,
6866 (long) geometry.x,(long) geometry.y);
cristy3ed852e2009-09-05 21:47:34 +00006867 (void) SetImageOption(image_info,option+1,page);
6868 (void) CloneString(&image_info->page,page);
6869 break;
6870 }
6871 if (LocaleCompare("pen",option+1) == 0)
6872 {
6873 if (*option == '+')
6874 {
6875 (void) SetImageOption(image_info,option+1,"none");
6876 break;
6877 }
6878 (void) SetImageOption(image_info,option+1,argv[i+1]);
6879 break;
6880 }
6881 if (LocaleCompare("ping",option+1) == 0)
6882 {
6883 image_info->ping=(*option == '-') ? MagickTrue : MagickFalse;
6884 break;
6885 }
6886 if (LocaleCompare("pointsize",option+1) == 0)
6887 {
6888 if (*option == '+')
6889 geometry_info.rho=0.0;
6890 else
6891 (void) ParseGeometry(argv[i+1],&geometry_info);
6892 image_info->pointsize=geometry_info.rho;
6893 break;
6894 }
cristye7f51092010-01-17 00:39:37 +00006895 if (LocaleCompare("precision",option+1) == 0)
6896 {
cristybf2766a2010-01-17 03:33:23 +00006897 (void) SetMagickPrecision(StringToInteger(argv[i+1]));
cristye7f51092010-01-17 00:39:37 +00006898 break;
6899 }
cristy3ed852e2009-09-05 21:47:34 +00006900 if (LocaleCompare("preview",option+1) == 0)
6901 {
6902 /*
6903 Preview image.
6904 */
6905 if (*option == '+')
6906 {
6907 image_info->preview_type=UndefinedPreview;
6908 break;
6909 }
cristy042ee782011-04-22 18:48:30 +00006910 image_info->preview_type=(PreviewType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00006911 MagickPreviewOptions,MagickFalse,argv[i+1]);
6912 break;
6913 }
6914 break;
6915 }
6916 case 'q':
6917 {
6918 if (LocaleCompare("quality",option+1) == 0)
6919 {
6920 /*
6921 Set image compression quality.
6922 */
6923 if (*option == '+')
6924 {
6925 image_info->quality=UndefinedCompressionQuality;
6926 (void) SetImageOption(image_info,option+1,"0");
6927 break;
6928 }
cristye27293e2009-12-18 02:53:20 +00006929 image_info->quality=StringToUnsignedLong(argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006930 (void) SetImageOption(image_info,option+1,argv[i+1]);
6931 break;
6932 }
6933 if (LocaleCompare("quiet",option+1) == 0)
6934 {
6935 static WarningHandler
6936 warning_handler = (WarningHandler) NULL;
6937
6938 if (*option == '+')
6939 {
6940 /*
6941 Restore error or warning messages.
6942 */
6943 warning_handler=SetWarningHandler(warning_handler);
6944 break;
6945 }
6946 /*
6947 Suppress error or warning messages.
6948 */
6949 warning_handler=SetWarningHandler((WarningHandler) NULL);
6950 break;
6951 }
6952 break;
6953 }
6954 case 'r':
6955 {
6956 if (LocaleCompare("red-primary",option+1) == 0)
6957 {
6958 if (*option == '+')
6959 {
6960 (void) SetImageOption(image_info,option+1,"0.0");
6961 break;
6962 }
6963 (void) SetImageOption(image_info,option+1,argv[i+1]);
6964 break;
6965 }
6966 break;
6967 }
6968 case 's':
6969 {
6970 if (LocaleCompare("sampling-factor",option+1) == 0)
6971 {
6972 /*
6973 Set image sampling factor.
6974 */
6975 if (*option == '+')
6976 {
6977 if (image_info->sampling_factor != (char *) NULL)
6978 image_info->sampling_factor=DestroyString(
6979 image_info->sampling_factor);
6980 break;
6981 }
6982 (void) CloneString(&image_info->sampling_factor,argv[i+1]);
6983 break;
6984 }
6985 if (LocaleCompare("scene",option+1) == 0)
6986 {
6987 /*
6988 Set image scene.
6989 */
6990 if (*option == '+')
6991 {
6992 image_info->scene=0;
6993 (void) SetImageOption(image_info,option+1,"0");
6994 break;
6995 }
cristye27293e2009-12-18 02:53:20 +00006996 image_info->scene=StringToUnsignedLong(argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00006997 (void) SetImageOption(image_info,option+1,argv[i+1]);
6998 break;
6999 }
7000 if (LocaleCompare("seed",option+1) == 0)
7001 {
cristybb503372010-05-27 20:51:26 +00007002 size_t
cristy3ed852e2009-09-05 21:47:34 +00007003 seed;
7004
7005 if (*option == '+')
7006 {
cristybb503372010-05-27 20:51:26 +00007007 seed=(size_t) time((time_t *) NULL);
cristy3ed852e2009-09-05 21:47:34 +00007008 SeedPseudoRandomGenerator(seed);
7009 break;
7010 }
cristye27293e2009-12-18 02:53:20 +00007011 seed=StringToUnsignedLong(argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00007012 SeedPseudoRandomGenerator(seed);
7013 break;
7014 }
7015 if (LocaleCompare("size",option+1) == 0)
7016 {
7017 if (*option == '+')
7018 {
7019 if (image_info->size != (char *) NULL)
7020 image_info->size=DestroyString(image_info->size);
7021 break;
7022 }
7023 (void) CloneString(&image_info->size,argv[i+1]);
7024 break;
7025 }
7026 if (LocaleCompare("stroke",option+1) == 0)
7027 {
7028 if (*option == '+')
7029 {
7030 (void) SetImageOption(image_info,option+1,"none");
7031 break;
7032 }
7033 (void) SetImageOption(image_info,option+1,argv[i+1]);
7034 break;
7035 }
7036 if (LocaleCompare("strokewidth",option+1) == 0)
7037 {
7038 if (*option == '+')
7039 {
7040 (void) SetImageOption(image_info,option+1,"0");
7041 break;
7042 }
7043 (void) SetImageOption(image_info,option+1,argv[i+1]);
7044 break;
7045 }
cristyd9a29192010-10-16 16:49:53 +00007046 if (LocaleCompare("synchronize",option+1) == 0)
7047 {
7048 if (*option == '+')
7049 {
7050 image_info->synchronize=MagickFalse;
7051 break;
7052 }
7053 image_info->synchronize=MagickTrue;
7054 break;
7055 }
cristy3ed852e2009-09-05 21:47:34 +00007056 break;
7057 }
7058 case 't':
7059 {
7060 if (LocaleCompare("taint",option+1) == 0)
7061 {
7062 if (*option == '+')
7063 {
7064 (void) SetImageOption(image_info,option+1,"false");
7065 break;
7066 }
7067 (void) SetImageOption(image_info,option+1,"true");
7068 break;
7069 }
7070 if (LocaleCompare("texture",option+1) == 0)
7071 {
7072 if (*option == '+')
7073 {
7074 if (image_info->texture != (char *) NULL)
7075 image_info->texture=DestroyString(image_info->texture);
7076 break;
7077 }
7078 (void) CloneString(&image_info->texture,argv[i+1]);
7079 break;
7080 }
7081 if (LocaleCompare("tile-offset",option+1) == 0)
7082 {
7083 if (*option == '+')
7084 {
7085 (void) SetImageOption(image_info,option+1,"0");
7086 break;
7087 }
7088 (void) SetImageOption(image_info,option+1,argv[i+1]);
7089 break;
7090 }
7091 if (LocaleCompare("transparent-color",option+1) == 0)
7092 {
7093 if (*option == '+')
7094 {
cristy9950d572011-10-01 18:22:35 +00007095 (void) QueryColorCompliance("none",AllCompliance,
7096 &image_info->transparent_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00007097 (void) SetImageOption(image_info,option+1,"none");
7098 break;
7099 }
cristy9950d572011-10-01 18:22:35 +00007100 (void) QueryColorCompliance(argv[i+1],AllCompliance,
7101 &image_info->transparent_color,exception);
cristy3ed852e2009-09-05 21:47:34 +00007102 (void) SetImageOption(image_info,option+1,argv[i+1]);
7103 break;
7104 }
7105 if (LocaleCompare("type",option+1) == 0)
7106 {
7107 if (*option == '+')
7108 {
cristy5f1c1ff2010-12-23 21:38:06 +00007109 image_info->type=UndefinedType;
cristy3ed852e2009-09-05 21:47:34 +00007110 (void) SetImageOption(image_info,option+1,"undefined");
7111 break;
7112 }
cristy042ee782011-04-22 18:48:30 +00007113 image_info->type=(ImageType) ParseCommandOption(MagickTypeOptions,
cristy3ed852e2009-09-05 21:47:34 +00007114 MagickFalse,argv[i+1]);
7115 (void) SetImageOption(image_info,option+1,argv[i+1]);
7116 break;
7117 }
7118 break;
7119 }
7120 case 'u':
7121 {
7122 if (LocaleCompare("undercolor",option+1) == 0)
7123 {
7124 if (*option == '+')
7125 {
7126 (void) DeleteImageOption(image_info,option+1);
7127 break;
7128 }
7129 (void) SetImageOption(image_info,option+1,argv[i+1]);
7130 break;
7131 }
7132 if (LocaleCompare("units",option+1) == 0)
7133 {
7134 if (*option == '+')
7135 {
7136 image_info->units=UndefinedResolution;
7137 (void) SetImageOption(image_info,option+1,"undefined");
7138 break;
7139 }
cristy042ee782011-04-22 18:48:30 +00007140 image_info->units=(ResolutionType) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00007141 MagickResolutionOptions,MagickFalse,argv[i+1]);
7142 (void) SetImageOption(image_info,option+1,argv[i+1]);
7143 break;
7144 }
7145 break;
7146 }
7147 case 'v':
7148 {
7149 if (LocaleCompare("verbose",option+1) == 0)
7150 {
7151 if (*option == '+')
7152 {
7153 image_info->verbose=MagickFalse;
7154 break;
7155 }
7156 image_info->verbose=MagickTrue;
7157 image_info->ping=MagickFalse;
7158 break;
7159 }
7160 if (LocaleCompare("view",option+1) == 0)
7161 {
7162 if (*option == '+')
7163 {
7164 if (image_info->view != (char *) NULL)
7165 image_info->view=DestroyString(image_info->view);
7166 break;
7167 }
7168 (void) CloneString(&image_info->view,argv[i+1]);
7169 break;
7170 }
7171 if (LocaleCompare("virtual-pixel",option+1) == 0)
7172 {
7173 if (*option == '+')
7174 {
7175 image_info->virtual_pixel_method=UndefinedVirtualPixelMethod;
7176 (void) SetImageOption(image_info,option+1,"undefined");
7177 break;
7178 }
7179 image_info->virtual_pixel_method=(VirtualPixelMethod)
cristy042ee782011-04-22 18:48:30 +00007180 ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
cristy3ed852e2009-09-05 21:47:34 +00007181 argv[i+1]);
7182 (void) SetImageOption(image_info,option+1,argv[i+1]);
7183 break;
7184 }
7185 break;
7186 }
7187 case 'w':
7188 {
7189 if (LocaleCompare("white-point",option+1) == 0)
7190 {
7191 if (*option == '+')
7192 {
7193 (void) SetImageOption(image_info,option+1,"0.0");
7194 break;
7195 }
7196 (void) SetImageOption(image_info,option+1,argv[i+1]);
7197 break;
7198 }
7199 break;
7200 }
7201 default:
7202 break;
7203 }
7204 i+=count;
7205 }
7206 return(MagickTrue);
7207}
7208
7209/*
7210%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7211% %
7212% %
7213% %
7214+ M o g r i f y I m a g e L i s t %
7215% %
7216% %
7217% %
7218%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7219%
7220% MogrifyImageList() applies any command line options that might affect the
7221% entire image list (e.g. -append, -coalesce, etc.).
7222%
7223% The format of the MogrifyImage method is:
7224%
7225% MagickBooleanType MogrifyImageList(ImageInfo *image_info,const int argc,
7226% const char **argv,Image **images,ExceptionInfo *exception)
7227%
7228% A description of each parameter follows:
7229%
7230% o image_info: the image info..
7231%
7232% o argc: Specifies a pointer to an integer describing the number of
7233% elements in the argument vector.
7234%
7235% o argv: Specifies a pointer to a text array containing the command line
7236% arguments.
7237%
anthonye9c27192011-03-27 08:07:06 +00007238% o images: pointer to pointer of the first image in image list.
cristy3ed852e2009-09-05 21:47:34 +00007239%
7240% o exception: return any errors or warnings in this structure.
7241%
7242*/
7243WandExport MagickBooleanType MogrifyImageList(ImageInfo *image_info,
7244 const int argc,const char **argv,Image **images,ExceptionInfo *exception)
7245{
cristy3ed852e2009-09-05 21:47:34 +00007246 const char
7247 *option;
7248
cristy6b3da3a2010-06-20 02:21:46 +00007249 ImageInfo
7250 *mogrify_info;
cristy3ed852e2009-09-05 21:47:34 +00007251
7252 MagickStatusType
7253 status;
7254
cristy28474bf2011-09-11 23:32:52 +00007255 PixelInterpolateMethod
7256 interpolate_method;
7257
cristy3ed852e2009-09-05 21:47:34 +00007258 QuantizeInfo
7259 *quantize_info;
7260
cristybb503372010-05-27 20:51:26 +00007261 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +00007262 i;
7263
cristy6b3da3a2010-06-20 02:21:46 +00007264 ssize_t
7265 count,
7266 index;
7267
cristy3ed852e2009-09-05 21:47:34 +00007268 /*
7269 Apply options to the image list.
7270 */
7271 assert(image_info != (ImageInfo *) NULL);
7272 assert(image_info->signature == MagickSignature);
7273 assert(images != (Image **) NULL);
anthonye9c27192011-03-27 08:07:06 +00007274 assert((*images)->previous == (Image *) NULL);
cristy3ed852e2009-09-05 21:47:34 +00007275 assert((*images)->signature == MagickSignature);
7276 if ((*images)->debug != MagickFalse)
7277 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
7278 (*images)->filename);
7279 if ((argc <= 0) || (*argv == (char *) NULL))
7280 return(MagickTrue);
cristy28474bf2011-09-11 23:32:52 +00007281 interpolate_method=UndefinedInterpolatePixel;
cristy6b3da3a2010-06-20 02:21:46 +00007282 mogrify_info=CloneImageInfo(image_info);
7283 quantize_info=AcquireQuantizeInfo(mogrify_info);
cristy3ed852e2009-09-05 21:47:34 +00007284 status=MagickTrue;
cristybb503372010-05-27 20:51:26 +00007285 for (i=0; i < (ssize_t) argc; i++)
cristy3ed852e2009-09-05 21:47:34 +00007286 {
cristy74fe8f12009-10-03 19:09:01 +00007287 if (*images == (Image *) NULL)
7288 break;
cristy3ed852e2009-09-05 21:47:34 +00007289 option=argv[i];
cristy042ee782011-04-22 18:48:30 +00007290 if (IsCommandOption(option) == MagickFalse)
cristy3ed852e2009-09-05 21:47:34 +00007291 continue;
cristy042ee782011-04-22 18:48:30 +00007292 count=ParseCommandOption(MagickCommandOptions,MagickFalse,option);
anthonyce2716b2011-04-22 09:51:34 +00007293 count=MagickMax(count,0L);
cristycee97112010-05-28 00:44:52 +00007294 if ((i+count) >= (ssize_t) argc)
cristy3ed852e2009-09-05 21:47:34 +00007295 break;
cristy6b3da3a2010-06-20 02:21:46 +00007296 status=MogrifyImageInfo(mogrify_info,(int) count+1,argv+i,exception);
cristy3ed852e2009-09-05 21:47:34 +00007297 switch (*(option+1))
7298 {
7299 case 'a':
7300 {
7301 if (LocaleCompare("affinity",option+1) == 0)
7302 {
cristy6fccee12011-10-20 18:43:18 +00007303 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007304 if (*option == '+')
7305 {
cristy018f07f2011-09-04 21:15:19 +00007306 (void) RemapImages(quantize_info,*images,(Image *) NULL,
7307 exception);
cristy3ed852e2009-09-05 21:47:34 +00007308 break;
7309 }
7310 i++;
7311 break;
7312 }
7313 if (LocaleCompare("append",option+1) == 0)
7314 {
7315 Image
7316 *append_image;
7317
cristy6fccee12011-10-20 18:43:18 +00007318 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007319 append_image=AppendImages(*images,*option == '-' ? MagickTrue :
7320 MagickFalse,exception);
7321 if (append_image == (Image *) NULL)
7322 {
7323 status=MagickFalse;
7324 break;
7325 }
7326 *images=DestroyImageList(*images);
7327 *images=append_image;
7328 break;
7329 }
7330 if (LocaleCompare("average",option+1) == 0)
7331 {
7332 Image
7333 *average_image;
7334
cristyd18ae7c2010-03-07 17:39:52 +00007335 /*
7336 Average an image sequence (deprecated).
7337 */
cristy6fccee12011-10-20 18:43:18 +00007338 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristyd18ae7c2010-03-07 17:39:52 +00007339 average_image=EvaluateImages(*images,MeanEvaluateOperator,
7340 exception);
cristy3ed852e2009-09-05 21:47:34 +00007341 if (average_image == (Image *) NULL)
7342 {
7343 status=MagickFalse;
7344 break;
7345 }
7346 *images=DestroyImageList(*images);
7347 *images=average_image;
7348 break;
7349 }
7350 break;
7351 }
7352 case 'c':
7353 {
7354 if (LocaleCompare("channel",option+1) == 0)
7355 {
cristyf4ad9df2011-07-08 16:49:03 +00007356 ChannelType
7357 channel;
7358
cristy3ed852e2009-09-05 21:47:34 +00007359 if (*option == '+')
7360 {
7361 channel=DefaultChannels;
7362 break;
7363 }
7364 channel=(ChannelType) ParseChannelOption(argv[i+1]);
cristyed231572011-07-14 02:18:59 +00007365 SetPixelChannelMap(*images,channel);
cristy3ed852e2009-09-05 21:47:34 +00007366 break;
7367 }
7368 if (LocaleCompare("clut",option+1) == 0)
7369 {
7370 Image
7371 *clut_image,
7372 *image;
7373
cristy6fccee12011-10-20 18:43:18 +00007374 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007375 image=RemoveFirstImageFromList(images);
7376 clut_image=RemoveFirstImageFromList(images);
7377 if (clut_image == (Image *) NULL)
7378 {
7379 status=MagickFalse;
7380 break;
7381 }
cristy28474bf2011-09-11 23:32:52 +00007382 (void) ClutImage(image,clut_image,interpolate_method,exception);
cristy3ed852e2009-09-05 21:47:34 +00007383 clut_image=DestroyImage(clut_image);
cristy3ed852e2009-09-05 21:47:34 +00007384 *images=DestroyImageList(*images);
7385 *images=image;
7386 break;
7387 }
7388 if (LocaleCompare("coalesce",option+1) == 0)
7389 {
7390 Image
7391 *coalesce_image;
7392
cristy6fccee12011-10-20 18:43:18 +00007393 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007394 coalesce_image=CoalesceImages(*images,exception);
7395 if (coalesce_image == (Image *) NULL)
7396 {
7397 status=MagickFalse;
7398 break;
7399 }
7400 *images=DestroyImageList(*images);
7401 *images=coalesce_image;
7402 break;
7403 }
7404 if (LocaleCompare("combine",option+1) == 0)
7405 {
7406 Image
7407 *combine_image;
7408
cristy6fccee12011-10-20 18:43:18 +00007409 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3139dc22011-07-08 00:11:42 +00007410 combine_image=CombineImages(*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007411 if (combine_image == (Image *) NULL)
7412 {
7413 status=MagickFalse;
7414 break;
7415 }
7416 *images=DestroyImageList(*images);
7417 *images=combine_image;
7418 break;
7419 }
7420 if (LocaleCompare("composite",option+1) == 0)
7421 {
7422 Image
7423 *mask_image,
7424 *composite_image,
7425 *image;
7426
7427 RectangleInfo
7428 geometry;
7429
cristy6fccee12011-10-20 18:43:18 +00007430 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007431 image=RemoveFirstImageFromList(images);
7432 composite_image=RemoveFirstImageFromList(images);
7433 if (composite_image == (Image *) NULL)
7434 {
7435 status=MagickFalse;
7436 break;
7437 }
7438 (void) TransformImage(&composite_image,(char *) NULL,
cristye941a752011-10-15 01:52:48 +00007439 composite_image->geometry,exception);
cristy3ed852e2009-09-05 21:47:34 +00007440 SetGeometry(composite_image,&geometry);
7441 (void) ParseAbsoluteGeometry(composite_image->geometry,&geometry);
7442 GravityAdjustGeometry(image->columns,image->rows,image->gravity,
7443 &geometry);
7444 mask_image=RemoveFirstImageFromList(images);
7445 if (mask_image != (Image *) NULL)
7446 {
7447 if ((image->compose == DisplaceCompositeOp) ||
7448 (image->compose == DistortCompositeOp))
7449 {
7450 /*
7451 Merge Y displacement into X displacement image.
7452 */
7453 (void) CompositeImage(composite_image,CopyGreenCompositeOp,
cristye941a752011-10-15 01:52:48 +00007454 mask_image,0,0,exception);
cristy3ed852e2009-09-05 21:47:34 +00007455 mask_image=DestroyImage(mask_image);
7456 }
7457 else
7458 {
7459 /*
7460 Set a blending mask for the composition.
cristy28474bf2011-09-11 23:32:52 +00007461 Posible error, what if image->mask already set.
cristy3ed852e2009-09-05 21:47:34 +00007462 */
7463 image->mask=mask_image;
cristyb3e7c6c2011-07-24 01:43:55 +00007464 (void) NegateImage(image->mask,MagickFalse,exception);
cristy3ed852e2009-09-05 21:47:34 +00007465 }
7466 }
cristyf4ad9df2011-07-08 16:49:03 +00007467 (void) CompositeImage(image,image->compose,composite_image,
cristye941a752011-10-15 01:52:48 +00007468 geometry.x,geometry.y,exception);
anthonya129f702011-04-14 01:08:48 +00007469 if (mask_image != (Image *) NULL)
7470 mask_image=image->mask=DestroyImage(image->mask);
cristy3ed852e2009-09-05 21:47:34 +00007471 composite_image=DestroyImage(composite_image);
cristy3ed852e2009-09-05 21:47:34 +00007472 *images=DestroyImageList(*images);
7473 *images=image;
7474 break;
7475 }
cristy3ed852e2009-09-05 21:47:34 +00007476 break;
7477 }
7478 case 'd':
7479 {
7480 if (LocaleCompare("deconstruct",option+1) == 0)
7481 {
7482 Image
7483 *deconstruct_image;
7484
cristy6fccee12011-10-20 18:43:18 +00007485 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy8a9106f2011-07-05 14:39:26 +00007486 deconstruct_image=CompareImagesLayers(*images,CompareAnyLayer,
cristy4c08aed2011-07-01 19:47:50 +00007487 exception);
cristy3ed852e2009-09-05 21:47:34 +00007488 if (deconstruct_image == (Image *) NULL)
7489 {
7490 status=MagickFalse;
7491 break;
7492 }
7493 *images=DestroyImageList(*images);
7494 *images=deconstruct_image;
7495 break;
7496 }
7497 if (LocaleCompare("delete",option+1) == 0)
7498 {
7499 if (*option == '+')
7500 DeleteImages(images,"-1",exception);
7501 else
7502 DeleteImages(images,argv[i+1],exception);
7503 break;
7504 }
7505 if (LocaleCompare("dither",option+1) == 0)
7506 {
7507 if (*option == '+')
7508 {
7509 quantize_info->dither=MagickFalse;
7510 break;
7511 }
7512 quantize_info->dither=MagickTrue;
cristy042ee782011-04-22 18:48:30 +00007513 quantize_info->dither_method=(DitherMethod) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00007514 MagickDitherOptions,MagickFalse,argv[i+1]);
7515 break;
7516 }
cristyecb10ff2011-03-22 13:14:03 +00007517 if (LocaleCompare("duplicate",option+1) == 0)
7518 {
cristy72988482011-03-29 16:34:38 +00007519 Image
7520 *duplicate_images;
cristybf95deb2011-03-23 00:25:36 +00007521
anthony2b6bcae2011-03-23 13:05:34 +00007522 if (*option == '+')
cristy72988482011-03-29 16:34:38 +00007523 duplicate_images=DuplicateImages(*images,1,"-1",exception);
7524 else
7525 {
7526 const char
7527 *p;
7528
anthony2b6bcae2011-03-23 13:05:34 +00007529 size_t
7530 number_duplicates;
anthony9bd15492011-03-23 02:11:13 +00007531
anthony2b6bcae2011-03-23 13:05:34 +00007532 number_duplicates=(size_t) StringToLong(argv[i+1]);
cristy72988482011-03-29 16:34:38 +00007533 p=strchr(argv[i+1],',');
7534 if (p == (const char *) NULL)
7535 duplicate_images=DuplicateImages(*images,number_duplicates,
7536 "-1",exception);
anthony2b6bcae2011-03-23 13:05:34 +00007537 else
cristy72988482011-03-29 16:34:38 +00007538 duplicate_images=DuplicateImages(*images,number_duplicates,p,
7539 exception);
anthony2b6bcae2011-03-23 13:05:34 +00007540 }
7541 AppendImageToList(images, duplicate_images);
cristy6fccee12011-10-20 18:43:18 +00007542 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristyecb10ff2011-03-22 13:14:03 +00007543 break;
7544 }
cristy3ed852e2009-09-05 21:47:34 +00007545 break;
7546 }
cristyd18ae7c2010-03-07 17:39:52 +00007547 case 'e':
7548 {
7549 if (LocaleCompare("evaluate-sequence",option+1) == 0)
7550 {
7551 Image
7552 *evaluate_image;
7553
7554 MagickEvaluateOperator
7555 op;
7556
cristy6fccee12011-10-20 18:43:18 +00007557 (void) SyncImageSettings(mogrify_info,*images,exception);
cristy28474bf2011-09-11 23:32:52 +00007558 op=(MagickEvaluateOperator) ParseCommandOption(
7559 MagickEvaluateOptions,MagickFalse,argv[i+1]);
cristyd18ae7c2010-03-07 17:39:52 +00007560 evaluate_image=EvaluateImages(*images,op,exception);
7561 if (evaluate_image == (Image *) NULL)
7562 {
7563 status=MagickFalse;
7564 break;
7565 }
7566 *images=DestroyImageList(*images);
7567 *images=evaluate_image;
7568 break;
7569 }
7570 break;
7571 }
cristy3ed852e2009-09-05 21:47:34 +00007572 case 'f':
7573 {
cristyf0a247f2009-10-04 00:20:03 +00007574 if (LocaleCompare("fft",option+1) == 0)
7575 {
7576 Image
7577 *fourier_image;
7578
7579 /*
7580 Implements the discrete Fourier transform (DFT).
7581 */
cristy6fccee12011-10-20 18:43:18 +00007582 (void) SyncImageSettings(mogrify_info,*images,exception);
cristyf0a247f2009-10-04 00:20:03 +00007583 fourier_image=ForwardFourierTransformImage(*images,*option == '-' ?
7584 MagickTrue : MagickFalse,exception);
7585 if (fourier_image == (Image *) NULL)
7586 break;
7587 *images=DestroyImage(*images);
7588 *images=fourier_image;
7589 break;
7590 }
cristy3ed852e2009-09-05 21:47:34 +00007591 if (LocaleCompare("flatten",option+1) == 0)
7592 {
7593 Image
7594 *flatten_image;
7595
cristy6fccee12011-10-20 18:43:18 +00007596 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007597 flatten_image=MergeImageLayers(*images,FlattenLayer,exception);
7598 if (flatten_image == (Image *) NULL)
7599 break;
7600 *images=DestroyImageList(*images);
7601 *images=flatten_image;
7602 break;
7603 }
7604 if (LocaleCompare("fx",option+1) == 0)
7605 {
7606 Image
7607 *fx_image;
7608
cristy6fccee12011-10-20 18:43:18 +00007609 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy490408a2011-07-07 14:42:05 +00007610 fx_image=FxImage(*images,argv[i+1],exception);
cristy3ed852e2009-09-05 21:47:34 +00007611 if (fx_image == (Image *) NULL)
7612 {
7613 status=MagickFalse;
7614 break;
7615 }
7616 *images=DestroyImageList(*images);
7617 *images=fx_image;
7618 break;
7619 }
7620 break;
7621 }
7622 case 'h':
7623 {
7624 if (LocaleCompare("hald-clut",option+1) == 0)
7625 {
7626 Image
7627 *hald_image,
7628 *image;
7629
cristy6fccee12011-10-20 18:43:18 +00007630 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007631 image=RemoveFirstImageFromList(images);
7632 hald_image=RemoveFirstImageFromList(images);
7633 if (hald_image == (Image *) NULL)
7634 {
7635 status=MagickFalse;
7636 break;
7637 }
cristy7c0a0a42011-08-23 17:57:25 +00007638 (void) HaldClutImage(image,hald_image,exception);
cristy3ed852e2009-09-05 21:47:34 +00007639 hald_image=DestroyImage(hald_image);
cristy0aff6ea2009-11-14 01:40:53 +00007640 if (*images != (Image *) NULL)
7641 *images=DestroyImageList(*images);
cristy3ed852e2009-09-05 21:47:34 +00007642 *images=image;
7643 break;
7644 }
7645 break;
7646 }
7647 case 'i':
7648 {
7649 if (LocaleCompare("ift",option+1) == 0)
7650 {
7651 Image
cristy8587f882009-11-13 20:28:49 +00007652 *fourier_image,
7653 *magnitude_image,
7654 *phase_image;
cristy3ed852e2009-09-05 21:47:34 +00007655
7656 /*
7657 Implements the inverse fourier discrete Fourier transform (DFT).
7658 */
cristy6fccee12011-10-20 18:43:18 +00007659 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy8587f882009-11-13 20:28:49 +00007660 magnitude_image=RemoveFirstImageFromList(images);
7661 phase_image=RemoveFirstImageFromList(images);
7662 if (phase_image == (Image *) NULL)
7663 {
7664 status=MagickFalse;
7665 break;
7666 }
7667 fourier_image=InverseFourierTransformImage(magnitude_image,
7668 phase_image,*option == '-' ? MagickTrue : MagickFalse,exception);
cristy3ed852e2009-09-05 21:47:34 +00007669 if (fourier_image == (Image *) NULL)
7670 break;
cristy0aff6ea2009-11-14 01:40:53 +00007671 if (*images != (Image *) NULL)
7672 *images=DestroyImage(*images);
cristy3ed852e2009-09-05 21:47:34 +00007673 *images=fourier_image;
7674 break;
7675 }
7676 if (LocaleCompare("insert",option+1) == 0)
7677 {
7678 Image
7679 *p,
7680 *q;
7681
7682 index=0;
7683 if (*option != '+')
cristy32c2aea2010-12-01 01:00:50 +00007684 index=(ssize_t) StringToLong(argv[i+1]);
cristy3ed852e2009-09-05 21:47:34 +00007685 p=RemoveLastImageFromList(images);
7686 if (p == (Image *) NULL)
7687 {
7688 (void) ThrowMagickException(exception,GetMagickModule(),
7689 OptionError,"NoSuchImage","`%s'",argv[i+1]);
7690 status=MagickFalse;
7691 break;
7692 }
7693 q=p;
7694 if (index == 0)
7695 PrependImageToList(images,q);
7696 else
cristybb503372010-05-27 20:51:26 +00007697 if (index == (ssize_t) GetImageListLength(*images))
cristy3ed852e2009-09-05 21:47:34 +00007698 AppendImageToList(images,q);
7699 else
7700 {
7701 q=GetImageFromList(*images,index-1);
7702 if (q == (Image *) NULL)
7703 {
7704 (void) ThrowMagickException(exception,GetMagickModule(),
7705 OptionError,"NoSuchImage","`%s'",argv[i+1]);
7706 status=MagickFalse;
7707 break;
7708 }
7709 InsertImageInList(&q,p);
7710 }
7711 *images=GetFirstImageInList(q);
7712 break;
7713 }
cristy28474bf2011-09-11 23:32:52 +00007714 if (LocaleCompare("interpolate",option+1) == 0)
7715 {
7716 interpolate_method=(PixelInterpolateMethod) ParseCommandOption(
7717 MagickInterpolateOptions,MagickFalse,argv[i+1]);
7718 break;
7719 }
cristy3ed852e2009-09-05 21:47:34 +00007720 break;
7721 }
7722 case 'l':
7723 {
7724 if (LocaleCompare("layers",option+1) == 0)
7725 {
7726 Image
7727 *layers;
7728
7729 ImageLayerMethod
7730 method;
7731
cristy6fccee12011-10-20 18:43:18 +00007732 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007733 layers=(Image *) NULL;
cristy042ee782011-04-22 18:48:30 +00007734 method=(ImageLayerMethod) ParseCommandOption(MagickLayerOptions,
cristy3ed852e2009-09-05 21:47:34 +00007735 MagickFalse,argv[i+1]);
7736 switch (method)
7737 {
7738 case CoalesceLayer:
7739 {
7740 layers=CoalesceImages(*images,exception);
7741 break;
7742 }
7743 case CompareAnyLayer:
7744 case CompareClearLayer:
7745 case CompareOverlayLayer:
7746 default:
7747 {
cristy8a9106f2011-07-05 14:39:26 +00007748 layers=CompareImagesLayers(*images,method,exception);
cristy3ed852e2009-09-05 21:47:34 +00007749 break;
7750 }
7751 case MergeLayer:
7752 case FlattenLayer:
7753 case MosaicLayer:
7754 case TrimBoundsLayer:
7755 {
7756 layers=MergeImageLayers(*images,method,exception);
7757 break;
7758 }
7759 case DisposeLayer:
7760 {
7761 layers=DisposeImages(*images,exception);
7762 break;
7763 }
7764 case OptimizeImageLayer:
7765 {
7766 layers=OptimizeImageLayers(*images,exception);
7767 break;
7768 }
7769 case OptimizePlusLayer:
7770 {
7771 layers=OptimizePlusImageLayers(*images,exception);
7772 break;
7773 }
7774 case OptimizeTransLayer:
7775 {
7776 OptimizeImageTransparency(*images,exception);
7777 break;
7778 }
7779 case RemoveDupsLayer:
7780 {
7781 RemoveDuplicateLayers(images,exception);
7782 break;
7783 }
7784 case RemoveZeroLayer:
7785 {
7786 RemoveZeroDelayLayers(images,exception);
7787 break;
7788 }
7789 case OptimizeLayer:
7790 {
7791 /*
7792 General Purpose, GIF Animation Optimizer.
7793 */
7794 layers=CoalesceImages(*images,exception);
7795 if (layers == (Image *) NULL)
7796 {
7797 status=MagickFalse;
7798 break;
7799 }
cristy3ed852e2009-09-05 21:47:34 +00007800 *images=DestroyImageList(*images);
7801 *images=layers;
7802 layers=OptimizeImageLayers(*images,exception);
7803 if (layers == (Image *) NULL)
7804 {
7805 status=MagickFalse;
7806 break;
7807 }
cristy3ed852e2009-09-05 21:47:34 +00007808 *images=DestroyImageList(*images);
7809 *images=layers;
7810 layers=(Image *) NULL;
7811 OptimizeImageTransparency(*images,exception);
cristy018f07f2011-09-04 21:15:19 +00007812 (void) RemapImages(quantize_info,*images,(Image *) NULL,
7813 exception);
cristy3ed852e2009-09-05 21:47:34 +00007814 break;
7815 }
7816 case CompositeLayer:
7817 {
7818 CompositeOperator
7819 compose;
7820
7821 Image
7822 *source;
7823
7824 RectangleInfo
7825 geometry;
7826
7827 /*
7828 Split image sequence at the first 'NULL:' image.
7829 */
7830 source=(*images);
7831 while (source != (Image *) NULL)
7832 {
7833 source=GetNextImageInList(source);
7834 if ((source != (Image *) NULL) &&
7835 (LocaleCompare(source->magick,"NULL") == 0))
7836 break;
7837 }
7838 if (source != (Image *) NULL)
7839 {
7840 if ((GetPreviousImageInList(source) == (Image *) NULL) ||
7841 (GetNextImageInList(source) == (Image *) NULL))
7842 source=(Image *) NULL;
7843 else
7844 {
7845 /*
7846 Separate the two lists, junk the null: image.
7847 */
7848 source=SplitImageList(source->previous);
7849 DeleteImageFromList(&source);
7850 }
7851 }
7852 if (source == (Image *) NULL)
7853 {
7854 (void) ThrowMagickException(exception,GetMagickModule(),
7855 OptionError,"MissingNullSeparator","layers Composite");
7856 status=MagickFalse;
7857 break;
7858 }
7859 /*
7860 Adjust offset with gravity and virtual canvas.
7861 */
7862 SetGeometry(*images,&geometry);
7863 (void) ParseAbsoluteGeometry((*images)->geometry,&geometry);
7864 geometry.width=source->page.width != 0 ?
7865 source->page.width : source->columns;
7866 geometry.height=source->page.height != 0 ?
7867 source->page.height : source->rows;
7868 GravityAdjustGeometry((*images)->page.width != 0 ?
7869 (*images)->page.width : (*images)->columns,
7870 (*images)->page.height != 0 ? (*images)->page.height :
7871 (*images)->rows,(*images)->gravity,&geometry);
7872 compose=OverCompositeOp;
cristy6b3da3a2010-06-20 02:21:46 +00007873 option=GetImageOption(mogrify_info,"compose");
cristy3ed852e2009-09-05 21:47:34 +00007874 if (option != (const char *) NULL)
cristy042ee782011-04-22 18:48:30 +00007875 compose=(CompositeOperator) ParseCommandOption(
cristy3ed852e2009-09-05 21:47:34 +00007876 MagickComposeOptions,MagickFalse,option);
7877 CompositeLayers(*images,compose,source,geometry.x,geometry.y,
7878 exception);
7879 source=DestroyImageList(source);
7880 break;
7881 }
7882 }
7883 if (layers == (Image *) NULL)
7884 break;
cristy3ed852e2009-09-05 21:47:34 +00007885 *images=DestroyImageList(*images);
7886 *images=layers;
7887 break;
7888 }
7889 break;
7890 }
7891 case 'm':
7892 {
7893 if (LocaleCompare("map",option+1) == 0)
7894 {
cristy6fccee12011-10-20 18:43:18 +00007895 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007896 if (*option == '+')
7897 {
cristy018f07f2011-09-04 21:15:19 +00007898 (void) RemapImages(quantize_info,*images,(Image *) NULL,
7899 exception);
cristy3ed852e2009-09-05 21:47:34 +00007900 break;
7901 }
7902 i++;
7903 break;
7904 }
cristyf40785b2010-03-06 02:27:27 +00007905 if (LocaleCompare("maximum",option+1) == 0)
cristy1c274c92010-03-06 02:06:45 +00007906 {
7907 Image
cristyf40785b2010-03-06 02:27:27 +00007908 *maximum_image;
cristy1c274c92010-03-06 02:06:45 +00007909
cristyd18ae7c2010-03-07 17:39:52 +00007910 /*
7911 Maximum image sequence (deprecated).
7912 */
cristy6fccee12011-10-20 18:43:18 +00007913 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristyd18ae7c2010-03-07 17:39:52 +00007914 maximum_image=EvaluateImages(*images,MaxEvaluateOperator,exception);
cristyf40785b2010-03-06 02:27:27 +00007915 if (maximum_image == (Image *) NULL)
cristy1c274c92010-03-06 02:06:45 +00007916 {
7917 status=MagickFalse;
7918 break;
7919 }
7920 *images=DestroyImageList(*images);
cristyf40785b2010-03-06 02:27:27 +00007921 *images=maximum_image;
cristy1c274c92010-03-06 02:06:45 +00007922 break;
7923 }
cristyf40785b2010-03-06 02:27:27 +00007924 if (LocaleCompare("minimum",option+1) == 0)
cristy1c274c92010-03-06 02:06:45 +00007925 {
7926 Image
cristyf40785b2010-03-06 02:27:27 +00007927 *minimum_image;
cristy1c274c92010-03-06 02:06:45 +00007928
cristyd18ae7c2010-03-07 17:39:52 +00007929 /*
7930 Minimum image sequence (deprecated).
7931 */
cristy6fccee12011-10-20 18:43:18 +00007932 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristyd18ae7c2010-03-07 17:39:52 +00007933 minimum_image=EvaluateImages(*images,MinEvaluateOperator,exception);
cristyf40785b2010-03-06 02:27:27 +00007934 if (minimum_image == (Image *) NULL)
cristy1c274c92010-03-06 02:06:45 +00007935 {
7936 status=MagickFalse;
7937 break;
7938 }
7939 *images=DestroyImageList(*images);
cristyf40785b2010-03-06 02:27:27 +00007940 *images=minimum_image;
cristy1c274c92010-03-06 02:06:45 +00007941 break;
7942 }
cristy3ed852e2009-09-05 21:47:34 +00007943 if (LocaleCompare("morph",option+1) == 0)
7944 {
7945 Image
7946 *morph_image;
7947
cristy6fccee12011-10-20 18:43:18 +00007948 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristye27293e2009-12-18 02:53:20 +00007949 morph_image=MorphImages(*images,StringToUnsignedLong(argv[i+1]),
cristy3ed852e2009-09-05 21:47:34 +00007950 exception);
7951 if (morph_image == (Image *) NULL)
7952 {
7953 status=MagickFalse;
7954 break;
7955 }
7956 *images=DestroyImageList(*images);
7957 *images=morph_image;
7958 break;
7959 }
7960 if (LocaleCompare("mosaic",option+1) == 0)
7961 {
7962 Image
7963 *mosaic_image;
7964
cristy6fccee12011-10-20 18:43:18 +00007965 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00007966 mosaic_image=MergeImageLayers(*images,MosaicLayer,exception);
7967 if (mosaic_image == (Image *) NULL)
7968 {
7969 status=MagickFalse;
7970 break;
7971 }
7972 *images=DestroyImageList(*images);
7973 *images=mosaic_image;
7974 break;
7975 }
7976 break;
7977 }
7978 case 'p':
7979 {
7980 if (LocaleCompare("print",option+1) == 0)
7981 {
7982 char
7983 *string;
7984
cristy6fccee12011-10-20 18:43:18 +00007985 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy018f07f2011-09-04 21:15:19 +00007986 string=InterpretImageProperties(mogrify_info,*images,argv[i+1],
7987 exception);
cristy3ed852e2009-09-05 21:47:34 +00007988 if (string == (char *) NULL)
7989 break;
cristyb51dff52011-05-19 16:55:47 +00007990 (void) FormatLocaleFile(stdout,"%s",string);
cristy3ed852e2009-09-05 21:47:34 +00007991 string=DestroyString(string);
7992 }
7993 if (LocaleCompare("process",option+1) == 0)
7994 {
7995 char
7996 **arguments;
7997
7998 int
7999 j,
8000 number_arguments;
8001
cristy6fccee12011-10-20 18:43:18 +00008002 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy3ed852e2009-09-05 21:47:34 +00008003 arguments=StringToArgv(argv[i+1],&number_arguments);
8004 if (arguments == (char **) NULL)
8005 break;
8006 if ((argc > 1) && (strchr(arguments[1],'=') != (char *) NULL))
8007 {
8008 char
8009 breaker,
8010 quote,
8011 *token;
8012
8013 const char
8014 *arguments;
8015
8016 int
8017 next,
8018 status;
8019
8020 size_t
8021 length;
8022
8023 TokenInfo
8024 *token_info;
8025
8026 /*
8027 Support old style syntax, filter="-option arg".
8028 */
8029 length=strlen(argv[i+1]);
8030 token=(char *) NULL;
cristy37e0b382011-06-07 13:31:21 +00008031 if (~length >= (MaxTextExtent-1))
cristy3ed852e2009-09-05 21:47:34 +00008032 token=(char *) AcquireQuantumMemory(length+MaxTextExtent,
8033 sizeof(*token));
8034 if (token == (char *) NULL)
8035 break;
8036 next=0;
8037 arguments=argv[i+1];
8038 token_info=AcquireTokenInfo();
8039 status=Tokenizer(token_info,0,token,length,arguments,"","=",
8040 "\"",'\0',&breaker,&next,&quote);
8041 token_info=DestroyTokenInfo(token_info);
8042 if (status == 0)
8043 {
8044 const char
8045 *argv;
8046
8047 argv=(&(arguments[next]));
8048 (void) InvokeDynamicImageFilter(token,&(*images),1,&argv,
8049 exception);
8050 }
8051 token=DestroyString(token);
8052 break;
8053 }
cristy91c0da22010-05-02 01:44:07 +00008054 (void) SubstituteString(&arguments[1],"-","");
cristy3ed852e2009-09-05 21:47:34 +00008055 (void) InvokeDynamicImageFilter(arguments[1],&(*images),
8056 number_arguments-2,(const char **) arguments+2,exception);
8057 for (j=0; j < number_arguments; j++)
8058 arguments[j]=DestroyString(arguments[j]);
8059 arguments=(char **) RelinquishMagickMemory(arguments);
8060 break;
8061 }
8062 break;
8063 }
8064 case 'r':
8065 {
8066 if (LocaleCompare("reverse",option+1) == 0)
8067 {
8068 ReverseImageList(images);
cristy3ed852e2009-09-05 21:47:34 +00008069 break;
8070 }
8071 break;
8072 }
8073 case 's':
8074 {
cristy4285d782011-02-09 20:12:28 +00008075 if (LocaleCompare("smush",option+1) == 0)
8076 {
8077 Image
8078 *smush_image;
8079
8080 ssize_t
8081 offset;
8082
cristy6fccee12011-10-20 18:43:18 +00008083 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristy4285d782011-02-09 20:12:28 +00008084 offset=(ssize_t) StringToLong(argv[i+1]);
8085 smush_image=SmushImages(*images,*option == '-' ? MagickTrue :
8086 MagickFalse,offset,exception);
8087 if (smush_image == (Image *) NULL)
8088 {
8089 status=MagickFalse;
8090 break;
8091 }
8092 *images=DestroyImageList(*images);
8093 *images=smush_image;
8094 break;
8095 }
cristy3ed852e2009-09-05 21:47:34 +00008096 if (LocaleCompare("swap",option+1) == 0)
8097 {
8098 Image
8099 *p,
8100 *q,
8101 *swap;
8102
cristybb503372010-05-27 20:51:26 +00008103 ssize_t
cristy3ed852e2009-09-05 21:47:34 +00008104 swap_index;
8105
8106 index=(-1);
8107 swap_index=(-2);
8108 if (*option != '+')
8109 {
8110 GeometryInfo
8111 geometry_info;
8112
8113 MagickStatusType
8114 flags;
8115
8116 swap_index=(-1);
8117 flags=ParseGeometry(argv[i+1],&geometry_info);
cristybb503372010-05-27 20:51:26 +00008118 index=(ssize_t) geometry_info.rho;
cristy3ed852e2009-09-05 21:47:34 +00008119 if ((flags & SigmaValue) != 0)
cristybb503372010-05-27 20:51:26 +00008120 swap_index=(ssize_t) geometry_info.sigma;
cristy3ed852e2009-09-05 21:47:34 +00008121 }
8122 p=GetImageFromList(*images,index);
8123 q=GetImageFromList(*images,swap_index);
8124 if ((p == (Image *) NULL) || (q == (Image *) NULL))
8125 {
8126 (void) ThrowMagickException(exception,GetMagickModule(),
8127 OptionError,"NoSuchImage","`%s'",(*images)->filename);
8128 status=MagickFalse;
8129 break;
8130 }
8131 if (p == q)
8132 break;
8133 swap=CloneImage(p,0,0,MagickTrue,exception);
8134 ReplaceImageInList(&p,CloneImage(q,0,0,MagickTrue,exception));
8135 ReplaceImageInList(&q,swap);
8136 *images=GetFirstImageInList(q);
8137 break;
8138 }
8139 break;
8140 }
8141 case 'w':
8142 {
8143 if (LocaleCompare("write",option+1) == 0)
8144 {
cristy071dd7b2010-04-09 13:04:54 +00008145 char
cristy06609ee2010-03-17 20:21:27 +00008146 key[MaxTextExtent];
8147
cristy3ed852e2009-09-05 21:47:34 +00008148 Image
8149 *write_images;
8150
8151 ImageInfo
8152 *write_info;
8153
cristy6fccee12011-10-20 18:43:18 +00008154 (void) SyncImagesSettings(mogrify_info,*images,exception);
cristyb51dff52011-05-19 16:55:47 +00008155 (void) FormatLocaleString(key,MaxTextExtent,"cache:%s",argv[i+1]);
cristy06609ee2010-03-17 20:21:27 +00008156 (void) DeleteImageRegistry(key);
cristy3ed852e2009-09-05 21:47:34 +00008157 write_images=(*images);
8158 if (*option == '+')
8159 write_images=CloneImageList(*images,exception);
cristy6b3da3a2010-06-20 02:21:46 +00008160 write_info=CloneImageInfo(mogrify_info);
cristy3ed852e2009-09-05 21:47:34 +00008161 status&=WriteImages(write_info,write_images,argv[i+1],exception);
8162 write_info=DestroyImageInfo(write_info);
8163 if (*option == '+')
8164 write_images=DestroyImageList(write_images);
8165 break;
8166 }
8167 break;
8168 }
8169 default:
8170 break;
8171 }
8172 i+=count;
8173 }
8174 quantize_info=DestroyQuantizeInfo(quantize_info);
cristy6b3da3a2010-06-20 02:21:46 +00008175 mogrify_info=DestroyImageInfo(mogrify_info);
8176 status&=MogrifyImageInfo(image_info,argc,argv,exception);
cristy3ed852e2009-09-05 21:47:34 +00008177 return(status != 0 ? MagickTrue : MagickFalse);
8178}
8179
8180/*
8181%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8182% %
8183% %
8184% %
8185+ M o g r i f y I m a g e s %
8186% %
8187% %
8188% %
8189%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8190%
8191% MogrifyImages() applies image processing options to a sequence of images as
8192% prescribed by command line options.
8193%
8194% The format of the MogrifyImage method is:
8195%
8196% MagickBooleanType MogrifyImages(ImageInfo *image_info,
8197% const MagickBooleanType post,const int argc,const char **argv,
8198% Image **images,Exceptioninfo *exception)
8199%
8200% A description of each parameter follows:
8201%
8202% o image_info: the image info..
8203%
8204% o post: If true, post process image list operators otherwise pre-process.
8205%
8206% o argc: Specifies a pointer to an integer describing the number of
8207% elements in the argument vector.
8208%
8209% o argv: Specifies a pointer to a text array containing the command line
8210% arguments.
8211%
anthonye9c27192011-03-27 08:07:06 +00008212% o images: pointer to a pointer of the first image in image list.
cristy3ed852e2009-09-05 21:47:34 +00008213%
8214% o exception: return any errors or warnings in this structure.
8215%
8216*/
8217WandExport MagickBooleanType MogrifyImages(ImageInfo *image_info,
8218 const MagickBooleanType post,const int argc,const char **argv,
8219 Image **images,ExceptionInfo *exception)
8220{
8221#define MogrifyImageTag "Mogrify/Image"
8222
anthonye9c27192011-03-27 08:07:06 +00008223 MagickStatusType
8224 status;
cristy3ed852e2009-09-05 21:47:34 +00008225
cristy0e9f9c12010-02-11 03:00:47 +00008226 MagickBooleanType
8227 proceed;
8228
anthonye9c27192011-03-27 08:07:06 +00008229 size_t
8230 n;
cristy3ed852e2009-09-05 21:47:34 +00008231
cristybb503372010-05-27 20:51:26 +00008232 register ssize_t
cristy3ed852e2009-09-05 21:47:34 +00008233 i;
8234
cristy3ed852e2009-09-05 21:47:34 +00008235 assert(image_info != (ImageInfo *) NULL);
8236 assert(image_info->signature == MagickSignature);
8237 if (images == (Image **) NULL)
8238 return(MogrifyImage(image_info,argc,argv,images,exception));
anthonye9c27192011-03-27 08:07:06 +00008239 assert((*images)->previous == (Image *) NULL);
cristy3ed852e2009-09-05 21:47:34 +00008240 assert((*images)->signature == MagickSignature);
8241 if ((*images)->debug != MagickFalse)
8242 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
8243 (*images)->filename);
8244 if ((argc <= 0) || (*argv == (char *) NULL))
8245 return(MagickTrue);
8246 (void) SetImageInfoProgressMonitor(image_info,(MagickProgressMonitor) NULL,
8247 (void *) NULL);
cristy3ed852e2009-09-05 21:47:34 +00008248 status=0;
anthonye9c27192011-03-27 08:07:06 +00008249
anthonyce2716b2011-04-22 09:51:34 +00008250#if 0
cristy1e604812011-05-19 18:07:50 +00008251 (void) FormatLocaleFile(stderr, "mogrify start %s %d (%s)\n",argv[0],argc,
8252 post?"post":"pre");
anthonyce2716b2011-04-22 09:51:34 +00008253#endif
8254
anthonye9c27192011-03-27 08:07:06 +00008255 /*
8256 Pre-process multi-image sequence operators
8257 */
cristy3ed852e2009-09-05 21:47:34 +00008258 if (post == MagickFalse)
8259 status&=MogrifyImageList(image_info,argc,argv,images,exception);
anthonye9c27192011-03-27 08:07:06 +00008260 /*
8261 For each image, process simple single image operators
8262 */
8263 i=0;
8264 n=GetImageListLength(*images);
cristy9f027d12011-09-21 01:17:17 +00008265 for ( ; ; )
cristy3ed852e2009-09-05 21:47:34 +00008266 {
anthonyce2716b2011-04-22 09:51:34 +00008267#if 0
cristy1e604812011-05-19 18:07:50 +00008268 (void) FormatLocaleFile(stderr,"mogrify %ld of %ld\n",(long)
8269 GetImageIndexInList(*images),(long)GetImageListLength(*images));
anthonyce2716b2011-04-22 09:51:34 +00008270#endif
anthonye9c27192011-03-27 08:07:06 +00008271 status&=MogrifyImage(image_info,argc,argv,images,exception);
8272 proceed=SetImageProgress(*images,MogrifyImageTag,(MagickOffsetType) i, n);
cristy0e9f9c12010-02-11 03:00:47 +00008273 if (proceed == MagickFalse)
8274 break;
anthonye9c27192011-03-27 08:07:06 +00008275 if ( (*images)->next == (Image *) NULL )
8276 break;
8277 *images=(*images)->next;
8278 i++;
cristy3ed852e2009-09-05 21:47:34 +00008279 }
anthonye9c27192011-03-27 08:07:06 +00008280 assert( *images != (Image *) NULL );
anthonyce2716b2011-04-22 09:51:34 +00008281#if 0
cristy1e604812011-05-19 18:07:50 +00008282 (void) FormatLocaleFile(stderr,"mogrify end %ld of %ld\n",(long)
8283 GetImageIndexInList(*images),(long)GetImageListLength(*images));
anthonyce2716b2011-04-22 09:51:34 +00008284#endif
anthonye9c27192011-03-27 08:07:06 +00008285
8286 /*
8287 Post-process, multi-image sequence operators
8288 */
8289 *images=GetFirstImageInList(*images);
cristy3ed852e2009-09-05 21:47:34 +00008290 if (post != MagickFalse)
anthonye9c27192011-03-27 08:07:06 +00008291 status&=MogrifyImageList(image_info,argc,argv,images,exception);
cristy3ed852e2009-09-05 21:47:34 +00008292 return(status != 0 ? MagickTrue : MagickFalse);
8293}