Module: wine Branch: master Commit: d4554ad5d5f8748d57222e3f2a0b8be336d5f6a6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d4554ad5d5f8748d57222e3f2a...
Author: Nikolay Sivov bunglehead@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*);