| Index: Source/core/layout/svg/LayoutSVGRect.cpp
|
| diff --git a/Source/core/layout/svg/LayoutSVGRect.cpp b/Source/core/layout/svg/LayoutSVGRect.cpp
|
| index ae624d63cdf0a2b202fabe06406cad94bfff5706..18b0ccd737b67602e2f4f40fe69236ed49f814fe 100644
|
| --- a/Source/core/layout/svg/LayoutSVGRect.cpp
|
| +++ b/Source/core/layout/svg/LayoutSVGRect.cpp
|
| @@ -29,6 +29,7 @@
|
| #include "core/layout/svg/LayoutSVGRect.h"
|
|
|
| #include "core/svg/SVGRectElement.h"
|
| +#include "wtf/MathExtras.h"
|
|
|
| namespace blink {
|
|
|
| @@ -47,8 +48,7 @@ void LayoutSVGRect::updateShapeFromElement()
|
| // Before creating a new object we need to clear the cached bounding box
|
| // to avoid using garbage.
|
| m_fillBoundingBox = FloatRect();
|
| - m_innerStrokeRect = FloatRect();
|
| - m_outerStrokeRect = FloatRect();
|
| + m_strokeBoundingBox = FloatRect();
|
| m_usePathFallback = false;
|
| SVGRectElement* rect = toSVGRectElement(element());
|
| ASSERT(rect);
|
| @@ -81,19 +81,9 @@ void LayoutSVGRect::updateShapeFromElement()
|
| lengthContext.valueForLength(styleRef().svgStyle().x(), styleRef(), SVGLengthMode::Width),
|
| lengthContext.valueForLength(styleRef().svgStyle().y(), styleRef(), SVGLengthMode::Height)),
|
| boundingBoxSize);
|
| -
|
| - // To decide if the stroke contains a point we create two rects which represent the inner and
|
| - // the outer stroke borders. A stroke contains the point, if the point is between them.
|
| - m_innerStrokeRect = m_fillBoundingBox;
|
| - m_outerStrokeRect = m_fillBoundingBox;
|
| -
|
| - if (style()->svgStyle().hasStroke()) {
|
| - float strokeWidth = this->strokeWidth();
|
| - m_innerStrokeRect.inflate(-strokeWidth / 2);
|
| - m_outerStrokeRect.inflate(strokeWidth / 2);
|
| - }
|
| -
|
| - m_strokeBoundingBox = m_outerStrokeRect;
|
| + m_strokeBoundingBox = m_fillBoundingBox;
|
| + if (style()->svgStyle().hasStroke())
|
| + m_strokeBoundingBox.inflate(strokeWidth() / 2);
|
| }
|
|
|
| bool LayoutSVGRect::shapeDependentStrokeContains(const FloatPoint& point)
|
| @@ -106,7 +96,19 @@ bool LayoutSVGRect::shapeDependentStrokeContains(const FloatPoint& point)
|
| return LayoutSVGShape::shapeDependentStrokeContains(point);
|
| }
|
|
|
| - return m_outerStrokeRect.contains(point, FloatRect::InsideOrOnStroke) && !m_innerStrokeRect.contains(point, FloatRect::InsideButNotOnStroke);
|
| + const float halfStrokeWidth = strokeWidth() / 2;
|
| + const float halfWidth = m_fillBoundingBox.width() / 2;
|
| + const float halfHeight = m_fillBoundingBox.height() / 2;
|
| +
|
| + const FloatPoint fillBoundingBoxCenter = FloatPoint(m_fillBoundingBox.x() + halfWidth, m_fillBoundingBox.y() + halfHeight);
|
| + const float absDeltaX = std::abs(point.x() - fillBoundingBoxCenter.x());
|
| + const float absDeltaY = std::abs(point.y() - fillBoundingBoxCenter.y());
|
| +
|
| + if (!(absDeltaX <= halfWidth + halfStrokeWidth && absDeltaY <= halfHeight + halfStrokeWidth))
|
| + return false;
|
| +
|
| + return (halfWidth - halfStrokeWidth <= absDeltaX)
|
| + || (halfHeight - halfStrokeWidth <= absDeltaY);
|
| }
|
|
|
| bool LayoutSVGRect::shapeDependentFillContains(const FloatPoint& point, const WindRule fillRule) const
|
|
|