| 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 e61aa3bba93e5866c730e592ece114b5d73630e1..7b394451d4246bb90fc40751b97afc62c419d205 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/paint/GeometryMapper.cpp
|
| @@ -94,6 +94,11 @@ FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
|
| return rect;
|
| }
|
|
|
| + if (localState.effect() != ancestorState.effect()) {
|
| + return slowLocalToAncestorVisualRectWithEffects(rect, localState,
|
| + ancestorState, success);
|
| + }
|
| +
|
| const auto& transformMatrix = localToAncestorMatrixInternal(
|
| localState.transform(), ancestorState.transform(), success);
|
| if (!success)
|
| @@ -119,6 +124,47 @@ FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
|
| return clipRect;
|
| }
|
|
|
| +FloatClipRect GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
|
| + const FloatRect& rect,
|
| + const PropertyTreeState& localState,
|
| + const PropertyTreeState& ancestorState,
|
| + 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()) {
|
| + if (!effect->hasFilterThatMovesPixels())
|
| + continue;
|
| +
|
| + PropertyTreeState transformAndClipState(effect->localTransformSpace(),
|
| + effect->outputClip(), nullptr);
|
| + bool hasRadius = result.hasRadius();
|
| + result = sourceToDestinationVisualRectInternal(
|
| + result.rect(), lastTransformAndClipState, transformAndClipState,
|
| + success);
|
| + hasRadius |= result.hasRadius();
|
| + if (!success) {
|
| + result.setHasRadius(hasRadius);
|
| + return result;
|
| + }
|
| +
|
| + result = effect->mapRect(result.rect());
|
| + result.setHasRadius(hasRadius);
|
| + lastTransformAndClipState = transformAndClipState;
|
| + }
|
| +
|
| + PropertyTreeState finalTransformAndClipState(ancestorState.transform(),
|
| + ancestorState.clip(), nullptr);
|
| + bool hasRadius = result.hasRadius();
|
| + result = sourceToDestinationVisualRectInternal(
|
| + result.rect(), lastTransformAndClipState, finalTransformAndClipState,
|
| + success);
|
| + result.setHasRadius(hasRadius || result.hasRadius());
|
| + return result;
|
| +}
|
| +
|
| FloatRect GeometryMapper::localToAncestorRect(
|
| const FloatRect& rect,
|
| const TransformPaintPropertyNode* localTransformNode,
|
|
|