void DrawShape(Pen pen, awt.Shape shape) { if (pen == null) throw new ArgumentNullException("pen"); if (StrokeFactory.CanCreateAdvancedStroke && (!pen.CanCreateBasicStroke || !NeedsNormalization)) { geom.AffineTransform oldT = NativeObject.getTransform(); NativeObject.setTransform(Matrix.IdentityTransform.NativeObject); try { geom.AffineTransform t = GetFinalTransform(); if (!oldT.isIdentity()) { t = (geom.AffineTransform)t.clone(); t.preConcatenate(oldT); } double widthsquared = pen.GetSquaredTransformedWidth(t); bool antiAlias = (SmoothingMode == SmoothingMode.AntiAlias); bool thin = (widthsquared <= (antiAlias ? AdvancedStroke.MinPenSizeAASquared : AdvancedStroke.MinPenSizeSquared)); PenFit penFit = thin ? (antiAlias ? PenFit.ThinAntiAlias : PenFit.Thin) : PenFit.NotThin; if (NeedsNormalization) { bool normThin = widthsquared <= AdvancedStroke.MinPenSizeSquaredNorm; if (normThin) { shape = GetNormalizedShape(shape, t); shape = pen.GetNativeObject( t, null, penFit).createStrokedShape(shape); } else { shape = pen.GetNativeObject(t, penFit).createStrokedShape(shape); shape = GetNormalizedShape(shape, null); } } else { shape = pen.GetNativeObject(t, penFit).createStrokedShape(shape); } FillScaledShape(pen.Brush, shape); } finally { NativeObject.setTransform(oldT); } } else { awt.Stroke oldStroke = NativeObject.getStroke(); NativeObject.setStroke(pen.GetNativeObject(null, PenFit.NotThin)); try { NativeObject.setPaint(pen.Brush); geom.AffineTransform oldT = NativeObject.getTransform(); NativeObject.transform(GetFinalTransform()); try { NativeObject.draw(shape); } finally { NativeObject.setTransform(oldT); } } finally { NativeObject.setStroke(oldStroke); } } }