| Index: third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
|
| index f5c326788aeb94a6b27ecc824f1da301c56cdf16..b4840efa133860932ac436c58447e10f0ee7bac2 100644
|
| --- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
|
| @@ -11,59 +11,76 @@
|
| #include "core/layout/LayoutObject.h"
|
| #include "core/layout/LayoutTable.h"
|
| #include "core/layout/svg/SVGLayoutSupport.h"
|
| +#include "core/paint/ObjectPaintProperties.h"
|
| #include "core/paint/PaintLayer.h"
|
| #include "core/paint/PaintLayerScrollableArea.h"
|
| +#include "core/paint/PaintPropertyTreeBuilder.h"
|
|
|
| namespace blink {
|
|
|
| -void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const LayoutObject& object, LayoutRect& rect) const
|
| +// TODO(wangxianzhu): Combine this into PaintInvalidator::mapLocalRectToPaintInvalidationBacking() when removing PaintInvalidationState.
|
| +static LayoutRect mapLocalRectToPaintInvalidationBacking(GeometryMapper& geometryMapper, const LayoutObject& object, const FloatRect& localRect, const PaintInvalidatorContext& context)
|
| {
|
| - // TODO(wangxianzhu): For now this is the same as the slow path in PaintInvalidationState.cpp
|
| - // (slowMapToVisualRectInAncestorSpace()). Should implement this with GeometryMapper.
|
| + // TODO(wkorman): The flip below is required because visual rects are
|
| + // currently in "physical coordinates with flipped block-flow direction"
|
| + // (see LayoutBoxModelObject.h) but we need them to be in physical
|
| + // coordinates.
|
| + FloatRect rect = localRect;
|
| if (object.isBox())
|
| toLayoutBox(object).flipForWritingMode(rect);
|
|
|
| - if (object.isLayoutView())
|
| - toLayoutView(object).mapToVisualRectInAncestorSpace(paintInvalidationContainer, rect, InputIsInFrameCoordinates, DefaultVisualRectFlags);
|
| - else
|
| - object.mapToVisualRectInAncestorSpace(paintInvalidationContainer, rect);
|
| + LayoutRect result;
|
| + if (object == context.paintInvalidationContainer) {
|
| + result = LayoutRect(rect);
|
| + } else {
|
| + rect.moveBy(FloatPoint(context.treeBuilderContext.current.paintOffset));
|
| +
|
| + bool success = false;
|
| + PropertyTreeState currentTreeState(context.treeBuilderContext.current.transform, context.treeBuilderContext.current.clip, context.treeBuilderContext.currentEffect);
|
| + const PropertyTreeState& containerTreeState = context.paintInvalidationContainer->objectPaintProperties()->localBorderBoxProperties()->propertyTreeState;
|
| + result = LayoutRect(geometryMapper.mapToVisualRectInDestinationSpace(rect, currentTreeState, containerTreeState, success));
|
| + DCHECK(success);
|
| + }
|
| +
|
| + if (context.paintInvalidationContainer->layer()->groupedMapping())
|
| + PaintLayer::mapRectInPaintInvalidationContainerToBacking(*context.paintInvalidationContainer, result);
|
| + return result;
|
| }
|
|
|
| -static LayoutRect computePaintInvalidationRectInBacking(const LayoutObject& object, const PaintInvalidatorContext& context)
|
| +void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const LayoutObject& object, LayoutRect& rect) const
|
| {
|
| - if (object.isSVG() && !object.isSVGRoot()) {
|
| - // TODO(wangxianzhu): For now this is the same as the slow path in PaintInvalidationState.cpp
|
| - // (PaintInvalidationState::computePaintInvalidationRectInBackingForSVG()). Should implement this with GeometryMapper.
|
| - LayoutRect rect = SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(object, *context.paintInvalidationContainer);
|
| - if (context.paintInvalidationContainer->layer()->groupedMapping())
|
| - PaintLayer::mapRectInPaintInvalidationContainerToBacking(*context.paintInvalidationContainer, rect);
|
| - return rect;
|
| - }
|
| + GeometryMapper geometryMapper;
|
| + rect = blink::mapLocalRectToPaintInvalidationBacking(geometryMapper, object, FloatRect(rect), *this);
|
| +}
|
|
|
| - LayoutRect rect = object.localOverflowRectForPaintInvalidation();
|
| - context.mapLocalRectToPaintInvalidationBacking(object, rect);
|
| - return rect;
|
| +LayoutRect PaintInvalidator::mapLocalRectToPaintInvalidationBacking(const LayoutObject& object, const FloatRect& localRect, const PaintInvalidatorContext& context)
|
| +{
|
| + return blink::mapLocalRectToPaintInvalidationBacking(m_geometryMapper, object, localRect, context);
|
| }
|
|
|
| -static LayoutPoint computeLocationFromPaintInvalidationBacking(const LayoutObject& object, const PaintInvalidatorContext& context)
|
| +LayoutRect PaintInvalidator::computePaintInvalidationRectInBacking(const LayoutObject& object, const PaintInvalidatorContext& context)
|
| +{
|
| + FloatRect localRect;
|
| + if (object.isSVG() && !object.isSVGRoot())
|
| + localRect = SVGLayoutSupport::localOverflowRectForPaintInvalidation(object);
|
| + else
|
| + localRect = FloatRect(object.localOverflowRectForPaintInvalidation());
|
| +
|
| + return mapLocalRectToPaintInvalidationBacking(object, localRect, context);
|
| +}
|
| +
|
| +LayoutPoint PaintInvalidator::computeLocationFromPaintInvalidationBacking(const LayoutObject& object, const PaintInvalidatorContext& context)
|
| {
|
| - // TODO(wangxianzhu): For now this is the same as the slow path in PaintInvalidationState.cpp
|
| - // (slowLocalToAncestorPoint()). Should implement this with GeometryMapper.
|
| FloatPoint point;
|
| if (object != context.paintInvalidationContainer) {
|
| - if (object.isLayoutView()) {
|
| - point = toLayoutView(object).localToAncestorPoint(point, context.paintInvalidationContainer, TraverseDocumentBoundaries | InputIsInFrameCoordinates);
|
| - } else {
|
| - point = object.localToAncestorPoint(point, context.paintInvalidationContainer, TraverseDocumentBoundaries);
|
| - // Paint invalidation does not include scroll of paintInvalidationContainer.
|
| - if (context.paintInvalidationContainer->isBox()) {
|
| - const LayoutBox* box = toLayoutBox(context.paintInvalidationContainer);
|
| - if (box->hasOverflowClip())
|
| - point.move(box->scrolledContentOffset());
|
| - }
|
| - }
|
| - }
|
| + point.moveBy(FloatPoint(context.treeBuilderContext.current.paintOffset));
|
|
|
| + bool success = false;
|
| + PropertyTreeState currentTreeState(context.treeBuilderContext.current.transform, context.treeBuilderContext.current.clip, context.treeBuilderContext.currentEffect);
|
| + const PropertyTreeState& containerTreeState = context.paintInvalidationContainer->objectPaintProperties()->localBorderBoxProperties()->propertyTreeState;
|
| + point = m_geometryMapper.mapRectToDestinationSpace(FloatRect(point, FloatSize()), currentTreeState, containerTreeState, success).location();
|
| + DCHECK(success);
|
| + }
|
|
|
| if (context.paintInvalidationContainer->layer()->groupedMapping())
|
| PaintLayer::mapPointInPaintInvalidationContainerToBacking(*context.paintInvalidationContainer, point);
|
| @@ -71,7 +88,7 @@ static LayoutPoint computeLocationFromPaintInvalidationBacking(const LayoutObjec
|
| return LayoutPoint(point);
|
| }
|
|
|
| -static void updatePaintingLayer(const LayoutObject& object, PaintInvalidatorContext& context)
|
| +void PaintInvalidator::updatePaintingLayer(const LayoutObject& object, PaintInvalidatorContext& context)
|
| {
|
| if (object.hasLayer() && toLayoutBoxModelObject(object).hasSelfPaintingLayer())
|
| context.paintingLayer = toLayoutBoxModelObject(object).layer();
|
| @@ -98,7 +115,7 @@ static void updatePaintingLayer(const LayoutObject& object, PaintInvalidatorCont
|
| }
|
| }
|
|
|
| -static void updateContext(const LayoutObject& object, PaintInvalidatorContext& context)
|
| +void PaintInvalidator::updateContext(const LayoutObject& object, PaintInvalidatorContext& context)
|
| {
|
| if (object.isPaintInvalidationContainer()) {
|
| context.paintInvalidationContainer = toLayoutBoxModelObject(&object);
|
|
|