diff options
Diffstat (limited to 'kernel/kls_xcf/xcf2pnm/options.i')
-rw-r--r-- | kernel/kls_xcf/xcf2pnm/options.i | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/kernel/kls_xcf/xcf2pnm/options.i b/kernel/kls_xcf/xcf2pnm/options.i new file mode 100644 index 0000000..f891767 --- /dev/null +++ b/kernel/kls_xcf/xcf2pnm/options.i @@ -0,0 +1,410 @@ +/* Option processing for xcftools -*- C -*- + * + * Copyright (C) 2006 Henning Makholm + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +OPTIONGROUP(1i,General options); + +OPTION('h',--help,show this message, + (Print an option summery to standard output and exit with a + return code of 0. + )); +exit(0); + +OPTION('V',--version,show version, + (Print the version numer of + .B xcftools + to standard output and exit with a return code of 0. + )); +printf(OPTI_TARGET " - " PACKAGE_STRING "\n"); +exit(0); + +OPTION('v',--verbose,show progress messages, + (Print progress messages about the conversion to standard error. + )); +verboseFlag = 1 ; +break ; + +OPTION('j',--bzip,input is bzip2 compressed, + (Equivalent to + .BR "\-Z bzcat" . + Default if the filename ends with + .BR bz2 . + )); +unzipper = "bzcat" ; +break ; + +OPTION('z',--gzip,input is gzip compressed, + (Equivalent to + .BR "\-Z zcat" . + Default if the filename ends with + .BR gz . + )); +unzipper = "zcat" ; +break ; + +OPTION('Z',--unpack,(command) use 'command' to decompress input, + (Specify a command that the input file is filtered through + before being interpreted as an XCF file. The command is invoked as + .I command filename + and must produce output to its standard output. + Note that it is not possible to specify arguments as part of + .IR command . + An uncompressor is selected automatically if the filename ends + with + .B gz + or + .BR bz2 ; + to suppress this, use + .B \-Z cat + (which is implemented without actually starting a + .BR cat (1) + process). + )); +unzipper = optarg ; +break ; + +#ifdef XCF2FOO + +OPTION('o',--output,(filename) name output file, + (Write the converted picture to + .I filename + instead of to standard output. + )); +flatspec.output_filename = optarg ; +break ; + +#ifdef XCF2PNM +OPTION('a',--alpha,(filename) write transparency map, + (Output a transparency mask for the flattened image to + .I filename + as a + .BR pgm (5) + file, in addition to the ordinary output. + If the flattened image is completely opaque, this will produce an + error message and exit status 101; + use + .B \-A + to suppress this. + )); +flatspec.transmap_filename = optarg ; +break ; +#endif + +OPTION('b',--background,(color) select background color, + (Use this color for transparent pixels in the image. + The color can be given as + .B #rrggbb + or + .B #rgb + hexadecimal values, + or as an X11 color name + (which will only work if a color name database can be found + in one of a number of standard locations). + )); +{ + unsigned r,g,b ; + unsigned long hex ; + int met = 0 ; + if( *optarg == '#' ) + sscanf(optarg+1,"%lx%n",&hex,&met); + if( met == 3 && strlen(optarg) == 4 ) { + r = ((hex >> 8) & 0xF) * 0x11 ; + g = ((hex >> 4) & 0xF) * 0x11 ; + b = ((hex >> 0) & 0xF) * 0x11 ; + } else if( met == 6 && strlen(optarg) == 7 ) { + r = ((hex >> 16) & 0xFF) ; + g = ((hex >> 8) & 0xFF) ; + b = ((hex >> 0) & 0xFF) ; + } else if( strcasecmp(optarg,"black") == 0 ) + r = g = b = 0 ; + else if( strcasecmp(optarg,"white") == 0 ) + r = g = b = 255 ; + else { + const char *filenames[] = { "/etc/X11/rgb.txt", + "/usr/lib/X11/rgb.txt", + "/usr/share/X11/rgb.txt", + NULL }; + const char **fnp ; + r = (unsigned)-1 ; + int any = 0 ; + for( fnp = filenames; r == (unsigned)-1 && fnp && *fnp; fnp++ ) { + FILE *colortable = fopen(*fnp,"rt"); + if( colortable ) { + any = 1 ; + int clen ; + char colorbuf[80] ; + do { + if( !fgets(colorbuf,sizeof colorbuf,colortable) ) { + r = (unsigned)-1 ; + break ; + } + clen = strlen(colorbuf); + while( clen && isspace(colorbuf[clen-1]) ) + clen-- ; + colorbuf[clen] = '\0' ; + clen = 0 ; + sscanf(colorbuf," %u %u %u %n",&r,&g,&b,&clen); + } while( clen == 0 || strcasecmp(colorbuf+clen,optarg) != 0 ); + fclose(colortable) ; + } + } + if( !any ) { + fprintf(stderr,_("Could not find X11 color database\n")); + } + } + if( r == (unsigned)-1 ) + FatalGeneric(20,_("Unknown background color '%s'"),optarg); + flatspec.default_pixel = ((rgba)255 << ALPHA_SHIFT) + + ((rgba)r << RED_SHIFT) + + ((rgba)g << GREEN_SHIFT) + + ((rgba)b << BLUE_SHIFT); + break ; +} + +OPTION('A',--force-alpha,force alpha channel in output, + (Invent a trivial alpha channel even if the flattened image is + completely opaque. + )); +flatspec.default_pixel = FORCE_ALPHA_CHANNEL ; +break ; + +OPTION('c',--color --colour,select color output, + (Force the output to use RGB color space even if it there are + more compact alternatives. +#ifdef XCF2PNM + This will be selected automatically if the output file''s name + ends with + .BR .ppm . +#endif + )); +flatspec.out_color_mode = COLOR_RGB ; +break ; + +OPTION('g',--gray --grey,select grayscale output, + (Force the output to be a grayscale image even if it may be monochrome. + If any colored pixels are encountered, exit with status 103. + This will be selected automatically if the output file''s name + ends with + .BR .pgm . + )); +flatspec.out_color_mode = COLOR_GRAY ; +break ; + +#ifdef XCF2PNM +OPTION('m',--mono,select monochrome output, + (Force the output to be a monochrome image. + If any colors except black and white are encountered, exit with + status 103. + This will be selected automatically if the output file''s name + ends with + .BR .pbm . + )); +flatspec.out_color_mode = COLOR_MONO ; +break ; +#endif + +#ifdef XCF2PNM +OPTION('n',--pnm,select -c/-g/-m by image contents, + (Suppress the automatic choice of + .BR \-c , + .BR \-g , + or + .BR \-m + based on output filename, and instead select the output format + based on image contents. + This is the default if the filename is not recognized, and + when writing to stdout. + )); +flatspec.out_color_mode = COLOR_BY_CONTENTS ; +break ; +#endif + +OPTION('T',--truecolor,treat indexed images as RGB for flattening, + (Use standard RGB compositing for flattening indexed layers. + Without this option, + .B \*p + will mimic the Gimp''s current strategy of rounding each + alpha value to either full transparency or full opacity, + and interpret all layer modes as + .BR Normal . + )); +flatspec.gimpish_indexed = 0 ; +break ; + +OPTION('G',--for-gif,disallow partial transparency, + (Assert that the flattened image will have no partial transparency + (allowing a more compact representation of the alpha output). + Exit with status 102 if the flattened image has any partial + transparency. + If + .B \-b + is also given, this tests whether there there is partial + transparency before applying the background color. + )); +flatspec.partial_transparency_mode = FORBID_PARTIAL_TRANSPARENCY ; +break ; + +OPTION('D',--dissolve,dissolve partial transparency, + (Do a "dissolve" step to eliminate partial transparency after + flattening. + If + .B \-b + is also given, this happens before the background color is applied. + )); +flatspec.partial_transparency_mode = DISSOLVE_PARTIAL_TRANSPARENCY ; +break ; + +OPTION('f',--full-image,flatten to memory; then analyse, + (First flatten the entire image to a memory buffer before writing + output. Then analyse the image to decide on the details of the + output format (e.g., whether a grayscale output is sufficient). + Without this option, the program flattens only a singe row of "tiles" + (height 64) at a time. + )); +flatspec.process_in_memory = 1 ; +break ; + +OPTION('S',--size,(w"x"h) crop image while converting, + (Crop the converted image to width \fIw\fP and height \fIh\fP. + )); +{ + unsigned w,h ; + int n = 0 ; + sscanf(optarg,"%ux%u%n",&w,&h,&n) ; + if( n && n == strlen(optarg) ) { + if( flatspec.window_mode == AUTOCROP ) flatspec.window_mode = USE_CANVAS ; + flatspec.window_mode |= MANUAL_CROP ; + flatspec.dim.width = w ; + flatspec.dim.height = h ; + } else + FatalGeneric(20,_("-S option must have an argument of the form wxh")); + break ; +} + +OPTION('O',--offset,(x","y) translate converted part of image, + (Offset the converted part of the image from the top-left corner + of the XCF canvas. Usually used with + .BR \-S . + )); +{ + int x,y ; + int n = 0 ; + sscanf(optarg,"%d,%d%n",&x,&y,&n) ; + if( n && n == strlen(optarg) ) { + if( flatspec.window_mode == AUTOCROP ) flatspec.window_mode = USE_CANVAS ; + flatspec.window_mode |= MANUAL_OFFSET ; + flatspec.dim.c.l = x ; + flatspec.dim.c.t = y ; + } else + FatalGeneric(20,_("-O option must have an argument of the form x,y")); + break ; +} + +OPTION('C',--autocrop,autocrop to visible layer boundaries, + (Crop and offset the converted part of the image to just include + the boundaries of the visible (or selected) layers. + (Note that the + .I contents + of the layers is not taken into account when autocropping). + .IP + In the absence of options that specify otherwise, the converted + image will cover the entire XCF canvas. + )); +flatspec.window_mode = AUTOCROP ; +break ; + +#ifndef XCFVIEW +OPTIONGROUP(1il,Layer-selection options); +#endif + +OPTION(300,--mode,(mode) set layer mode, + (Set the layer mode (e.g., + .B Normal + or + .BR Multiply ). + )); +{ + GimpLayerModeEffects m ; + #ifdef ENABLE_NLS + for( m = 0; m < GimpLayerModeEffects_LAST; m++ ) + if( strcmp(optarg,_(showGimpLayerModeEffects(m))) == 0 ) + goto found_localized ; + #endif + + for( m = 0; strcmp(optarg,showGimpLayerModeEffects(m)) != 0 ; m++ ) { + if( m > GimpLayerModeEffects_LAST ) + FatalGeneric(20,_("Layer mode '%s' is unknown"),optarg); + } + found_localized: + lastlayerspec(&flatspec,"--mode")->mode = m ; + break ; +} + +OPTION(301,--percent,(n) set opacity in percent, + (Set the opacity on a scale from 0 to 100 + (as in the Gimp user interface). + )); +{ + unsigned pct ; + int n ; + sscanf(optarg,"%u%n",&pct,&n) ; + if( n != strlen(optarg) || pct > 100 ) + FatalGeneric(20,_("The argument to --percent is not a percentage")); + lastlayerspec(&flatspec,"--percent")->opacity = pct * 255 / 100 ; + break ; +} + +OPTION(302,--opacity,(n) set opacity in 1/255 units, + (Set the opacity on a scale from 0 to 255 (as used internally) + )); +{ + unsigned alpha ; + int n ; + sscanf(optarg,"%u%n",&alpha,&n) ; + if( n != strlen(optarg) || alpha > 255 ) + FatalGeneric(20,_("The argument to --opacity is not a number " + "between 0 and 255")); + lastlayerspec(&flatspec,"--percent")->opacity = alpha ; + break ; +} + +OPTION(303,--mask,enable layer mask, + (Enable the layer mask. + )); +lastlayerspec(&flatspec,"--mask")->hasMask = 1 ; +break ; + +OPTION(304,--nomask,disable layer mask, + (Disable the layer mask. + )); +lastlayerspec(&flatspec,"--nomask")->hasMask = 0 ; +break ; + +#endif /* XCF2FOO */ + +OPTIONGROUP(1i,) + +#if HAVE_ICONV +OPTION('u',--utf8,use UTF-8 for layer names, + (Use the raw UTF-8 representation from the XCF file to compare + and display layer names. + Ordinarily, layer names will be converted to the character set + of the current locale. + )); +use_utf8 = 1 ; +break ; +#endif |