[PATCH] CAIRO_FILTER_BEST uses NEAREST filter when possible

Bill Spitzak <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
This avoids slow filtering for identity transforms when BEST is used.
Pixman is already handling the GOOD case.
---
 src/cairo-image-source.c |   19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
index b6b6b9f..3d10953 100644
--- a/src/cairo-image-source.c
+++ b/src/cairo-image-source.c
@@ -955,6 +955,25 @@ _pixman_image_set_properties (pixman_image_t *pixman_image,
 	    }
 	    break;
 	case CAIRO_FILTER_BEST:
+	    /* Check for 1:1 pixel transfer and use NEAREST for that */
+	    if (_cairo_fixed_is_integer (_cairo_fixed_from_double
+					 (pattern->matrix.x0)) &&
+		_cairo_fixed_is_integer (_cairo_fixed_from_double
+					 (pattern->matrix.y0))) {
+		cairo_fixed_t xx = _cairo_fixed_from_double(pattern->matrix.xx);
+		cairo_fixed_t xy = _cairo_fixed_from_double(pattern->matrix.xy);
+		cairo_fixed_t yx = _cairo_fixed_from_double(pattern->matrix.yx);
+		cairo_fixed_t yy = _cairo_fixed_from_double(pattern->matrix.yy);
+		if ((xy == 0 && yx == 0 &&
+		     abs(xx) == CAIRO_FIXED_ONE &&
+		     abs(yy) == CAIRO_FIXED_ONE) ||
+		    (xx == 0 && yy == 0 &&
+		     abs(xy) == CAIRO_FIXED_ONE &&
+		     abs(yx) == CAIRO_FIXED_ONE)) {
+		    pixman_filter = PIXMAN_FILTER_NEAREST;
+		    break;
+		}
+	    }
 	    pixman_filter = PIXMAN_FILTER_BEST;
 	    pixman_filter = PIXMAN_FILTER_SEPARABLE_CONVOLUTION;
 	    kernel = KERNEL_CATMULL_ROM; /* LANCZOS3 is better but not much */
-- 
1.7.9.5

-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.