[cairo] [PATCH 1/2] Minor fixes in the new downscaling code.

Krzysztof Kosiński tweenk.pl at gmail.com
Wed Mar 12 18:01:02 PDT 2014


This adresses issues brought up on the mailing list. If we use
a non-impulse samping kernel, there is no need to use anything
more sophisticated than box reconstruction. Similarly, using
a non-box reconstruction kernel is OK with impulse sampling.

Also addressed is PIXMAN_FILTER_BEST, which previously fell through
to the default case.

Signed-off-by: Krzysztof Kosiński <tweenk.pl at gmail.com>
---
 src/cairo-image-source.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
index 661bc10..fcd7801 100644
--- a/src/cairo-image-source.c
+++ b/src/cairo-image-source.c
@@ -590,6 +590,7 @@ _pixman_image_set_properties (pixman_image_t *pixman_image,
 	    pixman_filter = PIXMAN_FILTER_BEST;
 	    pixman_kernel_sample = PIXMAN_KERNEL_LANCZOS3;
 	    pixman_kernel_reconstruct = PIXMAN_KERNEL_LANCZOS3;
+	    break;
 	case CAIRO_FILTER_GAUSSIAN:
 	    /* XXX: The GAUSSIAN value has no implementation in cairo
 	     * whatsoever, so it was really a mistake to have it in the
@@ -604,18 +605,31 @@ _pixman_image_set_properties (pixman_image_t *pixman_image,
 
 	if (pixman_filter != PIXMAN_FILTER_NEAREST && (shrink_x || shrink_y)) {
 	    pixman_kernel_t sampling_kernel_x, sampling_kernel_y;
+	    pixman_kernel_t reconstruction_kernel_x, reconstruction_kernel_y;
 	    int n_params;
 	    pixman_fixed_t *params;
 
-	    sampling_kernel_x = shrink_x ? pixman_kernel_sample : PIXMAN_KERNEL_IMPULSE;
-	    sampling_kernel_y = shrink_y ? pixman_kernel_sample : PIXMAN_KERNEL_IMPULSE;
+	    if (shrink_x) {
+		sampling_kernel_x = pixman_kernel_sample;
+		reconstruction_kernel_x = PIXMAN_KERNEL_BOX;
+	    } else {
+		sampling_kernel_x = PIXMAN_KERNEL_IMPULSE;
+		reconstruction_kernel_x = pixman_kernel_reconstruct;
+	    }
+	    if (shrink_y) {
+		sampling_kernel_y = pixman_kernel_sample;
+		reconstruction_kernel_y = PIXMAN_KERNEL_BOX;
+	    } else {
+		sampling_kernel_y = PIXMAN_KERNEL_IMPULSE;
+		reconstruction_kernel_y = pixman_kernel_reconstruct;
+	    }
 
 	    n_params = 0;
 	    params = pixman_filter_create_separable_convolution (&n_params,
 								 scale_x * 65536.0 + 0.5,
 								 scale_y * 65536.0 + 0.5,
-								 pixman_kernel_reconstruct,
-								 pixman_kernel_reconstruct,
+								 reconstruction_kernel_x,
+								 reconstruction_kernel_y,
 								 sampling_kernel_x,
 								 sampling_kernel_y,
 								 1, 1);
-- 
1.8.3.2



More information about the cairo mailing list