Owen Rudge : d3dx9: Implement D3DXCreateTextureFromFileInMemoryEx.

Alexandre Julliard julliard at winehq.org
Wed Sep 1 11:08:54 CDT 2010


Module: wine
Branch: master
Commit: 3604671a3af6ed1ab3190f1068609f0d9575bdfe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3604671a3af6ed1ab3190f1068609f0d9575bdfe

Author: Owen Rudge <orudge at codeweavers.com>
Date:   Tue Aug 31 10:43:25 2010 -0500

d3dx9: Implement D3DXCreateTextureFromFileInMemoryEx.

---

 dlls/d3dx9_36/texture.c |  143 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 141 insertions(+), 2 deletions(-)

diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c
index 4c4bc91..36843e4 100644
--- a/dlls/d3dx9_36/texture.c
+++ b/dlls/d3dx9_36/texture.c
@@ -284,10 +284,149 @@ HRESULT WINAPI D3DXCreateTextureFromFileInMemoryEx(LPDIRECT3DDEVICE9 device,
                                                    PALETTEENTRY* palette,
                                                    LPDIRECT3DTEXTURE9* texture)
 {
-    FIXME("(%p, %p, %u, %u, %u, %u, %x, %x, %x, %u, %u, %x, %p, %p, %p): stub\n", device, srcdata, srcdatasize, width,
+    IDirect3DTexture9 **texptr;
+    IDirect3DTexture9 *buftex;
+    IDirect3DSurface9 *surface;
+    BOOL file_width = FALSE, file_height = FALSE;
+    BOOL file_format = FALSE, file_miplevels = FALSE;
+    D3DXIMAGE_INFO imginfo;
+    D3DCAPS9 caps;
+    HRESULT hr;
+
+    TRACE("(%p, %p, %u, %u, %u, %u, %x, %x, %x, %u, %u, %x, %p, %p, %p)\n", device, srcdata, srcdatasize, width,
         height, miplevels, usage, format, pool, filter, mipfilter, colorkey, srcinfo, palette, texture);
 
-    return E_NOTIMPL;
+    /* check for invalid parameters */
+    if (!device || !texture || !srcdata || !srcdatasize)
+        return D3DERR_INVALIDCALL;
+
+    hr = D3DXGetImageInfoFromFileInMemory(srcdata, srcdatasize, &imginfo);
+
+    if (FAILED(hr))
+    {
+        *texture = NULL;
+        return hr;
+    }
+
+    /* handle default values */
+    if (width == 0 || width == D3DX_DEFAULT_NONPOW2)
+        width = imginfo.Width;
+
+    if (height == 0 || height == D3DX_DEFAULT_NONPOW2)
+        height = imginfo.Height;
+
+    if (width == D3DX_DEFAULT)
+        width = make_pow2(imginfo.Width);
+
+    if (height == D3DX_DEFAULT)
+        height = make_pow2(imginfo.Height);
+
+    if (format == D3DFMT_UNKNOWN || format == D3DX_DEFAULT)
+        format = imginfo.Format;
+
+    if (width == D3DX_FROM_FILE)
+    {
+        file_width = TRUE;
+        width = imginfo.Width;
+    }
+
+    if (height == D3DX_FROM_FILE)
+    {
+        file_height = TRUE;
+        height = imginfo.Height;
+    }
+
+    if (format == D3DFMT_FROM_FILE)
+    {
+        file_format = TRUE;
+        format = imginfo.Format;
+    }
+
+    if (miplevels == D3DX_FROM_FILE)
+    {
+        file_miplevels = TRUE;
+        miplevels = imginfo.MipLevels;
+    }
+
+    /* fix texture creation parameters */
+    hr = D3DXCheckTextureRequirements(device, &width, &height, &miplevels, usage, &format, pool);
+
+    if (FAILED(hr))
+    {
+        *texture = NULL;
+        return hr;
+    }
+
+    if (((file_width) && (width != imginfo.Width))    ||
+        ((file_height) && (height != imginfo.Height)) ||
+        ((file_format) && (format != imginfo.Format)) ||
+        ((file_miplevels) && (miplevels != imginfo.MipLevels)))
+    {
+        return D3DERR_NOTAVAILABLE;
+    }
+
+    if (FAILED(IDirect3DDevice9_GetDeviceCaps(device, &caps)))
+        return D3DERR_INVALIDCALL;
+
+    /* Create the to-be-filled texture */
+    if ((caps.Caps2 & D3DCAPS2_DYNAMICTEXTURES) && (pool != D3DPOOL_DEFAULT) && (usage != D3DUSAGE_DYNAMIC))
+    {
+        hr = D3DXCreateTexture(device, width, height, miplevels, usage, format, pool, texture);
+        texptr = texture;
+    }
+    else
+    {
+        hr = D3DXCreateTexture(device, width, height, miplevels, usage, format, D3DPOOL_SYSTEMMEM, &buftex);
+        texptr = &buftex;
+    }
+
+    if (FAILED(hr))
+    {
+        *texture = NULL;
+        return hr;
+    }
+
+    /* Load the file */
+    IDirect3DTexture9_GetSurfaceLevel(*texptr, 0, &surface);
+    hr = D3DXLoadSurfaceFromFileInMemory(surface, palette, NULL, srcdata, srcdatasize, NULL, filter, colorkey, NULL);
+    IDirect3DSurface9_Release(surface);
+
+    if (FAILED(hr))
+    {
+        IDirect3DTexture9_Release(*texptr);
+        *texture = NULL;
+        return hr;
+    }
+
+    hr = D3DXFilterTexture((IDirect3DBaseTexture9*) *texptr, palette, 0, mipfilter);
+
+    if (FAILED(hr))
+    {
+        IDirect3DTexture9_Release(*texptr);
+        *texture = NULL;
+        return hr;
+    }
+
+    /* Move the data to the actual texture if necessary */
+    if (texptr == &buftex)
+    {
+        hr = D3DXCreateTexture(device, width, height, miplevels, usage, format, pool, texture);
+
+        if (FAILED(hr))
+        {
+            IDirect3DTexture9_Release(buftex);
+            *texture = NULL;
+            return hr;
+        }
+
+        IDirect3DDevice9_UpdateTexture(device, (IDirect3DBaseTexture9*)buftex, (IDirect3DBaseTexture9*)(*texture));
+        IDirect3DTexture9_Release(buftex);
+    }
+
+    if (srcinfo)
+        *srcinfo = imginfo;
+
+    return D3D_OK;
 }
 
 HRESULT WINAPI D3DXCreateTextureFromFileInMemory(LPDIRECT3DDEVICE9 device,




More information about the wine-cvs mailing list