Nikolay Sivov : gdiplus: GdipIsMatrixInvertible implementation with tests.

Alexandre Julliard julliard at winehq.org
Tue Jul 8 06:11:15 CDT 2008


Module: wine
Branch: master
Commit: d4554ad5d5f8748d57222e3f2a0b8be336d5f6a6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d4554ad5d5f8748d57222e3f2a0b8be336d5f6a6

Author: Nikolay Sivov <bunglehead at gmail.com>
Date:   Tue Jul  8 01:32:30 2008 +0400

gdiplus: GdipIsMatrixInvertible implementation with tests.

---

 dlls/gdiplus/gdiplus.spec   |    2 +-
 dlls/gdiplus/matrix.c       |   14 ++++++++++++++
 dlls/gdiplus/tests/matrix.c |   30 ++++++++++++++++++++++++++++++
 include/gdiplusflat.h       |    1 +
 4 files changed, 46 insertions(+), 1 deletions(-)

diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 1906a88..34e094d 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -420,7 +420,7 @@
 @ stdcall GdipIsInfiniteRegion(ptr ptr ptr)
 @ stdcall GdipIsMatrixEqual(ptr ptr ptr)
 @ stdcall GdipIsMatrixIdentity(ptr ptr)
-@ stub GdipIsMatrixInvertible
+@ stdcall GdipIsMatrixInvertible(ptr ptr)
 @ stub GdipIsOutlineVisiblePathPoint
 @ stdcall GdipIsOutlineVisiblePathPointI(ptr long long ptr ptr ptr)
 @ stub GdipIsStyleAvailable
diff --git a/dlls/gdiplus/matrix.c b/dlls/gdiplus/matrix.c
index eb83884..dcdc2bd 100644
--- a/dlls/gdiplus/matrix.c
+++ b/dlls/gdiplus/matrix.c
@@ -158,6 +158,20 @@ GpStatus WINGDIPAPI GdipGetMatrixElements(GDIPCONST GpMatrix *matrix,
     return Ok;
 }
 
+GpStatus WINGDIPAPI GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result)
+{
+    REAL det;
+
+    if(!matrix || !result)
+        return InvalidParameter;
+
+    det = matrix->matrix[0]*matrix->matrix[3] - matrix->matrix[1]*matrix->matrix[2];
+
+    *result = (fabs(det) >= 1e-5);
+
+    return Ok;
+}
+
 GpStatus WINGDIPAPI GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,
     GpMatrixOrder order)
 {
diff --git a/dlls/gdiplus/tests/matrix.c b/dlls/gdiplus/tests/matrix.c
index cc53488..7d5e798 100644
--- a/dlls/gdiplus/tests/matrix.c
+++ b/dlls/gdiplus/tests/matrix.c
@@ -89,6 +89,35 @@ static void test_transform(void)
     GdipDeleteMatrix(matrix);
 }
 
+static void test_isinvertible(void)
+{
+    GpStatus status;
+    GpMatrix *matrix = NULL;
+    BOOL result;
+
+    /* NULL arguments */
+    status = GdipIsMatrixInvertible(NULL, &result);
+    expect(InvalidParameter, status);
+    status = GdipIsMatrixInvertible((GpMatrix*)0xdeadbeef, NULL);
+    expect(InvalidParameter, status);
+    status = GdipIsMatrixInvertible(NULL, NULL);
+    expect(InvalidParameter, status);
+
+    /* invertible */
+    GdipCreateMatrix2(1.0, 1.2, 2.3, -1.0, 2.0, 3.0, &matrix);
+    status = GdipIsMatrixInvertible(matrix, &result);
+    expect(Ok, status);
+    expect(TRUE, result);
+    GdipDeleteMatrix(matrix);
+
+    /* noninvertible */
+    GdipCreateMatrix2(2.0, -1.0, 6.0, -3.0, 2.2, 3.0, &matrix);
+    status = GdipIsMatrixInvertible(matrix, &result);
+    expect(Ok, status);
+    expect(FALSE, result);
+    GdipDeleteMatrix(matrix);
+}
+
 START_TEST(matrix)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -103,6 +132,7 @@ START_TEST(matrix)
 
     test_constructor_destructor();
     test_transform();
+    test_isinvertible();
 
     GdiplusShutdown(gdiplusToken);
 }
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index 09bcafe..92cb286 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -264,6 +264,7 @@ GpStatus WINGDIPAPI GdipCreateMatrix3(GDIPCONST GpRectF *,GDIPCONST GpPointF*,Gp
 GpStatus WINGDIPAPI GdipCreateMatrix3I(GDIPCONST GpRect*,GDIPCONST GpPoint*,GpMatrix**);
 GpStatus WINGDIPAPI GdipIsMatrixEqual(GDIPCONST GpMatrix*, GDIPCONST GpMatrix*, BOOL*);
 GpStatus WINGDIPAPI GdipIsMatrixIdentity(GDIPCONST GpMatrix*, BOOL*);
+GpStatus WINGDIPAPI GdipIsMatrixInvertible(GDIPCONST GpMatrix*, BOOL*);
 
 GpStatus WINGDIPAPI GdipDeleteMatrix(GpMatrix*);
 GpStatus WINGDIPAPI GdipGetMatrixElements(GDIPCONST GpMatrix*,REAL*);




More information about the wine-cvs mailing list