From e9beeba39f1db94d8f0f5b34d31e6c3abc2ef6b7 Mon Sep 17 00:00:00 2001 From: Denis Lila Date: Wed, 19 Jan 2011 09:44:52 -0500 Subject: [PATCH] 4724552: CubicCurve2D.contains(Rectangle2D) returns true when only partially contained Now using subdivision code in sun.awt.geom.Curve. Reviewed-by: flar --- .../classes/java/awt/geom/CubicCurve2D.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/jdk/src/share/classes/java/awt/geom/CubicCurve2D.java b/jdk/src/share/classes/java/awt/geom/CubicCurve2D.java index 766e383ffb0..e9ef48ac54c 100644 --- a/jdk/src/share/classes/java/awt/geom/CubicCurve2D.java +++ b/jdk/src/share/classes/java/awt/geom/CubicCurve2D.java @@ -1602,20 +1602,32 @@ public abstract class CubicCurve2D implements Shape, Cloneable { if (w <= 0 || h <= 0) { return false; } - // Assertion: Cubic curves closed by connecting their - // endpoints form either one or two convex halves with - // the closing line segment as an edge of both sides. - if (!(contains(x, y) && - contains(x + w, y) && - contains(x + w, y + h) && - contains(x, y + h))) { - return false; + + int numCrossings = rectCrossings(x, y, w, h); + return !(numCrossings == 0 || numCrossings == Curve.RECT_INTERSECTS); + } + + private int rectCrossings(double x, double y, double w, double h) { + int crossings = 0; + if (!(getX1() == getX2() && getY1() == getY2())) { + crossings = Curve.rectCrossingsForLine(crossings, + x, y, + x+w, y+h, + getX1(), getY1(), + getX2(), getY2()); + if (crossings == Curve.RECT_INTERSECTS) { + return crossings; + } } - // Either the rectangle is entirely inside one of the convex - // halves or it crosses from one to the other, in which case - // it must intersect the closing line segment. - Rectangle2D rect = new Rectangle2D.Double(x, y, w, h); - return !rect.intersectsLine(getX1(), getY1(), getX2(), getY2()); + // we call this with the curve's direction reversed, because we wanted + // to call rectCrossingsForLine first, because it's cheaper. + return Curve.rectCrossingsForCubic(crossings, + x, y, + x+w, y+h, + getX2(), getY2(), + getCtrlX2(), getCtrlY2(), + getCtrlX1(), getCtrlY1(), + getX1(), getY1(), 0); } /**