[cairo] [PATCH] CAIRO_FILTER_BEST uses NEAREST filter when possible
Bill Spitzak
spitzak at gmail.com
Fri Aug 1 19:25:22 PDT 2014
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
More information about the cairo
mailing list