dwrite: Fix transform matrix usage for pixel snapping
Nikolay Sivov
nsivov at codeweavers.com
Tue Jul 14 16:02:35 CDT 2015
I wrongly assumed that transform with DWRITE_MATRIX looks like
v' = M*v, and x' = m11*x + m12*y + dx, but in reality it works as
x' = m11*x + m21*y + dx;
y' = m12*x + m22*y + dy.
-------------- next part --------------
From 7b7f729d1de789c78f01f08469bbc8c96363d553 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue, 14 Jul 2015 23:53:10 +0300
Subject: [PATCH] dwrite: Fix transform matrix usage for pixel snapping
---
dlls/dwrite/layout.c | 13 +++++++------
dlls/dwrite/tests/layout.c | 19 +++++++++++++------
2 files changed, 20 insertions(+), 12 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 1f7beb4..99ec7b4 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -2735,17 +2735,18 @@ static inline FLOAT renderer_apply_snapping(FLOAT coord, BOOL skiptransform, FLO
if (!skiptransform) {
/* apply transform */
vec[0] = 0.0;
- vec[1] = coord;
+ vec[1] = coord * ppdip;
- vec2[0] = m->m11 * vec[0] + m->m12 * vec[1] + m->dx;
- vec2[1] = m->m21 * vec[0] + m->m22 * vec[1] + m->dy;
+ vec2[0] = m->m11 * vec[0] + m->m21 * vec[1] + m->dx;
+ vec2[1] = m->m12 * vec[0] + m->m22 * vec[1] + m->dy;
/* snap */
- vec2[0] = floorf(vec2[0] * ppdip + 0.5f) / ppdip;
- vec2[1] = floorf(vec2[1] * ppdip + 0.5f) / ppdip;
+ vec2[0] = floorf(vec2[0] + 0.5f);
+ vec2[1] = floorf(vec2[1] + 0.5f);
/* apply inverted transform, we don't care about X component at this point */
- vec[1] = (-m->m21 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
+ vec[1] = (-m->m12 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
+ vec[1] /= ppdip;
}
else
vec[1] = floorf(coord * ppdip + 0.5f) / ppdip;
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 2423f8b..cd747c6 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -3271,17 +3271,18 @@ static FLOAT snap_coord(const DWRITE_MATRIX *m, FLOAT ppdip, FLOAT coord)
if (transform) {
/* apply transform */
vec[0] = 0.0;
- vec[1] = coord;
+ vec[1] = coord * ppdip;
- vec2[0] = m->m11 * vec[0] + m->m12 * vec[1] + m->dx;
- vec2[1] = m->m21 * vec[0] + m->m22 * vec[1] + m->dy;
+ vec2[0] = m->m11 * vec[0] + m->m21 * vec[1] + m->dx;
+ vec2[1] = m->m12 * vec[0] + m->m22 * vec[1] + m->dy;
/* snap */
- vec2[0] = floorf(vec2[0] * ppdip + 0.5f) / ppdip;
- vec2[1] = floorf(vec2[1] * ppdip + 0.5f) / ppdip;
+ vec2[0] = floorf(vec2[0] + 0.5f);
+ vec2[1] = floorf(vec2[1] + 0.5f);
/* apply inverted transform */
- vec[1] = (-m->m21 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
+ vec[1] = (-m->m12 * vec2[0] + m->m11 * vec2[1] - (m->m11 * m->dy - m->m12 * m->dx)) / det;
+ vec[1] /= ppdip;
}
else
vec[1] = floorf(coord * ppdip + 0.5f) / ppdip;
@@ -3319,8 +3320,14 @@ static struct snapping_test snapping_tests[] = {
{ { 0.0, 1.0, -1.0, 0.0, 0.2, 0.6 }, 1.0 }, /* 90 degrees rotation */
{ { -1.0, 0.0, 0.0, -1.0, 0.2, 0.6 }, 1.0 }, /* 180 degrees rotation */
{ { 0.0, -1.0, 1.0, 0.0, 0.2, 0.6 }, 1.0 }, /* 270 degrees rotation */
+ { { 1.0, 0.0, 0.0, 1.0,-0.1, 0.2 }, 1.0 },
+ { { 0.0, 1.0, -1.0, 0.0,-0.2,-0.3 }, 1.0 }, /* 90 degrees rotation */
+ { { -1.0, 0.0, 0.0, -1.0,-0.3,-1.6 }, 1.0 }, /* 180 degrees rotation */
+ { { 0.0, -1.0, 1.0, 0.0,-0.7, 0.6 }, 10.0 }, /* 270 degrees rotation */
{ { 0.0, 2.0, 1.0, 0.0, 0.2, 0.6 }, 1.0 },
{ { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }, 1.0 },
+ { { 3.0, 0.0, 0.0, 5.0, 0.2,-0.3 }, 10.0 },
+ { { 0.0, -3.0, 5.0, 0.0,-0.1, 0.7 }, 10.0 },
};
static DWRITE_MATRIX compattransforms[] = {
--
2.1.4
More information about the wine-patches
mailing list