Commit d7356558 authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

Add VisualRectFlags parameter to LayoutObject::VisualRectInDocument()

Using the parameter, we can e.g. let the function go through the fast
path using GeometryMapper.

Change-Id: I8741e177e0691c11618160076da92725b756c366
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1564861Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#650490}
parent 9f634aab
......@@ -1410,10 +1410,10 @@ LayoutRect LayoutInline::LinesVisualOverflowBoundingBox() const {
return rect;
}
LayoutRect LayoutInline::VisualRectInDocument() const {
LayoutRect LayoutInline::VisualRectInDocument(VisualRectFlags flags) const {
if (!Continuation()) {
LayoutRect rect = VisualOverflowRect();
MapToVisualRectInAncestorSpace(View(), rect);
MapToVisualRectInAncestorSpace(View(), rect, flags);
return rect;
}
Vector<LayoutRect> outlines;
......@@ -1424,7 +1424,7 @@ LayoutRect LayoutInline::VisualRectInDocument() const {
for (const auto& outline : outlines)
context(outline);
LayoutRect int_result(EnclosingIntRect(float_result));
MapToVisualRectInAncestorSpace(View(), int_result);
MapToVisualRectInAncestorSpace(View(), int_result, flags);
return int_result;
}
......
......@@ -339,7 +339,9 @@ class CORE_EXPORT LayoutInline : public LayoutBoxModelObject {
LayoutUnit OffsetWidth() const final { return LinesBoundingBox().Width(); }
LayoutUnit OffsetHeight() const final { return LinesBoundingBox().Height(); }
LayoutRect VisualRectInDocument() const override;
LayoutRect VisualRectInDocument(
VisualRectFlags = kDefaultVisualRectFlags) const override;
// This method differs from visualOverflowRect in that it doesn't include the
// rects for culled inline boxes, which aren't necessary for paint
// invalidation.
......
......@@ -295,11 +295,10 @@ TEST_P(ParameterizedLayoutInlineTest, VisualRectInDocument) {
)HTML");
LayoutInline* target = ToLayoutInline(GetLayoutObjectByElementId("target"));
LayoutRect visual_rect = target->VisualRectInDocument();
EXPECT_EQ(visual_rect.X(), LayoutUnit(0));
EXPECT_EQ(visual_rect.Y(), LayoutUnit(20));
EXPECT_EQ(visual_rect.Width(), LayoutUnit(111));
EXPECT_EQ(visual_rect.Height(), LayoutUnit(222 + 20 * 2));
EXPECT_EQ(LayoutRect(0, 20, 111, 222 + 20 * 2),
target->VisualRectInDocument());
EXPECT_EQ(LayoutRect(0, 20, 111, 222 + 20 * 2),
target->VisualRectInDocument(kUseGeometryMapper));
}
// When adding focus ring rects, we should avoid adding duplicated rect for
......
......@@ -1755,9 +1755,9 @@ void LayoutObject::ClearPreviousVisualRects() {
SetShouldDoFullPaintInvalidation();
}
LayoutRect LayoutObject::VisualRectInDocument() const {
LayoutRect LayoutObject::VisualRectInDocument(VisualRectFlags flags) const {
LayoutRect rect = LocalVisualRect();
MapToVisualRectInAncestorSpace(View(), rect);
MapToVisualRectInAncestorSpace(View(), rect, flags);
return rect;
}
......
......@@ -1633,10 +1633,11 @@ class CORE_EXPORT LayoutObject : public ImageResourceObserver,
// a small region of a canvas changes.
void InvalidatePaintRectangle(const LayoutRect&);
// Returns the rect that should have paint invalidated whenever this object
// Returns the rect that should have raster invalidated whenever this object
// changes. The rect is in the coordinate space of the document's scrolling
// contents. This method deals with outlines and overflow.
virtual LayoutRect VisualRectInDocument() const;
virtual LayoutRect VisualRectInDocument(
VisualRectFlags = kDefaultVisualRectFlags) const;
// Returns the rect that should have raster invalidated whenever this object
// changes. The rect is in the object's local coordinate space. This is for
......
......@@ -116,8 +116,8 @@ const LayoutObject* LayoutSVGBlock::PushMappingToContainer(
geometry_map);
}
LayoutRect LayoutSVGBlock::VisualRectInDocument() const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View());
LayoutRect LayoutSVGBlock::VisualRectInDocument(VisualRectFlags flags) const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View(), flags);
}
bool LayoutSVGBlock::MapToVisualRectInAncestorSpaceInternal(
......
......@@ -76,7 +76,7 @@ class LayoutSVGBlock : public LayoutBlockFlow {
// LayoutSVGBlock subclasses should use GetElement() instead.
void GetNode() const = delete;
LayoutRect VisualRectInDocument() const final;
LayoutRect VisualRectInDocument(VisualRectFlags) const final;
void AbsoluteRects(Vector<IntRect>&,
const LayoutPoint& accumulated_offset) const final;
......
......@@ -48,7 +48,9 @@ class LayoutSVGHiddenContainer : public LayoutSVGContainer {
bool PaintedOutputOfObjectHasNoEffectRegardlessOfSize() const final {
return true;
}
LayoutRect VisualRectInDocument() const final { return LayoutRect(); }
LayoutRect VisualRectInDocument(VisualRectFlags) const final {
return LayoutRect();
}
FloatRect VisualRectInLocalSVGCoordinates() const final {
return FloatRect();
}
......
......@@ -83,8 +83,8 @@ FloatRect LayoutSVGInline::VisualRectInLocalSVGCoordinates() const {
return FloatRect();
}
LayoutRect LayoutSVGInline::VisualRectInDocument() const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View());
LayoutRect LayoutSVGInline::VisualRectInDocument(VisualRectFlags flags) const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View(), flags);
}
void LayoutSVGInline::MapLocalToAncestor(const LayoutBoxModelObject* ancestor,
......
......@@ -47,7 +47,8 @@ class LayoutSVGInline : public LayoutInline {
FloatRect StrokeBoundingBox() const final;
FloatRect VisualRectInLocalSVGCoordinates() const final;
LayoutRect VisualRectInDocument() const final;
LayoutRect VisualRectInDocument(
VisualRectFlags = kDefaultVisualRectFlags) const final;
void MapLocalToAncestor(
const LayoutBoxModelObject* ancestor,
TransformState&,
......
......@@ -419,8 +419,9 @@ void LayoutSVGInlineText::ComputeNewScaledFontForStyle(
scaled_font.Update(document.GetStyleEngine().GetFontSelector());
}
LayoutRect LayoutSVGInlineText::VisualRectInDocument() const {
return Parent()->VisualRectInDocument();
LayoutRect LayoutSVGInlineText::VisualRectInDocument(
VisualRectFlags flags) const {
return Parent()->VisualRectInDocument(flags);
}
FloatRect LayoutSVGInlineText::VisualRectInLocalSVGCoordinates() const {
......
......@@ -78,7 +78,7 @@ class LayoutSVGInlineText final : public LayoutText {
LayoutRect LinesBoundingBox() const override;
InlineTextBox* CreateTextBox(int start, uint16_t length) override;
LayoutRect VisualRectInDocument() const final;
LayoutRect VisualRectInDocument(VisualRectFlags) const final;
FloatRect VisualRectInLocalSVGCoordinates() const final;
float scaling_factor_;
......
......@@ -54,8 +54,9 @@ void LayoutSVGModelObject::MapLocalToAncestor(
SVGLayoutSupport::MapLocalToAncestor(this, ancestor, transform_state, flags);
}
LayoutRect LayoutSVGModelObject::VisualRectInDocument() const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View());
LayoutRect LayoutSVGModelObject::VisualRectInDocument(
VisualRectFlags flags) const {
return SVGLayoutSupport::VisualRectInAncestorSpace(*this, *View(), flags);
}
void LayoutSVGModelObject::MapAncestorToLocal(
......
......@@ -47,7 +47,9 @@ class LayoutSVGModelObject : public LayoutObject {
bool IsChildAllowed(LayoutObject*, const ComputedStyle&) const override;
LayoutRect VisualRectInDocument() const override;
LayoutRect VisualRectInDocument(
VisualRectFlags = kDefaultVisualRectFlags) const override;
FloatRect VisualRectInLocalSVGCoordinates() const override {
return local_visual_rect_;
}
......
......@@ -76,10 +76,11 @@ FloatRect SVGLayoutSupport::LocalVisualRect(const LayoutObject& object) {
LayoutRect SVGLayoutSupport::VisualRectInAncestorSpace(
const LayoutObject& object,
const LayoutBoxModelObject& ancestor) {
const LayoutBoxModelObject& ancestor,
VisualRectFlags flags) {
LayoutRect rect;
MapToVisualRectInAncestorSpace(object, &ancestor, LocalVisualRect(object),
rect);
rect, flags);
return rect;
}
......
......@@ -98,7 +98,8 @@ class CORE_EXPORT SVGLayoutSupport {
static FloatRect LocalVisualRect(const LayoutObject&);
static LayoutRect VisualRectInAncestorSpace(
const LayoutObject&,
const LayoutBoxModelObject& ancestor);
const LayoutBoxModelObject& ancestor,
VisualRectFlags = kDefaultVisualRectFlags);
static LayoutRect TransformVisualRect(const LayoutObject&,
const AffineTransform&,
const FloatRect&);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment