2005-10-24 Peter Dennis Bartok <pbartok@novell.com>
[mono.git] / mcs / class / System.Drawing / System.Drawing / Pen.jvm.cs
index 13f6c63c017449a9a89ff152534463a9c26fea08..54c61ffcdd9411cb0d4acbfc7f2b8ce1e6cbfc16 100755 (executable)
@@ -73,6 +73,7 @@ namespace System.Drawing
                        _alignment = PenAlignment.Center;
                        _lineJoin = LineJoin.Miter;
                        _miterLimit = 10f;
+                       _transform = new Matrix();
                }
                #endregion
                //
@@ -212,7 +213,7 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return _dashPattern;
+                               return (float [])_dashPattern.Clone();
                        }
 
                        set \r
@@ -329,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
@@ -387,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
 
@@ -441,30 +440,53 @@ 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 awt.Stroke GetNativeObject(geom.AffineTransform outputTransform, bool fitPen) {
+                       return GetNativeObject(null, outputTransform, fitPen);
+               }
                /// <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, bool fitPen) {
                        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,10 +538,15 @@ 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, fitPen);
                }
 
                #region Stroke Members\r