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
//
#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.");
}
- #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
- //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
+\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;
+ 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;
}
- else
- dashPattern[i] = DashPattern[i] * Width * 2f;\r
}\r
}\r
break;\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