removed exec attribute
[mono.git] / mcs / class / System.Drawing / System.Drawing / Pen.jvm.cs
old mode 100755 (executable)
new mode 100644 (file)
index 15a2ac5..0536b9c
@@ -16,6 +16,7 @@ using System.Drawing.Drawing2D;
 using System.Runtime.InteropServices;
 
 using awt = java.awt;
+using geom = java.awt.geom;
 
 namespace System.Drawing \r
 {
@@ -72,6 +73,7 @@ namespace System.Drawing
                        _alignment = PenAlignment.Center;
                        _lineJoin = LineJoin.Miter;
                        _miterLimit = 10f;
+                       _transform = new Matrix();
                }
                #endregion
                //
@@ -133,6 +135,7 @@ namespace System.Drawing
                #endregion 
 
                #region CompoundArray [TODO]
+               [MonoTODO]
                public float[] CompoundArray {
                        get {
                                throw new NotImplementedException ();
@@ -144,6 +147,7 @@ namespace System.Drawing
                #endregion
             
                #region CustomEndCap [TODO]
+               [MonoTODO]
                public CustomLineCap CustomEndCap \r
                {
                        get \r
@@ -159,9 +163,9 @@ namespace System.Drawing
                #endregion 
 
                #region CustomStartCap [TODO]
+               [MonoTODO]
                public CustomLineCap CustomStartCap \r
                {
-
                        get \r
                        {
                                throw new NotImplementedException ();                                
@@ -176,6 +180,7 @@ namespace System.Drawing
                #endregion
 
                #region DashCap
+               [MonoTODO]
                public DashCap DashCap {
                        get {
                                return _dashCap;
@@ -211,7 +216,7 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return _dashPattern;
+                               return (float [])_dashPattern.Clone();
                        }
 
                        set \r
@@ -241,7 +246,7 @@ namespace System.Drawing
                #endregion 
 
                #region StartCap [TODO - now allways endcap]
-
+               [MonoTODO]
                public LineCap StartCap {
                        get { 
                                return _startCap;
@@ -255,6 +260,7 @@ namespace System.Drawing
                #endregion
 
                #region EndCap 
+               [MonoTODO]
                public LineCap EndCap \r
                {
                        get \r
@@ -272,6 +278,7 @@ namespace System.Drawing
                #endregion
  
                #region LineJoin [partial TODO - missed styles]
+               [MonoTODO]
                public LineJoin LineJoin {
                        get {
                                return _lineJoin;
@@ -328,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
@@ -386,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
 
@@ -440,35 +445,66 @@ namespace System.Drawing
                                throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
                }
 
-               #region Stroke Members\r
-\r
-               awt.Shape awt.Stroke.createStrokedShape(awt.Shape arg_0) {\r
+               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 penTransform, geom.AffineTransform outputTransform, PenFit penFit) {
                        float[] dashPattern = null;\r
-                       //spivak.BUGBUG
-                       //You will see many magic numbers above this place
-                       //behaviours of dash patterns in .NET and JAVA are not similar
-                       //also it looks like JAVA have some design flaw there.
-                       //The issue is that in java only switched on (ODD) entries are
-                       //looks to be dependent on current line with. Switched off (EVEN)
-                       //entries allways remains exact width as you specify. So we should 
-                       //do some calculations to determine actual java pattern 
-                       //Also note that ODD entries does not grow proportionally with line width
-                       //so they should be sligntly ajusted also.
-                       //Well, i know that potential perfomance of this staf could be bad, but
-                       //that is solution for now. Note, that .NET have also numerous bugs in this
-                       //region, for example they mandatory could not tolerate patternalising
-                       //lines of 1 pixel width - look will be BAD.\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((i & 1) == 0) {
-                                                               if (DashPattern[i] > 1.0f)
-                                                                       dashPattern[i] = DashPattern[i] + (DashPattern[i]-1.0f) * Width / 2f;
+                                       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;
+                                                       else {
+                                                               if ((i & 1) == 0) {
+                                                                       // remove the size of caps from the opaque parts
+                                                                       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;
                                                        }
-                                                       else
-                                                               dashPattern[i] = DashPattern[i] * Width * 2f;\r
                                                }\r
                                        }\r
                                        break;\r
@@ -482,9 +518,9 @@ namespace System.Drawing
                                        dashPattern = DASHDOTDOT_ARRAY;\r
                                        break;\r
                                \r
-//                             default:\r
-//                             case DashStyle.Solid:\r
-//                                     break;\r
+                                       //                              default:\r
+                                       //                              case DashStyle.Solid:\r
+                                       //                                      break;\r
                        }\r
 \r
                        int join;
@@ -519,11 +555,21 @@ namespace System.Drawing
                                        break;\r
                        }\r
 \r
-                       awt.Stroke stroke = StrokeFactory.CreateStroke(Width, cap, \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);\r
-                       \r
-                       return stroke.createStrokedShape(arg_0);\r
+                               penT, outputTransform, penFit);
+               }
+
+               #region Stroke Members\r
+\r
+               awt.Shape awt.Stroke.createStrokedShape(awt.Shape arg_0) {\r
+                       return GetNativeObject(null, PenFit.NotThin).createStrokedShape(arg_0);\r
                }\r
 \r
                #endregion