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