Christian Costa : d3dxof: Add support for DXFILELOAD_FROMRESOURCE source.
Alexandre Julliard
julliard at winehq.org
Tue Feb 10 07:45:35 CST 2009
Module: wine
Branch: master
Commit: 3e6d9558b8c119282fc976778762f4de1dc4fdab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3e6d9558b8c119282fc976778762f4de1dc4fdab
Author: Christian Costa <titan.costa at 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;
More information about the wine-cvs
mailing list