using System.Runtime.InteropServices;
using awt = java.awt;
+using geom = java.awt.geom;
namespace System.Drawing \r
{
_alignment = PenAlignment.Center;
_lineJoin = LineJoin.Miter;
_miterLimit = 10f;
+ _transform = new Matrix();
}
#endregion
//
{
get \r
{
- return _dashPattern;
+ return (float [])_dashPattern.Clone();
}
set \r
{
get \r
{
- if (_transform == null)
- _transform = new Matrix ();
- return _transform;
+ return _transform.Clone();
}
set \r
{
EnsureModifiable();
- _transform = value;
- }
- }
-
- internal bool RequiresWidening {
- get {
- return _transform != null && !_transform.IsIdentity;
+ value.CopyTo(_transform);
}
}
#endregion
#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
throw new ArgumentException ("You may not change this Pen because it does not belong to you.");
}
- internal awt.Stroke NativeObject {
+ 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 {
- float[] dashPattern = null;\r
+ 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;
- else
- // add the size of caps to the transparent parts
- dashPattern[i] = (DashPattern[i] * Width) + Width;
+ 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;
}
- }\r
+ else
+ // add the size of caps to the transparent parts
+ dashPattern[i] = (_dashPattern[i] * Width) + Width;
+ }
}\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
+ 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
+ // 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
+ 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
+ // 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
- return StrokeFactory.CreateStroke(Width, cap, \r
- join, MiterLimit, dashPattern, DashOffset,\r
- _transform != null ? _transform.NativeObject : null);
- }
+ 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 NativeObject.createStrokedShape(arg_0);\r
+ return GetNativeObject(null, PenFit.NotThin).createStrokedShape(arg_0);\r
}\r
\r
#endregion