=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3dx9: Implement point filtering for volume textures.
Alexandre Julliard
julliard at winehq.org
Mon Jul 16 14:14:29 CDT 2012
Module: wine
Branch: master
Commit: 29acc31506216323a4e91367520d6cb0b4fff66f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=29acc31506216323a4e91367520d6cb0b4fff66f
Author: Józef Kucia <joseph.kucia at gmail.com>
Date: Fri Jul 13 17:21:53 2012 +0200
d3dx9: Implement point filtering for volume textures.
---
dlls/d3dx9_36/d3dx9_36_private.h | 3 +
dlls/d3dx9_36/surface.c | 103 ++++++++++++++++++++------------------
dlls/d3dx9_36/tests/volume.c | 2 +-
dlls/d3dx9_36/volume.c | 7 ++-
4 files changed, 63 insertions(+), 52 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index fec9ede..20d013f 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -67,6 +67,9 @@ const PixelFormatDesc *get_format_info_idx(int idx) DECLSPEC_HIDDEN;
void copy_simple_data(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch, SIZE src_size, UINT src_depth, const PixelFormatDesc *src_format,
BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, SIZE dst_size, UINT dst_depth, const PixelFormatDesc *dst_format,
D3DCOLOR color_key) DECLSPEC_HIDDEN;
+void point_filter_simple_data(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch, SIZE src_size, UINT src_depth, const PixelFormatDesc *src_format,
+ BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, SIZE dst_size, UINT dst_depth, const PixelFormatDesc *dst_format,
+ D3DCOLOR color_key) DECLSPEC_HIDDEN;
HRESULT load_texture_from_dds(IDirect3DTexture9 *texture, const void *src_data, const PALETTEENTRY *palette,
DWORD filter, D3DCOLOR color_key, const D3DXIMAGE_INFO *src_info) DECLSPEC_HIDDEN;
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 433c251..e640160 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -1353,78 +1353,83 @@ void copy_simple_data(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch,
* using a point filter.
* Works only for ARGB formats with 1 - 4 bytes per pixel.
*/
-static void point_filter_simple_data(const BYTE *src, UINT srcpitch, SIZE src_size, const PixelFormatDesc *srcformat,
- BYTE *dest, UINT destpitch, SIZE dst_size, const PixelFormatDesc *destformat, D3DCOLOR colorkey)
+void point_filter_simple_data(const BYTE *src, UINT src_row_pitch, UINT src_slice_pitch, SIZE src_size, UINT src_depth, const PixelFormatDesc *src_format,
+ BYTE *dst, UINT dst_row_pitch, UINT dst_slice_pitch, SIZE dst_size, UINT dst_depth, const PixelFormatDesc *dst_format, D3DCOLOR color_key)
{
struct argb_conversion_info conv_info, ck_conv_info;
const PixelFormatDesc *ck_format = NULL;
DWORD channels[4], pixel;
-
- UINT x, y;
+ UINT x, y, z;
ZeroMemory(channels, sizeof(channels));
- init_argb_conversion_info(srcformat, destformat, &conv_info);
+ init_argb_conversion_info(src_format, dst_format, &conv_info);
- if (colorkey)
+ if (color_key)
{
/* Color keys are always represented in D3DFMT_A8R8G8B8 format. */
ck_format = get_format_info(D3DFMT_A8R8G8B8);
- init_argb_conversion_info(srcformat, ck_format, &ck_conv_info);
+ init_argb_conversion_info(src_format, ck_format, &ck_conv_info);
}
- for (y = 0; y < dst_size.cy; ++y)
+ for (z = 0; z < dst_depth; z++)
{
- BYTE *destptr = dest + y * destpitch;
- const BYTE *bufptr = src + srcpitch * (y * src_size.cy / dst_size.cy);
+ BYTE *dst_slice_ptr = dst + z * dst_slice_pitch;
+ const BYTE *src_slice_ptr = src + src_slice_pitch * (z * src_depth / dst_depth);
- for (x = 0; x < dst_size.cx; ++x)
+ for (y = 0; y < dst_size.cy; y++)
{
- const BYTE *srcptr = bufptr + (x * src_size.cx / dst_size.cx) * srcformat->bytes_per_pixel;
- DWORD val;
-
- /* extract source color components */
- pixel = dword_from_bytes(srcptr, srcformat->bytes_per_pixel);
+ BYTE *dst_ptr = dst_slice_ptr + y * dst_row_pitch;
+ const BYTE *src_row_ptr = src_slice_ptr + src_row_pitch * (y * src_size.cy / dst_size.cy);
- if (!srcformat->to_rgba && !destformat->from_rgba)
+ for (x = 0; x < dst_size.cx; x++)
{
- get_relevant_argb_components(&conv_info, pixel, channels);
- val = make_argb_color(&conv_info, channels);
+ const BYTE *src_ptr = src_row_ptr + (x * src_size.cx / dst_size.cx) * src_format->bytes_per_pixel;
+ DWORD val;
- if (colorkey)
+ /* extract source color components */
+ pixel = dword_from_bytes(src_ptr, src_format->bytes_per_pixel);
+
+ if (!src_format->to_rgba && !dst_format->from_rgba)
{
- get_relevant_argb_components(&ck_conv_info, pixel, channels);
- pixel = make_argb_color(&ck_conv_info, channels);
- if (pixel == colorkey)
- val &= ~conv_info.destmask[0];
- }
- }
- else
- {
- struct vec4 color, tmp;
+ get_relevant_argb_components(&conv_info, pixel, channels);
+ val = make_argb_color(&conv_info, channels);
- format_to_vec4(srcformat, &pixel, &color);
- if (srcformat->to_rgba)
- srcformat->to_rgba(&color, &tmp);
+ if (color_key)
+ {
+ get_relevant_argb_components(&ck_conv_info, pixel, channels);
+ pixel = make_argb_color(&ck_conv_info, channels);
+ if (pixel == color_key)
+ val &= ~conv_info.destmask[0];
+ }
+ }
else
- tmp = color;
-
- if (ck_format)
{
- format_from_vec4(ck_format, &tmp, &pixel);
- if (pixel == colorkey)
- tmp.w = 0.0f;
- }
+ struct vec4 color, tmp;
- if (destformat->from_rgba)
- destformat->from_rgba(&tmp, &color);
- else
- color = tmp;
+ format_to_vec4(src_format, &pixel, &color);
+ if (src_format->to_rgba)
+ src_format->to_rgba(&color, &tmp);
+ else
+ tmp = color;
- format_from_vec4(destformat, &color, &val);
- }
+ if (ck_format)
+ {
+ format_from_vec4(ck_format, &tmp, &pixel);
+ if (pixel == color_key)
+ tmp.w = 0.0f;
+ }
- dword_to_bytes(destptr, val, destformat->bytes_per_pixel);
- destptr += destformat->bytes_per_pixel;
+ if (dst_format->from_rgba)
+ dst_format->from_rgba(&tmp, &color);
+ else
+ color = tmp;
+
+ format_from_vec4(dst_format, &color, &val);
+ }
+
+ dword_to_bytes(dst_ptr, val, dst_format->bytes_per_pixel);
+ dst_ptr += dst_format->bytes_per_pixel;
+ }
}
}
}
@@ -1581,8 +1586,8 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(IDirect3DSurface9 *dst_surface,
/* Always apply a point filter until D3DX_FILTER_LINEAR,
* D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented. */
- point_filter_simple_data(src_memory, src_pitch, src_size, srcformatdesc,
- lockrect.pBits, lockrect.Pitch, dst_size, destformatdesc, color_key);
+ point_filter_simple_data(src_memory, src_pitch, 0, src_size, 1, srcformatdesc,
+ lockrect.pBits, lockrect.Pitch, 0, dst_size, 1, destformatdesc, color_key);
}
IDirect3DSurface9_UnlockRect(dst_surface);
diff --git a/dlls/d3dx9_36/tests/volume.c b/dlls/d3dx9_36/tests/volume.c
index f49a634..35cd509 100644
--- a/dlls/d3dx9_36/tests/volume.c
+++ b/dlls/d3dx9_36/tests/volume.c
@@ -93,7 +93,7 @@ static void test_D3DXLoadVolumeFromMemory(IDirect3DDevice9 *device)
ok(hr == E_FAIL, "D3DXLoadVolumeFromMemory returned %#x, expected %#x\n", hr, E_FAIL);
hr = D3DXLoadVolumeFromMemory(volume, NULL, NULL, pixels, D3DFMT_A8R8G8B8, 16, 16, NULL, &src_box, D3DX_DEFAULT, 0);
- todo_wine ok(hr == D3D_OK, "D3DXLoadVolumeFromMemory returned %#x, expected %#x\n", hr, D3D_OK);
+ ok(hr == D3D_OK, "D3DXLoadVolumeFromMemory returned %#x, expected %#x\n", hr, D3D_OK);
hr = D3DXLoadVolumeFromMemory(volume, NULL, &dst_box, NULL, D3DFMT_A8R8G8B8, 16, 16, NULL, &src_box, D3DX_DEFAULT, 0);
ok(hr == D3DERR_INVALIDCALL, "D3DXLoadVolumeFromMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
diff --git a/dlls/d3dx9_36/volume.c b/dlls/d3dx9_36/volume.c
index 90dbd29..ca7df62 100644
--- a/dlls/d3dx9_36/volume.c
+++ b/dlls/d3dx9_36/volume.c
@@ -226,8 +226,11 @@ HRESULT WINAPI D3DXLoadVolumeFromMemory(IDirect3DVolume9 *dst_volume,
}
else
{
- FIXME("Filtering for volume textures not implemented\n");
- return E_NOTIMPL;
+ if ((filter & 0xf) != D3DX_FILTER_POINT)
+ FIXME("Unhandled filter %#x.\n", filter);
+
+ point_filter_simple_data(src_addr, src_row_pitch, src_slice_pitch, src_size, src_depth, src_format_desc,
+ locked_box.pBits, locked_box.RowPitch, locked_box.SlicePitch, dst_size, dst_depth, dst_format_desc, color_key);
}
IDirect3DVolume9_UnlockBox(dst_volume);
More information about the wine-cvs
mailing list