| Index: Source/core/rendering/svg/RenderSVGRect.cpp
|
| diff --git a/Source/core/rendering/svg/RenderSVGRect.cpp b/Source/core/rendering/svg/RenderSVGRect.cpp
|
| index 0c38186f08d0d2fc1d8ea331f4e331d7bf3aeffd..e50f50ce7d0fda9d7534a13b88f32932aa233be5 100644
|
| --- a/Source/core/rendering/svg/RenderSVGRect.cpp
|
| +++ b/Source/core/rendering/svg/RenderSVGRect.cpp
|
| @@ -30,8 +30,6 @@
|
| #include "core/rendering/svg/RenderSVGRect.h"
|
| #include "core/svg/SVGRectElement.h"
|
|
|
| -#include <cmath>
|
| -
|
| namespace blink {
|
|
|
| RenderSVGRect::RenderSVGRect(SVGRectElement* node)
|
| @@ -49,8 +47,8 @@
|
| // Before creating a new object we need to clear the cached bounding box
|
| // to avoid using garbage.
|
| m_fillBoundingBox = FloatRect();
|
| - m_strokeBoundingBox = FloatRect();
|
| - m_hitTestStrokeBoundingBox = FloatRect();
|
| + m_innerStrokeRect = FloatRect();
|
| + m_outerStrokeRect = FloatRect();
|
| m_usePathFallback = false;
|
| SVGRectElement* rect = toSVGRectElement(element());
|
| ASSERT(rect);
|
| @@ -77,9 +75,19 @@
|
| }
|
|
|
| m_fillBoundingBox = FloatRect(FloatPoint(rect->x()->currentValue()->value(lengthContext), rect->y()->currentValue()->value(lengthContext)), boundingBoxSize);
|
| - m_hitTestStrokeBoundingBox = m_fillBoundingBox;
|
| - m_hitTestStrokeBoundingBox.inflate(strokeWidth() / 2);
|
| - m_strokeBoundingBox = style()->svgStyle().hasStroke() ? m_hitTestStrokeBoundingBox : m_fillBoundingBox;
|
| +
|
| + // 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;
|
| }
|
|
|
| bool RenderSVGRect::shapeDependentStrokeContains(const FloatPoint& point)
|
| @@ -92,19 +100,7 @@
|
| return RenderSVGShape::shapeDependentStrokeContains(point);
|
| }
|
|
|
| - 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);
|
| + return m_outerStrokeRect.contains(point, FloatRect::InsideOrOnStroke) && !m_innerStrokeRect.contains(point, FloatRect::InsideButNotOnStroke);
|
| }
|
|
|
| bool RenderSVGRect::shapeDependentFillContains(const FloatPoint& point, const WindRule fillRule) const
|
|
|