Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp

Issue 2581843002: Implement merging non-composited paint property nodes in the PACompositor. (Closed)
Patch Set: none Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698