Bitmap.cs: Move LockBits validations into unmanaged code.
[mono.git] / mcs / class / System.Drawing / System.Drawing / AdvancedStroke.jvm.cs
old mode 100755 (executable)
new mode 100644 (file)
index 879e5a5..769312d
@@ -8,6 +8,13 @@ using sun.dc.path;
 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;
@@ -16,6 +23,8 @@ namespace System.Drawing {
                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
@@ -66,7 +75,7 @@ namespace System.Drawing {
 \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
@@ -97,7 +106,7 @@ namespace System.Drawing {
                 */\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
@@ -138,7 +147,7 @@ namespace System.Drawing {
                        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
@@ -157,7 +166,7 @@ namespace System.Drawing {
                 *         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
@@ -175,7 +184,7 @@ namespace System.Drawing {
                 *         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
@@ -186,7 +195,7 @@ namespace System.Drawing {
                 * @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
@@ -196,7 +205,7 @@ namespace System.Drawing {
                 * 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
@@ -212,11 +221,17 @@ namespace System.Drawing {
                        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