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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); | 149 SVGGraphicsElement* graphicsElement = toSVGGraphicsElement(element()); |
150 if (graphicsElement->hasAnimatedLocalTransform()) { | 150 if (graphicsElement->hasAnimatedLocalTransform()) { |
151 m_localTransform.setTransform(graphicsElement->calculateAnimatedLocalTra
nsform()); | 151 m_localTransform.setTransform(graphicsElement->calculateAnimatedLocalTra
nsform()); |
152 } else { | 152 } else { |
153 m_localTransform = AffineTransform(); | 153 m_localTransform = AffineTransform(); |
154 } | 154 } |
155 } | 155 } |
156 | 156 |
157 void LayoutSVGShape::layout() | 157 void LayoutSVGShape::layout() |
158 { | 158 { |
159 bool updateCachedBoundariesInParents = false; | |
160 LayoutAnalyzer::Scope analyzer(*this); | 159 LayoutAnalyzer::Scope analyzer(*this); |
161 | 160 |
| 161 bool updateParentBoundaries = false; |
| 162 // updateShapeFromElement() also updates the object & stroke bounds - which |
| 163 // feeds into the paint invalidation rect - so we need to call it for both |
| 164 // the shape-update and the bounds-update flag, since . |
162 if (m_needsShapeUpdate || m_needsBoundariesUpdate) { | 165 if (m_needsShapeUpdate || m_needsBoundariesUpdate) { |
163 updateShapeFromElement(); | 166 updateShapeFromElement(); |
164 m_needsShapeUpdate = false; | 167 m_needsShapeUpdate = false; |
165 updatePaintInvalidationBoundingBox(); | 168 |
166 m_needsBoundariesUpdate = false; | 169 m_needsBoundariesUpdate = true; |
167 updateCachedBoundariesInParents = true; | 170 updateParentBoundaries = true; |
168 } | 171 } |
169 | 172 |
170 if (m_needsTransformUpdate) { | 173 if (m_needsTransformUpdate) { |
171 updateLocalTransform(); | 174 updateLocalTransform(); |
172 m_needsTransformUpdate = false; | 175 m_needsTransformUpdate = false; |
173 updateCachedBoundariesInParents = true; | 176 updateParentBoundaries = true; |
174 } | 177 } |
175 | 178 |
176 // Invalidate all resources of this client if our layout changed. | 179 // Invalidate all resources of this client if our layout changed. |
177 if (everHadLayout() && selfNeedsLayout()) | 180 if (everHadLayout() && selfNeedsLayout()) |
178 SVGResourcesCache::clientLayoutChanged(this); | 181 SVGResourcesCache::clientLayoutChanged(this); |
179 | 182 |
| 183 if (m_needsBoundariesUpdate) { |
| 184 m_paintInvalidationBoundingBox = strokeBoundingBox(); |
| 185 SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_pa
intInvalidationBoundingBox); |
| 186 m_needsBoundariesUpdate = false; |
| 187 updateParentBoundaries = true; |
| 188 } |
| 189 |
180 // If our bounds changed, notify the parents. | 190 // If our bounds changed, notify the parents. |
181 if (updateCachedBoundariesInParents) | 191 if (updateParentBoundaries) |
182 LayoutSVGModelObject::setNeedsBoundariesUpdate(); | 192 LayoutSVGModelObject::setNeedsBoundariesUpdate(); |
183 | 193 |
184 clearNeedsLayout(); | 194 clearNeedsLayout(); |
185 } | 195 } |
186 | 196 |
187 Path* LayoutSVGShape::nonScalingStrokePath(const Path* path, const AffineTransfo
rm& strokeTransform) const | 197 Path* LayoutSVGShape::nonScalingStrokePath(const Path* path, const AffineTransfo
rm& strokeTransform) const |
188 { | 198 { |
189 LayoutSVGShapeRareData& rareData = ensureRareData(); | 199 LayoutSVGShapeRareData& rareData = ensureRareData(); |
190 if (!rareData.m_cachedNonScalingStrokePath.isEmpty() && strokeTransform == r
areData.m_cachedNonScalingStrokeTransform) | 200 if (!rareData.m_cachedNonScalingStrokePath.isEmpty() && strokeTransform == r
areData.m_cachedNonScalingStrokeTransform) |
191 return &rareData.m_cachedNonScalingStrokePath; | 201 return &rareData.m_cachedNonScalingStrokePath; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 strokeBoundingBox.unite(strokeBoundingRect); | 286 strokeBoundingBox.unite(strokeBoundingRect); |
277 } | 287 } |
278 } else { | 288 } else { |
279 strokeBoundingBox.unite(path().strokeBoundingRect(strokeData)); | 289 strokeBoundingBox.unite(path().strokeBoundingRect(strokeData)); |
280 } | 290 } |
281 } | 291 } |
282 | 292 |
283 return strokeBoundingBox; | 293 return strokeBoundingBox; |
284 } | 294 } |
285 | 295 |
286 void LayoutSVGShape::updatePaintInvalidationBoundingBox() | |
287 { | |
288 m_paintInvalidationBoundingBox = strokeBoundingBox(); | |
289 SVGLayoutSupport::intersectPaintInvalidationRectWithResources(this, m_paintI
nvalidationBoundingBox); | |
290 } | |
291 | |
292 float LayoutSVGShape::strokeWidth() const | 296 float LayoutSVGShape::strokeWidth() const |
293 { | 297 { |
294 SVGLengthContext lengthContext(element()); | 298 SVGLengthContext lengthContext(element()); |
295 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); | 299 return lengthContext.valueForLength(style()->svgStyle().strokeWidth()); |
296 } | 300 } |
297 | 301 |
298 LayoutSVGShapeRareData& LayoutSVGShape::ensureRareData() const | 302 LayoutSVGShapeRareData& LayoutSVGShape::ensureRareData() const |
299 { | 303 { |
300 if (!m_rareData) | 304 if (!m_rareData) |
301 m_rareData = adoptPtr(new LayoutSVGShapeRareData()); | 305 m_rareData = adoptPtr(new LayoutSVGShapeRareData()); |
302 return *m_rareData.get(); | 306 return *m_rareData.get(); |
303 } | 307 } |
304 | 308 |
305 } // namespace blink | 309 } // namespace blink |
OLD | NEW |