Home | History | Annotate | Download | only in MagickWand
      1 /*
      2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      3 %                                                                             %
      4 %                                                                             %
      5 %                                                                             %
      6 %                 IIIII  M   M  PPPP    OOO   RRRR   TTTTT                    %
      7 %                   I    MM MM  P   P  O   O  R   R    T                      %
      8 %                   I    M M M  PPPP   O   O  RRRR     T                      %
      9 %                   I    M   M  P      O   O  R R      T                      %
     10 %                 IIIII  M   M  P       OOO   R  R     T                      %
     11 %                                                                             %
     12 %                                                                             %
     13 %                       Import Image from X11 Screen                          %
     14 %                                                                             %
     15 %                           Software Design                                   %
     16 %                                Cristy                                       %
     17 %                              July 1992                                      %
     18 %                                                                             %
     19 %                                                                             %
     20 %  Copyright 1999-2019 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 %    https://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 import program to capture some or all of an X server screen and
     37 %  save the image to a file.
     38 %
     39 */
     40 
     41 /*
     43   Include declarations.
     44 */
     45 #include "MagickWand/studio.h"
     46 #include "MagickWand/MagickWand.h"
     47 #include "MagickWand/mogrify-private.h"
     48 #include "MagickCore/string-private.h"
     49 #include "MagickCore/image-private.h"
     50 #include "MagickCore/xwindow-private.h"
     51 
     52 /*
     54 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     55 %                                                                             %
     56 %                                                                             %
     57 %                                                                             %
     58 +   I m p o r t I m a g e C o m m a n d                                       %
     59 %                                                                             %
     60 %                                                                             %
     61 %                                                                             %
     62 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     63 %
     64 %  ImportImageCommand() reads an image from any visible window on an X server
     65 %  and outputs it as an image file. You can capture a single window, the
     66 %  entire screen, or any rectangular portion of the screen.  You can use the
     67 %  display utility for redisplay, printing, editing, formatting, archiving,
     68 %  image processing, etc. of the captured image.
     69 %
     70 %  The target window can be specified by id, name, or may be selected by
     71 %  clicking the mouse in the desired window. If you press a button and then
     72 %  drag, a rectangle will form which expands and contracts as the mouse moves.
     73 %  To save the portion of the screen defined by the rectangle, just release
     74 %  the button. The keyboard bell is rung once at the beginning of the screen
     75 %  capture and twice when it completes.
     76 %
     77 %  The format of the ImportImageCommand method is:
     78 %
     79 %      MagickBooleanType ImportImageCommand(ImageInfo *image_info,int argc,
     80 %        char **argv,char **metadata,ExceptionInfo *exception)
     81 %
     82 %  A description of each parameter follows:
     83 %
     84 %    o image_info: the image info.
     85 %
     86 %    o argc: the number of elements in the argument vector.
     87 %
     88 %    o argv: A text array containing the command line arguments.
     89 %
     90 %    o metadata: any metadata is returned here.
     91 %
     92 %    o exception: return any errors or warnings in this structure.
     93 %
     94 */
     95 
     96 static MagickBooleanType ImportUsage(void)
     97 {
     98   const char
     99     **p;
    100 
    101   static const char
    102     *miscellaneous[]=
    103     {
    104       "-debug events        display copious debugging information",
    105       "-help                print program options",
    106       "-list type           print a list of supported option arguments",
    107       "-log format          format of debugging information",
    108       "-version             print version information",
    109       (char *) NULL
    110     },
    111     *operators[]=
    112     {
    113       "-annotate geometry text",
    114       "                     annotate the image with text",
    115       "-colors value        preferred number of colors in the image",
    116       "-crop geometry       preferred size and location of the cropped image",
    117       "-encipher filename   convert plain pixels to cipher pixels",
    118       "-geometry geometry   preferred size or location of the image",
    119       "-help                print program options",
    120       "-monochrome          transform image to black and white",
    121       "-negate              replace every pixel with its complementary color ",
    122       "-quantize colorspace reduce colors in this colorspace",
    123       "-resize geometry     resize the image",
    124       "-rotate degrees      apply Paeth rotation to the image",
    125       "-strip               strip image of all profiles and comments",
    126       "-thumbnail geometry  create a thumbnail of the image",
    127       "-transparent color   make this color transparent within the image",
    128       "-trim                trim image edges",
    129       "-type type           image type",
    130       (char *) NULL
    131     },
    132     *settings[]=
    133     {
    134       "-adjoin              join images into a single multi-image file",
    135       "-border              include window border in the output image",
    136       "-channel type        apply option to select image channels",
    137       "-colorspace type     alternate image colorspace",
    138       "-comment string      annotate image with comment",
    139       "-compress type       type of pixel compression when writing the image",
    140       "-define format:option",
    141       "                     define one or more image format options",
    142       "-density geometry    horizontal and vertical density of the image",
    143       "-depth value         image depth",
    144       "-descend             obtain image by descending window hierarchy",
    145       "-display server      X server to contact",
    146       "-dispose method      layer disposal method",
    147       "-dither method       apply error diffusion to image",
    148       "-delay value         display the next image after pausing",
    149       "-encipher filename   convert plain pixels to cipher pixels",
    150       "-endian type         endianness (MSB or LSB) of the image",
    151       "-encoding type       text encoding type",
    152       "-filter type         use this filter when resizing an image",
    153       "-format \"string\"     output formatted image characteristics",
    154       "-frame               include window manager frame",
    155       "-gravity direction   which direction to gravitate towards",
    156       "-identify            identify the format and characteristics of the image",
    157       "-interlace type      None, Line, Plane, or Partition",
    158       "-interpolate method  pixel color interpolation method",
    159       "-label string        assign a label to an image",
    160       "-limit type value    Area, Disk, Map, or Memory resource limit",
    161       "-monitor             monitor progress",
    162       "-page geometry       size and location of an image canvas",
    163       "-pause seconds       seconds delay between snapshots",
    164       "-pointsize value     font point size",
    165       "-quality value       JPEG/MIFF/PNG compression level",
    166       "-quiet               suppress all warning messages",
    167       "-regard-warnings     pay attention to warning messages",
    168       "-repage geometry     size and location of an image canvas",
    169       "-respect-parentheses settings remain in effect until parenthesis boundary",
    170       "-sampling-factor geometry",
    171       "                     horizontal and vertical sampling factor",
    172       "-scene value         image scene number",
    173       "-screen              select image from root window",
    174       "-seed value          seed a new sequence of pseudo-random numbers",
    175       "-set property value  set an image property",
    176       "-silent              operate silently, i.e. don't ring any bells ",
    177       "-snaps value         number of screen snapshots",
    178       "-support factor      resize support: > 1.0 is blurry, < 1.0 is sharp",
    179       "-synchronize         synchronize image to storage device",
    180       "-taint               declare the image as modified",
    181       "-transparent-color color",
    182       "                     transparent color",
    183       "-treedepth value     color tree depth",
    184       "-verbose             print detailed information about the image",
    185       "-virtual-pixel method",
    186       "                     Constant, Edge, Mirror, or Tile",
    187       "-window id           select window with this id or name",
    188       "                     root selects whole screen",
    189       (char *) NULL
    190     };
    191 
    192   ListMagickVersion(stdout);
    193   (void) printf("Usage: %s [options ...] [ file ]\n",
    194     GetClientName());
    195   (void) printf("\nImage Settings:\n");
    196   for (p=settings; *p != (char *) NULL; p++)
    197     (void) printf("  %s\n",*p);
    198   (void) printf("\nImage Operators:\n");
    199   for (p=operators; *p != (char *) NULL; p++)
    200     (void) printf("  %s\n",*p);
    201   (void) printf("\nMiscellaneous Options:\n");
    202   for (p=miscellaneous; *p != (char *) NULL; p++)
    203     (void) printf("  %s\n",*p);
    204   (void) printf(
    205   "\nBy default, 'file' is written in the MIFF image format.  To\n");
    206   (void) printf(
    207     "specify a particular image format, precede the filename with an image\n");
    208   (void) printf(
    209     "format name and a colon (i.e. ps:image) or specify the image type as\n");
    210   (void) printf(
    211     "the filename suffix (i.e. image.ps).  Specify 'file' as '-' for\n");
    212   (void) printf("standard input or output.\n");
    213   return(MagickFalse);
    214 }
    215 
    216 WandExport MagickBooleanType ImportImageCommand(ImageInfo *image_info,
    217   int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
    218 {
    219 #if defined(MAGICKCORE_X11_DELEGATE)
    220 #define DestroyImport() \
    221 { \
    222   XDestroyResourceInfo(&resource_info); \
    223   if (display != (Display *) NULL) \
    224     { \
    225       XCloseDisplay(display); \
    226       display=(Display *) NULL; \
    227     } \
    228   DestroyImageStack(); \
    229   if (target_window != (char *) NULL) \
    230     target_window=DestroyString(target_window); \
    231   for (i=0; i < (ssize_t) argc; i++) \
    232     argv[i]=DestroyString(argv[i]); \
    233   argv=(char **) RelinquishMagickMemory(argv); \
    234 }
    235 #define ThrowImportException(asperity,tag,option) \
    236 { \
    237   (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
    238      option); \
    239   DestroyImport(); \
    240   return(MagickFalse); \
    241 }
    242 #define ThrowImportInvalidArgumentException(option,argument) \
    243 { \
    244   (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
    245     "InvalidArgument","'%s': %s",option,argument); \
    246   DestroyImport(); \
    247   return(MagickFalse); \
    248 }
    249 
    250   char
    251     *filename,
    252     *option,
    253     *resource_value,
    254     *server_name,
    255     *target_window;
    256 
    257   Display
    258     *display;
    259 
    260   Image
    261     *image;
    262 
    263   ImageStack
    264     image_stack[MaxImageStackDepth+1];
    265 
    266   MagickBooleanType
    267     fire,
    268     pend,
    269     respect_parenthesis;
    270 
    271   MagickStatusType
    272     status;
    273 
    274   QuantizeInfo
    275     *quantize_info;
    276 
    277   register ssize_t
    278     i;
    279 
    280   ssize_t
    281     j,
    282     k,
    283     snapshots;
    284 
    285   XImportInfo
    286     ximage_info;
    287 
    288   XResourceInfo
    289     resource_info;
    290 
    291   XrmDatabase
    292     resource_database;
    293 
    294   /*
    295     Set defaults.
    296   */
    297   assert(image_info != (ImageInfo *) NULL);
    298   assert(image_info->signature == MagickCoreSignature);
    299   if (image_info->debug != MagickFalse)
    300     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    301   assert(exception != (ExceptionInfo *) NULL);
    302   if (argc == 2)
    303     {
    304       option=argv[1];
    305       if ((LocaleCompare("version",option+1) == 0) ||
    306           (LocaleCompare("-version",option+1) == 0))
    307         {
    308           ListMagickVersion(stdout);
    309           return(MagickTrue);
    310         }
    311     }
    312   display=(Display *) NULL;
    313   j=1;
    314   k=0;
    315   NewImageStack();
    316   option=(char *) NULL;
    317   pend=MagickFalse;
    318   resource_database=(XrmDatabase) NULL;
    319   respect_parenthesis=MagickFalse;
    320   (void) memset(&resource_info,0,sizeof(resource_info));
    321   server_name=(char *) NULL;
    322   status=MagickTrue;
    323   SetNotifyHandlers;
    324   target_window=(char *) NULL;
    325   /*
    326     Check for server name specified on the command line.
    327   */
    328   ReadCommandlLine(argc,&argv);
    329   status=ExpandFilenames(&argc,&argv);
    330   if (status == MagickFalse)
    331     ThrowImportException(ResourceLimitError,"MemoryAllocationFailed",
    332       GetExceptionMessage(errno));
    333   for (i=1; i < (ssize_t) argc; i++)
    334   {
    335     /*
    336       Check command line for server name.
    337     */
    338     option=argv[i];
    339     if (IsCommandOption(option) == MagickFalse)
    340       continue;
    341     if (LocaleCompare("display",option+1) == 0)
    342       {
    343         /*
    344           User specified server name.
    345         */
    346         i++;
    347         if (i == (ssize_t) argc)
    348           ThrowImportException(OptionError,"MissingArgument",option);
    349         server_name=argv[i];
    350       }
    351     if ((LocaleCompare("help",option+1) == 0) ||
    352         (LocaleCompare("-help",option+1) == 0))
    353       return(ImportUsage());
    354   }
    355   /*
    356     Get user defaults from X resource database.
    357   */
    358   display=XOpenDisplay(server_name);
    359   if (display == (Display *) NULL)
    360     ThrowImportException(XServerError,"UnableToOpenXServer",
    361       XDisplayName(server_name));
    362   (void) XSetErrorHandler(XError);
    363   resource_database=XGetResourceDatabase(display,GetClientName());
    364   XGetImportInfo(&ximage_info);
    365   XGetResourceInfo(image_info,resource_database,GetClientName(),
    366     &resource_info);
    367   quantize_info=resource_info.quantize_info;
    368   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    369     "border","False");
    370   ximage_info.borders=IsStringTrue(resource_value);
    371   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    372     "delay","0");
    373   resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value);
    374   image_info->density=XGetResourceInstance(resource_database,GetClientName(),
    375     "density",(char *) NULL);
    376   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    377     "descend","False");
    378   ximage_info.descend=IsStringTrue(resource_value);
    379   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    380     "frame","False");
    381   ximage_info.frame=IsStringTrue(resource_value);
    382   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    383     "interlace","none");
    384   image_info->interlace=UndefinedInterlace;
    385   if (LocaleCompare("None",resource_value) == 0)
    386     image_info->interlace=NoInterlace;
    387   if (LocaleCompare("Line",resource_value) == 0)
    388     image_info->interlace=LineInterlace;
    389   if (LocaleCompare("Plane",resource_value) == 0)
    390     image_info->interlace=PlaneInterlace;
    391   if (LocaleCompare("Partition",resource_value) == 0)
    392     image_info->interlace=PartitionInterlace;
    393   if (image_info->interlace == UndefinedInterlace)
    394     ThrowImportException(OptionError,"Unrecognized interlace type",
    395       resource_value);
    396   image_info->page=XGetResourceInstance(resource_database,GetClientName(),
    397     "pageGeometry",(char *) NULL);
    398   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    399     "pause","0");
    400   resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value);
    401   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    402     "quality","85");
    403   image_info->quality=StringToUnsignedLong(resource_value);
    404   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    405     "screen","False");
    406   ximage_info.screen=IsStringTrue(resource_value);
    407   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    408     "silent","False");
    409   ximage_info.silent=IsStringTrue(resource_value);
    410   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    411     "verbose","False");
    412   image_info->verbose=IsStringTrue(resource_value);
    413   resource_value=XGetResourceInstance(resource_database,GetClientName(),
    414     "dither","True");
    415   quantize_info->dither_method=IsStringTrue(resource_value) != MagickFalse ?
    416     RiemersmaDitherMethod : NoDitherMethod;
    417   snapshots=1;
    418   status=MagickTrue;
    419   filename=(char *) NULL;
    420   /*
    421     Check command syntax.
    422   */
    423   for (i=1; i < (ssize_t) argc; i++)
    424   {
    425     option=argv[i];
    426     if (LocaleCompare(option,"(") == 0)
    427       {
    428         FireImageStack(MagickFalse,MagickTrue,pend);
    429         if (k == MaxImageStackDepth)
    430           ThrowImportException(OptionError,"ParenthesisNestedTooDeeply",
    431             option);
    432         PushImageStack();
    433         continue;
    434       }
    435     if (LocaleCompare(option,")") == 0)
    436       {
    437         FireImageStack(MagickFalse,MagickTrue,MagickTrue);
    438         if (k == 0)
    439           ThrowImportException(OptionError,"UnableToParseExpression",option);
    440         PopImageStack();
    441         continue;
    442       }
    443     if (IsCommandOption(option) == MagickFalse)
    444       {
    445         Image
    446           *images;
    447 
    448         size_t
    449           scene;
    450 
    451         /*
    452           Read image from X server.
    453         */
    454         FireImageStack(MagickFalse,MagickFalse,pend);
    455         filename=argv[i];
    456         if (target_window != (char *) NULL)
    457           (void) CopyMagickString(image_info->filename,target_window,
    458             MagickPathExtent);
    459         for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++)
    460         {
    461           MagickDelay(1000*resource_info.pause);
    462           images=XImportImage(image_info,&ximage_info,exception);
    463           status&=(images != (Image *) NULL) &&
    464             (exception->severity < ErrorException);
    465           if (images == (Image *) NULL)
    466             continue;
    467           (void) CopyMagickString(images->filename,filename,MagickPathExtent);
    468           (void) CopyMagickString(images->magick,"PS",MagickPathExtent);
    469           images->scene=scene;
    470           AppendImageStack(images);
    471         }
    472         continue;
    473       }
    474     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
    475     switch(*(option+1))
    476     {
    477       case 'a':
    478       {
    479         if (LocaleCompare("adjoin",option+1) == 0)
    480           break;
    481         if (LocaleCompare("annotate",option+1) == 0)
    482           {
    483             if (*option == '+')
    484               break;
    485             i++;
    486             if (i == (ssize_t) argc)
    487               ThrowImportException(OptionError,"MissingArgument",option);
    488             if (IsGeometry(argv[i]) == MagickFalse)
    489               ThrowImportInvalidArgumentException(option,argv[i]);
    490             if (i == (ssize_t) argc)
    491               ThrowImportException(OptionError,"MissingArgument",option);
    492             i++;
    493             break;
    494           }
    495         ThrowImportException(OptionError,"UnrecognizedOption",option);
    496       }
    497       case 'b':
    498       {
    499         if (LocaleCompare("border",option+1) == 0)
    500           {
    501             (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
    502             ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse;
    503             break;
    504           }
    505         if (LocaleCompare("bordercolor",option+1) == 0)
    506           {
    507             if (*option == '+')
    508               break;
    509             i++;
    510             if (i == (ssize_t) argc)
    511               ThrowImportException(OptionError,"MissingArgument",option);
    512             break;
    513           }
    514         ThrowImportException(OptionError,"UnrecognizedOption",option);
    515       }
    516       case 'c':
    517       {
    518         if (LocaleCompare("cache",option+1) == 0)
    519           {
    520             if (*option == '+')
    521               break;
    522             i++;
    523             if (i == (ssize_t) argc)
    524               ThrowImportException(OptionError,"MissingArgument",option);
    525             if (IsGeometry(argv[i]) == MagickFalse)
    526               ThrowImportInvalidArgumentException(option,argv[i]);
    527             break;
    528           }
    529         if (LocaleCompare("channel",option+1) == 0)
    530           {
    531             ssize_t
    532               channel;
    533 
    534             if (*option == '+')
    535               break;
    536             i++;
    537             if (i == (ssize_t) argc)
    538               ThrowImportException(OptionError,"MissingArgument",option);
    539             channel=ParseChannelOption(argv[i]);
    540             if (channel < 0)
    541               ThrowImportException(OptionError,"UnrecognizedChannelType",
    542                 argv[i]);
    543             break;
    544           }
    545         if (LocaleCompare("colors",option+1) == 0)
    546           {
    547             quantize_info->number_colors=0;
    548             if (*option == '+')
    549               break;
    550             i++;
    551             if (i == (ssize_t) argc)
    552               ThrowImportException(OptionError,"MissingArgument",option);
    553             if (IsGeometry(argv[i]) == MagickFalse)
    554               ThrowImportInvalidArgumentException(option,argv[i]);
    555             quantize_info->number_colors=StringToUnsignedLong(argv[i]);
    556             break;
    557           }
    558         if (LocaleCompare("colorspace",option+1) == 0)
    559           {
    560             ssize_t
    561               colorspace;
    562 
    563             if (*option == '+')
    564               break;
    565             i++;
    566             if (i == (ssize_t) argc)
    567               ThrowImportException(OptionError,"MissingArgument",option);
    568             colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
    569               argv[i]);
    570             if (colorspace < 0)
    571               ThrowImportException(OptionError,"UnrecognizedColorspace",
    572                 argv[i]);
    573             break;
    574           }
    575         if (LocaleCompare("comment",option+1) == 0)
    576           {
    577             if (*option == '+')
    578               break;
    579             i++;
    580             if (i == (ssize_t) argc)
    581               ThrowImportException(OptionError,"MissingArgument",option);
    582             status=SetImageOption(image_info,"comment",argv[i]);
    583             if (status == MagickFalse)
    584               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
    585             break;
    586           }
    587         if (LocaleCompare("compress",option+1) == 0)
    588           {
    589             ssize_t
    590               compress;
    591 
    592             if (*option == '+')
    593               break;
    594             i++;
    595             if (i == (ssize_t) argc)
    596               ThrowImportException(OptionError,"MissingArgument",option);
    597             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
    598               argv[i]);
    599             if (compress < 0)
    600               ThrowImportException(OptionError,"UnrecognizedImageCompression",
    601                 argv[i]);
    602             break;
    603           }
    604         if (LocaleCompare("concurrent",option+1) == 0)
    605           break;
    606         if (LocaleCompare("crop",option+1) == 0)
    607           {
    608             if (*option == '+')
    609               break;
    610             i++;
    611             if (i == (ssize_t) argc)
    612               ThrowImportException(OptionError,"MissingArgument",option);
    613             if (IsGeometry(argv[i]) == MagickFalse)
    614               ThrowImportInvalidArgumentException(option,argv[i]);
    615             break;
    616           }
    617         ThrowImportException(OptionError,"UnrecognizedOption",option);
    618       }
    619       case 'd':
    620       {
    621         if (LocaleCompare("debug",option+1) == 0)
    622           {
    623             ssize_t
    624               event;
    625 
    626             if (*option == '+')
    627               break;
    628             i++;
    629             if (i == (ssize_t) argc)
    630               ThrowImportException(OptionError,"MissingArgument",option);
    631             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
    632             if (event < 0)
    633               ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]);
    634             (void) SetLogEventMask(argv[i]);
    635             break;
    636           }
    637         if (LocaleCompare("define",option+1) == 0)
    638           {
    639             i++;
    640             if (i == (ssize_t) argc)
    641               ThrowImportException(OptionError,"MissingArgument",option);
    642             if (*option == '+')
    643               {
    644                 const char
    645                   *define;
    646 
    647                 define=GetImageOption(image_info,argv[i]);
    648                 if (define == (char *) NULL)
    649                   ThrowImportException(OptionError,"NoSuchOption",argv[i]);
    650                 break;
    651               }
    652             break;
    653           }
    654         if (LocaleCompare("delay",option+1) == 0)
    655           {
    656             if (*option == '+')
    657               break;
    658             i++;
    659             if (i == (ssize_t) argc)
    660               ThrowImportException(OptionError,"MissingArgument",option);
    661             if (IsGeometry(argv[i]) == MagickFalse)
    662               ThrowImportInvalidArgumentException(option,argv[i]);
    663             status=SetImageOption(image_info,"delay",argv[i]);
    664             if (status == MagickFalse)
    665               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
    666             break;
    667           }
    668         if (LocaleCompare("density",option+1) == 0)
    669           {
    670             if (*option == '+')
    671               break;
    672             i++;
    673             if (i == (ssize_t) argc)
    674               ThrowImportException(OptionError,"MissingArgument",option);
    675             if (IsGeometry(argv[i]) == MagickFalse)
    676               ThrowImportInvalidArgumentException(option,argv[i]);
    677             break;
    678           }
    679         if (LocaleCompare("depth",option+1) == 0)
    680           {
    681             if (*option == '+')
    682               break;
    683             i++;
    684             if (i == (ssize_t) argc)
    685               ThrowImportException(OptionError,"MissingArgument",option);
    686             if (IsGeometry(argv[i]) == MagickFalse)
    687               ThrowImportInvalidArgumentException(option,argv[i]);
    688             break;
    689           }
    690         if (LocaleCompare("descend",option+1) == 0)
    691           {
    692             ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse;
    693             break;
    694           }
    695         if (LocaleCompare("display",option+1) == 0)
    696           {
    697             if (*option == '+')
    698               break;
    699             i++;
    700             if (i == (ssize_t) argc)
    701               ThrowImportException(OptionError,"MissingArgument",option);
    702             break;
    703           }
    704         if (LocaleCompare("dispose",option+1) == 0)
    705           {
    706             ssize_t
    707               dispose;
    708 
    709             if (*option == '+')
    710               break;
    711             i++;
    712             if (i == (ssize_t) argc)
    713               ThrowImportException(OptionError,"MissingArgument",option);
    714             dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
    715             if (dispose < 0)
    716               ThrowImportException(OptionError,"UnrecognizedDisposeMethod",
    717                 argv[i]);
    718             break;
    719           }
    720         if (LocaleCompare("dither",option+1) == 0)
    721           {
    722             ssize_t
    723               method;
    724 
    725             quantize_info->dither_method=NoDitherMethod;
    726             if (*option == '+')
    727               break;
    728             i++;
    729             if (i == (ssize_t) argc)
    730               ThrowImportException(OptionError,"MissingArgument",option);
    731             method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
    732             if (method < 0)
    733               ThrowImportException(OptionError,"UnrecognizedDitherMethod",
    734                 argv[i]);
    735             quantize_info->dither_method=(DitherMethod) method;
    736             break;
    737           }
    738         if (LocaleCompare("duration",option+1) == 0)
    739           {
    740             if (*option == '+')
    741               break;
    742             i++;
    743             if (i == (ssize_t) argc)
    744               ThrowImportException(OptionError,"MissingArgument",option);
    745             if (IsGeometry(argv[i]) == MagickFalse)
    746               ThrowImportInvalidArgumentException(option,argv[i]);
    747             break;
    748           }
    749         ThrowImportException(OptionError,"UnrecognizedOption",option);
    750       }
    751       case 'e':
    752       {
    753         if (LocaleCompare("encipher",option+1) == 0)
    754           {
    755             if (*option == '+')
    756               break;
    757             i++;
    758             if (i == (ssize_t) argc)
    759               ThrowImportException(OptionError,"MissingArgument",option);
    760             break;
    761           }
    762         if (LocaleCompare("encoding",option+1) == 0)
    763           {
    764             if (*option == '+')
    765               break;
    766             i++;
    767             if (i == (ssize_t) argc)
    768               ThrowImportException(OptionError,"MissingArgument",option);
    769             break;
    770           }
    771         if (LocaleCompare("endian",option+1) == 0)
    772           {
    773             ssize_t
    774               endian;
    775 
    776             if (*option == '+')
    777               break;
    778             i++;
    779             if (i == (ssize_t) argc)
    780               ThrowImportException(OptionError,"MissingArgument",option);
    781             endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
    782               argv[i]);
    783             if (endian < 0)
    784               ThrowImportException(OptionError,"UnrecognizedEndianType",
    785                 argv[i]);
    786             break;
    787           }
    788         ThrowImportException(OptionError,"UnrecognizedOption",option);
    789       }
    790       case 'f':
    791       {
    792         if (LocaleCompare("filter",option+1) == 0)
    793           {
    794             ssize_t
    795               filter;
    796 
    797             if (*option == '+')
    798               break;
    799             i++;
    800             if (i == (ssize_t) argc)
    801               ThrowImportException(OptionError,"MissingArgument",option);
    802             filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
    803             if (filter < 0)
    804               ThrowImportException(OptionError,"UnrecognizedImageFilter",
    805                 argv[i]);
    806             break;
    807           }
    808         if (LocaleCompare("frame",option+1) == 0)
    809           {
    810             (void) CopyMagickString(argv[i]+1,"sans0",MagickPathExtent);
    811             ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse;
    812             break;
    813           }
    814         if (LocaleCompare("format",option+1) == 0)
    815           {
    816             if (*option == '+')
    817               break;
    818             i++;
    819             if (i == (ssize_t) argc)
    820               ThrowImportException(OptionError,"MissingArgument",option);
    821             break;
    822           }
    823         ThrowImportException(OptionError,"UnrecognizedOption",option);
    824       }
    825       case 'g':
    826       {
    827         if (LocaleCompare("geometry",option+1) == 0)
    828           {
    829             if (*option == '+')
    830               break;
    831             i++;
    832             if (i == (ssize_t) argc)
    833               ThrowImportException(OptionError,"MissingArgument",option);
    834             if (IsGeometry(argv[i]) == MagickFalse)
    835               ThrowImportInvalidArgumentException(option,argv[i]);
    836             break;
    837           }
    838         if (LocaleCompare("gravity",option+1) == 0)
    839           {
    840             ssize_t
    841               gravity;
    842 
    843             if (*option == '+')
    844               break;
    845             i++;
    846             if (i == (ssize_t) argc)
    847               ThrowImportException(OptionError,"MissingArgument",option);
    848             gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
    849             if (gravity < 0)
    850               ThrowImportException(OptionError,"UnrecognizedGravityType",
    851                 argv[i]);
    852             break;
    853           }
    854         ThrowImportException(OptionError,"UnrecognizedOption",option);
    855       }
    856       case 'h':
    857       {
    858         if (LocaleCompare("help",option+1) == 0)
    859           break;
    860         ThrowImportException(OptionError,"UnrecognizedOption",option);
    861       }
    862       case 'i':
    863       {
    864         if (LocaleCompare("identify",option+1) == 0)
    865           break;
    866         if (LocaleCompare("interlace",option+1) == 0)
    867           {
    868             ssize_t
    869               interlace;
    870 
    871             if (*option == '+')
    872               break;
    873             i++;
    874             if (i == (ssize_t) argc)
    875               ThrowImportException(OptionError,"MissingArgument",option);
    876             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
    877               argv[i]);
    878             if (interlace < 0)
    879               ThrowImportException(OptionError,"UnrecognizedInterlaceType",
    880                 argv[i]);
    881             break;
    882           }
    883         if (LocaleCompare("interpolate",option+1) == 0)
    884           {
    885             ssize_t
    886               interpolate;
    887 
    888             if (*option == '+')
    889               break;
    890             i++;
    891             if (i == (ssize_t) argc)
    892               ThrowImportException(OptionError,"MissingArgument",option);
    893             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
    894               argv[i]);
    895             if (interpolate < 0)
    896               ThrowImportException(OptionError,"UnrecognizedInterpolateMethod",
    897                 argv[i]);
    898             break;
    899           }
    900         ThrowImportException(OptionError,"UnrecognizedOption",option);
    901       }
    902       case 'l':
    903       {
    904         if (LocaleCompare("label",option+1) == 0)
    905           {
    906             if (*option == '+')
    907               break;
    908             i++;
    909             if (i == (ssize_t) argc)
    910               ThrowImportException(OptionError,"MissingArgument",option);
    911             status=SetImageOption(image_info,"label",argv[i]);
    912             if (status == MagickFalse)
    913               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
    914             break;
    915           }
    916         if (LocaleCompare("limit",option+1) == 0)
    917           {
    918             char
    919               *p;
    920 
    921             double
    922               value;
    923 
    924             ssize_t
    925               resource;
    926 
    927             if (*option == '+')
    928               break;
    929             i++;
    930             if (i == (ssize_t) argc)
    931               ThrowImportException(OptionError,"MissingArgument",option);
    932             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
    933               argv[i]);
    934             if (resource < 0)
    935               ThrowImportException(OptionError,"UnrecognizedResourceType",
    936                 argv[i]);
    937             i++;
    938             if (i == (ssize_t) argc)
    939               ThrowImportException(OptionError,"MissingArgument",option);
    940             value=StringToDouble(argv[i],&p);
    941             (void) value;
    942             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
    943               ThrowImportInvalidArgumentException(option,argv[i]);
    944             break;
    945           }
    946         if (LocaleCompare("list",option+1) == 0)
    947           {
    948             ssize_t
    949               list;
    950 
    951             if (*option == '+')
    952               break;
    953             i++;
    954             if (i == (ssize_t) argc)
    955               ThrowImportException(OptionError,"MissingArgument",option);
    956             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
    957             if (list < 0)
    958               ThrowImportException(OptionError,"UnrecognizedListType",argv[i]);
    959             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
    960               argv+j,exception);
    961             DestroyImport();
    962             return(status == 0 ? MagickFalse : MagickTrue);
    963           }
    964         if (LocaleCompare("log",option+1) == 0)
    965           {
    966             if (*option == '+')
    967               break;
    968             i++;
    969             if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
    970               ThrowImportException(OptionError,"MissingArgument",option);
    971             break;
    972           }
    973         ThrowImportException(OptionError,"UnrecognizedOption",option);
    974       }
    975       case 'm':
    976       {
    977         if (LocaleCompare("monitor",option+1) == 0)
    978           break;
    979         if (LocaleCompare("monochrome",option+1) == 0)
    980           {
    981             if (*option == '+')
    982               break;
    983             quantize_info->number_colors=2;
    984             quantize_info->colorspace=GRAYColorspace;
    985             break;
    986           }
    987         ThrowImportException(OptionError,"UnrecognizedOption",option);
    988       }
    989       case 'n':
    990       {
    991         if (LocaleCompare("negate",option+1) == 0)
    992           break;
    993         ThrowImportException(OptionError,"UnrecognizedOption",option);
    994       }
    995       case 'p':
    996       {
    997         if (LocaleCompare("page",option+1) == 0)
    998           {
    999             if (*option == '+')
   1000               break;
   1001             i++;
   1002             if (i == (ssize_t) argc)
   1003               ThrowImportException(OptionError,"MissingArgument",option);
   1004             status=SetImageOption(image_info,"page",argv[i]);
   1005             if (status == MagickFalse)
   1006               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
   1007             break;
   1008           }
   1009         if (LocaleCompare("pause",option+1) == 0)
   1010           {
   1011             resource_info.pause=0;
   1012             if (*option == '+')
   1013               break;
   1014             i++;
   1015             if (i == (ssize_t) argc)
   1016               ThrowImportException(OptionError,"MissingArgument",option);
   1017             if (IsGeometry(argv[i]) == MagickFalse)
   1018               ThrowImportInvalidArgumentException(option,argv[i]);
   1019             resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]);
   1020             break;
   1021           }
   1022         if (LocaleCompare("ping",option+1) == 0)
   1023           break;  /* deprecated option */
   1024         if (LocaleCompare("pointsize",option+1) == 0)
   1025           {
   1026             if (*option == '+')
   1027               break;
   1028             i++;
   1029             if (i == (ssize_t) argc)
   1030               ThrowImportException(OptionError,"MissingArgument",option);
   1031             if (IsGeometry(argv[i]) == MagickFalse)
   1032               ThrowImportInvalidArgumentException(option,argv[i]);
   1033             break;
   1034           }
   1035         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1036       }
   1037       case 'q':
   1038       {
   1039         if (LocaleCompare("quality",option+1) == 0)
   1040           {
   1041             if (*option == '+')
   1042               break;
   1043             i++;
   1044             if (i == (ssize_t) argc)
   1045               ThrowImportException(OptionError,"MissingArgument",option);
   1046             if (IsGeometry(argv[i]) == MagickFalse)
   1047               ThrowImportInvalidArgumentException(option,argv[i]);
   1048             break;
   1049           }
   1050         if (LocaleCompare("quantize",option+1) == 0)
   1051           {
   1052             ssize_t
   1053               colorspace;
   1054 
   1055             if (*option == '+')
   1056               break;
   1057             i++;
   1058             if (i == (ssize_t) argc)
   1059               ThrowImportException(OptionError,"MissingArgument",option);
   1060             colorspace=ParseCommandOption(MagickColorspaceOptions,
   1061               MagickFalse,argv[i]);
   1062             if (colorspace < 0)
   1063               ThrowImportException(OptionError,"UnrecognizedColorspace",
   1064                 argv[i]);
   1065             break;
   1066           }
   1067         if (LocaleCompare("quiet",option+1) == 0)
   1068           break;
   1069         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1070       }
   1071       case 'r':
   1072       {
   1073         if (LocaleCompare("regard-warnings",option+1) == 0)
   1074           break;
   1075         if (LocaleCompare("repage",option+1) == 0)
   1076           {
   1077             if (*option == '+')
   1078               break;
   1079             i++;
   1080             if (i == (ssize_t) argc)
   1081               ThrowImportException(OptionError,"MissingArgument",option);
   1082             if (IsGeometry(argv[i]) == MagickFalse)
   1083               ThrowImportInvalidArgumentException(option,argv[i]);
   1084             break;
   1085           }
   1086         if (LocaleCompare("resize",option+1) == 0)
   1087           {
   1088             if (*option == '+')
   1089               break;
   1090             i++;
   1091             if (i == (ssize_t) argc)
   1092               ThrowImportException(OptionError,"MissingArgument",option);
   1093             if (IsGeometry(argv[i]) == MagickFalse)
   1094               ThrowImportInvalidArgumentException(option,argv[i]);
   1095             break;
   1096           }
   1097         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
   1098           {
   1099             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
   1100             break;
   1101           }
   1102         if (LocaleCompare("rotate",option+1) == 0)
   1103           {
   1104             i++;
   1105             if (i == (ssize_t) argc)
   1106               ThrowImportException(OptionError,"MissingArgument",option);
   1107             if (IsGeometry(argv[i]) == MagickFalse)
   1108               ThrowImportInvalidArgumentException(option,argv[i]);
   1109             break;
   1110           }
   1111         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1112       }
   1113       case 's':
   1114       {
   1115         if (LocaleCompare("sampling-factor",option+1) == 0)
   1116           {
   1117             if (*option == '+')
   1118               break;
   1119             i++;
   1120             if (i == (ssize_t) argc)
   1121               ThrowImportException(OptionError,"MissingArgument",option);
   1122             if (IsGeometry(argv[i]) == MagickFalse)
   1123               ThrowImportInvalidArgumentException(option,argv[i]);
   1124             break;
   1125           }
   1126         if (LocaleCompare("scene",option+1) == 0)
   1127           {
   1128             if (*option == '+')
   1129               break;
   1130             i++;
   1131             if (i == (ssize_t) argc)
   1132               ThrowImportException(OptionError,"MissingArgument",option);
   1133             if (IsGeometry(argv[i]) == MagickFalse)
   1134               ThrowImportInvalidArgumentException(option,argv[i]);
   1135             break;
   1136           }
   1137         if (LocaleCompare("set",option+1) == 0)
   1138           {
   1139             i++;
   1140             if (i == (ssize_t) argc)
   1141               ThrowImportException(OptionError,"MissingArgument",option);
   1142             if (*option == '+')
   1143               break;
   1144             i++;
   1145             if (i == (ssize_t) argc)
   1146               ThrowImportException(OptionError,"MissingArgument",option);
   1147             break;
   1148           }
   1149         if (LocaleCompare("screen",option+1) == 0)
   1150           {
   1151             ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse;
   1152             break;
   1153           }
   1154         if (LocaleCompare("seed",option+1) == 0)
   1155           {
   1156             if (*option == '+')
   1157               break;
   1158             i++;
   1159             if (i == (ssize_t) argc)
   1160               ThrowImportException(OptionError,"MissingArgument",option);
   1161             if (IsGeometry(argv[i]) == MagickFalse)
   1162               ThrowImportInvalidArgumentException(option,argv[i]);
   1163             break;
   1164           }
   1165         if (LocaleCompare("silent",option+1) == 0)
   1166           {
   1167             ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse;
   1168             break;
   1169           }
   1170         if (LocaleCompare("snaps",option+1) == 0)
   1171           {
   1172             (void) CopyMagickString(argv[i]+1,"sans",MagickPathExtent);
   1173             i++;
   1174             if (i == (ssize_t) argc)
   1175               ThrowImportException(OptionError,"MissingArgument",option);
   1176             if (IsGeometry(argv[i]) == MagickFalse)
   1177               ThrowImportInvalidArgumentException(option,argv[i]);
   1178             snapshots=(ssize_t) StringToLong(argv[i]);
   1179             break;
   1180           }
   1181         if (LocaleCompare("strip",option+1) == 0)
   1182           break;
   1183         if (LocaleCompare("support",option+1) == 0)
   1184           {
   1185             i++;  /* deprecated */
   1186             break;
   1187           }
   1188         if (LocaleCompare("synchronize",option+1) == 0)
   1189           break;
   1190         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1191       }
   1192       case 't':
   1193       {
   1194         if (LocaleCompare("taint",option+1) == 0)
   1195           break;
   1196         if (LocaleCompare("thumbnail",option+1) == 0)
   1197           {
   1198             if (*option == '+')
   1199               break;
   1200             i++;
   1201             if (i == (ssize_t) argc)
   1202               ThrowImportException(OptionError,"MissingArgument",option);
   1203             if (IsGeometry(argv[i]) == MagickFalse)
   1204               ThrowImportInvalidArgumentException(option,argv[i]);
   1205             break;
   1206           }
   1207         if (LocaleCompare("transparent",option+1) == 0)
   1208           {
   1209             i++;
   1210             if (i == (ssize_t) argc)
   1211               ThrowImportException(OptionError,"MissingArgument",option);
   1212             break;
   1213           }
   1214         if (LocaleCompare("transparent-color",option+1) == 0)
   1215           {
   1216             if (*option == '+')
   1217               break;
   1218             i++;
   1219             if (i == (ssize_t) argc)
   1220               ThrowImportException(OptionError,"MissingArgument",option);
   1221             break;
   1222           }
   1223         if (LocaleCompare("treedepth",option+1) == 0)
   1224           {
   1225             quantize_info->tree_depth=0;
   1226             if (*option == '+')
   1227               break;
   1228             i++;
   1229             if (i == (ssize_t) argc)
   1230               ThrowImportException(OptionError,"MissingArgument",option);
   1231             if (IsGeometry(argv[i]) == MagickFalse)
   1232               ThrowImportInvalidArgumentException(option,argv[i]);
   1233             quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
   1234             break;
   1235           }
   1236         if (LocaleCompare("trim",option+1) == 0)
   1237           break;
   1238         if (LocaleCompare("type",option+1) == 0)
   1239           {
   1240             ssize_t
   1241               type;
   1242 
   1243             if (*option == '+')
   1244               break;
   1245             i++;
   1246             if (i == (ssize_t) argc)
   1247               ThrowImportException(OptionError,"MissingArgument",option);
   1248             type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
   1249             if (type < 0)
   1250               ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]);
   1251             break;
   1252           }
   1253         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1254       }
   1255       case 'w':
   1256       {
   1257         i++;
   1258         if (i == (ssize_t) argc)
   1259           ThrowImportException(OptionError,"MissingArgument",option);
   1260         (void) CloneString(&target_window,argv[i]);
   1261         break;
   1262       }
   1263       case 'v':
   1264       {
   1265         if (LocaleCompare("verbose",option+1) == 0)
   1266           break;
   1267         if ((LocaleCompare("version",option+1) == 0) ||
   1268             (LocaleCompare("-version",option+1) == 0))
   1269           {
   1270             ListMagickVersion(stdout);
   1271             break;
   1272           }
   1273         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1274       }
   1275       case '?':
   1276         break;
   1277       default:
   1278         ThrowImportException(OptionError,"UnrecognizedOption",option);
   1279     }
   1280     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
   1281       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
   1282     if (fire != MagickFalse)
   1283       FireImageStack(MagickFalse,MagickTrue,MagickTrue);
   1284   }
   1285   if (k != 0)
   1286     ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]);
   1287   if (i-- != (ssize_t) argc)
   1288     ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]);
   1289   if (image == (Image *) NULL)
   1290     ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]);
   1291   FinalizeImageSettings(image_info,image,MagickTrue);
   1292   status&=WriteImages(image_info,image,filename,exception);
   1293   DestroyImport();
   1294   return(status != 0 ? MagickTrue : MagickFalse);
   1295 #else
   1296   wand_unreferenced(argc);
   1297   wand_unreferenced(argv);
   1298   wand_unreferenced(metadata);
   1299   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
   1300     "DelegateLibrarySupportNotBuiltIn","'%s' (X11)",image_info->filename);
   1301   return(ImportUsage());
   1302 #endif
   1303 }
   1304