TARGET_JVM icon support
[mono.git] / mcs / class / System.Drawing / System.Drawing / Pen.jvm.cs
index d7b0fe712b52eeeb5b79f8f6a2ea98e6390af5c8..9badbe317ca019f12ed132eede47e59c95c64fb4 100755 (executable)
@@ -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
                //
@@ -211,7 +213,7 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return _dashPattern;
+                               return (float [])_dashPattern.Clone();
                        }
 
                        set \r
@@ -328,16 +330,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 +386,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,27 +440,65 @@ 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
 \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;
-                                                       else
-                                                       {
-                                                               if ((i & 1) == 0)
+                                                               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;
+                                                                       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
@@ -475,9 +513,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;
@@ -512,11 +550,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