Nikolay Sivov : dwrite: Fix transform matrix usage for pixel snapping.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 15 09:51:23 CDT 2015


Module: wine
Branch: master
Commit: f46aa66ca7c2874577edda6278c34c8c91b1da56
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f46aa66ca7c2874577edda6278c34c8c91b1da56

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jul 15 10:44:15 2015 +0300

dwrite: Fix transform matrix usage for pixel snapping.

---

 dlls/dwrite/layout.c       | 13 +++++++------
 dlls/dwrite/tests/layout.c | 30 +++++++++++++++++++++++-------
 2 files changed, 30 insertions(+), 13 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..950b021 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -22,6 +22,7 @@
 
 #include <assert.h>
 #include <math.h>
+#include <limits.h>
 
 #include "windows.h"
 #include "dwrite.h"
@@ -3271,17 +3272,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;
@@ -3290,7 +3292,15 @@ static FLOAT snap_coord(const DWRITE_MATRIX *m, FLOAT ppdip, FLOAT coord)
 
 static inline BOOL float_eq(FLOAT left, FLOAT right)
 {
-    return fabsf(left - right) < 1e-6f;
+    int x = *(int *)&left;
+    int y = *(int *)&right;
+
+    if (x < 0)
+        x = INT_MIN - x;
+    if (y < 0)
+        y = INT_MIN - y;
+
+    return abs(x - y) <= 16;
 }
 
 struct snapping_test {
@@ -3319,8 +3329,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[] = {




More information about the wine-cvs mailing list