From 8b17b0f5c6b469758fe78228611ad7f0b9a93d69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Fri, 4 May 2012 13:01:23 +0200 Subject: [PATCH] d3dx9/tests: Add tests for D3DXSaveSurfaceToFile. --- dlls/d3dx9_36/tests/surface.c | 84 +++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c index 79d4bc3402..2138e45d12 100644 --- a/dlls/d3dx9_36/tests/surface.c +++ b/dlls/d3dx9_36/tests/surface.c @@ -917,6 +917,89 @@ static void test_D3DXCreateVolumeTexture(IDirect3DDevice9 *device) } } +static void test_D3DXSaveSurfaceToFile(IDirect3DDevice9 *device) +{ + HRESULT hr; + IDirect3DSurface9 *surface; + RECT rect; + D3DLOCKED_RECT lock_rect; + D3DXIMAGE_INFO image_info; + const BYTE pixels[] = { 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0xff }; + DWORD pitch = sizeof(pixels) / 2; + + hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 2, 2, D3DFMT_R8G8B8, D3DPOOL_SCRATCH, &surface, NULL); + if (FAILED(hr)) { + skip("Couldn't create surface\n"); + return; + } + + SetRect(&rect, 0, 0, 2, 2); + hr = D3DXLoadSurfaceFromMemory(surface, NULL, NULL, pixels, D3DFMT_R8G8B8, pitch, NULL, &rect, D3DX_FILTER_NONE, 0); + if (SUCCEEDED(hr)) { + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, NULL); + ok(hr == D3D_OK, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3D_OK); + + hr = D3DXLoadSurfaceFromFileA(surface, NULL, NULL, "saved_surface.bmp", NULL, D3DX_FILTER_NONE, 0, &image_info); + ok(hr == D3D_OK, "Couldn't load saved surface %#x\n", hr); + if (FAILED(hr)) goto next_tests; + + ok(image_info.Width == 2, "Wrong width %u\n", image_info.Width); + ok(image_info.Height == 2, "Wrong height %u\n", image_info.Height); + ok(image_info.Format == D3DFMT_R8G8B8, "Wrong format %#x\n", image_info.Format); + ok(image_info.ImageFileFormat == D3DXIFF_BMP, "Wrong file format %u\n", image_info.ImageFileFormat); + + hr = IDirect3DSurface9_LockRect(surface, &lock_rect, NULL, D3DLOCK_READONLY); + ok(hr == D3D_OK, "Couldn't lock surface %#x\n", hr); + if (FAILED(hr)) goto next_tests; + + ok(!memcmp(lock_rect.pBits, pixels, pitch), "Pixel data mismatch in first row\n"); + ok(!memcmp((BYTE *)lock_rect.pBits + lock_rect.Pitch, pixels + pitch, pitch), "Pixel data mismatch in second row\n"); + + IDirect3DSurface9_UnlockRect(surface); + } else skip("Couldn't fill surface\n"); + +next_tests: + hr = D3DXSaveSurfaceToFileA(NULL, D3DXIFF_BMP, surface, NULL, NULL); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + + /* PPM and TGA are supported, even though MSDN claims they aren't */ + todo_wine { + hr = D3DXSaveSurfaceToFileA("saved_surface.ppm", D3DXIFF_PPM, surface, NULL, NULL); + ok(hr == D3D_OK, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3D_OK); + hr = D3DXSaveSurfaceToFileA("saved_surface.tga", D3DXIFF_TGA, surface, NULL, NULL); + ok(hr == D3D_OK, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3D_OK); + hr = D3DXSaveSurfaceToFileA("saved_surface.dds", D3DXIFF_DDS, surface, NULL, NULL); + ok(hr == D3D_OK, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3D_OK); + } + + hr = D3DXSaveSurfaceToFileA("saved_surface", D3DXIFF_PFM + 1, surface, NULL, NULL); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + + SetRect(&rect, 0, 0, 4, 4); + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, &rect); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + SetRect(&rect, 2, 0, 1, 4); + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, &rect); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + SetRect(&rect, 0, 2, 4, 1); + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, &rect); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + SetRect(&rect, -1, -1, 2, 2); + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, &rect); + ok(hr == D3DERR_INVALIDCALL, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + SetRect(&rect, 0, 0, 0, 0); + hr = D3DXSaveSurfaceToFileA("saved_surface.bmp", D3DXIFF_BMP, surface, NULL, &rect); + ok(hr == D3D_OK, "D3DXSaveSurfaceToFileA returned %#x, expected %#x\n", hr, D3D_OK); + + DeleteFileA("saved_surface.bmp"); + DeleteFileA("saved_surface.ppm"); + DeleteFileA("saved_surface.tga"); + DeleteFileA("saved_surface.dds"); + + IDirect3DSurface9_Release(surface); +} + START_TEST(surface) { HWND wnd; @@ -952,6 +1035,7 @@ START_TEST(surface) test_D3DXLoadSurface(device); test_D3DXCreateCubeTexture(device); test_D3DXCreateVolumeTexture(device); + test_D3DXSaveSurfaceToFile(device); check_release((IUnknown*)device, 0); check_release((IUnknown*)d3d, 0);