=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3dx9: Implement D3DXLoadVolumeFromFileInMemory.

Alexandre Julliard julliard at winehq.org
Mon Jul 9 14:56:39 CDT 2012


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

Author: Józef Kucia <joseph.kucia at gmail.com>
Date:   Tue Jul  3 16:06:45 2012 +0200

d3dx9: Implement D3DXLoadVolumeFromFileInMemory.

---

 dlls/d3dx9_36/d3dx9_36.spec      |    2 +-
 dlls/d3dx9_36/d3dx9_36_private.h |    3 ++
 dlls/d3dx9_36/surface.c          |   18 ++++++++++++
 dlls/d3dx9_36/volume.c           |   55 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 77 insertions(+), 1 deletions(-)

diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index 33038ca..ac1a197 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -190,7 +190,7 @@
 @ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr ptr wstr ptr long long ptr)
 @ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long)
 @ stub D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr)
-@ stub D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
+@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
 @ stub D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr)
 @ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long)
 @ stub D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr)
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index fe3d090..d10cea0 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -68,6 +68,9 @@ HRESULT load_texture_from_dds(IDirect3DTexture9 *texture, const void *src_data,
     DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
 HRESULT load_cube_texture_from_dds(IDirect3DCubeTexture9 *cube_texture, const void *src_data,
     const PALETTEENTRY *palette, DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
+HRESULT load_volume_from_dds(IDirect3DVolume9 *dst_volume, const PALETTEENTRY *dst_palette,
+    const D3DBOX *dst_box, const void *src_data, const D3DBOX *src_box, DWORD filter, D3DCOLOR color_key,
+    const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
 HRESULT load_volume_texture_from_dds(IDirect3DVolumeTexture9 *volume_texture, const void *src_data,
     const PALETTEENTRY *palette, DWORD filter, DWORD color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
 
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 6d2e778..c1835b7 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -407,6 +407,24 @@ static HRESULT load_surface_from_dds(IDirect3DSurface9 *dst_surface, const PALET
         src_pitch, NULL, src_rect, filter, color_key);
 }
 
+HRESULT load_volume_from_dds(IDirect3DVolume9 *dst_volume, const PALETTEENTRY *dst_palette,
+    const D3DBOX *dst_box, const void *src_data, const D3DBOX *src_box, DWORD filter, D3DCOLOR color_key,
+    const D3DXIMAGE_INFO *src_info)
+{
+    UINT row_pitch, slice_pitch;
+    const struct dds_header *header = src_data;
+    const BYTE *pixels = (BYTE *)(header + 1);
+
+    if (src_info->ResourceType != D3DRTYPE_VOLUMETEXTURE)
+        return D3DXERR_INVALIDDATA;
+
+    if (FAILED(calculate_dds_surface_size(src_info, src_info->Width, src_info->Height, &row_pitch, &slice_pitch)))
+        return E_NOTIMPL;
+
+    return D3DXLoadVolumeFromMemory(dst_volume, dst_palette, dst_box, pixels, src_info->Format,
+        row_pitch, slice_pitch, NULL, src_box, filter, color_key);
+}
+
 HRESULT load_texture_from_dds(IDirect3DTexture9 *texture, const void *src_data, const PALETTEENTRY *palette,
     DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info)
 
diff --git a/dlls/d3dx9_36/volume.c b/dlls/d3dx9_36/volume.c
index f93a88f..9132ecd 100644
--- a/dlls/d3dx9_36/volume.c
+++ b/dlls/d3dx9_36/volume.c
@@ -142,6 +142,61 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume,
     return D3D_OK;
 }
 
+HRESULT WINAPI D3DXLoadVolumeFromFileInMemory(IDirect3DVolume9 *dst_volume,
+                                              const PALETTEENTRY *dst_palette,
+                                              const D3DBOX *dst_box,
+                                              const void *src_data,
+                                              UINT src_data_size,
+                                              const D3DBOX *src_box,
+                                              DWORD filter,
+                                              D3DCOLOR color_key,
+                                              D3DXIMAGE_INFO *src_info)
+{
+    HRESULT hr;
+    D3DBOX box;
+    D3DXIMAGE_INFO image_info;
+
+    if (!dst_volume || !src_data) return D3DERR_INVALIDCALL;
+
+    hr = D3DXGetImageInfoFromFileInMemory(src_data, src_data_size, &image_info);
+    if (FAILED(hr)) return hr;
+
+    if (src_box)
+    {
+        if (src_box->Right > image_info.Width
+                || src_box->Bottom > image_info.Height
+                || src_box->Back > image_info.Depth)
+            return D3DERR_INVALIDCALL;
+
+        box = *src_box;
+    }
+    else
+    {
+        box.Left = 0;
+        box.Top = 0;
+        box.Right = image_info.Width;
+        box.Bottom = image_info.Height;
+        box.Front = 0;
+        box.Back = image_info.Depth;
+
+    }
+
+    if (image_info.ImageFileFormat != D3DXIFF_DDS)
+    {
+        FIXME("File format %#x is not supported yet\n", image_info.ImageFileFormat);
+        return E_NOTIMPL;
+    }
+
+    hr = load_volume_from_dds(dst_volume, dst_palette, dst_box, src_data, &box,
+            filter, color_key, &image_info);
+    if (FAILED(hr)) return hr;
+
+    if (src_info)
+        *src_info = image_info;
+
+    return D3D_OK;
+}
+
 HRESULT WINAPI D3DXLoadVolumeFromVolume(IDirect3DVolume9 *dst_volume,
                                         const PALETTEENTRY *dst_palette,
                                         const D3DBOX *dst_box,




More information about the wine-cvs mailing list