static void test_gettransform(void) { HDC hdc = CreateICA("DISPLAY", NULL, NULL, NULL); BOOL (WINAPI *pGetTransform)(HDC, DWORD, XFORM *); XFORM xform, expect; BOOL r; SIZE lometric_vp, lometric_wnd; pGetTransform = (void *)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GetTransform"); if(!pGetTransform) { win_skip("Don't have GetTransform\n"); return; } r = pGetTransform(hdc, 0x203, &xform); /* World -> Page */ ok(r == TRUE, "got %d\n", r); expect_identity(__LINE__, &xform); r = pGetTransform(hdc, 0x304, &xform); /* Page -> Device */ ok(r == TRUE, "got %d\n", r); expect_identity(__LINE__, &xform); r = pGetTransform(hdc, 0x204, &xform); /* World -> Device */ ok(r == TRUE, "got %d\n", r); expect_identity(__LINE__, &xform); r = pGetTransform(hdc, 0x402, &xform); /* Device -> World */ ok(r == TRUE, "got %d\n", r); expect_identity(__LINE__, &xform); SetMapMode(hdc, MM_LOMETRIC); GetViewportExtEx(hdc, &lometric_vp); GetWindowExtEx(hdc, &lometric_wnd); r = pGetTransform(hdc, 0x203, &xform); /* World -> Page */ ok(r == TRUE, "got %d\n", r); expect_identity(__LINE__, &xform); r = pGetTransform(hdc, 0x304, &xform); /* Page -> Device */ ok(r == TRUE, "got %d\n", r); expect.eM11 = (FLOAT) lometric_vp.cx / lometric_wnd.cx; expect.eM12 = expect.eM21 = 0.0; expect.eM22 = (FLOAT) lometric_vp.cy / lometric_wnd.cy; expect.eDx = expect.eDy = 0.0; xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x204, &xform); /* World -> Device */ ok(r == TRUE, "got %d\n", r); xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x402, &xform); /* Device -> World */ ok(r == TRUE, "got %d\n", r); expect.eM11 = (FLOAT) lometric_wnd.cx / lometric_vp.cx; expect.eM22 = (FLOAT) lometric_wnd.cy / lometric_vp.cy; xform_near_match(__LINE__, &xform, &expect); SetGraphicsMode(hdc, GM_ADVANCED); expect.eM11 = 10.0; expect.eM22 = 20.0; SetWorldTransform(hdc, &expect); r = pGetTransform(hdc, 0x203, &xform); /* World -> Page */ ok(r == TRUE, "got %d\n", r); xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x304, &xform); /* Page -> Device */ ok(r == TRUE, "got %d\n", r); expect.eM11 = (FLOAT) lometric_vp.cx / lometric_wnd.cx; expect.eM22 = (FLOAT) lometric_vp.cy / lometric_wnd.cy; xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x204, &xform); /* World -> Device */ ok(r == TRUE, "got %d\n", r); expect.eM11 *= 10.0; expect.eM22 *= 20.0; xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x402, &xform); /* Device -> World */ ok(r == TRUE, "got %d\n", r); expect.eM11 = 1 / expect.eM11; expect.eM22 = 1 / expect.eM22; xform_near_match(__LINE__, &xform, &expect); r = pGetTransform(hdc, 0x102, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x103, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x104, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x202, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x302, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x303, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x403, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0x404, &xform); ok(r == FALSE, "got %d\n", r); r = pGetTransform(hdc, 0xffff, &xform); ok(r == FALSE, "got %d\n", r); }
static void test_dc_layout(void) { INT ret, size_cx, size_cy, res_x, res_y, dpi_x, dpi_y; SIZE size; POINT pt; HBITMAP bitmap; RECT rc, ret_rc; HDC hdc; HRGN hrgn; if (!pGetLayout || !pSetLayout) { win_skip( "Don't have SetLayout\n" ); return; } hdc = CreateCompatibleDC(0); bitmap = CreateCompatibleBitmap( hdc, 100, 100 ); SelectObject( hdc, bitmap ); size_cx = GetDeviceCaps(hdc, HORZSIZE); size_cy = GetDeviceCaps(hdc, VERTSIZE); res_x = GetDeviceCaps(hdc, HORZRES); res_y = GetDeviceCaps(hdc, VERTRES); dpi_x = GetDeviceCaps(hdc, LOGPIXELSX); dpi_y = GetDeviceCaps(hdc, LOGPIXELSY); ret = GetMapMode( hdc ); ok(ret == MM_TEXT, "expected MM_TEXT, got %d\n", ret); expect_viewport_ext(hdc, 1, 1); expect_window_ext(hdc, 1, 1); expect_world_transform(hdc, 1.0, 1.0); expect_LPtoDP(hdc, 1000, 1000); pSetLayout( hdc, LAYOUT_RTL ); if (!pGetLayout( hdc )) { win_skip( "SetLayout not supported\n" ); DeleteDC(hdc); return; } ret = GetMapMode( hdc ); ok(ret == MM_ANISOTROPIC, "expected MM_ANISOTROPIC, got %d\n", ret); expect_viewport_ext(hdc, 1, 1); expect_window_ext(hdc, 1, 1); expect_world_transform(hdc, 1.0, 1.0); expect_LPtoDP(hdc, -1000 + 99, 1000); GetViewportOrgEx( hdc, &pt ); ok( pt.x == 0 && pt.y == 0, "wrong origin %d,%d\n", pt.x, pt.y ); GetWindowOrgEx( hdc, &pt ); ok( pt.x == 0 && pt.y == 0, "wrong origin %d,%d\n", pt.x, pt.y ); GetDCOrgEx( hdc, &pt ); ok( pt.x == 0 && pt.y == 0, "wrong origin %d,%d\n", pt.x, pt.y ); if (pGetTransform) { XFORM xform; BOOL ret = pGetTransform( hdc, 0x204, &xform ); /* World -> Device */ ok( ret, "got %d\n", ret ); ok( xform.eM11 == -1.0, "got %f\n", xform.eM11 ); ok( xform.eM12 == 0.0, "got %f\n", xform.eM12 ); ok( xform.eM21 == 0.0, "got %f\n", xform.eM21 ); ok( xform.eM22 == 1.0, "got %f\n", xform.eM22 ); ok( xform.eDx == 99.0, "got %f\n", xform.eDx ); ok( xform.eDy == 0.0, "got %f\n", xform.eDy ); } SetRect( &rc, 10, 10, 20, 20 ); IntersectClipRect( hdc, 10, 10, 20, 20 ); hrgn = CreateRectRgn( 0, 0, 0, 0 ); GetClipRgn( hdc, hrgn ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); pSetLayout( hdc, LAYOUT_LTR ); SetRect( &rc, 80, 10, 90, 20 ); GetClipRgn( hdc, hrgn ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); GetClipBox( hdc, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); IntersectClipRect( hdc, 80, 10, 85, 20 ); pSetLayout( hdc, LAYOUT_RTL ); SetRect( &rc, 15, 10, 20, 20 ); GetClipRgn( hdc, hrgn ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); GetClipBox( hdc, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); SetRectRgn( hrgn, 60, 10, 80, 20 ); pSetLayout( hdc, LAYOUT_LTR ); ExtSelectClipRgn( hdc, hrgn, RGN_OR ); pSetLayout( hdc, LAYOUT_RTL ); SetRect( &rc, 15, 10, 40, 20 ); GetClipRgn( hdc, hrgn ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); GetClipBox( hdc, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); /* OffsetClipRgn mirrors too */ OffsetClipRgn( hdc, 5, 5 ); OffsetRect( &rc, 5, 5 ); GetClipRgn( hdc, hrgn ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); /* GetRandomRgn returns the raw region */ if (pGetRandomRgn) { SetRect( &rc, 55, 15, 80, 25 ); pGetRandomRgn( hdc, hrgn, 1 ); GetRgnBox( hrgn, &ret_rc ); ok( EqualRect( &rc, &ret_rc ), "wrong clip box %d,%d - %d,%d\n", ret_rc.left, ret_rc.top, ret_rc.right, ret_rc.bottom ); } SetMapMode(hdc, MM_LOMETRIC); ret = GetMapMode( hdc ); ok(ret == MM_ANISOTROPIC, "expected MM_ANISOTROPIC, got %d\n", ret); expect_viewport_ext(hdc, res_x, -res_y); ok( GetWindowExtEx( hdc, &size ), "GetWindowExtEx failed\n" ); ok( rough_match( size.cx, size_cx * 10 ) || rough_match( size.cx, MulDiv( res_x, 254, dpi_x )), /* Vista uses a more precise method */ "expected cx %d or %d, got %d\n", size_cx * 10, MulDiv( res_x, 254, dpi_x ), size.cx ); ok( rough_match( size.cy, size_cy * 10 ) || rough_match( size.cy, MulDiv( res_y, 254, dpi_y )), /* Vista uses a more precise method */ "expected cy %d or %d, got %d\n", size_cy * 10, MulDiv( res_y, 254, dpi_y ), size.cy ); expect_world_transform(hdc, 1.0, 1.0); expect_LPtoDP(hdc, -MulDiv(1000 / 10, res_x, size_cx) + 99, -MulDiv(1000 / 10, res_y, size_cy)); SetMapMode(hdc, MM_TEXT); ret = GetMapMode( hdc ); ok(ret == MM_ANISOTROPIC, "expected MM_ANISOTROPIC, got %d\n", ret); pSetLayout( hdc, LAYOUT_LTR ); ret = GetMapMode( hdc ); ok(ret == MM_ANISOTROPIC, "expected MM_ANISOTROPIC, got %d\n", ret); SetMapMode(hdc, MM_TEXT); ret = GetMapMode( hdc ); ok(ret == MM_TEXT, "expected MM_TEXT, got %d\n", ret); DeleteDC(hdc); DeleteObject( bitmap ); }