[PATCH 3/6] d3dx10: Share code for file data loading.

Piotr Caban wine at gitlab.winehq.org
Thu Jun 2 05:57:18 CDT 2022


From: Piotr Caban <piotr at codeweavers.com>

---
 dlls/d3dx10_43/async.c     | 38 +++++++++++++++---------
 dlls/d3dx10_43/dxhelpers.h | 19 ++++++++++++
 dlls/d3dx10_43/texture.c   | 60 ++++----------------------------------
 3 files changed, 48 insertions(+), 69 deletions(-)
 create mode 100644 dlls/d3dx10_43/dxhelpers.h

diff --git a/dlls/d3dx10_43/async.c b/dlls/d3dx10_43/async.c
index 5a8ba77db87..21fa437ac73 100644
--- a/dlls/d3dx10_43/async.c
+++ b/dlls/d3dx10_43/async.c
@@ -84,38 +84,48 @@ static const ID3DX10DataLoaderVtbl memorydataloadervtbl =
     memorydataloader_Destroy
 };
 
-static HRESULT WINAPI filedataloader_Load(ID3DX10DataLoader *iface)
+HRESULT load_file(const WCHAR *path, void **data, DWORD *size)
 {
-    struct asyncdataloader *loader = impl_from_ID3DX10DataLoader(iface);
-    DWORD size, read_len;
+    DWORD read_len;
     HANDLE file;
-    void *data;
     BOOL ret;
 
-    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,
+    file = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
             NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if (file == INVALID_HANDLE_VALUE)
         return D3D10_ERROR_FILE_NOT_FOUND;
 
-    size = GetFileSize(file, NULL);
-    data = malloc(size);
-    if (!data)
+    *size = GetFileSize(file, NULL);
+    *data = malloc(*size);
+    if (!*data)
     {
         CloseHandle(file);
         return E_OUTOFMEMORY;
     }
 
-    ret = ReadFile(file, data, size, &read_len, NULL);
+    ret = ReadFile(file, *data, *size, &read_len, NULL);
     CloseHandle(file);
-    if (!ret)
+    if (!ret || read_len != *size)
     {
         WARN("Failed to read file contents.\n");
-        free(data);
+        free(*data);
         return E_FAIL;
     }
+    return S_OK;
+}
+
+static HRESULT WINAPI filedataloader_Load(ID3DX10DataLoader *iface)
+{
+    struct asyncdataloader *loader = impl_from_ID3DX10DataLoader(iface);
+    void *data;
+    DWORD size;
+    HRESULT hr;
+
+    TRACE("iface %p.\n", iface);
+
+    /* Always buffer file contents, even if Load() was already called. */
+    if (FAILED((hr = load_file(loader->u.file.path, &data, &size))))
+        return hr;
 
     free(loader->data);
     loader->data = data;
diff --git a/dlls/d3dx10_43/dxhelpers.h b/dlls/d3dx10_43/dxhelpers.h
new file mode 100644
index 00000000000..9afc9bd901a
--- /dev/null
+++ b/dlls/d3dx10_43/dxhelpers.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2022 Piotr Caban
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+extern HRESULT load_file(const WCHAR *path, void **data, DWORD *size) DECLSPEC_HIDDEN;
diff --git a/dlls/d3dx10_43/texture.c b/dlls/d3dx10_43/texture.c
index 41f9723de6b..56258fdd60d 100644
--- a/dlls/d3dx10_43/texture.c
+++ b/dlls/d3dx10_43/texture.c
@@ -23,6 +23,7 @@
 #include "d3d10_1.h"
 #include "d3dx10.h"
 #include "wincodec.h"
+#include "dxhelpers.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
 
@@ -291,57 +292,6 @@ static DXGI_FORMAT get_d3dx10_dds_format(DXGI_FORMAT format)
     return format;
 }
 
-static HRESULT load_file(const WCHAR *filename, void **buffer, DWORD *size)
-{
-    HRESULT hr = S_OK;
-    DWORD bytes_read;
-    HANDLE file;
-    BOOL ret;
-
-    file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
-    if (file == INVALID_HANDLE_VALUE)
-    {
-        hr = HRESULT_FROM_WIN32(GetLastError());
-        goto done;
-    }
-
-    *size = GetFileSize(file, NULL);
-    if (*size == INVALID_FILE_SIZE)
-    {
-        hr = HRESULT_FROM_WIN32(GetLastError());
-        goto done;
-    }
-
-    *buffer = malloc(*size);
-    if (!*buffer)
-    {
-        hr = E_OUTOFMEMORY;
-        goto done;
-    }
-
-    ret = ReadFile(file, *buffer, *size, &bytes_read, NULL);
-    if (!ret)
-    {
-        hr = HRESULT_FROM_WIN32(GetLastError());
-        goto done;
-    }
-    if (bytes_read != *size)
-    {
-        hr = E_FAIL;
-        goto done;
-    }
-
-done:
-    if (FAILED(hr))
-    {
-        free(*buffer);
-        *buffer = NULL;
-    }
-    if (file != INVALID_HANDLE_VALUE)
-        CloseHandle(file);
-    return hr;
-}
-
 static HRESULT load_resource(HMODULE module, HRSRC res_info, void **buffer, DWORD *size)
 {
     HGLOBAL resource;
@@ -398,8 +348,8 @@ HRESULT WINAPI D3DX10GetImageInfoFromFileW(const WCHAR *src_file, ID3DX10ThreadP
     if (!src_file || !info)
         return E_FAIL;
 
-    if (FAILED(load_file(src_file, &buffer, &size)))
-        return D3D10_ERROR_FILE_NOT_FOUND;
+    if (FAILED((hr = load_file(src_file, &buffer, &size))))
+        return hr;
 
     hr = D3DX10GetImageInfoFromMemory(buffer, size, pump, info, result);
 
@@ -612,8 +562,8 @@ HRESULT WINAPI D3DX10CreateTextureFromFileW(ID3D10Device *device, const WCHAR *s
     if (!src_file || !texture)
         return E_FAIL;
 
-    if (FAILED(load_file(src_file, &buffer, &size)))
-        return D3D10_ERROR_FILE_NOT_FOUND;
+    if (FAILED((hr = load_file(src_file, &buffer, &size))))
+        return hr;
 
     hr = D3DX10CreateTextureFromMemory(device, buffer, size, load_info, pump, texture, hresult);
 
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/173



More information about the wine-devel mailing list