diff options
author | Sam James <sam@gentoo.org> | 2024-04-08 17:33:06 +0100 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-04-08 17:34:19 +0100 |
commit | c0d3a113d5842f182fb13f51e011a83bcfe791fe (patch) | |
tree | 8333e2bcbd689614ae36de75748b8ae7ec0f7c74 /net-print/libcupsfilters | |
parent | net-print/cups-filters: add bash workaround for now (diff) | |
download | gentoo-c0d3a113d5842f182fb13f51e011a83bcfe791fe.tar.gz gentoo-c0d3a113d5842f182fb13f51e011a83bcfe791fe.tar.bz2 gentoo-c0d3a113d5842f182fb13f51e011a83bcfe791fe.zip |
net-print/libcupsfilters: backport color vs. b/w fixes
Closes: https://bugs.gentoo.org/927137
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'net-print/libcupsfilters')
4 files changed, 409 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) + + diff --git a/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-build-fix.patch b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-build-fix.patch new file mode 100644 index 000000000000..c274b8473c47 --- /dev/null +++ b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-build-fix.patch @@ -0,0 +1,28 @@ +https://bugs.gentoo.org/927137 +https://github.com/OpenPrinting/cups-filters/issues/578 +https://github.com/OpenPrinting/libcupsfilters/commit/107091186dce1c0cb2f042f8b880f571089acaf1 + +From 107091186dce1c0cb2f042f8b880f571089acaf1 Mon Sep 17 00:00:00 2001 +From: zdohnal <zdohnal@redhat.com> +Date: Wed, 29 Nov 2023 13:30:48 +0100 +Subject: [PATCH] raster.c: Fix build after last fix (#40) + +Add header file `stdbool`, since we started to use `bool` in +`raster_base_header()`. +--- + cupsfilters/raster.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/cupsfilters/raster.c b/cupsfilters/raster.c +index 5e10f3bb..e9a8ad1f 100644 +--- a/cupsfilters/raster.c ++++ b/cupsfilters/raster.c +@@ -29,6 +29,7 @@ + #include <cupsfilters/ipp.h> + #include <cupsfilters/libcups2-private.h> + #include <cups/pwg.h> ++#include <stdbool.h> + + // + // Local functions + diff --git a/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-gray.patch b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-gray.patch new file mode 100644 index 000000000000..e1648c041e97 --- /dev/null +++ b/net-print/libcupsfilters/files/libcupsfilters-2.0.0-raster-gray.patch @@ -0,0 +1,50 @@ +https://bugs.gentoo.org/927137 +https://github.com/OpenPrinting/cups-filters/issues/578 +https://github.com/OpenPrinting/libcupsfilters/commit/78cc6758d98c31397c8addefaa3dfd8746331b72 + +From 78cc6758d98c31397c8addefaa3dfd8746331b72 Mon Sep 17 00:00:00 2001 +From: zdohnal <zdohnal@redhat.com> +Date: Thu, 7 Mar 2024 18:27:06 +0100 +Subject: [PATCH] raster.c: Always use sRGB/sGray if driver is PWG/URF and + RGB/Gray is requested (#51) + +Some driverless printers (EPSON L3160 in Fedora report) stopped working +after commit c6175a2 if `ColorModel=RGB` is passed as option. A +different CUPS color space is assigned with the fix - CUPS_CSPACE_RGB, +which results in no ICC profile being assigned into Ghostscript command +line. + +Probably we can try other .icc profiles with CUPS_CSPACE_RGB (srgb.icc +does not work with RGB color space), but I tested with reporter that +using sRGB space + srgb.icc works for the printer - so the patch is to +use sRGB if the driver is URF/PWG. + +Same logic applied for grayscale printing, if Gray is requested, sGray is +used for URF/PWG. +--- + cupsfilters/raster.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/cupsfilters/raster.c b/cupsfilters/raster.c +index e9a8ad1f..7b62b922 100644 +--- a/cupsfilters/raster.c ++++ b/cupsfilters/raster.c +@@ -1550,7 +1550,7 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + { + if (*(val + 4) == '_' || *(val + 4) == '-') + ptr = val + 5; +- colorspace = 18; ++ colorspace = pwg_raster ? 18 : 3; + numcolors = 1; + } + else if (is_color && !strncasecmp(val, "Srgb", 4)) +@@ -1571,7 +1571,7 @@ raster_base_header(cups_page_header_t *h, // O - Raster header + { + if (*(val + 3) == '_' || *(val + 3) == '-') + ptr = val + 4; +- colorspace = 1; ++ colorspace = pwg_raster ? 19 : 1; + numcolors = 3; + } + else if (!strcasecmp(val, "auto")) + diff --git a/net-print/libcupsfilters/libcupsfilters-2.0.0-r4.ebuild b/net-print/libcupsfilters/libcupsfilters-2.0.0-r4.ebuild new file mode 100644 index 000000000000..1d3b175d5905 --- /dev/null +++ b/net-print/libcupsfilters/libcupsfilters-2.0.0-r4.ebuild @@ -0,0 +1,77 @@ +# Copyright 2023-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit libtool + +DESCRIPTION="library for developing printing features, split out of cups-filters" +HOMEPAGE="https://github.com/OpenPrinting/libcupsfilters" +SRC_URI="https://github.com/OpenPrinting/libcupsfilters/releases/download/${PV}/${P}.tar.xz" + +LICENSE="Apache-2.0" +SLOT="0" +KEYWORDS="~amd64 ~arm ~arm64 ~hppa ~ia64 ~loong ~ppc ~ppc64 ~riscv ~sparc ~x86" +IUSE="dbus exif jpeg pdf +poppler +postscript png test tiff" +RESTRICT="!test? ( test )" + +RDEPEND=" + >=app-text/qpdf-8.3.0:= + media-libs/fontconfig + media-libs/lcms:2 + >=net-print/cups-2 + !<net-print/cups-filters-2.0.0 + + exif? ( media-libs/libexif ) + dbus? ( sys-apps/dbus ) + jpeg? ( media-libs/libjpeg-turbo:= ) + pdf? ( app-text/mupdf ) + postscript? ( app-text/ghostscript-gpl[cups] ) + poppler? ( >=app-text/poppler-0.32[cxx] ) + png? ( media-libs/libpng:= ) + tiff? ( media-libs/tiff:= ) +" +DEPEND="${RDEPEND}" +BDEPEND=" + >=sys-devel/gettext-0.18.3 + virtual/pkgconfig + test? ( media-fonts/dejavu ) +" + +PATCHES=( + "${FILESDIR}/${P}-r3-c++17.patch" + "${FILESDIR}/${P}-color-space.patch" + "${FILESDIR}/${P}-raster-build-fix.patch" + "${FILESDIR}/${P}-raster-gray.patch" +) + +src_prepare() { + default + + # respect --as-needed + elibtoolize +} + +src_configure() { + local myeconfargs=( + --enable-imagefilters + --localstatedir="${EPREFIX}"/var + --with-cups-rundir="${EPREFIX}"/run/cups + + $(use_enable exif) + $(use_enable dbus) + $(use_enable poppler) + $(use_enable postscript ghostscript) + $(use_enable pdf mutool) + $(use_with jpeg) + $(use_with png) + $(use_with tiff) + ) + + econf "${myeconfargs[@]}" +} + +src_install() { + default + find "${ED}" -name '*.la' -delete || die +} |