[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