_alignment = PenAlignment.Center;
_lineJoin = LineJoin.Miter;
_miterLimit = 10f;
+ _transform = new Matrix();
}
#endregion
//
#endregion
#region CompoundArray [TODO]
+ [MonoTODO]
public float[] CompoundArray {
get {
throw new NotImplementedException ();
#endregion
#region CustomEndCap [TODO]
+ [MonoTODO]
public CustomLineCap CustomEndCap \r
{
get \r
#endregion
#region CustomStartCap [TODO]
+ [MonoTODO]
public CustomLineCap CustomStartCap \r
{
-
get \r
{
throw new NotImplementedException ();
#endregion
#region DashCap
+ [MonoTODO]
public DashCap DashCap {
get {
return _dashCap;
{
get \r
{
- return _dashPattern;
+ return (float [])_dashPattern.Clone();
}
set \r
#endregion
#region StartCap [TODO - now allways endcap]
-
+ [MonoTODO]
public LineCap StartCap {
get {
return _startCap;
#endregion
#region EndCap
+ [MonoTODO]
public LineCap EndCap \r
{
get \r
#endregion
#region LineJoin [partial TODO - missed styles]
+ [MonoTODO]
public LineJoin LineJoin {
get {
return _lineJoin;
{
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.");
}
+ 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 outputTransform, bool fitPen) {
+ 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;
+ 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
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, penFit);
}
#region Stroke Members\r
\r
awt.Shape awt.Stroke.createStrokedShape(awt.Shape arg_0) {\r
- return GetNativeObject(null, false).createStrokedShape(arg_0);\r
+ return GetNativeObject(null, PenFit.NotThin).createStrokedShape(arg_0);\r
}\r
\r
#endregion