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;
+ 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.");
}
- #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
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;
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