| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "platform/graphics/compositing/PaintArtifactCompositor.h" | 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" |
| 6 | 6 |
| 7 #include "base/test/test_simple_task_runner.h" | 7 #include "base/test/test_simple_task_runner.h" |
| 8 #include "base/threading/thread_task_runner_handle.h" | 8 #include "base/threading/thread_task_runner_handle.h" |
| 9 #include "cc/layers/layer.h" | 9 #include "cc/layers/layer.h" |
| 10 #include "cc/test/fake_compositor_frame_sink.h" | 10 #include "cc/test/fake_compositor_frame_sink.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "platform/testing/PaintPropertyTestHelpers.h" | 21 #include "platform/testing/PaintPropertyTestHelpers.h" |
| 22 #include "platform/testing/PictureMatchers.h" | 22 #include "platform/testing/PictureMatchers.h" |
| 23 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" | 23 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" |
| 24 #include "platform/testing/TestPaintArtifact.h" | 24 #include "platform/testing/TestPaintArtifact.h" |
| 25 #include "platform/testing/WebLayerTreeViewImplForTesting.h" | 25 #include "platform/testing/WebLayerTreeViewImplForTesting.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include <memory> | 28 #include <memory> |
| 29 | 29 |
| 30 namespace blink { | 30 namespace blink { |
| 31 namespace { | |
| 32 | 31 |
| 33 using ::blink::testing::createOpacityOnlyEffect; | 32 using ::blink::testing::createOpacityOnlyEffect; |
| 34 using ::testing::Pointee; | 33 using ::testing::Pointee; |
| 35 | 34 |
| 36 PaintChunkProperties defaultPaintChunkProperties() { | 35 PaintChunkProperties defaultPaintChunkProperties() { |
| 37 PropertyTreeState propertyTreeState( | 36 PropertyTreeState propertyTreeState( |
| 38 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), | 37 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 39 EffectPaintPropertyNode::root(), ScrollPaintPropertyNode::root()); | 38 EffectPaintPropertyNode::root(), ScrollPaintPropertyNode::root()); |
| 40 return PaintChunkProperties(propertyTreeState); | 39 return PaintChunkProperties(propertyTreeState); |
| 41 } | 40 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 const cc::Layer* child = contentLayerAt(0); | 132 const cc::Layer* child = contentLayerAt(0); |
| 134 EXPECT_THAT(child->GetPicture(), | 133 EXPECT_THAT(child->GetPicture(), |
| 135 Pointee(drawsRectangle(FloatRect(0, 0, 100, 100), Color::white))); | 134 Pointee(drawsRectangle(FloatRect(0, 0, 100, 100), Color::white))); |
| 136 EXPECT_EQ(translation(50, -50), child->screen_space_transform()); | 135 EXPECT_EQ(translation(50, -50), child->screen_space_transform()); |
| 137 EXPECT_EQ(gfx::Size(100, 100), child->bounds()); | 136 EXPECT_EQ(gfx::Size(100, 100), child->bounds()); |
| 138 } | 137 } |
| 139 | 138 |
| 140 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneTransform) { | 139 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneTransform) { |
| 141 // A 90 degree clockwise rotation about (100, 100). | 140 // A 90 degree clockwise rotation about (100, 100). |
| 142 RefPtr<TransformPaintPropertyNode> transform = | 141 RefPtr<TransformPaintPropertyNode> transform = |
| 143 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 142 TransformPaintPropertyNode::create( |
| 144 TransformationMatrix().rotate(90), | 143 TransformPaintPropertyNode::root(), TransformationMatrix().rotate(90), |
| 145 FloatPoint3D(100, 100, 0)); | 144 FloatPoint3D(100, 100, 0), false, 0, CompositingReason3DTransform); |
| 146 | 145 |
| 147 TestPaintArtifact artifact; | 146 TestPaintArtifact artifact; |
| 148 artifact | 147 artifact |
| 149 .chunk(transform, ClipPaintPropertyNode::root(), | 148 .chunk(transform, ClipPaintPropertyNode::root(), |
| 150 EffectPaintPropertyNode::root()) | 149 EffectPaintPropertyNode::root()) |
| 151 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); | 150 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 152 artifact | 151 artifact |
| 153 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), | 152 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 154 EffectPaintPropertyNode::root()) | 153 EffectPaintPropertyNode::root()) |
| 155 .rectDrawing(FloatRect(0, 0, 100, 100), Color::gray); | 154 .rectDrawing(FloatRect(0, 0, 100, 100), Color::gray); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 183 Pointee(drawsRectangle(FloatRect(0, 0, 200, 100), Color::black))); | 182 Pointee(drawsRectangle(FloatRect(0, 0, 200, 100), Color::black))); |
| 184 gfx::RectF mappedRect(0, 0, 200, 100); | 183 gfx::RectF mappedRect(0, 0, 200, 100); |
| 185 layer->screen_space_transform().TransformRect(&mappedRect); | 184 layer->screen_space_transform().TransformRect(&mappedRect); |
| 186 EXPECT_EQ(gfx::RectF(0, 100, 100, 200), mappedRect); | 185 EXPECT_EQ(gfx::RectF(0, 100, 100, 200), mappedRect); |
| 187 } | 186 } |
| 188 } | 187 } |
| 189 | 188 |
| 190 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformCombining) { | 189 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformCombining) { |
| 191 // A translation by (5, 5) within a 2x scale about (10, 10). | 190 // A translation by (5, 5) within a 2x scale about (10, 10). |
| 192 RefPtr<TransformPaintPropertyNode> transform1 = | 191 RefPtr<TransformPaintPropertyNode> transform1 = |
| 193 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 192 TransformPaintPropertyNode::create( |
| 194 TransformationMatrix().scale(2), | 193 TransformPaintPropertyNode::root(), TransformationMatrix().scale(2), |
| 195 FloatPoint3D(10, 10, 0)); | 194 FloatPoint3D(10, 10, 0), false, 0, CompositingReason3DTransform); |
| 196 RefPtr<TransformPaintPropertyNode> transform2 = | 195 RefPtr<TransformPaintPropertyNode> transform2 = |
| 197 TransformPaintPropertyNode::create( | 196 TransformPaintPropertyNode::create( |
| 198 transform1, TransformationMatrix().translate(5, 5), FloatPoint3D()); | 197 transform1, TransformationMatrix().translate(5, 5), FloatPoint3D()); |
| 199 | 198 |
| 200 TestPaintArtifact artifact; | 199 TestPaintArtifact artifact; |
| 201 artifact | 200 artifact |
| 202 .chunk(transform1, ClipPaintPropertyNode::root(), | 201 .chunk(transform1, ClipPaintPropertyNode::root(), |
| 203 EffectPaintPropertyNode::root()) | 202 EffectPaintPropertyNode::root()) |
| 204 .rectDrawing(FloatRect(0, 0, 300, 200), Color::white); | 203 .rectDrawing(FloatRect(0, 0, 300, 200), Color::white); |
| 205 artifact | 204 artifact |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 | 290 |
| 292 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, SortingContextID) { | 291 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, SortingContextID) { |
| 293 // Has no 3D rendering context. | 292 // Has no 3D rendering context. |
| 294 RefPtr<TransformPaintPropertyNode> transform1 = | 293 RefPtr<TransformPaintPropertyNode> transform1 = |
| 295 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), | 294 TransformPaintPropertyNode::create(TransformPaintPropertyNode::root(), |
| 296 TransformationMatrix(), | 295 TransformationMatrix(), |
| 297 FloatPoint3D()); | 296 FloatPoint3D()); |
| 298 // Establishes a 3D rendering context. | 297 // Establishes a 3D rendering context. |
| 299 RefPtr<TransformPaintPropertyNode> transform2 = | 298 RefPtr<TransformPaintPropertyNode> transform2 = |
| 300 TransformPaintPropertyNode::create(transform1, TransformationMatrix(), | 299 TransformPaintPropertyNode::create(transform1, TransformationMatrix(), |
| 301 FloatPoint3D(), false, 1); | 300 FloatPoint3D(), false, 1, |
| 301 CompositingReason3DTransform); |
| 302 // Extends the 3D rendering context of transform2. | 302 // Extends the 3D rendering context of transform2. |
| 303 RefPtr<TransformPaintPropertyNode> transform3 = | 303 RefPtr<TransformPaintPropertyNode> transform3 = |
| 304 TransformPaintPropertyNode::create(transform2, TransformationMatrix(), | 304 TransformPaintPropertyNode::create(transform2, TransformationMatrix(), |
| 305 FloatPoint3D(), false, 1); | 305 FloatPoint3D(), false, 1, |
| 306 CompositingReason3DTransform); |
| 306 // Establishes a 3D rendering context distinct from transform2. | 307 // Establishes a 3D rendering context distinct from transform2. |
| 307 RefPtr<TransformPaintPropertyNode> transform4 = | 308 RefPtr<TransformPaintPropertyNode> transform4 = |
| 308 TransformPaintPropertyNode::create(transform2, TransformationMatrix(), | 309 TransformPaintPropertyNode::create(transform2, TransformationMatrix(), |
| 309 FloatPoint3D(), false, 2); | 310 FloatPoint3D(), false, 2, |
| 311 CompositingReason3DTransform); |
| 310 | 312 |
| 311 TestPaintArtifact artifact; | 313 TestPaintArtifact artifact; |
| 312 artifact | 314 artifact |
| 313 .chunk(transform1, ClipPaintPropertyNode::root(), | 315 .chunk(transform1, ClipPaintPropertyNode::root(), |
| 314 EffectPaintPropertyNode::root()) | 316 EffectPaintPropertyNode::root()) |
| 315 .rectDrawing(FloatRect(0, 0, 300, 200), Color::white); | 317 .rectDrawing(FloatRect(0, 0, 300, 200), Color::white); |
| 316 artifact | 318 artifact |
| 317 .chunk(transform2, ClipPaintPropertyNode::root(), | 319 .chunk(transform2, ClipPaintPropertyNode::root(), |
| 318 EffectPaintPropertyNode::root()) | 320 EffectPaintPropertyNode::root()) |
| 319 .rectDrawing(FloatRect(0, 0, 300, 200), Color::lightGray); | 321 .rectDrawing(FloatRect(0, 0, 300, 200), Color::lightGray); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 const cc::ClipNode* clipNode = | 394 const cc::ClipNode* clipNode = |
| 393 propertyTrees().clip_tree.Node(layer->clip_tree_index()); | 395 propertyTrees().clip_tree.Node(layer->clip_tree_index()); |
| 394 EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, clipNode->clip_type); | 396 EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, clipNode->clip_type); |
| 395 EXPECT_TRUE(clipNode->layers_are_clipped); | 397 EXPECT_TRUE(clipNode->layers_are_clipped); |
| 396 EXPECT_EQ(gfx::RectF(100, 100, 300, 200), clipNode->clip); | 398 EXPECT_EQ(gfx::RectF(100, 100, 300, 200), clipNode->clip); |
| 397 } | 399 } |
| 398 | 400 |
| 399 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, NestedClips) { | 401 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, NestedClips) { |
| 400 RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create( | 402 RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create( |
| 401 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), | 403 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 402 FloatRoundedRect(100, 100, 700, 700)); | 404 FloatRoundedRect(100, 100, 700, 700), |
| 405 CompositingReasonOverflowScrollingTouch); |
| 403 RefPtr<ClipPaintPropertyNode> clip2 = | 406 RefPtr<ClipPaintPropertyNode> clip2 = |
| 404 ClipPaintPropertyNode::create(clip1, TransformPaintPropertyNode::root(), | 407 ClipPaintPropertyNode::create(clip1, TransformPaintPropertyNode::root(), |
| 405 FloatRoundedRect(200, 200, 700, 100)); | 408 FloatRoundedRect(200, 200, 700, 100), |
| 409 CompositingReasonOverflowScrollingTouch); |
| 406 | 410 |
| 407 TestPaintArtifact artifact; | 411 TestPaintArtifact artifact; |
| 408 artifact | 412 artifact |
| 409 .chunk(TransformPaintPropertyNode::root(), clip1, | 413 .chunk(TransformPaintPropertyNode::root(), clip1, |
| 410 EffectPaintPropertyNode::root()) | 414 EffectPaintPropertyNode::root()) |
| 411 .rectDrawing(FloatRect(300, 350, 100, 100), Color::white); | 415 .rectDrawing(FloatRect(300, 350, 100, 100), Color::white); |
| 412 artifact | 416 artifact |
| 413 .chunk(TransformPaintPropertyNode::root(), clip2, | 417 .chunk(TransformPaintPropertyNode::root(), clip2, |
| 414 EffectPaintPropertyNode::root()) | 418 EffectPaintPropertyNode::root()) |
| 415 .rectDrawing(FloatRect(300, 350, 100, 100), Color::lightGray); | 419 .rectDrawing(FloatRect(300, 350, 100, 100), Color::lightGray); |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 scrollTree.current_scroll_offset(contentLayerAt(0)->id())); | 715 scrollTree.current_scroll_offset(contentLayerAt(0)->id())); |
| 712 EXPECT_EQ(gfx::ScrollOffset(-37, -41), | 716 EXPECT_EQ(gfx::ScrollOffset(-37, -41), |
| 713 scrollTree.current_scroll_offset(contentLayerAt(1)->id())); | 717 scrollTree.current_scroll_offset(contentLayerAt(1)->id())); |
| 714 | 718 |
| 715 EXPECT_TRUE(scrollNodeA.main_thread_scrolling_reasons & | 719 EXPECT_TRUE(scrollNodeA.main_thread_scrolling_reasons & |
| 716 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); | 720 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
| 717 EXPECT_FALSE(scrollNodeB.main_thread_scrolling_reasons & | 721 EXPECT_FALSE(scrollNodeB.main_thread_scrolling_reasons & |
| 718 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); | 722 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
| 719 } | 723 } |
| 720 | 724 |
| 721 } // namespace | 725 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MergeSimpleChunks) { |
| 726 TestPaintArtifact testArtifact; |
| 727 testArtifact |
| 728 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 729 EffectPaintPropertyNode::root()) |
| 730 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 731 testArtifact |
| 732 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 733 EffectPaintPropertyNode::root()) |
| 734 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 735 |
| 736 const PaintArtifact& artifact = testArtifact.build(); |
| 737 |
| 738 ASSERT_EQ(2u, artifact.paintChunks().size()); |
| 739 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 740 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 741 pendingLayer)); |
| 742 |
| 743 update(artifact); |
| 744 |
| 745 ASSERT_EQ(1u, contentLayerCount()); |
| 746 { |
| 747 Vector<RectWithColor> rectsWithColor; |
| 748 rectsWithColor.push_back( |
| 749 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 750 rectsWithColor.push_back( |
| 751 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 752 |
| 753 const cc::Layer* layer = contentLayerAt(0); |
| 754 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 755 } |
| 756 } |
| 757 |
| 758 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MergeClip) { |
| 759 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 760 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 761 FloatRoundedRect(10, 20, 50, 60)); |
| 762 |
| 763 TestPaintArtifact testArtifact; |
| 764 testArtifact |
| 765 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 766 EffectPaintPropertyNode::root()) |
| 767 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 768 testArtifact |
| 769 .chunk(TransformPaintPropertyNode::root(), clip.get(), |
| 770 EffectPaintPropertyNode::root()) |
| 771 .rectDrawing(FloatRect(0, 0, 200, 300), Color::black); |
| 772 testArtifact |
| 773 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 774 EffectPaintPropertyNode::root()) |
| 775 .rectDrawing(FloatRect(0, 0, 300, 400), Color::gray); |
| 776 |
| 777 const PaintArtifact& artifact = testArtifact.build(); |
| 778 |
| 779 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 780 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 781 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 782 pendingLayer)); |
| 783 pendingLayer.add(artifact.paintChunks()[1]); |
| 784 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 785 pendingLayer)); |
| 786 |
| 787 update(artifact); |
| 788 |
| 789 ASSERT_EQ(1u, contentLayerCount()); |
| 790 { |
| 791 Vector<RectWithColor> rectsWithColor; |
| 792 rectsWithColor.push_back( |
| 793 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 794 // Clip is applied to this PaintChunk. |
| 795 rectsWithColor.push_back( |
| 796 RectWithColor(FloatRect(10, 20, 50, 60), Color::black)); |
| 797 rectsWithColor.push_back( |
| 798 RectWithColor(FloatRect(0, 0, 300, 400), Color::gray)); |
| 799 |
| 800 const cc::Layer* layer = contentLayerAt(0); |
| 801 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 802 } |
| 803 } |
| 804 |
| 805 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, Merge2DTransform) { |
| 806 RefPtr<TransformPaintPropertyNode> transform = |
| 807 TransformPaintPropertyNode::create( |
| 808 TransformPaintPropertyNode::root(), |
| 809 TransformationMatrix().translate(50, 50), FloatPoint3D(100, 100, 0), |
| 810 false, 0); |
| 811 |
| 812 TestPaintArtifact testArtifact; |
| 813 testArtifact |
| 814 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 815 EffectPaintPropertyNode::root()) |
| 816 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 817 testArtifact |
| 818 .chunk(transform.get(), ClipPaintPropertyNode::root(), |
| 819 EffectPaintPropertyNode::root()) |
| 820 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); |
| 821 testArtifact |
| 822 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 823 EffectPaintPropertyNode::root()) |
| 824 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 825 |
| 826 const PaintArtifact& artifact = testArtifact.build(); |
| 827 |
| 828 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 829 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 830 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 831 pendingLayer)); |
| 832 pendingLayer.add(artifact.paintChunks()[1]); |
| 833 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 834 pendingLayer)); |
| 835 |
| 836 update(artifact); |
| 837 |
| 838 ASSERT_EQ(1u, contentLayerCount()); |
| 839 { |
| 840 Vector<RectWithColor> rectsWithColor; |
| 841 rectsWithColor.push_back( |
| 842 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 843 // Transform is applied to this PaintChunk. |
| 844 rectsWithColor.push_back( |
| 845 RectWithColor(FloatRect(50, 50, 100, 100), Color::black)); |
| 846 rectsWithColor.push_back( |
| 847 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 848 |
| 849 const cc::Layer* layer = contentLayerAt(0); |
| 850 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 851 } |
| 852 } |
| 853 |
| 854 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MergeOpacity) { |
| 855 float opacity = 2.0 / 255.0; |
| 856 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 857 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 858 ClipPaintPropertyNode::root(), CompositorFilterOperations(), opacity, |
| 859 SkBlendMode::kSrcOver); |
| 860 |
| 861 TestPaintArtifact testArtifact; |
| 862 testArtifact |
| 863 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 864 EffectPaintPropertyNode::root()) |
| 865 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 866 testArtifact |
| 867 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 868 effect.get()) |
| 869 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); |
| 870 testArtifact |
| 871 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 872 EffectPaintPropertyNode::root()) |
| 873 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 874 |
| 875 const PaintArtifact& artifact = testArtifact.build(); |
| 876 |
| 877 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 878 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 879 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 880 pendingLayer)); |
| 881 pendingLayer.add(artifact.paintChunks()[1]); |
| 882 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 883 pendingLayer)); |
| 884 |
| 885 update(artifact); |
| 886 |
| 887 ASSERT_EQ(1u, contentLayerCount()); |
| 888 { |
| 889 Vector<RectWithColor> rectsWithColor; |
| 890 rectsWithColor.push_back( |
| 891 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 892 // Transform is applied to this PaintChunk. |
| 893 rectsWithColor.push_back( |
| 894 RectWithColor(FloatRect(0, 0, 100, 100), |
| 895 Color(Color::black).combineWithAlpha(opacity).rgb())); |
| 896 rectsWithColor.push_back( |
| 897 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 898 |
| 899 const cc::Layer* layer = contentLayerAt(0); |
| 900 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 901 } |
| 902 } |
| 903 |
| 904 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MergeNested) { |
| 905 // Tests merging of an opacity effect, inside of a clip, inside of a |
| 906 // transform. |
| 907 |
| 908 RefPtr<TransformPaintPropertyNode> transform = |
| 909 TransformPaintPropertyNode::create( |
| 910 TransformPaintPropertyNode::root(), |
| 911 TransformationMatrix().translate(50, 50), FloatPoint3D(100, 100, 0), |
| 912 false, 0); |
| 913 |
| 914 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 915 ClipPaintPropertyNode::root(), transform.get(), |
| 916 FloatRoundedRect(10, 20, 50, 60)); |
| 917 |
| 918 float opacity = 2.0 / 255.0; |
| 919 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 920 EffectPaintPropertyNode::root(), transform.get(), clip.get(), |
| 921 CompositorFilterOperations(), opacity, SkBlendMode::kSrcOver); |
| 922 |
| 923 TestPaintArtifact testArtifact; |
| 924 testArtifact |
| 925 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 926 EffectPaintPropertyNode::root()) |
| 927 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 928 testArtifact.chunk(transform.get(), clip.get(), effect.get()) |
| 929 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); |
| 930 testArtifact |
| 931 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 932 EffectPaintPropertyNode::root()) |
| 933 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 934 |
| 935 const PaintArtifact& artifact = testArtifact.build(); |
| 936 |
| 937 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 938 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 939 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 940 pendingLayer)); |
| 941 pendingLayer.add(artifact.paintChunks()[1]); |
| 942 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 943 pendingLayer)); |
| 944 update(artifact); |
| 945 |
| 946 ASSERT_EQ(1u, contentLayerCount()); |
| 947 { |
| 948 Vector<RectWithColor> rectsWithColor; |
| 949 rectsWithColor.push_back( |
| 950 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 951 // Transform is applied to this PaintChunk. |
| 952 rectsWithColor.push_back( |
| 953 RectWithColor(FloatRect(60, 70, 50, 60), |
| 954 Color(Color::black).combineWithAlpha(opacity).rgb())); |
| 955 rectsWithColor.push_back( |
| 956 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 957 |
| 958 const cc::Layer* layer = contentLayerAt(0); |
| 959 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 960 } |
| 961 } |
| 962 |
| 963 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, ClipPushedUp) { |
| 964 // Tests merging of an element which has a clipapplied to it, |
| 965 // but has an ancestor transform of them. This can happen for fixed- |
| 966 // or absolute-position elements which escape scroll transforms. |
| 967 |
| 968 RefPtr<TransformPaintPropertyNode> transform = |
| 969 TransformPaintPropertyNode::create( |
| 970 TransformPaintPropertyNode::root(), |
| 971 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), |
| 972 false, 0); |
| 973 |
| 974 RefPtr<TransformPaintPropertyNode> transform2 = |
| 975 TransformPaintPropertyNode::create( |
| 976 transform.get(), TransformationMatrix().translate(20, 25), |
| 977 FloatPoint3D(100, 100, 0), false, 0); |
| 978 |
| 979 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 980 ClipPaintPropertyNode::root(), transform2.get(), |
| 981 FloatRoundedRect(10, 20, 50, 60)); |
| 982 |
| 983 TestPaintArtifact testArtifact; |
| 984 testArtifact |
| 985 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 986 EffectPaintPropertyNode::root()) |
| 987 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 988 testArtifact |
| 989 .chunk(TransformPaintPropertyNode::root(), clip.get(), |
| 990 EffectPaintPropertyNode::root()) |
| 991 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); |
| 992 testArtifact |
| 993 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 994 EffectPaintPropertyNode::root()) |
| 995 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 996 |
| 997 const PaintArtifact& artifact = testArtifact.build(); |
| 998 |
| 999 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 1000 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 1001 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 1002 pendingLayer)); |
| 1003 pendingLayer.add(artifact.paintChunks()[1]); |
| 1004 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 1005 pendingLayer)); |
| 1006 update(artifact); |
| 1007 |
| 1008 ASSERT_EQ(1u, contentLayerCount()); |
| 1009 { |
| 1010 Vector<RectWithColor> rectsWithColor; |
| 1011 rectsWithColor.push_back( |
| 1012 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 1013 // The two transforms (combined translation of (40, 50)) are applied here, |
| 1014 // before clipping. |
| 1015 rectsWithColor.push_back( |
| 1016 RectWithColor(FloatRect(50, 70, 50, 60), Color(Color::black))); |
| 1017 rectsWithColor.push_back( |
| 1018 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 1019 |
| 1020 const cc::Layer* layer = contentLayerAt(0); |
| 1021 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 1022 } |
| 1023 } |
| 1024 |
| 1025 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectPushedUp) { |
| 1026 // Tests merging of an element which has an effect applied to it, |
| 1027 // but has an ancestor transform of them. This can happen for fixed- |
| 1028 // or absolute-position elements which escape scroll transforms. |
| 1029 |
| 1030 RefPtr<TransformPaintPropertyNode> transform = |
| 1031 TransformPaintPropertyNode::create( |
| 1032 TransformPaintPropertyNode::root(), |
| 1033 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), |
| 1034 false, 0); |
| 1035 |
| 1036 RefPtr<TransformPaintPropertyNode> transform2 = |
| 1037 TransformPaintPropertyNode::create( |
| 1038 transform.get(), TransformationMatrix().translate(20, 25), |
| 1039 FloatPoint3D(100, 100, 0), false, 0); |
| 1040 |
| 1041 float opacity = 2.0 / 255.0; |
| 1042 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 1043 EffectPaintPropertyNode::root(), transform2.get(), |
| 1044 ClipPaintPropertyNode::root(), CompositorFilterOperations(), opacity, |
| 1045 SkBlendMode::kSrcOver); |
| 1046 |
| 1047 TestPaintArtifact testArtifact; |
| 1048 testArtifact |
| 1049 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1050 EffectPaintPropertyNode::root()) |
| 1051 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 1052 testArtifact |
| 1053 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1054 effect.get()) |
| 1055 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); |
| 1056 testArtifact |
| 1057 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1058 EffectPaintPropertyNode::root()) |
| 1059 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 1060 |
| 1061 const PaintArtifact& artifact = testArtifact.build(); |
| 1062 |
| 1063 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 1064 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 1065 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 1066 pendingLayer)); |
| 1067 pendingLayer.add(artifact.paintChunks()[1]); |
| 1068 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 1069 pendingLayer)); |
| 1070 update(artifact); |
| 1071 |
| 1072 ASSERT_EQ(1u, contentLayerCount()); |
| 1073 { |
| 1074 Vector<RectWithColor> rectsWithColor; |
| 1075 rectsWithColor.push_back( |
| 1076 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 1077 rectsWithColor.push_back( |
| 1078 RectWithColor(FloatRect(0, 0, 300, 400), |
| 1079 Color(Color::black).combineWithAlpha(opacity).rgb())); |
| 1080 rectsWithColor.push_back( |
| 1081 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 1082 |
| 1083 const cc::Layer* layer = contentLayerAt(0); |
| 1084 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 1085 } |
| 1086 } |
| 1087 |
| 1088 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectAndClipPushedUp) { |
| 1089 // Tests merging of an element which has an effect applied to it, |
| 1090 // but has an ancestor transform of them. This can happen for fixed- |
| 1091 // or absolute-position elements which escape scroll transforms. |
| 1092 |
| 1093 RefPtr<TransformPaintPropertyNode> transform = |
| 1094 TransformPaintPropertyNode::create( |
| 1095 TransformPaintPropertyNode::root(), |
| 1096 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), |
| 1097 false, 0); |
| 1098 |
| 1099 RefPtr<TransformPaintPropertyNode> transform2 = |
| 1100 TransformPaintPropertyNode::create( |
| 1101 transform.get(), TransformationMatrix().translate(20, 25), |
| 1102 FloatPoint3D(100, 100, 0), false, 0); |
| 1103 |
| 1104 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 1105 ClipPaintPropertyNode::root(), transform.get(), |
| 1106 FloatRoundedRect(10, 20, 50, 60)); |
| 1107 |
| 1108 float opacity = 2.0 / 255.0; |
| 1109 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 1110 EffectPaintPropertyNode::root(), transform2.get(), clip.get(), |
| 1111 CompositorFilterOperations(), opacity, SkBlendMode::kSrcOver); |
| 1112 |
| 1113 TestPaintArtifact testArtifact; |
| 1114 testArtifact |
| 1115 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1116 EffectPaintPropertyNode::root()) |
| 1117 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 1118 testArtifact |
| 1119 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get()) |
| 1120 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); |
| 1121 testArtifact |
| 1122 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1123 EffectPaintPropertyNode::root()) |
| 1124 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 1125 |
| 1126 const PaintArtifact& artifact = testArtifact.build(); |
| 1127 |
| 1128 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 1129 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 1130 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 1131 pendingLayer)); |
| 1132 pendingLayer.add(artifact.paintChunks()[1]); |
| 1133 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 1134 pendingLayer)); |
| 1135 update(artifact); |
| 1136 |
| 1137 ASSERT_EQ(1u, contentLayerCount()); |
| 1138 { |
| 1139 Vector<RectWithColor> rectsWithColor; |
| 1140 rectsWithColor.push_back( |
| 1141 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 1142 // The clip is under |transform| but not |transform2|, so only an adjustment |
| 1143 // of (20, 25) occurs. |
| 1144 rectsWithColor.push_back( |
| 1145 RectWithColor(FloatRect(30, 45, 50, 60), |
| 1146 Color(Color::black).combineWithAlpha(opacity).rgb())); |
| 1147 rectsWithColor.push_back( |
| 1148 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 1149 |
| 1150 const cc::Layer* layer = contentLayerAt(0); |
| 1151 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 1152 } |
| 1153 } |
| 1154 |
| 1155 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, ClipAndEffectNoTransform) { |
| 1156 // Tests merging of an element which has a clip and effect in the root |
| 1157 // transform space. |
| 1158 |
| 1159 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 1160 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 1161 FloatRoundedRect(10, 20, 50, 60)); |
| 1162 |
| 1163 float opacity = 2.0 / 255.0; |
| 1164 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( |
| 1165 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 1166 clip.get(), CompositorFilterOperations(), opacity, SkBlendMode::kSrcOver); |
| 1167 |
| 1168 TestPaintArtifact testArtifact; |
| 1169 testArtifact |
| 1170 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1171 EffectPaintPropertyNode::root()) |
| 1172 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 1173 testArtifact |
| 1174 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get()) |
| 1175 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); |
| 1176 testArtifact |
| 1177 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1178 EffectPaintPropertyNode::root()) |
| 1179 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 1180 |
| 1181 const PaintArtifact& artifact = testArtifact.build(); |
| 1182 |
| 1183 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 1184 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 1185 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 1186 pendingLayer)); |
| 1187 pendingLayer.add(artifact.paintChunks()[1]); |
| 1188 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 1189 pendingLayer)); |
| 1190 update(artifact); |
| 1191 |
| 1192 ASSERT_EQ(1u, contentLayerCount()); |
| 1193 { |
| 1194 Vector<RectWithColor> rectsWithColor; |
| 1195 rectsWithColor.push_back( |
| 1196 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 1197 rectsWithColor.push_back( |
| 1198 RectWithColor(FloatRect(10, 20, 50, 60), |
| 1199 Color(Color::black).combineWithAlpha(opacity).rgb())); |
| 1200 rectsWithColor.push_back( |
| 1201 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 1202 |
| 1203 const cc::Layer* layer = contentLayerAt(0); |
| 1204 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 1205 } |
| 1206 } |
| 1207 |
| 1208 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TwoClips) { |
| 1209 // Tests merging of an element which has two clips in the root |
| 1210 // transform space. |
| 1211 |
| 1212 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create( |
| 1213 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(), |
| 1214 FloatRoundedRect(20, 30, 10, 20)); |
| 1215 |
| 1216 RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create( |
| 1217 clip.get(), TransformPaintPropertyNode::root(), |
| 1218 FloatRoundedRect(10, 20, 50, 60)); |
| 1219 |
| 1220 TestPaintArtifact testArtifact; |
| 1221 testArtifact |
| 1222 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1223 EffectPaintPropertyNode::root()) |
| 1224 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); |
| 1225 testArtifact |
| 1226 .chunk(TransformPaintPropertyNode::root(), clip2.get(), |
| 1227 EffectPaintPropertyNode::root()) |
| 1228 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); |
| 1229 testArtifact |
| 1230 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1231 EffectPaintPropertyNode::root()) |
| 1232 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); |
| 1233 |
| 1234 const PaintArtifact& artifact = testArtifact.build(); |
| 1235 |
| 1236 ASSERT_EQ(3u, artifact.paintChunks().size()); |
| 1237 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]); |
| 1238 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[1], |
| 1239 pendingLayer)); |
| 1240 pendingLayer.add(artifact.paintChunks()[1]); |
| 1241 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(artifact.paintChunks()[2], |
| 1242 pendingLayer)); |
| 1243 update(artifact); |
| 1244 |
| 1245 ASSERT_EQ(1u, contentLayerCount()); |
| 1246 { |
| 1247 Vector<RectWithColor> rectsWithColor; |
| 1248 rectsWithColor.push_back( |
| 1249 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); |
| 1250 // The interesction of the two clips is (20, 30, 10, 20). |
| 1251 rectsWithColor.push_back( |
| 1252 RectWithColor(FloatRect(20, 30, 10, 20), Color(Color::black))); |
| 1253 rectsWithColor.push_back( |
| 1254 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); |
| 1255 |
| 1256 const cc::Layer* layer = contentLayerAt(0); |
| 1257 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); |
| 1258 } |
| 1259 } |
| 1260 |
| 1261 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayer) { |
| 1262 PaintChunk chunk1; |
| 1263 chunk1.properties.propertyTreeState = PropertyTreeState( |
| 1264 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
| 1265 EffectPaintPropertyNode::root(), ScrollPaintPropertyNode::root()); |
| 1266 chunk1.properties.backfaceHidden = true; |
| 1267 chunk1.knownToBeOpaque = true; |
| 1268 chunk1.bounds = FloatRect(0, 0, 30, 40); |
| 1269 |
| 1270 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1); |
| 1271 |
| 1272 EXPECT_TRUE(pendingLayer.backfaceHidden); |
| 1273 EXPECT_TRUE(pendingLayer.knownToBeOpaque); |
| 1274 EXPECT_FLOAT_RECT_EQ(FloatRect(0, 0, 30, 40), pendingLayer.bounds); |
| 1275 |
| 1276 PaintChunk chunk2; |
| 1277 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState; |
| 1278 chunk2.properties.backfaceHidden = true; |
| 1279 chunk2.knownToBeOpaque = false; |
| 1280 chunk2.bounds = FloatRect(10, 20, 30, 40); |
| 1281 pendingLayer.add(chunk2); |
| 1282 |
| 1283 EXPECT_TRUE(pendingLayer.backfaceHidden); |
| 1284 EXPECT_FALSE(pendingLayer.knownToBeOpaque); |
| 1285 EXPECT_FLOAT_RECT_EQ(FloatRect(0, 0, 40, 60), pendingLayer.bounds); |
| 1286 |
| 1287 PaintChunk chunk3; |
| 1288 chunk3.properties.propertyTreeState = chunk1.properties.propertyTreeState; |
| 1289 chunk3.properties.backfaceHidden = true; |
| 1290 chunk3.knownToBeOpaque = true; |
| 1291 chunk3.bounds = FloatRect(-5, -25, 20, 20); |
| 1292 pendingLayer.add(chunk3); |
| 1293 |
| 1294 EXPECT_TRUE(pendingLayer.backfaceHidden); |
| 1295 EXPECT_FALSE(pendingLayer.knownToBeOpaque); |
| 1296 EXPECT_FLOAT_RECT_EQ(FloatRect(-5, -25, 45, 85), pendingLayer.bounds); |
| 1297 } |
| 1298 |
| 722 } // namespace blink | 1299 } // namespace blink |
| OLD | NEW |