diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-06 23:39:30 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-06 23:39:30 +0000 |
commit | dd0158145384339de1e7a34267401a9dc57f1ed9 (patch) | |
tree | 7f9fac4ebab0e236ccd709c0c770370bf9d42a80 /chrome/renderer/paint_aggregator_unittest.cc | |
parent | 9fb1da3d87f9efae2351f006fd79242984dd31cd (diff) | |
download | chromium_src-dd0158145384339de1e7a34267401a9dc57f1ed9.zip chromium_src-dd0158145384339de1e7a34267401a9dc57f1ed9.tar.gz chromium_src-dd0158145384339de1e7a34267401a9dc57f1ed9.tar.bz2 |
Allow painting multiple paint rects.
Previously, if there was no scrolling, then we would always paint the union of
any invalidations. With this change, if the area of the invalidation rects is
sufficiently less than the area of the union, then we will just paint the
individual invalidation rects.
This may regress page cycler performance (see http://crbug.com/29589).
R=brettw
BUG=50303
TEST=updated unit tests
Review URL: http://codereview.chromium.org/5613002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68403 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/paint_aggregator_unittest.cc')
-rw-r--r-- | chrome/renderer/paint_aggregator_unittest.cc | 204 |
1 files changed, 133 insertions, 71 deletions
diff --git a/chrome/renderer/paint_aggregator_unittest.cc b/chrome/renderer/paint_aggregator_unittest.cc index 25503c8..3473dea 100644 --- a/chrome/renderer/paint_aggregator_unittest.cc +++ b/chrome/renderer/paint_aggregator_unittest.cc @@ -17,17 +17,41 @@ TEST(PaintAggregator, SingleInvalidation) { greg.InvalidateRect(rect); EXPECT_TRUE(greg.HasPendingUpdate()); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - ASSERT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_EQ(rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + ASSERT_EQ(1U, update.paint_rects.size()); + + EXPECT_EQ(rect, update.paint_rects[0]); } TEST(PaintAggregator, DoubleDisjointInvalidation) { PaintAggregator greg; - gfx::Rect r1(2, 4, 2, 4); - gfx::Rect r2(4, 2, 4, 2); + gfx::Rect r1(2, 4, 2, 40); + gfx::Rect r2(4, 2, 40, 2); + + greg.InvalidateRect(r1); + greg.InvalidateRect(r2); + + gfx::Rect expected_bounds = r1.Union(r2); + + EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); + + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(2U, update.paint_rects.size()); + + EXPECT_EQ(expected_bounds, update.GetPaintBounds()); +} + +TEST(PaintAggregator, DisjointInvalidationsCombined) { + PaintAggregator greg; + + gfx::Rect r1(2, 4, 2, 2); + gfx::Rect r2(4, 2, 2, 2); greg.InvalidateRect(r1); greg.InvalidateRect(r2); @@ -35,10 +59,13 @@ TEST(PaintAggregator, DoubleDisjointInvalidation) { gfx::Rect expected_bounds = r1.Union(r2); EXPECT_TRUE(greg.HasPendingUpdate()); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - ASSERT_EQ(2U, greg.GetPendingUpdate().paint_rects.size()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_EQ(expected_bounds, greg.GetPendingUpdate().GetPaintBounds()); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + ASSERT_EQ(1U, update.paint_rects.size()); + + EXPECT_EQ(expected_bounds, update.paint_rects[0]); } TEST(PaintAggregator, SingleScroll) { @@ -49,15 +76,18 @@ TEST(PaintAggregator, SingleScroll) { greg.ScrollRect(delta.x(), delta.y(), rect); EXPECT_TRUE(greg.HasPendingUpdate()); - EXPECT_TRUE(greg.GetPendingUpdate().paint_rects.empty()); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); + + EXPECT_TRUE(update.paint_rects.empty()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); - EXPECT_EQ(rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_EQ(rect, update.scroll_rect); - EXPECT_EQ(delta.x(), greg.GetPendingUpdate().scroll_delta.x()); - EXPECT_EQ(delta.y(), greg.GetPendingUpdate().scroll_delta.y()); + EXPECT_EQ(delta.x(), update.scroll_delta.x()); + EXPECT_EQ(delta.y(), update.scroll_delta.y()); - gfx::Rect resulting_damage = greg.GetPendingUpdate().GetScrollDamage(); + gfx::Rect resulting_damage = update.GetScrollDamage(); gfx::Rect expected_damage(1, 2, 1, 4); EXPECT_EQ(expected_damage, resulting_damage); } @@ -72,17 +102,20 @@ TEST(PaintAggregator, DoubleOverlappingScroll) { greg.ScrollRect(delta2.x(), delta2.y(), rect); EXPECT_TRUE(greg.HasPendingUpdate()); - EXPECT_TRUE(greg.GetPendingUpdate().paint_rects.empty()); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_EQ(rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_TRUE(update.paint_rects.empty()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + + EXPECT_EQ(rect, update.scroll_rect); gfx::Point expected_delta(delta1.x() + delta2.x(), delta1.y() + delta2.y()); - EXPECT_EQ(expected_delta.x(), greg.GetPendingUpdate().scroll_delta.x()); - EXPECT_EQ(expected_delta.y(), greg.GetPendingUpdate().scroll_delta.y()); + EXPECT_EQ(expected_delta.x(), update.scroll_delta.x()); + EXPECT_EQ(expected_delta.y(), update.scroll_delta.y()); - gfx::Rect resulting_damage = greg.GetPendingUpdate().GetScrollDamage(); + gfx::Rect resulting_damage = update.GetScrollDamage(); gfx::Rect expected_damage(1, 2, 2, 4); EXPECT_EQ(expected_damage, resulting_damage); } @@ -113,10 +146,13 @@ TEST(PaintAggregator, DiagonalScroll) { greg.ScrollRect(delta.x(), delta.y(), rect); EXPECT_TRUE(greg.HasPendingUpdate()); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - ASSERT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); + + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + ASSERT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(rect, update.paint_rects[0]); } TEST(PaintAggregator, ContainedPaintAfterScroll) { @@ -129,13 +165,15 @@ TEST(PaintAggregator, ContainedPaintAfterScroll) { greg.InvalidateRect(paint_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); // expecting a paint rect inside the scroll rect - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); - EXPECT_EQ(paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); + EXPECT_EQ(paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, ContainedPaintBeforeScroll) { @@ -148,15 +186,17 @@ TEST(PaintAggregator, ContainedPaintBeforeScroll) { greg.ScrollRect(2, 0, scroll_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); // Expecting a paint rect inside the scroll rect - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); paint_rect.Offset(2, 0); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); - EXPECT_EQ(paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); + EXPECT_EQ(paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, ContainedPaintsBeforeAndAfterScroll) { @@ -174,13 +214,15 @@ TEST(PaintAggregator, ContainedPaintsBeforeAndAfterScroll) { gfx::Rect expected_paint_rect = paint_rect2; EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); // Expecting a paint rect inside the scroll rect - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); - EXPECT_EQ(expected_paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); + EXPECT_EQ(expected_paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, LargeContainedPaintAfterScroll) { @@ -193,11 +235,13 @@ TEST(PaintAggregator, LargeContainedPaintAfterScroll) { greg.InvalidateRect(paint_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.paint_rects[0]); } TEST(PaintAggregator, LargeContainedPaintBeforeScroll) { @@ -210,11 +254,13 @@ TEST(PaintAggregator, LargeContainedPaintBeforeScroll) { greg.ScrollRect(0, 1, scroll_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.paint_rects[0]); } TEST(PaintAggregator, OverlappingPaintBeforeScroll) { @@ -229,11 +275,13 @@ TEST(PaintAggregator, OverlappingPaintBeforeScroll) { gfx::Rect expected_paint_rect = scroll_rect.Union(paint_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(expected_paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(expected_paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, OverlappingPaintAfterScroll) { @@ -248,11 +296,13 @@ TEST(PaintAggregator, OverlappingPaintAfterScroll) { gfx::Rect expected_paint_rect = scroll_rect.Union(paint_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_TRUE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(expected_paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(expected_paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, DisjointPaintBeforeScroll) { @@ -265,12 +315,14 @@ TEST(PaintAggregator, DisjointPaintBeforeScroll) { greg.ScrollRect(2, 0, scroll_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(paint_rect, greg.GetPendingUpdate().paint_rects[0]); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_EQ(paint_rect, update.paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); } TEST(PaintAggregator, DisjointPaintAfterScroll) { @@ -283,12 +335,14 @@ TEST(PaintAggregator, DisjointPaintAfterScroll) { greg.InvalidateRect(paint_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(paint_rect, greg.GetPendingUpdate().paint_rects[0]); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_EQ(paint_rect, update.paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); } TEST(PaintAggregator, ContainedPaintTrimmedByScroll) { @@ -304,12 +358,14 @@ TEST(PaintAggregator, ContainedPaintTrimmedByScroll) { gfx::Rect expected_paint_rect(6, 4, 4, 6); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(expected_paint_rect, greg.GetPendingUpdate().paint_rects[0]); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_EQ(expected_paint_rect, update.paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); } TEST(PaintAggregator, ContainedPaintEliminatedByScroll) { @@ -322,11 +378,13 @@ TEST(PaintAggregator, ContainedPaintEliminatedByScroll) { greg.ScrollRect(6, 0, scroll_rect); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_TRUE(greg.GetPendingUpdate().paint_rects.empty()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_TRUE(update.paint_rects.empty()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); + EXPECT_EQ(scroll_rect, update.scroll_rect); } TEST(PaintAggregator, ContainedPaintAfterScrollTrimmedByScrollDamage) { @@ -342,13 +400,15 @@ TEST(PaintAggregator, ContainedPaintAfterScrollTrimmedByScrollDamage) { gfx::Rect expected_paint_rect(4, 0, 2, 10); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_EQ(1U, greg.GetPendingUpdate().paint_rects.size()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_EQ(1U, update.paint_rects.size()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); - EXPECT_EQ(expected_scroll_damage, greg.GetPendingUpdate().GetScrollDamage()); - EXPECT_EQ(expected_paint_rect, greg.GetPendingUpdate().paint_rects[0]); + EXPECT_EQ(scroll_rect, update.scroll_rect); + EXPECT_EQ(expected_scroll_damage, update.GetScrollDamage()); + EXPECT_EQ(expected_paint_rect, update.paint_rects[0]); } TEST(PaintAggregator, ContainedPaintAfterScrollEliminatedByScrollDamage) { @@ -363,10 +423,12 @@ TEST(PaintAggregator, ContainedPaintAfterScrollEliminatedByScrollDamage) { gfx::Rect expected_scroll_damage(0, 0, 4, 10); EXPECT_TRUE(greg.HasPendingUpdate()); + PaintAggregator::PendingUpdate update; + greg.PopPendingUpdate(&update); - EXPECT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); - EXPECT_TRUE(greg.GetPendingUpdate().paint_rects.empty()); + EXPECT_FALSE(update.scroll_rect.IsEmpty()); + EXPECT_TRUE(update.paint_rects.empty()); - EXPECT_EQ(scroll_rect, greg.GetPendingUpdate().scroll_rect); - EXPECT_EQ(expected_scroll_damage, greg.GetPendingUpdate().GetScrollDamage()); + EXPECT_EQ(scroll_rect, update.scroll_rect); + EXPECT_EQ(expected_scroll_damage, update.GetScrollDamage()); } |