Dmitry Timoshkov : gdi32: More carefully compare EMF records in tests.

Alexandre Julliard julliard at winehq.org
Wed May 7 13:28:12 CDT 2008


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

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Wed May  7 20:34:36 2008 +0900

gdi32: More carefully compare EMF records in tests.

---

 dlls/gdi32/tests/metafile.c |  128 ++++++++++++++++++++++++++++++++++++------
 1 files changed, 109 insertions(+), 19 deletions(-)

diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index 7c14428..78bbd8b 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -953,6 +953,81 @@ static void dump_emf_records(const HENHMETAFILE mf, const char *desc)
     }
 }
 
+static void dump_emf_record(const ENHMETARECORD *emr, const char *desc)
+{
+    const BYTE *buf;
+    DWORD i;
+
+    if (!winetest_debug) return;
+
+    printf ("%s: EMF record %u has bits:\n{\n", desc, emr->iType);
+    buf = (const BYTE *)emr;
+    for (i = 0; i < emr->nSize; i++)
+    {
+        printf ("0x%02x", buf[i]);
+        if (i == emr->nSize - 1)
+            printf ("\n");
+        else if (i % 8 == 7)
+            printf (",\n");
+        else
+            printf (", ");
+    }
+    printf ("};\n");
+}
+
+static BOOL match_emf_record(const ENHMETARECORD *emr1, const ENHMETARECORD *emr2,
+                             const char *desc, BOOL todo)
+{
+    int diff;
+
+    if (emr1->iType != emr2->iType && todo)
+    {
+        todo_wine
+        {
+            ok(emr1->iType == emr2->iType, "%s: emr->iType %u != %u\n",
+               desc, emr1->iType, emr2->iType);
+        }
+    }
+    else
+        ok(emr1->iType == emr2->iType, "%s: emr->iType %u != %u\n",
+           desc, emr1->iType, emr2->iType);
+
+    if (emr1->nSize != emr2->nSize && todo)
+    {
+        todo_wine
+        {
+            ok(emr1->nSize == emr2->nSize, "%s: emr->nSize %u != %u\n",
+               desc, emr1->nSize, emr2->nSize);
+        }
+    }
+    else
+        ok(emr1->nSize == emr2->nSize, "%s: emr->nSize %u != %u\n",
+           desc, emr1->nSize, emr2->nSize);
+
+    /* iType and nSize mismatches are fatal */
+    if (emr1->iType != emr2->iType || emr1->nSize != emr2->nSize) return FALSE;
+
+    /* contents of EMR_GDICOMMENT are not interesting */
+    if (emr1->iType == EMR_GDICOMMENT) return TRUE;
+
+    diff = memcmp(emr1->dParm, emr2->dParm, emr1->nSize - sizeof(EMR));
+    if (diff && todo)
+    {
+        todo_wine
+            ok(diff == 0, "%s: contents of record %u don't match\n", desc, emr1->iType);
+    }
+    else
+        ok(diff == 0, "%s: contents of record %u don't match\n", desc, emr1->iType);
+
+    if (diff)
+    {
+        dump_emf_record(emr1, "expected bits");
+        dump_emf_record(emr2, "actual bits");
+    }
+
+    return diff == 0 || todo; /* report all non-fatal record mismatches */
+}
+
 /* Compare the EMF produced by a test function with the
  * expected raw EMF data in "bits".
  * Return value is 0 for a perfect match,
@@ -963,8 +1038,8 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
                             UINT bsize, const char *desc, BOOL todo)
 {
     unsigned char buf[MF_BUFSIZE];
-    UINT mfsize, i;
-    int diff;
+    UINT mfsize, offset;
+    const ENHMETAHEADER *emh1, *emh2;
 
     mfsize = GetEnhMetaFileBits(mf, MF_BUFSIZE, buf);
     ok (mfsize > 0, "%s: GetEnhMetaFileBits error %d\n", desc, GetLastError());
@@ -983,31 +1058,46 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
         ok(bsize >= MF_BUFSIZE, "%s: mfsize > bufsize (%d bytes), bsize=%d\n",
            desc, mfsize, bsize);
 
-    if (mfsize != bsize)
-        return -1;
-
-    diff = 0;
-    for (i = 0; i < bsize; i++)
+    /* basic things must match */
+    emh1 = (const ENHMETAHEADER *)bits;
+    emh2 = (const ENHMETAHEADER *)buf;
+    ok(emh1->iType == EMR_HEADER, "expected EMR_HEADER, got %u\n", emh1->iType);
+    ok(emh1->nSize == sizeof(ENHMETAHEADER), "expected sizeof(ENHMETAHEADER), got %u\n", emh1->nSize);
+    ok(emh2->nBytes == mfsize, "expected emh->nBytes %u, got %u\n", mfsize, emh2->nBytes);
+    ok(emh1->dSignature == ENHMETA_SIGNATURE, "expected ENHMETA_SIGNATURE, got %u\n", emh1->dSignature);
+
+    ok(emh1->iType == emh2->iType, "expected EMR_HEADER, got %u\n", emh2->iType);
+    ok(emh1->nSize == emh2->nSize, "expected nSize %u, got %u\n", emh1->nSize, emh2->nSize);
+    ok(emh1->dSignature == emh2->dSignature, "expected dSignature %u, got %u\n", emh1->dSignature, emh2->dSignature);
+    if (todo && emh1->nBytes != emh2->nBytes)
     {
-       if (buf[i] != bits[i])
-           diff++;
+        todo_wine
+            ok(emh1->nBytes == emh2->nBytes, "expected nBytes %u, got %u\n", emh1->nBytes, emh2->nBytes);
     }
-    if (diff != 0 && todo)
+    else
+        ok(emh1->nBytes == emh2->nBytes, "expected nBytes %u, got %u\n", emh1->nBytes, emh2->nBytes);
+    if (todo && emh1->nRecords != emh2->nRecords)
     {
         todo_wine
-        {
-            ok(diff == 0, "%s: mfsize=%d, bsize=%d, diff=%d\n",
-               desc, mfsize, bsize, diff);
-        }
-        return diff;
+            ok(emh1->nRecords == emh2->nRecords, "expected nBytes %u, got %u\n", emh1->nRecords, emh2->nRecords);
     }
     else
+        ok(emh1->nRecords == emh2->nRecords, "expected nBytes %u, got %u\n", emh1->nRecords, emh2->nRecords);
+
+    offset = emh1->nSize;
+    while (offset < emh1->nBytes)
     {
-        ok(diff == 0, "%s: mfsize=%d, bsize=%d, diff=%d\n",
-           desc, mfsize, bsize, diff);
+	const ENHMETARECORD *emr1 = (const ENHMETARECORD *)(bits + offset);
+	const ENHMETARECORD *emr2 = (const ENHMETARECORD *)(buf + offset);
+
+	trace("EMF record %u, size %u/record %u, size %u\n",
+              emr1->iType, emr1->nSize, emr2->iType, emr2->nSize);
+
+        if (!match_emf_record(emr1, emr2, desc, todo)) return -1;
 
-        return diff;
+	offset += emr1->nSize;
     }
+    return 0;
 }
 
 /* Test a blank metafile.  May be used as a template for new tests. */
@@ -1561,7 +1651,7 @@ static INT CALLBACK EmfEnumProc(HDC hdc, HANDLETABLE *lpHTable, const ENHMETAREC
      * until a record is played which actually outputs something */
     PlayEnhMetaFileRecord(hdc, lpHTable, lpEMFR, nObj);
     LPtoDP(hdc, mapping, 2);
-    trace("Meta record: iType %d, nSize %d, (%d,%d)-(%d,%d)\n",
+    trace("EMF record: iType %d, nSize %d, (%d,%d)-(%d,%d)\n",
            lpEMFR->iType, lpEMFR->nSize,
            mapping[0].x, mapping[0].y, mapping[1].x, mapping[1].y);
 




More information about the wine-cvs mailing list