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