| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2008 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2008 Rob Buis <buis@kde.org> |
| 4 * Copyright (C) 2005, 2007 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2005, 2007 Eric Seidel <eric@webkit.org> |
| 5 * Copyright (C) 2009 Google, Inc. | 5 * Copyright (C) 2009 Google, Inc. |
| 6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 6 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
| 7 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 7 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
| 8 * Copyright (C) 2009 Jeff Schiller <codedread@gmail.com> | 8 * Copyright (C) 2009 Jeff Schiller <codedread@gmail.com> |
| 9 * Copyright (C) 2011 Renata Hodovan <reni@webkit.org> | 9 * Copyright (C) 2011 Renata Hodovan <reni@webkit.org> |
| 10 * Copyright (C) 2011 University of Szeged | 10 * Copyright (C) 2011 University of Szeged |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 } | 66 } |
| 67 | 67 |
| 68 void LayoutSVGShape::updateShapeFromElement() | 68 void LayoutSVGShape::updateShapeFromElement() |
| 69 { | 69 { |
| 70 createPath(); | 70 createPath(); |
| 71 | 71 |
| 72 m_fillBoundingBox = calculateObjectBoundingBox(); | 72 m_fillBoundingBox = calculateObjectBoundingBox(); |
| 73 m_strokeBoundingBox = calculateStrokeBoundingBox(); | 73 m_strokeBoundingBox = calculateStrokeBoundingBox(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 FloatRect LayoutSVGShape::hitTestStrokeBoundingBox() const |
| 77 { |
| 78 if (style()->svgStyle().hasStroke()) |
| 79 return m_strokeBoundingBox; |
| 80 |
| 81 FloatRect result = m_fillBoundingBox; |
| 82 const float strokeWidth = this->strokeWidth(); |
| 83 result.inflate(strokeWidth / 2); |
| 84 return result; |
| 85 } |
| 86 |
| 76 bool LayoutSVGShape::shapeDependentStrokeContains(const FloatPoint& point) | 87 bool LayoutSVGShape::shapeDependentStrokeContains(const FloatPoint& point) |
| 77 { | 88 { |
| 78 ASSERT(m_path); | 89 ASSERT(m_path); |
| 79 StrokeData strokeData; | 90 StrokeData strokeData; |
| 80 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this
); | 91 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this
); |
| 81 | 92 |
| 82 if (hasNonScalingStroke()) { | 93 if (hasNonScalingStroke()) { |
| 83 AffineTransform nonScalingTransform = nonScalingStrokeTransform(); | 94 AffineTransform nonScalingTransform = nonScalingStrokeTransform(); |
| 84 Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform); | 95 Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform); |
| 85 | 96 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 100 return false; | 111 return false; |
| 101 | 112 |
| 102 if (requiresFill && !SVGPaintServer::existsForLayoutObject(*this, styleRef()
, ApplyToFillMode)) | 113 if (requiresFill && !SVGPaintServer::existsForLayoutObject(*this, styleRef()
, ApplyToFillMode)) |
| 103 return false; | 114 return false; |
| 104 | 115 |
| 105 return shapeDependentFillContains(point, fillRule); | 116 return shapeDependentFillContains(point, fillRule); |
| 106 } | 117 } |
| 107 | 118 |
| 108 bool LayoutSVGShape::strokeContains(const FloatPoint& point, bool requiresStroke
) | 119 bool LayoutSVGShape::strokeContains(const FloatPoint& point, bool requiresStroke
) |
| 109 { | 120 { |
| 110 if (!strokeBoundingBox().contains(point)) | 121 if (requiresStroke) { |
| 111 return false; | 122 if (!strokeBoundingBox().contains(point)) |
| 123 return false; |
| 112 | 124 |
| 113 if (requiresStroke && !SVGPaintServer::existsForLayoutObject(*this, styleRef
(), ApplyToStrokeMode)) | 125 if (!SVGPaintServer::existsForLayoutObject(*this, styleRef(), ApplyToStr
okeMode)) |
| 114 return false; | 126 return false; |
| 127 } else { |
| 128 if (!hitTestStrokeBoundingBox().contains(point)) |
| 129 return false; |
| 130 } |
| 115 | 131 |
| 116 return shapeDependentStrokeContains(point); | 132 return shapeDependentStrokeContains(point); |
| 117 } | 133 } |
| 118 | 134 |
| 119 void LayoutSVGShape::updateLocalTransform() | 135 void LayoutSVGShape::updateLocalTransform() |
| 120 { | 136 { |
| 121 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); | 137 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); |
| 122 if (graphicsElement->hasAnimatedLocalTransform()) { | 138 if (graphicsElement->hasAnimatedLocalTransform()) { |
| 123 if (m_localTransform) | 139 if (m_localTransform) |
| 124 m_localTransform->setTransform(graphicsElement->calculateAnimatedLoc
alTransform()); | 140 m_localTransform->setTransform(graphicsElement->calculateAnimatedLoc
alTransform()); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_paintI
nvalidationBoundingBox); | 276 SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_paintI
nvalidationBoundingBox); |
| 261 } | 277 } |
| 262 | 278 |
| 263 float LayoutSVGShape::strokeWidth() const | 279 float LayoutSVGShape::strokeWidth() const |
| 264 { | 280 { |
| 265 SVGLengthContext lengthContext(element()); | 281 SVGLengthContext lengthContext(element()); |
| 266 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); | 282 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); |
| 267 } | 283 } |
| 268 | 284 |
| 269 } | 285 } |
| OLD | NEW |