=?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