From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx9_36/surface.c | 11 ++++++++--- dlls/d3dx9_36/tests/surface.c | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index 2439bc7f8bd..85a11ef90c1 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -588,17 +588,22 @@ static HRESULT save_dds_surface_to_memory(ID3DXBuffer **dst_buffer, IDirect3DSur return D3D_OK; }
+#define DDS_PALETTE_SIZE (sizeof(PALETTEENTRY) * 256) static HRESULT d3dx_initialize_image_from_dds(const void *src_data, uint32_t src_data_size, struct d3dx_image *image, uint32_t starting_mip_level) { + uint32_t expected_src_data_size, header_size; const struct dds_header *header = src_data; - uint32_t expected_src_data_size; + BOOL is_indexed_fmt; HRESULT hr;
if (src_data_size < sizeof(*header) || header->pixel_format.size != sizeof(header->pixel_format)) return D3DXERR_INVALIDDATA;
TRACE("File type is DDS.\n"); + is_indexed_fmt = !!(header->pixel_format.flags & DDS_PF_INDEXED); + header_size = is_indexed_fmt ? sizeof(*header) + DDS_PALETTE_SIZE : sizeof(*header); + set_volume_struct(&image->size, header->width, header->height, 1); image->mip_levels = header->miplevels ? header->miplevels : 1; image->format = dds_pixel_format_to_d3dformat(&header->pixel_format); @@ -631,14 +636,14 @@ static HRESULT d3dx_initialize_image_from_dds(const void *src_data, uint32_t src image->size.depth, image->mip_levels); if (!image->layer_pitch) return D3DXERR_INVALIDDATA; - expected_src_data_size = (image->layer_pitch * image->layer_count) + sizeof(*header); + expected_src_data_size = (image->layer_pitch * image->layer_count) + header_size; if (src_data_size < expected_src_data_size) { WARN("File is too short %u, expected at least %u bytes.\n", src_data_size, expected_src_data_size); return D3DXERR_INVALIDDATA; }
- image->pixels = ((BYTE *)src_data) + sizeof(*header); + image->pixels = ((BYTE *)src_data) + header_size; image->image_file_format = D3DXIFF_DDS; if (starting_mip_level && (image->mip_levels > 1)) { diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c index 1128a67423c..7fc4328d74c 100644 --- a/dlls/d3dx9_36/tests/surface.c +++ b/dlls/d3dx9_36/tests/surface.c @@ -761,7 +761,7 @@ static void test_D3DXGetImageInfo(void)
/* Size includes the size of the color palette. */ hr = D3DXGetImageInfoFromFileInMemory(dds_8bit, (sizeof(dds_8bit) - (sizeof(PALETTEENTRY) * 256)), &info); - todo_wine ok(hr == D3DXERR_INVALIDDATA, "Unexpected hr %#lx.\n", hr); + ok(hr == D3DXERR_INVALIDDATA, "Unexpected hr %#lx.\n", hr);
/* cleanup */ if(testdummy_ok) DeleteFileA("testdummy.bmp");