[cairo] [patch] quartz: align pixel when source/mask translation is either 1.0 or -1.0

Henry (Yu) Song - SISA hsong at sisa.samsung.com
Mon Jul 30 12:56:01 PDT 2012


Thanks Chris


On Mon, 30 Jul 2012 18:18:24 +0000, "Henry (Yu) Song - SISA" <hsong at sisa.samsung.com> wrote:
> I am not sure whether this should be a considered as a fix, or _cairo_matrix_is_abs_translation() should be moved to cairoint.h instead of in cairo-quartz-surface.c

I think _cairo_matrix_has_unity_scale() is the function you are looking
for.
-Chris

--
Chris Wilson, Intel Open Source Technology Centre


New patch


>From d5e97b2e25c78db3567edd854350ecfc712e5560 Mon Sep 17 00:00:00 2001
From: Henry Song <hsong at sisa.samsung.com>
Date: Mon, 30 Jul 2012 11:06:30 -0700
Subject: [PATCH] quartz: check matrix has unity scale . if filter is
 CAIRO_FILTER_NEAREST and has unity scale, we can align
 pixel for source/mask.  This fixes XFAIL case for
 filter-nearest-transformed

---
 src/cairo-quartz-surface.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 1e2bbec..dc1d804 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -1256,9 +1256,12 @@ _cairo_quartz_setup_state (cairo_quartz_drawing_state_t *state,
 
 	state->image = img;
 
-	if (state->filter == kCGInterpolationNone && _cairo_matrix_is_translation (&m)) {
-	    m.x0 = -ceil (m.x0 - 0.5);
-	    m.y0 = -ceil (m.y0 - 0.5);
+	/* if the filter is CAIRO_FILTER_NEAREST and the transformation
+	 * matrix scale is 1.0 or -1.0, we can align pixel
+	 */
+	if (state->filter == kCGInterpolationNone && _cairo_matrix_has_unity_scale (&m)) {
+	    m.x0 = -ceil (m.x0 - 0.5) * m.xx;
+	    m.y0 = -ceil (m.y0 - 0.5) * m.yy;
 	} else {
 	    cairo_matrix_invert (&m);
 	}
@@ -1756,8 +1759,12 @@ _cairo_quartz_cg_mask (const cairo_compositor_t *compositor,
 	matrix = mask->matrix;
 
 	mask_filter = _cairo_quartz_filter_to_quartz (mask->filter);
+	
+	/* if the filter is CAIRO_FILTER_NEAREST and the transformation
+	 * matrix scale is 1.0 or -1.0, we can align pixel
+	 */
 	if (mask_filter == kCGInterpolationNone) {
-	    simple_transform = _cairo_matrix_is_translation (&matrix);
+	    simple_transform = _cairo_matrix_has_unity_scale (&matrix);
 	    if (simple_transform) {
 		matrix.x0 = ceil (matrix.x0 - 0.5);
 		matrix.y0 = ceil (matrix.y0 - 0.5);
-- 
1.7.11.2


More information about the cairo mailing list