Christian Costa : d3dxof: Finish support for objects binary format.

Alexandre Julliard julliard at winehq.org
Mon Nov 17 09:14:23 CST 2008


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

Author: Christian Costa <titan.costa at wanadoo.fr>
Date:   Sun Nov 16 19:45:38 2008 +0100

d3dxof: Finish support for objects binary format.

---

 dlls/d3dxof/d3dxof.c |   74 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 62 insertions(+), 12 deletions(-)

diff --git a/dlls/d3dxof/d3dxof.c b/dlls/d3dxof/d3dxof.c
index fc01a74..7c97771 100644
--- a/dlls/d3dxof/d3dxof.c
+++ b/dlls/d3dxof/d3dxof.c
@@ -276,13 +276,6 @@ static HRESULT WINAPI IDirectXFileImpl_CreateEnumObject(IDirectXFile* iface, LPV
     goto error;
   }
 
-  if (header[2] == XOFFILE_FORMAT_BINARY)
-  {
-    FIXME("Binary format not supported yet\n");
-    hr = DXFILEERR_NOTDONEYET;
-    goto error;
-  }
-
   if (header[2] == XOFFILE_FORMAT_COMPRESSED)
   {
     FIXME("Compressed formats not supported yet\n");
@@ -803,10 +796,50 @@ static WORD parse_TOKEN(parse_buffer * buf)
   }
   else
   {
-    if (!read_bytes(buf, &token, 2))
-      return 0;
+    static int nb_elem;
+    static int is_float;
+
+    if (!nb_elem)
+    {
+      if (!read_bytes(buf, &token, 2))
+        return 0;
+
+      /* Convert integer and float list into sereparate elements */
+      if (token == TOKEN_INTEGER_LIST)
+      {
+        if (!read_bytes(buf, &nb_elem, 4))
+          return 0;
+        token = TOKEN_INTEGER;
+        is_float = FALSE;
+        TRACE("Integer list (TOKEN_INTEGER_LIST) of size %d\n", nb_elem);
+      }
+      else if (token == TOKEN_FLOAT_LIST)
+      {
+        if (!read_bytes(buf, &nb_elem, 4))
+          return 0;
+        token = TOKEN_FLOAT;
+        is_float = TRUE;
+        TRACE("Float list (TOKEN_FLOAT_LIST) of size %d\n", nb_elem);
+      }
+    }
+
+    if (nb_elem)
+    {
+      token = is_float ? TOKEN_FLOAT : TOKEN_INTEGER;
+      nb_elem--;
+        {
+          DWORD integer;
+
+          if (!read_bytes(buf, &integer, 4))
+            return 0;
+
+          *(DWORD*)buf->value = integer;
+        }
+      dump_TOKEN(token);
+      return token;
+    }
 
-    switch(token)
+    switch (token)
     {
       case TOKEN_NAME:
         {
@@ -850,8 +883,25 @@ static WORD parse_TOKEN(parse_buffer * buf)
         }
         break;
       case TOKEN_STRING:
-      case TOKEN_INTEGER_LIST:
-      case TOKEN_FLOAT_LIST:
+        {
+          DWORD count;
+          WORD tmp_token;
+          char strname[100];
+          if (!read_bytes(buf, &count, 4))
+            return 0;
+          if (!read_bytes(buf, strname, count))
+            return 0;
+          strname[count] = 0;
+          if (!read_bytes(buf, &tmp_token, 2))
+            return 0;
+          if ((tmp_token != TOKEN_COMMA) && (tmp_token != TOKEN_SEMICOLON))
+            ERR("No comma or semicolon (got %d)\n", tmp_token);
+          /*TRACE("name = %s\n", strname);*/
+
+          strcpy((char*)buf->value, strname);
+          token = TOKEN_LPSTR;
+        }
+        break;
       case TOKEN_OBRACE:
       case TOKEN_CBRACE:
       case TOKEN_OPAREN:




More information about the wine-cvs mailing list