[PATCH 3/3] d3dx10/sprite: Store projection matrix.

Nikolay Sivov nsivov at codeweavers.com
Wed Sep 1 08:09:36 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d3dx10_43/sprite.c       | 27 +++++++++++++++++++++++----
 dlls/d3dx10_43/tests/d3dx10.c | 14 ++++++++------
 2 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/dlls/d3dx10_43/sprite.c b/dlls/d3dx10_43/sprite.c
index 5fc9b9edaa2..b2045e72a27 100644
--- a/dlls/d3dx10_43/sprite.c
+++ b/dlls/d3dx10_43/sprite.c
@@ -32,6 +32,7 @@ struct d3dx10_sprite
     ID3DX10Sprite ID3DX10Sprite_iface;
     LONG refcount;
 
+    D3DXMATRIX projection;
     ID3D10Device *device;
 };
 
@@ -139,16 +140,30 @@ static HRESULT WINAPI d3dx10_sprite_SetViewTransform(ID3DX10Sprite *iface, D3DXM
 static HRESULT WINAPI d3dx10_sprite_GetProjectionTransform(ID3DX10Sprite *iface,
         D3DXMATRIX *transform)
 {
-    FIXME("iface %p, transform %p stub!\n", iface, transform);
+    struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, transform %p.\n", iface, transform);
+
+    if (!transform)
+        return E_FAIL;
+
+    *transform = sprite->projection;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI d3dx10_sprite_SetProjectionTransform(ID3DX10Sprite *iface, D3DXMATRIX *transform)
 {
-    FIXME("iface %p, transform %p stub!\n", iface, transform);
+    struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface);
 
-    return E_NOTIMPL;
+    TRACE("iface %p, transform %p.\n", iface, transform);
+
+    if (!transform)
+        return E_FAIL;
+
+    sprite->projection = *transform;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI d3dx10_sprite_GetDevice(ID3DX10Sprite *iface, ID3D10Device **device)
@@ -201,6 +216,10 @@ HRESULT WINAPI D3DX10CreateSprite(ID3D10Device *device, UINT size, ID3DX10Sprite
     object->refcount = 1;
     object->device = device;
     ID3D10Device_AddRef(device);
+    object->projection._11 = 1.0f;
+    object->projection._22 = 1.0f;
+    object->projection._33 = 1.0f;
+    object->projection._44 = 1.0f;
 
     *sprite = &object->ID3DX10Sprite_iface;
 
diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c
index c7aa3eccd24..bc5ca6747f5 100644
--- a/dlls/d3dx10_43/tests/d3dx10.c
+++ b/dlls/d3dx10_43/tests/d3dx10.c
@@ -2968,6 +2968,13 @@ static void test_sprite(void)
     D3DXMATRIX mat, mat2;
     ULONG refcount;
     HRESULT hr;
+    static const D3DXMATRIX identity =
+    {
+        ._11 = 1.0f,
+        ._22 = 1.0f,
+        ._33 = 1.0f,
+        ._44 = 1.0f,
+    };
 
     if (!(device = create_device()))
     {
@@ -3020,11 +3027,10 @@ static void test_sprite(void)
 
     /* Projection transform */
     hr = ID3DX10Sprite_GetProjectionTransform(sprite, NULL);
-todo_wine
     ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr);
     hr = ID3DX10Sprite_GetProjectionTransform(sprite, &mat);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(!memcmp(&mat, &identity, sizeof(mat)), "Unexpected projection transform.\n");
 
     /* Set a transform and test if it gets returned correctly */
     mat.m[0][0] = 2.1f; mat.m[0][1] = 6.5f; mat.m[0][2] =-9.6f; mat.m[0][3] = 1.7f;
@@ -3033,18 +3039,14 @@ todo_wine
     mat.m[3][0] = 6.7f; mat.m[3][1] =-5.1f; mat.m[3][2] = 6.1f; mat.m[3][3] = 2.2f;
 
     hr = ID3DX10Sprite_SetProjectionTransform(sprite, NULL);
-todo_wine
     ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr);
 
     hr = ID3DX10Sprite_SetProjectionTransform(sprite, &mat);
-todo_wine
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
 
     hr = ID3DX10Sprite_GetProjectionTransform(sprite, &mat2);
-todo_wine {
     ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
     ok(!memcmp(&mat, &mat2, sizeof(mat)), "Unexpected matrix.\n");
-}
 
     /* View transform */
     hr = ID3DX10Sprite_SetViewTransform(sprite, NULL);
-- 
2.33.0




More information about the wine-devel mailing list