Christian Costa : d3dxof: Add support for DXFILELOAD_FROMMEMORY.

Alexandre Julliard julliard at winehq.org
Tue Nov 11 08:35:52 CST 2008


Module: wine
Branch: master
Commit: 641200dc1e3ce55f1e338fc156c4d69af54597c4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=641200dc1e3ce55f1e338fc156c4d69af54597c4

Author: Christian Costa <titan.costa at wanadoo.fr>
Date:   Tue Nov 11 12:40:31 2008 +0100

d3dxof: Add support for DXFILELOAD_FROMMEMORY.

---

 dlls/d3dxof/d3dxof.c |   56 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index 1c3c99b..6479e21 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -205,6 +205,7 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
   DWORD header[4];
   DWORD size;
   HANDLE hFile = INVALID_HANDLE_VALUE;
+  LPDXFILELOADMEMORY lpdxflm = NULL;
 
   TRACE("(%p/%p)->(%p,%x,%p)\n", This, iface, pvSource, dwLoadOptions, ppEnumObj);
 
@@ -233,14 +234,14 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
       hr = DXFILEERR_BADFILETYPE;
       goto error;
     }
+  }
+  else if (dwLoadOptions == DXFILELOAD_FROMMEMORY)
+  {
+    lpdxflm = (LPDXFILELOADMEMORY)pvSource;
 
-    if (TRACE_ON(d3dxof))
-    {
-      char string[17];
-      memcpy(string, header, 16);
-      string[16] = 0;
-      TRACE("header = '%s'\n", string);
-    }
+    FIXME("Source in memory at %p with size %d\n", lpdxflm->lpMemory, lpdxflm->dSize);
+
+    memcpy(header, (char*)lpdxflm->lpMemory, 16);
   }
   else
   {
@@ -249,6 +250,14 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
     goto error;
   }
 
+  if (TRACE_ON(d3dxof))
+  {
+    char string[17];
+    memcpy(string, header, 16);
+    string[16] = 0;
+    TRACE("header = '%s'\n", string);
+  }
+
   if (header[0] != XOFFILE_FORMAT_MAGIC)
   {
     hr = DXFILEERR_BADFILETYPE;
@@ -301,22 +310,31 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
   object->buf.token_present = FALSE;
   object->buf.cur_subobject = 0;
 
-  object->buf.buffer = HeapAlloc(GetProcessHeap(), 0, MAX_INPUT_SIZE+1);
-  if (!object->buf.buffer)
+  if (dwLoadOptions == DXFILELOAD_FROMFILE)
   {
-    WARN("Out of memory\n");
-    hr = DXFILEERR_BADALLOC;
-    goto error;
-  }
+    object->buf.buffer = HeapAlloc(GetProcessHeap(), 0, MAX_INPUT_SIZE+1);
+    if (!object->buf.buffer)
+    {
+      WARN("Out of memory\n");
+      hr = DXFILEERR_BADALLOC;
+      goto error;
+    }
 
-  ReadFile(hFile, object->buf.buffer, MAX_INPUT_SIZE+1, &object->buf.rem_bytes, NULL);
-  if (object->buf.rem_bytes > MAX_INPUT_SIZE)
+    ReadFile(hFile, object->buf.buffer, MAX_INPUT_SIZE+1, &object->buf.rem_bytes, NULL);
+    if (object->buf.rem_bytes > MAX_INPUT_SIZE)
+    {
+      FIXME("File size > %d not supported yet\n", MAX_INPUT_SIZE);
+      HeapFree(GetProcessHeap(), 0, object->buf.buffer);
+      hr = DXFILEERR_PARSEERROR;
+      goto error;
+    }
+  }
+  else
   {
-    FIXME("File size > %d not supported yet\n", MAX_INPUT_SIZE);
-    HeapFree(GetProcessHeap(), 0, object->buf.buffer);
-    hr = DXFILEERR_PARSEERROR;
-    goto error;
+    object->buf.buffer = ((LPBYTE)lpdxflm->lpMemory) + 16;
+    object->buf.rem_bytes = lpdxflm->dSize;
   }
+
   TRACE("Read %d bytes\n", object->buf.rem_bytes);
 
   *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object;




More information about the wine-cvs mailing list