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..0662c31b307f972ce00a1facc2076fd15880f056 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp |
@@ -11,59 +11,71 @@ |
#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" |
+#include "core/paint/PaintPropertyTreePrinter.h" |
chrishtr
2016/08/12 18:20:53
Remove
Xianzhu
2016/08/12 18:37:51
Done.
(BTW do you know how to make the functions
|
+#include "platform/graphics/paint/GeometryMapper.h" |
namespace blink { |
-void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const LayoutObject& object, LayoutRect& rect) const |
+static LayoutRect mapLocalRectToPaintInvalidationBacking(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)); |
chrishtr
2016/08/12 18:20:53
This does use GeometryMapper, but it's not efficie
Xianzhu
2016/08/12 18:37:51
Oh I didn't think this is an intermediate step. Wh
chrishtr
2016/08/12 18:40:28
All of the caching in GeometryMapper is stored as
Xianzhu
2016/08/12 19:16:29
Done.
|
+ DCHECK(success); |
+ } |
+ |
+ if (context.paintInvalidationContainer->layer()->groupedMapping()) |
+ PaintLayer::mapRectInPaintInvalidationContainerToBacking(*context.paintInvalidationContainer, result); |
+ return result; |
+} |
+ |
+void PaintInvalidatorContext::mapLocalRectToPaintInvalidationBacking(const LayoutObject& object, LayoutRect& rect) const |
+{ |
+ rect = blink::mapLocalRectToPaintInvalidationBacking(object, FloatRect(rect), *this); |
chrishtr
2016/08/12 18:20:53
What's the point of not inlining blink::mapLocalRe
Xianzhu
2016/08/12 18:37:51
Two reasons:
1. This method is for non-SVG path o
chrishtr
2016/08/12 18:40:28
ok
|
} |
static LayoutRect computePaintInvalidationRectInBacking(const LayoutObject& object, const PaintInvalidatorContext& context) |
{ |
- 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; |
- } |
+ FloatRect localRect; |
+ if (object.isSVG() && !object.isSVGRoot()) |
+ localRect = SVGLayoutSupport::localOverflowRectForPaintInvalidation(object); |
+ else |
+ localRect = FloatRect(object.localOverflowRectForPaintInvalidation()); |
- LayoutRect rect = object.localOverflowRectForPaintInvalidation(); |
- context.mapLocalRectToPaintInvalidationBacking(object, rect); |
- return rect; |
+ return mapLocalRectToPaintInvalidationBacking(object, localRect, context); |
} |
static LayoutPoint 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 = GeometryMapper().mapRectToDestinationSpace(FloatRect(point, FloatSize()), currentTreeState, containerTreeState, success).location(); |
+ DCHECK(success); |
+ } |
if (context.paintInvalidationContainer->layer()->groupedMapping()) |
PaintLayer::mapPointInPaintInvalidationContainerToBacking(*context.paintInvalidationContainer, point); |