gdi32: Update the DC mappings when the layout is changed.
This commit is contained in:
parent
480117fdaf
commit
f695c1d19d
|
@ -289,6 +289,7 @@ static void construct_window_to_viewport(DC *dc, XFORM *xform)
|
||||||
scaleX = (double)dc->vportExtX / (double)dc->wndExtX;
|
scaleX = (double)dc->vportExtX / (double)dc->wndExtX;
|
||||||
scaleY = (double)dc->vportExtY / (double)dc->wndExtY;
|
scaleY = (double)dc->vportExtY / (double)dc->wndExtY;
|
||||||
|
|
||||||
|
if (dc->layout & LAYOUT_RTL) scaleX = -scaleX;
|
||||||
xform->eM11 = scaleX;
|
xform->eM11 = scaleX;
|
||||||
xform->eM12 = 0.0;
|
xform->eM12 = 0.0;
|
||||||
xform->eM21 = 0.0;
|
xform->eM21 = 0.0;
|
||||||
|
@ -1948,6 +1949,11 @@ DWORD WINAPI SetLayout(HDC hdc, DWORD layout)
|
||||||
{
|
{
|
||||||
oldlayout = dc->layout;
|
oldlayout = dc->layout;
|
||||||
dc->layout = layout;
|
dc->layout = layout;
|
||||||
|
if (layout != oldlayout)
|
||||||
|
{
|
||||||
|
if (layout & LAYOUT_RTL) dc->MapMode = MM_ANISOTROPIC;
|
||||||
|
DC_UpdateXforms( dc );
|
||||||
|
}
|
||||||
release_dc_ptr( dc );
|
release_dc_ptr( dc );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,8 @@ INT WINAPI SetMapMode( HDC hdc, INT mode )
|
||||||
default:
|
default:
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
dc->MapMode = mode;
|
/* RTL layout is always MM_ANISOTROPIC */
|
||||||
|
if (!(dc->layout & LAYOUT_RTL)) dc->MapMode = mode;
|
||||||
DC_UpdateXforms( dc );
|
DC_UpdateXforms( dc );
|
||||||
done:
|
done:
|
||||||
release_dc_ptr( dc );
|
release_dc_ptr( dc );
|
||||||
|
|
|
@ -217,6 +217,81 @@ static void test_world_transform(void)
|
||||||
DeleteDC(hdc);
|
DeleteDC(hdc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_dc_layout(void)
|
||||||
|
{
|
||||||
|
INT ret, size_cx, size_cy, res_x, res_y, dpi_x, dpi_y;
|
||||||
|
SIZE size;
|
||||||
|
DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
|
||||||
|
DWORD (WINAPI *pGetLayout)(HDC hdc);
|
||||||
|
HDC hdc;
|
||||||
|
|
||||||
|
pGetLayout = (void *)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GetLayout");
|
||||||
|
pSetLayout = (void *)GetProcAddress(GetModuleHandleA("gdi32.dll"), "SetLayout");
|
||||||
|
if (!pGetLayout || !pSetLayout)
|
||||||
|
{
|
||||||
|
win_skip( "Don't have SetLayout\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hdc = CreateCompatibleDC(0);
|
||||||
|
|
||||||
|
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, 1000);
|
||||||
|
|
||||||
|
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), -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);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_modify_world_transform(void)
|
static void test_modify_world_transform(void)
|
||||||
{
|
{
|
||||||
HDC hdc = GetDC(0);
|
HDC hdc = GetDC(0);
|
||||||
|
@ -562,6 +637,7 @@ START_TEST(mapping)
|
||||||
{
|
{
|
||||||
test_modify_world_transform();
|
test_modify_world_transform();
|
||||||
test_world_transform();
|
test_world_transform();
|
||||||
|
test_dc_layout();
|
||||||
test_isotropic_mapping();
|
test_isotropic_mapping();
|
||||||
test_setvirtualresolution();
|
test_setvirtualresolution();
|
||||||
test_gettransform();
|
test_gettransform();
|
||||||
|
|
Loading…
Reference in New Issue