TARGET_JVM icon support
[mono.git] / mcs / class / System.Drawing / System.Drawing / Pen.jvm.cs
index 5a862ba6d9f4df66eafcbbedb01bc85822b026f9..9badbe317ca019f12ed132eede47e59c95c64fb4 100755 (executable)
 using System;
 using System.Drawing.Drawing2D;
 using System.Runtime.InteropServices;
-using java.awt;
+
+using awt = java.awt;
+using geom = java.awt.geom;
 
 namespace System.Drawing \r
 {
 
-       public sealed class Pen : MarshalByRefObject, ICloneable, IDisposable \r
+       public sealed class Pen : MarshalByRefObject, ICloneable, IDisposable, awt.Stroke\r
        {
                #region Member Vars
-               java.awt.BasicStroke nativeObject;
+
+               static readonly float [] DASH_ARRAY = {4.0f,1.0f};
+               static readonly float [] DASHDOT_ARRAY = {4.0f,1.0f,1.0f,1.0f};
+               static readonly float [] DASHDOTDOT_ARRAY = {4.0f,1.0f,1.0f,1.0f,1.0f,1.0f};
+               static readonly float [] DOT_ARRAY = {1.0f,1.0f};
+
                internal bool isModifiable = true;
-               Brush brush;
-               DashStyle _ds = DashStyle.Solid; 
+
+               Brush _brush;
+               DashStyle _dashStyle;
+               DashCap _dashCap;
+               LineCap _startCap;
+               LineCap _endCap;
+
+               LineJoin _lineJoin;
+
                PenAlignment _alignment;
                Matrix _transform;
-               #endregion
+               float _width;
+               float _dashOffset;
+               float[] _dashPattern;
+               //float[] _compoundArray;
 
-               #region Internals
-               internal Pen (java.awt.BasicStroke p)
-               {
-                       nativeObject = p;
-               }
+               float _miterLimit;
 
-               internal java.awt.BasicStroke NativeObject
-               {
-                       get\r
-                       {
-                               return nativeObject;
-                       }
-                       set
-                       {
-                               nativeObject=value;
-                       }
-               }
                #endregion
 
                #region Ctors. and Dtor
-//             ~Pen ()
-//             {
-//                     Dispose (false);
-//             }
 
                public Pen (Brush brush) : this (brush, 1.0F)
-               {
-               }
+               {}
 
                public Pen (Color color) : this (color, 1.0F)
-               {
-               }
+               {}
 
-               public Pen (Color color, float width)                   
-               {
-                       brush = new SolidBrush(color);
-                       nativeObject = new java.awt.BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
-               }
+               public Pen (Color color, float width) : this(new SolidBrush(color), width)
+               {}
 
                public Pen (Brush brush, float width)
                {
-                       brush = (Brush)brush.Clone();
-                       nativeObject = new java.awt.BasicStroke(width);
+                       _brush = (Brush)brush.Clone();;
+                       _width = width;
+                       _dashStyle = DashStyle.Solid;
+                       _startCap = LineCap.Flat;
+                       _dashCap = DashCap.Flat;
+                       _endCap = LineCap.Flat;
+                       _alignment = PenAlignment.Center;
+                       _lineJoin = LineJoin.Miter;
+                       _miterLimit = 10f;
+                       _transform = new Matrix();
                }
                #endregion
                //
@@ -88,8 +89,7 @@ namespace System.Drawing
 
                        set \r
                        {
-                               if (!isModifiable)
-                                       throw new ArgumentException ("Pen is not modifiable");
+                               EnsureModifiable();
                                _alignment = value;
                        }
                }
@@ -100,17 +100,15 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return brush;
+                               return _brush;
                        }
 
                        set \r
                        {
-                               if (isModifiable) \r
-                               {
-                                       brush = value;
-                               }
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+                               if (value == null)
+                                       throw new ArgumentNullException("brush");
+                               _brush = value;
                        }
                }
                #endregion
@@ -120,25 +118,32 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               if(brush is SolidBrush)
-                                       return ((SolidBrush)brush).Color;
-                               else if(brush is HatchBrush)
-                                       return ((HatchBrush)brush).ForegroundColor;
+                               if(Brush is SolidBrush)
+                                       return ((SolidBrush)Brush).Color;
+                               else if(Brush is HatchBrush)
+                                       return ((HatchBrush)Brush).ForegroundColor;
                                else
                                        return Color.Empty;
                        }
 
                        set \r
                        {
-                               if (isModifiable) \r
-                               {
-                                       brush = new SolidBrush (value);
-                               }
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+                               _brush = new SolidBrush (value);
                        }
                }
                #endregion 
+
+               #region CompoundArray [TODO]
+               public float[] CompoundArray {
+                       get {
+                               throw new NotImplementedException ();
+                       }
+                       set {
+                               throw new NotImplementedException ();
+                       }
+               }
+               #endregion
             
                #region CustomEndCap [TODO]
                public CustomLineCap CustomEndCap \r
@@ -155,7 +160,7 @@ namespace System.Drawing
                }
                #endregion 
 
-               #region CustoStartCap [TODO]
+               #region CustomStartCap [TODO]
                public CustomLineCap CustomStartCap \r
                {
 
@@ -172,18 +177,15 @@ namespace System.Drawing
                }
                #endregion
 
-               #region DashCap [TODO, now - allways flat]
-               public DashCap DashCap \r
-               {
-                       get \r
-                       {
-                               //TODO
-                               return DashCap.Flat;
+               #region DashCap
+               public DashCap DashCap {
+                       get {
+                               return _dashCap;
                        }
 
-                       set \r
-                       {
-                               
+                       set {
+                               EnsureModifiable();
+                               _dashCap = value;
                        }
                }
                #endregion
@@ -194,103 +196,32 @@ namespace System.Drawing
 
                        get \r
                        {
-                               return nativeObject.getDashPhase();
+                               return _dashOffset;
                        }
 
                        set \r
                        {
-                               if (isModifiable)
-                                       nativeObject = new java.awt.BasicStroke(
-                                               nativeObject.getLineWidth(),
-                                               nativeObject.getEndCap(),
-                                               nativeObject.getLineJoin(),
-                                               nativeObject.getMiterLimit(),
-                                               nativeObject.getDashArray(),
-                                               value);
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+                               _dashOffset = value;
                        }
                }
                #endregion
 
                #region DashPattern
 
-               //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.
-
-               internal void SetDashPattern(float [] patt,DashStyle s)
-               {
-                       if(patt == null)
-                       {
-                               nativeObject = new java.awt.BasicStroke(
-                                       nativeObject.getLineWidth(),
-                                       nativeObject.getEndCap(),
-                                       nativeObject.getLineJoin(),
-                                       nativeObject.getMiterLimit(),
-                                       null,
-                                       nativeObject.getDashPhase());
-                                       _ds = DashStyle.Solid;
-                       }
-                       else
-                       {
-                               float [] temp = new float[patt.Length];
-                               patt.CopyTo(temp,0);
-                               float w = nativeObject.getLineWidth();
-                               int i;
-                               for(i = 0;i<temp.Length;i+=2)
-                                       if(temp[i] > 1.0f)
-                                               temp[i] = temp[i] + (temp[i]-1.0f) * w / (float)2;
-
-                               for(i = 1;i<temp.Length;i+=2)
-                                       temp[i] *= nativeObject.getLineWidth() * (float)2;
-
-                               nativeObject = new java.awt.BasicStroke(
-                                       nativeObject.getLineWidth(),
-                                       nativeObject.getEndCap(),
-                                       nativeObject.getLineJoin(),
-                                       nativeObject.getMiterLimit(),
-                                       temp,
-                                       nativeObject.getDashPhase());
-                               _ds = DashStyle.Custom;
-                       }
-
-               }
-
                public float [] DashPattern \r
                {
                        get \r
                        {
-                               float w = nativeObject.getLineWidth();
-                               float [] temp = nativeObject.getDashArray();
-                               for(int i = 0;i<temp.Length;i+=2)
-                                       if(temp[i] > 1.0f)
-                                               temp[i] -= (temp[i] - 1.0f) / w * (float)2;
-
-                               for(int i = 1;i<temp.Length;i+=2)
-                                       temp[i] /= w * 2;
-
-                               return temp; 
+                               return (float [])_dashPattern.Clone();
                        }
 
                        set \r
                        {
-                               
-                               if (isModifiable) 
-                                       SetDashPattern(value,DashStyle.Custom);
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+
+                               _dashPattern = value;
+                               DashStyle = (_dashPattern == null) ? DashStyle.Solid : DashStyle.Custom;
                        }
                }
                #endregion
@@ -300,45 +231,27 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return _ds;
+                               return _dashStyle;
                        }
 
                        set \r
                        {
-                               if (isModifiable)
-                               {
-                                       if (value == DashStyle.Solid)
-                                               SetDashPattern(null,value);
-                                       else if (value == DashStyle.Dash)
-                                               SetDashPattern(System.Drawing.Drawing2D.DashAttribs.DASH_ARRAY,value);
-                                       else if (value == DashStyle.DashDot)
-                                               SetDashPattern(System.Drawing.Drawing2D.DashAttribs.DASHDOT_ARRAY,value);
-                                       else if (value == DashStyle.DashDotDot)
-                                               SetDashPattern(System.Drawing.Drawing2D.DashAttribs.DASHDOTDOT_ARRAY,value);
-                                       else if (value == DashStyle.Dot)
-                                               SetDashPattern(System.Drawing.Drawing2D.DashAttribs.DOT_ARRAY,value);
-                                       else
-                                               throw new ArgumentOutOfRangeException();
-                               }
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+                               _dashStyle = value;
                        }
                }
                #endregion 
 
                #region StartCap [TODO - now allways endcap]
 
-               public LineCap StartCap \r
-               {
-                       get \r
-                       {
-                               //FALLBACK: StartCap, EndCap and DashCap are the same
-                return EndCap;           
+               public LineCap StartCap {
+                       get { 
+                               return _startCap;
                        }
 
-                       set \r
-                       {
-                               EndCap = value;
+                       set {
+                               EnsureModifiable();
+                               _startCap = value;
                        }
                }
                #endregion
@@ -348,91 +261,30 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               int cup = nativeObject.getEndCap();
-                               if(cup == BasicStroke.CAP_ROUND)
-                                       return LineCap.Round;
-                               else if(cup == BasicStroke.CAP_BUTT)
-                                       return LineCap.Flat;
-                               else if(cup == BasicStroke.CAP_SQUARE)
-                                       return LineCap.Square;
-                               else 
-                                       return LineCap.Custom;
+                               return _endCap;
                        }
 
                        set \r
                        {
-                               if (isModifiable)
-                               {
-                                       int cap;
-                                       if((value == LineCap.Square) ||
-                                               (value == LineCap.SquareAnchor))
-                                               cap = BasicStroke.CAP_SQUARE;
-                                       else if ((value == LineCap.Round) || 
-                                               (value == LineCap.RoundAnchor))
-                                               cap = BasicStroke.CAP_ROUND;
-                                       else if ((value == LineCap.Flat))
-                                               cap = BasicStroke.CAP_BUTT;
-                                       else
-                                               //TODO:default
-                                               cap = BasicStroke.CAP_SQUARE;
-
-                                       nativeObject = new java.awt.BasicStroke(
-                                               nativeObject.getLineWidth(),
-                                               cap,
-                                               nativeObject.getLineJoin(),
-                                               nativeObject.getMiterLimit(),
-                                               nativeObject.getDashArray(),
-                                               nativeObject.getDashPhase());
-                               }
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+
+                               _endCap = value;
                        }
                }
                #endregion
  
                #region LineJoin [partial TODO - missed styles]
-               public LineJoin LineJoin \r
-               {
-                       //TODO:missed styles
-
-                       get \r
-                       {
-
-                               int join = nativeObject.getLineJoin();
-                               if(join == java.awt.BasicStroke.JOIN_BEVEL)
-                                       return LineJoin.Bevel;
-                               else if(join == java.awt.BasicStroke.JOIN_MITER)
-                                       return LineJoin.Miter;
-                               else if(join == java.awt.BasicStroke.JOIN_ROUND)
-                                       return LineJoin.Round;
-                               else
-                                       throw new ArgumentOutOfRangeException();
+               public LineJoin LineJoin {
+                       get {
+                               return _lineJoin;
                        }
 
-                       set \r
-                       {
-                               if (isModifiable)
-                               {
-                                       int join = 0;
-                                       if (value ==  LineJoin.Bevel)
-                                               join = java.awt.BasicStroke.JOIN_BEVEL;
-                                       if ((value ==  LineJoin.Miter) || (value==LineJoin.MiterClipped))
-                                               join = java.awt.BasicStroke.JOIN_MITER;
-                                       if (value ==  LineJoin.Round)
-                                               join = java.awt.BasicStroke.JOIN_ROUND;
-
-                                       nativeObject = new java.awt.BasicStroke(
-                                               nativeObject.getLineWidth(),
-                                               nativeObject.getEndCap(),
-                                               join,
-                                               nativeObject.getMiterLimit(),
-                                               nativeObject.getDashArray(),
-                                               nativeObject.getDashPhase());
-                               }
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                       set {
+                               EnsureModifiable();
+                               _lineJoin = value;
                        }
                }
+
                #endregion
 
                #region MiterLimit 
@@ -441,21 +293,14 @@ namespace System.Drawing
 
                        get \r
                        {
-                               return nativeObject.getMiterLimit();
+                               return _miterLimit;
                        }
 
                        set \r
                        {
-                               if (isModifiable)
-                                       nativeObject = new java.awt.BasicStroke(
-                                               nativeObject.getLineWidth(),
-                                               nativeObject.getEndCap(),
-                                               nativeObject.getLineJoin(),
-                                               value,
-                                               nativeObject.getDashArray(),
-                                               nativeObject.getDashPhase());                                                                   
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+
+                               _miterLimit = value;                    
                        }
                            
                }
@@ -464,16 +309,15 @@ namespace System.Drawing
                #region PenType
                public PenType PenType \r
                {
-
                        get \r
                        {
-                               if (brush is TextureBrush)
+                               if (Brush is TextureBrush)
                                        return PenType.TextureFill;
-                               else if (brush is HatchBrush)
+                               else if (Brush is HatchBrush)
                                        return PenType.HatchFill;
-                               else if (brush is LinearGradientBrush)
+                               else if (Brush is LinearGradientBrush)
                                        return PenType.LinearGradient;
-                               else if (brush is PathGradientBrush)
+                               else if (Brush is PathGradientBrush)
                                        return PenType.PathGradient;
                                else
                                        return PenType.SolidColor;
@@ -481,21 +325,19 @@ namespace System.Drawing
                }
                #endregion
 
-               #region Transform [TODO]
+               #region Transform
                public Matrix Transform \r
                {
                        get \r
                        {
-                               if (_transform == null)
-                                       _transform = new Matrix ();
-                               return _transform;
+                               return _transform.Clone();
                        }
                                        
                        set \r
                        {
-                               if (!isModifiable)
-                    throw new ArgumentException ("Pen is not modifiable");
-                               _transform = value;
+                               EnsureModifiable();
+
+                               value.CopyTo(_transform);
                        }
                }
                #endregion
@@ -505,20 +347,13 @@ namespace System.Drawing
                {
                        get \r
                        {
-                               return nativeObject.getLineWidth();
+                               return _width;
                        }
                        set \r
                        {
-                               if (isModifiable)
-                                       nativeObject = new java.awt.BasicStroke(
-                                               value,
-                                               nativeObject.getEndCap(),
-                                               nativeObject.getLineJoin(),
-                                               nativeObject.getMiterLimit(),
-                                               nativeObject.getDashArray(),
-                                               nativeObject.getDashPhase());                                                                                                           
-                               else
-                                       throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
+                               EnsureModifiable();
+                                                                                               
+                               _width = value;
                        }
                }
                #endregion
@@ -526,13 +361,12 @@ namespace System.Drawing
                #region Clone
                public object Clone ()
                {
-                       Pen p = new Pen (nativeObject);
-                       p.isModifiable = isModifiable;
-                       p.brush = brush;
-                       p._ds = _ds;
-                       p._alignment = _alignment;
-                       p._transform = _transform;
-                       return p;
+                       Pen clone = (Pen)MemberwiseClone();
+                       if (clone._transform != null)
+                               clone._transform = clone._transform.Clone();
+                       if (clone._dashPattern != null)
+                               clone._dashPattern = (float[])clone._dashPattern.Clone();
+                       return clone;
                }
                #endregion
 
@@ -549,54 +383,190 @@ namespace System.Drawing
                }
                #endregion
 
-               #region Transform Funcs [TODO]
+               #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
+
                public void SetLineCap (LineCap startCap, LineCap endCap, DashCap dashCap)
                {
-                       //FALLBACK: StartCap, EndCap and DashCap are the same
+                       StartCap = startCap;
+                       DashCap = dashCap;
                        EndCap = endCap;
                }
+
+               void EnsureModifiable() {
+                       if (!isModifiable)
+                               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 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 (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;
+                                                       }
+                                               }\r
+                                       }\r
+                                       break;\r
+                               case DashStyle.Dash:\r
+                                       dashPattern = DASH_ARRAY;\r
+                                       break;\r
+                               case DashStyle.DashDot:\r
+                                       dashPattern = DASHDOT_ARRAY;\r
+                                       break;\r
+                               case DashStyle.DashDotDot:\r
+                                       dashPattern = DASHDOTDOT_ARRAY;\r
+                                       break;\r
+                               \r
+                                       //                              default:\r
+                                       //                              case DashStyle.Solid:\r
+                                       //                                      break;\r
+                       }\r
+\r
+                       int join;
+                       switch (LineJoin) {
+                               case LineJoin.Bevel:
+                                       join = java.awt.BasicStroke.JOIN_BEVEL;
+                                       break;
+                               default:
+                               case LineJoin.Miter:
+                               case LineJoin.MiterClipped:
+                                       join = java.awt.BasicStroke.JOIN_MITER;
+                                       break;
+                               case LineJoin.Round:
+                                       join = java.awt.BasicStroke.JOIN_ROUND;\r
+                                       break;\r
+                       }\r
+\r
+                       // We go by End cap for now.\r
+                       int cap;\r
+                       switch (EndCap) {\r
+                               default:\r
+                               case LineCap.Square:
+                               case LineCap.SquareAnchor:
+                                       cap = awt.BasicStroke.CAP_SQUARE;
+                                       break;
+                               case LineCap.Round: 
+                               case LineCap.RoundAnchor:
+                                       cap = awt.BasicStroke.CAP_ROUND;
+                                       break;
+                               case LineCap.Flat:
+                                       cap = awt.BasicStroke.CAP_BUTT;
+                                       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
+                               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
        }
 }