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