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