Huw Davies : gdi32/tests: Allow a small tolerance when comparing scaling values.

Alexandre Julliard julliard at winehq.org
Mon Jul 13 07:55:31 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Jul 10 14:47:50 2009 +0100

gdi32/tests: Allow a small tolerance when comparing scaling values.

---

 dlls/gdi32/tests/metafile.c |   48 ++++++++++++++++++------------------------
 1 files changed, 21 insertions(+), 27 deletions(-)

diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index 2eacd37..4a081d6 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -2308,19 +2308,14 @@ static void test_SetWinMetaFileBits(void)
   HeapFree(GetProcessHeap(), 0, buffer);
 }
 
-/* This is somewhat different to MulDiv, but appears to be how native behaves */
-static INT muldiv(INT m1, INT m2, INT d)
+static BOOL near_match(int x, int y)
 {
-    LONGLONG ret;
+    int epsilon = min(abs(x), abs(y));
 
-    ret = ((LONGLONG)m1 * m2 + d/2) / d; /* Always add d/2 even if ret will be -ve */
+    epsilon = max(epsilon/100, 2);
 
-    if((LONGLONG)m1 * m2 * 2 == (2 * ret - 1) * d) /* If the answer is exactly n.5 round towards zero */
-    {
-        if(ret > 0) ret--;
-        else ret++;
-    }
-    return ret;
+    if(x < y - epsilon || x > y + epsilon) return FALSE;
+    return TRUE;
 }
 
 static void getwinmetafilebits(UINT mode, int scale, RECT *rc)
@@ -2422,43 +2417,42 @@ static void getwinmetafilebits(UINT mode, int scale, RECT *rc)
             case MM_TEXT:
             case MM_ISOTROPIC:
             case MM_ANISOTROPIC:
-                pt.y = muldiv(rc->top, vert_res, vert_size * 100);
-                pt.x = muldiv(rc->left, horz_res, horz_size * 100);
+                pt.y = MulDiv(rc->top, vert_res, vert_size * 100) + 1;
+                pt.x = MulDiv(rc->left, horz_res, horz_size * 100);
                 break;
             case MM_LOMETRIC:
-                pt.y = muldiv(-rc->top, 1, 10) + 1;
-                pt.x = muldiv( rc->left, 1, 10);
+                pt.y = MulDiv(-rc->top, 1, 10) + 1;
+                pt.x = MulDiv( rc->left, 1, 10);
                 break;
             case MM_HIMETRIC:
                 pt.y = -rc->top + 1;
                 pt.x = (rc->left >= 0) ? rc->left : rc->left + 1; /* strange but true */
                 break;
             case MM_LOENGLISH:
-                pt.y = muldiv(-rc->top, 10, 254) + 1;
-                pt.x = muldiv( rc->left, 10, 254);
+                pt.y = MulDiv(-rc->top, 10, 254) + 1;
+                pt.x = MulDiv( rc->left, 10, 254);
                 break;
             case MM_HIENGLISH:
-                pt.y = muldiv(-rc->top, 100, 254) + 1;
-                pt.x = muldiv( rc->left, 100, 254);
+                pt.y = MulDiv(-rc->top, 100, 254) + 1;
+                pt.x = MulDiv( rc->left, 100, 254);
                 break;
             case MM_TWIPS:
-                pt.y = muldiv(-rc->top, 72 * 20, 2540) + 1;
-                pt.x = muldiv( rc->left, 72 * 20, 2540);
+                pt.y = MulDiv(-rc->top, 72 * 20, 2540) + 1;
+                pt.x = MulDiv( rc->left, 72 * 20, 2540);
                 break;
             default:
                 pt.x = pt.y = 0;
             }
-            ok((short)rec->rdParm[0] == pt.y ||
-               broken(mode >= MM_LOMETRIC && mode <= MM_TWIPS && (short)rec->rdParm[0] == pt.y - 1), /* win9x, winme */
-                      "got %d expect %d\n", (short)rec->rdParm[0], pt.y);
-            ok((short)rec->rdParm[1] == pt.x, "got %d expect %d\n", (short)rec->rdParm[1], pt.x);
+            ok(near_match((short)rec->rdParm[0], pt.y), "got %d expect %d\n", (short)rec->rdParm[0], pt.y);
+            ok(near_match((short)rec->rdParm[1], pt.x), "got %d expect %d\n", (short)rec->rdParm[1], pt.x);
         }
         if(rec_num == mfcomment_chunks + 2)
         {
             ok(rec->rdFunction == META_SETWINDOWEXT, "got %04x\n", rec->rdFunction);
-            ok((short)rec->rdParm[0] == muldiv(rc->bottom - rc->top, vert_res, vert_size * 100), "got %d\n", (short)rec->rdParm[0]);
-            ok((short)rec->rdParm[1] == muldiv(rc->right - rc->left, horz_res, horz_size * 100), "got %d\n", (short)rec->rdParm[1]);
-
+            ok(near_match((short)rec->rdParm[0], MulDiv(rc->bottom - rc->top, vert_res, vert_size * 100)),
+               "got %d\n", (short)rec->rdParm[0]);
+            ok(near_match((short)rec->rdParm[1], MulDiv(rc->right - rc->left, horz_res, horz_size * 100)),
+               "got %d\n", (short)rec->rdParm[1]);
         }
 
         rec_num++;




More information about the wine-cvs mailing list