Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
index 34b7942e959e2e6c6f757736832a8ca09f7c4a95..ced31e0017a8c47e82ca52ff038562d1552d2a04 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp |
@@ -215,17 +215,18 @@ void PaintPropertyTreeBuilder::updateProperties( |
frameView.setTotalPropertyTreeStateForContents(std::move(contentsState)); |
} |
-void PaintPropertyTreeBuilder::updatePaintOffsetTranslation( |
+static bool calculatePaintOffsetTranslation( |
const LayoutObject& object, |
- PaintPropertyTreeBuilderContext& context) { |
+ const LayoutPoint& paintOffset, |
+ IntPoint& roundedPaintOffset, |
+ LayoutPoint& fractionalPaintOffset) { |
bool usesPaintOffsetTranslation = false; |
if (RuntimeEnabledFeatures::rootLayerScrollingEnabled() && |
object.isLayoutView()) { |
// Root layer scrolling always creates a translation node for LayoutView to |
// ensure fixed and absolute contexts use the correct transform space. |
usesPaintOffsetTranslation = true; |
- } else if (object.isBoxModelObject() && |
- context.current.paintOffset != LayoutPoint()) { |
+ } else if (object.isBoxModelObject() && paintOffset != LayoutPoint()) { |
PaintLayer* layer = toLayoutBoxModelObject(object).layer(); |
if (layer && |
layer->paintsWithTransform(GlobalPaintFlattenCompositingLayers)) |
@@ -239,10 +240,22 @@ void PaintPropertyTreeBuilder::updatePaintOffsetTranslation( |
// called "subpixel accumulation". For more information, see |
// PaintLayer::subpixelAccumulation() and |
// PaintLayerPainter::paintFragmentByApplyingTransform. |
- IntPoint roundedPaintOffset = roundedIntPoint(context.current.paintOffset); |
- LayoutPoint fractionalPaintOffset = |
- LayoutPoint(context.current.paintOffset - roundedPaintOffset); |
+ if (usesPaintOffsetTranslation) { |
+ roundedPaintOffset = roundedIntPoint(paintOffset); |
+ fractionalPaintOffset = LayoutPoint(paintOffset - roundedPaintOffset); |
+ } |
+ |
+ return usesPaintOffsetTranslation; |
+} |
+void PaintPropertyTreeBuilder::updatePaintOffsetTranslation( |
+ const LayoutObject& object, |
+ PaintPropertyTreeBuilderContext& context) { |
+ IntPoint roundedPaintOffset; |
+ LayoutPoint fractionalPaintOffset; |
+ bool usesPaintOffsetTranslation = calculatePaintOffsetTranslation( |
+ object, context.current.paintOffset, roundedPaintOffset, |
+ fractionalPaintOffset); |
if (object.needsPaintPropertyUpdate() || context.forceSubtreeUpdate) { |
if (usesPaintOffsetTranslation) { |
auto& properties = object.getMutableForPainting().ensurePaintProperties(); |
@@ -863,7 +876,7 @@ void PaintPropertyTreeBuilder::updateOutOfFlowContext( |
} |
} |
-void PaintPropertyTreeBuilder::updateContextForBoxPosition( |
+void PaintPropertyTreeBuilder::updateContextForLocation( |
const LayoutObject& object, |
PaintPropertyTreeBuilderContext& context) { |
if (!object.isBoxModelObject()) |
@@ -930,15 +943,29 @@ void PaintPropertyTreeBuilder::updateContextForBoxPosition( |
} |
} |
+ IntPoint roundedPaintOffset; |
+ LayoutPoint paintOffsetAfterTranslation = context.current.paintOffset; |
+ if (calculatePaintOffsetTranslation( |
+ toLayoutBoxModelObject(object), context.current.paintOffset, |
+ roundedPaintOffset, paintOffsetAfterTranslation)) { |
+ const auto* properties = object.paintProperties(); |
+ if (!properties || !properties->paintOffsetTranslation() || |
+ properties->paintOffsetTranslation()->matrix().to2DTranslation() != |
+ FloatSize(roundedPaintOffset.x(), roundedPaintOffset.y())) |
+ object.getMutableForPainting().setNeedsPaintPropertyUpdate(); |
+ } |
+ |
// Many paint properties depend on paint offset so we force an update of |
// the entire subtree on paint offset changes. |
- if (object.paintOffset() != context.current.paintOffset) |
+ if (object.paintOffset() != paintOffsetAfterTranslation) |
context.forceSubtreeUpdate = true; |
} |
void PaintPropertyTreeBuilder::updatePropertiesForSelf( |
const LayoutObject& object, |
PaintPropertyTreeBuilderContext& context) { |
+ updateContextForLocation(object, context); |
+ |
#if DCHECK_IS_ON() |
FindObjectPropertiesNeedingUpdateScope checkNeedsUpdateScope(object, context); |
#endif |