Index: Source/platform/graphics/paint/DisplayItemPropertyTreeBuilderTest.cpp |
diff --git a/Source/platform/graphics/paint/DisplayItemTransformTreeBuilderTest.cpp b/Source/platform/graphics/paint/DisplayItemPropertyTreeBuilderTest.cpp |
similarity index 55% |
rename from Source/platform/graphics/paint/DisplayItemTransformTreeBuilderTest.cpp |
rename to Source/platform/graphics/paint/DisplayItemPropertyTreeBuilderTest.cpp |
index c00ecb6faffe7d29a530ad0ea0c6626079908c32..469b7dd4e4b435fbe5310767cc0cfdbdf99186e8 100644 |
--- a/Source/platform/graphics/paint/DisplayItemTransformTreeBuilderTest.cpp |
+++ b/Source/platform/graphics/paint/DisplayItemPropertyTreeBuilderTest.cpp |
@@ -3,21 +3,43 @@ |
// found in the LICENSE file. |
#include "config.h" |
-#include "platform/graphics/paint/DisplayItemTransformTreeBuilder.h" |
+#include "platform/graphics/paint/DisplayItemPropertyTreeBuilder.h" |
#include "platform/graphics/paint/DisplayItem.h" |
#include "platform/graphics/paint/DisplayItemClient.h" |
+#include "platform/graphics/paint/DisplayItemClipTree.h" |
#include "platform/graphics/paint/DisplayItemTransformTree.h" |
#include "platform/graphics/paint/Transform3DDisplayItem.h" |
#include "platform/transforms/TransformTestHelper.h" |
#include "platform/transforms/TransformationMatrix.h" |
#include "public/platform/WebDisplayItemTransformTree.h" |
+#include "wtf/OwnPtr.h" |
+#include <gmock/gmock.h> |
#include <gtest/gtest.h> |
namespace blink { |
namespace { |
-using RangeRecord = WebDisplayItemTransformTree::RangeRecord; |
+using ::testing::AllOf; |
+using ::testing::ElementsAre; |
+ |
+using RangeRecord = DisplayItemPropertyTreeBuilder::RangeRecord; |
+ |
+MATCHER_P2(hasRange, begin, end, "") |
+{ |
+ return arg.displayListBeginIndex == static_cast<size_t>(begin) |
+ && arg.displayListEndIndex == static_cast<size_t>(end); |
+} |
+ |
+MATCHER_P(hasTransformNode, transformNode, "") |
+{ |
+ return arg.transformNodeIndex == static_cast<size_t>(transformNode); |
+} |
+ |
+MATCHER_P(hasOffset, offset, "") |
+{ |
+ return arg.offset == offset; |
+} |
struct DummyClient { |
DisplayItemClient displayItemClient() const { return toDisplayItemClient(this); } |
@@ -29,9 +51,13 @@ public: |
DummyDisplayItem(const DummyClient& client) : DisplayItem(client, DisplayItem::DrawingFirst, sizeof(*this)) { } |
}; |
-class DisplayItemTransformTreeBuilderTest : public ::testing::Test { |
+class DisplayItemPropertyTreeBuilderTest : public ::testing::Test { |
protected: |
- DisplayItemTransformTreeBuilder& builder() { return m_builder; } |
+ DisplayItemPropertyTreeBuilder& builder() { return m_builder; } |
+ const DisplayItemTransformTree& transformTree() { return *m_transformTree; } |
+ const DisplayItemClipTree& clipTree() { return *m_clipTree; } |
+ const Vector<RangeRecord>& rangeRecords() { return m_rangeRecords; } |
+ std::vector<RangeRecord> rangeRecordsAsStdVector() { return std::vector<RangeRecord>(m_rangeRecords.begin(), m_rangeRecords.end()); } |
void processDisplayItem(const DisplayItem& displayItem) { m_builder.processDisplayItem(displayItem); } |
void processDisplayItem(PassOwnPtr<DisplayItem> displayItem) { processDisplayItem(*displayItem); } |
@@ -47,6 +73,13 @@ protected: |
processDisplayItem(EndTransform3DDisplayItem(client, DisplayItem::transform3DTypeToEndTransform3DType(DisplayItem::Transform3DElementTransform))); |
} |
+ void finishPropertyTrees() |
+ { |
+ m_transformTree = m_builder.releaseTransformTree(); |
+ m_clipTree = m_builder.releaseClipTree(); |
+ m_rangeRecords = m_builder.releaseRangeRecords(); |
+ } |
+ |
private: |
// This makes empty objects which can be used as display item clients. |
const DummyClient& newDummyClient() |
@@ -55,43 +88,44 @@ private: |
return *m_dummyClients.last(); |
} |
- DisplayItemTransformTreeBuilder m_builder; |
+ DisplayItemPropertyTreeBuilder m_builder; |
+ OwnPtr<DisplayItemTransformTree> m_transformTree; |
+ OwnPtr<DisplayItemClipTree> m_clipTree; |
+ Vector<RangeRecord> m_rangeRecords; |
Vector<OwnPtr<DummyClient>> m_dummyClients; |
}; |
-TEST_F(DisplayItemTransformTreeBuilderTest, NoDisplayItems) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, NoDisplayItems) |
{ |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should be a root transform node. |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(WebDisplayItemTransformTree::kInvalidIndex, tree.nodeAt(0).parentNodeIndex); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
// There should be no range records, because there are no non-empty |
// transformed ranges. |
- ASSERT_EQ(0u, tree.rangeRecordCount()); |
+ ASSERT_EQ(0u, rangeRecords().size()); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, NoTransforms) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, NoTransforms) |
{ |
// Three dummy display items. |
processDummyDisplayItem(); |
processDummyDisplayItem(); |
processDummyDisplayItem(); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should only be a root transform node. |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(WebDisplayItemTransformTree::kInvalidIndex, tree.nodeAt(0).parentNodeIndex); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
// There should be one range record, for the entire list. |
- ASSERT_EQ(1u, tree.rangeRecordCount()); |
- EXPECT_EQ(RangeRecord(0, 3, 0), tree.rangeRecordAt(0)); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(0, 3), hasTransformNode(0)))); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, IdentityTransform) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, IdentityTransform) |
{ |
TransformationMatrix identity; |
@@ -101,23 +135,22 @@ TEST_F(DisplayItemTransformTreeBuilderTest, IdentityTransform) |
processDummyDisplayItem(); |
processEndTransform3D(transformClient); |
processDummyDisplayItem(); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should only be a root transform node. |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(WebDisplayItemTransformTree::kInvalidIndex, tree.nodeAt(0).parentNodeIndex); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
// There should be three range records. |
// Since the transform is the identity, these could be combined, but there |
// is not currently a special path for this case. |
- ASSERT_EQ(3u, tree.rangeRecordCount()); |
- EXPECT_EQ(RangeRecord(0, 1, 0), tree.rangeRecordAt(0)); |
- EXPECT_EQ(RangeRecord(2, 3, 0), tree.rangeRecordAt(1)); |
- EXPECT_EQ(RangeRecord(4, 5, 0), tree.rangeRecordAt(2)); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(0, 1), hasTransformNode(0)), |
+ AllOf(hasRange(2, 3), hasTransformNode(0)), |
+ AllOf(hasRange(4, 5), hasTransformNode(0)))); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, Only2DTranslation) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, Only2DTranslation) |
{ |
FloatSize offset(200.5, -100); |
TransformationMatrix translation; |
@@ -129,22 +162,21 @@ TEST_F(DisplayItemTransformTreeBuilderTest, Only2DTranslation) |
processDummyDisplayItem(); |
processEndTransform3D(transformClient); |
processDummyDisplayItem(); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should only be a root transform node. |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(WebDisplayItemTransformTree::kInvalidIndex, tree.nodeAt(0).parentNodeIndex); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
// There should be three ranges, even though there's only one node. |
// The middle one requires an offset. |
- ASSERT_EQ(3u, tree.rangeRecordCount()); |
- EXPECT_EQ(RangeRecord(0, 1, 0, FloatSize()), tree.rangeRecordAt(0)); |
- EXPECT_EQ(RangeRecord(2, 3, 0, offset), tree.rangeRecordAt(1)); |
- EXPECT_EQ(RangeRecord(4, 5, 0, FloatSize()), tree.rangeRecordAt(2)); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(0, 1), hasTransformNode(0)), |
+ AllOf(hasRange(2, 3), hasTransformNode(0)), |
+ AllOf(hasRange(4, 5), hasTransformNode(0)))); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, Nested2DTranslation) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, Nested2DTranslation) |
{ |
FloatSize offset1(10, -40); |
TransformationMatrix translation1; |
@@ -162,21 +194,20 @@ TEST_F(DisplayItemTransformTreeBuilderTest, Nested2DTranslation) |
processDummyDisplayItem(); |
processEndTransform3D(transform2); |
processEndTransform3D(transform1); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should only be a root transform node. |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(WebDisplayItemTransformTree::kInvalidIndex, tree.nodeAt(0).parentNodeIndex); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
// Check that the range records have the right offsets. |
- ASSERT_EQ(3u, tree.rangeRecordCount()); |
- EXPECT_EQ(RangeRecord(0, 1, 0, FloatSize()), tree.rangeRecordAt(0)); |
- EXPECT_EQ(RangeRecord(2, 3, 0, offset1), tree.rangeRecordAt(1)); |
- EXPECT_EQ(RangeRecord(4, 5, 0, offset1 + offset2), tree.rangeRecordAt(2)); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(0, 1), hasTransformNode(0), hasOffset(FloatSize())), |
+ AllOf(hasRange(2, 3), hasTransformNode(0), hasOffset(offset1)), |
+ AllOf(hasRange(4, 5), hasTransformNode(0), hasOffset(offset1 + offset2)))); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, ZTranslation) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, ZTranslation) |
{ |
TransformationMatrix zTranslation; |
zTranslation.translate3d(0, 0, 1); |
@@ -187,36 +218,35 @@ TEST_F(DisplayItemTransformTreeBuilderTest, ZTranslation) |
processDummyDisplayItem(); |
processEndTransform3D(transformClient); |
processDummyDisplayItem(); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should be two nodes here. |
- ASSERT_EQ(2u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).isRoot()); |
- EXPECT_EQ(0u, tree.nodeAt(1).parentNodeIndex); |
+ ASSERT_EQ(2u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).isRoot()); |
+ EXPECT_EQ(0u, transformTree().nodeAt(1).parentNodeIndex); |
// There should be three range records. |
// The middle of these should be transformed, and the others should be |
// attached to the root node. |
- ASSERT_EQ(3u, tree.rangeRecordCount()); |
- EXPECT_EQ(RangeRecord(0, 1, 0), tree.rangeRecordAt(0)); |
- EXPECT_EQ(RangeRecord(2, 3, 1), tree.rangeRecordAt(1)); |
- EXPECT_EQ(RangeRecord(4, 5, 0), tree.rangeRecordAt(2)); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(0, 1), hasTransformNode(0)), |
+ AllOf(hasRange(2, 3), hasTransformNode(1)), |
+ AllOf(hasRange(4, 5), hasTransformNode(0)))); |
} |
-size_t nodeDepth( |
- const WebDisplayItemTransformTree& tree, |
- const WebDisplayItemTransformTree::TransformNode& node) |
+template <typename TreeType, typename NodeType> |
+size_t nodeDepth(const TreeType& tree, const NodeType& node) |
{ |
const auto* currentNode = &node; |
size_t depth = 0; |
while (!currentNode->isRoot()) { |
- currentNode = &tree.parentNode(*currentNode); |
+ currentNode = &tree.nodeAt(currentNode->parentNodeIndex); |
depth++; |
} |
return depth; |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, SkipUnnecessaryRangeRecords) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, SkipUnnecessaryRangeRecords) |
{ |
TransformationMatrix rotation; |
rotation.rotate(1 /* degrees */); |
@@ -230,26 +260,27 @@ TEST_F(DisplayItemTransformTreeBuilderTest, SkipUnnecessaryRangeRecords) |
processDummyDisplayItem(); |
processEndTransform3D(transform2); |
processEndTransform3D(transform1); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
// There should be only two ranges. |
// They must both belong to the same grandchild of the root node. |
- ASSERT_EQ(2u, tree.rangeRecordCount()); |
- size_t transformNodeIndex = tree.rangeRecordAt(0).transformNodeIndex; |
- EXPECT_EQ(2u, nodeDepth(tree, tree.nodeAt(transformNodeIndex))); |
- EXPECT_EQ(RangeRecord(2, 3, transformNodeIndex), tree.rangeRecordAt(0)); |
- EXPECT_EQ(RangeRecord(5, 6, transformNodeIndex), tree.rangeRecordAt(1)); |
+ ASSERT_EQ(2u, rangeRecords().size()); |
+ size_t transformNodeIndex = rangeRecords()[0].transformNodeIndex; |
+ EXPECT_EQ(2u, nodeDepth(transformTree(), transformTree().nodeAt(transformNodeIndex))); |
+ EXPECT_THAT(rangeRecordsAsStdVector(), ElementsAre( |
+ AllOf(hasRange(2, 3), hasTransformNode(transformNodeIndex)), |
+ AllOf(hasRange(5, 6), hasTransformNode(transformNodeIndex)))); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, RootTransformNodeHasIdentityTransform) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, RootTransformNodeHasIdentityTransform) |
{ |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
- ASSERT_EQ(1u, tree.nodeCount()); |
- EXPECT_TRUE(tree.nodeAt(0).matrix.isIdentity()); |
- EXPECT_TRANSFORMS_ALMOST_EQ(TransformationMatrix(), tree.nodeAt(0).matrix); |
+ finishPropertyTrees(); |
+ ASSERT_EQ(1u, transformTree().nodeCount()); |
+ EXPECT_TRUE(transformTree().nodeAt(0).matrix.isIdentity()); |
+ EXPECT_TRANSFORMS_ALMOST_EQ(TransformationMatrix(), transformTree().nodeAt(0).matrix); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, Transform3DMatrix) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, Transform3DMatrix) |
{ |
TransformationMatrix matrix; |
matrix.rotate3d(45, 45, 45); |
@@ -257,14 +288,13 @@ TEST_F(DisplayItemTransformTreeBuilderTest, Transform3DMatrix) |
auto transform1 = processBeginTransform3D(matrix); |
processDummyDisplayItem(); |
processEndTransform3D(transform1); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
- const auto& rangeRecord = tree.rangeRecordAt(0); |
- const auto& transformNode = tree.nodeAt(rangeRecord.transformNodeIndex); |
+ const auto& transformNode = transformTree().nodeAt(rangeRecords()[0].transformNodeIndex); |
EXPECT_TRANSFORMS_ALMOST_EQ(matrix, transformNode.matrix); |
} |
-TEST_F(DisplayItemTransformTreeBuilderTest, NestedTransformsAreNotCombined) |
+TEST_F(DisplayItemPropertyTreeBuilderTest, NestedTransformsAreNotCombined) |
{ |
// It's up the consumer of the tree to multiply transformation matrices. |
@@ -280,12 +310,13 @@ TEST_F(DisplayItemTransformTreeBuilderTest, NestedTransformsAreNotCombined) |
processEndTransform3D(transform2); |
processDummyDisplayItem(); |
processEndTransform3D(transform1); |
- WebDisplayItemTransformTree tree(builder().releaseTransformTree()); |
+ finishPropertyTrees(); |
- const auto& transformNode = tree.nodeAt(tree.rangeRecordAt(0).transformNodeIndex); |
+ const auto& transformNode = transformTree().nodeAt(rangeRecords()[0].transformNodeIndex); |
ASSERT_FALSE(transformNode.isRoot()); |
EXPECT_TRANSFORMS_ALMOST_EQ(matrix2, transformNode.matrix); |
- EXPECT_TRANSFORMS_ALMOST_EQ(matrix1, tree.parentNode(transformNode).matrix); |
+ const auto& parentNode = transformTree().nodeAt(transformNode.parentNodeIndex); |
+ EXPECT_TRANSFORMS_ALMOST_EQ(matrix1, parentNode.matrix); |
} |
} // namespace |