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