Module: wine Branch: master Commit: 9777bb1becdad9f2e29c52db05f937f3ae430e8b URL: http://source.winehq.org/git/wine.git/?a=commit;h=9777bb1becdad9f2e29c52db05...
Author: Tony Wasserka tony.wasserka@freenet.de Date: Mon Jun 22 17:57:20 2009 +0200
d3dx9: Implement D3DXLoadSurfaceFromSurface.
---
dlls/d3dx9_36/Makefile.in | 2 +- dlls/d3dx9_36/d3dx9_36.spec | 2 +- dlls/d3dx9_36/surface.c | 55 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index f5fa278..1c6195b 100644 --- a/dlls/d3dx9_36/Makefile.in +++ b/dlls/d3dx9_36/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = d3dx9_36.dll IMPORTLIB = d3dx9 -IMPORTS = d3d9 d3dx8 gdi32 kernel32 +IMPORTS = d3d9 d3dx8 gdi32 user32 kernel32
C_SRCS = \ d3dx9_36_main.c \ diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 63c2fb3..8a7cdf7 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -188,7 +188,7 @@ @ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) @ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr ptr str ptr long long ptr) @ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr ptr wstr ptr long long ptr) -@ stub D3DXLoadSurfaceFromSurface +@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long) @ stub D3DXLoadVolumeFromFileA @ stub D3DXLoadVolumeFromFileInMemory @ stub D3DXLoadVolumeFromFileW diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c index c1219fd..0bee7c8 100644 --- a/dlls/d3dx9_36/surface.c +++ b/dlls/d3dx9_36/surface.c @@ -370,3 +370,58 @@ HRESULT WINAPI D3DXLoadSurfaceFromMemory(LPDIRECT3DSURFACE9 pDestSurface, if(SrcFormat == D3DFMT_UNKNOWN || pSrcRect->left >= pSrcRect->right || pSrcRect->top >= pSrcRect->bottom) return E_FAIL; return E_NOTIMPL; } + +/************************************************************ + * D3DXLoadSurfaceFromSurface + * + * Copies the contents from one surface to another, performing any required + * format conversion, resizing or filtering. + * + * PARAMS + * pDestSurface [I] pointer to the destination surface + * pDestPalette [I] palette to use + * pDestRect [I] to be filled area of the surface + * pSrcSurface [I] pointer to the source surface + * pSrcPalette [I] palette used for the source surface + * pSrcRect [I] area of the source data to load + * dwFilter [I] filter to apply on resizing + * Colorkey [I] any ARGB value or 0 to disable color-keying + * + * RETURNS + * Success: D3D_OK + * Failure: D3DERR_INVALIDCALL, if pDestSurface or pSrcSurface are NULL + * D3DXERR_INVALIDDATA, if one of the surfaces is not lockable + * + */ +HRESULT WINAPI D3DXLoadSurfaceFromSurface(LPDIRECT3DSURFACE9 pDestSurface, + CONST PALETTEENTRY *pDestPalette, + CONST RECT *pDestRect, + LPDIRECT3DSURFACE9 pSrcSurface, + CONST PALETTEENTRY *pSrcPalette, + CONST RECT *pSrcRect, + DWORD dwFilter, + D3DCOLOR Colorkey) +{ + RECT rect; + D3DLOCKED_RECT lock; + D3DSURFACE_DESC SrcDesc; + HRESULT hr; + TRACE("(void): relay\n"); + + if( !pDestSurface || !pSrcSurface ) return D3DERR_INVALIDCALL; + + IDirect3DSurface9_GetDesc(pSrcSurface, &SrcDesc); + + if( !pSrcRect ) SetRect(&rect, 0, 0, SrcDesc.Width, SrcDesc.Height); + else rect = *pSrcRect; + + hr = IDirect3DSurface9_LockRect(pSrcSurface, &lock, NULL, D3DLOCK_READONLY); + if(FAILED(hr)) return D3DXERR_INVALIDDATA; + + hr = D3DXLoadSurfaceFromMemory(pDestSurface, pDestPalette, pDestRect, + lock.pBits, SrcDesc.Format, lock.Pitch, + pSrcPalette, &rect, dwFilter, Colorkey); + + IDirect3DSurface9_UnlockRect(pSrcSurface); + return hr; +}