removed exec attribute
[mono.git] / mcs / class / System.Drawing / System.Drawing / Pen.jvm.cs
old mode 100755 (executable)
new mode 100644 (file)
index 13f6c63..0536b9c
@@ -73,6 +73,7 @@ namespace System.Drawing
                        _alignment = PenAlignment.Center;
                        _lineJoin = LineJoin.Miter;
                        _miterLimit = 10f;
+                       _transform = new Matrix();
                }
                #endregion
                //
@@ -134,6 +135,7 @@ namespace System.Drawing
                #endregion 
 
                #region CompoundArray [TODO]
+               [MonoTODO]
                public float[] CompoundArray {
                        get {
                                throw new NotImplementedException ();
@@ -145,6 +147,7 @@ namespace System.Drawing
                #endregion
             
                #region CustomEndCap [TODO]
+               [MonoTODO]
                public CustomLineCap CustomEndCap \r
                {
                        get \r
@@ -160,9 +163,9 @@ namespace System.Drawing
                #endregion 
 
                #region CustomStartCap [TODO]
+               [MonoTODO]
                public CustomLineCap CustomStartCap \r
                {
-
                        get \r
                        {
                                throw new NotImplementedException ();                                
@@ -177,6 +180,7 @@ namespace System.Drawing
                #endregion
 
                #region DashCap
+               [MonoTODO]
                public DashCap DashCap {
                        get {
                                return _dashCap;
@@ -212,7 +216,7 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return _dashPattern;
+                               return (float [])_dashPattern.Clone();
                        }
 
                        set \r
@@ -242,7 +246,7 @@ namespace System.Drawing
                #endregion 
 
                #region StartCap [TODO - now allways endcap]
-
+               [MonoTODO]
                public LineCap StartCap {
                        get { 
                                return _startCap;
@@ -256,6 +260,7 @@ namespace System.Drawing
                #endregion
 
                #region EndCap 
+               [MonoTODO]
                public LineCap EndCap \r
                {
                        get \r
@@ -273,6 +278,7 @@ namespace System.Drawing
                #endregion
  
                #region LineJoin [partial TODO - missed styles]
+               [MonoTODO]
                public LineJoin LineJoin {
                        get {
                                return _lineJoin;
@@ -329,16 +335,14 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               if (_transform == null)
-                                       _transform = new Matrix ();
-                               return _transform;
+                               return _transform.Clone();
                        }
                                        
                        set \r
                        {
                                EnsureModifiable();
 
-                               _transform = value;
+                               value.CopyTo(_transform);
                        }
                }
                #endregion
@@ -387,45 +391,45 @@ namespace System.Drawing
                #region Transform Funcs
                public void MultiplyTransform (Matrix matrix)
                {
-                       Transform.Multiply (matrix);
+                       _transform.Multiply (matrix);
                }
 
                public void MultiplyTransform (Matrix matrix, MatrixOrder order)
                {
-                       Transform.Multiply (matrix, order);
+                       _transform.Multiply (matrix, order);
                }
 
                public void ResetTransform ()
                {
-                       Transform.Reset ();
+                       _transform.Reset ();
                }
 
                public void RotateTransform (float angle)
                {
-                       Transform.Rotate (angle);
+                       _transform.Rotate (angle);
                }
 
                public void RotateTransform (float angle, MatrixOrder order)
                {
-                       Transform.Rotate (angle, order);
+                       _transform.Rotate (angle, order);
                }
 
                public void ScaleTransform (float sx, float sy)
                {
-                       Transform.Scale (sx, sy);
+                       _transform.Scale (sx, sy);
                }
 
                public void ScaleTransform (float sx, float sy, MatrixOrder order)
                {
-                       Transform.Scale (sx, sy, order);
+                       _transform.Scale (sx, sy, order);
                }
 
                public void TranslateTransform (float dx, float dy) {
-                       Transform.Translate (dx, dy);
+                       _transform.Translate (dx, dy);
                }
 
                public void TranslateTransform (float dx, float dy, MatrixOrder order) {
-                       Transform.Translate (dx, dy, order);
+                       _transform.Translate (dx, dy, order);
                }
                #endregion
 
@@ -441,30 +445,65 @@ namespace System.Drawing
                                throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
                }
 
+               internal double GetSquaredTransformedWidth(geom.AffineTransform coordsTransform) {
+                       geom.AffineTransform transform = _transform.NativeObject;
+                       double A = transform.getScaleX();       // m00
+                       double B = transform.getShearY();       // m10
+                       double C = transform.getShearX();       // m01
+                       double D = transform.getScaleY();       // m11
+
+                       double K = coordsTransform.getScaleX(); // m00
+                       double L = coordsTransform.getShearY(); // m10
+                       double M = coordsTransform.getShearX(); // m01
+                       double N = coordsTransform.getScaleY(); // m11
+
+                       double AD = A*D, BC = B*C, KN = K*N, LM = L*M;
+                       double KN_LM = KN-LM;
+                       return Math.Abs(Width*Width * (AD*KN_LM - BC*KN_LM));
+               }
+
+               
+               internal bool CanCreateBasicStroke {
+                       get {
+                               if (!_transform.IsIdentity)
+                                       return false;
+
+                               //FIXME: add more logic when more features will
+                               // be implemented.
+                               return true;
+                       }
+               }
+
+               internal awt.Stroke GetNativeObject(geom.AffineTransform outputTransform, PenFit penFit) {
+                       return GetNativeObject(null, outputTransform, penFit);
+               }
                /// <summary>\r
                /// \r
                /// </summary>\r
                /// <param name="outputTransform">transform which will be applied on the final shape</param>\r
                /// <param name="fitPen">ensure the shape will wide enough to be visible</param>\r
                /// <returns></returns>
-               internal awt.Stroke GetNativeObject(geom.AffineTransform outputTransform, bool fitPen) {
+               internal awt.Stroke GetNativeObject(geom.AffineTransform penTransform, geom.AffineTransform outputTransform, PenFit penFit) {
                        float[] dashPattern = null;\r
 \r
                        switch (DashStyle) {\r
                                case DashStyle.Custom:\r
-                                       if (DashPattern != null) {\r
-                                               dashPattern = new float[DashPattern.Length];\r
-                                               for(int i = 0; i < DashPattern.Length; i++) {
+                                       if (_dashPattern != null) {\r
+                                               dashPattern = new float[_dashPattern.Length];\r
+                                               for(int i = 0; i < _dashPattern.Length; i++) {
 
                                                        if (EndCap == LineCap.Flat)
-                                                               dashPattern[i] = DashPattern[i] * Width;
+                                                               dashPattern[i] = _dashPattern[i] * Width;
                                                        else {
-                                                               if ((i & 1) == 0)
+                                                               if ((i & 1) == 0) {
                                                                        // remove the size of caps from the opaque parts
-                                                                       dashPattern[i] = (DashPattern[i] * Width) - Width;
+                                                                       dashPattern[i] = (_dashPattern[i] * Width) - Width;
+                                                                       if (_dashPattern[i] < 0)
+                                                                               dashPattern[i] = 0;
+                                                               }
                                                                else
                                                                        // add the size of caps to the transparent parts
-                                                                       dashPattern[i] = (DashPattern[i] * Width) + Width;
+                                                                       dashPattern[i] = (_dashPattern[i] * Width) + Width;
                                                        }
                                                }\r
                                        }\r
@@ -516,16 +555,21 @@ namespace System.Drawing
                                        break;\r
                        }\r
 \r
+                       geom.AffineTransform penT = _transform.NativeObject;\r
+                       if (penTransform != null && !penTransform.isIdentity()) {\r
+                               penT = (geom.AffineTransform)penT.clone();\r
+                               penT.concatenate(penTransform);\r
+                       }\r
+\r
                        return StrokeFactory.CreateStroke(Width, cap, \r
                                join, MiterLimit, dashPattern, DashOffset,\r
-                               _transform != null ? _transform.NativeObject : null,
-                               outputTransform, fitPen);
+                               penT, outputTransform, penFit);
                }
 
                #region Stroke Members\r
 \r
                awt.Shape awt.Stroke.createStrokedShape(awt.Shape arg_0) {\r
-                       return GetNativeObject(null, false).createStrokedShape(arg_0);\r
+                       return GetNativeObject(null, PenFit.NotThin).createStrokedShape(arg_0);\r
                }\r
 \r
                #endregion