+
+ void EnsureModifiable() {
+ if (!isModifiable)
+ 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
+ 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
+ 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;
+ }
+ else
+ dashPattern[i] = DashPattern[i] * Width * 2f;\r
+ }\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
+ awt.Stroke stroke = StrokeFactory.CreateStroke(Width, cap, \r
+ join, MiterLimit, dashPattern, DashOffset,\r
+ _transform != null ? _transform.NativeObject : null);\r
+ \r
+ return stroke.createStrokedShape(arg_0);\r
+ }\r
+\r
+ #endregion