From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx9_36/d3dx9_private.h | 9 +++++++++ dlls/d3dx9_36/tests/texture.c | 3 +-- dlls/d3dx9_36/tests/volume.c | 6 ++---- dlls/d3dx9_36/volume.c | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h index 248b6a69b00..ac7c06e73f6 100644 --- a/dlls/d3dx9_36/d3dx9_private.h +++ b/dlls/d3dx9_36/d3dx9_private.h @@ -33,6 +33,15 @@
#define FOURCC_TX_1 0x54580100
+#define D3DX9_FILTER_INVALID_BITS 0xff80fff8 +static inline HRESULT d3dx9_validate_filter(uint32_t filter) +{ + if ((filter & D3DX9_FILTER_INVALID_BITS) || !(filter & 0x7) || ((filter & 0x7) > D3DX_FILTER_BOX)) + return D3DERR_INVALIDCALL; + + return D3D_OK; +} + struct vec4 { float x, y, z, w; diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c index 495e9055f1e..0c02a9e7c65 100644 --- a/dlls/d3dx9_36/tests/texture.c +++ b/dlls/d3dx9_36/tests/texture.c @@ -1176,8 +1176,7 @@ static void test_D3DXFilterTexture(IDirect3DDevice9 *device) winetest_push_context("Filter %d (%#x)", i, test_filter_values[i].filter);
hr = D3DXFilterTexture((IDirect3DBaseTexture9 *)voltex, NULL, 0, test_filter_values[i].filter); - todo_wine_if(test_filter_values[i].d3dx_filter_texture_todo) ok(hr == test_filter_values[i].expected_hr, - "Unexpected hr %#lx.\n", hr); + ok(hr == test_filter_values[i].expected_hr, "Unexpected hr %#lx.\n", hr);
winetest_pop_context(); } diff --git a/dlls/d3dx9_36/tests/volume.c b/dlls/d3dx9_36/tests/volume.c index c961120eb0d..68eca7c531b 100644 --- a/dlls/d3dx9_36/tests/volume.c +++ b/dlls/d3dx9_36/tests/volume.c @@ -197,8 +197,7 @@ static void test_D3DXLoadVolumeFromMemory(IDirect3DDevice9 *device)
hr = D3DXLoadVolumeFromMemory(volume, NULL, &dst_box, pixels, D3DFMT_A8R8G8B8, 16, 32, NULL, &src_box, test_filter_values[i].filter, 0); - todo_wine_if(FAILED(test_filter_values[i].expected_hr)) ok(hr == test_filter_values[i].expected_hr, - "Unexpected hr %#lx.\n", hr); + ok(hr == test_filter_values[i].expected_hr, "Unexpected hr %#lx.\n", hr);
winetest_pop_context(); } @@ -278,8 +277,7 @@ static void test_D3DXLoadVolumeFromFileInMemory(IDirect3DDevice9 *device)
hr = D3DXLoadVolumeFromFileInMemory(volume, NULL, NULL, dds_24bit_8_8, sizeof(dds_24bit_8_8), NULL, test_filter_values[i].filter, 0, NULL); - todo_wine_if(FAILED(test_filter_values[i].expected_hr)) ok(hr == test_filter_values[i].expected_hr, - "Unexpected hr %#lx.\n", hr); + ok(hr == test_filter_values[i].expected_hr, "Unexpected hr %#lx.\n", hr);
winetest_pop_context(); } diff --git a/dlls/d3dx9_36/volume.c b/dlls/d3dx9_36/volume.c index 2088b70ed4c..a69588a4f37 100644 --- a/dlls/d3dx9_36/volume.c +++ b/dlls/d3dx9_36/volume.c @@ -111,6 +111,9 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume, if (filter == D3DX_DEFAULT) filter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER;
+ if (FAILED(hr = d3dx9_validate_filter(filter))) + return hr; + src_format_desc = get_format_info(src_format); if (src_format_desc->type == FORMAT_UNKNOWN) return E_NOTIMPL; @@ -180,6 +183,12 @@ HRESULT WINAPI D3DXLoadVolumeFromFileInMemory(IDirect3DVolume9 *dst_volume, cons if (!dst_volume || !src_data || !src_data_size) return D3DERR_INVALIDCALL;
+ if (filter == D3DX_DEFAULT) + filter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER; + + if (FAILED(hr = d3dx9_validate_filter(filter))) + return hr; + hr = d3dx_image_init(src_data, src_data_size, &image, 0, 0); if (FAILED(hr)) return D3DXERR_INVALIDDATA; @@ -231,6 +240,12 @@ HRESULT WINAPI D3DXLoadVolumeFromVolume(IDirect3DVolume9 *dst_volume, const PALE
if (!dst_volume || !src_volume) return D3DERR_INVALIDCALL;
+ if (filter == D3DX_DEFAULT) + filter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER; + + if (FAILED(hr = d3dx9_validate_filter(filter))) + return hr; + IDirect3DVolume9_GetDesc(src_volume, &desc);
if (!src_box)