Index: third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp |
index 733cd67c26aeb10382b9a7bc3fe6202527124a5d..00d8f6f89aefaff65351bbac09b79cef93242cba 100644 |
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp |
@@ -214,6 +214,31 @@ |
return transformMatrix.inverse().mapRect(rect); |
} |
+GeometryMapper::TransformCache& GeometryMapper::getTransformCache( |
+ const TransformPaintPropertyNode* ancestor) { |
+ auto addResult = m_transformCache.insert(ancestor, nullptr); |
+ if (addResult.isNewEntry) |
+ addResult.storedValue->value = WTF::wrapUnique(new TransformCache); |
+ return *addResult.storedValue->value; |
+} |
+ |
+GeometryMapper::ClipCache& GeometryMapper::getClipCache( |
+ const ClipPaintPropertyNode* ancestorClip, |
+ const TransformPaintPropertyNode* ancestorTransform) { |
+ auto addResultTransform = m_clipCache.insert(ancestorClip, nullptr); |
+ if (addResultTransform.isNewEntry) { |
+ addResultTransform.storedValue->value = |
+ WTF::wrapUnique(new TransformToClip); |
+ } |
+ |
+ auto addResultClip = |
+ addResultTransform.storedValue->value->insert(ancestorTransform, nullptr); |
+ if (addResultClip.isNewEntry) |
+ addResultClip.storedValue->value = WTF::wrapUnique(new ClipCache); |
+ |
+ return *addResultClip.storedValue->value; |
+} |
+ |
FloatClipRect GeometryMapper::localToAncestorClipRect( |
const PropertyTreeState& localState, |
const PropertyTreeState& ancestorState) { |
@@ -249,8 +274,7 @@ |
if (success) |
return result; |
- // Otherwise first map to the lowest common ancestor, then map to |
- // destination. |
+ // Otherwise first map to the lowest common ancestor, then map to destination. |
const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor( |
sourceState.transform(), destinationState.transform()); |
DCHECK(lcaTransform); |
@@ -267,9 +291,9 @@ |
if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { |
// On SPv1 we may fail when the paint invalidation container creates an |
// overflow clip (in ancestorState) which is not in localState of an |
- // out-of-flow positioned descendant. See crbug.com/513108 and layout |
- // test compositing/overflow/handle-non-ancestor-clip-parent.html (run |
- // with --enable-prefer-compositing-to-lcd-text) for details. |
+ // out-of-flow positioned descendant. See crbug.com/513108 and layout test |
+ // compositing/overflow/handle-non-ancestor-clip-parent.html (run with |
+ // --enable-prefer-compositing-to-lcd-text) for details. |
// Ignore it for SPv1 for now. |
success = true; |
} |
@@ -283,7 +307,7 @@ |
return result; |
} |
-const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal( |
+FloatClipRect GeometryMapper::localToAncestorClipRectInternal( |
const ClipPaintPropertyNode* descendant, |
const ClipPaintPropertyNode* ancestorClip, |
const TransformPaintPropertyNode* ancestorTransform, |
@@ -291,29 +315,28 @@ |
FloatClipRect clip; |
if (descendant == ancestorClip) { |
success = true; |
- return m_infiniteClip; |
- } |
- |
+ // Return an infinite clip. |
+ return clip; |
+ } |
+ |
+ ClipCache& clipCache = getClipCache(ancestorClip, ancestorTransform); |
const ClipPaintPropertyNode* clipNode = descendant; |
Vector<const ClipPaintPropertyNode*> intermediateNodes; |
- GeometryMapperClipCache::ClipAndTransform clipAndTransform(ancestorClip, |
- ancestorTransform); |
// Iterate over the path from localState.clip to ancestorState.clip. Stop if |
// we've found a memoized (precomputed) clip for any particular node. |
while (clipNode && clipNode != ancestorClip) { |
- if (const FloatClipRect* cachedClip = |
- clipNode->getClipCache().getCachedClip(clipAndTransform)) { |
- clip = *cachedClip; |
+ auto it = clipCache.find(clipNode); |
+ if (it != clipCache.end()) { |
+ clip = it->value; |
break; |
} |
- |
intermediateNodes.push_back(clipNode); |
clipNode = clipNode->parent(); |
} |
if (!clipNode) { |
success = false; |
- return m_infiniteClip; |
+ return clip; |
} |
// Iterate down from the top intermediate node found in the previous loop, |
@@ -324,20 +347,16 @@ |
const TransformationMatrix& transformMatrix = localToAncestorMatrixInternal( |
(*it)->localTransformSpace(), ancestorTransform, success); |
if (!success) |
- return m_infiniteClip; |
+ return clip; |
FloatRect mappedRect = transformMatrix.mapRect((*it)->clipRect().rect()); |
clip.intersect(mappedRect); |
if ((*it)->clipRect().isRounded()) |
clip.setHasRadius(); |
- (*it)->getClipCache().setCachedClip(clipAndTransform, clip); |
+ clipCache.set(*it, clip); |
} |
success = true; |
- |
- const FloatClipRect* cachedClip = |
- descendant->getClipCache().getCachedClip(clipAndTransform); |
- DCHECK(cachedClip); |
- return *cachedClip; |
+ return clipCache.find(descendant)->value; |
} |
const TransformationMatrix& GeometryMapper::localToAncestorMatrix( |
@@ -358,6 +377,8 @@ |
success = true; |
return m_identity; |
} |
+ |
+ TransformCache& transformCache = getTransformCache(ancestorTransformNode); |
const TransformPaintPropertyNode* transformNode = localTransformNode; |
Vector<const TransformPaintPropertyNode*> intermediateNodes; |
@@ -367,13 +388,11 @@ |
// Stop if we've found a memoized (precomputed) transform for any particular |
// node. |
while (transformNode && transformNode != ancestorTransformNode) { |
- if (const TransformationMatrix* cachedMatrix = |
- transformNode->getTransformCache().getCachedTransform( |
- ancestorTransformNode)) { |
- transformMatrix = *cachedMatrix; |
+ auto it = transformCache.find(transformNode); |
+ if (it != transformCache.end()) { |
+ transformMatrix = it->value; |
break; |
} |
- |
intermediateNodes.push_back(transformNode); |
transformNode = transformNode->parent(); |
} |
@@ -389,20 +408,15 @@ |
TransformationMatrix localTransformMatrix = (*it)->matrix(); |
localTransformMatrix.applyTransformOrigin((*it)->origin()); |
transformMatrix = transformMatrix * localTransformMatrix; |
- (*it)->getTransformCache().setCachedTransform(ancestorTransformNode, |
- transformMatrix); |
+ transformCache.set(*it, transformMatrix); |
} |
success = true; |
- const TransformationMatrix* cachedMatrix = |
- localTransformNode->getTransformCache().getCachedTransform( |
- ancestorTransformNode); |
- DCHECK(cachedMatrix); |
- return *cachedMatrix; |
+ return transformCache.find(localTransformNode)->value; |
} |
void GeometryMapper::clearCache() { |
- GeometryMapperTransformCache::clearCache(); |
- GeometryMapperClipCache::clearCache(); |
+ m_transformCache.clear(); |
+ m_clipCache.clear(); |
} |
namespace { |