d3dx9: Use d3dx_image structure inside of D3DXCreateTextureFromFileInMemoryEx().

Signed-off-by: Connor McAdams <cmcadams@codeweavers.com>
This commit is contained in:
Connor McAdams 2024-06-03 13:21:25 -04:00 committed by Alexandre Julliard
parent fd2861252c
commit f89b00c878
3 changed files with 24 additions and 7 deletions

View file

@ -122,6 +122,11 @@ struct d3dx_image
D3DXIMAGE_FILEFORMAT image_file_format;
};
HRESULT d3dx_image_init(const void *src_data, uint32_t src_data_size, struct d3dx_image *image, uint32_t flags);
void d3dx_image_cleanup(struct d3dx_image *image);
HRESULT d3dx_image_get_pixels(struct d3dx_image *image, struct d3dx_pixels *pixels);
void d3dximage_info_from_d3dx_image(D3DXIMAGE_INFO *info, struct d3dx_image *image);
struct d3dx_include_from_file
{
ID3DXInclude ID3DXInclude_iface;

View file

@ -1132,8 +1132,7 @@ exit:
return hr;
}
static HRESULT d3dx_image_init(const void *src_data, uint32_t src_data_size,
struct d3dx_image *image, uint32_t flags)
HRESULT d3dx_image_init(const void *src_data, uint32_t src_data_size, struct d3dx_image *image, uint32_t flags)
{
if (!src_data || !src_data_size || !image)
return D3DERR_INVALIDCALL;
@ -1145,13 +1144,13 @@ static HRESULT d3dx_image_init(const void *src_data, uint32_t src_data_size,
return d3dx_initialize_image_from_wic(src_data, src_data_size, image, flags);
}
static void d3dx_image_cleanup(struct d3dx_image *image)
void d3dx_image_cleanup(struct d3dx_image *image)
{
free(image->image_buf);
free(image->palette);
}
static HRESULT d3dx_image_get_pixels(struct d3dx_image *image, struct d3dx_pixels *pixels)
HRESULT d3dx_image_get_pixels(struct d3dx_image *image, struct d3dx_pixels *pixels)
{
uint32_t row_pitch, slice_pitch;
RECT unaligned_rect;
@ -1168,7 +1167,7 @@ static HRESULT d3dx_image_get_pixels(struct d3dx_image *image, struct d3dx_pixel
return D3D_OK;
}
static void d3dximage_info_from_d3dx_image(D3DXIMAGE_INFO *info, struct d3dx_image *image)
void d3dximage_info_from_d3dx_image(D3DXIMAGE_INFO *info, struct d3dx_image *image)
{
info->ImageFileFormat = image->image_file_format;
info->Width = image->width;

View file

@ -571,6 +571,7 @@ HRESULT WINAPI D3DXCreateTextureFromFileInMemoryEx(struct IDirect3DDevice9 *devi
unsigned int loaded_miplevels, skip_levels;
IDirect3DTexture9 *staging_tex, *tex;
IDirect3DSurface9 *surface;
struct d3dx_image image;
D3DXIMAGE_INFO imginfo;
D3DCAPS9 caps;
HRESULT hr;
@ -586,13 +587,15 @@ HRESULT WINAPI D3DXCreateTextureFromFileInMemoryEx(struct IDirect3DDevice9 *devi
return D3DERR_INVALIDCALL;
staging_tex = tex = *texture = NULL;
hr = D3DXGetImageInfoFromFileInMemory(srcdata, srcdatasize, &imginfo);
hr = d3dx_image_init(srcdata, srcdatasize, &image, 0);
if (FAILED(hr))
{
FIXME("Unrecognized file format, returning failure.\n");
return hr;
}
d3dximage_info_from_d3dx_image(&imginfo, &image);
/* handle default values */
if (width == 0 || width == D3DX_DEFAULT_NONPOW2)
width = imginfo.Width;
@ -692,8 +695,16 @@ HRESULT WINAPI D3DXCreateTextureFromFileInMemoryEx(struct IDirect3DDevice9 *devi
TRACE("Texture created correctly. Now loading the texture data into it.\n");
if (imginfo.ImageFileFormat != D3DXIFF_DDS)
{
const RECT src_rect = { 0, 0, imginfo.Width, imginfo.Height };
struct d3dx_pixels pixels;
hr = d3dx_image_get_pixels(&image, &pixels);
if (FAILED(hr))
goto err;
IDirect3DTexture9_GetSurfaceLevel(tex, 0, &surface);
hr = D3DXLoadSurfaceFromFileInMemory(surface, palette, NULL, srcdata, srcdatasize, NULL, filter, colorkey, NULL);
hr = D3DXLoadSurfaceFromMemory(surface, palette, NULL, pixels.data, imginfo.Format,
pixels.row_pitch, pixels.palette, &src_rect, filter, colorkey);
IDirect3DSurface9_Release(surface);
loaded_miplevels = min(IDirect3DTexture9_GetLevelCount(tex), imginfo.MipLevels);
}
@ -731,12 +742,14 @@ HRESULT WINAPI D3DXCreateTextureFromFileInMemoryEx(struct IDirect3DDevice9 *devi
*texture = tex;
}
d3dx_image_cleanup(&image);
if (srcinfo)
*srcinfo = imginfo;
return hr;
err:
d3dx_image_cleanup(&image);
if (tex)
IDirect3DTexture9_Release(tex);