From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/d3dx11_43/async.c | 40 ++++++++++--------------- dlls/d3dx11_43/d3dx11_43_main.c | 22 -------------- dlls/d3dx11_43/dxhelpers.h | 2 ++ dlls/d3dx11_43/tests/d3dx11.c | 10 +++---- dlls/d3dx11_43/texture.c | 53 +++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 52 deletions(-) diff --git a/dlls/d3dx11_43/async.c b/dlls/d3dx11_43/async.c index 074a8529e4e..897f33d6851 100644 --- a/dlls/d3dx11_43/async.c +++ b/dlls/d3dx11_43/async.c @@ -18,6 +18,7 @@ #include "d3dx11.h" #include "d3dcompiler.h" +#include "dxhelpers.h" #include "wine/debug.h" @@ -83,38 +84,29 @@ static const ID3DX11DataLoaderVtbl memorydataloadervtbl = memorydataloader_Destroy }; +HRESULT load_file(const WCHAR *path, void **data, DWORD *size) +{ + uint32_t file_size; + HRESULT hr; + + if ((hr = d3dx_load_file(path, data, &file_size)) == ERROR_FILE_NOT_FOUND) + return D3D11_ERROR_FILE_NOT_FOUND; + *size = file_size; + return hr; +} + static HRESULT WINAPI filedataloader_Load(ID3DX11DataLoader *iface) { struct asyncdataloader *loader = impl_from_ID3DX11DataLoader(iface); - DWORD size, read_len; - HANDLE file; void *data; - BOOL ret; + DWORD size; + HRESULT hr; TRACE("iface %p.\n", iface); /* Always buffer file contents, even if Load() was already called. */ - file = CreateFileW(loader->u.file.path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (file == INVALID_HANDLE_VALUE) - return D3D11_ERROR_FILE_NOT_FOUND; - - size = GetFileSize(file, NULL); - data = malloc(size); - if (!data) - { - CloseHandle(file); - return E_OUTOFMEMORY; - } - - ret = ReadFile(file, data, size, &read_len, NULL); - CloseHandle(file); - if (!ret) - { - ERR("Failed to read file contents.\n"); - free(data); - return E_FAIL; - } + if (FAILED((hr = load_file(loader->u.file.path, &data, &size)))) + return hr; free(loader->data); loader->data = data; diff --git a/dlls/d3dx11_43/d3dx11_43_main.c b/dlls/d3dx11_43/d3dx11_43_main.c index 00c1db35e42..6e90891e7ce 100644 --- a/dlls/d3dx11_43/d3dx11_43_main.c +++ b/dlls/d3dx11_43/d3dx11_43_main.c @@ -44,25 +44,3 @@ HRESULT WINAPI D3DX11FilterTexture(ID3D11DeviceContext *context, ID3D11Resource return E_NOTIMPL; } - -HRESULT WINAPI D3DX11GetImageInfoFromFileA(const char *filename, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *img_info, - HRESULT *hresult) -{ - FIXME("filename %s, pump %p, img_info %p, hresult %p stub!\n", debugstr_a(filename), pump, img_info, hresult); - - if (!filename) - return E_FAIL; - - return E_NOTIMPL; -} - -HRESULT WINAPI D3DX11GetImageInfoFromFileW(const WCHAR *filename, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *img_info, - HRESULT *hresult) -{ - FIXME("filename %s, pump %p, img_info %p, hresult %p stub!\n", debugstr_w(filename), pump, img_info, hresult); - - if (!filename) - return E_FAIL; - - return E_NOTIMPL; -} diff --git a/dlls/d3dx11_43/dxhelpers.h b/dlls/d3dx11_43/dxhelpers.h index 5be2ac93944..1b31c2cf6d2 100644 --- a/dlls/d3dx11_43/dxhelpers.h +++ b/dlls/d3dx11_43/dxhelpers.h @@ -18,4 +18,6 @@ #include "d3dx_helpers.h" +HRESULT load_file(const WCHAR *path, void **data, DWORD *size); + HRESULT get_image_info(const void *data, SIZE_T size, D3DX11_IMAGE_INFO *img_info); diff --git a/dlls/d3dx11_43/tests/d3dx11.c b/dlls/d3dx11_43/tests/d3dx11.c index 8210329e6d5..b759c932053 100644 --- a/dlls/d3dx11_43/tests/d3dx11.c +++ b/dlls/d3dx11_43/tests/d3dx11.c @@ -3564,18 +3564,17 @@ static void test_get_image_info(void) ok(hr2 == 0xdeadbeef, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileW(L"deadbeaf", NULL, &image_info, &hr2); - todo_wine ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); - todo_wine ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); + ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); + ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileA(NULL, NULL, &image_info, &hr2); ok(hr == E_FAIL, "Got unexpected hr %#lx.\n", hr); ok(hr2 == 0xdeadbeef, "Got unexpected hr2 %#lx.\n", hr2); hr2 = 0xdeadbeef; hr = D3DX11GetImageInfoFromFileA("deadbeaf", NULL, &image_info, &hr2); - todo_wine ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); - todo_wine ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); + ok(hr == D3D11_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#lx.\n", hr); + ok(hr == hr2, "Got unexpected hr2 %#lx.\n", hr2); -todo_wine { for (i = 0; i < ARRAY_SIZE(test_image); ++i) { winetest_push_context("Test %u", i); @@ -3600,7 +3599,6 @@ todo_wine { delete_file(test_filename); winetest_pop_context(); } -} check_dds_pixel_format(DDS_PF_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0, DXGI_FORMAT_BC1_UNORM); check_dds_pixel_format(DDS_PF_FOURCC, MAKEFOURCC('D','X','T','2'), 0, 0, 0, 0, 0, DXGI_FORMAT_BC2_UNORM); diff --git a/dlls/d3dx11_43/texture.c b/dlls/d3dx11_43/texture.c index 03e930389ff..3be99465f8a 100644 --- a/dlls/d3dx11_43/texture.c +++ b/dlls/d3dx11_43/texture.c @@ -170,6 +170,59 @@ static D3DX11_IMAGE_FILE_FORMAT d3dx11_image_file_format_from_d3dx_image_file_fo } } +HRESULT WINAPI D3DX11GetImageInfoFromFileA(const char *src_file, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *info, + HRESULT *result) +{ + WCHAR *buffer; + int str_len; + HRESULT hr; + + TRACE("src_file %s, pump %p, info %p, result %p.\n", debugstr_a(src_file), pump, info, result); + + if (!src_file) + return E_FAIL; + + str_len = MultiByteToWideChar(CP_ACP, 0, src_file, -1, NULL, 0); + if (!str_len) + return HRESULT_FROM_WIN32(GetLastError()); + + buffer = malloc(str_len * sizeof(*buffer)); + if (!buffer) + return E_OUTOFMEMORY; + + MultiByteToWideChar(CP_ACP, 0, src_file, -1, buffer, str_len); + hr = D3DX11GetImageInfoFromFileW(buffer, pump, info, result); + + free(buffer); + + return hr; +} + +HRESULT WINAPI D3DX11GetImageInfoFromFileW(const WCHAR *src_file, ID3DX11ThreadPump *pump, D3DX11_IMAGE_INFO *info, + HRESULT *result) +{ + void *buffer = NULL; + DWORD size = 0; + HRESULT hr; + + TRACE("src_file %s, pump %p, info %p, result %p.\n", debugstr_w(src_file), pump, info, result); + + if (!src_file) + return E_FAIL; + + if (pump) + FIXME("D3DX11 thread pump is currently unimplemented.\n"); + + if (SUCCEEDED((hr = load_file(src_file, &buffer, &size)))) + { + hr = get_image_info(buffer, size, info); + free(buffer); + } + if (result) + *result = hr; + return hr; +} + static HRESULT d3dx11_image_info_from_d3dx_image(D3DX11_IMAGE_INFO *info, struct d3dx_image *image) { D3DX11_IMAGE_FILE_FORMAT iff = d3dx11_image_file_format_from_d3dx_image_file_format(image->image_file_format); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9901