From 18a2dde12720e9004e28c152ec7785eb38da8260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Tue, 3 Jul 2012 16:06:45 +0200 Subject: [PATCH] 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 deletion(-) diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 33038ca5737..ac1a197a6ff 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 fe3d0907092..d10cea00c76 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 6d2e778f3a0..c1835b782fe 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 f93a88f60f3..9132ecd40a9 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,