Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Unified Diff: third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp

Issue 2745563004: Reduce copying of local data structures in GeometryMapper and PaintLayerClipper. (Closed)
Patch Set: none Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..6258d642b44163697b80df40d37b24c93ed689c8 100644
--- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
+++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
@@ -9,27 +9,26 @@
namespace blink {
-FloatClipRect GeometryMapper::sourceToDestinationVisualRect(
- const FloatRect& rect,
+void GeometryMapper::sourceToDestinationVisualRect(
const PropertyTreeState& sourceState,
- const PropertyTreeState& destinationState) {
+ const PropertyTreeState& destinationState,
+ FloatRect& rect) {
bool success = false;
- FloatClipRect result = sourceToDestinationVisualRectInternal(
- rect, sourceState, destinationState, success);
+ sourceToDestinationVisualRectInternal(sourceState, destinationState, rect,
+ success);
DCHECK(success);
- return result;
}
-FloatClipRect GeometryMapper::sourceToDestinationVisualRectInternal(
- const FloatRect& rect,
+void GeometryMapper::sourceToDestinationVisualRectInternal(
const PropertyTreeState& sourceState,
const PropertyTreeState& destinationState,
+ FloatRect& mappingRect,
bool& success) {
- FloatClipRect result = localToAncestorVisualRectInternal(
- rect, sourceState, destinationState, success);
+ localToAncestorVisualRectInternal(sourceState, destinationState, mappingRect,
+ success);
// Success if destinationState is an ancestor state.
if (success)
- return result;
+ return;
// Otherwise first map to the lowest common ancestor, then map to destination.
const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor(
@@ -42,78 +41,75 @@ FloatClipRect GeometryMapper::sourceToDestinationVisualRectInternal(
PropertyTreeState lcaState = destinationState;
lcaState.setTransform(lcaTransform);
- result =
- localToAncestorVisualRectInternal(rect, sourceState, lcaState, success);
+ localToAncestorVisualRectInternal(sourceState, lcaState, mappingRect,
+ success);
if (!success)
- return result;
- if (!result.isInfinite()) {
- FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
- destinationState.transform());
- result.setRect(final);
- }
- return result;
+ return;
+
+ ancestorToLocalRect(lcaTransform, destinationState.transform(), mappingRect);
}
-FloatRect GeometryMapper::sourceToDestinationRect(
- const FloatRect& rect,
+void GeometryMapper::sourceToDestinationRect(
const TransformPaintPropertyNode* sourceTransformNode,
- const TransformPaintPropertyNode* destinationTransformNode) {
+ const TransformPaintPropertyNode* destinationTransformNode,
+ FloatRect& mappingRect) {
bool success = false;
- FloatRect result = localToAncestorRectInternal(
- rect, sourceTransformNode, destinationTransformNode, success);
+ localToAncestorRectInternal(sourceTransformNode, destinationTransformNode,
+ mappingRect, success);
// Success if destinationTransformNode is an ancestor of sourceTransformNode.
if (success)
- return result;
+ return;
// Otherwise first map to the least common ancestor, then map to destination.
const TransformPaintPropertyNode* lcaTransform =
lowestCommonAncestor(sourceTransformNode, destinationTransformNode);
DCHECK(lcaTransform);
- FloatRect lcaRect =
- localToAncestorRect(rect, sourceTransformNode, lcaTransform);
- return ancestorToLocalRect(lcaRect, lcaTransform, destinationTransformNode);
+ localToAncestorRect(sourceTransformNode, lcaTransform, mappingRect);
+ ancestorToLocalRect(lcaTransform, destinationTransformNode, mappingRect);
}
-FloatClipRect GeometryMapper::localToAncestorVisualRect(
- const FloatRect& rect,
+void GeometryMapper::localToAncestorVisualRect(
const PropertyTreeState& localState,
- const PropertyTreeState& ancestorState) {
+ const PropertyTreeState& ancestorState,
+ FloatRect& mappingRect) {
bool success = false;
- FloatClipRect result = localToAncestorVisualRectInternal(
- rect, localState, ancestorState, success);
+ localToAncestorVisualRectInternal(localState, ancestorState, mappingRect,
+ success);
DCHECK(success);
- return result;
}
-FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
- const FloatRect& rect,
+void GeometryMapper::localToAncestorVisualRectInternal(
const PropertyTreeState& localState,
const PropertyTreeState& ancestorState,
+ FloatRect& rectToMap,
bool& success) {
if (localState == ancestorState) {
success = true;
- return rect;
+ return;
}
if (localState.effect() != ancestorState.effect()) {
- return slowLocalToAncestorVisualRectWithEffects(rect, localState,
- ancestorState, success);
+ slowLocalToAncestorVisualRectWithEffects(localState, ancestorState,
+ rectToMap, success);
+ return;
}
const auto& transformMatrix = localToAncestorMatrixInternal(
localState.transform(), ancestorState.transform(), success);
- if (!success)
- return rect;
+ if (!success) {
+ return;
+ }
- FloatRect mappedRect = transformMatrix.mapRect(rect);
+ FloatRect mappedRect = transformMatrix.mapRect(rectToMap);
- FloatClipRect clipRect =
+ const FloatClipRect& clipRect =
localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(),
ancestorState.transform(), success);
if (success) {
- clipRect.intersect(mappedRect);
+ rectToMap = clipRect.rect();
+ rectToMap.intersect(mappedRect);
} else 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
@@ -123,18 +119,15 @@ FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
// Ignore it for SPv1 for now.
success = true;
}
-
- return clipRect;
}
-FloatClipRect GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
- const FloatRect& rect,
+void GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
const PropertyTreeState& localState,
const PropertyTreeState& ancestorState,
+ FloatRect& mappingRect,
bool& success) {
PropertyTreeState lastTransformAndClipState(localState.transform(),
localState.clip(), nullptr);
- FloatClipRect result(rect);
for (const auto* effect = localState.effect();
effect && effect != ancestorState.effect(); effect = effect->parent()) {
@@ -143,75 +136,62 @@ FloatClipRect GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
PropertyTreeState transformAndClipState(effect->localTransformSpace(),
effect->outputClip(), nullptr);
- bool hasRadius = result.hasRadius();
- result = sourceToDestinationVisualRectInternal(
- result.rect(), lastTransformAndClipState, transformAndClipState,
- success);
- hasRadius |= result.hasRadius();
- if (!success) {
- if (hasRadius)
- result.setHasRadius();
- return result;
- }
+ sourceToDestinationVisualRectInternal(
+ lastTransformAndClipState, transformAndClipState, mappingRect, success);
+ if (!success)
+ return;
- result = effect->mapRect(result.rect());
- if (hasRadius)
- result.setHasRadius();
+ mappingRect = effect->mapRect(mappingRect);
lastTransformAndClipState = transformAndClipState;
}
PropertyTreeState finalTransformAndClipState(ancestorState.transform(),
ancestorState.clip(), nullptr);
- bool hasRadius = result.hasRadius();
- result = sourceToDestinationVisualRectInternal(
- result.rect(), lastTransformAndClipState, finalTransformAndClipState,
- success);
- if (hasRadius || result.hasRadius())
- result.setHasRadius();
- return result;
+ sourceToDestinationVisualRectInternal(lastTransformAndClipState,
+ finalTransformAndClipState, mappingRect,
+ success);
}
-FloatRect GeometryMapper::localToAncestorRect(
- const FloatRect& rect,
+void GeometryMapper::localToAncestorRect(
const TransformPaintPropertyNode* localTransformNode,
- const TransformPaintPropertyNode* ancestorTransformNode) {
+ const TransformPaintPropertyNode* ancestorTransformNode,
+ FloatRect& mappingRect) {
bool success = false;
- FloatRect result = localToAncestorRectInternal(
- rect, localTransformNode, ancestorTransformNode, success);
+ localToAncestorRectInternal(localTransformNode, ancestorTransformNode,
+ mappingRect, success);
DCHECK(success);
- return result;
}
-FloatRect GeometryMapper::localToAncestorRectInternal(
- const FloatRect& rect,
+void GeometryMapper::localToAncestorRectInternal(
const TransformPaintPropertyNode* localTransformNode,
const TransformPaintPropertyNode* ancestorTransformNode,
+ FloatRect& mappingRect,
bool& success) {
if (localTransformNode == ancestorTransformNode) {
success = true;
- return rect;
+ return;
}
const auto& transformMatrix = localToAncestorMatrixInternal(
localTransformNode, ancestorTransformNode, success);
if (!success)
- return rect;
- return transformMatrix.mapRect(rect);
+ return;
+ mappingRect = transformMatrix.mapRect(mappingRect);
}
-FloatRect GeometryMapper::ancestorToLocalRect(
- const FloatRect& rect,
+void GeometryMapper::ancestorToLocalRect(
const TransformPaintPropertyNode* ancestorTransformNode,
- const TransformPaintPropertyNode* localTransformNode) {
+ const TransformPaintPropertyNode* localTransformNode,
+ FloatRect& rect) {
if (localTransformNode == ancestorTransformNode)
- return rect;
+ return;
const auto& transformMatrix =
localToAncestorMatrix(localTransformNode, ancestorTransformNode);
DCHECK(transformMatrix.isInvertible());
// TODO(chrishtr): Cache the inverse?
- return transformMatrix.inverse().mapRect(rect);
+ rect = transformMatrix.inverse().mapRect(rect);
}
FloatClipRect GeometryMapper::localToAncestorClipRect(
@@ -227,22 +207,22 @@ FloatClipRect GeometryMapper::localToAncestorClipRect(
return result;
}
-FloatClipRect GeometryMapper::sourceToDestinationClipRect(
+const FloatClipRect& GeometryMapper::sourceToDestinationClipRect(
const PropertyTreeState& sourceState,
const PropertyTreeState& destinationState) {
bool success = false;
- FloatClipRect result = sourceToDestinationClipRectInternal(
+ const FloatClipRect& result = sourceToDestinationClipRectInternal(
sourceState, destinationState, success);
DCHECK(success);
return result;
}
-FloatClipRect GeometryMapper::sourceToDestinationClipRectInternal(
+const FloatClipRect& GeometryMapper::sourceToDestinationClipRectInternal(
const PropertyTreeState& sourceState,
const PropertyTreeState& destinationState,
bool& success) {
- FloatClipRect result = localToAncestorClipRectInternal(
+ const FloatClipRect& result = localToAncestorClipRectInternal(
sourceState.clip(), destinationState.clip(), destinationState.transform(),
success);
// Success if destinationState is an ancestor state.
@@ -261,8 +241,8 @@ FloatClipRect GeometryMapper::sourceToDestinationClipRectInternal(
PropertyTreeState lcaState = destinationState;
lcaState.setTransform(lcaTransform);
- result = localToAncestorClipRectInternal(sourceState.clip(), lcaState.clip(),
- lcaState.transform(), success);
+ const FloatClipRect& result2 = localToAncestorClipRectInternal(
+ sourceState.clip(), lcaState.clip(), lcaState.transform(), success);
if (!success) {
if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
// On SPv1 we may fail when the paint invalidation container creates an
@@ -273,14 +253,17 @@ FloatClipRect GeometryMapper::sourceToDestinationClipRectInternal(
// Ignore it for SPv1 for now.
success = true;
}
- return result;
+ return result2;
}
- if (!result.isInfinite()) {
- FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
- destinationState.transform());
- result.setRect(final);
+ if (!result2.isInfinite()) {
+ FloatRect rect = result2.rect();
+ ancestorToLocalRect(lcaTransform, destinationState.transform(), rect);
+ m_tempRect.setRect(rect);
+ if (result2.hasRadius())
+ m_tempRect.setHasRadius();
+ return m_tempRect;
}
- return result;
+ return result2;
}
const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal(
@@ -329,6 +312,7 @@ const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal(
clip.intersect(mappedRect);
if ((*it)->clipRect().isRounded())
clip.setHasRadius();
+
(*it)->getClipCache().setCachedClip(clipAndTransform, clip);
}
@@ -337,6 +321,7 @@ const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal(
const FloatClipRect* cachedClip =
descendant->getClipCache().getCachedClip(clipAndTransform);
DCHECK(cachedClip);
+ CHECK(clip.hasRadius() == cachedClip->hasRadius());
return *cachedClip;
}

Powered by Google App Engine
This is Rietveld 408576698