| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "platform/graphics/paint/DisplayItemList.h" | 6 #include "platform/graphics/paint/DisplayItemList.h" |
| 7 | 7 |
| 8 #include "platform/RuntimeEnabledFeatures.h" | 8 #include "platform/RuntimeEnabledFeatures.h" |
| 9 #include "platform/graphics/GraphicsContext.h" | 9 #include "platform/graphics/GraphicsContext.h" |
| 10 #include "platform/graphics/paint/CachedDisplayItem.h" | 10 #include "platform/graphics/paint/CachedDisplayItem.h" |
| 11 #include "platform/graphics/paint/ClipPathRecorder.h" | 11 #include "platform/graphics/paint/ClipPathRecorder.h" |
| 12 #include "platform/graphics/paint/ClipRecorder.h" | 12 #include "platform/graphics/paint/ClipRecorder.h" |
| 13 #include "platform/graphics/paint/DrawingDisplayItem.h" | 13 #include "platform/graphics/paint/DrawingDisplayItem.h" |
| 14 #include "platform/graphics/paint/DrawingRecorder.h" | 14 #include "platform/graphics/paint/DrawingRecorder.h" |
| 15 #include "platform/graphics/paint/SubsequenceRecorder.h" | 15 #include "platform/graphics/paint/SubsequenceRecorder.h" |
| 16 #include <gtest/gtest.h> | 16 #include <gtest/gtest.h> |
| 17 | 17 |
| 18 namespace blink { | 18 namespace blink { |
| 19 | 19 |
| 20 class DisplayItemListTest : public ::testing::Test { | 20 class DisplayItemListTest : public ::testing::Test { |
| 21 public: | 21 public: |
| 22 DisplayItemListTest() | 22 DisplayItemListTest() |
| 23 : m_originalSlimmingPaintV2Enabled(RuntimeEnabledFeatures::slimmingPaint
V2Enabled()) { } | 23 : m_displayItemList(DisplayItemList::create()) |
| 24 , m_originalSlimmingPaintV2Enabled(RuntimeEnabledFeatures::slimmingPaint
V2Enabled()) { } |
| 24 | 25 |
| 25 protected: | 26 protected: |
| 26 DisplayItemList& displayItemList() { return m_displayItemList; } | 27 DisplayItemList& displayItemList() { return *m_displayItemList; } |
| 27 const DisplayItems& newDisplayItemsBeforeUpdate() { return displayItemList()
.m_newDisplayItems; } | |
| 28 | 28 |
| 29 private: | 29 private: |
| 30 void SetUp() override | 30 void SetUp() override |
| 31 { | 31 { |
| 32 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); | 32 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); |
| 33 RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true); | 33 RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true); |
| 34 } | 34 } |
| 35 void TearDown() override | 35 void TearDown() override |
| 36 { | 36 { |
| 37 RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(m_originalSlimmingPain
tV2Enabled); | 37 RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(m_originalSlimmingPain
tV2Enabled); |
| 38 } | 38 } |
| 39 | 39 |
| 40 DisplayItemList m_displayItemList; | 40 OwnPtr<DisplayItemList> m_displayItemList; |
| 41 bool m_originalSlimmingPaintV2Enabled; | 41 bool m_originalSlimmingPaintV2Enabled; |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 const DisplayItem::Type foregroundDrawingType = static_cast<DisplayItem::Type>(D
isplayItem::DrawingPaintPhaseFirst + 4); | 44 const DisplayItem::Type foregroundDrawingType = static_cast<DisplayItem::Type>(D
isplayItem::DrawingPaintPhaseFirst + 4); |
| 45 const DisplayItem::Type backgroundDrawingType = DisplayItem::DrawingPaintPhaseFi
rst; | 45 const DisplayItem::Type backgroundDrawingType = DisplayItem::DrawingPaintPhaseFi
rst; |
| 46 const DisplayItem::Type clipType = DisplayItem::ClipFirst; | 46 const DisplayItem::Type clipType = DisplayItem::ClipFirst; |
| 47 | 47 |
| 48 class TestDisplayItemClient { | 48 class TestDisplayItemClient { |
| 49 public: | 49 public: |
| 50 TestDisplayItemClient(const String& name) | 50 TestDisplayItemClient(const String& name) |
| (...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 TestDisplayItem(container2, backgroundDrawingType), | 487 TestDisplayItem(container2, backgroundDrawingType), |
| 488 TestDisplayItem(content2, backgroundDrawingType), | 488 TestDisplayItem(content2, backgroundDrawingType), |
| 489 TestDisplayItem(content2, foregroundDrawingType), | 489 TestDisplayItem(content2, foregroundDrawingType), |
| 490 TestDisplayItem(container2, foregroundDrawingType), | 490 TestDisplayItem(container2, foregroundDrawingType), |
| 491 TestDisplayItem(container2, DisplayItem::EndSubsequence)); | 491 TestDisplayItem(container2, DisplayItem::EndSubsequence)); |
| 492 | 492 |
| 493 // Simulate the situation when container1 e.g. gets a z-index that is now gr
eater than container2. | 493 // Simulate the situation when container1 e.g. gets a z-index that is now gr
eater than container2. |
| 494 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, con
tainer2)); | 494 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, con
tainer2)); |
| 495 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, con
tainer1)); | 495 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context, con
tainer1)); |
| 496 | 496 |
| 497 EXPECT_DISPLAY_LIST(newDisplayItemsBeforeUpdate(), 2, | 497 EXPECT_DISPLAY_LIST(displayItemList().newDisplayItems(), 2, |
| 498 TestDisplayItem(container2, DisplayItem::CachedSubsequence), | 498 TestDisplayItem(container2, DisplayItem::CachedSubsequence), |
| 499 TestDisplayItem(container1, DisplayItem::CachedSubsequence)); | 499 TestDisplayItem(container1, DisplayItem::CachedSubsequence)); |
| 500 | 500 |
| 501 displayItemList().commitNewDisplayItems(); | 501 displayItemList().commitNewDisplayItems(); |
| 502 | 502 |
| 503 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 12, | 503 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 12, |
| 504 TestDisplayItem(container2, DisplayItem::BeginSubsequence), | 504 TestDisplayItem(container2, DisplayItem::BeginSubsequence), |
| 505 TestDisplayItem(container2, backgroundDrawingType), | 505 TestDisplayItem(container2, backgroundDrawingType), |
| 506 TestDisplayItem(content2, backgroundDrawingType), | 506 TestDisplayItem(content2, backgroundDrawingType), |
| 507 TestDisplayItem(content2, foregroundDrawingType), | 507 TestDisplayItem(content2, foregroundDrawingType), |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 5
0, 200)); | 601 drawRect(context, content2, foregroundDrawingType, FloatRect(100, 200, 5
0, 200)); |
| 602 } | 602 } |
| 603 // Repaint container1 with foreground only. | 603 // Repaint container1 with foreground only. |
| 604 { | 604 { |
| 605 EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context
, container1)); | 605 EXPECT_FALSE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context
, container1)); |
| 606 SubsequenceRecorder r(context, container1); | 606 SubsequenceRecorder r(context, container1); |
| 607 // Use cached subsequence of content1. | 607 // Use cached subsequence of content1. |
| 608 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context,
content1)); | 608 EXPECT_TRUE(SubsequenceRecorder::useCachedSubsequenceIfPossible(context,
content1)); |
| 609 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100,
100, 100)); | 609 drawRect(context, container1, foregroundDrawingType, FloatRect(100, 100,
100, 100)); |
| 610 } | 610 } |
| 611 EXPECT_DISPLAY_LIST(newDisplayItemsBeforeUpdate(), 7, | 611 EXPECT_DISPLAY_LIST(displayItemList().newDisplayItems(), 7, |
| 612 TestDisplayItem(content2, DisplayItem::BeginSubsequence), | 612 TestDisplayItem(content2, DisplayItem::BeginSubsequence), |
| 613 TestDisplayItem(content2, foregroundDrawingType), | 613 TestDisplayItem(content2, foregroundDrawingType), |
| 614 TestDisplayItem(content2, DisplayItem::EndSubsequence), | 614 TestDisplayItem(content2, DisplayItem::EndSubsequence), |
| 615 TestDisplayItem(container1, DisplayItem::BeginSubsequence), | 615 TestDisplayItem(container1, DisplayItem::BeginSubsequence), |
| 616 TestDisplayItem(content1, DisplayItem::CachedSubsequence), | 616 TestDisplayItem(content1, DisplayItem::CachedSubsequence), |
| 617 TestDisplayItem(container1, foregroundDrawingType), | 617 TestDisplayItem(container1, foregroundDrawingType), |
| 618 TestDisplayItem(container1, DisplayItem::EndSubsequence)); | 618 TestDisplayItem(container1, DisplayItem::EndSubsequence)); |
| 619 | 619 |
| 620 displayItemList().commitNewDisplayItems(); | 620 displayItemList().commitNewDisplayItems(); |
| 621 | 621 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 666 EXPECT_TRUE(displayItemList().clientCacheIsValid(multicol.displayItemClient(
))); | 666 EXPECT_TRUE(displayItemList().clientCacheIsValid(multicol.displayItemClient(
))); |
| 667 drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 200, 100,
100)); | 667 drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 200, 100,
100)); |
| 668 displayItemList().beginScope(); | 668 displayItemList().beginScope(); |
| 669 drawRect(context, content, foregroundDrawingType, rect1); | 669 drawRect(context, content, foregroundDrawingType, rect1); |
| 670 displayItemList().endScope(); | 670 displayItemList().endScope(); |
| 671 | 671 |
| 672 displayItemList().beginScope(); | 672 displayItemList().beginScope(); |
| 673 drawRect(context, content, foregroundDrawingType, rect2); | 673 drawRect(context, content, foregroundDrawingType, rect2); |
| 674 displayItemList().endScope(); | 674 displayItemList().endScope(); |
| 675 | 675 |
| 676 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[0].isCachedDrawing()); | 676 EXPECT_DISPLAY_LIST(displayItemList().newDisplayItems(), 3, |
| 677 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[1].isDrawing()); | 677 TestDisplayItem(multicol, DisplayItem::drawingTypeToCachedDrawingType(ba
ckgroundDrawingType)), |
| 678 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[2].isDrawing()); | 678 TestDisplayItem(content, foregroundDrawingType), |
| 679 TestDisplayItem(content, foregroundDrawingType)); |
| 680 |
| 679 displayItemList().commitNewDisplayItems(); | 681 displayItemList().commitNewDisplayItems(); |
| 680 | 682 |
| 681 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 3, | 683 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 3, |
| 682 TestDisplayItem(multicol, backgroundDrawingType), | 684 TestDisplayItem(multicol, backgroundDrawingType), |
| 683 TestDisplayItem(content, foregroundDrawingType), | 685 TestDisplayItem(content, foregroundDrawingType), |
| 684 TestDisplayItem(content, foregroundDrawingType)); | 686 TestDisplayItem(content, foregroundDrawingType)); |
| 685 EXPECT_NE(picture1, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[1]).picture()); | 687 EXPECT_NE(picture1, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[1]).picture()); |
| 686 EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[2]).picture()); | 688 EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[2]).picture()); |
| 687 | 689 |
| 688 // Now the multicol becomes 3 columns and repaints. | 690 // Now the multicol becomes 3 columns and repaints. |
| 689 displayItemList().invalidate(multicol); | 691 displayItemList().invalidate(multicol); |
| 690 drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 100, 100,
100)); | 692 drawRect(context, multicol, backgroundDrawingType, FloatRect(100, 100, 100,
100)); |
| 691 | 693 |
| 692 displayItemList().beginScope(); | 694 displayItemList().beginScope(); |
| 693 drawRect(context, content, foregroundDrawingType, rect1); | 695 drawRect(context, content, foregroundDrawingType, rect1); |
| 694 displayItemList().endScope(); | 696 displayItemList().endScope(); |
| 695 | 697 |
| 696 displayItemList().beginScope(); | 698 displayItemList().beginScope(); |
| 697 drawRect(context, content, foregroundDrawingType, rect2); | 699 drawRect(context, content, foregroundDrawingType, rect2); |
| 698 displayItemList().endScope(); | 700 displayItemList().endScope(); |
| 699 | 701 |
| 700 displayItemList().beginScope(); | 702 displayItemList().beginScope(); |
| 701 drawRect(context, content, foregroundDrawingType, rect3); | 703 drawRect(context, content, foregroundDrawingType, rect3); |
| 702 displayItemList().endScope(); | 704 displayItemList().endScope(); |
| 703 | 705 |
| 704 // We should repaint everything on invalidation of the scope container. | 706 // We should repaint everything on invalidation of the scope container. |
| 705 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[0].isDrawing()); | 707 EXPECT_DISPLAY_LIST(displayItemList().newDisplayItems(), 4, |
| 706 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[1].isDrawing()); | |
| 707 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[2].isDrawing()); | |
| 708 EXPECT_TRUE(newDisplayItemsBeforeUpdate()[3].isDrawing()); | |
| 709 displayItemList().commitNewDisplayItems(); | |
| 710 | |
| 711 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 4, | |
| 712 TestDisplayItem(multicol, backgroundDrawingType), | 708 TestDisplayItem(multicol, backgroundDrawingType), |
| 713 TestDisplayItem(content, foregroundDrawingType), | 709 TestDisplayItem(content, foregroundDrawingType), |
| 714 TestDisplayItem(content, foregroundDrawingType), | 710 TestDisplayItem(content, foregroundDrawingType), |
| 715 TestDisplayItem(content, foregroundDrawingType)); | 711 TestDisplayItem(content, foregroundDrawingType)); |
| 716 EXPECT_NE(picture1, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[1]).picture()); | 712 EXPECT_NE(picture1, static_cast<const DrawingDisplayItem&>(displayItemList()
.newDisplayItems()[1]).picture()); |
| 717 EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(displayItemList()
.displayItems()[2]).picture()); | 713 EXPECT_NE(picture2, static_cast<const DrawingDisplayItem&>(displayItemList()
.newDisplayItems()[2]).picture()); |
| 714 |
| 715 displayItemList().commitNewDisplayItems(); |
| 718 } | 716 } |
| 719 | 717 |
| 720 TEST_F(DisplayItemListTest, OptimizeNoopPairs) | 718 TEST_F(DisplayItemListTest, OptimizeNoopPairs) |
| 721 { | 719 { |
| 722 TestDisplayItemClient first("first"); | 720 TestDisplayItemClient first("first"); |
| 723 TestDisplayItemClient second("second"); | 721 TestDisplayItemClient second("second"); |
| 724 TestDisplayItemClient third("third"); | 722 TestDisplayItemClient third("third"); |
| 725 | 723 |
| 726 GraphicsContext context(&displayItemList()); | 724 GraphicsContext context(&displayItemList()); |
| 727 drawRect(context, first, backgroundDrawingType, FloatRect(0, 0, 100, 100)); | 725 drawRect(context, first, backgroundDrawingType, FloatRect(0, 0, 100, 100)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 drawRect(context, third, backgroundDrawingType, FloatRect(0, 0, 100, 100)); | 763 drawRect(context, third, backgroundDrawingType, FloatRect(0, 0, 100, 100)); |
| 766 displayItemList().commitNewDisplayItems(); | 764 displayItemList().commitNewDisplayItems(); |
| 767 | 765 |
| 768 // Empty clips should have been optimized out. | 766 // Empty clips should have been optimized out. |
| 769 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 2, | 767 EXPECT_DISPLAY_LIST(displayItemList().displayItems(), 2, |
| 770 TestDisplayItem(first, backgroundDrawingType), | 768 TestDisplayItem(first, backgroundDrawingType), |
| 771 TestDisplayItem(third, backgroundDrawingType)); | 769 TestDisplayItem(third, backgroundDrawingType)); |
| 772 } | 770 } |
| 773 | 771 |
| 774 } // namespace blink | 772 } // namespace blink |
| OLD | NEW |