Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/System.Drawing/System.Drawing.Drawing2D/Matrix.jvm.cs')
-rwxr-xr-xmcs/class/System.Drawing/System.Drawing.Drawing2D/Matrix.jvm.cs295
1 files changed, 295 insertions, 0 deletions
diff --git a/mcs/class/System.Drawing/System.Drawing.Drawing2D/Matrix.jvm.cs b/mcs/class/System.Drawing/System.Drawing.Drawing2D/Matrix.jvm.cs
new file mode 100755
index 00000000000..5b0ef229b01
--- /dev/null
+++ b/mcs/class/System.Drawing/System.Drawing.Drawing2D/Matrix.jvm.cs
@@ -0,0 +1,295 @@
+using System;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using geom = java.awt.geom;
+using JMath = java.lang.Math;
+
+namespace System.Drawing.Drawing2D
+{
+ public sealed class Matrix : MarshalByRefObject, IDisposable
+ {
+ #region fields
+
+ static internal readonly Matrix IdentityTransform = new Matrix();
+ readonly geom.AffineTransform _nativeMatrix;
+
+ #endregion
+
+ #region ctors
+
+ internal Matrix (geom.AffineTransform ptr)
+ {
+ _nativeMatrix = ptr;
+ }
+
+ public Matrix () : this(new geom.AffineTransform())
+ {
+ }
+
+ public Matrix (Rectangle rect , Point[] plgpts)
+ {
+ double x1 = plgpts[1].X - plgpts[0].X;
+ double y1 = plgpts[1].Y - plgpts[0].Y;
+
+ double x2 = plgpts[2].X - plgpts[0].X;
+ double y2 = plgpts[2].Y - plgpts[0].Y;
+
+ _nativeMatrix = new geom.AffineTransform(x1/rect.Width, y1/rect.Width, x2/rect.Height, y2/rect.Height, plgpts[0].X, plgpts[0].Y);
+ _nativeMatrix.translate(-rect.X,-rect.Y);
+ }
+
+ public Matrix (RectangleF rect , PointF[] plgpts)
+ {
+ double x1 = plgpts[1].X - plgpts[0].X;
+ double y1 = plgpts[1].Y - plgpts[0].Y;
+
+ double x2 = plgpts[2].X - plgpts[0].X;
+ double y2 = plgpts[2].Y - plgpts[0].Y;
+
+ _nativeMatrix = new geom.AffineTransform(x1/rect.Width, y1/rect.Width, x2/rect.Height, y2/rect.Height, plgpts[0].X, plgpts[0].Y);
+ _nativeMatrix.translate(-rect.X,-rect.Y);
+ }
+
+ public Matrix (float m11, float m12, float m21, float m22, float dx, float dy)
+ : this(new geom.AffineTransform(m11,m12,m21,m22,dx,dy))
+ {
+ }
+
+ #endregion
+
+ #region properties
+
+ public float[] Elements
+ {
+ get
+ {
+ float [] elems = new float[] {
+ (float)NativeObject.getScaleX(),
+ (float)NativeObject.getShearY(),
+ (float)NativeObject.getShearX(),
+ (float)NativeObject.getScaleY(),
+ (float)NativeObject.getTranslateX(),
+ (float)NativeObject.getTranslateY()};
+ return elems;
+ }
+ }
+
+ public bool IsIdentity
+ {
+ get
+ {
+ return NativeObject.isIdentity();
+ }
+ }
+
+ public bool IsInvertible
+ {
+ get
+ {
+ try
+ {
+ return NativeObject.getDeterminant() != 0.0;
+ }
+ catch(geom.NoninvertibleTransformException)
+ {
+ return false;
+ }
+ }
+ }
+
+ public float OffsetX
+ {
+ get
+ {
+ return (float)NativeObject.getTranslateX();
+ }
+ }
+
+ public float OffsetY
+ {
+ get
+ {
+ return (float)NativeObject.getTranslateY();
+ }
+ }
+
+ #endregion
+
+ #region methods
+
+ public Matrix Clone()
+ {
+ return new Matrix ((geom.AffineTransform)NativeObject.clone());
+ }
+
+
+ public void Dispose ()
+ {
+ }
+
+ internal void CopyTo(Matrix matrix) {
+ matrix.NativeObject.setTransform(NativeObject);
+ }
+
+ public override bool Equals (object obj)
+ {
+ Matrix m = obj as Matrix;
+
+
+ if (m == null)
+ return false;
+
+ return NativeObject.equals(m.NativeObject);
+ }
+
+ public override int GetHashCode ()
+ {
+ return NativeObject.hashCode();
+ }
+
+ public void Invert ()
+ {
+ try {
+ _nativeMatrix.setTransform( _nativeMatrix.createInverse() );
+ }
+ catch(geom.NoninvertibleTransformException e) {
+ throw new ArgumentException(e.Message, e);
+ }
+ }
+
+ public void Multiply (Matrix matrix)
+ {
+ Multiply (matrix, MatrixOrder.Prepend);
+ }
+
+ public void Multiply (Matrix matrix, MatrixOrder order)
+ {
+ Multiply(matrix.NativeObject, order);
+ }
+
+ public void Reset()
+ {
+ NativeObject.setToIdentity();
+ }
+
+ public void Rotate (float angle)
+ {
+ NativeObject.rotate (JMath.toRadians(angle));
+ }
+
+ public void Rotate (float angle, MatrixOrder order)
+ {
+ Multiply(geom.AffineTransform.getRotateInstance(JMath.toRadians(angle)), order);
+ }
+
+ public void RotateAt (float angle, PointF point)
+ {
+ NativeObject.rotate (JMath.toRadians(angle), point.X, point.Y);
+ }
+
+ public void RotateAt (float angle, PointF point, MatrixOrder order)
+ {
+ Multiply(geom.AffineTransform.getRotateInstance(JMath.toRadians(angle),point.X, point.Y), order);
+ }
+
+ public void Scale (float scaleX, float scaleY)
+ {
+ NativeObject.scale (scaleX, scaleY);
+ }
+
+ public void Scale (float scaleX, float scaleY, MatrixOrder order)
+ {
+ Multiply(geom.AffineTransform.getScaleInstance(scaleX, scaleY), order);
+ }
+
+ public void Shear (float shearX, float shearY)
+ {
+ NativeObject.shear(shearX, shearY);
+ }
+
+ public void Shear (float shearX, float shearY, MatrixOrder order)
+ {
+ Multiply(geom.AffineTransform.getShearInstance (shearX, shearY), order);
+ }
+
+ public void TransformPoints (Point[] pts)
+ {
+ geom.Point2D.Float pt = new geom.Point2D.Float();
+ for(int i =0;i < pts.Length;i++) {
+ pt.setLocation(pts[i].X,pts[i].Y);
+ NativeObject.transform(pt,pt);
+ pts[i].X=(int)pt.getX();
+ pts[i].Y=(int)pt.getY();
+ }
+ }
+
+ public void TransformPoints (PointF[] pts)
+ {
+ geom.Point2D.Float pt = new geom.Point2D.Float();
+ for(int i =0;i < pts.Length;i++) {
+ pt.setLocation(pts[i].X,pts[i].Y);
+ NativeObject.transform(pt,pt);
+ pts[i].X=(float)pt.getX();
+ pts[i].Y=(float)pt.getY();
+ }
+ }
+
+ public void TransformVectors (Point[] pts)
+ {
+ geom.Point2D.Float pt = new geom.Point2D.Float();
+ for(int i =0;i < pts.Length;i++) {
+ pt.setLocation(pts[i].X,pts[i].Y);
+ NativeObject.deltaTransform(pt,pt);
+ pts[i].X=(int)pt.getX();
+ pts[i].Y=(int)pt.getY();
+ }
+ }
+
+ public void TransformVectors (PointF[] pts)
+ {
+ geom.Point2D.Float pt = new geom.Point2D.Float();
+ for(int i =0;i < pts.Length;i++) {
+ pt.setLocation(pts[i].X,pts[i].Y);
+ NativeObject.deltaTransform(pt,pt);
+ pts[i].X=(float)pt.getX();
+ pts[i].Y=(float)pt.getY();
+ }
+ }
+
+ public void Translate (float offsetX, float offsetY)
+ {
+ NativeObject.translate (offsetX, offsetY);
+ }
+
+ public void Translate (float offsetX, float offsetY, MatrixOrder order)
+ {
+ Multiply(geom.AffineTransform.getTranslateInstance(offsetX, offsetY), order);
+ }
+
+ public void VectorTransformPoints (Point[] pts)
+ {
+ TransformVectors (pts);
+ }
+
+ internal geom.AffineTransform NativeObject
+ {
+ get
+ {
+ return _nativeMatrix;
+ }
+ }
+
+ void Multiply(geom.AffineTransform at, MatrixOrder order) {
+ Multiply(NativeObject, at, order);
+ }
+
+ internal static void Multiply(geom.AffineTransform to, geom.AffineTransform add, MatrixOrder order) {
+ if(order == MatrixOrder.Prepend)
+ to.concatenate(add);
+ else
+ to.preConcatenate(add);
+ }
+
+ #endregion
+ }
+}