| 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 // Implementation of http://dev.w3.org/fxtf/css-masking-1/#compute-stroke-bo
unding-box |
| 82 // for the <rect> / <ellipse> / <circle> case except that we ignore whether |
| 83 // the stroke is none. |
| 84 |
| 85 FloatRect box = m_fillBoundingBox; |
| 86 const float strokeWidth = this->strokeWidth(); |
| 87 box.inflate(strokeWidth / 2); |
| 88 return box; |
| 89 } |
| 90 |
| 76 bool LayoutSVGShape::shapeDependentStrokeContains(const FloatPoint& point) | 91 bool LayoutSVGShape::shapeDependentStrokeContains(const FloatPoint& point) |
| 77 { | 92 { |
| 78 ASSERT(m_path); | 93 ASSERT(m_path); |
| 79 StrokeData strokeData; | 94 StrokeData strokeData; |
| 80 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this
); | 95 SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this
); |
| 81 | 96 |
| 82 if (hasNonScalingStroke()) { | 97 if (hasNonScalingStroke()) { |
| 83 AffineTransform nonScalingTransform = nonScalingStrokeTransform(); | 98 AffineTransform nonScalingTransform = nonScalingStrokeTransform(); |
| 84 Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform); | 99 Path* usePath = nonScalingStrokePath(m_path.get(), nonScalingTransform); |
| 85 | 100 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 100 return false; | 115 return false; |
| 101 | 116 |
| 102 if (requiresFill && !SVGPaintServer::existsForLayoutObject(*this, styleRef()
, ApplyToFillMode)) | 117 if (requiresFill && !SVGPaintServer::existsForLayoutObject(*this, styleRef()
, ApplyToFillMode)) |
| 103 return false; | 118 return false; |
| 104 | 119 |
| 105 return shapeDependentFillContains(point, fillRule); | 120 return shapeDependentFillContains(point, fillRule); |
| 106 } | 121 } |
| 107 | 122 |
| 108 bool LayoutSVGShape::strokeContains(const FloatPoint& point, bool requiresStroke
) | 123 bool LayoutSVGShape::strokeContains(const FloatPoint& point, bool requiresStroke
) |
| 109 { | 124 { |
| 110 if (!strokeBoundingBox().contains(point)) | 125 if (requiresStroke) { |
| 111 return false; | 126 if (!strokeBoundingBox().contains(point)) |
| 127 return false; |
| 112 | 128 |
| 113 if (requiresStroke && !SVGPaintServer::existsForLayoutObject(*this, styleRef
(), ApplyToStrokeMode)) | 129 if (!SVGPaintServer::existsForLayoutObject(*this, styleRef(), ApplyToStr
okeMode)) |
| 114 return false; | 130 return false; |
| 131 } else { |
| 132 if (!hitTestStrokeBoundingBox().contains(point)) |
| 133 return false; |
| 134 } |
| 115 | 135 |
| 116 return shapeDependentStrokeContains(point); | 136 return shapeDependentStrokeContains(point); |
| 117 } | 137 } |
| 118 | 138 |
| 119 void LayoutSVGShape::updateLocalTransform() | 139 void LayoutSVGShape::updateLocalTransform() |
| 120 { | 140 { |
| 121 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); | 141 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); |
| 122 if (graphicsElement->hasAnimatedLocalTransform()) { | 142 if (graphicsElement->hasAnimatedLocalTransform()) { |
| 123 if (m_localTransform) | 143 if (m_localTransform) |
| 124 m_localTransform->setTransform(graphicsElement->calculateAnimatedLoc
alTransform()); | 144 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); | 280 SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_paintI
nvalidationBoundingBox); |
| 261 } | 281 } |
| 262 | 282 |
| 263 float LayoutSVGShape::strokeWidth() const | 283 float LayoutSVGShape::strokeWidth() const |
| 264 { | 284 { |
| 265 SVGLengthContext lengthContext(element()); | 285 SVGLengthContext lengthContext(element()); |
| 266 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); | 286 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); |
| 267 } | 287 } |
| 268 | 288 |
| 269 } | 289 } |
| OLD | NEW |