From aae78bea4700a3ab02cef725436e7e12103fcc02 Mon Sep 17 00:00:00 2001 From: Benjamin Gilbert Date: Sat, 3 Sep 2022 19:02:16 -0400 Subject: [PATCH] Fix bilinear filter computation in wide pipeline pixman 0.38.x has a regression that causes incorrect rendering in some circumstances. This can be triggered by the use of cairo with CAIRO_OPERATOR_SATURATE and subpixel positioning, and causes OpenSlide to produce incorrect output. This patch is a cherry-pick of [1], rebasing it on top of `c8s`. It backports commit 8256c235d9b3 ("Fix bilinear filter computation in wide pipeline") [2] from pixman 0.40.0 to fix the mentioned regression. At the moment of writing this, pixman's version is: - Fedora: 0.42.2 - CentOS Stream 9: 0.40.0 - CentOS Stream 8: 0.38.4 Therefore, CentOS Stream 8 needs to be patched. A reproducer can be found in the original bug report [3]. [1] https://gitlab.com/redhat/centos-stream/rpms/pixman/-/merge_requests/2 [2] https://gitlab.freedesktop.org/pixman/pixman/-/commit/8256c235d9b3854d039242356905eca854a890ba [3] https://bugzilla.redhat.com/show_bug.cgi?id=2124013 Resolves: https://issues.redhat.com/browse/RHEL-3061 --- ...-filter-computation-in-wide-pipeline.patch | 84 +++++++++++++++++++ pixman.spec | 6 +- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch diff --git a/0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch b/0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch new file mode 100644 index 0000000..84a6301 --- /dev/null +++ b/0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch @@ -0,0 +1,84 @@ +From 8256c235d9b3854d039242356905eca854a890ba Mon Sep 17 00:00:00 2001 +From: Basile Clement +Date: Tue, 9 Apr 2019 23:16:13 +0200 +Subject: [PATCH] Fix bilinear filter computation in wide pipeline + +The recently introduced wide pipeline for filters has a typo which +causes it to improperly compute bilinear interpolation positions, +causing various glitches when enabled. + +This patch uses the proper computation for bilinear interpolation in the +wide pipeline. It also makes related `if` statements conformant to the +CODING_STYLE: + +* If a substatement spans multiple lines, then there must be braces + around it. + +* If one substatement of an if statement has braces, then the other + must too. + +Signed-off-by: Maarten Lankhorst +--- + pixman/pixman-bits-image.c | 9 +++++++++ + pixman/pixman-inlines.h | 2 +- + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/pixman/pixman-bits-image.c b/pixman/pixman-bits-image.c +index 564789e..7bc2ba8 100644 +--- a/pixman/pixman-bits-image.c ++++ b/pixman/pixman-bits-image.c +@@ -432,29 +432,38 @@ bits_image_fetch_pixel_filtered (bits_image_t *image, + + case PIXMAN_FILTER_CONVOLUTION: + if (wide) ++ { + bits_image_fetch_pixel_convolution (image, x, y, + get_pixel, out, + accum_float, + reduce_float); ++ } + else ++ { + bits_image_fetch_pixel_convolution (image, x, y, + get_pixel, out, + accum_32, reduce_32); ++ } + break; + + case PIXMAN_FILTER_SEPARABLE_CONVOLUTION: + if (wide) ++ { + bits_image_fetch_pixel_separable_convolution (image, x, y, + get_pixel, out, + accum_float, + reduce_float); ++ } + else ++ { + bits_image_fetch_pixel_separable_convolution (image, x, y, + get_pixel, out, + accum_32, reduce_32); ++ } + break; + + default: ++ assert (0); + break; + } + } +diff --git a/pixman/pixman-inlines.h b/pixman/pixman-inlines.h +index 332e208..f785910 100644 +--- a/pixman/pixman-inlines.h ++++ b/pixman/pixman-inlines.h +@@ -231,7 +231,7 @@ bilinear_interpolation_float (argb_t tl, argb_t tr, + argb_t r; + + distxy = distx * disty; +- distxiy = distx - (1.f - distxy); ++ distxiy = distx * (1.f - disty); + distixy = (1.f - distx) * disty; + distixiy = (1.f - distx) * (1.f - disty); + +-- +2.37.1 + diff --git a/pixman.spec b/pixman.spec index b6244a1..c317e21 100644 --- a/pixman.spec +++ b/pixman.spec @@ -3,7 +3,7 @@ Name: pixman Version: 0.38.4 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Pixel manipulation library Group: System Environment/Libraries @@ -17,6 +17,7 @@ Source0: https://xorg.freedesktop.org/archive/individual/lib/%{name}-%{ve Source1: make-pixman-snapshot.sh Patch0: 0001-Initialize-temporary-buffers-in-general_composite_re.patch +Patch1: 0001-Fix-bilinear-filter-computation-in-wide-pipeline.patch BuildRequires: automake autoconf libtool BuildRequires: gcc @@ -68,6 +69,9 @@ make check %{?_smp_mflags} V=1 %{_libdir}/pkgconfig/pixman-1.pc %changelog +* Sat Sep 03 2022 Benjamin Gilbert - 0.38.4-3 +- Fix bilinear filter computation in wide pipeline + * Tue Feb 22 2022 Adam Jackson - 0.38.4-2 - Backport the pixman part of cairo CVE-2020-35492