Tony Wasserka : d3dx9: Implement ID3DXSprite_Draw.
Alexandre Julliard
julliard at winehq.org
Fri Nov 7 07:24:04 CST 2008
Module: wine
Branch: master
Commit: edae5d545ee38dd0dfa2a9e2077ae2810ef4e771
URL: http://source.winehq.org/git/wine.git/?a=commit;h=edae5d545ee38dd0dfa2a9e2077ae2810ef4e771
Author: Tony Wasserka <tony.wasserka at freenet.de>
Date: Wed Nov 5 13:00:35 2008 +0100
d3dx9: Implement ID3DXSprite_Draw.
---
dlls/d3dx9_36/d3dx9_36_private.h | 3 +-
dlls/d3dx9_36/sprite.c | 73 ++++++++++++++++++++++++++++++++++++-
2 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_36_private.h b/dlls/d3dx9_36/d3dx9_36_private.h
index 6297e89..036d1f5 100644
--- a/dlls/d3dx9_36/d3dx9_36_private.h
+++ b/dlls/d3dx9_36/d3dx9_36_private.h
@@ -68,7 +68,8 @@ typedef struct ID3DXSpriteImpl
DWORD alphacmp_caps;
SPRITE *sprites;
- int sprite_count;
+ int sprite_count; /* number of sprites to be drawn */
+ int allocated_sprites; /* number of (pre-)allocated sprites */
} ID3DXSpriteImpl;
diff --git a/dlls/d3dx9_36/sprite.c b/dlls/d3dx9_36/sprite.c
index 0cf3255..61de2d6 100644
--- a/dlls/d3dx9_36/sprite.c
+++ b/dlls/d3dx9_36/sprite.c
@@ -51,6 +51,14 @@ static ULONG WINAPI ID3DXSpriteImpl_Release(LPD3DXSPRITE iface)
TRACE("(%p): ReleaseRef to %d\n", This, ref);
if(ref==0) {
+ if(This->sprites) {
+ int i;
+ for(i=0;i<This->sprite_count;i++)
+ if(This->sprites[i].texture)
+ IDirect3DTexture9_Release(This->sprites[i].texture);
+
+ HeapFree(GetProcessHeap(), 0, This->sprites);
+ }
if(This->stateblock) IDirect3DStateBlock9_Release(This->stateblock);
if(This->vdecl) IDirect3DVertexDeclaration9_Release(This->vdecl);
if(This->device) IDirect3DDevice9_Release(This->device);
@@ -105,14 +113,71 @@ static HRESULT WINAPI ID3DXSpriteImpl_Draw(LPD3DXSPRITE iface, LPDIRECT3DTEXTURE
CONST D3DXVECTOR3 *position, D3DCOLOR color)
{
ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
- FIXME("(%p): stub\n", This);
- return E_NOTIMPL;
+ D3DSURFACE_DESC texdesc;
+ TRACE("(%p): relay\n", This);
+
+ if(texture==NULL) return D3DERR_INVALIDCALL;
+
+ if(This->allocated_sprites==0) {
+ This->sprites=HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 32*sizeof(SPRITE));
+ This->allocated_sprites=32;
+ } else if(This->allocated_sprites<=This->sprite_count) {
+ This->allocated_sprites=This->allocated_sprites*3/2;
+ This->sprites=HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sprites, This->allocated_sprites*sizeof(SPRITE));
+ }
+ This->sprites[This->sprite_count].texture=texture;
+ IUnknown_AddRef(texture);
+
+ /* Reuse the texture desc if possible */
+ if(This->sprite_count) {
+ if(This->sprites[This->sprite_count-1].texture!=texture) {
+ IDirect3DTexture9_GetLevelDesc(texture, 0, &texdesc);
+ } else {
+ texdesc.Width=This->sprites[This->sprite_count-1].texw;
+ texdesc.Height=This->sprites[This->sprite_count-1].texh;
+ }
+ } else IDirect3DTexture9_GetLevelDesc(texture, 0, &texdesc);
+
+ This->sprites[This->sprite_count].texw=texdesc.Width;
+ This->sprites[This->sprite_count].texh=texdesc.Height;
+
+ if(rect==NULL) {
+ This->sprites[This->sprite_count].rect.left=0;
+ This->sprites[This->sprite_count].rect.top=0;
+ This->sprites[This->sprite_count].rect.right=texdesc.Width;
+ This->sprites[This->sprite_count].rect.bottom=texdesc.Height;
+ } else This->sprites[This->sprite_count].rect=*rect;
+
+ if(center==NULL) {
+ This->sprites[This->sprite_count].center.x=0.0f;
+ This->sprites[This->sprite_count].center.y=0.0f;
+ This->sprites[This->sprite_count].center.z=0.0f;
+ } else This->sprites[This->sprite_count].center=*center;
+
+ if(position==NULL) {
+ This->sprites[This->sprite_count].pos.x=0.0f;
+ This->sprites[This->sprite_count].pos.y=0.0f;
+ This->sprites[This->sprite_count].pos.z=0.0f;
+ } else This->sprites[This->sprite_count].pos=*position;
+
+ This->sprites[This->sprite_count].color=color;
+ This->sprite_count++;
+
+ return D3D_OK;
}
static HRESULT WINAPI ID3DXSpriteImpl_Flush(LPD3DXSPRITE iface)
{
ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
+ int i;
FIXME("(%p): stub\n", This);
+
+ for(i=0;i<This->sprite_count;i++)
+ if(This->sprites[i].texture)
+ IDirect3DTexture9_Release(This->sprites[i].texture);
+
+ This->sprite_count=0;
+
return E_NOTIMPL;
}
@@ -120,6 +185,9 @@ static HRESULT WINAPI ID3DXSpriteImpl_End(LPD3DXSPRITE iface)
{
ID3DXSpriteImpl *This=(ID3DXSpriteImpl*)iface;
FIXME("(%p): stub\n", This);
+
+ ID3DXSprite_Flush(iface);
+
return E_NOTIMPL;
}
@@ -198,6 +266,7 @@ HRESULT WINAPI D3DXCreateSprite(LPDIRECT3DDEVICE9 device, LPD3DXSPRITE *sprite)
object->sprites=NULL;
object->sprite_count=0;
+ object->allocated_sprites=0;
*sprite=(ID3DXSprite*)object;
More information about the wine-cvs
mailing list