Nikolay Sivov : d2d1: Implement matrix inversion functions.
Alexandre Julliard
julliard at winehq.org
Mon Aug 27 16:18:16 CDT 2018
Module: wine
Branch: master
Commit: dcd530b422cf79089a59347b3a8de4f50d8e3d29
URL: https://source.winehq.org/git/wine.git/?a=commit;h=dcd530b422cf79089a59347b3a8de4f50d8e3d29
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Aug 24 12:40:45 2018 +0300
d2d1: Implement matrix inversion functions.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d2d1/d2d1.spec | 4 +--
dlls/d2d1/factory.c | 16 ++++++++++
dlls/d2d1/tests/d2d1.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/d2d1.idl | 2 ++
4 files changed, 104 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/d2d1.spec b/dlls/d2d1/d2d1.spec
index 26d17c6..3443b29 100644
--- a/dlls/d2d1/d2d1.spec
+++ b/dlls/d2d1/d2d1.spec
@@ -1,8 +1,8 @@
@ stdcall D2D1CreateFactory(long ptr ptr ptr)
@ stdcall D2D1MakeRotateMatrix(float float float ptr)
@ stub D2D1MakeSkewMatrix
-@ stub D2D1IsMatrixInvertible
-@ stub D2D1InvertMatrix
+@ stdcall D2D1IsMatrixInvertible(ptr)
+@ stdcall D2D1InvertMatrix(ptr)
@ stub D2D1ConvertColorSpace
@ stub D2D1CreateDevice
@ stub D2D1CreateDeviceContext
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index 7810e95..d2e5387 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -554,6 +554,22 @@ void WINAPI D2D1MakeRotateMatrix(float angle, D2D1_POINT_2F center, D2D1_MATRIX_
matrix->_32 = center.y - center.x * sin_theta - center.y * cos_theta;
}
+BOOL WINAPI D2D1IsMatrixInvertible(const D2D1_MATRIX_3X2_F *matrix)
+{
+ TRACE("matrix %p.\n", matrix);
+
+ return (matrix->_11 * matrix->_22 - matrix->_21 * matrix->_12) != 0.0f;
+}
+
+BOOL WINAPI D2D1InvertMatrix(D2D1_MATRIX_3X2_F *matrix)
+{
+ D2D1_MATRIX_3X2_F m = *matrix;
+
+ TRACE("matrix %p.\n", matrix);
+
+ return d2d_matrix_invert(matrix, &m);
+}
+
static BOOL get_config_key_dword(HKEY default_key, HKEY application_key, const char *name, DWORD *value)
{
DWORD type, data, size;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 8e58eef..eeae75f 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -6968,6 +6968,89 @@ if (SUCCEEDED(hr))
ID3D10Device1_Release(d3d_device);
}
+static void test_invert_matrix(void)
+{
+ static const struct
+ {
+ D2D1_MATRIX_3X2_F matrix;
+ D2D1_MATRIX_3X2_F inverse;
+ BOOL invertible;
+ }
+ invert_tests[] =
+ {
+ { { 0 }, { 0 }, FALSE },
+ {
+ {
+ 1.0f, 2.0f,
+ 1.0f, 2.0f,
+ 4.0f, 8.0f
+ },
+ {
+ 1.0f, 2.0f,
+ 1.0f, 2.0f,
+ 4.0f, 8.0f
+ },
+ FALSE
+ },
+ {
+ {
+ 2.0f, 0.0f,
+ 0.0f, 2.0f,
+ 4.0f, 8.0f
+ },
+ {
+ 0.5f, -0.0f,
+ -0.0f, 0.5f,
+ -2.0f, -4.0f
+ },
+ TRUE
+ },
+ {
+ {
+ 2.0f, 1.0f,
+ 2.0f, 2.0f,
+ 4.0f, 8.0f
+ },
+ {
+ 1.0f, -0.5f,
+ -1.0f, 1.0f,
+ 4.0f, -6.0f
+ },
+ TRUE
+ },
+ {
+ {
+ 2.0f, 1.0f,
+ 3.0f, 1.0f,
+ 4.0f, 8.0f
+ },
+ {
+ -1.0f, 1.0f,
+ 3.0f, -2.0f,
+ -20.0f, 12.0f
+ },
+ TRUE
+ },
+ };
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(invert_tests); ++i)
+ {
+ D2D1_MATRIX_3X2_F m;
+ BOOL ret;
+
+ m = invert_tests[i].matrix;
+ ret = D2D1InvertMatrix(&m);
+ ok(ret == invert_tests[i].invertible, "%u: unexpected return value %d.\n", i, ret);
+ ok(!memcmp(&m, &invert_tests[i].inverse, sizeof(m)),
+ "%u: unexpected matrix value {%.8e, %.8e, %.8e, %.8e, %.8e, %.8e}.\n", i,
+ m._11, m._12, m._21, m._22, m._31, m._32);
+
+ ret = D2D1IsMatrixInvertible(&invert_tests[i].matrix);
+ ok(ret == invert_tests[i].invertible, "%u: unexpected return value %d.\n", i, ret);
+ }
+}
+
START_TEST(d2d1)
{
unsigned int argc, i;
@@ -7009,6 +7092,7 @@ START_TEST(d2d1)
queue_test(test_create_device);
queue_test(test_bitmap_surface);
queue_test(test_device_context);
+ queue_test(test_invert_matrix);
run_queued_tests();
}
diff --git a/include/d2d1.idl b/include/d2d1.idl
index fbfb40d..ff2dc03 100644
--- a/include/d2d1.idl
+++ b/include/d2d1.idl
@@ -1254,4 +1254,6 @@ interface ID2D1Factory : IUnknown
[local] HRESULT __stdcall D2D1CreateFactory(D2D1_FACTORY_TYPE factory_type, REFIID iid,
const D2D1_FACTORY_OPTIONS *factory_options, void **factory);
+[local] BOOL __stdcall D2D1InvertMatrix(D2D1_MATRIX_3X2_F *matrix);
+[local] BOOL __stdcall D2D1IsMatrixInvertible(const D2D1_MATRIX_3X2_F *matrix);
[local] void __stdcall D2D1MakeRotateMatrix(float angle, D2D1_POINT_2F center, D2D1_MATRIX_3X2_F *matrix);
More information about the wine-cvs
mailing list