added missing members
[mono.git] / mcs / class / System.Drawing / System.Drawing.Drawing2D / Matrix.cs
1 //\r
2 // System.Drawing.Drawing2D.Matrix.cs\r
3 //\r
4 // Authors:\r
5 //   Stefan Maierhofer <sm@cg.tuwien.ac.at>\r
6 //   Dennis Hayes (dennish@Raytek.com)\r
7 //   Duncan Mak (duncan@ximian.com)\r
8 //   Ravindra (rkumar@novell.com)
9 //\r
10 // (C) Ximian, Inc.  http://www.ximian.com
11 // (C) Novell, Inc.  http://www.novell.com\r
12 //\r
13 \r
14 using System;\r
15 using System.Drawing;\r
16 using System.Runtime.InteropServices;\r
17 \r
18 namespace System.Drawing.Drawing2D\r
19 {\r
20         public sealed class Matrix : MarshalByRefObject, IDisposable\r
21         {\r
22                 internal IntPtr nativeMatrix;\r
23                 \r
24                 // constructors\r
25                 internal Matrix (IntPtr ptr)\r
26                 {\r
27                         nativeMatrix = ptr;\r
28                 }\r
29                 \r
30                 public Matrix ()\r
31                 {\r
32                         Status status = GDIPlus.GdipCreateMatrix (out nativeMatrix);
33                         GDIPlus.CheckStatus (status);\r
34                 }\r
35         \r
36                 public Matrix (Rectangle rect , Point[] plgpts)\r
37                 {\r
38                         Status status = GDIPlus.GdipCreateMatrix3I (rect, plgpts, out nativeMatrix);
39                         GDIPlus.CheckStatus (status);\r
40                 }\r
41         \r
42                 public Matrix (RectangleF rect , PointF[] pa)\r
43                 {\r
44                         Status status = GDIPlus.GdipCreateMatrix3 (rect, pa, out nativeMatrix);
45                         GDIPlus.CheckStatus (status);\r
46                 }\r
47 \r
48                 public Matrix (float m11, float m12, float m21, float m22, float dx, float dy)\r
49                 {\r
50                         Status status = GDIPlus.GdipCreateMatrix2 (m11, m12, m21, m22, dx, dy, out nativeMatrix);
51                         GDIPlus.CheckStatus (status);\r
52                 }\r
53         \r
54                 // properties\r
55                 public float[] Elements {\r
56                         get {\r
57                                 IntPtr tmp = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (float)) * 6);\r
58                                 float [] retval = new float [6];\r
59 \r
60                                 Status status = GDIPlus.GdipGetMatrixElements (nativeMatrix, tmp);\r
61                                 GDIPlus.CheckStatus (status);
62 \r
63                                 Marshal.Copy (tmp, retval, 0, 6);\r
64 \r
65                                 Marshal.FreeHGlobal (tmp);\r
66                                 return retval;\r
67                         }\r
68                 }\r
69         \r
70                 public bool IsIdentity {\r
71                         get {\r
72                                 bool retval;\r
73                                 Status status = GDIPlus.GdipIsMatrixIdentity (nativeMatrix, out retval);\r
74                                 GDIPlus.CheckStatus (status);\r
75                                 return retval;\r
76                         }\r
77                 }\r
78         \r
79                 public bool IsInvertible {\r
80                         get {\r
81                                 bool retval;\r
82                                 Status status = GDIPlus.GdipIsMatrixInvertible (nativeMatrix, out retval);\r
83                                 GDIPlus.CheckStatus (status);\r
84                                 return retval;\r
85                         }\r
86                 }\r
87         \r
88                 public float OffsetX {\r
89                         get {\r
90                                 return this.Elements [4];\r
91                         }\r
92                 }\r
93         \r
94                 public float OffsetY {\r
95                         get {\r
96                                 return this.Elements [5];\r
97                         }\r
98                 }\r
99 \r
100                 public Matrix Clone()\r
101                 {\r
102                         IntPtr retval;\r
103                         Status status = GDIPlus.GdipCloneMatrix (nativeMatrix, out retval);
104                         GDIPlus.CheckStatus (status);\r
105                         return new Matrix (retval);\r
106                 }\r
107                 \r
108         \r
109                 public void Dispose ()\r
110                 {\r
111                         Status status = GDIPlus.GdipDeleteMatrix (nativeMatrix);
112                         GDIPlus.CheckStatus (status);\r
113                 }                       \r
114         \r
115                 public override bool Equals (object obj)\r
116                 {\r
117                         Matrix m = obj as Matrix;\r
118 \r
119                         if (m != null) {\r
120                                 bool retval;\r
121                                 Status status = GDIPlus.GdipIsMatrixEqual (nativeMatrix, m.nativeMatrix, out retval);
122                                 GDIPlus.CheckStatus (status);\r
123                                 return retval;\r
124 \r
125                         } else\r
126                                 return false;\r
127                 }\r
128         \r
129                 ~Matrix()\r
130                 {\r
131                         Dispose ();\r
132                 }\r
133                 \r
134                 public override int GetHashCode ()\r
135                 {\r
136                         return base.GetHashCode ();\r
137                 }\r
138         \r
139                 public void Invert ()\r
140                 {\r
141                         Status status = GDIPlus.GdipInvertMatrix (nativeMatrix);
142                         GDIPlus.CheckStatus (status);\r
143                 }\r
144         \r
145                 public void Multiply (Matrix matrix)\r
146                 {\r
147                         Multiply (matrix, MatrixOrder.Prepend);\r
148                 }\r
149         \r
150                 public void Multiply (Matrix matrix, MatrixOrder order)\r
151                 {\r
152                         Status status = GDIPlus.GdipMultiplyMatrix (nativeMatrix, matrix.nativeMatrix, order);
153                         GDIPlus.CheckStatus (status);\r
154                 }\r
155         \r
156                 public void Reset()\r
157                 {\r
158                         Status status = GDIPlus.GdipSetMatrixElements (nativeMatrix, 1, 0, 0, 1, 0, 0);
159                         GDIPlus.CheckStatus (status);\r
160                 }\r
161         \r
162                 public void Rotate (float angle)\r
163                 {\r
164                         Rotate (angle, MatrixOrder.Prepend);\r
165                 }\r
166         \r
167                 public void Rotate (float angle, MatrixOrder order)\r
168                 {\r
169                         Status status = GDIPlus.GdipRotateMatrix (nativeMatrix, angle, order);
170                         GDIPlus.CheckStatus (status);\r
171                 }\r
172         \r
173                 public void RotateAt (float angle, PointF point)\r
174                 {\r
175                         RotateAt (angle, point, MatrixOrder.Prepend);\r
176                 }\r
177         \r
178                 public void RotateAt (float angle, PointF point, MatrixOrder order)\r
179                 {\r
180                         angle *= (float) (Math.PI / 180.0);  // degrees to radians\r
181                         float cos = (float) Math.Cos (angle);\r
182                         float sin = (float) Math.Sin (angle);\r
183                         float e4 = -point.X * cos + point.Y * sin + point.X;\r
184                         float e5 = -point.X * sin - point.Y * cos + point.Y;\r
185                         float[] m = this.Elements;
186 \r
187                         Status status;
188 \r
189                         if (order == MatrixOrder.Prepend)\r
190                                 status = GDIPlus.GdipSetMatrixElements (nativeMatrix,\r
191                                                                 cos * m[0] + sin * m[2],\r
192                                                                 cos * m[1] + sin * m[3],\r
193                                                                 -sin * m[0] + cos * m[2],\r
194                                                                 -sin * m[1] + cos * m[3],\r
195                                                                 e4 * m[0] + e5 * m[2] + m[4],\r
196                                                                 e4 * m[1] + e5 * m[3] + m[5]);\r
197                         else\r
198                                 status = GDIPlus.GdipSetMatrixElements (nativeMatrix,\r
199                                                                 m[0] * cos + m[1] * -sin,\r
200                                                                 m[0] * sin + m[1] * cos,\r
201                                                                 m[2] * cos + m[3] * -sin,\r
202                                                                 m[2] * sin + m[3] * cos,\r
203                                                                 m[4] * cos + m[5] * -sin + e4,\r
204                                                                 m[4] * sin + m[5] * cos + e5);
205                         GDIPlus.CheckStatus (status);\r
206                 }\r
207         \r
208                 public void Scale (float scaleX, float scaleY)\r
209                 {\r
210                         Scale (scaleX, scaleY, MatrixOrder.Prepend);\r
211                 }\r
212         \r
213                 public void Scale (float scaleX, float scaleY, MatrixOrder order)\r
214                 {\r
215                         Status status = GDIPlus.GdipScaleMatrix (nativeMatrix, scaleX, scaleY, order);
216                         GDIPlus.CheckStatus (status);\r
217                 }\r
218         \r
219                 public void Shear (float shearX, float shearY)\r
220                 {\r
221                         Shear (shearX, shearY, MatrixOrder.Prepend);\r
222                 }\r
223         \r
224                 public void Shear (float shearX, float shearY, MatrixOrder order)\r
225                 {\r
226                         Status status = GDIPlus.GdipShearMatrix (nativeMatrix, shearX, shearY, order);
227                         GDIPlus.CheckStatus (status);\r
228                 }\r
229         \r
230                 public void TransformPoints (Point[] pts)\r
231                 {\r
232                         Status status = GDIPlus.GdipTransformMatrixPointsI (nativeMatrix, pts, pts.Length);
233                         GDIPlus.CheckStatus (status);\r
234                 }\r
235         \r
236                 public void TransformPoints (PointF[] pts)\r
237                 {\r
238                         Status status = GDIPlus.GdipTransformMatrixPoints (nativeMatrix, pts, pts.Length);
239                         GDIPlus.CheckStatus (status);\r
240                 }\r
241         \r
242                 public void TransformVectors (Point[] pts)\r
243                 {\r
244                         Status status = GDIPlus.GdipVectorTransformMatrixPointsI (nativeMatrix, pts, pts.Length);
245                         GDIPlus.CheckStatus (status);\r
246                 }\r
247         \r
248                 public void TransformVectors (PointF[] pts)\r
249                 {\r
250                         Status status = GDIPlus.GdipVectorTransformMatrixPoints (nativeMatrix, pts, pts.Length);
251                         GDIPlus.CheckStatus (status);\r
252                 }\r
253         \r
254                 public void Translate (float offsetX, float offsetY)\r
255                 {\r
256                         Translate (offsetX, offsetY, MatrixOrder.Prepend);\r
257                 }\r
258         \r
259                 public void Translate (float offsetX, float offsetY, MatrixOrder order)\r
260                 {\r
261                         Status status = GDIPlus.GdipTranslateMatrix (nativeMatrix, offsetX, offsetY, order);
262                         GDIPlus.CheckStatus (status);\r
263                 }\r
264         \r
265                 public void VectorTransformPoints (Point[] pts)\r
266                 {\r
267                         TransformVectors (pts);\r
268                 }\r
269                 \r
270                 internal IntPtr NativeObject\r
271                 {\r
272                         get{\r
273                                 return nativeMatrix;\r
274                         }\r
275                         set     {\r
276                                 nativeMatrix = value;\r
277                         }\r
278                 }\r
279         }\r
280 }\r