Dan Kegel : gdi32: Add test for SelectClipRgn in metafiles, make it pass.

Alexandre Julliard julliard at winehq.org
Wed Jun 20 13:49:43 CDT 2012


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

Author: Dan Kegel <dank at kegel.com>
Date:   Tue Jun 19 18:08:07 2012 -0700

gdi32: Add test for SelectClipRgn in metafiles, make it pass.

---

 dlls/gdi32/mfdrv/graphics.c |    6 +-
 dlls/gdi32/tests/metafile.c |  125 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 125 insertions(+), 6 deletions(-)

diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c
index 439fca5..e26076f 100644
--- a/dlls/gdi32/mfdrv/graphics.c
+++ b/dlls/gdi32/mfdrv/graphics.c
@@ -321,9 +321,9 @@ static INT16 MFDRV_CreateRegion(PHYSDEV dev, HRGN hrgn)
 
     mr->rdParm[0] = 0;
     mr->rdParm[1] = 6;
-    mr->rdParm[2] = 0x1234;
+    mr->rdParm[2] = 0x2f6;
     mr->rdParm[3] = 0;
-    mr->rdParm[4] = (Param - mr->rdParm) * sizeof(WORD);
+    mr->rdParm[4] = (Param - &mr->rdFunction) * sizeof(WORD);
     mr->rdParm[5] = Bands;
     mr->rdParm[6] = MaxBands;
     mr->rdParm[7] = rgndata->rdh.rcBound.left;
@@ -413,7 +413,7 @@ INT MFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode )
     if (!hrgn) return NULLREGION;
     iRgn = MFDRV_CreateRegion( dev, hrgn );
     if(iRgn == -1) return ERROR;
-    ret = MFDRV_MetaParam1( dev, META_SELECTCLIPREGION, iRgn ) ? NULLREGION : ERROR;
+    ret = MFDRV_MetaParam1( dev, META_SELECTOBJECT, iRgn ) ? NULLREGION : ERROR;
     MFDRV_MetaParam1( dev, META_DELETEOBJECT, iRgn );
     MFDRV_RemoveHandle( dev, iRgn );
     return ret;
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index df263c3..e6bab5d 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -2492,6 +2492,124 @@ todo_wine
     DeleteDC(hdc);
 }
 
+static const unsigned char MF_CLIP_BITS[] = {
+    /* METAHEADER */
+    0x01, 0x00,             /* mtType */
+    0x09, 0x00,             /* mtHeaderSize */
+    0x00, 0x03,             /* mtVersion */
+    0x32, 0x00, 0x00, 0x00, /* mtSize */
+    0x01, 0x00,             /* mtNoObjects */
+    0x14, 0x00, 0x00, 0x00, /* mtMaxRecord (size in words of longest record) */
+    0x00, 0x00,             /* reserved */
+
+    /* METARECORD for CreateRectRgn(0x11, 0x22, 0x33, 0x44) */
+    0x14, 0x00, 0x00, 0x00, /* rdSize in words */
+    0xff, 0x06,             /* META_CREATEREGION */
+    0x00, 0x00, 0x06, 0x00, 0xf6, 0x02, 0x00, 0x00,
+    0x24, 0x00, 0x01, 0x00, 0x02, 0x00, 0x11, 0x00,
+    0x22, 0x00, 0x33, 0x00, 0x44, 0x00, 0x02, 0x00,
+    0x22, 0x00, 0x44, 0x00, 0x11, 0x00, 0x33, 0x00,
+    0x02, 0x00,
+
+    /* METARECORD for SelectObject */
+    0x04, 0x00, 0x00, 0x00,
+    0x2d, 0x01,             /* META_SELECTOBJECT (not META_SELECTCLIPREGION?!) */
+    0x00, 0x00,
+
+    /* METARECORD */
+    0x04, 0x00, 0x00, 0x00,
+    0xf0, 0x01,             /* META_DELETEOBJECT */
+    0x00, 0x00,
+
+    /* METARECORD for MoveTo(1,0x30) */
+    0x05, 0x00, 0x00, 0x00, /* rdSize in words */
+    0x14, 0x02,             /* META_MOVETO */
+    0x30, 0x00,             /* y */
+    0x01, 0x00,             /* x */
+
+    /* METARECORD for LineTo(0x20, 0x30) */
+    0x05, 0x00, 0x00, 0x00, /* rdSize in words */
+    0x13, 0x02,             /* META_LINETO */
+    0x30, 0x00,             /* y */
+    0x20, 0x00,             /* x */
+
+    /* EOF */
+    0x03, 0x00, 0x00, 0x00,
+    0x00, 0x00
+};
+
+static int clip_mf_enum_proc_seen_selectclipregion;
+static int clip_mf_enum_proc_seen_selectobject;
+
+static int CALLBACK clip_mf_enum_proc(HDC hdc, HANDLETABLE *handle_table,
+                                       METARECORD *mr, int n_objs, LPARAM param)
+{
+    switch (mr->rdFunction) {
+    case META_SELECTCLIPREGION:
+        clip_mf_enum_proc_seen_selectclipregion++;
+        break;
+    case META_SELECTOBJECT:
+        clip_mf_enum_proc_seen_selectobject++;
+        break;
+    }
+    return 1;
+}
+
+static void test_mf_clipping(void)
+{
+                          /* left top right bottom */
+    static RECT rc_clip = { 0x11, 0x22, 0x33, 0x44 };
+    HWND hwnd;
+    HDC hdc;
+    HMETAFILE hmf;
+    HRGN hrgn;
+    INT ret;
+
+    SetLastError(0xdeadbeef);
+    hdc = CreateMetaFileA(NULL);
+    ok(hdc != 0, "CreateMetaFileA error %d\n", GetLastError());
+
+    hrgn = CreateRectRgn(rc_clip.left, rc_clip.top, rc_clip.right, rc_clip.bottom);
+    ret = SelectClipRgn(hdc, hrgn);
+    /* Seems like it should be SIMPLEREGION, but windows returns NULLREGION? */
+    ok(ret == NULLREGION, "expected NULLREGION, got %d\n", ret);
+
+    /* Draw a line that starts off left of the clip region and ends inside it */
+    MoveToEx(hdc, 0x1, 0x30, NULL);
+    LineTo(hdc,  0x20, 0x30);
+
+    SetLastError(0xdeadbeef);
+    hmf = CloseMetaFile(hdc);
+    ok(hmf != 0, "CloseMetaFile error %d\n", GetLastError());
+
+    if (compare_mf_bits(hmf, MF_CLIP_BITS, sizeof(MF_CLIP_BITS),
+        "mf_clipping") != 0)
+    {
+        dump_mf_bits(hmf, "mf_clipping");
+    }
+
+    DeleteObject(hrgn);
+
+    hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP | WS_VISIBLE,
+                           0, 0, 200, 200, 0, 0, 0, NULL);
+    ok(hwnd != 0, "CreateWindowExA error %d\n", GetLastError());
+
+    hdc = GetDC(hwnd);
+
+    ret = EnumMetaFile(hdc, hmf, clip_mf_enum_proc, (LPARAM)&rc_clip);
+    ok(ret, "EnumMetaFile error %d\n", GetLastError());
+
+    /* Oddly, windows doesn't seem to use META_SELECTCLIPREGION */
+    ok(clip_mf_enum_proc_seen_selectclipregion == 0,
+       "expected 0 selectclipregion, saw %d\n", clip_mf_enum_proc_seen_selectclipregion);
+    ok(clip_mf_enum_proc_seen_selectobject == 1,
+       "expected 1 selectobject, saw %d\n", clip_mf_enum_proc_seen_selectobject);
+
+    DeleteMetaFile(hmf);
+    ReleaseDC(hwnd, hdc);
+    DestroyWindow(hwnd);
+}
+
 static INT CALLBACK EmfEnumProc(HDC hdc, HANDLETABLE *lpHTable, const ENHMETARECORD *lpEMFR, INT nObj, LPARAM lpData)
 {
     LPMETAFILEPICT lpMFP = (LPMETAFILEPICT)lpData;
@@ -3205,6 +3323,9 @@ START_TEST(metafile)
     test_SaveDC();
     test_emf_BitBlt();
     test_emf_DCBrush();
+    test_emf_ExtTextOut_on_path();
+    test_emf_clipping();
+    test_emf_polybezier();
 
     /* For win-format metafiles (mfdrv) */
     test_mf_SaveDC();
@@ -3215,9 +3336,7 @@ START_TEST(metafile)
     test_CopyMetaFile();
     test_SetMetaFileBits();
     test_mf_ExtTextOut_on_path();
-    test_emf_ExtTextOut_on_path();
-    test_emf_clipping();
-    test_emf_polybezier();
+    test_mf_clipping();
 
     /* For metafile conversions */
     test_mf_conversions();




More information about the wine-cvs mailing list