Module: wine Branch: master Commit: 32d2be575e015e4ea17788104c9f58c4a6c65363 URL: http://source.winehq.org/git/wine.git/?a=commit;h=32d2be575e015e4ea17788104c...
Author: Tony Wasserka tony.wasserka@freenet.de Date: Mon Jun 1 18:25:32 2009 +0200
d3dx9: Add utility functions for loading files and resources into memory.
---
dlls/d3dx9_36/Makefile.in | 3 +- dlls/d3dx9_36/d3dx9_36_private.h | 4 ++ dlls/d3dx9_36/util.c | 104 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 1 deletions(-)
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..4460f67 100644 --- a/dlls/d3dx9_36/d3dx9_36_private.h +++ b/dlls/d3dx9_36/d3dx9_36_private.h @@ -26,6 +26,10 @@ #include "wingdi.h" #include "d3dx9.h"
+/* for internal use */ +HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length); +HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, 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..ff41ee7 --- /dev/null +++ b/dlls/d3dx9_36/util.c @@ -0,0 +1,104 @@ +/* + * 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 "d3dx9_36_private.h" + +/************************************************************ + * map_view_of_file + * + * 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: + * see error codes for CreateFileW, GetFileSize, CreateFileMapping and MapViewOfFile + * + * NOTES + * The caller must UnmapViewOfFile when it doesn't need the data anymore + * + */ +HRESULT map_view_of_file(LPCWSTR filename, LPVOID *buffer, DWORD *length) +{ + HANDLE hfile, hmapping = NULL; + + hfile = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); + if(hfile == INVALID_HANDLE_VALUE) goto error; + + *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 S_OK; + +error: + CloseHandle(hmapping); + CloseHandle(hfile); + return HRESULT_FROM_WIN32(GetLastError()); +} + +/************************************************************ + * load_resource_into_memory + * + * Loads a resource into buffer and stores the number of + * read bytes in length. + * + * PARAMS + * module [I] handle to the module + * resinfo [I] handle to the resource's information block + * buffer [O] pointer to destination buffer + * length [O] size of the obtained data + * + * RETURNS + * Success: D3D_OK + * Failure: + * See error codes for SizeofResource, LoadResource and LockResource + * + * NOTES + * The memory doesn't need to be freed by the caller manually + * + */ +HRESULT load_resource_into_memory(HMODULE module, HRSRC resinfo, LPVOID *buffer, DWORD *length) +{ + HGLOBAL resource; + + *length = SizeofResource(module, resinfo); + if(*length == 0) return HRESULT_FROM_WIN32(GetLastError()); + + resource = LoadResource(module, resinfo); + if( !resource ) return HRESULT_FROM_WIN32(GetLastError()); + + *buffer = LockResource(resource); + if(*buffer == NULL) return HRESULT_FROM_WIN32(GetLastError()); + + return S_OK; +}