[PATCH 03/12] d3drm: Implement frame AddTransform combine types

Jeff Smith whydoubt at gmail.com
Thu Jun 13 23:27:28 CDT 2019


Signed-off-by: Jeff Smith <whydoubt at gmail.com>
---
 dlls/d3drm/frame.c       |  7 +++++--
 dlls/d3drm/tests/d3drm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index f5e24efb6f..545010caec 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -976,6 +976,7 @@ static HRESULT WINAPI d3drm_frame3_AddTransform(IDirect3DRMFrame3 *iface,
         D3DRMCOMBINETYPE type, D3DRMMATRIX4D matrix)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
+    D3DRMMATRIX4D m;
 
     TRACE("iface %p, type %#x, matrix %p.\n", iface, type, matrix);
 
@@ -986,11 +987,13 @@ static HRESULT WINAPI d3drm_frame3_AddTransform(IDirect3DRMFrame3 *iface,
             break;
 
         case D3DRMCOMBINE_BEFORE:
-            FIXME("D3DRMCOMBINE_BEFORE not supported yet\n");
+            memcpy(m, frame->transform, sizeof(D3DRMMATRIX4D));
+            matrix_multiply(frame->transform, matrix, m);
             break;
 
         case D3DRMCOMBINE_AFTER:
-            FIXME("D3DRMCOMBINE_AFTER not supported yet\n");
+            memcpy(m, frame->transform, sizeof(D3DRMMATRIX4D));
+            matrix_multiply(frame->transform, m, matrix);
             break;
 
         default:
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 1c02d639a0..51099dc58a 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -2762,6 +2762,32 @@ cleanup:
         } \
     }
 
+#define EXPECT_TRANSFORM_MATRIX(test_description, matrix, m11,m12,m13, m21,m22,m23, m31,m32,m33, m41,m42,m43) \
+    { \
+        int pass = 1; \
+        ok(hr == D3DRM_OK, test_description ": returned hr = %x\n", hr); \
+        CHECK(matrix[0][0], m11); \
+        CHECK(matrix[0][1], m12); \
+        CHECK(matrix[0][2], m13); \
+        CHECK(matrix[1][0], m21); \
+        CHECK(matrix[1][1], m22); \
+        CHECK(matrix[1][2], m23); \
+        CHECK(matrix[2][0], m31); \
+        CHECK(matrix[2][1], m32); \
+        CHECK(matrix[2][2], m33); \
+        CHECK(matrix[3][0], m41); \
+        CHECK(matrix[3][1], m42); \
+        CHECK(matrix[3][2], m43); \
+        ok(pass, test_description ": returned matrix is not correct\n"); \
+    }
+
+#define EXPECT_TRANSFORM(test_description, frame, m11,m12,m13, m21,m22,m23, m31,m32,m33, m41,m42,m43) \
+    { \
+        D3DRMMATRIX4D matrix; \
+        IDirect3DRMFrame_GetTransform(frame, matrix); \
+        EXPECT_TRANSFORM_MATRIX(test_description, matrix, m11,m12,m13, m21,m22,m23, m31,m32,m33, m41,m42,m43); \
+    }
+
 #define EXPECT_VECTOR(test_description, vector, vx,vy,vz) \
     { \
         int pass = 1; \
@@ -2809,6 +2835,24 @@ static void test_frame_transform(void)
     EXPECT_VECTOR("InverseTransform (subframe)", v2, 3,5,7);
 
 
+    memcpy(matrix, identity, sizeof(D3DRMMATRIX4D));
+    matrix[3][0] = 3.0f;
+    matrix[3][1] = 3.0f;
+    matrix[3][2] = 3.0f;
+
+    SET_TRANSFORM(frame, 2,0,0, 0,2,0, 0,0,2, 0,0,0);
+    hr = IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_REPLACE, matrix);
+    EXPECT_TRANSFORM("AddTransform (REPLACE)", frame, 1,0,0, 0,1,0, 0,0,1, 3,3,3);
+
+    SET_TRANSFORM(frame, 2,0,0, 0,2,0, 0,0,2, 0,0,0);
+    hr = IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_BEFORE, matrix);
+    EXPECT_TRANSFORM("AddTransform (BEFORE)", frame, 2,0,0, 0,2,0, 0,0,2, 6,6,6);
+
+    SET_TRANSFORM(frame, 2,0,0, 0,2,0, 0,0,2, 0,0,0);
+    hr = IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_AFTER, matrix);
+    EXPECT_TRANSFORM("AddTransform (AFTER)", frame, 2,0,0, 0,2,0, 0,0,2, 3,3,3);
+
+
     IDirect3DRMFrame_Release(subframe);
     IDirect3DRMFrame_Release(frame);
     IDirect3DRM_Release(d3drm);
-- 
2.14.3




More information about the wine-devel mailing list