gdi32: Slightly relax EMF record comparisons allowing rounding errors.
This commit is contained in:
parent
63ea670370
commit
8021a9d903
@ -976,7 +976,7 @@ static void dump_emf_record(const ENHMETARECORD *emr, const char *desc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr2,
|
static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr2,
|
||||||
const char *desc, BOOL todo)
|
const char *desc, BOOL ignore_scaling, BOOL todo)
|
||||||
{
|
{
|
||||||
int diff;
|
int diff;
|
||||||
|
|
||||||
@ -1010,6 +1010,13 @@ static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr
|
|||||||
/* contents of EMR_GDICOMMENT are not interesting */
|
/* contents of EMR_GDICOMMENT are not interesting */
|
||||||
if (emr1->iType == EMR_GDICOMMENT) return TRUE;
|
if (emr1->iType == EMR_GDICOMMENT) return TRUE;
|
||||||
|
|
||||||
|
/* different Windows versions setup DC scaling differently when
|
||||||
|
* converting an old style metafile to an EMF.
|
||||||
|
*/
|
||||||
|
if (ignore_scaling && (emr1->iType == EMR_SETWINDOWEXTEX ||
|
||||||
|
emr1->iType == EMR_SETVIEWPORTEXTEX))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
diff = memcmp(emr1->dParm, emr2->dParm, emr1->nSize - sizeof(EMR));
|
diff = memcmp(emr1->dParm, emr2->dParm, emr1->nSize - sizeof(EMR));
|
||||||
if (diff && todo)
|
if (diff && todo)
|
||||||
{
|
{
|
||||||
@ -1035,7 +1042,8 @@ static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr
|
|||||||
* otherwise returns the number of non-matching bytes.
|
* otherwise returns the number of non-matching bytes.
|
||||||
*/
|
*/
|
||||||
static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
|
static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
|
||||||
UINT bsize, const char *desc, BOOL todo)
|
UINT bsize, const char *desc,
|
||||||
|
BOOL ignore_scaling, BOOL todo)
|
||||||
{
|
{
|
||||||
unsigned char buf[MF_BUFSIZE];
|
unsigned char buf[MF_BUFSIZE];
|
||||||
UINT mfsize, offset;
|
UINT mfsize, offset;
|
||||||
@ -1093,7 +1101,7 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
|
|||||||
trace("EMF record %u, size %u/record %u, size %u\n",
|
trace("EMF record %u, size %u/record %u, size %u\n",
|
||||||
emr1->iType, emr1->nSize, emr2->iType, emr2->nSize);
|
emr1->iType, emr1->nSize, emr2->iType, emr2->nSize);
|
||||||
|
|
||||||
if (!match_emf_record(emr1, emr2, desc, todo)) return -1;
|
if (!match_emf_record(emr1, emr2, desc, ignore_scaling, todo)) return -1;
|
||||||
|
|
||||||
offset += emr1->nSize;
|
offset += emr1->nSize;
|
||||||
}
|
}
|
||||||
@ -1433,7 +1441,7 @@ static void test_emf_ExtTextOut_on_path(void)
|
|||||||
* are there, but their contents don't match for different reasons.
|
* are there, but their contents don't match for different reasons.
|
||||||
*/
|
*/
|
||||||
if (compare_emf_bits(hMetafile, EMF_TEXTOUT_ON_PATH_BITS, sizeof(EMF_TEXTOUT_ON_PATH_BITS),
|
if (compare_emf_bits(hMetafile, EMF_TEXTOUT_ON_PATH_BITS, sizeof(EMF_TEXTOUT_ON_PATH_BITS),
|
||||||
"emf_TextOut_on_path", TRUE) != 0)
|
"emf_TextOut_on_path", FALSE, TRUE) != 0)
|
||||||
{
|
{
|
||||||
dump_emf_bits(hMetafile, "emf_TextOut_on_path");
|
dump_emf_bits(hMetafile, "emf_TextOut_on_path");
|
||||||
dump_emf_records(hMetafile, "emf_TextOut_on_path");
|
dump_emf_records(hMetafile, "emf_TextOut_on_path");
|
||||||
@ -1488,6 +1496,15 @@ static void translate( POINT *pt, UINT count, const XFORM *xform )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compare rectangles allowing rounding errors */
|
||||||
|
static BOOL is_equal_rect(const RECT *rc1, const RECT *rc2)
|
||||||
|
{
|
||||||
|
return abs(rc1->left - rc2->left) <= 1 &&
|
||||||
|
abs(rc1->top - rc2->top) <= 1 &&
|
||||||
|
abs(rc1->right - rc2->right) <= 1 &&
|
||||||
|
abs(rc1->bottom - rc2->bottom) <= 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int CALLBACK clip_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
|
static int CALLBACK clip_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
|
||||||
const ENHMETARECORD *emr, int n_objs, LPARAM param)
|
const ENHMETARECORD *emr, int n_objs, LPARAM param)
|
||||||
{
|
{
|
||||||
@ -1574,7 +1591,7 @@ static int CALLBACK clip_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
|
|||||||
translate((POINT *)&rc_transformed, 2, &xform);
|
translate((POINT *)&rc_transformed, 2, &xform);
|
||||||
trace("transformed (%d,%d-%d,%d)\n", rc_transformed.left, rc_transformed.top,
|
trace("transformed (%d,%d-%d,%d)\n", rc_transformed.left, rc_transformed.top,
|
||||||
rc_transformed.right, rc_transformed.bottom);
|
rc_transformed.right, rc_transformed.bottom);
|
||||||
ok(EqualRect(&rect, &rc_transformed), "rects don't match\n");
|
ok(is_equal_rect(&rect, &rc_transformed), "rects don't match\n");
|
||||||
|
|
||||||
rect = *(const RECT *)rgn2.data.Buffer;
|
rect = *(const RECT *)rgn2.data.Buffer;
|
||||||
trace("rect (%d,%d-%d,%d)\n", rect.left, rect.top, rect.right, rect.bottom);
|
trace("rect (%d,%d-%d,%d)\n", rect.left, rect.top, rect.right, rect.bottom);
|
||||||
@ -1582,7 +1599,7 @@ static int CALLBACK clip_emf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
|
|||||||
translate((POINT *)&rc_transformed, 2, &xform);
|
translate((POINT *)&rc_transformed, 2, &xform);
|
||||||
trace("transformed (%d,%d-%d,%d)\n", rc_transformed.left, rc_transformed.top,
|
trace("transformed (%d,%d-%d,%d)\n", rc_transformed.left, rc_transformed.top,
|
||||||
rc_transformed.right, rc_transformed.bottom);
|
rc_transformed.right, rc_transformed.bottom);
|
||||||
ok(EqualRect(&rect, &rc_transformed), "rects don't match\n");
|
ok(is_equal_rect(&rect, &rc_transformed), "rects don't match\n");
|
||||||
|
|
||||||
ok(rgn2.data.rdh.dwSize == sizeof(rgn1->data.rdh), "expected sizeof(rdh), got %u\n", rgn2.data.rdh.dwSize);
|
ok(rgn2.data.rdh.dwSize == sizeof(rgn1->data.rdh), "expected sizeof(rdh), got %u\n", rgn2.data.rdh.dwSize);
|
||||||
ok(rgn2.data.rdh.iType == RDH_RECTANGLES, "expected RDH_RECTANGLES, got %u\n", rgn2.data.rdh.iType);
|
ok(rgn2.data.rdh.iType == RDH_RECTANGLES, "expected RDH_RECTANGLES, got %u\n", rgn2.data.rdh.iType);
|
||||||
@ -1620,7 +1637,7 @@ static void test_emf_clipping(void)
|
|||||||
ok(hemf != 0, "CloseEnhMetaFile error %d\n", GetLastError());
|
ok(hemf != 0, "CloseEnhMetaFile error %d\n", GetLastError());
|
||||||
|
|
||||||
if (compare_emf_bits(hemf, EMF_CLIPPING, sizeof(EMF_CLIPPING),
|
if (compare_emf_bits(hemf, EMF_CLIPPING, sizeof(EMF_CLIPPING),
|
||||||
"emf_clipping", TRUE) != 0)
|
"emf_clipping", FALSE, TRUE) != 0)
|
||||||
{
|
{
|
||||||
dump_emf_bits(hemf, "emf_clipping");
|
dump_emf_bits(hemf, "emf_clipping");
|
||||||
dump_emf_records(hemf, "emf_clipping");
|
dump_emf_records(hemf, "emf_clipping");
|
||||||
@ -1686,6 +1703,7 @@ static HENHMETAFILE create_converted_emf(const METAFILEPICT *mfp)
|
|||||||
{
|
{
|
||||||
HDC hdcMf;
|
HDC hdcMf;
|
||||||
HMETAFILE hmf;
|
HMETAFILE hmf;
|
||||||
|
HENHMETAFILE hemf;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
UINT size;
|
UINT size;
|
||||||
LPBYTE pBits;
|
LPBYTE pBits;
|
||||||
@ -1708,7 +1726,9 @@ static HENHMETAFILE create_converted_emf(const METAFILEPICT *mfp)
|
|||||||
pBits = HeapAlloc(GetProcessHeap(), 0, size);
|
pBits = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
GetMetaFileBitsEx(hmf, size, pBits);
|
GetMetaFileBitsEx(hmf, size, pBits);
|
||||||
DeleteMetaFile(hmf);
|
DeleteMetaFile(hmf);
|
||||||
return SetWinMetaFileBits(size, pBits, NULL, mfp);
|
hemf = SetWinMetaFileBits(size, pBits, NULL, mfp);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pBits);
|
||||||
|
return hemf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_mf_conversions(void)
|
static void test_mf_conversions(void)
|
||||||
@ -1726,7 +1746,7 @@ static void test_mf_conversions(void)
|
|||||||
hemf = create_converted_emf(&mfp);
|
hemf = create_converted_emf(&mfp);
|
||||||
|
|
||||||
if (compare_emf_bits(hemf, EMF_LINETO_MM_ANISOTROPIC_BITS, sizeof(EMF_LINETO_MM_ANISOTROPIC_BITS),
|
if (compare_emf_bits(hemf, EMF_LINETO_MM_ANISOTROPIC_BITS, sizeof(EMF_LINETO_MM_ANISOTROPIC_BITS),
|
||||||
"emf_LineTo MM_ANISOTROPIC", TRUE) != 0)
|
"emf_LineTo MM_ANISOTROPIC", TRUE, TRUE) != 0)
|
||||||
{
|
{
|
||||||
dump_emf_bits(hemf, "emf_LineTo MM_ANISOTROPIC");
|
dump_emf_bits(hemf, "emf_LineTo MM_ANISOTROPIC");
|
||||||
dump_emf_records(hemf, "emf_LineTo MM_ANISOTROPIC");
|
dump_emf_records(hemf, "emf_LineTo MM_ANISOTROPIC");
|
||||||
@ -1751,7 +1771,7 @@ static void test_mf_conversions(void)
|
|||||||
hemf = create_converted_emf(&mfp);
|
hemf = create_converted_emf(&mfp);
|
||||||
|
|
||||||
if (compare_emf_bits(hemf, EMF_LINETO_MM_TEXT_BITS, sizeof(EMF_LINETO_MM_TEXT_BITS),
|
if (compare_emf_bits(hemf, EMF_LINETO_MM_TEXT_BITS, sizeof(EMF_LINETO_MM_TEXT_BITS),
|
||||||
"emf_LineTo MM_TEXT", TRUE) != 0)
|
"emf_LineTo MM_TEXT", TRUE, TRUE) != 0)
|
||||||
{
|
{
|
||||||
dump_emf_bits(hemf, "emf_LineTo MM_TEXT");
|
dump_emf_bits(hemf, "emf_LineTo MM_TEXT");
|
||||||
dump_emf_records(hemf, "emf_LineTo MM_TEXT");
|
dump_emf_records(hemf, "emf_LineTo MM_TEXT");
|
||||||
@ -1771,7 +1791,7 @@ static void test_mf_conversions(void)
|
|||||||
hemf = create_converted_emf(NULL);
|
hemf = create_converted_emf(NULL);
|
||||||
|
|
||||||
if (compare_emf_bits(hemf, EMF_LINETO_BITS, sizeof(EMF_LINETO_BITS),
|
if (compare_emf_bits(hemf, EMF_LINETO_BITS, sizeof(EMF_LINETO_BITS),
|
||||||
"emf_LineTo NULL", TRUE) != 0)
|
"emf_LineTo NULL", TRUE, TRUE) != 0)
|
||||||
{
|
{
|
||||||
dump_emf_bits(hemf, "emf_LineTo NULL");
|
dump_emf_bits(hemf, "emf_LineTo NULL");
|
||||||
dump_emf_records(hemf, "emf_LineTo NULL");
|
dump_emf_records(hemf, "emf_LineTo NULL");
|
||||||
@ -1920,12 +1940,17 @@ static void test_SetWinMetaFileBits(void)
|
|||||||
ok(diffx <= 1, "SetWinMetaFileBits (MM_ISOTROPIC): Reference bounds are not isotropic\n");
|
ok(diffx <= 1, "SetWinMetaFileBits (MM_ISOTROPIC): Reference bounds are not isotropic\n");
|
||||||
|
|
||||||
dc = CreateCompatibleDC(NULL);
|
dc = CreateCompatibleDC(NULL);
|
||||||
|
|
||||||
|
/* Allow 1 mm difference (rounding errors) */
|
||||||
|
diffx = rclBoundsAnisotropic.right - GetDeviceCaps(dc, HORZRES) / 2;
|
||||||
|
diffy = rclBoundsAnisotropic.bottom - GetDeviceCaps(dc, VERTRES) / 2;
|
||||||
|
if (diffx < 0) diffx = -diffx;
|
||||||
|
if (diffy < 0) diffy = -diffy;
|
||||||
todo_wine
|
todo_wine
|
||||||
{
|
{
|
||||||
ok(rclBoundsAnisotropic.right == GetDeviceCaps(dc, HORZRES) / 2 - 1 &&
|
ok(diffx <= 1 && diffy <= 1,
|
||||||
rclBoundsAnisotropic.bottom == GetDeviceCaps(dc, VERTRES) / 2 - 1,
|
|
||||||
"SetWinMetaFileBits (MM_ANISOTROPIC): Reference bounds: The whole device surface must be used (%dx%d), but got (%dx%d)\n",
|
"SetWinMetaFileBits (MM_ANISOTROPIC): Reference bounds: The whole device surface must be used (%dx%d), but got (%dx%d)\n",
|
||||||
GetDeviceCaps(dc, HORZRES) / 2 - 1, GetDeviceCaps(dc, VERTRES) / 2 - 1, rclBoundsAnisotropic.right, rclBoundsAnisotropic.bottom);
|
GetDeviceCaps(dc, HORZRES) / 2, GetDeviceCaps(dc, VERTRES) / 2, rclBoundsAnisotropic.right, rclBoundsAnisotropic.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow 1 mm difference (rounding errors) */
|
/* Allow 1 mm difference (rounding errors) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user