From 5aeac688156a067eeac628f056e05065134fcc2e Mon Sep 17 00:00:00 2001 From: Chris Harrelson Date: Tue, 4 Dec 2018 19:12:52 +0000 Subject: [PATCH] [IO] Return correct non-empty value in slow path with effects. Previously, we always returned true for "is mapped rect non- empty?" from LocalToAncestorVisualRect in the presence of effect nodes which may move pixels. Now return true only if the actual computed rect is non-empty. Bug:910741 Change-Id: I41935060706b887f58ed14a179d8975bee02c39f Reviewed-on: https://chromium-review.googlesource.com/c/1359692 Reviewed-by: Xianzhu Wang Reviewed-by: Chris Harrelson Commit-Queue: Chris Harrelson Cr-Commit-Position: refs/heads/master@{#613625} --- .../platform/graphics/paint/geometry_mapper.cc | 2 +- .../graphics/paint/geometry_mapper_test.cc | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc index d9f8cd5c58588..8badee0817347 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc @@ -287,7 +287,7 @@ bool GeometryMapper::SlowLocalToAncestorVisualRectWithEffects( // Many effects (e.g. filters, clip-paths) can make a clip rect not tight. mapping_rect.ClearIsTight(); - return true; + return !mapping_rect.Rect().IsEmpty(); } FloatClipRect GeometryMapper::LocalToAncestorClipRect( diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc index 6747e7caefa69..5f610cc82da9f 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc @@ -394,6 +394,21 @@ TEST_P(GeometryMapperTest, SimpleClipInclusiveIntersect) { EXPECT_CLIP_RECT_EQ(FloatClipRect(FloatRect()), actual_clip_rect); } +TEST_P(GeometryMapperTest, SimpleClipPlusOpacity) { + auto clip = CreateClip(c0(), &t0(), FloatRoundedRect(10, 10, 50, 50)); + local_state.SetClip(clip.get()); + + auto opacity = CreateOpacityEffect(e0(), 0.99); + local_state.SetEffect(opacity.get()); + + FloatClipRect actual_clip_rect(FloatRect(60, 10, 10, 10)); + auto intersects = GeometryMapper::LocalToAncestorVisualRect( + local_state, ancestor_state, actual_clip_rect); + + EXPECT_TRUE(actual_clip_rect.Rect().IsEmpty()); + EXPECT_FALSE(intersects); +} + TEST_P(GeometryMapperTest, RoundedClip) { FloatRoundedRect rect(FloatRect(10, 10, 50, 50), FloatRoundedRect::Radii(FloatSize(1, 1), FloatSize(),