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

This commit is contained in:
Dan Kegel 2012-06-19 18:08:07 -07:00 committed by Alexandre Julliard
parent cc373eef2b
commit b85270e3a5
2 changed files with 125 additions and 6 deletions

View File

@ -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;

View File

@ -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();