From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/d3dx9_36/d3dx9_private.h | 5 +++++ dlls/d3dx9_36/surface.c | 9 ++++----- dlls/d3dx9_36/texture.c | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h index 001a7f26f4f..5c9d1a0ddad 100644 --- a/dlls/d3dx9_36/d3dx9_private.h +++ b/dlls/d3dx9_36/d3dx9_private.h @@ -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; diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index dd84528a0d5..69eb9d3058b 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -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; diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c index a99a7b6252b..0755e7cf4f6 100644 --- a/dlls/d3dx9_36/texture.c +++ b/dlls/d3dx9_36/texture.c @@ -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 (staging_tex) IDirect3DTexture9_Release(staging_tex); else if (tex)