diff --git a/ChangeLog b/ChangeLog index d5a4777b88..f73473d1e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Jan 27 14:55:00 CET 2000 Sven Neumann + + * plug-ins/print/*: updated to version 3.0.5 + Thu Jan 27 13:08:50 CET 2000 Sven Neumann * plug-ins/ifscompose/ifscompose.[ch]: use gimp_color_buttons diff --git a/plug-ins/print/README b/plug-ins/print/README index 9051e0e6bf..543592b511 100644 --- a/plug-ins/print/README +++ b/plug-ins/print/README @@ -1,4 +1,4 @@ -Print plugin for the Gimp. Version 3.0 by Robert Krawitz +Print plugin for the Gimp. Version 3.0.5 by Robert Krawitz based on version 2.0 by Michael Sweet . @@ -69,13 +69,11 @@ Some tips on tuning the output: * One group of settings you might want to start with is: - Brightness 110 - Gamma 1.3 - Contrast 80 - Green 94 - Blue 89 - Saturation 1.15 - Density 1.6 + Brightness 45 + Gamma 1.5 + Contrast 105 + Saturation 1.4 + Density 0.8 Makefile.standalone enables you to build this plugin as a standalone @@ -84,4 +82,4 @@ plugin, without reference to a Gimp source tree. Enjoy! --Robert Krawitz, November 14, 1999 +-Robert Krawitz, January 13, 2000 diff --git a/plug-ins/print/print-escp2.c b/plug-ins/print/print-escp2.c index 71ffc74e6d..a41b05c2f3 100644 --- a/plug-ins/print/print-escp2.c +++ b/plug-ins/print/print-escp2.c @@ -3,7 +3,7 @@ * * Print plug-in EPSON ESC/P2 driver for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -31,46 +31,38 @@ * Revision History: * * $Log$ - * Revision 1.12 1999/12/16 19:44:01 olofk - * Thu Dec 16 20:15:25 CET 1999 Olof S Kylande + * Revision 1.13 2000/01/26 16:00:47 neo + * updated print plug-in * - * Fix of KDE/Kwm selection add/sub/inter problem - * NOTE: This is a workaround, not a real fix. - * Many Thanks to Matthias Ettrich * - * * app/disp_callbacks.c + * --Sven * - * Updated unsharp-mask to version 0.10 + * Revision 1.39.2.1 2000/01/13 03:32:34 rlk + * silliness * - * * plug-ins/unsharp/dialog_f.c - * * plug-ins/unsharp/dialog_f.h - * * plug-ins/unsharp/dialog_i.c - * * plug-ins/unsharp/dialog_i.h - * * plug-ins/unsharp/unsharp.c + * Revision 1.39 2000/01/13 03:25:31 rlk + * bug fix from mainline * - * Updated print plug-in to version 3.0.1 + * Revision 1.38 2000/01/08 23:27:54 rlk + * Rearrange setup code; more printers to support softweave * - * * plug-ins/print/README (new file) - * * plug-ins/print/print-escp2.c - * * plug-ins/print/print-pcl.c - * * plug-ins/print/print-ps.c - * * plug-ins/print/print-util.c - * * plug-ins/print/print.c - * * plug-ins/print/print.h + * Revision 1.37 1999/12/19 14:36:18 rlk + * Make 'em big enough * - * Updated all files in the help/C/dialogs dir. This is - * a first alpha glimpse of the help system. Please give - * me feedback of the content. However since it's in alpha - * stage it means that there is spell, grammatical, etc errors. - * There is may also be pure errors which I hope "you" will - * report to either olof@gimp.org or karin@gimp.org. Please - * don't report spell, grammatical, etc error at this stage in dev. + * Revision 1.36 1999/12/18 23:08:28 rlk + * comments, mostly * - * If you have any plans to commit to the help system please write - * to olof@gimp.org. (This is mandatory not a please ;-). + * Revision 1.35 1999/12/11 15:26:27 rlk + * hopefully get borders right * - * * help/C/welcome.html - * * help/C/dialogs/about.html .............. + * Revision 1.34 1999/12/11 04:52:35 rlk + * bug fixes + * + * Revision 1.33 1999/12/11 04:25:23 rlk + * various other print modes + * + * Revision 1.32 1999/12/11 01:46:13 rlk + * Better weaving code -- not absolutely complete yet * * Revision 1.31 1999/12/05 22:10:53 rlk * minor, prep for release @@ -330,7 +322,8 @@ static void escp2_write(FILE *, unsigned char *, int, int, int, int, int, int, int); -static void initialize_weave(int jets, int separation, int horizontal); +static void initialize_weave(int jets, int separation, + int oversample, int horizontal); static void escp2_flush(int model, int width, int hoffset, int ydpi, int xdpi, FILE *prn); static void @@ -349,43 +342,50 @@ escp2_write_weave(FILE *, int, int, int, int, int, int, * Various classes of printer capabilities are represented by bitmasks. */ -typedef unsigned int model_cap_t; +typedef unsigned long long model_cap_t; typedef model_cap_t model_featureset_t; typedef model_cap_t model_class_t; -#define MODEL_PAPER_SIZE_MASK 0x3 -#define MODEL_PAPER_SMALL 0x0 -#define MODEL_PAPER_LARGE 0x1 -#define MODEL_PAPER_1200 0x2 +#define MODEL_PAPER_SIZE_MASK 0x300 +#define MODEL_PAPER_SMALL 0x000 +#define MODEL_PAPER_LARGE 0x100 +#define MODEL_PAPER_1200 0x200 -#define MODEL_IMAGEABLE_MASK 0xc -#define MODEL_IMAGEABLE_DEFAULT 0x0 -#define MODEL_IMAGEABLE_PHOTO 0x4 -#define MODEL_IMAGEABLE_600 0x8 +#define MODEL_IMAGEABLE_MASK 0xc00 +#define MODEL_IMAGEABLE_DEFAULT 0x000 +#define MODEL_IMAGEABLE_PHOTO 0x400 +#define MODEL_IMAGEABLE_600 0x800 -#define MODEL_INIT_MASK 0xf0 -#define MODEL_INIT_COLOR 0x00 -#define MODEL_INIT_PRO 0x10 -#define MODEL_INIT_1500 0x20 -#define MODEL_INIT_600 0x30 -#define MODEL_INIT_PHOTO 0x40 +#define MODEL_INIT_MASK 0xf000 +#define MODEL_INIT_COLOR 0x0000 +#define MODEL_INIT_PRO 0x1000 +#define MODEL_INIT_1500 0x2000 +#define MODEL_INIT_600 0x3000 +#define MODEL_INIT_PHOTO 0x4000 -#define MODEL_HASBLACK_MASK 0x100 -#define MODEL_HASBLACK_YES 0x000 -#define MODEL_HASBLACK_NO 0x100 +#define MODEL_HASBLACK_MASK 0x10000 +#define MODEL_HASBLACK_YES 0x00000 +#define MODEL_HASBLACK_NO 0x10000 -#define MODEL_6COLOR_MASK 0x200 -#define MODEL_6COLOR_NO 0x000 -#define MODEL_6COLOR_YES 0x200 +#define MODEL_6COLOR_MASK 0x20000 +#define MODEL_6COLOR_NO 0x00000 +#define MODEL_6COLOR_YES 0x20000 -#define MODEL_720DPI_MODE_MASK 0xc00 -#define MODEL_720DPI_DEFAULT 0x000 -#define MODEL_720DPI_600 0x400 -#define MODEL_720DPI_PHOTO 0x400 /* 0x800 for experimental stuff */ +#define MODEL_720DPI_MODE_MASK 0xc0000 +#define MODEL_720DPI_DEFAULT 0x00000 +#define MODEL_720DPI_600 0x40000 +#define MODEL_720DPI_PHOTO 0x40000 /* 0x80000 for experimental stuff */ -#define MODEL_1440DPI_MASK 0x1000 -#define MODEL_1440DPI_NO 0x0000 -#define MODEL_1440DPI_YES 0x1000 +#define MODEL_1440DPI_MASK 0x100000 +#define MODEL_1440DPI_NO 0x000000 +#define MODEL_1440DPI_YES 0x100000 + +#define MODEL_NOZZLES_MASK 0xff000000 +#define MODEL_MAKE_NOZZLES(x) ((long long) ((x)) << 24) +#define MODEL_GET_NOZZLES(x) (((x) & MODEL_NOZZLES_MASK) >> 24) +#define MODEL_SEPARATION_MASK 0xf00000000ll +#define MODEL_MAKE_SEPARATION(x) (((long long) (x)) << 32) +#define MODEL_GET_SEPARATION(x) (((x) & MODEL_SEPARATION_MASK) >> 32) /* * SUGGESTED SETTINGS FOR STYLUS PHOTO EX: @@ -413,44 +413,68 @@ typedef model_cap_t model_class_t; * The green and blue will vary somewhat with different inks */ + model_cap_t model_capabilities[] = { /* Stylus Color */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_COLOR | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)), /* Stylus Color Pro/Pro XL/400/500 */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_PRO | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)), /* Stylus Color 1500 */ (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_DEFAULT | MODEL_INIT_1500 | MODEL_HASBLACK_NO | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)), /* Stylus Color 600 */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600 | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_600 - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(1) | MODEL_MAKE_SEPARATION(1)), /* Stylus Color 800 */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_600 | MODEL_INIT_600 | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(64) | MODEL_MAKE_SEPARATION(8)), /* Stylus Color 1520/3000 */ (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_600 | MODEL_INIT_600 | MODEL_HASBLACK_YES | MODEL_6COLOR_NO | MODEL_720DPI_DEFAULT - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(64) | MODEL_MAKE_SEPARATION(8)), /* Stylus Photo 700 */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO - | MODEL_1440DPI_YES), + | MODEL_1440DPI_YES | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)), /* Stylus Photo EX */ (MODEL_PAPER_LARGE | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO - | MODEL_1440DPI_YES), + | MODEL_1440DPI_YES | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)), /* Stylus Photo */ (MODEL_PAPER_SMALL | MODEL_IMAGEABLE_PHOTO | MODEL_INIT_PHOTO | MODEL_HASBLACK_YES | MODEL_6COLOR_YES | MODEL_720DPI_PHOTO - | MODEL_1440DPI_NO), + | MODEL_1440DPI_NO | MODEL_MAKE_NOZZLES(32) | MODEL_MAKE_SEPARATION(8)), +}; + +typedef struct { + const char name[65]; + int hres; + int vres; + int softweave; + int horizontal_passes; + int vertical_passes; +} res_t; + +res_t reslist[] = { + { "360 DPI", 360, 360, 0, 1, 1 }, + { "720 DPI Microweave", 720, 720, 0, 1, 1 }, + { "720 DPI Softweave", 720, 720, 1, 1, 1 }, + { "720 DPI High Quality", 720, 720, 1, 1, 2 }, + { "720 DPI Highest Quality", 720, 720, 1, 1, 4 }, + { "1440 x 720 DPI Microweave", 1440, 720, 0, 1, 1 }, + { "1440 x 720 DPI Softweave", 1440, 720, 1, 2, 2 }, + { "1440 x 720 DPI Highest Quality", 1440, 720, 1, 2, 4 }, + { "1440 x 720 DPI Two-pass", 2880, 720, 1, 2, 4 }, + { "1440 x 720 DPI Two-pass Microweave", 2880, 720, 0, 1, 1 }, + { "", 0, 0, 0, 0, 0 } }; static int @@ -465,6 +489,18 @@ escp2_cap(int model, model_featureset_t featureset) return (model_capabilities[model] & featureset); } +static int +escp2_nozzles(int model) +{ + return MODEL_GET_NOZZLES(model_capabilities[model]); +} + +static int +escp2_nozzle_separation(int model) +{ + return MODEL_GET_SEPARATION(model_capabilities[model]); +} + /* * 'escp2_parameters()' - Return the parameter values for the given parameter. */ @@ -476,8 +512,7 @@ escp2_parameters(int model, /* I - Printer model */ int *count) /* O - Number of values */ { int i; - char **p, - **valptrs; + char **valptrs; static char *media_sizes[] = { ("Letter"), @@ -487,17 +522,6 @@ escp2_parameters(int model, /* I - Printer model */ ("A3"), ("12x18") }; - static char *resolutions[] = - { - ("360 DPI"), - ("720 DPI Microweave"), - ("720 DPI Softweave"), - ("1440 x 720 DPI"), - ("1440 x 720 DPI Microweave"), - ("1440 x 720 DPI Two-pass"), - ("1440 x 720 DPI Two-pass Microweave") - }; - if (count == NULL) return (NULL); @@ -514,28 +538,43 @@ escp2_parameters(int model, /* I - Printer model */ else *count = 3; - p = media_sizes; + valptrs = malloc(*count * sizeof(char *)); + for (i = 0; i < *count; i ++) + { + /* strdup doesn't appear to be POSIX... */ + valptrs[i] = malloc(strlen(media_sizes[i]) + 1); + strcpy(valptrs[i], media_sizes[i]); + } + return (valptrs); } else if (strcmp(name, "Resolution") == 0) { - if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES)) - *count = 7; - else - *count = 3; - p = resolutions; + res_t *res = &(reslist[0]); + valptrs = malloc(sizeof(char *) * sizeof(reslist) / sizeof(res_t)); + *count = 0; + while(res->hres) + { + if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES) || + (res->hres <= 720 && res->vres <= 720)) + { + int nozzles = escp2_nozzles(model); + int separation = escp2_nozzle_separation(model); + int max_weave = nozzles / separation; + if (! res->softweave || + (nozzles > 1 && res->vertical_passes <= max_weave)) + { + valptrs[*count] = malloc(strlen(res->name) + 1); + strcpy(valptrs[*count], res->name); + (*count)++; + } + } + res++; + } + return (valptrs); } else return (NULL); - valptrs = malloc(*count * sizeof(char *)); - for (i = 0; i < *count; i ++) - { - /* strdup doesn't appear to be POSIX... */ - valptrs[i] = malloc(strlen(p[i]) + 1); - strcpy(valptrs[i], p[i]); - } - - return (valptrs); } @@ -563,7 +602,7 @@ escp2_imageable_area(int model, /* I - Printer model */ *left = 9; *right = width - 9; *top = length; - *bottom = 49; + *bottom = 80; break; case MODEL_IMAGEABLE_600: @@ -642,6 +681,8 @@ escp2_print(int model, /* I - Model */ int nozzles = 1; int nozzle_separation = 1; int horizontal_passes = 1; + int vertical_passes = 1; + res_t *res; /* * Setup a read-only pixel region for the entire image... @@ -683,61 +724,22 @@ escp2_print(int model, /* I - Model */ /* * Figure out the output resolution... */ - - xdpi = ydpi = atoi(resolution); - if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES)) + for (res = &reslist[0];;res++) { - if (xdpi == 1440) + if (!strcmp(resolution, res->name)) { - use_softweave = 1; - ydpi = 720; - if (!strcmp(resolution, "1440 x 720 DPI Two-pass") || - !strcmp(resolution, "1440 x 720 DPI Two-pass Microweave")) - { - xdpi = 2880; - horizontal_passes = 4; - if (!strcmp(resolution, "1440 x 720 DPI Two-pass")) - { - nozzles = 32; - nozzle_separation = 8; - } - else - { - nozzles = 1; - nozzle_separation = 1; - } - } - else - { - horizontal_passes = 2; - if (!strcmp(resolution, "1440 x 720 DPI")) - { - nozzles = 32; - nozzle_separation = 8; - } - else - { - nozzles = 1; - nozzle_separation = 1; - } - } + use_softweave = res->softweave; + horizontal_passes = res->horizontal_passes; + vertical_passes = res->vertical_passes; + xdpi = res->hres; + ydpi = res->vres; + nozzles = escp2_nozzles(model); + nozzle_separation = escp2_nozzle_separation(model); + break; } - } - else if (ydpi == 1440) - { - ydpi = 720; - xdpi = 720; - } - if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES)) - { - if (!strcmp(resolution, "720 DPI Softweave") || xdpi > 720) + else if (!strcmp(resolution, "")) { - if (!strcmp(resolution, "720 DPI Softweave")) - { - nozzles = 32; - nozzle_separation = 8; - } - use_softweave = 1; + return; } } @@ -897,24 +899,27 @@ escp2_print(int model, /* I - Model */ break; } + if (use_softweave) + initialize_weave(nozzles, nozzle_separation, horizontal_passes, + vertical_passes); switch (escp2_cap(model, MODEL_INIT_MASK)) /* Printer specific initialization */ { case MODEL_INIT_COLOR : /* ESC */ - if (output_type == OUTPUT_COLOR && ydpi > 360) + if (output_type == OUTPUT_COLOR && ydpi > 360 && !use_softweave) fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave mode on */ break; case MODEL_INIT_PRO : /* ESC Pro, Pro XL, 400, 500 */ fwrite("\033(e\002\000\000\001", 7, 1, prn); /* Small dots */ - if (ydpi > 360) + if (ydpi > 360 && !use_softweave) fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave mode on */ break; case MODEL_INIT_1500 : /* ESC 1500 */ fwrite("\033(e\002\000\000\001", 7, 1, prn); /* Small dots */ - if (ydpi > 360) + if (ydpi > 360 && !use_softweave) fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave mode on */ break; @@ -926,43 +931,25 @@ escp2_print(int model, /* I - Model */ fwrite("\033(e\002\000\000\002", 7, 1, prn); /* Small dots */ - if (ydpi > 360) + if (ydpi > 360 && !use_softweave) fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave mode on */ break; case MODEL_INIT_PHOTO: - if (ydpi > 360) - { - if (use_softweave) - { - if (horizontal_passes > 1) - fwrite("\033U\000", 3, 1, prn); /* Unidirectional */ - else - fwrite("\033U\000", 3, 1, prn); /* Unidirectional */ - fwrite("\033(i\001\000\000", 6, 1, prn); /* Microweave off! */ - initialize_weave(nozzles, nozzle_separation, horizontal_passes); - fwrite("\033(e\002\000\000\004", 7, 1, prn); /* Microdots */ - } - else - { - fwrite("\033U\000", 3, 1, prn); /* Unidirectional */ - fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave on */ - fwrite("\033(e\002\000\000\004", 7, 1, prn); /* Microdots */ - } -#if 0 - fwrite("\033\0311", 3, 1, prn); /* ??? */ -#endif - } - else - fwrite("\033(e\002\000\000\003", 7, 1, prn); /* Whatever dots */ - break; - -#if 0 if (output_type == OUTPUT_GRAY) fwrite("\033(K\002\000\000\001", 7, 1, prn); /* Fast black printing */ else fwrite("\033(K\002\000\000\002", 7, 1, prn); /* Color printing */ -#endif + if (ydpi > 360) + { + fwrite("\033U\000", 3, 1, prn); /* Unidirectional */ + if (!use_softweave) + fwrite("\033(i\001\000\001", 6, 1, prn); /* Microweave on */ + fwrite("\033(e\002\000\000\004", 7, 1, prn); /* Microdots */ + } + else + fwrite("\033(e\002\000\000\003", 7, 1, prn); /* Whatever dots */ + break; } fwrite("\033(C\002\000", 5, 1, prn); /* Page length */ @@ -975,6 +962,8 @@ escp2_print(int model, /* I - Model */ putc(n & 255, prn); putc(n >> 8, prn); n = ydpi * (page_length - page_bottom) / 72; + if (use_softweave) + n += 320 * ydpi / 720; putc(n & 255, prn); putc(n >> 8, prn); @@ -1043,10 +1032,6 @@ escp2_print(int model, /* I - Model */ for (x = 0; x < out_height; x ++) { -#if 0 - printf("escp2_print: x = %d, line = %d, val = %d, mod = %d, height = %d\n", - x, errline, errval, errmod, out_height); -#endif if ((x & 255) == 0) Image_note_progress(image, x, out_height); @@ -1091,12 +1076,21 @@ escp2_print(int model, /* I - Model */ { dither_cmyk(out, x, image_height, out_width, cyan, 0, magenta, 0, yellow, 0, black, horizontal_passes); - - escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, left); - escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, left); - escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, left); - if (black != NULL) - escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left); + if (use_softweave) + escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi, + cyan, magenta, yellow, black, NULL, NULL); + else + { + escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, + left); + escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, + left); + escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, + left); + if (black != NULL) + escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, + left); + } } if (!use_softweave) @@ -1126,11 +1120,6 @@ escp2_print(int model, /* I - Model */ for (y = 0; y < out_height; y ++) { -#if 0 - printf("escp2_print: y = %d, line = %d, val = %d, mod = %d, height = %d, length = %d\n", - y, errline, errval, errmod, out_height, length); -#endif - if ((y & 255) == 0) Image_note_progress(image, y, out_height); @@ -1174,12 +1163,21 @@ escp2_print(int model, /* I - Model */ { dither_cmyk(out, y, image_width, out_width, cyan, 0, magenta, 0, yellow, 0, black, horizontal_passes); - - escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, left); - escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, left); - escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, left); - if (black != NULL) - escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, left); + if (use_softweave) + escp2_write_weave(prn, length, ydpi, model, out_width, left, xdpi, + cyan, magenta, yellow, black, NULL, NULL); + else + { + escp2_write(prn, cyan, length, 0, 2, ydpi, model, out_width, + left); + escp2_write(prn, magenta, length, 0, 1, ydpi, model, out_width, + left); + escp2_write(prn, yellow, length, 0, 4, ydpi, model, out_width, + left); + if (black != NULL) + escp2_write(prn, black, length, 0, 0, ydpi, model, out_width, + left); + } } if (!use_softweave) @@ -1324,7 +1322,7 @@ escp2_write(FILE *prn, /* I - Print file or command */ int width, /* I - Printed width */ int offset) /* I - Offset from left side */ { - unsigned char comp_buf[1536], /* Compression buffer */ + unsigned char comp_buf[3072], /* Compression buffer */ *comp_ptr; static int last_density = 0; /* Last density printed */ static int last_plane = 0; /* Last color plane printed */ @@ -1358,7 +1356,7 @@ escp2_write(FILE *prn, /* I - Print file or command */ fprintf(prn, "\033r%c", plane); } - if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES)) + if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES)) fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5, (offset * 1440 / ydpi) & 255, (offset * 1440 / ydpi) >> 8); else @@ -1465,6 +1463,19 @@ escp2_write(FILE *prn, /* I - Print file or command */ * lets me use all of the nozzles, except near the top and bottom of the * page. * + * This still produces some banding, though. Even better quality can be + * achieved by using multiple nozzles on the same line. How do we do this? + * In 1440x720 mode, we're printing two output lines at the same vertical + * position. However, if we want four passes, we have to effectively print + * each line twice. Actually doing this would increase the density, so + * what we do is print half the dots on each pass. This produces near-perfect + * output, and it's far faster than using "MicroWeave". + * + * The current algorithm is not completely general. The number of passes + * is limited to (nozzles / gap). On the Photo EX class printers, that limits + * it to 4 -- 32 nozzles, an inter-nozzle gap of 8 lines. Furthermore, there + * are a number of routines that are only coded up to 4 passes. + * * The routine initialize_weave calculates the basic parameters, given * the number of jets and separation between jets, in rows. * @@ -1555,6 +1566,10 @@ static int weavespan; /* How many rows total are bracketed by */ static int horizontal_weave; /* Number of horizontal passes required */ /* This is > 1 for some of the ultra-high */ /* resolution modes */ +static int vertical_subpasses; /* Number of passes per line (for better */ + /* quality) */ +static int vmod; /* Number of banks of passes */ +static int oversample; /* Excess precision per row */ /* * Mapping between color and linear index. The colors are @@ -1580,7 +1595,7 @@ get_color_by_params(int plane, int density) * Initialize the weave parameters */ static void -initialize_weave(int jets, int sep, int horizontal_passes) +initialize_weave(int jets, int sep, int osample, int v_subpasses) { int i; int k; @@ -1592,11 +1607,15 @@ initialize_weave(int jets, int sep, int horizontal_passes) else separation = sep; njets = jets; - if (horizontal_passes <= 0) - horizontal_passes = 1; - horizontal_weave = horizontal_passes; + if (v_subpasses <= 0) + v_subpasses = 1; + oversample = osample; + vertical_subpasses = v_subpasses; + njets /= vertical_subpasses; + vmod = separation * vertical_subpasses; + horizontal_weave = 1; - weavefactor = jets / separation; + weavefactor = njets / separation; jetsused = ((weavefactor) * separation); initialoffset = (jetsused - weavefactor - 1) * separation; jetsleftover = njets - jetsused + 1; @@ -1605,15 +1624,15 @@ initialize_weave(int jets, int sep, int horizontal_passes) last_pass_offset = 0; last_pass = -1; - linebufs = malloc(6 * 1536 * separation * jetsused * horizontal_passes); - lineoffsets = malloc(separation * sizeof(lineoff_t) * horizontal_passes); - linebases = malloc(separation * sizeof(linebufs_t) * horizontal_passes); - passes = malloc(separation * sizeof(pass_t)); - linecounts = malloc(separation * sizeof(int)); + linebufs = malloc(6 * 3072 * vmod * jets * horizontal_weave); + lineoffsets = malloc(vmod * sizeof(lineoff_t) * horizontal_weave); + linebases = malloc(vmod * sizeof(linebufs_t) * horizontal_weave); + passes = malloc(vmod * sizeof(pass_t)); + linecounts = malloc(vmod * sizeof(int)); bufbase = linebufs; - for (i = 0; i < separation; i++) + for (i = 0; i < vmod; i++) { int j; passes[i].pass = -1; @@ -1621,37 +1640,13 @@ initialize_weave(int jets, int sep, int horizontal_passes) { for (j = 0; j < 6; j++) { - linebases[i * horizontal_weave + k].v[j] = bufbase; - bufbase += 1536 * jetsused; + linebases[k * vmod + i].v[j] = bufbase; + bufbase += 3072 * jets; } } } } -static lineoff_t * -get_lineoffsets(int row) -{ - return &(lineoffsets[horizontal_weave * (row % separation)]); -} - -static int * -get_linecount(int row) -{ - return &(linecounts[row % separation]); -} - -static const linebufs_t * -get_linebases(int row) -{ - return &(linebases[horizontal_weave * (row % separation)]); -} - -static pass_t * -get_pass(int row_or_pass) -{ - return &(passes[row_or_pass % separation]); -} - /* * Compute the weave parameters for the given row. This computation is * rather complex, and I need to go back and write down very carefully @@ -1659,33 +1654,96 @@ get_pass(int row_or_pass) */ static void -weave_parameters_by_row(int row, weave_t *w) +weave_parameters_by_row(int row, int vertical_subpass, weave_t *w) { int passblockstart = (row + initialoffset) / jetsused; - int internaljetsused = jetsused; - int internallogicalpassstart; + int internaljetsused = jetsused * vertical_subpasses; + int subpass_adjustment; + w->row = row; w->pass = (passblockstart - (separation - 1)) + (separation + row - passblockstart - 1) % separation; - internallogicalpassstart = (w->pass * jetsused) - initialoffset + + subpass_adjustment = ((w->pass + 1) / separation) % vertical_subpasses; + subpass_adjustment = vertical_subpasses - subpass_adjustment - 1; + vertical_subpass = (vertical_subpass + subpass_adjustment) % vertical_subpasses; + w->pass += separation * vertical_subpass; + w->logicalpassstart = (w->pass * jetsused) - initialoffset + (w->pass % separation); - if (internallogicalpassstart < 0) - { - internaljetsused -= - (((separation - 1) - internallogicalpassstart) / separation); - internallogicalpassstart += separation * - (((separation - 1) - internallogicalpassstart) / separation); - } - w->logicalpassstart = internallogicalpassstart; w->jet = ((row - w->logicalpassstart) / separation); - if (internallogicalpassstart >= 0) - w->physpassstart = internallogicalpassstart; + w->jet += jetsused * (vertical_subpasses - 1); + w->logicalpassstart = w->row - (w->jet * separation); + if (w->logicalpassstart >= 0) + w->physpassstart = w->logicalpassstart; else - w->physpassstart = internallogicalpassstart + - (separation * ((separation - internallogicalpassstart) / separation)); + w->physpassstart = w->logicalpassstart + + (separation * ((separation - 1 - w->logicalpassstart) / separation)); w->physpassend = (internaljetsused - 1) * separation + - internallogicalpassstart; + w->logicalpassstart; w->missingstartrows = (w->physpassstart - w->logicalpassstart) / separation; + if (w->pass < 0) + { + w->logicalpassstart -= w->pass * separation; + w->physpassend -= w->pass * separation; + w->jet += w->pass; + w->missingstartrows += w->pass; + } + w->pass++; +} + +static lineoff_t * +get_lineoffsets(int row, int subpass) +{ + weave_t w; + weave_parameters_by_row(row, subpass, &w); + return &(lineoffsets[w.pass % vmod]); +} + +static int * +get_linecount(int row, int subpass) +{ + weave_t w; + weave_parameters_by_row(row, subpass, &w); + return &(linecounts[w.pass % vmod]); +} + +static const linebufs_t * +get_linebases(int row, int subpass) +{ + weave_t w; + weave_parameters_by_row(row, subpass, &w); + return &(linebases[w.pass % vmod]); +} + +static pass_t * +get_pass_by_row(int row, int subpass) +{ + weave_t w; + weave_parameters_by_row(row, subpass, &w); + return &(passes[w.pass % vmod]); +} + +static lineoff_t * +get_lineoffsets_by_pass(int pass) +{ + return &(lineoffsets[pass % vmod]); +} + +static int * +get_linecount_by_pass(int pass) +{ + return &(linecounts[pass % vmod]); +} + +static const linebufs_t * +get_linebases_by_pass(int pass) +{ + return &(linebases[pass % vmod]); +} + +static pass_t * +get_pass_by_pass(int pass) +{ + return &(passes[pass % vmod]); } /* @@ -1699,14 +1757,15 @@ weave_parameters_by_row(int row, weave_t *w) */ static void -fillin_start_rows(int row, int width, int missingstartrows) +fillin_start_rows(int row, int subpass, int width, int missingstartrows) { - lineoff_t *offsets = get_lineoffsets(row); - const linebufs_t *bufs = get_linebases(row); + lineoff_t *offsets = get_lineoffsets(row, subpass); + const linebufs_t *bufs = get_linebases(row, subpass); int i = 0; int k = 0; int j; int m; + width = (width + (oversample - 1)) / oversample; for (k = 0; k < missingstartrows; k++) { int bytes_to_fill = width; @@ -1761,24 +1820,28 @@ static void initialize_row(int row, int width) { weave_t w; - weave_parameters_by_row(row, &w); - if (w.physpassstart == row) + int i; + for (i = 0; i < vertical_subpasses; i++) { - lineoff_t *lineoffs = get_lineoffsets(row); - int *linecount = get_linecount(row); - int j, k; - pass_t *pass = get_pass(row); - pass->pass = w.pass; - pass->missingstartrows = w.missingstartrows; - pass->logicalpassstart = w.logicalpassstart; - pass->physpassstart = w.physpassstart; - pass->physpassend = w.physpassend; - for (k = 0; k < horizontal_weave; k++) - for (j = 0; j < 6; j++) - lineoffs[k].v[j] = 0; - *linecount = 0; - if (w.missingstartrows > 0) - fillin_start_rows(row, width, w.missingstartrows); + weave_parameters_by_row(row, i, &w); + if (w.physpassstart == row) + { + lineoff_t *lineoffs = get_lineoffsets(row, i); + int *linecount = get_linecount(row, i); + int j, k; + pass_t *pass = get_pass_by_row(row, i); + pass->pass = w.pass; + pass->missingstartrows = w.missingstartrows; + pass->logicalpassstart = w.logicalpassstart; + pass->physpassstart = w.physpassstart; + pass->physpassend = w.physpassend; + for (k = 0; k < horizontal_weave; k++) + for (j = 0; j < 6; j++) + lineoffs[k].v[j] = 0; + *linecount = 0; + if (w.missingstartrows > 0) + fillin_start_rows(row, i, width, w.missingstartrows); + } } } @@ -1793,22 +1856,16 @@ flush_pass(int passno, int model, int width, int hoffset, int ydpi, { int j; int k; - lineoff_t *lineoffs = get_lineoffsets(passno); - const linebufs_t *bufs = get_linebases(passno); - pass_t *pass = get_pass(passno); - int *linecount = get_linecount(passno); - int lwidth = (width + (horizontal_weave - 1)) / horizontal_weave; -#if 0 - fprintf(stderr, "Flushing pass %d start %d last %d\n", passno, pass->physpassstart, last_pass_offset); -#endif + lineoff_t *lineoffs = get_lineoffsets_by_pass(passno); + const linebufs_t *bufs = get_linebases_by_pass(passno); + pass_t *pass = get_pass_by_pass(passno); + int *linecount = get_linecount_by_pass(passno); + int lwidth = (width + (oversample - 1)) / oversample; if (pass->physpassstart > last_pass_offset) { int advance = pass->logicalpassstart - last_pass_offset; int alo = advance % 256; int ahi = advance / 256; -#if 0 - fprintf(stderr, " advancing %d lines\n", advance); -#endif fprintf(prn, "\033(v\002%c%c%c", 0, alo, ahi); last_pass_offset = pass->logicalpassstart; } @@ -1818,22 +1875,22 @@ flush_pass(int passno, int model, int width, int hoffset, int ydpi, { if (lineoffs[k].v[j] == 0) continue; - if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES)) - { - fprintf(prn, "\033(r\002%c%c%c", 0, densities[j], colors[j]); - /* FIXME need a more general way of specifying column */ - /* separation */ - fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5, - ((hoffset * 1440 / ydpi) + - (k & (horizontal_weave >> 1))) & 255, - ((hoffset * 1440 / ydpi) + - (k & (horizontal_weave >> 1))) >> 8); - } + if (escp2_has_cap(model, MODEL_6COLOR_MASK, MODEL_6COLOR_YES)) + fprintf(prn, "\033(r\002%c%c%c", 0, densities[j], colors[j]); else if (densities[j] > 0) continue; + else + fprintf(prn, "\033r%c", colors[j]); + if (escp2_has_cap(model, MODEL_1440DPI_MASK, MODEL_1440DPI_YES)) + { + /* FIXME need a more general way of specifying column */ + /* separation */ + fprintf(prn, "\033(\\%c%c%c%c%c%c", 4, 0, 160, 5, + ((hoffset * 1440 / ydpi) + (k & oversample)) & 255, + ((hoffset * 1440 / ydpi) + (k & oversample)) >> 8); + } else { - fprintf(prn, "\033r%c", colors[j]); fprintf(prn, "\033\\%c%c", hoffset & 255, hoffset >> 8); } switch (ydpi) /* Raster graphics header */ @@ -1859,11 +1916,6 @@ flush_pass(int passno, int model, int width, int hoffset, int ydpi, putc(lwidth & 255, prn); /* Width of raster line in pixels */ putc(lwidth >> 8, prn); fwrite(bufs[k].v[j], lineoffs[k].v[j], 1, prn); -#if 0 - fprintf(stderr, "Sending %d bytes, plane %d, density %d, lines %d, x %d\n", - lineoffs[k].v[j], colors[j], densities[j], - *linecount + pass->missingstartrows, k); -#endif putc('\r', prn); } fwrite("\033\006", 2, 1, prn); @@ -1874,30 +1926,33 @@ flush_pass(int passno, int model, int width, int hoffset, int ydpi, static void add_to_row(int row, unsigned char *buf, size_t nbytes, int plane, int density, - int horizontal) + int subpass) { weave_t w; int color = get_color_by_params(plane, density); - lineoff_t *lineoffs = get_lineoffsets(row); - const linebufs_t *bufs = get_linebases(row); - weave_parameters_by_row(row, &w); - memcpy(bufs[horizontal].v[color] + lineoffs[horizontal].v[color], - buf, nbytes); - lineoffs[horizontal].v[color] += nbytes; + lineoff_t *lineoffs = get_lineoffsets(row, subpass); + const linebufs_t *bufs = get_linebases(row, subpass); + weave_parameters_by_row(row, subpass, &w); + memcpy(bufs[0].v[color] + lineoffs[0].v[color], buf, nbytes); + lineoffs[0].v[color] += nbytes; } static void finalize_row(int row, int model, int width, int hoffset, int ydpi, int xdpi, FILE *prn) { - weave_t w; - int *lines = get_linecount(row); - weave_parameters_by_row(row, &w); - (*lines)++; - if (w.physpassend == row) + int i; + for (i = 0; i < vertical_subpasses; i++) { - pass_t *pass = get_pass(row); - flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn); + weave_t w; + int *lines = get_linecount(row, i); + weave_parameters_by_row(row, i, &w); + (*lines)++; + if (w.physpassend == row) + { + pass_t *pass = get_pass_by_row(row, i); + flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn); + } } } @@ -1906,13 +1961,48 @@ escp2_flush(int model, int width, int hoffset, int ydpi, int xdpi, FILE *prn) { while (1) { - pass_t *pass = get_pass(last_pass + 1); + pass_t *pass = get_pass_by_pass(last_pass + 1); if (pass->pass < 0) return; flush_pass(pass->pass, model, width, hoffset, ydpi, xdpi, prn); } } +static void +escp2_split_2(int length, + const unsigned char *in, + unsigned char *outlo, + unsigned char *outhi) +{ + int i; + for (i = 0; i < length; i++) + { + unsigned char inbyte = in[i]; + outlo[i] = inbyte & 0x55; + outhi[i] = inbyte & 0xaa; + } +} + +static void +escp2_split_4(int length, + const unsigned char *in, + unsigned char *out0, + unsigned char *out1, + unsigned char *out2, + unsigned char *out3) +{ + int i; + for (i = 0; i < length; i++) + { + unsigned char inbyte = in[i]; + out0[i] = inbyte & 0x11; + out1[i] = inbyte & 0x22; + out2[i] = inbyte & 0x44; + out3[i] = inbyte & 0x88; + } +} + + static void escp2_unpack_2(int length, const unsigned char *in, @@ -2050,154 +2140,70 @@ escp2_write_weave(FILE *prn, /* I - Print file or command */ unsigned char *M) { static int lineno = 0; - static unsigned char s[4][1536]; - static unsigned char comp_buf[1536]; + static unsigned char s[4][3072]; + static unsigned char comp_buf[3072]; unsigned char *comp_ptr; - int i; + int i, j; + unsigned char *cols[6]; + cols[0] = k; + cols[1] = m; + cols[2] = c; + cols[3] = y; + cols[4] = M; + cols[5] = C; initialize_row(lineno, width); - if (c) + for (j = 0; j < 6; j++) { - if (horizontal_weave > 1) + if (cols[j]) { - if (horizontal_weave == 2) - escp2_unpack_2(length, c, s[0], s[1]); - else - escp2_unpack_4(length, c, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) + if (vertical_subpasses > 1) { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 0, i); + switch (oversample) + { + case 2: + escp2_unpack_2(length, cols[j], s[0], s[1]); + break; + case 4: + escp2_unpack_4(length, cols[j], s[0], s[1], s[2], s[3]); + break; + } + switch (vertical_subpasses / oversample) + { + case 4: + escp2_split_4(length, cols[j], s[0], s[1], s[2], s[3]); + break; + case 2: + if (oversample == 1) + { + escp2_split_2(length, cols[j], s[0], s[1]); + } + else + { + escp2_split_2(length, s[1], s[1], s[3]); + escp2_split_2(length, s[0], s[0], s[2]); + } + break; + } + for (i = 0; i < vertical_subpasses; i++) + { + escp2_pack(s[i], ((length + oversample - 1) / oversample), + comp_buf, &comp_ptr); + add_to_row(lineno, comp_buf, comp_ptr - comp_buf, + colors[j], densities[j], i); + } + } + else + { + escp2_pack(cols[j], length, comp_buf, &comp_ptr); + add_to_row(lineno, comp_buf, comp_ptr - comp_buf, + colors[j], densities[j], 0); } } - else - { - escp2_pack(c, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 0, 0); - } } - - if (m) - { - if (horizontal_weave > 1) - { - if (horizontal_weave == 2) - escp2_unpack_2(length, m, s[0], s[1]); - else - escp2_unpack_4(length, m, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) - { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 0, i); - } - } - else - { - escp2_pack(m, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 0, 0); - } - } - - if (y) - { - if (horizontal_weave > 1) - { - if (horizontal_weave == 2) - escp2_unpack_2(length, y, s[0], s[1]); - else - escp2_unpack_4(length, y, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) - { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 4, 0, i); - } - } - else - { - escp2_pack(y, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 4, 0, 0); - } - } - - if (k) - { - if (horizontal_weave > 1) - { - if (horizontal_weave == 2) - escp2_unpack_2(length, k, s[0], s[1]); - else - escp2_unpack_4(length, k, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) - { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 0, 0, i); - } - } - else - { - escp2_pack(k, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 0, 0, 0); - } - } - - if (C) - { - if (horizontal_weave > 1) - { - if (horizontal_weave == 2) - escp2_unpack_2(length, C, s[0], s[1]); - else - escp2_unpack_4(length, C, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) - { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 1, i); - } - } - else - { - escp2_pack(C, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 2, 1, 0); - } - } - - if (M) - { - if (horizontal_weave > 1) - { - if (horizontal_weave == 2) - escp2_unpack_2(length, M, s[0], s[1]); - else - escp2_unpack_4(length, M, s[0], s[1], s[2], s[3]); - for (i = 0; i < horizontal_weave; i++) - { - escp2_pack(s[i], - (length + horizontal_weave - 1) / horizontal_weave, - comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 1, i); - } - } - else - { - escp2_pack(M, length, comp_buf, &comp_ptr); - add_to_row(lineno, comp_buf, comp_ptr - comp_buf, 1, 1, 0); - } - } - finalize_row(lineno, model, width, offset, ydpi, xdpi, prn); lineno++; - } /* diff --git a/plug-ins/print/print-pcl.c b/plug-ins/print/print-pcl.c index b453f567c6..b59937f383 100644 --- a/plug-ins/print/print-pcl.c +++ b/plug-ins/print/print-pcl.c @@ -3,7 +3,7 @@ * * Print plug-in HP PCL driver for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -32,46 +32,14 @@ * Revision History: * * $Log$ - * Revision 1.12 1999/12/16 19:44:01 olofk - * Thu Dec 16 20:15:25 CET 1999 Olof S Kylande + * Revision 1.13 2000/01/26 16:00:48 neo + * updated print plug-in * - * Fix of KDE/Kwm selection add/sub/inter problem - * NOTE: This is a workaround, not a real fix. - * Many Thanks to Matthias Ettrich * - * * app/disp_callbacks.c + * --Sven * - * Updated unsharp-mask to version 0.10 - * - * * plug-ins/unsharp/dialog_f.c - * * plug-ins/unsharp/dialog_f.h - * * plug-ins/unsharp/dialog_i.c - * * plug-ins/unsharp/dialog_i.h - * * plug-ins/unsharp/unsharp.c - * - * Updated print plug-in to version 3.0.1 - * - * * plug-ins/print/README (new file) - * * plug-ins/print/print-escp2.c - * * plug-ins/print/print-pcl.c - * * plug-ins/print/print-ps.c - * * plug-ins/print/print-util.c - * * plug-ins/print/print.c - * * plug-ins/print/print.h - * - * Updated all files in the help/C/dialogs dir. This is - * a first alpha glimpse of the help system. Please give - * me feedback of the content. However since it's in alpha - * stage it means that there is spell, grammatical, etc errors. - * There is may also be pure errors which I hope "you" will - * report to either olof@gimp.org or karin@gimp.org. Please - * don't report spell, grammatical, etc error at this stage in dev. - * - * If you have any plans to commit to the help system please write - * to olof@gimp.org. (This is mandatory not a please ;-). - * - * * help/C/welcome.html - * * help/C/dialogs/about.html .............. + * Revision 1.14 2000/01/08 23:30:56 rlk + * Y2K copyright * * Revision 1.13 1999/11/23 02:11:37 rlk * Rationalize variables, pass 3 diff --git a/plug-ins/print/print-ps.c b/plug-ins/print/print-ps.c index 8fccf592ee..ccc555d078 100644 --- a/plug-ins/print/print-ps.c +++ b/plug-ins/print/print-ps.c @@ -3,7 +3,7 @@ * * Print plug-in Adobe PostScript driver for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -33,49 +33,17 @@ * Revision History: * * $Log$ - * Revision 1.16 1999/12/19 20:28:15 asbjoer - * use g_strcasecmp() + * Revision 1.17 2000/01/26 16:00:48 neo + * updated print plug-in * - * Revision 1.15 1999/12/16 19:44:01 olofk - * Thu Dec 16 20:15:25 CET 1999 Olof S Kylande * - * Fix of KDE/Kwm selection add/sub/inter problem - * NOTE: This is a workaround, not a real fix. - * Many Thanks to Matthias Ettrich + * --Sven * - * * app/disp_callbacks.c + * Revision 1.12 2000/01/08 23:30:56 rlk + * Y2K copyright * - * Updated unsharp-mask to version 0.10 - * - * * plug-ins/unsharp/dialog_f.c - * * plug-ins/unsharp/dialog_f.h - * * plug-ins/unsharp/dialog_i.c - * * plug-ins/unsharp/dialog_i.h - * * plug-ins/unsharp/unsharp.c - * - * Updated print plug-in to version 3.0.1 - * - * * plug-ins/print/README (new file) - * * plug-ins/print/print-escp2.c - * * plug-ins/print/print-pcl.c - * * plug-ins/print/print-ps.c - * * plug-ins/print/print-util.c - * * plug-ins/print/print.c - * * plug-ins/print/print.h - * - * Updated all files in the help/C/dialogs dir. This is - * a first alpha glimpse of the help system. Please give - * me feedback of the content. However since it's in alpha - * stage it means that there is spell, grammatical, etc errors. - * There is may also be pure errors which I hope "you" will - * report to either olof@gimp.org or karin@gimp.org. Please - * don't report spell, grammatical, etc error at this stage in dev. - * - * If you have any plans to commit to the help system please write - * to olof@gimp.org. (This is mandatory not a please ;-). - * - * * help/C/welcome.html - * * help/C/dialogs/about.html .............. + * Revision 1.11 2000/01/03 13:25:13 rlk + * Fix from Salvador Pinto Abreu * * Revision 1.10 1999/11/23 02:11:37 rlk * Rationalize variables, pass 3 @@ -477,10 +445,10 @@ ps_parameters(int model, /* I - Printer model */ if (sscanf(line, "*%s %[^/:]", lname, loption) != 2) continue; - if (g_strcasecmp(lname, name) == 0) + if (strcasecmp(lname, name) == 0) { - valptrs[(*count)] = malloc(strlen(media_sizes[*count]) + 1); - strcpy(valptrs[(*count)], media_sizes[*count]); + valptrs[(*count)] = malloc(strlen(loption) + 1); + strcpy(valptrs[(*count)], loption); (*count) ++; } } @@ -1156,7 +1124,7 @@ ppd_find(char *ppd_file, /* I - Name of PPD file */ if (line[0] != '*') continue; - if (g_strncasecmp(line, "*OrderDependency:", 17) == 0 && order != NULL) + if (strncasecmp(line, "*OrderDependency:", 17) == 0 && order != NULL) { sscanf(line, "%*s%d", order); continue; @@ -1164,8 +1132,8 @@ ppd_find(char *ppd_file, /* I - Name of PPD file */ else if (sscanf(line, "*%s %[^/:]", lname, loption) != 2) continue; - if (g_strcasecmp(lname, name) == 0 && - g_strcasecmp(loption, option) == 0) + if (strcasecmp(lname, name) == 0 && + strcasecmp(loption, option) == 0) { opt = strchr(line, ':') + 1; while (*opt == ' ' || *opt == '\t') diff --git a/plug-ins/print/print-util.c b/plug-ins/print/print-util.c index 933edd7ee1..99df2e7c16 100644 --- a/plug-ins/print/print-util.c +++ b/plug-ins/print/print-util.c @@ -3,7 +3,7 @@ * * Print plug-in driver utility functions for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -38,46 +38,52 @@ * Revision History: * * $Log$ - * Revision 1.11 1999/12/16 19:44:01 olofk - * Thu Dec 16 20:15:25 CET 1999 Olof S Kylande + * Revision 1.12 2000/01/26 16:00:48 neo + * updated print plug-in * - * Fix of KDE/Kwm selection add/sub/inter problem - * NOTE: This is a workaround, not a real fix. - * Many Thanks to Matthias Ettrich * - * * app/disp_callbacks.c + * --Sven * - * Updated unsharp-mask to version 0.10 + * Revision 1.49.2.1 2000/01/13 23:41:29 rlk + * Deal with null black pointer * - * * plug-ins/unsharp/dialog_f.c - * * plug-ins/unsharp/dialog_f.h - * * plug-ins/unsharp/dialog_i.c - * * plug-ins/unsharp/dialog_i.h - * * plug-ins/unsharp/unsharp.c + * Revision 1.49 2000/01/08 23:30:37 rlk + * Some tweaking * - * Updated print plug-in to version 3.0.1 + * Revision 1.48 1999/12/30 23:58:07 rlk + * Silly little bug... * - * * plug-ins/print/README (new file) - * * plug-ins/print/print-escp2.c - * * plug-ins/print/print-pcl.c - * * plug-ins/print/print-ps.c - * * plug-ins/print/print-util.c - * * plug-ins/print/print.c - * * plug-ins/print/print.h + * Revision 1.47 1999/12/26 19:02:46 rlk + * Performance stuff * - * Updated all files in the help/C/dialogs dir. This is - * a first alpha glimpse of the help system. Please give - * me feedback of the content. However since it's in alpha - * stage it means that there is spell, grammatical, etc errors. - * There is may also be pure errors which I hope "you" will - * report to either olof@gimp.org or karin@gimp.org. Please - * don't report spell, grammatical, etc error at this stage in dev. + * Revision 1.46 1999/12/25 17:47:17 rlk + * Cleanup * - * If you have any plans to commit to the help system please write - * to olof@gimp.org. (This is mandatory not a please ;-). + * Revision 1.45 1999/12/25 00:41:01 rlk + * some minor improvement * - * * help/C/welcome.html - * * help/C/dialogs/about.html .............. + * Revision 1.44 1999/12/24 12:57:38 rlk + * Reduce grain; improve red + * + * Revision 1.43 1999/12/22 03:24:34 rlk + * round length up, not down + * + * Revision 1.42 1999/12/22 03:12:17 rlk + * More constant fiddling + * + * Revision 1.41 1999/12/22 01:34:28 rlk + * Reverse direction each pass + * + * Revision 1.40 1999/12/18 23:45:07 rlk + * typo + * + * Revision 1.39 1999/12/12 20:49:01 rlk + * Various changes + * + * Revision 1.38 1999/12/11 23:12:06 rlk + * Better matching between cmy/k + * + * Smoother dither! * * Revision 1.37 1999/12/05 23:24:08 rlk * don't want PRINT_LUT in release @@ -335,7 +341,7 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */ xstep = src_width / dst_width; xmod = src_width % dst_width; - length = (dst_width) / 8; + length = (dst_width + 7) / 8; kerror0 = error[row & 1][3]; kerror1 = error[1 - (row & 1)][3]; @@ -411,27 +417,36 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */ */ #define NU_C 1 -#define DE_C 3 +#define DE_C 1 #define NU_M 1 -#define DE_M 3 +#define DE_M 1 #define NU_Y 1 -#define DE_Y 3 +#define DE_Y 1 #define I_RATIO_C NU_C / DE_C #define I_RATIO_C1 NU_C / (DE_C + NU_C) #define RATIO_C DE_C / NU_C #define RATIO_C1 (DE_C + NU_C) / NU_C +const static int C_CONST_0 = 65536 * I_RATIO_C1; +const static int C_CONST_1 = 65536 * I_RATIO_C1; + #define I_RATIO_M NU_M / DE_M #define I_RATIO_M1 NU_M / (DE_M + NU_M) #define RATIO_M DE_M / NU_M #define RATIO_M1 (DE_M + NU_M) / NU_M +const static int M_CONST_0 = 65536 * I_RATIO_M1; +const static int M_CONST_1 = 65536 * I_RATIO_M1; + #define I_RATIO_Y NU_Y / DE_Y #define I_RATIO_Y1 NU_Y / (DE_Y + NU_Y) #define RATIO_Y DE_Y / NU_Y #define RATIO_Y1 (DE_Y + NU_Y) / NU_Y +const static int Y_CONST_0 = 65536 * I_RATIO_Y1; +const static int Y_CONST_1 = 65536 * I_RATIO_Y1; + /* * Lower and upper bounds for mixing CMY with K to produce gray scale. * Reducing KDARKNESS_LOWER results in more black being used with relatively @@ -439,8 +454,8 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */ * in more CMY being used in dark tones, which results in less pure black. * Decreasing the gap too much results in sharp crossover and stairstepping. */ -#define KDARKNESS_LOWER (32 * 256) -#define KDARKNESS_UPPER (96 * 256) +#define KDARKNESS_LOWER (12 * 256) +#define KDARKNESS_UPPER (128 * 256) /* * Randomizing values for deciding when to output a bit. Normally with the @@ -450,10 +465,10 @@ dither_black(unsigned short *gray, /* I - Grayscale pixels */ * result in greater randomizing. We use less randomness for black output * to avoid production of black speckles in light regions. */ -#define C_RANDOMIZER 2 -#define M_RANDOMIZER 2 -#define Y_RANDOMIZER 2 -#define K_RANDOMIZER 8 +#define C_RANDOMIZER 0 +#define M_RANDOMIZER 0 +#define Y_RANDOMIZER 0 +#define K_RANDOMIZER 4 #ifdef PRINT_DEBUG #define UPDATE_COLOR_DBG(r) \ @@ -482,22 +497,11 @@ do { \ I_RATIO_##R##1); \ } while (0) -#define PRINT_D3(r, R, d1, d2) \ +#define PRINT_D3(n, r, R, d1, d2) \ do { \ - fprintf(dbg, "Case 2: o" #r " %lld " #r \ + fprintf(dbg, "Case %d: o" #r " %lld " #r \ " %lld ditherbit" #d1 " %d ditherbit" #d2 " %d " \ - "num %lld den %lld test1 %lld test2 %lld\n", \ - o##r, r, ditherbit##d1, ditherbit##d2, \ - o##r, 65536ll, \ - ((32767 + (((long long) ditherbit##d2 / 1) - 32768)) * o##r / \ - 65536), cutoff); \ -} while (0) - -#define PRINT_D4(r, R, d1, d2) \ -do { \ - fprintf(dbg, "Case 3: o" #r " %lld " #r \ - " %lld ditherbit" #d1 " %d ditherbit" #d2 " %d " \ - "num %lld den %lld test1 %lld test2 %lld\n", \ + "num %lld den %lld test1 %lld test2 %lld\n", n, \ o##r, r, ditherbit##d1, ditherbit##d2, \ o##r, 65536ll, \ ((32767 + (((long long) ditherbit##d2 / 1) - 32768)) * o##r / \ @@ -509,8 +513,7 @@ do { \ #define UPDATE_COLOR_DBG(r) do {} while (0) #define PRINT_D1(r, R, d1, d2) do {} while (0) #define PRINT_D2(r, R, d1, d2) do {} while (0) -#define PRINT_D3(r, R, d1, d2) do {} while (0) -#define PRINT_D4(r, R, d1, d2) do {} while (0) +#define PRINT_D3(n, r, R, d1, d2) do {} while (0) #endif @@ -521,103 +524,107 @@ do { \ UPDATE_COLOR_DBG(r); \ } while (0) -#define PRINT_COLOR(color, r, R, d1, d2) \ -do { \ - if (!l##color) \ - { \ - if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) - \ - (32768 / R##_RANDOMIZER)))) \ - { \ - PRINT_D1(r, R, d1, d2); \ - if (r##bits++ % horizontal_overdensity == 0) \ - if (! (*kptr & bit)) \ - *r##ptr |= bit; \ - r -= 65535; \ - } \ - } \ - else \ - { \ - if (r <= (65536 * I_RATIO_##R##1 * 2 / 3)) \ - { \ - if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) - \ - (32768 / R##_RANDOMIZER))) * I_RATIO_##R##1) \ - { \ - PRINT_D2(r, R, d1, d2); \ - if (l##r##bits++ % horizontal_overdensity == 0) \ - if (! (*kptr & bit)) \ - *l##r##ptr |= bit; \ - r -= 65535 * I_RATIO_##R##1; \ - } \ - } \ - else if (r > (32767 + (((long long) ditherbit##d2 / R##_RANDOMIZER) - \ - (32768 / R##_RANDOMIZER))) * I_RATIO_##R##1) \ - { \ - int cutoff = ((density - (65536 * I_RATIO_##R##1 * 2 / 3)) * \ - 65536 / (65536 - (65536 * I_RATIO_##R##1 * 2 / 3))); \ - long long sub = (65535ll * I_RATIO_##R##1) + \ - ((65535ll - (65535ll * I_RATIO_##R##1)) * cutoff / 65536); \ - if (ditherbit##d1 > cutoff) \ - { \ - PRINT_D3(r, R, d1, d2); \ - if (l##r##bits++ % horizontal_overdensity == 0) \ - if (! (*kptr & bit)) \ - *l##r##ptr |= bit; \ - } \ - else \ - { \ - PRINT_D4(r, R, d1, d2); \ - if (r##bits++ % horizontal_overdensity == 0) \ - if (! (*kptr & bit)) \ - *r##ptr |= bit; \ - } \ - if (sub < (65535 * I_RATIO_##R##1)) \ - r -= (65535 * I_RATIO_##R##1); \ - else if (sub > 65535) \ - r -= 65535; \ - else \ - r -= sub; \ - } \ - } \ +#define DO_PRINT_COLOR(color) \ +do { \ + if (color##bits++ == horizontal_overdensity) \ + { \ + *color##ptr |= bit; \ + color##bits = 1; \ + } \ +} while(0) + +#define PRINT_COLOR(color, r, R, d1, d2) \ +do { \ + int comp0 = (32767 + ((ditherbit##d2 >> R##_RANDOMIZER) - \ + (32768 >> R##_RANDOMIZER))); \ + if (!l##color) \ + { \ + if (r > comp0) \ + { \ + PRINT_D1(r, R, d1, d2); \ + DO_PRINT_COLOR(r); \ + r -= 65535; \ + } \ + } \ + else \ + { \ + int compare = comp0 * I_RATIO_##R##1; \ + if (r <= (R##_CONST_1)) \ + { \ + if (r > compare) \ + { \ + PRINT_D2(r, R, d1, d2); \ + DO_PRINT_COLOR(l##r); \ + r -= R##_CONST_0; \ + } \ + } \ + else if (r > compare) \ + { \ + int cutoff = ((density - R##_CONST_1) * 65536 / \ + (65536 - R##_CONST_1)); \ + long long sub; \ + if (cutoff >= 0) \ + sub = R##_CONST_0 + (((65535ll - R##_CONST_0) * cutoff) >> 16); \ + else \ + sub = R##_CONST_0 + ((65535ll - R##_CONST_0) * cutoff / 65536); \ + if (ditherbit##d1 > cutoff) \ + { \ + PRINT_D3(3, r, R, d1, d2); \ + DO_PRINT_COLOR(l##r); \ + } \ + else \ + { \ + PRINT_D3(4, r, R, d1, d2); \ + DO_PRINT_COLOR(r); \ + } \ + if (sub < R##_CONST_0) \ + r -= R##_CONST_0; \ + else if (sub > 65535) \ + r -= 65535; \ + else \ + r -= sub; \ + } \ + } \ } while (0) #if 1 -#define UPDATE_DITHER(r, d2, x, width) \ -do { \ - if (ditherbit##d2 & bit) \ - { \ - if (x > 0) \ - r##error1[-1] += r; \ - else \ - r##error1[0] = r; \ - r##error1[0] += 3 * r; \ - r##error1[1] = r; \ - dither##r = r##error0[1] + 3 * r; \ - } \ - else \ - { \ - if (x > 0) \ - r##error1[-1] += r * 3 / 4; \ - else \ - r##error1[0] = r * 3 / 4; \ - r##error1[0] += r * 3 / 2; \ - r##error1[1] = r * 3 / 4; \ - dither##r = r##error0[1] + 5 * r; \ - } \ -} while (0) +#define UPDATE_DITHER(r, d2, x, width) \ +do { \ + int offset = (15 - (((o##r & 0xf000) >> 12)) * horizontal_overdensity) \ + >> 1; \ + if (x < offset) \ + offset = x; \ + else if (x > dst_width - offset - 1) \ + offset = dst_width - x - 1; \ + if (ditherbit##d2 & bit) \ + { \ + r##error1[-offset] += r; \ + r##error1[0] += 3 * r; \ + r##error1[offset] += r; \ + dither##r = r##error0[direction] + 3 * r; \ + } \ + else \ + { \ + r##error1[-offset] += r; \ + r##error1[0] += r; \ + r##error1[offset] += r; \ + dither##r = r##error0[direction] + 5 * r; \ + } \ +} while (0) #else -#define UPDATE_DITHER(r, d2, x, width) \ -do { \ - if (ditherbit##d2 & bit) \ - { \ - r##error1[0] = 5 * r; \ - dither##r = r##error0[1] + 3 * r; \ - } \ - else \ - { \ - r##error1[0] = 3 * r; \ - dither##r = r##error0[1] + 5 * r; \ - } \ -} while (0) +#define UPDATE_DITHER(r, d2, x, width) \ +do { \ + if (ditherbit##d2 & bit) \ + { \ + r##error1[0] = 5 * r; \ + dither##r = r##error0[direction] + 3 * r; \ + } \ + else \ + { \ + r##error1[0] = 3 * r; \ + dither##r = r##error0[direction] + 5 * r; \ + } \ +} while (0) #endif void @@ -678,19 +685,44 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ * at zero each line to avoid having a line of bits near the edge of the * image. */ - static int cbits = 0; - static int mbits = 0; - static int ybits = 0; - static int kbits = 0; - static int lcbits = 0; - static int lmbits = 0; - static int lybits = 0; + static int cbits = 1; + static int mbits = 1; + static int ybits = 1; + static int kbits = 1; + static int lcbits = 1; + static int lmbits = 1; + static int lybits = 1; + int overdensity_bits = 0; #ifdef PRINT_DEBUG long long odk, odc, odm, ody, dk, dc, dm, dy, xk, xc, xm, xy, yc, ym, yy; FILE *dbg; #endif + int terminate; + int direction = row & 1 ? 1 : -1; + + switch (horizontal_overdensity) + { + case 0: + case 1: + overdensity_bits = 0; + break; + case 2: + overdensity_bits = 1; + break; + case 4: + overdensity_bits = 2; + break; + case 8: + overdensity_bits = 3; + break; + } + + bit = (direction == 1) ? 128 : 1 << (7 - ((dst_width - 1) & 7)); + x = (direction == 1) ? 0 : dst_width - 1; + terminate = (direction == 1) ? dst_width : -1; + xstep = 3 * (src_width / dst_width); xmod = src_width % dst_width; length = (dst_width + 7) / 8; @@ -706,6 +738,44 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ kerror0 = error[row & 1][3]; kerror1 = error[1 - (row & 1)][3]; + memset(kerror1, 0, dst_width * sizeof(int)); + memset(cerror1, 0, dst_width * sizeof(int)); + memset(merror1, 0, dst_width * sizeof(int)); + memset(yerror1, 0, dst_width * sizeof(int)); + cptr = cyan; + mptr = magenta; + yptr = yellow; + lcptr = lcyan; + lmptr = lmagenta; + lyptr = lyellow; + kptr = black; + xerror = 0; + if (direction == -1) + { + cerror0 += dst_width - 1; + cerror1 += dst_width - 1; + merror0 += dst_width - 1; + merror1 += dst_width - 1; + yerror0 += dst_width - 1; + yerror1 += dst_width - 1; + kerror0 += dst_width - 1; + kerror1 += dst_width - 1; + cptr = cyan + length - 1; + if (lcptr) + lcptr = lcyan + length - 1; + mptr = magenta + length - 1; + if (lmptr) + lmptr = lmagenta + length - 1; + yptr = yellow + length - 1; + if (lyptr) + lyptr = lyellow + length - 1; + if (kptr) + kptr = black + length - 1; + xstep = -xstep; + rgb += 3 * (src_width - 1); + xerror = ((dst_width - 1) * xmod) % dst_width; + xmod = -xmod; + } memset(cyan, 0, length); if (lcyan) @@ -726,10 +796,7 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ /* * Main loop starts here! */ - for (x = 0, bit = 128, - cptr = cyan, mptr = magenta, yptr = yellow, lcptr = lcyan, - lmptr = lmagenta, lyptr = lyellow, kptr = black, xerror = 0, - ditherbit = rand(), + for (ditherbit = rand(), ditherc = cerror0[0], ditherm = merror0[0], dithery = yerror0[0], ditherk = kerror0[0], ditherbit0 = ditherbit & 0xffff, @@ -738,9 +805,16 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ ((ditherbit & 0x100) << 7)), ditherbit3 = (((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) + ((ditherbit >> 8) & 0xff00)); - x < dst_width; - x ++, cerror0 ++, cerror1 ++, merror0 ++, merror1 ++, yerror0 ++, - yerror1 ++, kerror0 ++, kerror1 ++) + x != terminate; + x += direction, + cerror0 += direction, + cerror1 += direction, + merror0 += direction, + merror1 += direction, + yerror0 += direction, + yerror1 += direction, + kerror0 += direction, + kerror1 += direction) { /* @@ -775,14 +849,14 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ * Since we're printing black, adjust the black level based upon * the amount of color in the pixel (colorful pixels get less black)... */ - long long xdiff = (abs(c - m) + abs(c - y) + abs(m - y)) / 3; + int xdiff = (abs(c - m) + abs(c - y) + abs(m - y)) / 3; diff = 65536 - xdiff; - diff = diff * diff * diff / (65536ll * 65536ll); /* diff = diff^3 */ + diff = (diff * diff * diff) >> 32; /* diff = diff^3 */ diff--; if (diff < 0) diff = 0; - k = diff * k / 65535ll; + k = (diff * k) >> 16; ak = k; divk = 65535 - k; if (divk == 0) @@ -794,9 +868,9 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ * CMY as necessary to give better blues, greens, and reds... :) */ - c = (65535 - (unsigned) rgb[1] / 4) * (c - k) / divk; - m = (65535 - (unsigned) rgb[2] / 4) * (m - k) / divk; - y = (65535 - (unsigned) rgb[0] / 4) * (y - k) / divk; + c = (65535 - ((rgb[2] + rgb[1]) >> 3)) * (c - k) / divk; + m = (65535 - ((rgb[1] + rgb[0]) >> 3)) * (m - k) / divk; + y = (65535 - ((rgb[0] + rgb[2]) >> 3)) * (y - k) / divk; } #ifdef PRINT_DEBUG yc = c; @@ -811,17 +885,11 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ */ ok = k; nk = k + (ditherk) / 8; - kdarkness = MAX((c + c / 3 + m + 2 * y / 3) / 4, ak); -/* - kdarkness = ak; -*/ + kdarkness = MAX((c + ((c + c + c) >> 3) + m + + ((y + y + y + y + y) >> 3)) >> 2, ak); if (kdarkness < KDARKNESS_UPPER) { int rb; -/* - ub = KDARKNESS_UPPER - kdarkness; - lb = ub * KDARKNESS_LOWER / KDARKNESS_UPPER; -*/ ub = KDARKNESS_UPPER; lb = KDARKNESS_LOWER; rb = ub - lb; @@ -866,9 +934,10 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ */ if (lmagenta) { - c += ck * 10 / 8; - m += ck * 19 / 16; - y += ck * 3 / 2; + int addon = 2 * ck; + c += addon; + m += addon; + y += addon; } else { @@ -890,36 +959,14 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ odk = ditherk; dk = k; #endif - if (k > (32767 + ((ditherbit0 / K_RANDOMIZER) - (32768 / K_RANDOMIZER)))) + if (k > (32767 + ((ditherbit0 >> K_RANDOMIZER) - + (32768 >> K_RANDOMIZER)))) { - if (kbits++ % horizontal_overdensity == 0) - *kptr |= bit; + DO_PRINT_COLOR(k); k -= 65535; } UPDATE_DITHER(k, 1, x, src_width); -#if 0 - if (ditherbit0 & bit) - { - if (x > 0) - kerror1[-1] += k; - else - kerror1[0] = k; - kerror1[0] += 2 * k; - kerror1[1] = k; - ditherk = kerror0[1] + 3 * k; - } - else - { - if (x > 0) - kerror1[-1] += k / 2; - else - kerror1[0] = k / 2; - kerror1[0] += k; - kerror1[1] = k / 2; - ditherk = kerror0[1] + 5 * k; - } -#endif } else { @@ -934,31 +981,22 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ y = (65535 - rgb[0] / 4) * (y - k) / 65535 + k; } - + density = (c + m + y) >> overdensity_bits; UPDATE_COLOR(c); UPDATE_COLOR(m); UPDATE_COLOR(y); - density = (c + m + y) / horizontal_overdensity; + density += (c + m + y) >> overdensity_bits; +/* density >>= 1; */ + + if (!kptr || !(*kptr & bit)) + { + PRINT_COLOR(cyan, c, C, 1, 2); + PRINT_COLOR(magenta, m, M, 2, 3); + PRINT_COLOR(yellow, y, Y, 3, 0); + } - /***************************************************************** - * Cyan - *****************************************************************/ - if (! (*kptr & bit)) - PRINT_COLOR(cyan, c, C, 1, 2); UPDATE_DITHER(c, 2, x, dst_width); - - /***************************************************************** - * Magenta - *****************************************************************/ - if (! (*kptr & bit)) - PRINT_COLOR(magenta, m, M, 2, 3); UPDATE_DITHER(m, 3, x, dst_width); - - /***************************************************************** - * Yellow - *****************************************************************/ - if (! (*kptr & bit)) - PRINT_COLOR(yellow, y, Y, 3, 0); UPDATE_DITHER(y, 0, x, dst_width); /***************************************************************** @@ -984,57 +1022,70 @@ dither_cmyk(unsigned short *rgb, /* I - RGB pixels */ (black && (*kptr & bit)) ? 'k' : ' ', odk, odc, odm, ody, kdarkness, ck, bk, nk, ub, lb); + fprintf(dbg, "x %d dir %d c %x %x m %x %x y %x %x k %x %x rgb %x bit %x\n", + x, direction, cptr, cyan, mptr, magenta, yptr, yellow, kptr, black, + rgb, bit); #endif - - if (bit == 1) + + ditherbit = rand(); + ditherbit0 = ditherbit & 0xffff; + ditherbit1 = ((ditherbit >> 8) & 0xffff); + ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7); + ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) + + ((ditherbit >> 8) & 0xff00); + if (direction == 1) { - cptr ++; - if (lcptr) - lcptr ++; - mptr ++; - if (lmptr) - lmptr ++; - yptr ++; - if (lyptr) - lyptr ++; - if (kptr) - kptr ++; - ditherbit = rand(); - ditherbit0 = ditherbit & 0xffff; - ditherbit1 = ((ditherbit >> 8) & 0xffff); - ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7); - ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) + - ((ditherbit >> 8) & 0xff00); - bit = 128; + if (bit == 1) + { + cptr ++; + if (lcptr) + lcptr ++; + mptr ++; + if (lmptr) + lmptr ++; + yptr ++; + if (lyptr) + lyptr ++; + if (kptr) + kptr ++; + bit = 128; + } + else + bit >>= 1; } else { - ditherbit = rand(); - ditherbit0 = ditherbit & 0xffff; - ditherbit1 = ((ditherbit >> 8) & 0xffff); - ditherbit2 = ((ditherbit >> 16) & 0x7fff) + ((ditherbit & 0x100) << 7); - ditherbit3 = ((ditherbit >> 24) & 0x7f) + ((ditherbit & 1) << 7) + - ((ditherbit >> 8) & 0xff00); -#if 0 - int dithertmp0 = (ditherbit1 >> 14) ^ ((ditherbit3 &0x3fff) << 2); - int dithertmp1 = (ditherbit2 >> 14) ^ ((ditherbit2 &0x3fff) << 2); - int dithertmp2 = (ditherbit3 >> 14) ^ ((ditherbit1 &0x3fff) << 2); - int dithertmp3 = (ditherbit0 >> 14) ^ ((ditherbit0 &0x3fff) << 2); - ditherbit0 = dithertmp0; - ditherbit1 = dithertmp1; - ditherbit2 = dithertmp2; - ditherbit3 = dithertmp3; -#endif - bit >>= 1; + if (bit == 128) + { + cptr --; + if (lcptr) + lcptr --; + mptr --; + if (lmptr) + lmptr --; + yptr --; + if (lyptr) + lyptr --; + if (kptr) + kptr --; + bit = 1; + } + else + bit <<= 1; } rgb += xstep; xerror += xmod; if (xerror >= dst_width) - { - xerror -= dst_width; - rgb += 3; - } + { + xerror -= dst_width; + rgb += 3 * direction; + } + else if (xerror < 0) + { + xerror += dst_width; + rgb += 3 * direction; + } } /* * Main loop ends here! @@ -1990,72 +2041,34 @@ compute_lut(lut_t *lut, pow(green_pixel, print_gamma)); blue_pixel = 256.0 * (256.0 - 256.0 * pow(blue_pixel, print_gamma)); -#if 0 - if (red > 1.0) - red_pixel = 65536.0 + ((pixel - 65536.0) / red); - else - red_pixel = pixel * red; - if (green > 1.0) - green_pixel = 65536.0 + ((pixel - 65536.0) / green); - else - green_pixel = pixel * green; - if (blue > 1.0) - blue_pixel = 65536.0 + ((pixel - 65536.0) / blue); - else - blue_pixel = pixel * blue; -#endif if (pixel <= 0.0) - { - lut->composite[i] = 0; - } + lut->composite[i] = 0; else if (pixel >= 65535.0) - { - lut->composite[i] = 65535; - } + lut->composite[i] = 65535; else - { - lut->composite[i] = (unsigned)(pixel + 0.5); - } + lut->composite[i] = (unsigned)(pixel); if (red_pixel <= 0.0) - { - lut->red[i] = 0; - } + lut->red[i] = 0; else if (red_pixel >= 65535.0) - { - lut->red[i] = 65535; - } + lut->red[i] = 65535; else - { - lut->red[i] = (unsigned)(red_pixel + 0.5); - } + lut->red[i] = (unsigned)(red_pixel); if (green_pixel <= 0.0) - { - lut->green[i] = 0; - } + lut->green[i] = 0; else if (green_pixel >= 65535.0) - { - lut->green[i] = 65535; - } + lut->green[i] = 65535; else - { - lut->green[i] = (unsigned)(green_pixel + 0.5); - } + lut->green[i] = (unsigned)(green_pixel); if (blue_pixel <= 0.0) - { - lut->blue[i] = 0; - } + lut->blue[i] = 0; else if (blue_pixel >= 65535.0) - { - lut->blue[i] = 65535; - } + lut->blue[i] = 65535; else - { - lut->blue[i] = (unsigned)(blue_pixel + 0.5); - } + lut->blue[i] = (unsigned)(blue_pixel); } #ifdef PRINT_LUT fprintf(ltfile, "%3i %5d %5d %5d %5d %f %f %f %f %f %f %f %f\n", diff --git a/plug-ins/print/print.c b/plug-ins/print/print.c index 0019addc16..4d76a4ed32 100644 --- a/plug-ins/print/print.c +++ b/plug-ins/print/print.c @@ -3,7 +3,7 @@ * * Print plug-in for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -47,6 +47,10 @@ /* * All Gimp-specific code is in this file. */ +#include +#include +#define PLUG_IN_VERSION "3.0.5 - 13 Jan 2000" +#define PLUG_IN_NAME "Print" #include #include @@ -56,8 +60,38 @@ #include #endif -#include "libgimp/gimpui.h" -#include "libgimp/stdplugins-intl.h" +#include +#if 0 +#include +#else +#include +#include + +#ifndef LOCALEDIR +#define LOCALEDIR g_strconcat (gimp_data_directory (), \ + G_DIR_SEPARATOR_S, \ + "locale", \ + NULL) +#endif +#ifdef HAVE_LC_MESSAGES +#define INIT_I18N() \ + setlocale(LC_MESSAGES, ""); \ + bindtextdomain("gimp-std-plugins", LOCALEDIR); \ + textdomain("gimp-std-plugins") +#define INIT_I18N_UI() \ + gtk_set_locale(); \ + setlocale (LC_NUMERIC, "C"); \ + INIT_I18N(); +#else +#define INIT_I18N() \ + bindtextdomain("gimp-std-plugins", LOCALEDIR); \ + textdomain("gimp-std-plugins") +#define INIT_I18N_UI() \ + gtk_set_locale(); \ + setlocale (LC_NUMERIC, "C"); \ + INIT_I18N(); +#endif +#endif /* * Constants for GUI... @@ -236,7 +270,7 @@ printer_t printers[] = /* List of supported printer types */ escp2_parameters, default_media_size, escp2_imageable_area, escp2_print }, { N_("EPSON Stylus Photo EX"), "escp2-ex", 1, 7, 0.585, 0.646, escp2_parameters, default_media_size, escp2_imageable_area, escp2_print }, - { N_("EPSON Stylus Photo EX"), "escp2-photo", 1, 8, 0.585, 0.646, + { N_("EPSON Stylus Photo"), "escp2-photo", 1, 8, 0.585, 0.646, escp2_parameters, default_media_size, escp2_imageable_area, escp2_print }, }; @@ -797,7 +831,7 @@ do_print_dialog(void) * Top-level table for dialog... */ - table = gtk_table_new(9, 4, FALSE); + table = gtk_table_new(17, 4, FALSE); gtk_container_border_width(GTK_CONTAINER(table), 6); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_table_set_row_spacings(GTK_TABLE(table), 8); @@ -956,6 +990,15 @@ do_print_dialog(void) gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); gtk_widget_show(button); + label = gtk_label_new(_("Density:")); + gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); + gtk_table_attach(GTK_TABLE(table), label, 2, 3, 7, 8, GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show(label); + + box = gtk_hbox_new(FALSE, 8); + gtk_table_attach(GTK_TABLE(table), box, 3, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show(box); + linear_off = button = gtk_radio_button_new_with_label(NULL, _("Normal scale")); linear_group = gtk_radio_button_group(GTK_RADIO_BUTTON(button)); if (vars.linear == 0) @@ -966,7 +1009,7 @@ do_print_dialog(void) gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); gtk_widget_show(button); - linear_on = button = gtk_radio_button_new_with_label(linear_group, _("Linear scale")); + linear_on = button = gtk_radio_button_new_with_label(linear_group, _("Experimental linear scale")); if (vars.linear == 1) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); gtk_signal_connect(GTK_OBJECT(button), "toggled", @@ -981,11 +1024,11 @@ do_print_dialog(void) label = gtk_label_new(_("Scaling:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 7, 8, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 7, 8, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); if (vars.scaling < 0.0) @@ -1037,11 +1080,11 @@ do_print_dialog(void) label = gtk_label_new(_("Brightness:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 8, 9, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 8, 9, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); brightness_adjustment = scale_data = @@ -1072,11 +1115,11 @@ do_print_dialog(void) label = gtk_label_new(_("Gamma:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 9, 10, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 9, 10, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); gamma_adjustment = scale_data = @@ -1115,10 +1158,10 @@ do_print_dialog(void) label = gtk_label_new(_("Contrast:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 10, 11, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 10, 11, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); contrast_adjustment = scale_data = @@ -1149,11 +1192,11 @@ do_print_dialog(void) label = gtk_label_new(_("Red:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 11, 12, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 11, 12, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); red_adjustment = scale_data = @@ -1184,11 +1227,11 @@ do_print_dialog(void) label = gtk_label_new(_("Green:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 12, 13, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 12, 13, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); green_adjustment = scale_data = @@ -1219,11 +1262,11 @@ do_print_dialog(void) label = gtk_label_new(_("Blue:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 13, 14, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 13, 14, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); blue_adjustment = scale_data = @@ -1254,11 +1297,11 @@ do_print_dialog(void) label = gtk_label_new(_("Saturation:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 14, 15, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 14, 15, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); saturation_adjustment = scale_data = @@ -1289,11 +1332,11 @@ do_print_dialog(void) label = gtk_label_new(_("Density:")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 15, 16, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), label, 0, 1, 16, 17, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(label); box = gtk_hbox_new(FALSE, 8); - gtk_table_attach(GTK_TABLE(table), box, 1, 4, 15, 16, GTK_FILL, GTK_FILL, 0, 0); + gtk_table_attach(GTK_TABLE(table), box, 1, 4, 16, 17, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(box); density_adjustment = scale_data = @@ -1367,13 +1410,8 @@ do_print_dialog(void) * Print, cancel buttons... */ - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 2); gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dialog)->action_area), FALSE); - - hbbox = gtk_hbutton_box_new (); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (hbbox), 4); - gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), hbbox, FALSE,FALSE, 0); - gtk_widget_show (hbbox); + gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->action_area), 0); button = gtk_button_new_with_label (_("Print")); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); @@ -3166,8 +3204,8 @@ get_printers(void) for (i = 1; i <= pnum; i++) { sprintf(plist[plist_count].name, "LPT%d:", i); - sprintf(plist[plist_count].v.output_to, "PRINT /D:LPT%d /B ", i); - strcpy(plist[plist_count].v.driver, "ps2"); + sprintf(plist[plist_count].output_to, "PRINT /D:LPT%d /B ", i); + strcpy(plist[plist_count].driver, "ps2"); initialize_printer(&plist[plist_count]); plist_count ++; } diff --git a/plug-ins/print/print.h b/plug-ins/print/print.h index 0176fa9e1b..7735bd22a4 100644 --- a/plug-ins/print/print.h +++ b/plug-ins/print/print.h @@ -1,8 +1,9 @@ /* + * "$Id$" * * Print plug-in header file for the GIMP. * - * Copyright 1997-1999 Michael Sweet (mike@easysw.com) and + * Copyright 1997-2000 Michael Sweet (mike@easysw.com) and * Robert Krawitz (rlk@alum.mit.edu) * * This program is free software; you can redistribute it and/or modify it @@ -24,10 +25,23 @@ * See ChangeLog */ +/* + * + * This file must not include any gimp, glib, gtk, etc. headers. + * + * Eventually I intend to port this to GhostScript and/or CUPS. The only + * file that should have GIMP-specific code is print.c. The rest of this + * program should be completely generic. + * + * rlk 20000112 + */ + /* * Include necessary header files... */ -#include "config.h" +#ifndef HAVE_UNISTD_H +#define HAVE_UNISTD_H +#endif #include #include @@ -39,17 +53,10 @@ #include #endif -#include -#include - - /* * Constants... */ - -#define PLUG_IN_VERSION "3.0.1 - 05 Dec 1999" -#define PLUG_IN_NAME "Print" #define OUTPUT_GRAY 0 /* Grayscale output */ #define OUTPUT_COLOR 1 /* Color output */ @@ -229,3 +236,6 @@ extern void indexed_to_gray(unsigned char *, unsigned char *, int, int, lut_t *, unsigned char *, float); #endif +/* + * End of "$Id$". + */ diff --git a/po/ChangeLog b/po/ChangeLog index ddbce57a4f..1495994f53 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,3 +1,7 @@ +Thu Jan 27 14:53:00 CET 2000 Sven Neumann + + * de.po: updates from Daniel Egger + 2000-01-27 Michael Natterer * uk.po: fixed two translations to make it compile. diff --git a/po/de.po b/po/de.po index 4cc00b1d0b..e162a14ad1 100644 --- a/po/de.po +++ b/po/de.po @@ -1,14 +1,14 @@ # This is the German locale definition for Gimp. # Copyright (C) 1998-2000 Free Software Foundation, Inc. -# Daniel Egger +# Daniel Egger # Sven Neumann # msgid "" msgstr "" "Project-Id-Version: GIMP 1.1.15\n" -"POT-Creation-Date: 2000-01-17 22:03+0100\n" -"PO-Revision-Date: 2000-01-17 22:20+0100\n" -"Last-Translator: Sven Neumann \n" +"POT-Creation-Date: 2000-01-27 14:50+0100\n" +"PO-Revision-Date: 2000-01-27 14:20+0100\n" +"Last-Translator: Daniel Egger \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" @@ -54,22 +54,22 @@ msgid "Parasites" msgstr "Parasiten" #. initialize the global parasite table -#: app/app_procs.c:538 app/internal_procs.c:71 app/preferences_dialog.c:2341 +#: app/app_procs.c:538 app/internal_procs.c:71 app/preferences_dialog.c:2453 msgid "Brushes" msgstr "Pinsel" #. initialize the list of gimp brushes -#: app/app_procs.c:540 app/internal_procs.c:143 app/preferences_dialog.c:2349 +#: app/app_procs.c:540 app/internal_procs.c:143 app/preferences_dialog.c:2461 msgid "Patterns" msgstr "Muster" #. initialize the list of gimp patterns -#: app/app_procs.c:542 app/preferences_dialog.c:2353 +#: app/app_procs.c:542 app/preferences_dialog.c:2465 msgid "Palettes" msgstr "Farbpaletten" #. initialize the list of gimp palettes -#: app/app_procs.c:544 app/internal_procs.c:113 app/preferences_dialog.c:2357 +#: app/app_procs.c:544 app/internal_procs.c:113 app/preferences_dialog.c:2469 msgid "Gradients" msgstr "Farbverläufe" @@ -84,14 +84,14 @@ msgstr "Beenden" #: app/app_procs.c:748 app/brightness_contrast.c:217 app/channel_ops.c:90 #: app/channels_dialog.c:2431 app/channels_dialog.c:2605 #: app/color_balance.c:274 app/color_notebook.c:115 app/convert.c:500 -#: app/curves.c:564 app/file_new_dialog.c:198 app/file_new_dialog.c:369 -#: app/gdisplay_color_ui.c:128 app/gdisplay_ops.c:356 app/gimpprogress.c:114 +#: app/curves.c:583 app/file_new_dialog.c:198 app/file_new_dialog.c:369 +#: app/gdisplay_color_ui.c:128 app/gdisplay_ops.c:369 app/gimpprogress.c:114 #: app/gimpui.c:79 app/global_edit.c:738 app/gradient.c:1789 #: app/gradient.c:4876 app/gradient.c:5437 app/hue_saturation.c:376 #: app/interface.c:967 app/layers_dialog.c:3325 app/layers_dialog.c:3516 #: app/layers_dialog.c:3616 app/layers_dialog.c:3718 app/layers_dialog.c:3981 #: app/levels.c:354 app/palette.c:1852 app/posterize.c:200 -#: app/preferences_dialog.c:1357 app/qmask.c:257 app/resize.c:193 +#: app/preferences_dialog.c:1468 app/qmask.c:281 app/resize.c:193 #: app/threshold.c:274 modules/cdisplay_gamma.c:358 msgid "Cancel" msgstr "Abbrechen" @@ -138,7 +138,7 @@ msgstr "VG nach Transparent" msgid "Custom from Editor" msgstr "Selbsterstellt aus Editor" -#: app/blend.c:270 app/gradient.c:528 app/preferences_dialog.c:2087 +#: app/blend.c:270 app/gradient.c:528 app/preferences_dialog.c:2199 msgid "Linear" msgstr "Linear" @@ -182,7 +182,7 @@ msgstr "Spirale (im Uhrzeigersinn)" msgid "Spiral (anticlockwise)" msgstr "Spirale (gegen Uhrzeigersinn)" -#: app/blend.c:296 app/preferences_dialog.c:1692 +#: app/blend.c:296 app/preferences_dialog.c:1803 msgid "None" msgstr "Keine" @@ -257,20 +257,20 @@ msgstr "Helligkeit-Kontrast" #: app/brightness_contrast.c:213 app/channel_ops.c:88 #: app/channels_dialog.c:2429 app/channels_dialog.c:2603 #: app/color_balance.c:270 app/color_notebook.c:112 app/convert.c:498 -#: app/curves.c:560 app/file_new_dialog.c:196 app/file_new_dialog.c:365 +#: app/curves.c:579 app/file_new_dialog.c:196 app/file_new_dialog.c:365 #: app/gdisplay_color_ui.c:126 app/gimpui.c:77 app/gimpui.c:457 #: app/hue_saturation.c:372 app/layers_dialog.c:3323 app/layers_dialog.c:3514 #: app/layers_dialog.c:3614 app/layers_dialog.c:3979 app/levels.c:350 -#: app/module_db.c:281 app/posterize.c:196 app/preferences_dialog.c:1353 -#: app/qmask.c:255 app/resize.c:191 app/threshold.c:270 +#: app/module_db.c:281 app/posterize.c:196 app/preferences_dialog.c:1464 +#: app/qmask.c:279 app/resize.c:191 app/threshold.c:270 #: modules/cdisplay_gamma.c:351 msgid "OK" msgstr "OK" #: app/brightness_contrast.c:215 app/by_color_select.c:589 -#: app/color_balance.c:272 app/curves.c:562 app/file_new_dialog.c:367 +#: app/color_balance.c:272 app/curves.c:581 app/file_new_dialog.c:367 #: app/hue_saturation.c:374 app/levels.c:352 app/posterize.c:198 -#: app/threshold.c:272 app/tools.c:984 app/transform_core.c:413 +#: app/threshold.c:272 app/tools.c:991 app/transform_core.c:413 #: modules/colorsel_water.c:634 msgid "Reset" msgstr "Zurücksetzen" @@ -286,8 +286,8 @@ msgid "Contrast" msgstr "Kontrast" #. The preview toggle -#: app/brightness_contrast.c:299 app/color_balance.c:440 app/curves.c:671 -#: app/fileops.c:416 app/hue_saturation.c:564 app/levels.c:575 +#: app/brightness_contrast.c:299 app/color_balance.c:440 app/curves.c:690 +#: app/fileops.c:374 app/hue_saturation.c:564 app/levels.c:575 #: app/palette.c:3297 app/posterize.c:237 app/threshold.c:347 msgid "Preview" msgstr "Vorschau" @@ -299,13 +299,13 @@ msgstr "Pinseleditor" #. The close button #: app/brush_edit.c:215 app/brush_select.c:279 app/by_color_select.c:591 #: app/color_notebook.c:112 app/color_picker.c:296 app/colormap_dialog.i.c:151 -#: app/colormap_dialog.i.c:161 app/crop.c:1045 app/devices.c:755 -#: app/docindexif.c:104 app/errorconsole.c:281 app/gdisplay_ops.c:354 +#: app/colormap_dialog.i.c:161 app/crop.c:1053 app/devices.c:755 +#: app/docindexif.c:104 app/errorconsole.c:281 app/gdisplay_ops.c:367 #: app/gradient.c:800 app/gradient_select.c:152 app/histogram_tool.c:292 #: app/info_window.c:308 app/lc_dialog.c:196 app/measure.c:273 #: app/nav_window.c:1366 app/palette.c:2117 app/palette.c:2133 #: app/palette.c:3179 app/palette_select.c:62 app/pattern_select.c:171 -#: app/preferences_dialog.c:363 app/tips_dialog.c:171 app/tools.c:986 +#: app/preferences_dialog.c:359 app/tips_dialog.c:171 app/tools.c:993 #: app/undo_history.c:761 msgid "Close" msgstr "Schließen" @@ -452,7 +452,7 @@ msgstr "Kopie" msgid "%s copy" msgstr "%s Kopie" -#: app/channel.c:591 +#: app/channel.c:607 msgid "Selection Mask" msgstr "Auswahlmaske" @@ -465,7 +465,7 @@ msgstr "Versatz" msgid "Offset X:" msgstr "Versatz X:" -#: app/channel_ops.c:112 app/crop.c:1054 app/file_new_dialog.c:542 +#: app/channel_ops.c:112 app/crop.c:1062 app/file_new_dialog.c:542 #: app/resize.c:329 app/resize.c:414 app/resize.c:572 app/rotate_tool.c:106 #: app/scale_tool.c:99 app/shear_tool.c:81 msgid "Y:" @@ -526,17 +526,17 @@ msgstr "L msgid "Empty Channel Copy" msgstr "Leere Kanal Kopie" -#: app/channels_dialog.c:1386 app/color_balance.c:342 app/curves.c:414 +#: app/channels_dialog.c:1386 app/color_balance.c:342 app/curves.c:429 #: app/histogram_tool.c:272 app/levels.c:229 msgid "Red" msgstr "Rot" -#: app/channels_dialog.c:1390 app/color_balance.c:367 app/curves.c:415 +#: app/channels_dialog.c:1390 app/color_balance.c:367 app/curves.c:430 #: app/histogram_tool.c:273 app/levels.c:230 msgid "Green" msgstr "Grün" -#: app/channels_dialog.c:1394 app/color_balance.c:392 app/curves.c:416 +#: app/channels_dialog.c:1394 app/color_balance.c:392 app/curves.c:431 #: app/histogram_tool.c:274 app/levels.c:231 msgid "Blue" msgstr "Blau" @@ -772,7 +772,7 @@ msgstr "" "Fehler beim Verändern der Bildgröße:\n" "Breite und Höhe müssen größer als Null sein." -#: app/commands.c:1360 +#: app/commands.c:1367 msgid "Scale Error: Both width and height must be greater than zero." msgstr "" "Fehler beim Skalieren des Bildes:\n" @@ -885,92 +885,119 @@ msgstr "Vergr msgid "Tool Toggle" msgstr "Werkzeug-Modus" -#: app/crop.c:214 app/crop.c:1041 +#: app/crop.c:214 app/crop.c:1049 msgid "Crop" msgstr "Zuschneiden" -#: app/crop.c:216 app/crop.c:1043 +#: app/crop.c:216 app/crop.c:1051 msgid "Resize" msgstr "Größe verändern" -#: app/crop.c:511 app/crop.c:519 +#: app/crop.c:515 app/crop.c:523 msgid "Crop: " msgstr "Zuschneiden: " -#: app/crop.c:1014 +#: app/crop.c:1022 msgid "Crop: 0 x 0" msgstr "Zuschneiden: 0 x 0" #. create the info dialog -#: app/crop.c:1035 +#: app/crop.c:1043 msgid "Crop & Resize Information" msgstr "Zuschneideinformationen" #. add the information fields -#: app/crop.c:1051 +#: app/crop.c:1059 msgid "Origin X:" msgstr "Ursprung X:" #. the pixel size labels -#: app/crop.c:1067 app/file_new_dialog.c:401 app/file_new_dialog.c:419 +#: app/crop.c:1075 app/file_new_dialog.c:401 app/file_new_dialog.c:419 #: app/tool_options.c:306 msgid "Width:" msgstr "Breite:" -#: app/crop.c:1070 app/file_new_dialog.c:407 app/file_new_dialog.c:425 +#: app/crop.c:1078 app/file_new_dialog.c:407 app/file_new_dialog.c:425 #: app/layers_dialog.c:3362 app/resize.c:240 app/resize.c:265 app/resize.c:509 #: app/scale_tool.c:78 app/scale_tool.c:85 app/tool_options.c:322 #: app/xinput_airbrush.c:479 msgid "Height:" msgstr "Höhe:" -#: app/crop.c:1092 +#: app/crop.c:1100 msgid "From Selection" msgstr "Aus Auswahl" -#: app/crop.c:1098 +#: app/crop.c:1106 msgid "Auto Shrink" msgstr "Automatisch schrumpfen" -#: app/curves.c:377 +#: app/curves.c:392 msgid "Curves Options" msgstr "Kurven Einstellungen" -#: app/curves.c:413 app/histogram_tool.c:271 app/layers_dialog.c:242 +#: app/curves.c:428 app/histogram_tool.c:271 app/layers_dialog.c:242 #: app/levels.c:228 app/paint_funcs.c:97 app/tool_options.c:886 msgid "Value" msgstr "Wert" -#: app/curves.c:417 app/levels.c:232 +#: app/curves.c:432 app/levels.c:232 msgid "Alpha" msgstr "Alpha" -#: app/curves.c:428 +#: app/curves.c:443 msgid "Curves for indexed drawables cannot be adjusted." msgstr "Kurven können bei indizierten Bildern nicht angepasst werden." -#: app/curves.c:528 +#: app/curves.c:544 msgid "Smooth" msgstr "Weich" -#: app/curves.c:529 +#: app/curves.c:545 msgid "Free" msgstr "Frei" #. The shell and main vbox -#: app/curves.c:555 app/tools.c:663 +#: app/curves.c:574 app/tools.c:663 msgid "Curves" msgstr "Kurven" -#: app/curves.c:577 +#: app/curves.c:596 msgid "Modify Curves for Channel:" msgstr "Verändere Kurven für Kanal:" #. The option menu for selecting the drawing method -#: app/curves.c:658 +#: app/curves.c:677 msgid "Curve Type:" msgstr "Kurvenart:" +#: app/curves.c:707 app/levels.c:603 app/module_db.c:829 +msgid "Load" +msgstr "Öffnen" + +#: app/curves.c:717 app/devices.c:753 app/levels.c:613 app/palette.c:2113 +#: app/preferences_dialog.c:357 app/preferences_dialog.c:1466 +msgid "Save" +msgstr "Sichern" + +#: app/curves.c:1358 +msgid "Load Curves" +msgstr "Kurven öffnen" + +#: app/curves.c:1373 +msgid "Save Curves" +msgstr "Kurven sichern" + +#: app/curves.c:1654 +msgid "Load/Save Curves" +msgstr "Öffne/Sichere Kurven" + +#: app/curves.c:1692 app/curves.c:1710 app/levels.c:1496 app/levels.c:1514 +#: app/paths_dialog.c:2220 +#, c-format +msgid "Unable to open file %s" +msgstr "Kann Datei %s nicht öffnen" + #: app/desaturate.c:35 msgid "Desaturate operates only on RGB color drawables." msgstr "Sättigung kann nur bei RGB Bildern verringert werden" @@ -979,11 +1006,6 @@ msgstr "S msgid "Device Status" msgstr "Gerätestatus" -#: app/devices.c:753 app/levels.c:613 app/palette.c:2113 -#: app/preferences_dialog.c:361 app/preferences_dialog.c:1355 -msgid "Save" -msgstr "Sichern" - #: app/docindex.c:574 msgid "This file cannot be moved up." msgstr "Diese Datei kann nicht nach oben verschoben werden." @@ -1160,7 +1182,7 @@ msgstr "Bildgr msgid "New Image" msgstr "Neues Bild" -#: app/file_new_dialog.c:465 app/preferences_dialog.c:1428 +#: app/file_new_dialog.c:465 app/preferences_dialog.c:1539 msgid "Pixels" msgstr "Pixel" @@ -1178,103 +1200,105 @@ msgstr "Pixel/%a" msgid "Image Type" msgstr "Bildart" -#: app/fileops.c:238 app/fileops.c:278 +#: app/fileops.c:223 app/fileops.c:268 msgid "Load Image" msgstr "Bild öffnen" #. format-chooser frame -#: app/fileops.c:288 -msgid "Determine file type" -msgstr "Dateityp festlegen" +#: app/fileops.c:283 +msgid "Determine File Type" +msgstr "Dateityp bestimmen" -#: app/fileops.c:382 +#: app/fileops.c:356 msgid "" -"generate\n" -"preview" +"Generate\n" +"Preview" msgstr "" "Vorschau\n" "erzeugen" -#: app/fileops.c:417 -msgid "No selection." +#: app/fileops.c:375 +msgid "No Selection." msgstr "Keine Auswahl." -#: app/fileops.c:468 app/fileops.c:504 +#: app/fileops.c:418 app/fileops.c:1624 app/fileops.c:1731 +#, c-format +msgid "Save failed: %s" +msgstr "Sichern schlug fehl: %s" + +#: app/fileops.c:438 app/fileops.c:473 msgid "Save Image" msgstr "Bild sichern" -#: app/fileops.c:509 +#: app/fileops.c:486 msgid "Save Options" msgstr "Sichern Einstellungen" -#: app/fileops.c:518 -msgid "Determine file type:" -msgstr "Dateityp festlegen:" +#: app/fileops.c:495 +msgid "Determine File Type:" +msgstr "Dateityp bestimmen:" -#: app/fileops.c:571 +#: app/fileops.c:555 msgid "Can't revert. No filename associated with this image" msgstr "" "Kann Bild nicht zurücksetzen, da kein Dateiname mit dem Bild verknüft ist" -#: app/fileops.c:585 +#: app/fileops.c:571 msgid "Revert failed." msgstr "Zurücksetzen schlug fehl." -#: app/fileops.c:1255 -msgid "(this thumbnail may be out of date)" -msgstr "(diese Vorschau könnte veraltet sein)" +#: app/fileops.c:1240 +msgid "(This thumbnail may be out of date)" +msgstr "(Diese Vorschau könnte veraltet sein)" -#: app/fileops.c:1256 -msgid "(no information)" -msgstr "(keine Information)" +#: app/fileops.c:1241 +msgid "(No Information)" +msgstr "(Keine Information)" -#: app/fileops.c:1266 -msgid "(thumbnail saving is disabled)" +#: app/fileops.c:1251 +msgid "(Thumbnail saving is disabled)" msgstr "(Vorschau-Sicherung ist abgeschaltet)" -#: app/fileops.c:1270 -msgid "(could not write thumbnail file)" -msgstr "(konnte Vorschau-Datei nicht schreiben)" +#: app/fileops.c:1255 +msgid "(Could not write thumbnail file)" +msgstr "(Konnte Vorschau-Datei nicht schreiben)" -#: app/fileops.c:1274 -msgid "(thumbnail file not written)" +#: app/fileops.c:1259 +msgid "(Thumbnail file not written)" msgstr "(Vorschau-Datei nicht geschrieben)" -#: app/fileops.c:1291 -msgid "no preview available" -msgstr "keine Vorschau verfügbar" +#: app/fileops.c:1276 +msgid "No preview available" +msgstr "Keine Vorschau verfügbar" -#: app/fileops.c:1405 +#: app/fileops.c:1394 msgid "(could not make preview)" msgstr "(konnte keine Vorschau erstellen)" -#: app/fileops.c:1477 app/fileops.c:1558 -msgid "Open failed: " -msgstr "Öffnen schlug fehl: " +#: app/fileops.c:1467 app/fileops.c:1546 +#, c-format +msgid "Open failed: %s" +msgstr "Öffnen schlug fehl: %s" -#: app/fileops.c:1618 +#: app/fileops.c:1602 #, c-format msgid "%s is an irregular file (%s)" msgstr "%s ist keine reguläre Datei (%s)" -#: app/fileops.c:1632 app/fileops.c:1734 -msgid "Save failed: " -msgstr "Sichern schlug fehl: " - -#: app/fileops.c:1679 +#: app/fileops.c:1670 #, c-format msgid "%s exists, overwrite?" msgstr "%s existiert, überschreiben?" -#: app/fileops.c:1683 +#: app/fileops.c:1674 msgid "File Exists!" msgstr "Datei Existiert!" -#: app/fileops.c:1689 +#: app/fileops.c:1680 msgid "Yes" msgstr "Ja" -#: app/fileops.c:1691 +#: app/fileops.c:1682 msgid "No" msgstr "Nein" @@ -1282,17 +1306,17 @@ msgstr "Nein" msgid "Flip Tool Options" msgstr "Spiegel Einstellungen" -#: app/flip_tool.c:94 app/preferences_dialog.c:1477 -#: app/preferences_dialog.c:2228 +#: app/flip_tool.c:94 app/preferences_dialog.c:1588 +#: app/preferences_dialog.c:2340 msgid "Horizontal" msgstr "Horizontal" -#: app/flip_tool.c:96 app/preferences_dialog.c:1479 -#: app/preferences_dialog.c:2230 +#: app/flip_tool.c:96 app/preferences_dialog.c:1590 +#: app/preferences_dialog.c:2342 msgid "Vertical" msgstr "Vertikal" -#: app/floating_sel.c:109 +#: app/floating_sel.c:110 msgid "" "Cannot anchor this layer because\n" "it is not a floating selection." @@ -1300,7 +1324,7 @@ msgstr "" "Kann diese Ebene nicht verankern,\n" "da sie keine schwebende Auswahl ist." -#: app/floating_sel.c:179 +#: app/floating_sel.c:180 msgid "" "Cannot create a new layer from the floating\n" "selection because it belongs to a\n" @@ -1314,7 +1338,7 @@ msgstr "" msgid "RGB-empty" msgstr "RGB leer" -#: app/gdisplay.c:217 app/image_new.c:53 app/preferences_dialog.c:1523 +#: app/gdisplay.c:217 app/image_new.c:53 app/preferences_dialog.c:1634 msgid "RGB" msgstr "RGB" @@ -1350,7 +1374,7 @@ msgstr "Verf msgid "Active Filters" msgstr "Aktive Filter" -#: app/gdisplay_ops.c:373 +#: app/gdisplay_ops.c:386 #, c-format msgid "" "Changes were made to %s.\n" @@ -1517,7 +1541,7 @@ msgstr "Kanal kann nicht weiter angehoben werden" msgid "Channel cannot be lowered any further" msgstr "Kanal kann nicht weiter abgesenkt werden" -#: app/gimpimage.c:3181 app/palette.c:379 app/palette.c:956 app/palette.c:1092 +#: app/gimpimage.c:3184 app/palette.c:379 app/palette.c:956 app/palette.c:1092 #: app/palette.c:2063 app/palette.c:2810 app/palette.c:2942 msgid "Untitled" msgstr "Unbenannt" @@ -1536,7 +1560,7 @@ msgstr "" msgid "Progress" msgstr "Fortschritt" -#: app/gimprc.c:399 app/plug_in.c:305 +#: app/gimprc.c:399 app/plug_in.c:304 msgid "Resource configuration" msgstr "Ressourcen Konfiguration" @@ -1833,9 +1857,9 @@ msgstr "" "BewegenShift+Ziehen: Bewegen und Stauchen" #: app/gradient.c:2913 app/gradient.c:2922 -#, fuzzy, c-format +#, c-format msgid "Handle position: %0.6f" -msgstr "Position: %0.6f" +msgstr "Markerposition: %0.6f" #: app/gradient.c:2940 #, c-format @@ -2114,7 +2138,7 @@ msgid "Saturation" msgstr "Sättigung" #: app/image_new.c:58 app/info_window.c:65 app/info_window.c:603 -#: app/preferences_dialog.c:1524 +#: app/preferences_dialog.c:1635 msgid "Grayscale" msgstr "Graustufen" @@ -2180,8 +2204,8 @@ msgstr "" "Der aktive Farbverlauf.\n" "Klick öffnet die Farbverlaufsauswahl." -#: app/info_dialog.c:180 app/preferences_dialog.c:1666 -#: app/preferences_dialog.c:1770 +#: app/info_dialog.c:180 app/preferences_dialog.c:1777 +#: app/preferences_dialog.c:1881 msgid "General" msgstr "Allgemein" @@ -2415,7 +2439,7 @@ msgid "" "\t\tpatterns, plug-ins and modules can also configured here.\n" msgstr "" "\t\tDie Datei gimprc wird benutzt um persönliche Einstellungen\n" -"\t\twie GIMPs Standardverhalten zu speichern.\n" +"\t\twie GIMPs Standardverhalten zu sichern.\n" "\t\tAuch die Suchpfade für Pinsel, Paletten, Farbverläufe,\n" "\t\tMuster, Plugins und Module können hier konfiguriert werden.\n" @@ -2432,7 +2456,7 @@ msgstr "" "\t\tvon GIMP gestartet werden und die weitere Funktionalität\n" "\t\tbereitstellen. Diese Programme werden zur Laufzeit gesucht\n" "\t\tund die Informationen über ihre Funktionalität und ihr\n" -"\t\tErzeugungsdatum werden in dieser Datei gespeichert.\n" +"\t\tErzeugungsdatum werden in dieser Datei gesichert.\n" "\t\tDiese Datei sollte nur von GIMP gelesen und nicht\n" "\t\tbearbeitet werden.\n" @@ -2459,10 +2483,10 @@ msgid "" "\t\topen the last time you quit The GIMP. You can configure\n" "\t\tThe GIMP to reopen these dialogs at the saved position.\n" msgstr "" -"\t\tDie Datei sessionrc wird benutzt, um zu speichern, welche\n" +"\t\tDie Datei sessionrc wird benutzt, um zu sichern, welche\n" "\t\tFenster beim Schliessen von GIMP geöffnet waren. Sie können\n" "\t\tGIMP so konfigurieren, daß diese Dialoge beim Start an der\n" -"\t\tgespeicherten Position wieder geöffnet werden.\n" +"\t\tgesicherten Position wieder geöffnet werden.\n" #: app/install.c:168 msgid "" @@ -2473,7 +2497,7 @@ msgid "" "\t\tyou quit the GIMP.\n" msgstr "" "\t\tDie Datei unitrc wird benutzt, um Ihre Einheiten-Datenbank\n" -"\t\tzu speichern. Sie können zusätzliche Einheiten definieren\n" +"\t\tzu sichern. Sie können zusätzliche Einheiten definieren\n" "\t\tund sie wie die vordefinierten Einheiten wie Inch,\n" "\t\tMillimeter, Punkt und Pica benutzen. Diese Datei wird\t\tjedesmal " "überschrieben, wenn sie GIMP beenden.\n" @@ -2487,7 +2511,7 @@ msgid "" "\t\tbrushes.\n" msgstr "" "\t\tDies ist ein Unterverzeichnis, das verwendet werden kann,\n" -"\t\tum benutzerdefinierte Pinsel zu speichern. Entsprechend der\n" +"\t\tum benutzerdefinierte Pinsel zu sichern. Entsprechend der\n" "\t\tStandard gimprc Datei wird dieses Verzeichnis zusätzlich zum\n" "\t\tsystemweiten Pinselinstallation durchsucht, wenn nach Pinsel\n" "\t\tgesucht wird.\n" @@ -2513,7 +2537,7 @@ msgid "" "\t\tgradients.\n" msgstr "" "\t\tDies ist ein Unterverzeichnis, das verwendet werden kann,\n" -"\t\tum benutzerdefinierte Farbverläufe zu speichern.\n" +"\t\tum benutzerdefinierte Farbverläufe zu sichern.\n" "\t\tEntsprechend der Standard gimprc wird dieses Verzeichnis\n" "\t\tzusätzlich zur systemweiten Verlaufsinstallation durchsucht,\n" "\t\twenn nach Farbverläufen gesucht wird.\n" @@ -2527,8 +2551,8 @@ msgid "" "\t\twhen searching for gfig figures.\n" msgstr "" "\t\tDies ist ein Unterverzeichnis, das verwendet werden kann,\n" -"\t\tum benutzerdefinierte Figuren zu speichern, die mit dem\n" -"\t\tGFig Plugin benutzt werden. Entsprechend der Standard gimprc\n" +"\t\tum benutzerdefinierte Figuren zu sichern, die mit dem\n" +"\t\tGFig Plugin benutzt werden. Entsprechend der Standard gimprc\n" "\t\twird dieses Verzeichnis zusätzlich zur systemweiten GFig\n" "\t\tInstallation durchsucht, wenn nach GFig Figuren gesucht\n" "\t\twird.\n" @@ -2542,8 +2566,8 @@ msgid "" "\t\twhen searching for gflares.\n" msgstr "" "\t\tDies ist ein Unterverzeichnis, das verwendet werden kann,\n" -"\t\tum benutzerdefinierte GFlares zu speichern, die mit dem\n" -"\t\tGFlare Plugin benutzt werden. Entsprechend der Standard gimprc\n" +"\t\tum benutzerdefinierte GFlares zu sichern, die mit dem\n" +"\t\tGFlare Plugin benutzt werden. Entsprechend der Standard gimprc\n" "\t\twird dieses Verzeichnis zusätzlich zur systemweiten GFlare\n" "\t\tInstallation durchsucht, wenn nach GFlares gesucht wird.\n" @@ -2556,7 +2580,7 @@ msgid "" "\t\twhen searching for fractals.\n" msgstr "" "\t\tDies ist ein Unterverzeichnis, das verwendet werden kann,\n" -"\t\tum benutzerdefinierte Fraktale zu speichern, die mit dem\n" +"\t\tum benutzerdefinierte Fraktale zu sichern, die mit dem\n" "\t\tFraktalexplorer Plugin benutzt werden. Entsprechend der\n" "\t\tStandard gimprc wird dieses Verzeichnis zusätzlich zur\n" "\t\tsystemweiten Fraktalinstallation durchsucht, wenn nach Fraktalen\n" @@ -2769,7 +2793,7 @@ msgstr "Farbverlauf UI" msgid "Guide procedures" msgstr "Hilfslinien Prozeduren" -#: app/internal_procs.c:122 app/preferences_dialog.c:1658 +#: app/internal_procs.c:122 app/preferences_dialog.c:1769 msgid "Interface" msgstr "Oberfläche" @@ -3068,10 +3092,6 @@ msgstr "Quellwerte:" msgid "Output Levels:" msgstr "Zielwerte:" -#: app/levels.c:603 app/module_db.c:829 -msgid "Load" -msgstr "Öffnen" - #: app/levels.c:1124 msgid "Load Levels" msgstr "Werte öffnen" @@ -3080,15 +3100,10 @@ msgstr "Werte msgid "Save Levels" msgstr "Werte sichern" -#: app/levels.c:1456 +#: app/levels.c:1458 msgid "Load/Save Levels" msgstr "Werte Öffne/Sichere" -#: app/levels.c:1494 app/levels.c:1512 app/paths_dialog.c:2217 -#, c-format -msgid "Unable to open file %s" -msgstr "Kann Datei %s nicht öffnen" - #: app/magnify.c:98 msgid "Magnify Options" msgstr "Vergrößern Einstellungen" @@ -3964,7 +3979,7 @@ msgid "/Automatic" msgstr "/Automatisch" #: app/menus.c:669 -msgid "/By extension" +msgid "/By Extension" msgstr "/Nach Endung" #: app/menus.c:683 @@ -4124,7 +4139,7 @@ msgstr "/Pfad importieren..." msgid "/Export Path..." msgstr "/Pfad exportieren..." -#: app/menus.c:1305 +#: app/menus.c:1311 #, c-format msgid "Error opening file: %s\n" msgstr "Kann Datei nicht öffnen: %s\n" @@ -4346,7 +4361,7 @@ msgstr "" #: app/palette.c:534 #, c-format msgid "can't save palette \"%s\"\n" -msgstr "kann Palette \"%s\" nicht speichern\n" +msgstr "kann Palette \"%s\" nicht sichern\n" #: app/palette.c:1177 msgid "Black" @@ -4491,48 +4506,48 @@ msgstr "Punkt ver msgid "Path %d" msgstr "Pfad %d" -#: app/paths_dialog.c:1239 +#: app/paths_dialog.c:1240 msgid "Rename path" msgstr "Pfad umbenennen" -#: app/paths_dialog.c:1242 +#: app/paths_dialog.c:1243 msgid "Enter a new name for the path" msgstr "Geben sie diesem Pfad einen neuen Namen" -#: app/paths_dialog.c:2231 +#: app/paths_dialog.c:2234 #, c-format msgid "Failed to read from %s" msgstr "Konnte nicht aus %s lesen" -#: app/paths_dialog.c:2246 +#: app/paths_dialog.c:2249 #, c-format msgid "Failed to read path from %s" msgstr "Konnte keinen Pfad aus %s lesen" -#: app/paths_dialog.c:2253 +#: app/paths_dialog.c:2256 #, c-format msgid "No points specified in path file %s" msgstr "Pfaddatei %s enthält keine Punkte" -#: app/paths_dialog.c:2264 +#: app/paths_dialog.c:2267 #, c-format msgid "Failed to read path points from %s" msgstr "Konnte keine Pfadpunkte aus %s lesen" -#: app/paths_dialog.c:2337 app/xcf.c:419 +#: app/paths_dialog.c:2340 app/xcf.c:419 #, c-format msgid "open failed on %s: %s\n" msgstr "Kann %s nicht öffnen: %s\n" -#: app/paths_dialog.c:2359 +#: app/paths_dialog.c:2362 msgid "Load/Store Bezier Curves" msgstr "Öffne/Sichere Bezierkurven" -#: app/paths_dialog.c:2399 +#: app/paths_dialog.c:2402 msgid "Load Path" msgstr "Pfad öffnen" -#: app/paths_dialog.c:2421 +#: app/paths_dialog.c:2424 msgid "Store Path" msgstr "Pfad sichern" @@ -4574,29 +4589,29 @@ msgstr "Matrix:" msgid "Perspective..." msgstr "Perspektivisch..." -#: app/plug_in.c:312 +#: app/plug_in.c:311 msgid "Plug-ins" msgstr "Plugins" -#: app/plug_in.c:324 +#: app/plug_in.c:323 #, c-format msgid "query plug-in: \"%s\"\n" msgstr "Frage Plugin: \"%s\" ab\n" -#: app/plug_in.c:362 +#: app/plug_in.c:361 #, c-format msgid "writing \"%s\"\n" msgstr "schreibe \"%s\"\n" -#: app/plug_in.c:377 +#: app/plug_in.c:376 msgid "Starting extensions: " msgstr "Starte Erweiterung: " -#: app/plug_in.c:378 +#: app/plug_in.c:377 msgid "Extensions" msgstr "Erweiterungen" -#: app/plug_in.c:737 +#: app/plug_in.c:736 #, c-format msgid "unable to locate plug-in: \"%s\"" msgstr "Kann Plugin \"%s\" nicht finden" @@ -4613,53 +4628,53 @@ msgstr "Posterisieren" msgid "Posterize Levels:" msgstr "Posterisieren Werte:" -#: app/preferences_dialog.c:229 +#: app/preferences_dialog.c:240 msgid "Error: Levels of undo must be zero or greater." msgstr "" "Fehler: Die Anzahl der Stufen der Rückgängigmachung\n" "muss größer oder gleich Null sein." -#: app/preferences_dialog.c:235 -msgid "Error: Number of processors must be between 1 and 30." -msgstr "Fehler: Die Anzahl der Prozessoren muss zwischen 1 und 30 liegen." - -#: app/preferences_dialog.c:241 +#: app/preferences_dialog.c:246 msgid "Error: Marching speed must be 50 or greater." msgstr "" "Fehler: Die Geschwindigkeit der laufenden Ameisen\n" "muss mindestens 50 betragen." -#: app/preferences_dialog.c:247 +#: app/preferences_dialog.c:252 msgid "Error: Default width must be one or greater." msgstr "Fehler: Die Standardbreite muss mindestens 1 sein." -#: app/preferences_dialog.c:253 +#: app/preferences_dialog.c:258 msgid "Error: Default height must be one or greater." msgstr "Fehler: Die Standardhöhe muss mindestens 1 sein." -#: app/preferences_dialog.c:260 +#: app/preferences_dialog.c:265 msgid "Error: Default unit must be within unit range." msgstr "Fehler: Die gewählte Standardeinheit ist ungültig." -#: app/preferences_dialog.c:267 +#: app/preferences_dialog.c:272 msgid "Error: Default resolution must not be zero." msgstr "Fehler: Die Standardauflösung darf nicht Null sein." -#: app/preferences_dialog.c:275 +#: app/preferences_dialog.c:280 msgid "Error: Default resolution unit must be within unit range." msgstr "Fehler: Die gewählte Standardauflösung ist ungültig." -#: app/preferences_dialog.c:282 +#: app/preferences_dialog.c:287 msgid "Error: Monitor resolution must not be zero." msgstr "Fehler: Die Monitorauflöung darf nicht Null sein." -#: app/preferences_dialog.c:289 +#: app/preferences_dialog.c:294 msgid "Error: Image title format must not be NULL." msgstr "Fehler: Der gewählte Fenstertitel ist ungültig." -#: app/preferences_dialog.c:356 +#: app/preferences_dialog.c:301 +msgid "Error: Number of processors must be between 1 and 30." +msgstr "Fehler: Die Anzahl der Prozessoren muss zwischen 1 und 30 liegen." + +#: app/preferences_dialog.c:351 msgid "Save Preferences ?" -msgstr "Einstellungen speichern ?" +msgstr "Einstellungen sichern ?" #: app/preferences_dialog.c:372 msgid "" @@ -4675,7 +4690,7 @@ msgstr "" "erst nach einem Neustart von GIMP aktiv.\n" "\n" "Sie können jetzt 'Sichern' wählen, um Ihre\n" -"Änderungen abzuspeichern, so daß GIMP neu gestartet\n" +"Änderungen abzusichern, so daß GIMP neu gestartet\n" "werden kann, oder Sie wählen 'Schließen' und die\n" "fraglichen Änderungen werden verworfen." @@ -4683,512 +4698,512 @@ msgstr "" msgid "You will need to restart GIMP for these changes to take effect." msgstr "Sie müssen GIMP neu starten, damit die Änderungen aktiv werden." -#: app/preferences_dialog.c:1347 +#: app/preferences_dialog.c:1458 msgid "Preferences" msgstr "Einstellungen" #. The categories tree -#: app/preferences_dialog.c:1369 +#: app/preferences_dialog.c:1480 msgid "Categories" msgstr "Kategorien" -#: app/preferences_dialog.c:1397 +#: app/preferences_dialog.c:1508 msgid "New File Settings" msgstr "Neues Bild Einstellungen" -#: app/preferences_dialog.c:1399 +#: app/preferences_dialog.c:1510 msgid "New File" msgstr "Neues Bild" -#: app/preferences_dialog.c:1410 +#: app/preferences_dialog.c:1521 msgid "Default Image Size and Unit" msgstr "Standard Bildgröße und -einheit" -#: app/preferences_dialog.c:1424 +#: app/preferences_dialog.c:1535 msgid "Width" msgstr "Breite" -#: app/preferences_dialog.c:1426 +#: app/preferences_dialog.c:1537 msgid "Height" msgstr "Höhe" -#: app/preferences_dialog.c:1456 +#: app/preferences_dialog.c:1567 msgid "Default Image Resolution and Resolution Unit" msgstr "Standard Auflösung und Auflösungseinheit" -#: app/preferences_dialog.c:1481 app/preferences_dialog.c:2232 +#: app/preferences_dialog.c:1592 app/preferences_dialog.c:2344 msgid "dpi" msgstr "dpi" -#: app/preferences_dialog.c:1528 +#: app/preferences_dialog.c:1639 msgid "Default Image Type:" msgstr "Standard Bildtyp:" -#: app/preferences_dialog.c:1564 app/preferences_dialog.c:2045 +#: app/preferences_dialog.c:1675 app/preferences_dialog.c:2157 msgid "Bytes" msgstr "Byte" -#: app/preferences_dialog.c:1565 app/preferences_dialog.c:2046 +#: app/preferences_dialog.c:1676 app/preferences_dialog.c:2158 msgid "KiloBytes" msgstr "KiloByte" -#: app/preferences_dialog.c:1566 app/preferences_dialog.c:2047 +#: app/preferences_dialog.c:1677 app/preferences_dialog.c:2159 msgid "MegaBytes" msgstr "MegaByte" -#: app/preferences_dialog.c:1572 +#: app/preferences_dialog.c:1683 msgid "Maximum Image Size:" msgstr "Maximale Bildgröße:" -#: app/preferences_dialog.c:1577 +#: app/preferences_dialog.c:1688 msgid "Display Settings" msgstr "Anzeige Einstellungen" -#: app/preferences_dialog.c:1579 +#: app/preferences_dialog.c:1690 msgid "Display" msgstr "Anzeige" -#: app/preferences_dialog.c:1587 +#: app/preferences_dialog.c:1698 msgid "Transparency" msgstr "Transparenz" -#: app/preferences_dialog.c:1606 +#: app/preferences_dialog.c:1717 msgid "Light Checks" msgstr "Helle Quadrate" -#: app/preferences_dialog.c:1607 +#: app/preferences_dialog.c:1718 msgid "Mid-Tone Checks" msgstr "Halbhelle Quadrate" -#: app/preferences_dialog.c:1608 +#: app/preferences_dialog.c:1719 msgid "Dark Checks" msgstr "Dunkle Quadrate" -#: app/preferences_dialog.c:1609 +#: app/preferences_dialog.c:1720 msgid "White Only" msgstr "Nur Weiß" -#: app/preferences_dialog.c:1610 +#: app/preferences_dialog.c:1721 msgid "Gray Only" msgstr "Nur Grau" -#: app/preferences_dialog.c:1611 +#: app/preferences_dialog.c:1722 msgid "Black Only" msgstr "Nur Schwarz" -#: app/preferences_dialog.c:1615 +#: app/preferences_dialog.c:1726 msgid "Transparency Type:" msgstr "Transparenz Typ:" -#: app/preferences_dialog.c:1622 app/preferences_dialog.c:1694 -#: app/preferences_dialog.c:1707 +#: app/preferences_dialog.c:1733 app/preferences_dialog.c:1805 +#: app/preferences_dialog.c:1818 msgid "Small" msgstr "Klein" -#: app/preferences_dialog.c:1623 app/preferences_dialog.c:1695 -#: app/preferences_dialog.c:1708 +#: app/preferences_dialog.c:1734 app/preferences_dialog.c:1806 +#: app/preferences_dialog.c:1819 msgid "Medium" msgstr "Mittel" -#: app/preferences_dialog.c:1624 app/preferences_dialog.c:1696 -#: app/preferences_dialog.c:1709 +#: app/preferences_dialog.c:1735 app/preferences_dialog.c:1807 +#: app/preferences_dialog.c:1820 msgid "Large" msgstr "Groß" -#: app/preferences_dialog.c:1628 +#: app/preferences_dialog.c:1739 msgid "Check Size:" msgstr "Schachbrett Größe:" -#: app/preferences_dialog.c:1630 +#: app/preferences_dialog.c:1741 msgid "8-Bit Displays" msgstr "8-bit Anzeigen" -#: app/preferences_dialog.c:1635 +#: app/preferences_dialog.c:1746 msgid "Install Colormap" msgstr "Installiere Farbtabelle" -#: app/preferences_dialog.c:1644 +#: app/preferences_dialog.c:1755 msgid "Colormap Cycling" msgstr "Farbtabelle rotieren" -#: app/preferences_dialog.c:1656 +#: app/preferences_dialog.c:1767 msgid "Interface Settings" msgstr "Oberfläche Einstellungen" -#: app/preferences_dialog.c:1693 +#: app/preferences_dialog.c:1804 msgid "Tiny" msgstr "Winzig" -#: app/preferences_dialog.c:1697 +#: app/preferences_dialog.c:1808 msgid "Huge" msgstr "Riesig" -#: app/preferences_dialog.c:1701 +#: app/preferences_dialog.c:1812 msgid "Preview Size:" msgstr "Vorschaugröße:" -#: app/preferences_dialog.c:1713 +#: app/preferences_dialog.c:1824 msgid "Nav Preview Size:" msgstr "Größe der Navigationsvorschau:" -#: app/preferences_dialog.c:1722 +#: app/preferences_dialog.c:1833 msgid "Recent Documents List Size:" msgstr "Größe der Dokumentenliste:" #. Indicators -#: app/preferences_dialog.c:1726 +#: app/preferences_dialog.c:1837 msgid "Toolbox" msgstr "Werkzeugkasten" -#: app/preferences_dialog.c:1729 +#: app/preferences_dialog.c:1840 msgid "Display Brush, Pattern and Gradient Indicators" msgstr "Zeige Pinsel, Muster und Gradienten" -#: app/preferences_dialog.c:1738 +#: app/preferences_dialog.c:1849 msgid "Dialog Behaviour" msgstr "Verhalten von Dialogen" -#: app/preferences_dialog.c:1740 +#: app/preferences_dialog.c:1851 msgid "Navigation Window per Display" msgstr "Ein Navigations-Fenster pro Bildfenster" -#: app/preferences_dialog.c:1749 +#: app/preferences_dialog.c:1860 msgid "Info Window Follows Mouse" msgstr "Info-Fenster folgt der Maus" -#: app/preferences_dialog.c:1760 +#: app/preferences_dialog.c:1871 msgid "Help System Settings" msgstr "Hilfe System Einstellungen" -#: app/preferences_dialog.c:1762 +#: app/preferences_dialog.c:1873 msgid "Help System" msgstr "Hilfe System" -#: app/preferences_dialog.c:1772 +#: app/preferences_dialog.c:1883 msgid "Show Tool Tips" msgstr "Zeige Popup-Hilfen" -#: app/preferences_dialog.c:1782 +#: app/preferences_dialog.c:1893 msgid "Context Sensitive Help with \"F1\"" msgstr "\"F1\" zeigt kontextabhängige Hilfe" -#: app/preferences_dialog.c:1791 +#: app/preferences_dialog.c:1902 msgid "Help Browser" msgstr "Hilfe Browser" -#: app/preferences_dialog.c:1803 +#: app/preferences_dialog.c:1914 msgid "Internal" msgstr "Intern" -#: app/preferences_dialog.c:1804 +#: app/preferences_dialog.c:1915 msgid "Netscape" msgstr "Netscape" -#: app/preferences_dialog.c:1808 +#: app/preferences_dialog.c:1919 msgid "Help Browser to Use:" msgstr "Programm zum Lesen der Hilfe:" -#: app/preferences_dialog.c:1813 +#: app/preferences_dialog.c:1924 msgid "Image Windows Settings" msgstr "Bildfenster Einstellungen" -#: app/preferences_dialog.c:1815 +#: app/preferences_dialog.c:1926 msgid "Image Windows" msgstr "Bildfenster" -#: app/preferences_dialog.c:1823 +#: app/preferences_dialog.c:1934 msgid "Appearance" msgstr "Aussehen" -#: app/preferences_dialog.c:1825 +#: app/preferences_dialog.c:1936 msgid "Use \"Dot for Dot\" by default" msgstr "Benutze standardmäßig \"Punkt für Punkt\"" -#: app/preferences_dialog.c:1834 +#: app/preferences_dialog.c:1945 msgid "Resize Window on Zoom" msgstr "Verändere Fenstergröße beim Zoomen" -#: app/preferences_dialog.c:1843 +#: app/preferences_dialog.c:1954 msgid "Show Rulers" msgstr "Zeige Lineale" -#: app/preferences_dialog.c:1852 +#: app/preferences_dialog.c:1963 msgid "Show Statusbar" msgstr "Zeige Statusanzeige" -#: app/preferences_dialog.c:1876 +#: app/preferences_dialog.c:1987 msgid "Marching Ants Speed:" msgstr "Geschwindigkeit der laufenden Ameisen:" #. Set the currently used string as "Custom" -#: app/preferences_dialog.c:1884 +#: app/preferences_dialog.c:1995 msgid "Custom" msgstr "Eigene" #. set some commonly used format strings -#: app/preferences_dialog.c:1890 +#: app/preferences_dialog.c:2001 msgid "Standard" msgstr "Standard" -#: app/preferences_dialog.c:1895 +#: app/preferences_dialog.c:2006 msgid "Show zoom percentage" msgstr "Vergrößerung prozentual" -#: app/preferences_dialog.c:1900 +#: app/preferences_dialog.c:2011 msgid "Show zoom ratio" msgstr "Vergrößerung als Verhältnis" -#: app/preferences_dialog.c:1905 +#: app/preferences_dialog.c:2016 msgid "Show reversed zoom ratio" msgstr "Vergrößerung als umgekehrtes Verhältnis" -#: app/preferences_dialog.c:1916 +#: app/preferences_dialog.c:2027 msgid "Image Title Format:" msgstr "Bildtitel Format:" #. End of the title format string -#: app/preferences_dialog.c:1919 +#: app/preferences_dialog.c:2030 msgid "Pointer Movement Feedback" msgstr "Zeigerbewegung" -#: app/preferences_dialog.c:1922 +#: app/preferences_dialog.c:2033 msgid "Perfect-but-Slow Pointer Tracking" msgstr "Genaue aber langsame Mauszeigernachführung" -#: app/preferences_dialog.c:1931 +#: app/preferences_dialog.c:2042 msgid "Disable Cursor Updating" msgstr "Deaktiviere Mauszeigeränderungen" -#: app/preferences_dialog.c:1943 +#: app/preferences_dialog.c:2054 msgid "Tool Options Settings" msgstr "Werkzeug Einstellungen" -#: app/preferences_dialog.c:1945 app/tools.c:978 +#: app/preferences_dialog.c:2056 app/tools.c:985 msgid "Tool Options" msgstr "Werkzeug Einstellungen" -#: app/preferences_dialog.c:1953 +#: app/preferences_dialog.c:2064 msgid "Paint Options" msgstr "Pinsel Einstellungen" -#: app/preferences_dialog.c:1956 +#: app/preferences_dialog.c:2067 msgid "Use Global Paint Options" msgstr "Benutze globale Pinseleinstellungen" -#: app/preferences_dialog.c:1971 +#: app/preferences_dialog.c:2082 msgid "Environment Settings" msgstr "Umgebung Einstellungen" -#: app/preferences_dialog.c:1973 +#: app/preferences_dialog.c:2084 msgid "Environment" msgstr "Umgebung" -#: app/preferences_dialog.c:1981 +#: app/preferences_dialog.c:2092 msgid "Resource Consumption" msgstr "Ressourcenverbrauch" -#: app/preferences_dialog.c:1983 +#: app/preferences_dialog.c:2094 msgid "Conservative Memory Usage" msgstr "Zurückhaltende Speicherausnutzung" -#: app/preferences_dialog.c:2010 +#: app/preferences_dialog.c:2122 msgid "Levels of Undo:" msgstr "Stufen der Rückgängigmachung:" -#: app/preferences_dialog.c:2053 +#: app/preferences_dialog.c:2165 msgid "Tile Cache Size:" msgstr "Größe des Datenspeichers:" -#: app/preferences_dialog.c:2063 +#: app/preferences_dialog.c:2175 msgid "Number of Processors to Use:" msgstr "Zahl der zu benutzenden Prozessoren:" -#: app/preferences_dialog.c:2067 app/transform_tool.c:215 +#: app/preferences_dialog.c:2179 app/transform_tool.c:215 msgid "Scaling" msgstr "Skalierung" -#: app/preferences_dialog.c:2085 +#: app/preferences_dialog.c:2197 msgid "Nearest Neighbor (Fast)" msgstr "Nächster Nachbar (schnell)" -#: app/preferences_dialog.c:2089 +#: app/preferences_dialog.c:2201 msgid "Cubic (Slow)" msgstr "Kubisch (langsam)" -#: app/preferences_dialog.c:2094 +#: app/preferences_dialog.c:2206 msgid "Interpolation Type:" msgstr "Interpolationsart:" -#: app/preferences_dialog.c:2097 +#: app/preferences_dialog.c:2209 msgid "File Saving" -msgstr "Dateien Speichern" +msgstr "Dateien Sichern" -#: app/preferences_dialog.c:2114 app/preferences_dialog.c:2127 +#: app/preferences_dialog.c:2226 app/preferences_dialog.c:2239 msgid "Always" msgstr "Immer" -#: app/preferences_dialog.c:2115 +#: app/preferences_dialog.c:2227 msgid "Never" msgstr "Nie" -#: app/preferences_dialog.c:2119 +#: app/preferences_dialog.c:2231 msgid "Try to Write a Thumbnail File:" msgstr "Schreibe Vorschau-Dateien:" -#: app/preferences_dialog.c:2126 -msgid "Only when modified" +#: app/preferences_dialog.c:2238 +msgid "Only when Modified" msgstr "Nur wenn verändert" -#: app/preferences_dialog.c:2131 -msgid "'File > Save' saves the image:" -msgstr "'Datei > Speichern' speichert das Bild:" +#: app/preferences_dialog.c:2243 +msgid "\"File > Save\" Saves the Image:" +msgstr "\"Datei > Sichern\" sichert das Bild:" -#: app/preferences_dialog.c:2137 +#: app/preferences_dialog.c:2249 msgid "Session Management" msgstr "Sitzungsmanagement" -#: app/preferences_dialog.c:2139 +#: app/preferences_dialog.c:2251 msgid "Session" msgstr "Sitzung" -#: app/preferences_dialog.c:2147 +#: app/preferences_dialog.c:2259 msgid "Window Positions" msgstr "Fensterpositionen" -#: app/preferences_dialog.c:2149 +#: app/preferences_dialog.c:2261 msgid "Save Window Positions on Exit" msgstr "Sichere Fensterpositionen beim Beenden" -#: app/preferences_dialog.c:2163 +#: app/preferences_dialog.c:2275 msgid "Clear Saved Window Positions Now" msgstr "Lösche gesicherte Fensterpositionen jetzt" -#: app/preferences_dialog.c:2170 +#: app/preferences_dialog.c:2282 msgid "Always Try to Restore Session" msgstr "Versuche immer Sitzung wiederherzustellen" -#: app/preferences_dialog.c:2179 +#: app/preferences_dialog.c:2291 msgid "Devices" msgstr "Geräte" -#: app/preferences_dialog.c:2181 +#: app/preferences_dialog.c:2293 msgid "Save Device Status on Exit" msgstr "Sichere Gerätestatus beim Beenden" -#: app/preferences_dialog.c:2192 +#: app/preferences_dialog.c:2304 msgid "Monitor Information" msgstr "Monitor Informationen" -#: app/preferences_dialog.c:2194 +#: app/preferences_dialog.c:2306 msgid "Monitor" msgstr "Monitor" -#: app/preferences_dialog.c:2202 +#: app/preferences_dialog.c:2314 msgid "Get Monitor Resolution" msgstr "Quelle für Monitorauflösung" -#: app/preferences_dialog.c:2210 +#: app/preferences_dialog.c:2322 #, c-format msgid "(Currently %d x %d dpi)" msgstr "(Zur Zeit %d x %d dpi)" -#: app/preferences_dialog.c:2257 +#: app/preferences_dialog.c:2369 msgid "From X Server" msgstr "Vom X Server" -#: app/preferences_dialog.c:2272 +#: app/preferences_dialog.c:2384 msgid "Manually:" msgstr "Manuell:" -#: app/preferences_dialog.c:2285 +#: app/preferences_dialog.c:2397 msgid "Directories Settings" msgstr "Verzeichnisse Einstellungen" -#: app/preferences_dialog.c:2287 +#: app/preferences_dialog.c:2399 msgid "Directories" msgstr "Verzeichnisse" -#: app/preferences_dialog.c:2304 +#: app/preferences_dialog.c:2416 msgid "Temp Dir:" msgstr "Temporäres Verzeichnis:" -#: app/preferences_dialog.c:2304 +#: app/preferences_dialog.c:2416 msgid "Select Temp Dir" msgstr "Temporäres Verzeichnis auswählen" -#: app/preferences_dialog.c:2305 +#: app/preferences_dialog.c:2417 msgid "Swap Dir:" msgstr "Auslagerungsverzeichnis:" -#: app/preferences_dialog.c:2305 +#: app/preferences_dialog.c:2417 msgid "Select Swap Dir" msgstr "Auslagerverzeichnis auswählen" -#: app/preferences_dialog.c:2341 +#: app/preferences_dialog.c:2453 msgid "Brushes Directories" msgstr "Pinselverzeichnisse" -#: app/preferences_dialog.c:2343 +#: app/preferences_dialog.c:2455 msgid "Select Brushes Dir" msgstr "Pinselverzeichnis auswählen" -#: app/preferences_dialog.c:2345 +#: app/preferences_dialog.c:2457 msgid "Generated Brushes" msgstr "Erzeugte Pinsel" -#: app/preferences_dialog.c:2345 +#: app/preferences_dialog.c:2457 msgid "Generated Brushes Directories" msgstr "Erzeugte Pinsel Verzeichnisse" -#: app/preferences_dialog.c:2347 +#: app/preferences_dialog.c:2459 msgid "Select Generated Brushes Dir" msgstr "Wähle Verzeichnis für erzeugte Pinsel auswählen" -#: app/preferences_dialog.c:2349 +#: app/preferences_dialog.c:2461 msgid "Patterns Directories" msgstr "Musterverzeichnisse" -#: app/preferences_dialog.c:2351 +#: app/preferences_dialog.c:2463 msgid "Select Patterns Dir" msgstr "Musterverzeichnis auswählen" -#: app/preferences_dialog.c:2353 +#: app/preferences_dialog.c:2465 msgid "Palettes Directories" msgstr "Palettenverzeichnisse" -#: app/preferences_dialog.c:2355 +#: app/preferences_dialog.c:2467 msgid "Select Palettes Dir" msgstr "Palettenverzeichnis auswählen" -#: app/preferences_dialog.c:2357 +#: app/preferences_dialog.c:2469 msgid "Gradients Directories" msgstr "Farbverlaufverzeichnisse" -#: app/preferences_dialog.c:2359 +#: app/preferences_dialog.c:2471 msgid "Select Gradients Dir" msgstr "Farbverlaufverzeichnis auswählen" -#: app/preferences_dialog.c:2361 +#: app/preferences_dialog.c:2473 msgid "Plug-Ins" msgstr "Plugins" -#: app/preferences_dialog.c:2361 +#: app/preferences_dialog.c:2473 msgid "Plug-Ins Directories" msgstr "Plugins-Verzeichnisse" -#: app/preferences_dialog.c:2363 +#: app/preferences_dialog.c:2475 msgid "Select Plug-Ins Dir" msgstr "Plugins-Verzeichnis auswählen" -#: app/preferences_dialog.c:2365 +#: app/preferences_dialog.c:2477 msgid "Modules" msgstr "Module" -#: app/preferences_dialog.c:2365 +#: app/preferences_dialog.c:2477 msgid "Modules Directories" msgstr "Modulverzeichnisse" -#: app/preferences_dialog.c:2367 +#: app/preferences_dialog.c:2479 msgid "Select Modules Dir" msgstr "Modulverzeichnis auswählen" @@ -5231,32 +5246,32 @@ msgstr "GIMP Erweiterung" msgid "Temporary Procedure" msgstr "Vorläufige Prozedur" -#: app/qmask.c:249 +#: app/qmask.c:273 msgid "Edit Qmask Attributes" msgstr "QMask Attribute verändern" #. The opacity scale -#: app/qmask.c:277 +#: app/qmask.c:301 msgid "Mask Opacity:" msgstr "Maskendeckkraft:" -#: app/rect_select.c:180 +#: app/rect_select.c:182 msgid "Selection: ADD" msgstr "Auswahl: Hinzufügen" -#: app/rect_select.c:183 +#: app/rect_select.c:185 msgid "Selection: SUBTRACT" msgstr "Auswahl: Abziehen" -#: app/rect_select.c:186 +#: app/rect_select.c:188 msgid "Selection: INTERSECT" msgstr "Auswahl: Schnittmenge" -#: app/rect_select.c:189 +#: app/rect_select.c:191 msgid "Selection: REPLACE" msgstr "Auswahl: Ersetzen" -#: app/rect_select.c:405 app/rect_select.c:412 +#: app/rect_select.c:407 app/rect_select.c:414 msgid "Selection: " msgstr "Auswahl: " @@ -5348,33 +5363,33 @@ msgstr "Scherneigung X:" msgid "Shearing..." msgstr "Scherung..." -#: app/text_tool.c:147 +#: app/text_tool.c:150 msgid "Text Tool Options" msgstr "Textwerkzeug Einstellungen" -#: app/text_tool.c:158 app/tool_options.c:205 +#: app/text_tool.c:161 app/tool_options.c:205 msgid "Antialiasing" msgstr "Kantenglättung" -#: app/text_tool.c:172 +#: app/text_tool.c:175 msgid "Border:" msgstr "Rand:" -#: app/text_tool.c:198 +#: app/text_tool.c:201 msgid "Use Dynamic Text" msgstr "Dynamischen Text benutzen" #. Create the shell -#: app/text_tool.c:389 +#: app/text_tool.c:392 msgid "Text Tool" msgstr "Textwerkzeug" -#: app/text_tool.c:604 +#: app/text_tool.c:616 #, c-format msgid "Font '%s' not found.%s" msgstr "Schrift '%s' nicht gefunden.%s" -#: app/text_tool.c:607 +#: app/text_tool.c:619 msgid "" "\n" "If you don't have scalable fonts, try turning off antialiasing in the tool " @@ -5384,7 +5399,7 @@ msgstr "" "Wenn Sie keine skalierbaren Schriften haben, versuchen Sie die Option " "Kantenglättung des Textwerkzeugs auszuschalten." -#: app/text_tool.c:718 +#: app/text_tool.c:730 msgid "Text Layer" msgstr "Text Ebene" @@ -5663,7 +5678,11 @@ msgstr "Transformation" msgid "/Tools/Transform" msgstr "/Werkzeuge/Transformation" -#: app/tools.c:233 app/tools.c:249 app/tools.c:265 app/tools.c:281 +#: app/tools.c:233 +msgid "Rotation, scaling, shearing, perspective." +msgstr "" + +#: app/tools.c:249 app/tools.c:265 app/tools.c:281 msgid "Transform the layer or selection" msgstr "Transformiert die Ebene oder Auswahl" @@ -5959,6 +5978,10 @@ msgstr "" msgid "Transformation" msgstr "Transformation" +#: app/transform_core.c:1586 +msgid "transform_core_paste: layer_new_frome_tiles() failed" +msgstr "" + #: app/transform_tool.c:190 msgid "Transform Tool Options" msgstr "Transformationswerkzeug Einstellungen" @@ -6025,191 +6048,191 @@ msgstr "[ Basisbild ]" msgid "Redo" msgstr "Wiederholen" -#: app/undo.c:2829 +#: app/undo.c:2832 #, c-format msgid "Can't undo %s" msgstr "Kann %s nicht rückgängig machen" -#: app/undo.c:2857 +#: app/undo.c:2860 msgid "<>" msgstr "<>" -#: app/undo.c:2858 +#: app/undo.c:2861 msgid "image" msgstr "Bild" -#: app/undo.c:2859 +#: app/undo.c:2862 msgid "image mod" msgstr "Bildveränderung" -#: app/undo.c:2860 +#: app/undo.c:2863 msgid "mask" msgstr "Maske" -#: app/undo.c:2861 +#: app/undo.c:2864 msgid "layer move" msgstr "Ebene verschieben" #. ok -#: app/undo.c:2862 +#: app/undo.c:2865 msgid "transform" msgstr "Transformation" -#: app/undo.c:2863 +#: app/undo.c:2866 msgid "paint" msgstr "Zeichnen" -#: app/undo.c:2864 +#: app/undo.c:2867 msgid "new layer" msgstr "Neue Ebene" -#: app/undo.c:2865 +#: app/undo.c:2868 msgid "delete layer" msgstr "Ebene löschen" -#: app/undo.c:2866 +#: app/undo.c:2869 msgid "layer mod" msgstr "Ebenenveränderung" -#: app/undo.c:2867 +#: app/undo.c:2870 msgid "add layer mask" msgstr "Ebenenmaske hinzufügen" #. ok -#: app/undo.c:2868 +#: app/undo.c:2871 msgid "delete layer mask" msgstr "Ebenenmaske löschen" #. ok -#: app/undo.c:2869 +#: app/undo.c:2872 msgid "rename layer" msgstr "Ebene umbenennen" -#: app/undo.c:2870 +#: app/undo.c:2873 msgid "layer reposition" msgstr "Ebene neu positionieren" #. ok -#: app/undo.c:2871 +#: app/undo.c:2874 msgid "new channel" msgstr "Neuer Kanal" -#: app/undo.c:2872 +#: app/undo.c:2875 msgid "delete channel" msgstr "Kanal löschen" -#: app/undo.c:2873 +#: app/undo.c:2876 msgid "channel mod" msgstr "Kanalveränderung" -#: app/undo.c:2874 +#: app/undo.c:2877 msgid "FS to layer" msgstr "Schwebende Auswahl -> Ebene" #. ok -#: app/undo.c:2875 +#: app/undo.c:2878 msgid "gimage" msgstr "Bild" -#: app/undo.c:2876 +#: app/undo.c:2879 msgid "FS rigor" msgstr "" -#: app/undo.c:2877 +#: app/undo.c:2880 msgid "FS relax" msgstr "" -#: app/undo.c:2878 +#: app/undo.c:2881 msgid "guide" msgstr "Hilfslinie" -#: app/undo.c:2879 +#: app/undo.c:2882 msgid "text" msgstr "Text" -#: app/undo.c:2880 +#: app/undo.c:2883 msgid "float selection" msgstr "Schwebende Auswahl" -#: app/undo.c:2881 +#: app/undo.c:2884 msgid "paste" msgstr "Einfügen" -#: app/undo.c:2882 +#: app/undo.c:2885 msgid "cut" msgstr "Ausschneiden" -#: app/undo.c:2883 +#: app/undo.c:2886 msgid "transform core" msgstr "Transformation" -#: app/undo.c:2884 +#: app/undo.c:2887 msgid "paint core" msgstr "Zeichenwerkzeug" -#: app/undo.c:2885 +#: app/undo.c:2888 msgid "floating layer" msgstr "Schwebende Ebene" #. unused! -#: app/undo.c:2886 +#: app/undo.c:2889 msgid "linked layer" msgstr "" -#: app/undo.c:2887 +#: app/undo.c:2890 msgid "apply layer mask" msgstr "Ebenenmaske anwenden" #. ok -#: app/undo.c:2888 +#: app/undo.c:2891 msgid "layer merge" msgstr "Ebenen vereinen" -#: app/undo.c:2889 +#: app/undo.c:2892 msgid "FS anchor" msgstr "Schwebende Auswahl verankern" -#: app/undo.c:2890 +#: app/undo.c:2893 msgid "gimage mod" msgstr "" -#: app/undo.c:2891 +#: app/undo.c:2894 msgid "crop" msgstr "Zuschneiden" -#: app/undo.c:2892 +#: app/undo.c:2895 msgid "layer scale" msgstr "Ebene skalieren" -#: app/undo.c:2893 +#: app/undo.c:2896 msgid "layer resize" msgstr "Ebenengröße verändern" -#: app/undo.c:2894 +#: app/undo.c:2897 msgid "quickmask" msgstr "QMask" -#: app/undo.c:2895 +#: app/undo.c:2898 msgid "attach parasite" msgstr "Parasit zuweisen" -#: app/undo.c:2896 +#: app/undo.c:2899 msgid "remove parasite" msgstr "Parasit entfernen" -#: app/undo.c:2897 +#: app/undo.c:2900 msgid "resolution change" msgstr "Auflösung verändern" -#: app/undo.c:2898 +#: app/undo.c:2901 msgid "image scale" msgstr "Bild skalieren" -#: app/undo.c:2899 +#: app/undo.c:2902 msgid "image resize" msgstr "Bildgröße verändern" -#: app/undo.c:2900 +#: app/undo.c:2903 msgid "misc" msgstr "Verschiedenes" @@ -6225,19 +6248,18 @@ msgid "" "Substituting grayscale map." msgstr "" "XCF Warnung: Version 0 des XCF Dateiformats\n" -"hat indizierte Farbpaletten falsch gespeichert.\n" +"hat indizierte Farbpaletten falsch gesichert.\n" "Farben wurden durch Graustufen ersetzt." #. flow slider #: app/xinput_airbrush.c:322 -#, fuzzy msgid "Flow Relation:" -msgstr "Fluss:" +msgstr "Flussmenge:" #. flow sens slider #: app/xinput_airbrush.c:341 msgid "Flow Sensitivity:" -msgstr "Fluss Empfindl.:" +msgstr "Flussempfindl.:" #. base tilt slider #: app/xinput_airbrush.c:361 @@ -6280,11 +6302,11 @@ msgstr "Gamma:" msgid "GTK colour selector as a pluggable colour selector" msgstr "Standard GTK Farbauswahl als ladbares Modul" -#: modules/colorsel_triangle.c:79 +#: modules/colorsel_triangle.c:78 msgid "Painter-style colour selector as a pluggable colour selector" msgstr "Farbauswahl im Stil von Painter als ladbares Modul" -#: modules/colorsel_triangle.c:148 modules/colorsel_triangle.c:150 +#: modules/colorsel_triangle.c:147 modules/colorsel_triangle.c:149 msgid "Triangle" msgstr "Dreieck" @@ -6299,21 +6321,3 @@ msgstr "Wasserfarbe" #: modules/colorsel_water.c:640 msgid "Color History" msgstr "Farbliste" - -#~ msgid "/Xtns/Perl-Fu" -#~ msgstr "/Xtns/Perl-Fu" - -#~ msgid "/Xtns/Perl-Fu/Logos" -#~ msgstr "/Xtns/Perl-Fu/Logos" - -#~ msgid "/Xtns/Perl" -#~ msgstr "/Xtns/Perl" - -#~ msgid "/Xtns/Render" -#~ msgstr "/Xtns/Render" - -#~ msgid "/Xtns/Render/Logos" -#~ msgstr "/Xtns/Render/Logos" - -#~ msgid "/Xtns/Render/Povray" -#~ msgstr "/Xtns/Render/Povray"