using sun.dc.pr;\r
\r
namespace System.Drawing {\r
+\r
+ internal enum PenFit {\r
+ NotThin,\r
+ Thin,\r
+ ThinAntiAlias\r
+ }\r
+\r
internal class AdvancedStroke : Stroke {\r
\r
public const float PenUnits = 0.01f;
public const float MinPenSizeAA = PenUnits * MinPenUnitsAA;\r
public const double MinPenSizeAASquared = (MinPenSizeAA * MinPenSizeAA);
public const double MinPenSizeSquared = 1.000000001;\r
+ public const double MinPenSizeNorm = 1.5;\r
+ public const double MinPenSizeSquaredNorm = (MinPenSizeNorm * MinPenSizeNorm);\r
\r
/**\r
* Joins path segments by extending their outside edges until\r
\r
AffineTransform _penTransform;\r
AffineTransform _outputTransform;\r
- bool _fitPen;\r
+ PenFit _penFit;\r
\r
/**\r
* Constructs a new <code>AdvancedStroke</code> with the specified\r
*/\r
public AdvancedStroke(float width, int cap, int join, float miterlimit,\r
float[] dash, float dash_phase, AffineTransform penTransform,\r
- AffineTransform outputTransform, bool fitPen) {\r
+ AffineTransform outputTransform, PenFit penFit) {\r
if (width < 0.0f) {\r
throw new IllegalArgumentException("negative width");\r
}\r
this.dash_phase = dash_phase;\r
this._penTransform = penTransform;\r
this._outputTransform = outputTransform;\r
- this._fitPen = fitPen;\r
+ this._penFit = penFit;\r
}\r
\r
/**\r
* either JOIN_ROUND, JOIN_BEVEL, or JOIN_MITER\r
*/\r
public AdvancedStroke(float width, int cap, int join, float miterlimit) :\r
- this(width, cap, join, miterlimit, null, 0.0f, null, null, false) {\r
+ this(width, cap, join, miterlimit, null, 0.0f, null, null, PenFit.NotThin) {\r
}\r
\r
/**\r
* either JOIN_ROUND, JOIN_BEVEL, or JOIN_MITER\r
*/\r
public AdvancedStroke(float width, int cap, int join) :\r
- this(width, cap, join, 10.0f, null, 0.0f, null, null, false) {\r
+ this(width, cap, join, 10.0f, null, 0.0f, null, null, PenFit.NotThin) {\r
}\r
\r
/**\r
* @throws IllegalArgumentException if <code>width</code> is negative\r
*/\r
public AdvancedStroke(float width) :\r
- this(width, CAP_SQUARE, JOIN_MITER, 10.0f, null, 0.0f, null, null, false) {\r
+ this(width, CAP_SQUARE, JOIN_MITER, 10.0f, null, 0.0f, null, null, PenFit.NotThin) {\r
}\r
\r
/**\r
* JOIN_MITER, a miter limit of 10.0.\r
*/\r
public AdvancedStroke() :\r
- this(1.0f, CAP_SQUARE, JOIN_MITER, 10.0f, null, 0.0f, null, null, false) {\r
+ this(1.0f, CAP_SQUARE, JOIN_MITER, 10.0f, null, 0.0f, null, null, PenFit.NotThin) {\r
}\r
\r
\r
PathConsumer consumer;\r
\r
stroker.setPenDiameter(width);\r
- if (_fitPen)\r
- stroker.setPenFitting(PenUnits, MinPenUnitsAA);\r
+ switch (_penFit) {\r
+ case PenFit.Thin:\r
+ stroker.setPenFitting(PenUnits, MinPenUnits);\r
+ break;\r
+ case PenFit.ThinAntiAlias:\r
+ stroker.setPenFitting(PenUnits, MinPenUnitsAA);\r
+ break;\r
+ }\r
\r
float[] t4 = null;\r
- if (PenTransform != null && !PenTransform.isIdentity()) {\r
+ if (PenTransform != null && !PenTransform.isIdentity() && (PenTransform.getDeterminant() > 1e-25)) {\r
t4 = new float[]{\r
(float)PenTransform.getScaleX(), (float)PenTransform.getShearY(), \r
(float)PenTransform.getShearX(), (float)PenTransform.getScaleY()\r