https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f48a01324c82341a3bc79815fc3e3bf5f7b81275

commit f48a01324c82341a3bc79815fc3e3bf5f7b81275
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Wed Jan 1 16:48:52 2020 +0900
Commit:     GitHub <[email protected]>
CommitDate: Wed Jan 1 16:48:52 2020 +0900

    [SDK][INCLUDE] Improve gdiplusmatrix.h (#2220)
    
    CORE-16585
---
 sdk/include/psdk/gdiplusmatrix.h | 62 ++++++++++++++++++++++++++++------------
 1 file changed, 43 insertions(+), 19 deletions(-)

diff --git a/sdk/include/psdk/gdiplusmatrix.h b/sdk/include/psdk/gdiplusmatrix.h
index 124b070a9e4..f959dc9d07a 100644
--- a/sdk/include/psdk/gdiplusmatrix.h
+++ b/sdk/include/psdk/gdiplusmatrix.h
@@ -50,7 +50,7 @@ class Matrix : public GdiplusBase
     }
 
     Matrix *
-    Clone()
+    Clone() const
     {
         GpMatrix *cloneMatrix = NULL;
         SetStatus(DllExports::GdipCloneMatrix(nativeMatrix, &cloneMatrix));
@@ -58,7 +58,11 @@ class Matrix : public GdiplusBase
         if (lastStatus != Ok)
             return NULL;
 
-        return new Matrix(cloneMatrix);
+        Matrix *newMatrix = new Matrix(cloneMatrix);
+        if (!newMatrix)
+            DllExports::GdipDeleteMatrix(cloneMatrix);
+
+        return newMatrix;
     }
 
     ~Matrix()
@@ -67,7 +71,7 @@ class Matrix : public GdiplusBase
     }
 
     BOOL
-    Equals(const Matrix *matrix)
+    Equals(const Matrix *matrix) const
     {
         BOOL result;
         SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix, matrix ? 
getNat(matrix) : NULL, &result));
@@ -93,7 +97,7 @@ class Matrix : public GdiplusBase
     }
 
     BOOL
-    IsIdentity()
+    IsIdentity() const
     {
         BOOL result;
         SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
@@ -101,7 +105,7 @@ class Matrix : public GdiplusBase
     }
 
     BOOL
-    IsInvertible()
+    IsInvertible() const
     {
         BOOL result;
         SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
@@ -109,40 +113,60 @@ class Matrix : public GdiplusBase
     }
 
     Status
-    Multiply(const Matrix *matrix, MatrixOrder order)
+    Multiply(const Matrix *matrix, MatrixOrder order = MatrixOrderPrepend)
     {
         return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix, matrix ? 
getNat(matrix) : NULL, order));
     }
 
-    REAL OffsetX(VOID)
+    REAL
+    OffsetX() const
     {
-        return 0;
+        REAL elements[6];
+        if (GetElements(elements) == Ok)
+            return elements[4];
+        return 0.0f;
     }
 
-    REAL OffsetY(VOID)
+    REAL
+    OffsetY() const
     {
-        return 0;
+        REAL elements[6];
+        if (GetElements(elements) == Ok)
+            return elements[5];
+        return 0.0f;
     }
 
-    Status Reset(VOID)
+    Status
+    Reset()
     {
-        return NotImplemented;
+        return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix, 1.0, 
0.0, 0.0, 1.0, 0.0, 0.0));
     }
 
     Status
-    Rotate(REAL angle, MatrixOrder order)
+    Rotate(REAL angle, MatrixOrder order = MatrixOrderPrepend)
     {
         return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, 
order));
     }
 
     Status
-    RotateAt(REAL angle, const PointF &center, MatrixOrder order)
-    {
-        return NotImplemented;
+    RotateAt(REAL angle, const PointF &center, MatrixOrder order = 
MatrixOrderPrepend)
+    {
+        if (order == MatrixOrderPrepend)
+        {
+            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, 
center.Y, order));
+            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, 
order));
+            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, 
-center.X, -center.Y, order));
+        }
+        else
+        {
+            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, -center.X, 
-center.Y, order));
+            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, 
order));
+            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, 
center.X, center.Y, order));
+        }
     }
 
     Status
-    Scale(REAL scaleX, REAL scaleY, MatrixOrder order)
+    Scale(REAL scaleX, REAL scaleY, MatrixOrder order = MatrixOrderPrepend)
     {
         return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, 
scaleY, order));
     }
@@ -154,7 +178,7 @@ class Matrix : public GdiplusBase
     }
 
     Status
-    Shear(REAL shearX, REAL shearY, MatrixOrder order)
+    Shear(REAL shearX, REAL shearY, MatrixOrder order = MatrixOrderPrepend)
     {
         return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, 
shearY, order));
     }
@@ -184,7 +208,7 @@ class Matrix : public GdiplusBase
     }
 
     Status
-    Translate(REAL offsetX, REAL offsetY, MatrixOrder order)
+    Translate(REAL offsetX, REAL offsetY, MatrixOrder order = 
MatrixOrderPrepend)
     {
         return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, 
offsetX, offsetY, order));
     }

Reply via email to