[PATCH v2 1/6] d3drm: Implement frame AddTransform combine types

Jeff Smith whydoubt at gmail.com
Mon Jun 17 20:20:59 CDT 2019


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

diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c
index 8bed50b57e..46b5f37412 100644
--- a/dlls/d3drm/frame.c
+++ b/dlls/d3drm/frame.c
@@ -937,10 +937,31 @@ static HRESULT WINAPI d3drm_frame1_AddMoveCallback(IDirect3DRMFrame *iface,
     return E_NOTIMPL;
 }
 
+static void matrix_multiply_affine(D3DRMMATRIX4D d, D3DRMMATRIX4D s1, D3DRMMATRIX4D s2)
+{
+    d[0][0] = s1[0][0] * s2[0][0] + s1[0][1] * s2[1][0] + s1[0][2] * s2[2][0];
+    d[0][1] = s1[0][0] * s2[0][1] + s1[0][1] * s2[1][1] + s1[0][2] * s2[2][1];
+    d[0][2] = s1[0][0] * s2[0][2] + s1[0][1] * s2[1][2] + s1[0][2] * s2[2][2];
+    d[0][3] = 0.0f;
+    d[1][0] = s1[1][0] * s2[0][0] + s1[1][1] * s2[1][0] + s1[1][2] * s2[2][0];
+    d[1][1] = s1[1][0] * s2[0][1] + s1[1][1] * s2[1][1] + s1[1][2] * s2[2][1];
+    d[1][2] = s1[1][0] * s2[0][2] + s1[1][1] * s2[1][2] + s1[1][2] * s2[2][2];
+    d[1][3] = 0.0f;
+    d[2][0] = s1[2][0] * s2[0][0] + s1[2][1] * s2[1][0] + s1[2][2] * s2[2][0];
+    d[2][1] = s1[2][0] * s2[0][1] + s1[2][1] * s2[1][1] + s1[2][2] * s2[2][1];
+    d[2][2] = s1[2][0] * s2[0][2] + s1[2][1] * s2[1][2] + s1[2][2] * s2[2][2];
+    d[2][3] = 0.0f;
+    d[3][0] = s1[3][0] * s2[0][0] + s1[3][1] * s2[1][0] + s1[3][2] * s2[2][0] + s2[3][0];
+    d[3][1] = s1[3][0] * s2[0][1] + s1[3][1] * s2[1][1] + s1[3][2] * s2[2][1] + s2[3][1];
+    d[3][2] = s1[3][0] * s2[0][2] + s1[3][1] * s2[1][2] + s1[3][2] * s2[2][2] + s2[3][2];
+    d[3][3] = 1.0f;
+}
+
 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);
 
@@ -951,11 +972,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_affine(frame->transform, matrix, m);
             break;
 
         case D3DRMCOMBINE_AFTER:
-            FIXME("D3DRMCOMBINE_AFTER not supported yet\n");
+            memcpy(m, frame->transform, sizeof(D3DRMMATRIX4D));
+            matrix_multiply_affine(frame->transform, m, matrix);
             break;
 
         default:
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index cc4f8fe16a..9cfdba484e 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -75,6 +75,30 @@ static void vector_eq_(unsigned int line, const D3DVECTOR *left, const D3DVECTOR
     check_vector_(line, left, U1(right)->x, U2(right)->y, U3(right)->z, 0);
 }
 
+#define check_matrix(a, b,c,d, e,f,g, h,i,j, k,l,m, n) check_matrix_(__LINE__, a, b,c,d, e,f,g, h,i,j, k,l,m, n)
+static void check_matrix_(unsigned int line, const D3DRMMATRIX4D m,
+        D3DVALUE m11, D3DVALUE m12, D3DVALUE m13,
+        D3DVALUE m21, D3DVALUE m22, D3DVALUE m23,
+        D3DVALUE m31, D3DVALUE m32, D3DVALUE m33,
+        D3DVALUE m41, D3DVALUE m42, D3DVALUE m43,
+        unsigned int ulps)
+{
+    BOOL ret = compare_float(m[0][0], m11, ulps)
+            && compare_float(m[0][1], m12, ulps)
+            && compare_float(m[0][2], m13, ulps)
+            && compare_float(m[1][0], m21, ulps)
+            && compare_float(m[1][1], m22, ulps)
+            && compare_float(m[1][2], m23, ulps)
+            && compare_float(m[2][0], m31, ulps)
+            && compare_float(m[2][1], m32, ulps)
+            && compare_float(m[2][2], m33, ulps)
+            && compare_float(m[3][0], m41, ulps)
+            && compare_float(m[3][1], m42, ulps)
+            && compare_float(m[3][2], m43, ulps);
+
+    ok_(__FILE__, line)(ret, "Got unexpected matrix.\n");
+}
+
 static D3DRMMATRIX4D identity = {
     { 1.0f, 0.0f, 0.0f, 0.0f },
     { 0.0f, 1.0f, 0.0f, 0.0f },
@@ -2709,12 +2733,28 @@ cleanup:
     DestroyWindow(window);
 }
 
+static void set_transform(IDirect3DRMFrame *frame,
+        D3DVALUE m11, D3DVALUE m12, D3DVALUE m13,
+        D3DVALUE m21, D3DVALUE m22, D3DVALUE m23,
+        D3DVALUE m31, D3DVALUE m32, D3DVALUE m33,
+        D3DVALUE m41, D3DVALUE m42, D3DVALUE m43)
+{
+    D3DRMMATRIX4D matrix = {
+        {m11, m12, m13, 0.0f},
+        {m21, m22, m23, 0.0f},
+        {m31, m32, m33, 0.0f},
+        {m41, m42, m43, 1.0f}
+    };
+
+    IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_REPLACE, matrix);
+}
+
 static void test_frame_transform(void)
 {
     HRESULT hr;
     IDirect3DRM *d3drm;
     IDirect3DRMFrame *frame;
-    D3DRMMATRIX4D matrix;
+    D3DRMMATRIX4D matrix, add_matrix;
 
     hr = Direct3DRMCreate(&d3drm);
     ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
@@ -2726,6 +2766,31 @@ static void test_frame_transform(void)
     ok(hr == D3DRM_OK, "IDirect3DRMFrame_GetTransform returned hr = %x\n", hr);
     ok(!memcmp(matrix, identity, sizeof(D3DRMMATRIX4D)), "Returned matrix is not identity\n");
 
+
+    memcpy(add_matrix, identity, sizeof(D3DRMMATRIX4D));
+    add_matrix[3][0] = 3.0f;
+    add_matrix[3][1] = 3.0f;
+    add_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, add_matrix);
+    ok(hr == D3DRM_OK, "Cannot add transform (REPLACE) (hr = %x)", hr);
+    IDirect3DRMFrame_GetTransform(frame, matrix);
+    check_matrix(matrix, 1,0,0, 0,1,0, 0,0,1, 3,3,3, 32);
+
+    set_transform(frame, 2,0,0, 0,2,0, 0,0,2, 0,0,0);
+    hr = IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_BEFORE, add_matrix);
+    ok(hr == D3DRM_OK, "Cannot add transform (BEFORE) (hr = %x)", hr);
+    IDirect3DRMFrame_GetTransform(frame, matrix);
+    check_matrix(matrix, 2,0,0, 0,2,0, 0,0,2, 6,6,6, 32);
+
+    set_transform(frame, 2,0,0, 0,2,0, 0,0,2, 0,0,0);
+    hr = IDirect3DRMFrame_AddTransform(frame, D3DRMCOMBINE_AFTER, add_matrix);
+    ok(hr == D3DRM_OK, "Cannot add transform (AFTER) (hr = %x)", hr);
+    IDirect3DRMFrame_GetTransform(frame, matrix);
+    check_matrix(matrix, 2,0,0, 0,2,0, 0,0,2, 3,3,3, 32);
+
+
     IDirect3DRMFrame_Release(frame);
     IDirect3DRM_Release(d3drm);
 }
-- 
2.14.3




More information about the wine-devel mailing list