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