1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**************************************************************************\
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Module Name:
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*   GdiplusMatrix.h
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Abstract:
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*   GDI+ Matrix class
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\**************************************************************************/
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Matrix : public GdiplusBase
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class Graphics;
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class GraphicsPath;
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class TextureBrush;
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class LinearGradientBrush;
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class PathGradientBrush;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class Pen;
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    friend class Region;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Default constructor - set to identity matrix
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix()
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GpMatrix *matrix = NULL;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = DllExports::GdipCreateMatrix(&matrix);
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(matrix);
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(IN REAL m11,
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN REAL m12,
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN REAL m21,
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN REAL m22,
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN REAL dx,
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN REAL dy)
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GpMatrix *matrix = NULL;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22,
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                      dx, dy, &matrix);
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(matrix);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(IN const RectF& rect,
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN const PointF* dstplg)
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GpMatrix *matrix = NULL;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = DllExports::GdipCreateMatrix3(&rect,
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                   dstplg,
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                   &matrix);
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(matrix);
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(IN const Rect& rect,
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           IN const Point* dstplg)
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GpMatrix *matrix = NULL;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = DllExports::GdipCreateMatrix3I(&rect,
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    dstplg,
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                    &matrix);
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(matrix);
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~Matrix()
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        DllExports::GdipDeleteMatrix(nativeMatrix);
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix *Clone() const
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        GpMatrix *cloneMatrix = NULL;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                  &cloneMatrix));
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (lastResult != Ok)
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return NULL;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return new Matrix(cloneMatrix);
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status GetElements(OUT REAL *m) const
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status SetElements(IN REAL m11,
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       IN REAL m12,
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       IN REAL m21,
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       IN REAL m22,
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       IN REAL dx,
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                       IN REAL dy)
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            m11, m12, m21, m22, dx, dy));
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL OffsetX() const
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL elements[6];
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (GetElements(&elements[0]) == Ok)
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return elements[4];
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return 0.0f;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL OffsetY() const
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       REAL elements[6];
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       if (GetElements(&elements[0]) == Ok)
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           return elements[5];
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       else
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           return 0.0f;
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Reset()
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        // set identity matrix elements
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                             1.0, 0.0, 0.0, 1.0, 0.0, 0.0));
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Multiply(IN const Matrix *matrix,
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    IN MatrixOrder order = MatrixOrderPrepend)
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix,
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                          matrix->nativeMatrix,
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                          order));
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Translate(IN REAL offsetX,
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     IN REAL offsetY,
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     IN MatrixOrder order = MatrixOrderPrepend)
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Scale(IN REAL scaleX,
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN REAL scaleY,
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN MatrixOrder order = MatrixOrderPrepend)
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Rotate(IN REAL angle,
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  IN MatrixOrder order = MatrixOrderPrepend)
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status RotateAt(IN REAL angle,
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    IN const PointF& center,
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    IN MatrixOrder order = MatrixOrderPrepend)
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if(order == MatrixOrderPrepend)
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Shear(IN REAL shearX,
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN REAL shearY,
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN MatrixOrder order = MatrixOrderPrepend)
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status Invert()
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // float version
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status TransformPoints(IN OUT PointF* pts,
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                           IN INT count = 1) const
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status TransformPoints(IN OUT Point* pts,
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                           IN INT count = 1) const
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix,
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                pts,
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                count));
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status TransformVectors(IN OUT PointF* pts,
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            IN INT count = 1) const
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status TransformVectors(IN OUT Point* pts,
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            IN INT count = 1) const
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix,
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                    pts,
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                                    count));
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IsInvertible() const
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        BOOL result = FALSE;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return result;
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IsIdentity() const
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       BOOL result = FALSE;
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return result;
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Equals(IN const Matrix *matrix) const
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       BOOL result = FALSE;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                                                 matrix->nativeMatrix, &result));
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return result;
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status GetLastStatus() const
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Status lastStatus = lastResult;
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = Ok;
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return lastStatus;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DCR_USE_NEW_250932
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(const Matrix &);
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix& operator=(const Matrix &);
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(const Matrix& matrix)
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        matrix;
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetStatus(NotImplemented);
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(NULL);
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix& operator=(const Matrix& matrix)
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        matrix;
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetStatus(NotImplemented);
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Matrix(GpMatrix *nativeMatrix)
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        lastResult = Ok;
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        SetNativeMatrix(nativeMatrix);
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID SetNativeMatrix(GpMatrix *nativeMatrix)
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        this->nativeMatrix = nativeMatrix;
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Status SetStatus(Status status) const
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (status != Ok)
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return (lastResult = status);
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        else
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return status;
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprotected:
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GpMatrix *nativeMatrix;
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    mutable Status lastResult;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
310