1/* 2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3% % 4% % 5% % 6% DDDD IIIII SSSSS PPPP L AAA Y Y % 7% D D I SS P P L A A Y Y % 8% D D I SSS PPPP L AAAAA Y % 9% D D I SS P L A A Y % 10% DDDD IIIII SSSSS P LLLLL A A Y % 11% % 12% % 13% Methods to Interactively Display and Edit an Image % 14% % 15% Software Design % 16% Cristy % 17% July 1992 % 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 display program to display an image or image sequence on any X 37% server. 38% 39*/ 40 41/* 42 Include declarations. 43*/ 44#include "MagickWand/studio.h" 45#include "MagickWand/MagickWand.h" 46#include "MagickWand/mogrify-private.h" 47#include "MagickCore/display-private.h" 48#include "MagickCore/string-private.h" 49 50/* 51%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 52% % 53% % 54% % 55+ D i s p l a y I m a g e C o m m a n d % 56% % 57% % 58% % 59%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 60% 61% DisplayImageCommand() displays a sequence of images on any workstation 62% display running an X server. Display first determines the hardware 63% capabilities of the workstation. If the number of unique colors in an image 64% is less than or equal to the number the workstation can support, the image 65% is displayed in an X window. Otherwise the number of colors in the image is 66% first reduced to match the color resolution of the workstation before it is 67% displayed. 68% 69% This means that a continuous-tone 24 bits/pixel image can display on a 8 70% bit pseudo-color device or monochrome device. In most instances the reduced 71% color image closely resembles the original. Alternatively, a monochrome or 72% pseudo-color image sequence can display on a continuous-tone 24 bits/pixels 73% device. 74% 75% The format of the DisplayImageCommand method is: 76% 77% MagickBooleanType DisplayImageCommand(ImageInfo *image_info,int argc, 78% char **argv,char **metadata,ExceptionInfo *exception) 79% 80% A description of each parameter follows: 81% 82% o image_info: the image info. 83% 84% o argc: the number of elements in the argument vector. 85% 86% o argv: A text array containing the command line arguments. 87% 88% o metadata: any metadata is returned here. 89% 90% o exception: return any errors or warnings in this structure. 91% 92*/ 93 94static MagickBooleanType DisplayUsage(void) 95{ 96 const char 97 **p; 98 99 static const char 100 *buttons[]= 101 { 102 "1 press to map or unmap the Command widget", 103 "2 press and drag to magnify a region of an image", 104 "3 press to load an image from a visual image directory", 105 (char *) NULL 106 }, 107 *miscellaneous[]= 108 { 109 "-debug events display copious debugging information", 110 "-help print program options", 111 "-list type print a list of supported option arguments", 112 "-log format format of debugging information", 113 "-version print version information", 114 (char *) NULL 115 }, 116 *operators[]= 117 { 118 "-auto-orient automagically orient image", 119 "-border geometry surround image with a border of color", 120 "-clip clip along the first path from the 8BIM profile", 121 "-clip-path id clip along a named path from the 8BIM profile", 122 "-colors value preferred number of colors in the image", 123 "-contrast enhance or reduce the image contrast", 124 "-crop geometry preferred size and location of the cropped image", 125 "-decipher filename convert cipher pixels to plain pixels", 126 "-deskew threshold straighten an image", 127 "-despeckle reduce the speckles within an image", 128 "-edge factor apply a filter to detect edges in the image", 129 "-enhance apply a digital filter to enhance a noisy image", 130 "-equalize perform histogram equalization to an image", 131 "-extract geometry extract area from image", 132 "-flip flip image in the vertical direction", 133 "-flop flop image in the horizontal direction", 134 "-frame geometry surround image with an ornamental border", 135 "-fuzz distance colors within this distance are considered equal", 136 "-gamma value level of gamma correction", 137 "-monochrome transform image to black and white", 138 "-negate replace every pixel with its complementary color", 139 "-normalize transform image to span the full range of colors", 140 "-raise value lighten/darken image edges to create a 3-D effect", 141 "-resample geometry change the resolution of an image", 142 "-resize geometry resize the image", 143 "-roll geometry roll an image vertically or horizontally", 144 "-rotate degrees apply Paeth rotation to the image", 145 "-sample geometry scale image with pixel sampling", 146 "-segment value segment an image", 147 "-sharpen geometry sharpen the image", 148 "-strip strip image of all profiles and comments", 149 "-threshold value threshold the image", 150 "-thumbnail geometry create a thumbnail of the image", 151 "-trim trim image edges", 152 (char *) NULL 153 }, 154 *settings[]= 155 { 156 "-alpha option on, activate, off, deactivate, set, opaque, copy", 157 " transparent, extract, background, or shape", 158 "-antialias remove pixel-aliasing", 159 "-authenticate password", 160 " decipher image with this password", 161 "-backdrop display image centered on a backdrop", 162 "-channel type apply option to select image channels", 163 "-colormap type Shared or Private", 164 "-colorspace type alternate image colorspace", 165 "-comment string annotate image with comment", 166 "-compress type type of pixel compression when writing the image", 167 "-define format:option", 168 " define one or more image format options", 169 "-delay value display the next image after pausing", 170 "-density geometry horizontal and vertical density of the image", 171 "-depth value image depth", 172 "-display server display image to this X server", 173 "-dispose method layer disposal method", 174 "-dither method apply error diffusion to image", 175 "-endian type endianness (MSB or LSB) of the image", 176 "-filter type use this filter when resizing an image", 177 "-format string output formatted image characteristics", 178 "-geometry geometry preferred size and location of the Image window", 179 "-gravity type horizontal and vertical backdrop placement", 180 "-identify identify the format and characteristics of the image", 181 "-immutable displayed image cannot be modified", 182 "-interlace type type of image interlacing scheme", 183 "-interpolate method pixel color interpolation method", 184 "-label string assign a label to an image", 185 "-limit type value pixel cache resource limit", 186 "-loop iterations loop images then exit", 187 "-map type display image using this Standard Colormap", 188 "-matte store matte channel if the image has one", 189 "-monitor monitor progress", 190 "-page geometry size and location of an image canvas", 191 "-profile filename add, delete, or apply an image profile", 192 "-quality value JPEG/MIFF/PNG compression level", 193 "-quantize colorspace reduce colors in this colorspace", 194 "-quiet suppress all warning messages", 195 "-regard-warnings pay attention to warning messages", 196 "-remote command execute a command in an remote display process", 197 "-repage geometry size and location of an image canvas (operator)", 198 "-respect-parentheses settings remain in effect until parenthesis boundary", 199 "-sampling-factor geometry", 200 " horizontal and vertical sampling factor", 201 "-scenes range image scene range", 202 "-seed value seed a new sequence of pseudo-random numbers", 203 "-set property value set an image property", 204 "-size geometry width and height of image", 205 "-support factor resize support: > 1.0 is blurry, < 1.0 is sharp", 206 "-texture filename name of texture to tile onto the image background", 207 "-transparent-color color", 208 " transparent color", 209 "-treedepth value color tree depth", 210 "-update seconds detect when image file is modified and redisplay", 211 "-verbose print detailed information about the image", 212 "-visual type display image using this visual type", 213 "-virtual-pixel method", 214 " virtual pixel access method", 215 "-window id display image to background of this window", 216 "-window-group id exit program when this window id is destroyed", 217 "-write filename write image to a file", 218 (char *) NULL 219 }, 220 *sequence_operators[]= 221 { 222 "-coalesce merge a sequence of images", 223 "-flatten flatten a sequence of images", 224 (char *) NULL 225 }; 226 227 ListMagickVersion(stdout); 228 (void) printf("Usage: %s [options ...] file [ [options ...] file ...]\n", 229 GetClientName()); 230 (void) printf("\nImage Settings:\n"); 231 for (p=settings; *p != (char *) NULL; p++) 232 (void) printf(" %s\n",*p); 233 (void) printf("\nImage Operators:\n"); 234 for (p=operators; *p != (char *) NULL; p++) 235 (void) printf(" %s\n",*p); 236 (void) printf("\nImage Sequence Operators:\n"); 237 for (p=sequence_operators; *p != (char *) NULL; p++) 238 (void) printf(" %s\n",*p); 239 (void) printf("\nMiscellaneous Options:\n"); 240 for (p=miscellaneous; *p != (char *) NULL; p++) 241 (void) printf(" %s\n",*p); 242 (void) printf( 243 "\nIn addition to those listed above, you can specify these standard X\n"); 244 (void) printf( 245 "resources as command line options: -background, -bordercolor,\n"); 246 (void) printf( 247 " -alpha-color, -borderwidth, -font, -foreground, -iconGeometry,\n"); 248 (void) printf("-iconic, -name, -shared-memory, -usePixmap, or -title.\n"); 249 (void) printf( 250 "\nBy default, the image format of 'file' is determined by its magic\n"); 251 (void) printf( 252 "number. To specify a particular image format, precede the filename\n"); 253 (void) printf( 254 "with an image format name and a colon (i.e. ps:image) or specify the\n"); 255 (void) printf( 256 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); 257 (void) printf("'-' for standard input or output.\n"); 258 (void) printf("\nButtons: \n"); 259 for (p=buttons; *p != (char *) NULL; p++) 260 (void) printf(" %s\n",*p); 261 return(MagickFalse); 262} 263 264WandExport MagickBooleanType DisplayImageCommand(ImageInfo *image_info, 265 int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception) 266{ 267#if defined(MAGICKCORE_X11_DELEGATE) 268#define DestroyDisplay() \ 269{ \ 270 if ((state & ExitState) == 0) \ 271 DestroyXResources(); \ 272 if (display != (Display *) NULL) \ 273 { \ 274 XCloseDisplay(display); \ 275 display=(Display *) NULL; \ 276 } \ 277 XDestroyResourceInfo(&resource_info); \ 278 DestroyImageStack(); \ 279 if (image_marker != (size_t *) NULL) \ 280 image_marker=(size_t *) RelinquishMagickMemory(image_marker); \ 281 for (i=0; i < (ssize_t) argc; i++) \ 282 argv[i]=DestroyString(argv[i]); \ 283 argv=(char **) RelinquishMagickMemory(argv); \ 284} 285#define ThrowDisplayException(asperity,tag,option) \ 286{ \ 287 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ 288 option); \ 289 DestroyDisplay(); \ 290 return(MagickFalse); \ 291} 292#define ThrowDisplayInvalidArgumentException(option,argument) \ 293{ \ 294 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \ 295 "InvalidArgument","'%s': %s",option,argument); \ 296 DestroyDisplay(); \ 297 return(MagickFalse); \ 298} 299 300 char 301 *resource_value, 302 *server_name; 303 304 const char 305 *option; 306 307 Display 308 *display; 309 310 Image 311 *image; 312 313 ImageStack 314 image_stack[MaxImageStackDepth+1]; 315 316 MagickBooleanType 317 fire, 318 pend, 319 respect_parenthesis; 320 321 MagickStatusType 322 status; 323 324 QuantizeInfo 325 *quantize_info; 326 327 register ssize_t 328 i; 329 330 size_t 331 *image_marker, 332 iterations, 333 last_image, 334 state; 335 336 ssize_t 337 image_number, 338 iteration, 339 j, 340 k, 341 l; 342 343 XResourceInfo 344 resource_info; 345 346 XrmDatabase 347 resource_database; 348 349 /* 350 Set defaults. 351 */ 352 assert(image_info != (ImageInfo *) NULL); 353 assert(image_info->signature == MagickCoreSignature); 354 if (image_info->debug != MagickFalse) 355 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); 356 assert(exception != (ExceptionInfo *) NULL); 357 if (argc == 2) 358 { 359 option=argv[1]; 360 if ((LocaleCompare("version",option+1) == 0) || 361 (LocaleCompare("-version",option+1) == 0)) 362 { 363 ListMagickVersion(stdout); 364 return(MagickTrue); 365 } 366 } 367 SetNotifyHandlers; 368 display=(Display *) NULL; 369 j=1; 370 k=0; 371 image_marker=(size_t *) NULL; 372 image_number=0; 373 last_image=0; 374 NewImageStack(); 375 option=(char *) NULL; 376 pend=MagickFalse; 377 respect_parenthesis=MagickFalse; 378 resource_database=(XrmDatabase) NULL; 379 (void) ResetMagickMemory(&resource_info,0,sizeof(resource_info)); 380 server_name=(char *) NULL; 381 state=0; 382 status=MagickTrue; 383 ReadCommandlLine(argc,&argv); 384 status=ExpandFilenames(&argc,&argv); 385 if (status == MagickFalse) 386 ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", 387 GetExceptionMessage(errno)); 388 image_marker=(size_t *) AcquireQuantumMemory((size_t) argc+1UL, 389 sizeof(*image_marker)); 390 if (image_marker == (size_t *) NULL) 391 ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", 392 GetExceptionMessage(errno)); 393 for (i=0; i <= (ssize_t) argc; i++) 394 image_marker[i]=(size_t) argc; 395 /* 396 Check for server name specified on the command line. 397 */ 398 for (i=1; i < (ssize_t) argc; i++) 399 { 400 /* 401 Check command line for server name. 402 */ 403 option=argv[i]; 404 if (LocaleCompare("display",option+1) == 0) 405 { 406 /* 407 User specified server name. 408 */ 409 i++; 410 if (i == (ssize_t) argc) 411 ThrowDisplayException(OptionError,"MissingArgument",option); 412 server_name=argv[i]; 413 } 414 if ((LocaleCompare("help",option+1) == 0) || 415 (LocaleCompare("-help",option+1) == 0)) 416 return(DisplayUsage()); 417 } 418 /* 419 Get user defaults from X resource database. 420 */ 421 display=XOpenDisplay(server_name); 422 if (display == (Display *) NULL) 423 ThrowDisplayException(XServerError,"UnableToOpenXServer", 424 XDisplayName(server_name)); 425 (void) XSetErrorHandler(XError); 426 resource_database=XGetResourceDatabase(display,GetClientName()); 427 XGetResourceInfo(image_info,resource_database,GetClientName(), 428 &resource_info); 429 quantize_info=resource_info.quantize_info; 430 image_info->density=XGetResourceInstance(resource_database,GetClientName(), 431 "density",(char *) NULL); 432 if (image_info->density == (char *) NULL) 433 image_info->density=XGetScreenDensity(display); 434 resource_value=XGetResourceInstance(resource_database,GetClientName(), 435 "interlace","none"); 436 image_info->interlace=(InterlaceType) 437 ParseCommandOption(MagickInterlaceOptions,MagickFalse,resource_value); 438 image_info->page=XGetResourceInstance(resource_database,GetClientName(), 439 "pageGeometry",(char *) NULL); 440 resource_value=XGetResourceInstance(resource_database,GetClientName(), 441 "quality","75"); 442 image_info->quality=StringToUnsignedLong(resource_value); 443 resource_value=XGetResourceInstance(resource_database,GetClientName(), 444 "verbose","False"); 445 image_info->verbose=IsStringTrue(resource_value); 446 resource_value=XGetResourceInstance(resource_database,GetClientName(), 447 "dither","True"); 448 quantize_info->dither_method=IsStringTrue(resource_value) != MagickFalse ? 449 RiemersmaDitherMethod : NoDitherMethod; 450 /* 451 Parse command line. 452 */ 453 iteration=0; 454 for (i=1; ((i <= (ssize_t) argc) && ((state & ExitState) == 0)); i++) 455 { 456 if (i < (ssize_t) argc) 457 option=argv[i]; 458 else 459 if (image != (Image *) NULL) 460 break; 461 else 462 if (isatty(STDIN_FILENO) != MagickFalse) 463 option="logo:"; 464 else 465 option="-"; 466 if (LocaleCompare(option,"(") == 0) 467 { 468 FireImageStack(MagickFalse,MagickTrue,pend); 469 if (k == MaxImageStackDepth) 470 ThrowDisplayException(OptionError,"ParenthesisNestedTooDeeply", 471 option); 472 PushImageStack(); 473 continue; 474 } 475 if (LocaleCompare(option,")") == 0) 476 { 477 FireImageStack(MagickFalse,MagickTrue,MagickTrue); 478 if (k == 0) 479 ThrowDisplayException(OptionError,"UnableToParseExpression",option); 480 PopImageStack(); 481 continue; 482 } 483 if (IsCommandOption(option) == MagickFalse) 484 { 485 const char 486 *filename; 487 488 Image 489 *display_image, 490 *image_list, 491 *images; 492 493 /* 494 Option is a file name. 495 */ 496 FireImageStack(MagickFalse,MagickFalse,pend); 497 filename=option; 498 if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1))) 499 { 500 option=argv[++i]; 501 filename=option; 502 } 503 (void) CopyMagickString(image_info->filename,filename,MagickPathExtent); 504 images=ReadImage(image_info,exception); 505 CatchException(exception); 506 status&=(images != (Image *) NULL) && 507 (exception->severity < ErrorException); 508 if (images == (Image *) NULL) 509 continue; 510 AppendImageStack(images); 511 FinalizeImageSettings(image_info,image,MagickFalse); 512 iterations=0; 513 if (i == (ssize_t) argc) 514 iterations=image->iterations; 515 image_list=CloneImageList(image,exception); 516 if (image_list == (Image *) NULL) 517 ThrowDisplayException(ResourceLimitError,"MemoryAllocationFailed", 518 GetExceptionMessage(errno)); 519 display_image=image_list; 520 do 521 { 522 /* 523 Transmogrify image as defined by the image processing options. 524 */ 525 resource_info.quantum=1; 526 if (resource_info.window_id != (char *) NULL) 527 { 528 /* 529 Display image to a specified X window. 530 */ 531 status=XDisplayBackgroundImage(display,&resource_info, 532 display_image,exception); 533 if (status != MagickFalse) 534 { 535 state|=RetainColorsState; 536 status=MagickFalse; 537 } 538 if (GetNextImageInList(display_image) == (Image *) NULL) 539 state|=ExitState; 540 } 541 else 542 do 543 { 544 Image 545 *nexus; 546 547 /* 548 Display image to X server. 549 */ 550 if (resource_info.delay != 1) 551 display_image->delay=resource_info.delay; 552 nexus=XDisplayImage(display,&resource_info,argv,argc, 553 &display_image,&state,exception); 554 if (nexus == (Image *) NULL) 555 break; 556 while ((nexus != (Image *) NULL) && ((state & ExitState) == 0)) 557 { 558 Image 559 *next; 560 561 if (nexus->montage != (char *) NULL) 562 { 563 /* 564 User selected a visual directory image (montage). 565 */ 566 display_image=nexus; 567 break; 568 } 569 next=XDisplayImage(display,&resource_info,argv,argc,&nexus, 570 &state,exception); 571 if ((next == (Image *) NULL) && 572 (GetNextImageInList(nexus) != (Image *) NULL)) 573 { 574 display_image=GetNextImageInList(nexus); 575 nexus=NewImageList(); 576 } 577 else 578 { 579 if (nexus != display_image) 580 nexus=DestroyImageList(nexus); 581 nexus=next; 582 } 583 } 584 } while ((state & ExitState) == 0); 585 if (resource_info.write_filename != (char *) NULL) 586 { 587 /* 588 Write image. 589 */ 590 (void) CopyMagickString(display_image->filename, 591 resource_info.write_filename,MagickPathExtent); 592 (void) SetImageInfo(image_info,1,exception); 593 status&=WriteImage(image_info,display_image,exception); 594 } 595 /* 596 Proceed to next/previous image. 597 */ 598 if ((state & FormerImageState) != 0) 599 for (l=0; l < (ssize_t) resource_info.quantum; l++) 600 { 601 if (GetPreviousImageInList(display_image) == (Image *) NULL) 602 break; 603 display_image=GetPreviousImageInList(display_image); 604 } 605 else 606 for (l=0; l < (ssize_t) resource_info.quantum; l++) 607 { 608 if (GetNextImageInList(display_image) == (Image *) NULL) 609 break; 610 display_image=GetNextImageInList(display_image); 611 } 612 if (l < (ssize_t) resource_info.quantum) 613 break; 614 } while ((display_image != (Image *) NULL) && ((state & ExitState) == 0)); 615 /* 616 Free image resources. 617 */ 618 display_image=DestroyImageList(display_image); 619 if ((state & FormerImageState) == 0) 620 { 621 last_image=(size_t) image_number; 622 image_marker[i]=(size_t) image_number++; 623 } 624 else 625 { 626 /* 627 Proceed to previous image. 628 */ 629 for (i--; i > 0; i--) 630 if (image_marker[i] == (size_t) (image_number-2)) 631 break; 632 image_number--; 633 } 634 if ((i == (ssize_t) argc) && ((state & ExitState) == 0)) 635 i=0; 636 if ((state & ExitState) != 0) 637 break; 638 /* 639 Determine if we should proceed to the first image. 640 */ 641 if (image_number < 0) 642 { 643 if ((state & FormerImageState) != 0) 644 { 645 646 for (i=1; i < (ssize_t) (argc-2); i++) 647 if (last_image == image_marker[i]) 648 break; 649 image_number=(ssize_t) image_marker[i]+1; 650 } 651 continue; 652 } 653 if (resource_info.window_id != (char *) NULL) 654 state|=ExitState; 655 if ((iterations != 0) && (++iteration == (ssize_t) iterations)) 656 state|=ExitState; 657 if (LocaleCompare(filename,"-") == 0) 658 state|=ExitState; 659 RemoveAllImageStack(); 660 continue; 661 } 662 pend=image != (Image *) NULL ? MagickTrue : MagickFalse; 663 switch (*(option+1)) 664 { 665 case 'a': 666 { 667 if (LocaleCompare("alpha",option+1) == 0) 668 { 669 ssize_t 670 type; 671 672 if (*option == '+') 673 break; 674 i++; 675 if (i == (ssize_t) argc) 676 ThrowDisplayException(OptionError,"MissingArgument",option); 677 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,argv[i]); 678 if (type < 0) 679 ThrowDisplayException(OptionError,"UnrecognizedAlphaChannelOption", 680 argv[i]); 681 break; 682 } 683 if (LocaleCompare("antialias",option+1) == 0) 684 break; 685 if (LocaleCompare("authenticate",option+1) == 0) 686 { 687 if (*option == '+') 688 break; 689 i++; 690 if (i == (ssize_t) argc) 691 ThrowDisplayException(OptionError,"MissingArgument",option); 692 break; 693 } 694 if (LocaleCompare("auto-orient",option+1) == 0) 695 break; 696 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 697 } 698 case 'b': 699 { 700 if (LocaleCompare("backdrop",option+1) == 0) 701 { 702 resource_info.backdrop=(*option == '-') ? MagickTrue : MagickFalse; 703 break; 704 } 705 if (LocaleCompare("background",option+1) == 0) 706 { 707 if (*option == '+') 708 break; 709 i++; 710 if (i == (ssize_t) argc) 711 ThrowDisplayException(OptionError,"MissingArgument",option); 712 resource_info.background_color=argv[i]; 713 break; 714 } 715 if (LocaleCompare("border",option+1) == 0) 716 { 717 if (*option == '+') 718 break; 719 i++; 720 if (i == (ssize_t) argc) 721 ThrowDisplayException(OptionError,"MissingArgument",option); 722 if (IsGeometry(argv[i]) == MagickFalse) 723 ThrowDisplayInvalidArgumentException(option,argv[i]); 724 break; 725 } 726 if (LocaleCompare("bordercolor",option+1) == 0) 727 { 728 if (*option == '+') 729 break; 730 i++; 731 if (i == (ssize_t) argc) 732 ThrowDisplayException(OptionError,"MissingArgument",option); 733 resource_info.border_color=argv[i]; 734 break; 735 } 736 if (LocaleCompare("borderwidth",option+1) == 0) 737 { 738 resource_info.border_width=0; 739 if (*option == '+') 740 break; 741 i++; 742 if (i == (ssize_t) argc) 743 ThrowDisplayException(OptionError,"MissingArgument",option); 744 if (IsGeometry(argv[i]) == MagickFalse) 745 ThrowDisplayInvalidArgumentException(option,argv[i]); 746 resource_info.border_width=(unsigned int) 747 StringToUnsignedLong(argv[i]); 748 break; 749 } 750 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 751 } 752 case 'c': 753 { 754 if (LocaleCompare("cache",option+1) == 0) 755 { 756 if (*option == '+') 757 break; 758 i++; 759 if (i == (ssize_t) argc) 760 ThrowDisplayException(OptionError,"MissingArgument",option); 761 if (IsGeometry(argv[i]) == MagickFalse) 762 ThrowDisplayInvalidArgumentException(option,argv[i]); 763 break; 764 } 765 if (LocaleCompare("channel",option+1) == 0) 766 { 767 ssize_t 768 channel; 769 770 if (*option == '+') 771 break; 772 i++; 773 if (i == (ssize_t) argc) 774 ThrowDisplayException(OptionError,"MissingArgument",option); 775 channel=ParseChannelOption(argv[i]); 776 if (channel < 0) 777 ThrowDisplayException(OptionError,"UnrecognizedChannelType", 778 argv[i]); 779 break; 780 } 781 if (LocaleCompare("clip",option+1) == 0) 782 break; 783 if (LocaleCompare("clip-path",option+1) == 0) 784 { 785 i++; 786 if (i == (ssize_t) argc) 787 ThrowDisplayException(OptionError,"MissingArgument",option); 788 break; 789 } 790 if (LocaleCompare("coalesce",option+1) == 0) 791 break; 792 if (LocaleCompare("colormap",option+1) == 0) 793 { 794 resource_info.colormap=PrivateColormap; 795 if (*option == '+') 796 break; 797 i++; 798 if (i == (ssize_t) argc) 799 ThrowDisplayException(OptionError,"MissingArgument",option); 800 resource_info.colormap=UndefinedColormap; 801 if (LocaleCompare("private",argv[i]) == 0) 802 resource_info.colormap=PrivateColormap; 803 if (LocaleCompare("shared",argv[i]) == 0) 804 resource_info.colormap=SharedColormap; 805 if (resource_info.colormap == UndefinedColormap) 806 ThrowDisplayException(OptionError,"UnrecognizedColormapType", 807 argv[i]); 808 break; 809 } 810 if (LocaleCompare("colors",option+1) == 0) 811 { 812 quantize_info->number_colors=0; 813 if (*option == '+') 814 break; 815 i++; 816 if (i == (ssize_t) argc) 817 ThrowDisplayException(OptionError,"MissingArgument",option); 818 if (IsGeometry(argv[i]) == MagickFalse) 819 ThrowDisplayInvalidArgumentException(option,argv[i]); 820 quantize_info->number_colors=StringToUnsignedLong(argv[i]); 821 break; 822 } 823 if (LocaleCompare("colorspace",option+1) == 0) 824 { 825 ssize_t 826 colorspace; 827 828 if (*option == '+') 829 break; 830 i++; 831 if (i == (ssize_t) argc) 832 ThrowDisplayException(OptionError,"MissingArgument",option); 833 colorspace=ParseCommandOption(MagickColorspaceOptions, 834 MagickFalse,argv[i]); 835 if (colorspace < 0) 836 ThrowDisplayException(OptionError,"UnrecognizedColorspace", 837 argv[i]); 838 break; 839 } 840 if (LocaleCompare("comment",option+1) == 0) 841 { 842 if (*option == '+') 843 break; 844 i++; 845 if (i == (ssize_t) argc) 846 ThrowDisplayException(OptionError,"MissingArgument",option); 847 break; 848 } 849 if (LocaleCompare("compress",option+1) == 0) 850 { 851 ssize_t 852 compress; 853 854 if (*option == '+') 855 break; 856 i++; 857 if (i == (ssize_t) argc) 858 ThrowDisplayException(OptionError,"MissingArgument",option); 859 compress=ParseCommandOption(MagickCompressOptions,MagickFalse, 860 argv[i]); 861 if (compress < 0) 862 ThrowDisplayException(OptionError,"UnrecognizedImageCompression", 863 argv[i]); 864 break; 865 } 866 if (LocaleCompare("concurrent",option+1) == 0) 867 break; 868 if (LocaleCompare("contrast",option+1) == 0) 869 break; 870 if (LocaleCompare("crop",option+1) == 0) 871 { 872 if (*option == '+') 873 break; 874 i++; 875 if (i == (ssize_t) argc) 876 ThrowDisplayException(OptionError,"MissingArgument",option); 877 if (IsGeometry(argv[i]) == MagickFalse) 878 ThrowDisplayInvalidArgumentException(option,argv[i]); 879 break; 880 } 881 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 882 } 883 case 'd': 884 { 885 if (LocaleCompare("debug",option+1) == 0) 886 { 887 ssize_t 888 event; 889 890 if (*option == '+') 891 break; 892 i++; 893 if (i == (ssize_t) argc) 894 ThrowDisplayException(OptionError,"MissingArgument",option); 895 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]); 896 if (event < 0) 897 ThrowDisplayException(OptionError,"UnrecognizedEventType", 898 argv[i]); 899 (void) SetLogEventMask(argv[i]); 900 break; 901 } 902 if (LocaleCompare("decipher",option+1) == 0) 903 { 904 if (*option == '+') 905 break; 906 i++; 907 if (i == (ssize_t) argc) 908 ThrowDisplayException(OptionError,"MissingArgument",option); 909 break; 910 } 911 if (LocaleCompare("define",option+1) == 0) 912 { 913 i++; 914 if (i == (ssize_t) argc) 915 ThrowDisplayException(OptionError,"MissingArgument",option); 916 if (*option == '+') 917 { 918 const char 919 *define; 920 921 define=GetImageOption(image_info,argv[i]); 922 if (define == (const char *) NULL) 923 ThrowDisplayException(OptionError,"NoSuchOption",argv[i]); 924 break; 925 } 926 break; 927 } 928 if (LocaleCompare("delay",option+1) == 0) 929 { 930 if (*option == '+') 931 break; 932 i++; 933 if (i == (ssize_t) argc) 934 ThrowDisplayException(OptionError,"MissingArgument",option); 935 if (IsGeometry(argv[i]) == MagickFalse) 936 ThrowDisplayInvalidArgumentException(option,argv[i]); 937 break; 938 } 939 if (LocaleCompare("density",option+1) == 0) 940 { 941 if (*option == '+') 942 break; 943 i++; 944 if (i == (ssize_t) argc) 945 ThrowDisplayException(OptionError,"MissingArgument",option); 946 if (IsGeometry(argv[i]) == MagickFalse) 947 ThrowDisplayInvalidArgumentException(option,argv[i]); 948 break; 949 } 950 if (LocaleCompare("depth",option+1) == 0) 951 { 952 if (*option == '+') 953 break; 954 i++; 955 if (i == (ssize_t) argc) 956 ThrowDisplayException(OptionError,"MissingArgument",option); 957 if (IsGeometry(argv[i]) == MagickFalse) 958 ThrowDisplayInvalidArgumentException(option,argv[i]); 959 break; 960 } 961 if (LocaleCompare("deskew",option+1) == 0) 962 { 963 if (*option == '+') 964 break; 965 i++; 966 if (i == (ssize_t) argc) 967 ThrowDisplayException(OptionError,"MissingArgument",option); 968 if (IsGeometry(argv[i]) == MagickFalse) 969 ThrowDisplayInvalidArgumentException(option,argv[i]); 970 break; 971 } 972 if (LocaleCompare("despeckle",option+1) == 0) 973 break; 974 if (LocaleCompare("display",option+1) == 0) 975 { 976 if (*option == '+') 977 break; 978 i++; 979 if (i == (ssize_t) argc) 980 ThrowDisplayException(OptionError,"MissingArgument",option); 981 break; 982 } 983 if (LocaleCompare("dispose",option+1) == 0) 984 { 985 ssize_t 986 dispose; 987 988 if (*option == '+') 989 break; 990 i++; 991 if (i == (ssize_t) argc) 992 ThrowDisplayException(OptionError,"MissingArgument",option); 993 dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]); 994 if (dispose < 0) 995 ThrowDisplayException(OptionError,"UnrecognizedDisposeMethod", 996 argv[i]); 997 break; 998 } 999 if (LocaleCompare("dither",option+1) == 0) 1000 { 1001 ssize_t 1002 method; 1003 1004 quantize_info->dither_method=NoDitherMethod; 1005 if (*option == '+') 1006 break; 1007 i++; 1008 if (i == (ssize_t) argc) 1009 ThrowDisplayException(OptionError,"MissingArgument",option); 1010 method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]); 1011 if (method < 0) 1012 ThrowDisplayException(OptionError,"UnrecognizedDitherMethod", 1013 argv[i]); 1014 quantize_info->dither_method=(DitherMethod) method; 1015 break; 1016 } 1017 if (LocaleCompare("duration",option+1) == 0) 1018 { 1019 if (*option == '+') 1020 break; 1021 i++; 1022 if (i == (ssize_t) argc) 1023 ThrowDisplayException(OptionError,"MissingArgument",option); 1024 if (IsGeometry(argv[i]) == MagickFalse) 1025 ThrowDisplayInvalidArgumentException(option,argv[i]); 1026 break; 1027 } 1028 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1029 } 1030 case 'e': 1031 { 1032 if (LocaleCompare("edge",option+1) == 0) 1033 { 1034 if (*option == '+') 1035 break; 1036 i++; 1037 if (i == (ssize_t) argc) 1038 ThrowDisplayException(OptionError,"MissingArgument",option); 1039 if (IsGeometry(argv[i]) == MagickFalse) 1040 ThrowDisplayInvalidArgumentException(option,argv[i]); 1041 break; 1042 } 1043 if (LocaleCompare("endian",option+1) == 0) 1044 { 1045 ssize_t 1046 endian; 1047 1048 if (*option == '+') 1049 break; 1050 i++; 1051 if (i == (ssize_t) argc) 1052 ThrowDisplayException(OptionError,"MissingArgument",option); 1053 endian=ParseCommandOption(MagickEndianOptions,MagickFalse, 1054 argv[i]); 1055 if (endian < 0) 1056 ThrowDisplayException(OptionError,"UnrecognizedEndianType", 1057 argv[i]); 1058 break; 1059 } 1060 if (LocaleCompare("enhance",option+1) == 0) 1061 break; 1062 if (LocaleCompare("equalize",option+1) == 0) 1063 break; 1064 if (LocaleCompare("extract",option+1) == 0) 1065 { 1066 if (*option == '+') 1067 break; 1068 i++; 1069 if (i == (ssize_t) argc) 1070 ThrowDisplayException(OptionError,"MissingArgument",option); 1071 if (IsGeometry(argv[i]) == MagickFalse) 1072 ThrowDisplayInvalidArgumentException(option,argv[i]); 1073 break; 1074 } 1075 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1076 } 1077 case 'f': 1078 { 1079 if (LocaleCompare("filter",option+1) == 0) 1080 { 1081 ssize_t 1082 filter; 1083 1084 if (*option == '+') 1085 break; 1086 i++; 1087 if (i == (ssize_t) argc) 1088 ThrowDisplayException(OptionError,"MissingArgument",option); 1089 filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]); 1090 if (filter < 0) 1091 ThrowDisplayException(OptionError,"UnrecognizedImageFilter", 1092 argv[i]); 1093 break; 1094 } 1095 if (LocaleCompare("flatten",option+1) == 0) 1096 break; 1097 if (LocaleCompare("flip",option+1) == 0) 1098 break; 1099 if (LocaleCompare("flop",option+1) == 0) 1100 break; 1101 if (LocaleCompare("font",option+1) == 0) 1102 { 1103 if (*option == '+') 1104 break; 1105 i++; 1106 if (i == (ssize_t) argc) 1107 ThrowDisplayException(OptionError,"MissingArgument",option); 1108 resource_info.font=XGetResourceClass(resource_database, 1109 GetClientName(),"font",argv[i]); 1110 break; 1111 } 1112 if (LocaleCompare("foreground",option+1) == 0) 1113 { 1114 if (*option == '+') 1115 break; 1116 i++; 1117 if (i == (ssize_t) argc) 1118 ThrowDisplayException(OptionError,"MissingArgument",option); 1119 resource_info.foreground_color=argv[i]; 1120 break; 1121 } 1122 if (LocaleCompare("format",option+1) == 0) 1123 { 1124 if (*option == '+') 1125 break; 1126 i++; 1127 if (i == (ssize_t) argc) 1128 ThrowDisplayException(OptionError,"MissingArgument",option); 1129 break; 1130 } 1131 if (LocaleCompare("frame",option+1) == 0) 1132 { 1133 if (*option == '+') 1134 break; 1135 i++; 1136 if (i == (ssize_t) argc) 1137 ThrowDisplayException(OptionError,"MissingArgument",option); 1138 if (IsGeometry(argv[i]) == MagickFalse) 1139 ThrowDisplayInvalidArgumentException(option,argv[i]); 1140 break; 1141 } 1142 if (LocaleCompare("fuzz",option+1) == 0) 1143 { 1144 if (*option == '+') 1145 break; 1146 i++; 1147 if (i == (ssize_t) argc) 1148 ThrowDisplayException(OptionError,"MissingArgument",option); 1149 if (IsGeometry(argv[i]) == MagickFalse) 1150 ThrowDisplayInvalidArgumentException(option,argv[i]); 1151 break; 1152 } 1153 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1154 } 1155 case 'g': 1156 { 1157 if (LocaleCompare("gamma",option+1) == 0) 1158 { 1159 i++; 1160 if (i == (ssize_t) argc) 1161 ThrowDisplayException(OptionError,"MissingArgument",option); 1162 if (IsGeometry(argv[i]) == MagickFalse) 1163 ThrowDisplayInvalidArgumentException(option,argv[i]); 1164 break; 1165 } 1166 if (LocaleCompare("geometry",option+1) == 0) 1167 { 1168 resource_info.image_geometry=(char *) NULL; 1169 if (*option == '+') 1170 break; 1171 (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent); 1172 i++; 1173 if (i == (ssize_t) argc) 1174 ThrowDisplayException(OptionError,"MissingArgument",option); 1175 if (IsGeometry(argv[i]) == MagickFalse) 1176 ThrowDisplayInvalidArgumentException(option,argv[i]); 1177 resource_info.image_geometry=ConstantString(argv[i]); 1178 break; 1179 } 1180 if (LocaleCompare("gravity",option+1) == 0) 1181 { 1182 ssize_t 1183 gravity; 1184 1185 if (*option == '+') 1186 break; 1187 i++; 1188 if (i == (ssize_t) argc) 1189 ThrowDisplayException(OptionError,"MissingArgument",option); 1190 gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, 1191 argv[i]); 1192 if (gravity < 0) 1193 ThrowDisplayException(OptionError,"UnrecognizedGravityType", 1194 argv[i]); 1195 break; 1196 } 1197 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1198 } 1199 case 'h': 1200 { 1201 if ((LocaleCompare("help",option+1) == 0) || 1202 (LocaleCompare("-help",option+1) == 0)) 1203 break; 1204 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1205 } 1206 case 'i': 1207 { 1208 if (LocaleCompare("identify",option+1) == 0) 1209 break; 1210 if (LocaleCompare("iconGeometry",option+1) == 0) 1211 { 1212 resource_info.icon_geometry=(char *) NULL; 1213 if (*option == '+') 1214 break; 1215 i++; 1216 if (i == (ssize_t) argc) 1217 ThrowDisplayException(OptionError,"MissingArgument",option); 1218 if (IsGeometry(argv[i]) == MagickFalse) 1219 ThrowDisplayInvalidArgumentException(option,argv[i]); 1220 resource_info.icon_geometry=argv[i]; 1221 break; 1222 } 1223 if (LocaleCompare("iconic",option+1) == 0) 1224 { 1225 resource_info.iconic=(*option == '-') ? MagickTrue : MagickFalse; 1226 break; 1227 } 1228 if (LocaleCompare("immutable",option+1) == 0) 1229 { 1230 resource_info.immutable=(*option == '-') ? MagickTrue : MagickFalse; 1231 break; 1232 } 1233 if (LocaleCompare("interlace",option+1) == 0) 1234 { 1235 ssize_t 1236 interlace; 1237 1238 if (*option == '+') 1239 break; 1240 i++; 1241 if (i == (ssize_t) argc) 1242 ThrowDisplayException(OptionError,"MissingArgument",option); 1243 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse, 1244 argv[i]); 1245 if (interlace < 0) 1246 ThrowDisplayException(OptionError,"UnrecognizedInterlaceType", 1247 argv[i]); 1248 break; 1249 } 1250 if (LocaleCompare("interpolate",option+1) == 0) 1251 { 1252 ssize_t 1253 interpolate; 1254 1255 if (*option == '+') 1256 break; 1257 i++; 1258 if (i == (ssize_t) argc) 1259 ThrowDisplayException(OptionError,"MissingArgument",option); 1260 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse, 1261 argv[i]); 1262 if (interpolate < 0) 1263 ThrowDisplayException(OptionError,"UnrecognizedInterpolateMethod", 1264 argv[i]); 1265 break; 1266 } 1267 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1268 } 1269 case 'l': 1270 { 1271 if (LocaleCompare("label",option+1) == 0) 1272 { 1273 if (*option == '+') 1274 break; 1275 i++; 1276 if (i == (ssize_t) argc) 1277 ThrowDisplayException(OptionError,"MissingArgument",option); 1278 break; 1279 } 1280 if (LocaleCompare("limit",option+1) == 0) 1281 { 1282 char 1283 *p; 1284 1285 double 1286 value; 1287 1288 ssize_t 1289 resource; 1290 1291 if (*option == '+') 1292 break; 1293 i++; 1294 if (i == (ssize_t) argc) 1295 ThrowDisplayException(OptionError,"MissingArgument",option); 1296 resource=ParseCommandOption(MagickResourceOptions,MagickFalse, 1297 argv[i]); 1298 if (resource < 0) 1299 ThrowDisplayException(OptionError,"UnrecognizedResourceType", 1300 argv[i]); 1301 i++; 1302 if (i == (ssize_t) argc) 1303 ThrowDisplayException(OptionError,"MissingArgument",option); 1304 value=StringToDouble(argv[i],&p); 1305 (void) value; 1306 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0)) 1307 ThrowDisplayInvalidArgumentException(option,argv[i]); 1308 break; 1309 } 1310 if (LocaleCompare("list",option+1) == 0) 1311 { 1312 ssize_t 1313 list; 1314 1315 if (*option == '+') 1316 break; 1317 i++; 1318 if (i == (ssize_t) argc) 1319 ThrowDisplayException(OptionError,"MissingArgument",option); 1320 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]); 1321 if (list < 0) 1322 ThrowDisplayException(OptionError,"UnrecognizedListType",argv[i]); 1323 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **) 1324 argv+j,exception); 1325 DestroyDisplay(); 1326 return(status == 0 ? MagickTrue : MagickFalse); 1327 } 1328 if (LocaleCompare("log",option+1) == 0) 1329 { 1330 if (*option == '+') 1331 break; 1332 i++; 1333 if ((i == (ssize_t) argc) || 1334 (strchr(argv[i],'%') == (char *) NULL)) 1335 ThrowDisplayException(OptionError,"MissingArgument",option); 1336 break; 1337 } 1338 if (LocaleCompare("loop",option+1) == 0) 1339 { 1340 if (*option == '+') 1341 break; 1342 i++; 1343 if (i == (ssize_t) argc) 1344 ThrowDisplayException(OptionError,"MissingArgument",option); 1345 if (IsGeometry(argv[i]) == MagickFalse) 1346 ThrowDisplayInvalidArgumentException(option,argv[i]); 1347 iterations=StringToUnsignedLong(argv[i]); 1348 break; 1349 } 1350 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1351 } 1352 case 'm': 1353 { 1354 if (LocaleCompare("magnify",option+1) == 0) 1355 { 1356 resource_info.magnify=2; 1357 if (*option == '+') 1358 break; 1359 i++; 1360 if (i == (ssize_t) argc) 1361 ThrowDisplayException(OptionError,"MissingArgument",option); 1362 if (IsGeometry(argv[i]) == MagickFalse) 1363 ThrowDisplayInvalidArgumentException(option,argv[i]); 1364 resource_info.magnify=(unsigned int) StringToUnsignedLong(argv[i]); 1365 break; 1366 } 1367 if (LocaleCompare("map",option+1) == 0) 1368 { 1369 resource_info.map_type=(char *) NULL; 1370 if (*option == '+') 1371 break; 1372 (void) strcpy(argv[i]+1,"san"); 1373 i++; 1374 if (i == (ssize_t) argc) 1375 ThrowDisplayException(OptionError,"MissingArgument",option); 1376 resource_info.map_type=argv[i]; 1377 break; 1378 } 1379 if (LocaleCompare("matte",option+1) == 0) 1380 break; 1381 if (LocaleCompare("alpha-color",option+1) == 0) 1382 { 1383 if (*option == '+') 1384 break; 1385 i++; 1386 if (i == (ssize_t) argc) 1387 ThrowDisplayException(OptionError,"MissingArgument",option); 1388 resource_info.alpha_color=argv[i]; 1389 break; 1390 } 1391 if (LocaleCompare("monitor",option+1) == 0) 1392 break; 1393 if (LocaleCompare("monochrome",option+1) == 0) 1394 { 1395 if (*option == '+') 1396 break; 1397 quantize_info->number_colors=2; 1398 quantize_info->colorspace=GRAYColorspace; 1399 break; 1400 } 1401 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1402 } 1403 case 'n': 1404 { 1405 if (LocaleCompare("name",option+1) == 0) 1406 { 1407 resource_info.name=(char *) NULL; 1408 if (*option == '+') 1409 break; 1410 i++; 1411 if (i == (ssize_t) argc) 1412 ThrowDisplayException(OptionError,"MissingArgument",option); 1413 resource_info.name=ConstantString(argv[i]); 1414 break; 1415 } 1416 if (LocaleCompare("negate",option+1) == 0) 1417 break; 1418 if (LocaleCompare("noop",option+1) == 0) 1419 break; 1420 if (LocaleCompare("normalize",option+1) == 0) 1421 break; 1422 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1423 } 1424 case 'p': 1425 { 1426 if (LocaleCompare("page",option+1) == 0) 1427 { 1428 resource_info.image_geometry=(char *) NULL; 1429 if (*option == '+') 1430 break; 1431 i++; 1432 if (i == (ssize_t) argc) 1433 ThrowDisplayException(OptionError,"MissingArgument",option); 1434 resource_info.image_geometry=ConstantString(argv[i]); 1435 break; 1436 } 1437 if (LocaleCompare("profile",option+1) == 0) 1438 { 1439 i++; 1440 if (i == (ssize_t) argc) 1441 ThrowDisplayException(OptionError,"MissingArgument",option); 1442 break; 1443 } 1444 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1445 } 1446 case 'q': 1447 { 1448 if (LocaleCompare("quality",option+1) == 0) 1449 { 1450 if (*option == '+') 1451 break; 1452 i++; 1453 if (i == (ssize_t) argc) 1454 ThrowDisplayException(OptionError,"MissingArgument",option); 1455 if (IsGeometry(argv[i]) == MagickFalse) 1456 ThrowDisplayInvalidArgumentException(option,argv[i]); 1457 break; 1458 } 1459 if (LocaleCompare("quantize",option+1) == 0) 1460 { 1461 ssize_t 1462 colorspace; 1463 1464 if (*option == '+') 1465 break; 1466 i++; 1467 if (i == (ssize_t) argc) 1468 ThrowDisplayException(OptionError,"MissingArgument",option); 1469 colorspace=ParseCommandOption(MagickColorspaceOptions, 1470 MagickFalse,argv[i]); 1471 if (colorspace < 0) 1472 ThrowDisplayException(OptionError,"UnrecognizedColorspace", 1473 argv[i]); 1474 break; 1475 } 1476 if (LocaleCompare("quiet",option+1) == 0) 1477 break; 1478 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1479 } 1480 case 'r': 1481 { 1482 if (LocaleCompare("raise",option+1) == 0) 1483 { 1484 i++; 1485 if (i == (ssize_t) argc) 1486 ThrowDisplayException(OptionError,"MissingArgument",option); 1487 if (IsGeometry(argv[i]) == MagickFalse) 1488 ThrowDisplayInvalidArgumentException(option,argv[i]); 1489 break; 1490 } 1491 if (LocaleCompare("regard-warnings",option+1) == 0) 1492 break; 1493 if (LocaleCompare("remote",option+1) == 0) 1494 { 1495 i++; 1496 if (i == (ssize_t) argc) 1497 ThrowDisplayException(OptionError,"MissingArgument",option); 1498 if (XRemoteCommand(display,resource_info.window_id,argv[i]) != 0) 1499 return(MagickFalse); 1500 i--; 1501 break; 1502 } 1503 if (LocaleCompare("repage",option+1) == 0) 1504 { 1505 if (*option == '+') 1506 break; 1507 i++; 1508 if (i == (ssize_t) argc) 1509 ThrowDisplayException(OptionError,"MissingArgument",option); 1510 if (IsGeometry(argv[i]) == MagickFalse) 1511 ThrowDisplayInvalidArgumentException(option,argv[i]); 1512 break; 1513 } 1514 if (LocaleCompare("resample",option+1) == 0) 1515 { 1516 if (*option == '+') 1517 break; 1518 i++; 1519 if (i == (ssize_t) argc) 1520 ThrowDisplayException(OptionError,"MissingArgument",option); 1521 if (IsGeometry(argv[i]) == MagickFalse) 1522 ThrowDisplayInvalidArgumentException(option,argv[i]); 1523 break; 1524 } 1525 if (LocaleCompare("resize",option+1) == 0) 1526 { 1527 if (*option == '+') 1528 break; 1529 i++; 1530 if (i == (ssize_t) argc) 1531 ThrowDisplayException(OptionError,"MissingArgument",option); 1532 if (IsGeometry(argv[i]) == MagickFalse) 1533 ThrowDisplayInvalidArgumentException(option,argv[i]); 1534 break; 1535 } 1536 if (LocaleNCompare("respect-parentheses",option+1,17) == 0) 1537 { 1538 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse; 1539 break; 1540 } 1541 if (LocaleCompare("roll",option+1) == 0) 1542 { 1543 if (*option == '+') 1544 break; 1545 i++; 1546 if (i == (ssize_t) argc) 1547 ThrowDisplayException(OptionError,"MissingArgument",option); 1548 if (IsGeometry(argv[i]) == MagickFalse) 1549 ThrowDisplayInvalidArgumentException(option,argv[i]); 1550 break; 1551 } 1552 if (LocaleCompare("rotate",option+1) == 0) 1553 { 1554 i++; 1555 if (i == (ssize_t) argc) 1556 ThrowDisplayException(OptionError,"MissingArgument",option); 1557 if (IsGeometry(argv[i]) == MagickFalse) 1558 ThrowDisplayInvalidArgumentException(option,argv[i]); 1559 break; 1560 } 1561 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1562 } 1563 case 's': 1564 { 1565 if (LocaleCompare("sample",option+1) == 0) 1566 { 1567 if (*option == '+') 1568 break; 1569 i++; 1570 if (i == (ssize_t) argc) 1571 ThrowDisplayException(OptionError,"MissingArgument",option); 1572 if (IsGeometry(argv[i]) == MagickFalse) 1573 ThrowDisplayInvalidArgumentException(option,argv[i]); 1574 break; 1575 } 1576 if (LocaleCompare("sampling-factor",option+1) == 0) 1577 { 1578 if (*option == '+') 1579 break; 1580 i++; 1581 if (i == (ssize_t) argc) 1582 ThrowDisplayException(OptionError,"MissingArgument",option); 1583 if (IsGeometry(argv[i]) == MagickFalse) 1584 ThrowDisplayInvalidArgumentException(option,argv[i]); 1585 break; 1586 } 1587 if (LocaleCompare("scenes",option+1) == 0) 1588 { 1589 if (*option == '+') 1590 break; 1591 i++; 1592 if (i == (ssize_t) argc) 1593 ThrowDisplayException(OptionError,"MissingArgument",option); 1594 if (IsSceneGeometry(argv[i],MagickFalse) == MagickFalse) 1595 ThrowDisplayInvalidArgumentException(option,argv[i]); 1596 break; 1597 } 1598 if (LocaleCompare("seed",option+1) == 0) 1599 { 1600 if (*option == '+') 1601 break; 1602 i++; 1603 if (i == (ssize_t) argc) 1604 ThrowDisplayException(OptionError,"MissingArgument",option); 1605 if (IsGeometry(argv[i]) == MagickFalse) 1606 ThrowDisplayInvalidArgumentException(option,argv[i]); 1607 break; 1608 } 1609 if (LocaleCompare("segment",option+1) == 0) 1610 { 1611 if (*option == '+') 1612 break; 1613 i++; 1614 if (i == (ssize_t) argc) 1615 ThrowDisplayException(OptionError,"MissingArgument",option); 1616 if (IsGeometry(argv[i]) == MagickFalse) 1617 ThrowDisplayInvalidArgumentException(option,argv[i]); 1618 break; 1619 } 1620 if (LocaleCompare("set",option+1) == 0) 1621 { 1622 i++; 1623 if (i == (ssize_t) argc) 1624 ThrowDisplayException(OptionError,"MissingArgument",option); 1625 if (*option == '+') 1626 break; 1627 i++; 1628 if (i == (ssize_t) argc) 1629 ThrowDisplayException(OptionError,"MissingArgument",option); 1630 break; 1631 } 1632 if (LocaleCompare("sharpen",option+1) == 0) 1633 { 1634 if (*option == '+') 1635 break; 1636 i++; 1637 if (i == (ssize_t) argc) 1638 ThrowDisplayException(OptionError,"MissingArgument",option); 1639 if (IsGeometry(argv[i]) == MagickFalse) 1640 ThrowDisplayInvalidArgumentException(option,argv[i]); 1641 break; 1642 } 1643 if (LocaleCompare("shared-memory",option+1) == 0) 1644 { 1645 resource_info.use_shared_memory= (*option == '-') ? MagickTrue : 1646 MagickFalse; 1647 break; 1648 } 1649 if (LocaleCompare("size",option+1) == 0) 1650 { 1651 if (*option == '+') 1652 break; 1653 i++; 1654 if (i == (ssize_t) argc) 1655 ThrowDisplayException(OptionError,"MissingArgument",option); 1656 if (IsGeometry(argv[i]) == MagickFalse) 1657 ThrowDisplayInvalidArgumentException(option,argv[i]); 1658 break; 1659 } 1660 if (LocaleCompare("strip",option+1) == 0) 1661 break; 1662 if (LocaleCompare("support",option+1) == 0) 1663 { 1664 i++; /* deprecated */ 1665 break; 1666 } 1667 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1668 } 1669 case 't': 1670 { 1671 if (LocaleCompare("text-font",option+1) == 0) 1672 { 1673 resource_info.text_font=(char *) NULL; 1674 if (*option == '+') 1675 break; 1676 i++; 1677 if (i == (ssize_t) argc) 1678 ThrowDisplayException(OptionError,"MissingArgument",option); 1679 resource_info.text_font=XGetResourceClass(resource_database, 1680 GetClientName(),"font",argv[i]); 1681 break; 1682 } 1683 if (LocaleCompare("texture",option+1) == 0) 1684 { 1685 if (*option == '+') 1686 break; 1687 i++; 1688 if (i == (ssize_t) argc) 1689 ThrowDisplayException(OptionError,"MissingArgument",option); 1690 break; 1691 } 1692 if (LocaleCompare("threshold",option+1) == 0) 1693 { 1694 if (*option == '+') 1695 break; 1696 i++; 1697 if (i == (ssize_t) argc) 1698 ThrowDisplayException(OptionError,"MissingArgument",option); 1699 if (IsGeometry(argv[i]) == MagickFalse) 1700 ThrowDisplayInvalidArgumentException(option,argv[i]); 1701 break; 1702 } 1703 if (LocaleCompare("thumbnail",option+1) == 0) 1704 { 1705 if (*option == '+') 1706 break; 1707 i++; 1708 if (i == (ssize_t) argc) 1709 ThrowDisplayException(OptionError,"MissingArgument",option); 1710 if (IsGeometry(argv[i]) == MagickFalse) 1711 ThrowDisplayInvalidArgumentException(option,argv[i]); 1712 break; 1713 } 1714 if (LocaleCompare("title",option+1) == 0) 1715 { 1716 resource_info.title=(char *) NULL; 1717 if (*option == '+') 1718 break; 1719 i++; 1720 if (i == (ssize_t) argc) 1721 ThrowDisplayException(OptionError,"MissingArgument",option); 1722 resource_info.title=argv[i]; 1723 break; 1724 } 1725 if (LocaleCompare("transparent-color",option+1) == 0) 1726 { 1727 if (*option == '+') 1728 break; 1729 i++; 1730 if (i == (ssize_t) argc) 1731 ThrowDisplayException(OptionError,"MissingArgument",option); 1732 break; 1733 } 1734 if (LocaleCompare("treedepth",option+1) == 0) 1735 { 1736 quantize_info->tree_depth=0; 1737 if (*option == '+') 1738 break; 1739 i++; 1740 if (i == (ssize_t) argc) 1741 ThrowDisplayException(OptionError,"MissingArgument",option); 1742 if (IsGeometry(argv[i]) == MagickFalse) 1743 ThrowDisplayInvalidArgumentException(option,argv[i]); 1744 quantize_info->tree_depth=StringToUnsignedLong(argv[i]); 1745 break; 1746 } 1747 if (LocaleCompare("trim",option+1) == 0) 1748 break; 1749 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1750 } 1751 case 'u': 1752 { 1753 if (LocaleCompare("update",option+1) == 0) 1754 { 1755 resource_info.update=(unsigned int) (*option == '-'); 1756 if (*option == '+') 1757 break; 1758 i++; 1759 if (i == (ssize_t) argc) 1760 ThrowDisplayException(OptionError,"MissingArgument",option); 1761 if (IsGeometry(argv[i]) == MagickFalse) 1762 ThrowDisplayInvalidArgumentException(option,argv[i]); 1763 resource_info.update=(unsigned int) StringToUnsignedLong(argv[i]); 1764 break; 1765 } 1766 if (LocaleCompare("use-pixmap",option+1) == 0) 1767 { 1768 resource_info.use_pixmap=(*option == '-') ? MagickTrue : 1769 MagickFalse; 1770 break; 1771 } 1772 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1773 } 1774 case 'v': 1775 { 1776 if (LocaleCompare("verbose",option+1) == 0) 1777 break; 1778 if ((LocaleCompare("version",option+1) == 0) || 1779 (LocaleCompare("-version",option+1) == 0)) 1780 { 1781 ListMagickVersion(stdout); 1782 break; 1783 } 1784 if (LocaleCompare("visual",option+1) == 0) 1785 { 1786 resource_info.visual_type=(char *) NULL; 1787 if (*option == '+') 1788 break; 1789 i++; 1790 if (i == (ssize_t) argc) 1791 ThrowDisplayException(OptionError,"MissingArgument",option); 1792 resource_info.visual_type=argv[i]; 1793 break; 1794 } 1795 if (LocaleCompare("virtual-pixel",option+1) == 0) 1796 { 1797 ssize_t 1798 method; 1799 1800 if (*option == '+') 1801 break; 1802 i++; 1803 if (i == (ssize_t) argc) 1804 ThrowDisplayException(OptionError,"MissingArgument",option); 1805 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse, 1806 argv[i]); 1807 if (method < 0) 1808 ThrowDisplayException(OptionError, 1809 "UnrecognizedVirtualPixelMethod",argv[i]); 1810 break; 1811 } 1812 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1813 } 1814 case 'w': 1815 { 1816 if (LocaleCompare("window",option+1) == 0) 1817 { 1818 resource_info.window_id=(char *) NULL; 1819 if (*option == '+') 1820 break; 1821 i++; 1822 if (i == (ssize_t) argc) 1823 ThrowDisplayException(OptionError,"MissingArgument",option); 1824 resource_info.window_id=argv[i]; 1825 break; 1826 } 1827 if (LocaleCompare("window-group",option+1) == 0) 1828 { 1829 resource_info.window_group=(char *) NULL; 1830 if (*option == '+') 1831 break; 1832 i++; 1833 if (i == (ssize_t) argc) 1834 ThrowDisplayException(OptionError,"MissingArgument",option); 1835 if (StringToDouble(argv[i],(char **) NULL) != 0) 1836 resource_info.window_group=argv[i]; 1837 break; 1838 } 1839 if (LocaleCompare("write",option+1) == 0) 1840 { 1841 resource_info.write_filename=(char *) NULL; 1842 if (*option == '+') 1843 break; 1844 i++; 1845 if (i == (ssize_t) argc) 1846 ThrowDisplayException(OptionError,"MissingArgument",option); 1847 resource_info.write_filename=argv[i]; 1848 if (IsPathAccessible(resource_info.write_filename) != MagickFalse) 1849 { 1850 char 1851 answer[2], 1852 *p; 1853 1854 (void) FormatLocaleFile(stderr,"Overwrite %s? ", 1855 resource_info.write_filename); 1856 p=fgets(answer,(int) sizeof(answer),stdin); 1857 (void) p; 1858 if (((*answer != 'y') && (*answer != 'Y'))) 1859 return(MagickFalse); 1860 } 1861 break; 1862 } 1863 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1864 } 1865 case '?': 1866 break; 1867 default: 1868 ThrowDisplayException(OptionError,"UnrecognizedOption",option); 1869 } 1870 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) & 1871 FireOptionFlag) == 0 ? MagickFalse : MagickTrue; 1872 if (fire != MagickFalse) 1873 FireImageStack(MagickFalse,MagickTrue,MagickTrue); 1874 } 1875 if (k != 0) 1876 ThrowDisplayException(OptionError,"UnbalancedParenthesis",argv[i]); 1877 if (state & RetainColorsState) 1878 { 1879 XRetainWindowColors(display,XRootWindow(display,XDefaultScreen(display))); 1880 (void) XSync(display,MagickFalse); 1881 } 1882 DestroyDisplay(); 1883 return(status != 0 ? MagickTrue : MagickFalse); 1884#else 1885 (void) argc; 1886 (void) argv; 1887 (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError, 1888 "DelegateLibrarySupportNotBuiltIn","'%s' (X11)",image_info->filename); 1889 return(DisplayUsage()); 1890#endif 1891} 1892