Module: wine Branch: master Commit: 3e6d9558b8c119282fc976778762f4de1dc4fdab URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e6d9558b8c119282fc9767787...
Author: Christian Costa titan.costa@wanadoo.fr Date: Tue Feb 10 14:12:47 2009 +0100
d3dxof: Add support for DXFILELOAD_FROMRESOURCE source.
---
dlls/d3dxof/d3dxof.c | 35 +++++++++++++++++++++++++++++++++++ dlls/d3dxof/d3dxof_private.h | 1 + 2 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c index b9e4441..6a27cd5 100644 --- a/dlls/d3dxof/d3dxof.c +++ b/dlls/d3dxof/d3dxof.c @@ -131,6 +131,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE file_mapping = 0; LPBYTE buffer = NULL; + HGLOBAL resource_data = 0; LPBYTE file_buffer; DWORD file_size;
@@ -169,6 +170,36 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV } file_buffer = buffer; } + else if (dwLoadOptions == DXFILELOAD_FROMRESOURCE) + { + HRSRC resource_info; + LPDXFILELOADRESOURCE lpdxflr = pvSource; + + TRACE("Source in resource (module = %p, name = %s, type = %s\n", lpdxflr->hModule, debugstr_a(lpdxflr->lpName), debugstr_a(lpdxflr->lpType)); + + resource_info = FindResourceA(lpdxflr->hModule, lpdxflr->lpName, lpdxflr->lpType); + if (!resource_info) + { + hr = DXFILEERR_RESOURCENOTFOUND; + goto error; + } + + file_size = SizeofResource(lpdxflr->hModule, resource_info); + + resource_data = LoadResource(lpdxflr->hModule, resource_info); + if (!resource_data) + { + hr = DXFILEERR_BADRESOURCE; + goto error; + } + + file_buffer = LockResource(resource_data); + if (!file_buffer) + { + hr = DXFILEERR_BADRESOURCE; + goto error; + } + } else if (dwLoadOptions == DXFILELOAD_FROMMEMORY) { lpdxflm = pvSource; @@ -289,6 +320,8 @@ error: CloseHandle(file_mapping); if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile); + if (resource_data) + FreeResource(resource_data); *ppEnumObj = NULL;
return hr; @@ -977,6 +1010,8 @@ static ULONG WINAPI IDirectXFileEnumObjectImpl_Release(IDirectXFileEnumObject* i CloseHandle(This->file_mapping); CloseHandle(This->hFile); } + else if (This->source == DXFILELOAD_FROMRESOURCE) + FreeResource(This->resource_data); HeapFree(GetProcessHeap(), 0, This); }
diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h index 978b312..67883ae 100644 --- a/dlls/d3dxof/d3dxof_private.h +++ b/dlls/d3dxof/d3dxof_private.h @@ -151,6 +151,7 @@ typedef struct { HANDLE hFile; HANDLE file_mapping; LPBYTE buffer; + HGLOBAL resource_data; parse_buffer buf; IDirectXFileImpl* pDirectXFile; ULONG nb_xobjects;