[PATCH] d3dx9: Add utility functions for loading files and resources into memory
Tony Wasserka
tony.wasserka at freenet.de
Sat May 23 05:59:03 CDT 2009
---
dlls/d3dx9_36/Makefile.in | 3 +-
dlls/d3dx9_36/d3dx9_36_private.h | 6 ++
dlls/d3dx9_36/util.c | 112 ++++++++++++++++++++++++++++++++++++++
3 files changed, 120 insertions(+), 1 deletions(-)
create mode 100644 dlls/d3dx9_36/util.c
diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in
index 16fd41c..c094071 100644
--- a/dlls/d3dx9_36/Makefile.in
+++ b/dlls/d3dx9_36/Makefile.in
@@ -13,7 +13,8 @@ C_SRCS = \
mesh.c \
shader.c \
sprite.c \
- surface.c
+ surface.c \
+ util.c
RC_SRCS = version.rc
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index cd4122d..227d103 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -23,9 +23,15 @@
#include <stdarg.h>
#define COBJMACROS
+#include "winbase.h"
#include "wingdi.h"
+#include "winuser.h"
#include "d3dx9.h"
+/* for internal use */
+HRESULT UTMapViewOfFile(LPCWSTR filename, LPVOID *buffer, DWORD *length);
+HRESULT UTLoadResourceIntoMemory(HMODULE module, LPCWSTR resname, LPVOID *buffer, DWORD *length);
+
/* ID3DXFont */
typedef struct ID3DXFontImpl
diff --git a/dlls/d3dx9_36/util.c b/dlls/d3dx9_36/util.c
new file mode 100644
index 0000000..48f6cf7
--- /dev/null
+++ b/dlls/d3dx9_36/util.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2009 Tony Wasserka
+ *
+ * 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
+ *
+ */
+
+#include "wine/debug.h"
+#include "wine/unicode.h"
+#include "d3dx9_36_private.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(d3dx);
+
+
+/************************************************************
+ * UTMapViewOfFile
+ *
+ * Loads a file into buffer and stores the
+ * number of read bytes in length.
+ *
+ * PARAMS
+ * filename [I] name of the file to be loaded
+ * buffer [O] pointer to destination buffer
+ * length [O] size of the obtained data
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure: D3DERR_INVALIDCALL
+ *
+ * NOTES
+ * The caller must UnmapViewOfFile when it
+ * doesn't need the data anymore
+ */
+HRESULT UTMapViewOfFile(LPCWSTR filename, LPVOID *buffer, DWORD *length)
+{
+ HANDLE hfile, hmapping = NULL;
+
+ if( !filename || !buffer || !length ) return D3DERR_INVALIDCALL;
+
+ hfile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
+ if(hfile == INVALID_HANDLE_VALUE) return D3DERR_INVALIDCALL;
+
+ *length = GetFileSize(hfile, NULL);
+ if(*length == INVALID_FILE_SIZE) goto error;
+
+ hmapping = CreateFileMappingW(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
+ if(!hmapping) goto error;
+
+ *buffer = MapViewOfFile(hmapping, FILE_MAP_READ, 0, 0, 0);
+ if(*buffer == NULL) goto error;
+
+ CloseHandle(hmapping);
+ CloseHandle(hfile);
+
+ return D3D_OK;
+
+error:
+ CloseHandle(hmapping);
+ CloseHandle(hfile);
+ return D3DERR_INVALIDCALL;
+}
+
+/************************************************************
+ * UTLoadResourceIntoMemory
+ *
+ * Loads a resource into buffer and stores the number of
+ * read bytes in length.
+ *
+ * PARAMS
+ * module [I] handle to the module
+ * resname [I] name of the resource to be loaded
+ * buffer [O] pointer to destination buffer
+ * length [O] size of the obtained data
+ *
+ * RETURNS
+ * Success: D3D_OK
+ * Failure: D3DERR_INVALIDCALL
+ *
+ * NOTES
+ * The memory doesn't need to be freed by the caller manually
+ */
+HRESULT UTLoadResourceIntoMemory(HMODULE module, LPCWSTR resname, LPVOID *buffer, DWORD *length)
+{
+ HRSRC resinfo;
+ HGLOBAL resource;
+
+ if( !module || !resname || !buffer || !length ) return D3DERR_INVALIDCALL;
+
+ resinfo = FindResourceW(module, resname, (LPCWSTR)RT_RCDATA);
+ if( !resinfo ) return D3DERR_INVALIDCALL;
+
+ *length = SizeofResource(module, resinfo);
+ resource = LoadResource(module, resinfo);
+ if( !resource ) return D3DERR_INVALIDCALL;
+
+ *buffer = LockResource(resource);
+ if(*buffer == NULL) return D3DERR_INVALIDCALL;
+
+ return D3D_OK;
+}
--
1.6.0.2
--------------040409080309090001030902--
More information about the wine-patches
mailing list