1490
1495
DestroyWindow(window);
1498
static void test_ck_rgba(void)
1500
static D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
1503
struct vec4 position;
1504
struct vec2 texcoord;
1508
{{ 0.0f, 480.0f, 0.25f, 1.0f}, {0.0f, 0.0f}},
1509
{{ 0.0f, 0.0f, 0.25f, 1.0f}, {0.0f, 1.0f}},
1510
{{640.0f, 480.0f, 0.25f, 1.0f}, {1.0f, 0.0f}},
1511
{{640.0f, 0.0f, 0.25f, 1.0f}, {1.0f, 1.0f}},
1512
{{ 0.0f, 480.0f, 0.75f, 1.0f}, {0.0f, 0.0f}},
1513
{{ 0.0f, 0.0f, 0.75f, 1.0f}, {0.0f, 1.0f}},
1514
{{640.0f, 480.0f, 0.75f, 1.0f}, {1.0f, 0.0f}},
1515
{{640.0f, 0.0f, 0.75f, 1.0f}, {1.0f, 1.0f}},
1519
D3DCOLOR fill_color;
1527
{0xff00ff00, TRUE, TRUE, 0x00ff0000, 0x000000ff},
1528
{0xff00ff00, TRUE, FALSE, 0x00ff0000, 0x000000ff},
1529
{0xff00ff00, FALSE, TRUE, 0x0000ff00, 0x0000ff00},
1530
{0xff00ff00, FALSE, FALSE, 0x0000ff00, 0x0000ff00},
1531
{0x7f00ff00, TRUE, TRUE, 0x00807f00, 0x00807f00},
1532
{0x7f00ff00, TRUE, FALSE, 0x0000ff00, 0x0000ff00},
1533
{0x7f00ff00, FALSE, TRUE, 0x00807f00, 0x00807f00},
1534
{0x7f00ff00, FALSE, FALSE, 0x0000ff00, 0x0000ff00},
1537
IDirectDrawSurface4 *surface;
1538
IDirect3DViewport3 *viewport;
1539
DDSURFACEDESC2 surface_desc;
1540
IDirect3DTexture2 *texture;
1541
IDirect3DDevice3 *device;
1542
IDirectDrawSurface4 *rt;
1543
IDirectDraw4 *ddraw;
1552
window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
1553
0, 0, 640, 480, 0, 0, 0, 0);
1554
if (!(device = create_device(window, DDSCL_NORMAL)))
1556
skip("Failed to create D3D device, skipping test.\n");
1557
DestroyWindow(window);
1561
hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
1562
ok(SUCCEEDED(hr), "Failed to get d3d interface, hr %#x.\n", hr);
1564
hr = IDirect3D3_CreateViewport(d3d, &viewport, NULL);
1565
ok(SUCCEEDED(hr), "Failed to create viewport, hr %#x.\n", hr);
1566
hr = IDirect3DDevice3_AddViewport(device, viewport);
1567
ok(SUCCEEDED(hr), "Failed to add viewport, hr %#x.\n", hr);
1568
memset(&vp, 0, sizeof(vp));
1569
vp.dwSize = sizeof(vp);
1576
vp.dvClipWidth = 2.0f;
1577
vp.dvClipHeight = 2.0f;
1580
hr = IDirect3DViewport3_SetViewport2(viewport, &vp);
1581
ok(SUCCEEDED(hr), "Failed to set viewport data, hr %#x.\n", hr);
1582
hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
1583
ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
1584
hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
1585
ok(SUCCEEDED(hr), "Failed to get ddraw interface, hr %#x.\n", hr);
1587
IDirect3D3_Release(d3d);
1589
memset(&surface_desc, 0, sizeof(surface_desc));
1590
surface_desc.dwSize = sizeof(surface_desc);
1591
surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CKSRCBLT;
1592
surface_desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
1593
surface_desc.dwWidth = 256;
1594
surface_desc.dwHeight = 256;
1595
U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat);
1596
U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
1597
U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32;
1598
U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0x00ff0000;
1599
U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x0000ff00;
1600
U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff;
1601
U5(U4(surface_desc).ddpfPixelFormat).dwRGBAlphaBitMask = 0xff000000;
1602
surface_desc.ddckCKSrcBlt.dwColorSpaceLowValue = 0xff00ff00;
1603
surface_desc.ddckCKSrcBlt.dwColorSpaceHighValue = 0xff00ff00;
1604
hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
1605
ok(SUCCEEDED(hr), "Failed to create destination surface, hr %#x.\n", hr);
1606
hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirect3DTexture2, (void **)&texture);
1607
ok(SUCCEEDED(hr), "Failed to get texture interface, hr %#x.\n", hr);
1609
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
1610
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
1611
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA);
1612
ok(SUCCEEDED(hr), "Failed to enable alpha blending, hr %#x.\n", hr);
1613
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);
1614
ok(SUCCEEDED(hr), "Failed to enable alpha blending, hr %#x.\n", hr);
1616
hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
1617
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
1619
for (i = 0; i < sizeof(tests) / sizeof(*tests); ++i)
1621
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_COLORKEYENABLE, tests[i].color_key);
1622
ok(SUCCEEDED(hr), "Failed to enable color keying, hr %#x.\n", hr);
1623
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_ALPHABLENDENABLE, tests[i].blend);
1624
ok(SUCCEEDED(hr), "Failed to enable alpha blending, hr %#x.\n", hr);
1626
memset(&fx, 0, sizeof(fx));
1627
fx.dwSize = sizeof(fx);
1628
U5(fx).dwFillColor = tests[i].fill_color;
1629
hr = IDirectDrawSurface4_Blt(surface, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
1630
ok(SUCCEEDED(hr), "Failed to fill texture, hr %#x.\n", hr);
1632
hr = IDirect3DViewport3_Clear2(viewport, 1, &clear_rect,
1633
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffff0000, 1.0f, 0);
1634
ok(SUCCEEDED(hr), "Failed to clear viewport, hr %#x.\n", hr);
1635
hr = IDirect3DDevice3_BeginScene(device);
1636
ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
1637
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_TEX1, &tquad[0], 4, 0);
1638
ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
1639
hr = IDirect3DDevice3_EndScene(device);
1640
ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
1642
color = get_surface_color(rt, 320, 240);
1644
todo_wine ok(compare_color(color, tests[i].result1, 1), "Expected color 0x%08x for test %u, got 0x%08x.\n",
1645
tests[i].result1, i, color);
1647
ok(compare_color(color, tests[i].result1, 1), "Expected color 0x%08x for test %u, got 0x%08x.\n",
1648
tests[i].result1, i, color);
1650
U5(fx).dwFillColor = 0xff0000ff;
1651
hr = IDirectDrawSurface4_Blt(surface, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
1652
ok(SUCCEEDED(hr), "Failed to fill texture, hr %#x.\n", hr);
1654
hr = IDirect3DDevice3_BeginScene(device);
1655
ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
1656
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP, D3DFVF_XYZRHW | D3DFVF_TEX1, &tquad[4], 4, 0);
1657
ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
1658
hr = IDirect3DDevice3_EndScene(device);
1659
ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
1661
/* This tests that fragments that are masked out by the color key are
1662
* discarded, instead of just fully transparent. */
1663
color = get_surface_color(rt, 320, 240);
1665
todo_wine ok(compare_color(color, tests[i].result2, 1), "Expected color 0x%08x for test %u, got 0x%08x.\n",
1666
tests[i].result2, i, color);
1668
ok(compare_color(color, tests[i].result2, 1), "Expected color 0x%08x for test %u, got 0x%08x.\n",
1669
tests[i].result2, i, color);
1672
IDirectDrawSurface4_Release(rt);
1673
IDirect3DTexture2_Release(texture);
1674
IDirectDrawSurface4_Release(surface);
1675
hr = IDirect3DDevice3_DeleteViewport(device, viewport);
1676
ok(SUCCEEDED(hr), "Failed to delete viewport, hr %#x.\n", hr);
1677
IDirect3DViewport3_Release(viewport);
1678
IDirectDraw4_Release(ddraw);
1679
IDirect3DDevice3_Release(device);
1680
DestroyWindow(window);
1493
1683
START_TEST(ddraw4)
1495
1685
test_process_vertices();