Add a test for WMF->EMF conversions performed by SetWinMetaFileBits

Dmitry Timoshkov dmitry at codeweavers.com
Thu Mar 30 08:03:02 CST 2006


Hello,

these tests currently fail in Wine.

Changelog:
    Add a test for WMF->EMF conversions performed by SetWinMetaFileBits.

--- cvs/hq/wine/dlls/gdi/tests/metafile.c	2005-11-10 11:28:29.000000000 +0800
+++ wine/dlls/gdi/tests/metafile.c	2006-03-30 22:54:27.000000000 +0900
@@ -371,7 +371,7 @@ void test_SaveDC(void)
 /* with the nominal results. */
 
 /* Maximum size of sample metafiles in bytes. */
-#define MF_BUFSIZE 256
+#define MF_BUFSIZE 512
 
 /* 8x8 bitmap data for a pattern brush */
 static const unsigned char SAMPLE_PATTERN_BRUSH[] = {
@@ -468,13 +468,137 @@ static const unsigned char EMF_TEXTOUT_O
     0x14, 0x00, 0x00, 0x00
 };
 
+static const unsigned char MF_LINETO_BITS[] = {
+    0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x02,
+    0x0f, 0x00, 0x37, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x00, 0x00
+};
+
+static const unsigned char EMF_LINETO_BITS[] = {
+    0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x37, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x61, 0x06, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00,
+    0x20, 0x45, 0x4d, 0x46, 0x00, 0x00, 0x01, 0x00,
+    0x38, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x7c, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00,
+    0xe0, 0x93, 0x04, 0x00, 0x46, 0x00, 0x00, 0x00,
+    0x48, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00,
+    0x47, 0x44, 0x49, 0x43, 0x01, 0x00, 0x00, 0x80,
+    0x00, 0x03, 0x00, 0x00, 0x60, 0xe5, 0xf4, 0x73,
+    0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x02,
+    0x0f, 0x00, 0x37, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+    0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x36, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x37, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+    0x25, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+    0x07, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+    0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+    0x0f, 0x00, 0x00, 0x80, 0x4b, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+    0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00
+};
+
+static const unsigned char EMF_LINETO_MM_ANISOTROPIC_BITS[] = {
+    0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x37, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00,
+    0x20, 0x45, 0x4d, 0x46, 0x00, 0x00, 0x01, 0x00,
+    0x38, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x7c, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00,
+    0xe0, 0x93, 0x04, 0x00, 0x46, 0x00, 0x00, 0x00,
+    0x48, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00,
+    0x47, 0x44, 0x49, 0x43, 0x01, 0x00, 0x00, 0x80,
+    0x00, 0x03, 0x00, 0x00, 0xa4, 0xfe, 0xf4, 0x73,
+    0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x13, 0x02,
+    0x0f, 0x00, 0x37, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+    0x0b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x09, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x36, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x37, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+    0x25, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+    0x07, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+    0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+    0x0f, 0x00, 0x00, 0x80, 0x4b, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x05, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+    0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00
+};
+
+static const unsigned char EMF_LINETO_MM_TEXT_BITS[] = {
+    0x01, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x37, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x61, 0x06, 0x00, 0x00, 0xb7, 0x01, 0x00, 0x00,
+    0x20, 0x45, 0x4d, 0x46, 0x00, 0x00, 0x01, 0x00,
+    0xe4, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
+    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x7c, 0x01, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x60, 0xcc, 0x05, 0x00,
+    0xe0, 0x93, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+    0x00, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00,
+    0x00, 0x04, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00,
+    0x10, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00,
+    0x0f, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x80,
+    0x25, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x80, 0x30, 0x00, 0x00, 0x00,
+    0x0c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x80,
+    0x4b, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+    0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+    0x14, 0x00, 0x00, 0x00
+};
+
 /* For debugging or dumping the raw metafiles produced by
  * new test functions.
  */
 static INT CALLBACK mf_enum_proc(HDC hdc, HANDLETABLE *ht, METARECORD *mr,
                                  INT nobj, LPARAM param)
 {
-    trace("hdc %p, mr->rdFunction %d, mr->rdSize %lu, param %p\n",
+    trace("hdc %p, mr->rdFunction %04x, mr->rdSize %lu, param %p\n",
            hdc, mr->rdFunction, mr->rdSize, (void *)param);
     return TRUE;
 }
@@ -485,7 +609,7 @@ static INT CALLBACK mf_enum_proc(HDC hdc
 
 static void dump_mf_bits (const HMETAFILE mf, const char *desc)
 {
-    char buf[MF_BUFSIZE];
+    BYTE buf[MF_BUFSIZE];
     UINT mfsize, i;
 
     mfsize = GetMetaFileBitsEx (mf, MF_BUFSIZE, buf);
@@ -494,7 +618,7 @@ static void dump_mf_bits (const HMETAFIL
     printf ("MetaFile %s has bits:\n{\n    ", desc);
     for (i=0; i<mfsize; i++)
     {
-        printf ("0x%.2hhx", buf[i]);
+        printf ("0x%02x", buf[i]);
         if (i == mfsize-1)
             printf ("\n");
         else if (i % 8 == 7)
@@ -610,7 +734,7 @@ static void dump_emf_records(const HENHM
     UINT mfsize, offset;
 
     mfsize = GetEnhMetaFileBits(mf, MF_BUFSIZE, buf);
-    ok (mfsize > 0, "%s: GetEnhMetaFileBits failed\n", desc);
+    ok (mfsize > 0, "%s: GetEnhMetaFileBits error %ld\n", desc, GetLastError());
 
     printf("EMF %s has records:\n", desc);
 
@@ -619,7 +743,7 @@ static void dump_emf_records(const HENHM
     while(offset < mfsize)
     {
         EMR *emr = (EMR *)(emf + offset);
-        trace("emr->iType %ld, emr->nSize %lu\n", emr->iType, emr->nSize);
+        printf("emr->iType %ld, emr->nSize %lu\n", emr->iType, emr->nSize);
         /*trace("emr->iType 0x%04lx, emr->nSize 0x%04lx\n", emr->iType, emr->nSize);*/
         offset += emr->nSize;
     }
@@ -639,13 +763,22 @@ static int compare_emf_bits(const HENHME
     int diff;
 
     mfsize = GetEnhMetaFileBits(mf, MF_BUFSIZE, buf);
-    ok (mfsize > 0, "%s: GetEnhMetaFileBits failed\n", desc);
+    ok (mfsize > 0, "%s: GetEnhMetaFileBits error %ld\n", desc, GetLastError());
 
     if (mfsize < MF_BUFSIZE)
+    {
+        if (mfsize != bsize && todo)
+        {
+        todo_wine
         ok(mfsize == bsize, "%s: mfsize=%d, bsize=%d\n", desc, mfsize, bsize);
+        }
+        else
+        ok(mfsize == bsize, "%s: mfsize=%d, bsize=%d\n", desc, mfsize, bsize);
+    }
     else
         ok(bsize >= MF_BUFSIZE, "%s: mfsize > bufsize (%d bytes), bsize=%d\n",
            desc, mfsize, bsize);
+
     if (mfsize != bsize)
         return -1;
 
@@ -662,7 +795,7 @@ static int compare_emf_bits(const HENHME
             ok(diff == 0, "%s: mfsize=%d, bsize=%d, diff=%d\n",
                desc, mfsize, bsize, diff);
         }
-        return 0;
+        return diff;
     }
     else
     {
@@ -1027,7 +1160,10 @@ static INT CALLBACK EmfEnumProc(HDC hdc,
      * until a record is played which actually outputs something */
     PlayEnhMetaFileRecord(hdc, lpHTable, lpEMFR, nObj);
     LPtoDP(hdc, mapping, 2);
-    trace("Meta record: iType = %ld, (%ld,%ld)-(%ld,%ld)\n", lpEMFR->iType, mapping[0].x, mapping[0].y, mapping[1].x, mapping[1].y);
+    trace("Meta record: iType %ld, nSize %ld, (%ld,%ld)-(%ld,%ld)\n",
+           lpEMFR->iType, lpEMFR->nSize,
+           mapping[0].x, mapping[0].y, mapping[1].x, mapping[1].y);
+
     if (lpEMFR->iType == EMR_LINETO)
     {
         INT x0, y0, x1, y1;
@@ -1069,6 +1205,13 @@ static HENHMETAFILE create_converted_emf
     ok(ret, "LineTo failed with error %ld\n", GetLastError());
     hmf = CloseMetaFile(hdcMf);
     ok(hmf != NULL, "CloseMetaFile failed with error %ld\n", GetLastError());
+
+    if (compare_mf_bits (hmf, MF_LINETO_BITS, sizeof(MF_LINETO_BITS), "mf_LineTo") != 0)
+    {
+        dump_mf_bits(hmf, "mf_LineTo");
+        EnumMetaFile(0, hmf, mf_enum_proc, 0);
+    }
+
     size = GetMetaFileBitsEx(hmf, 0, NULL);
     ok(size, "GetMetaFileBitsEx failed with error %ld\n", GetLastError());
     pBits = HeapAlloc(GetProcessHeap(), 0, size);
@@ -1090,7 +1233,16 @@ static void test_mf_conversions(void)
         mfp.yExt = 100;
         mfp.hMF = NULL;
         hemf = create_converted_emf(&mfp);
+
+        if (compare_emf_bits(hemf, EMF_LINETO_MM_ANISOTROPIC_BITS, sizeof(EMF_LINETO_MM_ANISOTROPIC_BITS),
+                             "emf_LineTo MM_ANISOTROPIC", TRUE) != 0)
+        {
+            dump_emf_bits(hemf, "emf_LineTo MM_ANISOTROPIC");
+            dump_emf_records(hemf, "emf_LineTo MM_ANISOTROPIC");
+        }
+
         EnumEnhMetaFile(hdcOffscreen, hemf, EmfEnumProc, &mfp, &rect);
+
         DeleteEnhMetaFile(hemf);
         DeleteDC(hdcOffscreen);
     }
@@ -1106,7 +1258,16 @@ static void test_mf_conversions(void)
         mfp.yExt = 0;
         mfp.hMF = NULL;
         hemf = create_converted_emf(&mfp);
+
+        if (compare_emf_bits(hemf, EMF_LINETO_MM_TEXT_BITS, sizeof(EMF_LINETO_MM_TEXT_BITS),
+                             "emf_LineTo MM_TEXT", TRUE) != 0)
+        {
+            dump_emf_bits(hemf, "emf_LineTo MM_TEXT");
+            dump_emf_records(hemf, "emf_LineTo MM_TEXT");
+        }
+
         EnumEnhMetaFile(hdcOffscreen, hemf, EmfEnumProc, &mfp, &rect);
+
         DeleteEnhMetaFile(hemf);
         DeleteDC(hdcOffscreen);
     }
@@ -1117,7 +1278,16 @@ static void test_mf_conversions(void)
         HENHMETAFILE hemf;
         RECT rect = { 0, 0, 100, 100 };
         hemf = create_converted_emf(NULL);
+
+        if (compare_emf_bits(hemf, EMF_LINETO_BITS, sizeof(EMF_LINETO_BITS),
+                             "emf_LineTo NULL", TRUE) != 0)
+        {
+            dump_emf_bits(hemf, "emf_LineTo NULL");
+            dump_emf_records(hemf, "emf_LineTo NULL");
+        }
+
         EnumEnhMetaFile(hdcOffscreen, hemf, EmfEnumProc, NULL, &rect);
+
         DeleteEnhMetaFile(hemf);
         DeleteDC(hdcOffscreen);
     }





More information about the wine-patches mailing list