diff options
author | V3n3RiX <venerix@koprulu.sector> | 2024-04-08 18:31:11 +0100 |
---|---|---|
committer | V3n3RiX <venerix@koprulu.sector> | 2024-04-08 18:31:11 +0100 |
commit | c510d9ec7aca9b092e381a7a4ff213757c7a9709 (patch) | |
tree | 761e15713e0c17f3211dc12e0dd9a82d5a96c1c8 /net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch | |
parent | 2cfe62a1f75cfb07a50f631f29d56bff5d09bf47 (diff) |
gentoo auto-resync : 08:04:2024 - 18:31:11
Diffstat (limited to 'net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch')
-rw-r--r-- | net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch new file mode 100644 index 000000000000..37a8bce64d7b --- /dev/null +++ b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-color-space.patch @@ -0,0 +1,254 @@ +https://bugs.gentoo.org/927137 +https://github.com/OpenPrinting/cups-filters/issues/578 +https://github.com/OpenPrinting/libcupsfilters/commit/c6175a2f3f66dbf76bb35ec8d1ba0dc094c9dbac + +From c6175a2f3f66dbf76bb35ec8d1ba0dc094c9dbac Mon Sep 17 00:00:00 2001 +From: Till Kamppeter <till.kamppeter@gmail.com> +Date: Wed, 29 Nov 2023 00:25:16 +0100 +Subject: [PATCH] raster_base_header(): Several fixes on color space selection + +Fixes #38 + +The internal (static) funcrion raster_base_header() creates a CUPS or +PWG Raster header from scratch, without using data of a PPD file by +means of Raster header derived from the PPD. It solely uses IPP +attributes or command line options. + +It distinguishes between CUPS Raster and PWG/Apple Raster headers. + +There were several bugs in selecting the correct color space and depth +settings: + +- For PWG-Raster all attributes and options got ignored and standard + 8-bit sRGB set. + +- Without any valid color space/depth setting attribute or "auto" + always standard 8-bit sRGB got set as the default, regardless + whether the printer is actually a color printer. + +- Color spaces for printing in color could be set on monochrome + printers by options or atrributes. + +- Color spaces not valid on PWG Raster could be set on PWG Raster. + +- DeviceN modes could only be set by specifying a depth, like + "Device4_8" not just "Device4". + +Now we use 8-bit SGray as default for monochrome printers and 8-bit +RGB for color printers. We use the printer IPP attribute +"color-supported" to check whether the printer is color. + +IPP ttributes or command line options setting a color mode on a +monochrome printer are ignored now, also, if the output format is PWG +Raster, setting a color space not supported by PWG Raster is ignored. + +Now for monochrome AirPrint (Apple Raster) printers, the Raster data +sent should be actually monochrome (grayscale) and not color. +--- + cupsfilters/raster.c | 103 +++++++++++++++++++++++++------------------ + 1 file changed, 61 insertions(+), 42 deletions(-) + +diff --git a/cupsfilters/raster.c b/cupsfilters/raster.c +index 32a8b807..5e10f3bb 100644 +--- a/cupsfilters/raster.c ++++ b/cupsfilters/raster.c +@@ -792,7 +792,7 @@ cfRasterSetColorSpace(cups_page_header_t *h, // I - Raster header + + + static int // O - -1 on error, 0 on success +-raster_base_header(cups_page_header2_t *h, // O - Raster header ++raster_base_header(cups_page_header2_t *h, // O - Raster header + cf_filter_data_t *data, // I - Filter data + int pwg_raster) // I - 1 if PWG/Apple Raster + { +@@ -1420,41 +1420,46 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + // TODO - Support for MediaType number + h->cupsMediaType = 0; + +- // Only for CUPS Raster, if we do not have a sample header from a PPD file +- if (pwg_raster == 0 && +- ((val = cupsGetOption("pwg-raster-document-type", num_options, +- options)) != NULL || +- (val = cupsGetOption("PwgRasterDocumentType", num_options, +- options)) != NULL || +- (val = cupsGetOption("color-space", num_options, options)) != NULL || +- (val = cupsGetOption("ColorSpace", num_options, options)) != NULL || +- (val = cupsGetOption("color-model", num_options, options)) != NULL || +- (val = cupsGetOption("ColorModel", num_options, options)) != NULL || +- (val = cupsGetOption("print-color-mode", num_options, options)) != +- NULL || +- (val = cupsGetOption("output-mode", num_options, options)) != NULL || +- (val = cupsGetOption("OutputMode", num_options, options)) != NULL || +- (val = cfIPPAttrEnumValForPrinter(data->printer_attrs, +- data->job_attrs, +- "print-color-mode")) != NULL)) ++ ++ // Do we have a color printer? ++ bool is_color = ++ ((attr = ippFindAttribute(data->printer_attrs, "color-supported", ++ IPP_TAG_BOOLEAN)) != NULL && ++ ippGetBoolean(attr, 0)); ++ ++ // Color modes ++ int numcolors = 0; // Number of colorants ++ if ((val = cupsGetOption("pwg-raster-document-type", num_options, ++ options)) != NULL || ++ (val = cupsGetOption("PwgRasterDocumentType", num_options, ++ options)) != NULL || ++ (val = cupsGetOption("color-space", num_options, options)) != NULL || ++ (val = cupsGetOption("ColorSpace", num_options, options)) != NULL || ++ (val = cupsGetOption("color-model", num_options, options)) != NULL || ++ (val = cupsGetOption("ColorModel", num_options, options)) != NULL || ++ (val = cupsGetOption("print-color-mode", num_options, options)) != ++ NULL || ++ (val = cupsGetOption("output-mode", num_options, options)) != NULL || ++ (val = cupsGetOption("OutputMode", num_options, options)) != NULL || ++ (val = cfIPPAttrEnumValForPrinter(data->printer_attrs, ++ data->job_attrs, ++ "print-color-mode")) != NULL) + { + int bitspercolor, // Bits per color + bitsperpixel, // Bits per pixel +- colorspace, // CUPS/PWG raster color space +- numcolors; // Number of colorants ++ colorspace; // CUPS/PWG raster color space; + const char *ptr; // Pointer into value + + ptr = NULL; +- numcolors = 0; + bitspercolor = 8; +- if (!strncasecmp(val, "AdobeRgb", 8)) ++ if (is_color && !strncasecmp(val, "AdobeRgb", 8)) + { + if (*(val + 8) == '_' || *(val + 8) == '-') + ptr = val + 9; + colorspace = 20; + numcolors = 3; + } +- else if (!strncasecmp(val, "adobe-rgb", 9)) ++ else if (is_color && !strncasecmp(val, "adobe-rgb", 9)) + { + if (*(val + 9) == '_' || *(val + 9) == '-') + ptr = val + 10; +@@ -1500,19 +1505,19 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + colorspace = 18; + numcolors = 1; + } +- else if (!strcasecmp(val, "color")) ++ else if (is_color && !strcasecmp(val, "color")) + { + colorspace = 19; + numcolors = 3; + } +- else if (!strncasecmp(val, "Cmyk", 4)) ++ else if (is_color && !strncasecmp(val, "Cmyk", 4)) + { + if (*(val + 4) == '_' || *(val + 4) == '-') + ptr = val + 5; + colorspace = 6; + numcolors = 4; + } +- else if (!strncasecmp(val, "Cmy", 3)) ++ else if (!pwg_raster && is_color && !strncasecmp(val, "Cmy", 3)) + { + if (*(val + 3) == '_' || *(val + 3) == '-') + ptr = val + 4; +@@ -1524,10 +1529,9 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + ptr = val + 6; + numcolors = strtol(ptr, (char **)&ptr, 10); + if (*ptr == '_' || *ptr == '-') +- { + ptr ++; ++ if (numcolors > 0 && numcolors < 16) + colorspace = 47 + numcolors; +- } + else + { + numcolors = 0; +@@ -1548,21 +1552,21 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + colorspace = 18; + numcolors = 1; + } +- else if (!strncasecmp(val, "Srgb", 4)) ++ else if (is_color && !strncasecmp(val, "Srgb", 4)) + { + if (*(val + 4) == '_' || *(val + 4) == '-') + ptr = val + 5; + colorspace = 19; + numcolors = 3; + } +- else if (!strncasecmp(val, "Rgbw", 4)) ++ else if (!pwg_raster && is_color && !strncasecmp(val, "Rgbw", 4)) + { + if (*(val + 4) == '_' || *(val + 4) == '-') + ptr = val + 5; + colorspace = 17; + numcolors = 4; + } +- else if (!strncasecmp(val, "Rgb", 3)) ++ else if (is_color && !strncasecmp(val, "Rgb", 3)) + { + if (*(val + 3) == '_' || *(val + 3) == '-') + ptr = val + 4; +@@ -1572,12 +1576,22 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + else if (!strcasecmp(val, "auto")) + { + // Let "auto" not look like an error +- colorspace = 19; +- numcolors = 3; ++ if (is_color) ++ { ++ colorspace = 19; ++ numcolors = 3; ++ } ++ else ++ { ++ colorspace = 18; ++ numcolors = 1; ++ } + } ++ ++ // Color mode found + if (numcolors > 0) + { +- if (ptr) ++ if (ptr && *ptr) + bitspercolor = strtol(ptr, (char **)&ptr, 10); + bitsperpixel = bitspercolor * numcolors; + // In 1-bit-per-color RGB modes we add a forth bit to each pixel +@@ -1590,20 +1604,25 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + h->cupsColorSpace = colorspace; + h->cupsNumColors = numcolors; + } +- else ++ } ++ ++ // No color mode found ++ if (numcolors == 0) ++ { ++ if (is_color) + { + h->cupsBitsPerColor = 8; + h->cupsBitsPerPixel = 24; + h->cupsColorSpace = 19; + h->cupsNumColors = 3; + } +- } +- else +- { +- h->cupsBitsPerColor = 8; +- h->cupsBitsPerPixel = 24; +- h->cupsColorSpace = 19; +- h->cupsNumColors = 3; ++ else ++ { ++ h->cupsBitsPerColor = 8; ++ h->cupsBitsPerPixel = 8; ++ h->cupsColorSpace = 18; ++ h->cupsNumColors = 1; ++ } + } + + // TODO - Support for color orders 1 (banded) and 2 (planar) + + |