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

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

Issue 2714673002: [SPv2] Implement effect compositing for indirect reasons (Closed)
Patch Set: mark tests 589265 Created 3 years, 9 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
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <memory> 7 #include <memory>
8 8
9 #include "base/test/test_simple_task_runner.h" 9 #include "base/test/test_simple_task_runner.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 TestPaintArtifact artifact; 540 TestPaintArtifact artifact;
541 artifact 541 artifact
542 .chunk(TransformPaintPropertyNode::root(), clip1, 542 .chunk(TransformPaintPropertyNode::root(), clip1,
543 EffectPaintPropertyNode::root()) 543 EffectPaintPropertyNode::root())
544 .rectDrawing(FloatRect(0, 0, 640, 480), Color::white); 544 .rectDrawing(FloatRect(0, 0, 640, 480), Color::white);
545 artifact 545 artifact
546 .chunk(TransformPaintPropertyNode::root(), clip2, 546 .chunk(TransformPaintPropertyNode::root(), clip2,
547 EffectPaintPropertyNode::root()) 547 EffectPaintPropertyNode::root())
548 .rectDrawing(FloatRect(0, 0, 640, 480), Color::black); 548 .rectDrawing(FloatRect(0, 0, 640, 480), Color::black);
549 update(artifact.build()); 549 update(artifact.build());
550
551 ASSERT_EQ(2u, contentLayerCount()); 550 ASSERT_EQ(2u, contentLayerCount());
552 551
553 const cc::Layer* whiteLayer = contentLayerAt(0); 552 const cc::Layer* whiteLayer = contentLayerAt(0);
554 EXPECT_THAT(whiteLayer->GetPicture(), 553 EXPECT_THAT(whiteLayer->GetPicture(),
555 Pointee(drawsRectangle(FloatRect(0, 0, 640, 480), Color::white))); 554 Pointee(drawsRectangle(FloatRect(0, 0, 640, 480), Color::white)));
556 EXPECT_EQ(gfx::Transform(), whiteLayer->screen_space_transform()); 555 EXPECT_EQ(gfx::Transform(), whiteLayer->screen_space_transform());
557 const cc::ClipNode* whiteClip = 556 const cc::ClipNode* whiteClip =
558 propertyTrees().clip_tree.Node(whiteLayer->clip_tree_index()); 557 propertyTrees().clip_tree.Node(whiteLayer->clip_tree_index());
559 EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, whiteClip->clip_type); 558 EXPECT_EQ(cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP, whiteClip->clip_type);
560 EXPECT_TRUE(whiteClip->layers_are_clipped); 559 EXPECT_TRUE(whiteClip->layers_are_clipped);
(...skipping 28 matching lines...) Expand all
589 EffectPaintPropertyNode::root()) 588 EffectPaintPropertyNode::root())
590 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 589 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
591 testArtifact.chunk(defaultPaintChunkProperties()) 590 testArtifact.chunk(defaultPaintChunkProperties())
592 .foreignLayer(FloatPoint(50, 60), IntSize(400, 300), layer); 591 .foreignLayer(FloatPoint(50, 60), IntSize(400, 300), layer);
593 testArtifact 592 testArtifact
594 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 593 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
595 EffectPaintPropertyNode::root()) 594 EffectPaintPropertyNode::root())
596 .rectDrawing(FloatRect(0, 0, 100, 100), Color::gray); 595 .rectDrawing(FloatRect(0, 0, 100, 100), Color::gray);
597 596
598 const PaintArtifact& artifact = testArtifact.build(); 597 const PaintArtifact& artifact = testArtifact.build();
599
600 ASSERT_EQ(3u, artifact.paintChunks().size()); 598 ASSERT_EQ(3u, artifact.paintChunks().size());
601 PaintArtifactCompositor::PendingLayer pendingLayer1(
602 artifact.paintChunks()[0]);
603 // Foreign layers can't merge.
604 EXPECT_FALSE(PaintArtifactCompositor::canMergeInto(
605 artifact, artifact.paintChunks()[1], pendingLayer1));
606 PaintArtifactCompositor::PendingLayer pendingLayer2(
607 artifact.paintChunks()[1]);
608 EXPECT_FALSE(PaintArtifactCompositor::canMergeInto(
609 artifact, artifact.paintChunks()[2], pendingLayer2));
610
611 update(artifact); 599 update(artifact);
612 600
613 ASSERT_EQ(3u, contentLayerCount()); 601 ASSERT_EQ(3u, contentLayerCount());
614 EXPECT_EQ(layer, contentLayerAt(1)); 602 EXPECT_EQ(layer, contentLayerAt(1));
615 EXPECT_EQ(gfx::Size(400, 300), layer->bounds()); 603 EXPECT_EQ(gfx::Size(400, 300), layer->bounds());
616 EXPECT_EQ(translation(50, 60), layer->screen_space_transform()); 604 EXPECT_EQ(translation(50, 60), layer->screen_space_transform());
617 } 605 }
618 606
619 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectTreeConversion) { 607 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectTreeConversion) {
620 RefPtr<EffectPaintPropertyNode> effect1 = 608 RefPtr<EffectPaintPropertyNode> effect1 = EffectPaintPropertyNode::create(
621 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5); 609 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(),
622 RefPtr<EffectPaintPropertyNode> effect2 = 610 ClipPaintPropertyNode::root(), ColorFilterNone,
623 createOpacityOnlyEffect(effect1, 0.3); 611 CompositorFilterOperations(), 0.5, SkBlendMode::kSrcOver,
624 RefPtr<EffectPaintPropertyNode> effect3 = 612 CompositingReasonAll);
625 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.2); 613 RefPtr<EffectPaintPropertyNode> effect2 = EffectPaintPropertyNode::create(
614 effect1, TransformPaintPropertyNode::root(),
615 ClipPaintPropertyNode::root(), ColorFilterNone,
616 CompositorFilterOperations(), 0.3, SkBlendMode::kSrcOver,
617 CompositingReasonAll);
618 RefPtr<EffectPaintPropertyNode> effect3 = EffectPaintPropertyNode::create(
619 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(),
620 ClipPaintPropertyNode::root(), ColorFilterNone,
621 CompositorFilterOperations(), 0.2, SkBlendMode::kSrcOver,
622 CompositingReasonAll);
626 623
627 TestPaintArtifact artifact; 624 TestPaintArtifact artifact;
628 artifact 625 artifact
629 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 626 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
630 effect2.get()) 627 effect2.get())
631 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 628 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
632 artifact 629 artifact
633 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 630 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
634 effect1.get()) 631 effect1.get())
635 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 632 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 774
778 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, NestedScrollNodes) { 775 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, NestedScrollNodes) {
779 RefPtr<EffectPaintPropertyNode> effect = 776 RefPtr<EffectPaintPropertyNode> effect =
780 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5); 777 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5);
781 778
782 CompositorElementId expectedCompositorElementIdA = CompositorElementId(2, 0); 779 CompositorElementId expectedCompositorElementIdA = CompositorElementId(2, 0);
783 RefPtr<TransformPaintPropertyNode> scrollTranslationA = 780 RefPtr<TransformPaintPropertyNode> scrollTranslationA =
784 TransformPaintPropertyNode::createScrollTranslation( 781 TransformPaintPropertyNode::createScrollTranslation(
785 TransformPaintPropertyNode::root(), 782 TransformPaintPropertyNode::root(),
786 TransformationMatrix().translate(11, 13), FloatPoint3D(), false, 0, 783 TransformationMatrix().translate(11, 13), FloatPoint3D(), false, 0,
787 CompositingReasonNone, expectedCompositorElementIdA, 784 CompositingReasonLayerForScrollingContents,
788 ScrollPaintPropertyNode::root(), IntSize(2, 3), IntSize(5, 7), false, 785 expectedCompositorElementIdA, ScrollPaintPropertyNode::root(),
789 true, MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, 786 IntSize(2, 3), IntSize(5, 7), false, true,
787 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects,
790 nullptr); 788 nullptr);
791 789
792 CompositorElementId expectedCompositorElementIdB = CompositorElementId(3, 0); 790 CompositorElementId expectedCompositorElementIdB = CompositorElementId(3, 0);
793 RefPtr<TransformPaintPropertyNode> scrollTranslationB = 791 RefPtr<TransformPaintPropertyNode> scrollTranslationB =
794 TransformPaintPropertyNode::createScrollTranslation( 792 TransformPaintPropertyNode::createScrollTranslation(
795 scrollTranslationA, TransformationMatrix().translate(37, 41), 793 scrollTranslationA, TransformationMatrix().translate(37, 41),
796 FloatPoint3D(), false, 0, CompositingReasonNone, 794 FloatPoint3D(), false, 0, CompositingReasonNone,
797 expectedCompositorElementIdB, scrollTranslationA->scrollNode(), 795 expectedCompositorElementIdB, scrollTranslationA->scrollNode(),
798 IntSize(19, 23), IntSize(29, 31), true, false, 796 IntSize(19, 23), IntSize(29, 31), true, false,
799 0 /* mainThreadScrollingReasons */, nullptr); 797 0 /* mainThreadScrollingReasons */, nullptr);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 testArtifact 832 testArtifact
835 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 833 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
836 EffectPaintPropertyNode::root()) 834 EffectPaintPropertyNode::root())
837 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 835 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
838 testArtifact 836 testArtifact
839 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 837 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
840 EffectPaintPropertyNode::root()) 838 EffectPaintPropertyNode::root())
841 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 839 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
842 840
843 const PaintArtifact& artifact = testArtifact.build(); 841 const PaintArtifact& artifact = testArtifact.build();
844
845 ASSERT_EQ(2u, artifact.paintChunks().size()); 842 ASSERT_EQ(2u, artifact.paintChunks().size());
846 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
847 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
848 artifact, artifact.paintChunks()[1], pendingLayer));
849
850 update(artifact); 843 update(artifact);
851 844
852 ASSERT_EQ(1u, contentLayerCount()); 845 ASSERT_EQ(1u, contentLayerCount());
853 { 846 {
854 Vector<RectWithColor> rectsWithColor; 847 Vector<RectWithColor> rectsWithColor;
855 rectsWithColor.push_back( 848 rectsWithColor.push_back(
856 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 849 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
857 rectsWithColor.push_back( 850 rectsWithColor.push_back(
858 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 851 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
859 852
(...skipping 17 matching lines...) Expand all
877 EffectPaintPropertyNode::root()) 870 EffectPaintPropertyNode::root())
878 .rectDrawing(FloatRect(0, 0, 200, 300), Color::black); 871 .rectDrawing(FloatRect(0, 0, 200, 300), Color::black);
879 testArtifact 872 testArtifact
880 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 873 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
881 EffectPaintPropertyNode::root()) 874 EffectPaintPropertyNode::root())
882 .rectDrawing(FloatRect(0, 0, 300, 400), Color::gray); 875 .rectDrawing(FloatRect(0, 0, 300, 400), Color::gray);
883 876
884 const PaintArtifact& artifact = testArtifact.build(); 877 const PaintArtifact& artifact = testArtifact.build();
885 878
886 ASSERT_EQ(3u, artifact.paintChunks().size()); 879 ASSERT_EQ(3u, artifact.paintChunks().size());
887 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
888 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
889 artifact, artifact.paintChunks()[1], pendingLayer));
890 pendingLayer.add(artifact.paintChunks()[1], nullptr);
891 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
892 artifact, artifact.paintChunks()[2], pendingLayer));
893
894 update(artifact); 880 update(artifact);
895
896 ASSERT_EQ(1u, contentLayerCount()); 881 ASSERT_EQ(1u, contentLayerCount());
897 { 882 {
898 Vector<RectWithColor> rectsWithColor; 883 Vector<RectWithColor> rectsWithColor;
899 rectsWithColor.push_back( 884 rectsWithColor.push_back(
900 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 885 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
901 // Clip is applied to this PaintChunk. 886 // Clip is applied to this PaintChunk.
902 rectsWithColor.push_back( 887 rectsWithColor.push_back(
903 RectWithColor(FloatRect(10, 20, 50, 60), Color::black)); 888 RectWithColor(FloatRect(10, 20, 50, 60), Color::black));
904 rectsWithColor.push_back( 889 rectsWithColor.push_back(
905 RectWithColor(FloatRect(0, 0, 300, 400), Color::gray)); 890 RectWithColor(FloatRect(0, 0, 300, 400), Color::gray));
(...skipping 18 matching lines...) Expand all
924 testArtifact 909 testArtifact
925 .chunk(transform.get(), ClipPaintPropertyNode::root(), 910 .chunk(transform.get(), ClipPaintPropertyNode::root(),
926 EffectPaintPropertyNode::root()) 911 EffectPaintPropertyNode::root())
927 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 912 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
928 testArtifact 913 testArtifact
929 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 914 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
930 EffectPaintPropertyNode::root()) 915 EffectPaintPropertyNode::root())
931 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 916 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
932 917
933 const PaintArtifact& artifact = testArtifact.build(); 918 const PaintArtifact& artifact = testArtifact.build();
934
935 ASSERT_EQ(3u, artifact.paintChunks().size()); 919 ASSERT_EQ(3u, artifact.paintChunks().size());
936 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
937 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
938 artifact, artifact.paintChunks()[1], pendingLayer));
939 pendingLayer.add(artifact.paintChunks()[1], nullptr);
940 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
941 artifact, artifact.paintChunks()[2], pendingLayer));
942
943 update(artifact); 920 update(artifact);
944 921
945 ASSERT_EQ(1u, contentLayerCount()); 922 ASSERT_EQ(1u, contentLayerCount());
946 { 923 {
947 Vector<RectWithColor> rectsWithColor; 924 Vector<RectWithColor> rectsWithColor;
948 rectsWithColor.push_back( 925 rectsWithColor.push_back(
949 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 926 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
950 // Transform is applied to this PaintChunk. 927 // Transform is applied to this PaintChunk.
951 rectsWithColor.push_back( 928 rectsWithColor.push_back(
952 RectWithColor(FloatRect(50, 50, 100, 100), Color::black)); 929 RectWithColor(FloatRect(50, 50, 100, 100), Color::black));
(...skipping 23 matching lines...) Expand all
976 EffectPaintPropertyNode::root()) 953 EffectPaintPropertyNode::root())
977 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 954 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
978 // The second chunk can merge into the first because it has a descendant 955 // The second chunk can merge into the first because it has a descendant
979 // state of the first's transform and no direct compositing reason. 956 // state of the first's transform and no direct compositing reason.
980 testArtifact 957 testArtifact
981 .chunk(transform2.get(), ClipPaintPropertyNode::root(), 958 .chunk(transform2.get(), ClipPaintPropertyNode::root(),
982 EffectPaintPropertyNode::root()) 959 EffectPaintPropertyNode::root())
983 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 960 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
984 961
985 const PaintArtifact& artifact = testArtifact.build(); 962 const PaintArtifact& artifact = testArtifact.build();
986
987 ASSERT_EQ(2u, artifact.paintChunks().size()); 963 ASSERT_EQ(2u, artifact.paintChunks().size());
988 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
989 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
990 artifact, artifact.paintChunks()[1], pendingLayer));
991
992 update(artifact); 964 update(artifact);
993
994 ASSERT_EQ(1u, contentLayerCount()); 965 ASSERT_EQ(1u, contentLayerCount());
995 { 966 {
996 Vector<RectWithColor> rectsWithColor; 967 Vector<RectWithColor> rectsWithColor;
997 rectsWithColor.push_back( 968 rectsWithColor.push_back(
998 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 969 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
999 // Transform is applied to this PaintChunk. 970 // Transform is applied to this PaintChunk.
1000 rectsWithColor.push_back( 971 rectsWithColor.push_back(
1001 RectWithColor(FloatRect(50, 50, 100, 100), Color::black)); 972 RectWithColor(FloatRect(50, 50, 100, 100), Color::black));
1002 973
1003 const cc::Layer* layer = contentLayerAt(0); 974 const cc::Layer* layer = contentLayerAt(0);
(...skipping 15 matching lines...) Expand all
1019 testArtifact 990 testArtifact
1020 .chunk(transform.get(), ClipPaintPropertyNode::root(), 991 .chunk(transform.get(), ClipPaintPropertyNode::root(),
1021 EffectPaintPropertyNode::root()) 992 EffectPaintPropertyNode::root())
1022 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 993 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
1023 testArtifact 994 testArtifact
1024 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 995 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1025 EffectPaintPropertyNode::root()) 996 EffectPaintPropertyNode::root())
1026 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 997 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1027 998
1028 const PaintArtifact& artifact = testArtifact.build(); 999 const PaintArtifact& artifact = testArtifact.build();
1029
1030 ASSERT_EQ(3u, artifact.paintChunks().size()); 1000 ASSERT_EQ(3u, artifact.paintChunks().size());
1031 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1032 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1033 artifact, artifact.paintChunks()[1], pendingLayer));
1034 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1035 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1036 artifact, artifact.paintChunks()[2], pendingLayer));
1037 update(artifact); 1001 update(artifact);
1038
1039 ASSERT_EQ(1u, contentLayerCount()); 1002 ASSERT_EQ(1u, contentLayerCount());
1040 { 1003 {
1041 Vector<RectWithColor> rectsWithColor; 1004 Vector<RectWithColor> rectsWithColor;
1042 rectsWithColor.push_back( 1005 rectsWithColor.push_back(
1043 RectWithColor(FloatRect(0, 42, 100, 100), Color::white)); 1006 RectWithColor(FloatRect(0, 42, 100, 100), Color::white));
1044 // Transform is applied to this PaintChunk. 1007 // Transform is applied to this PaintChunk.
1045 rectsWithColor.push_back(RectWithColor( 1008 rectsWithColor.push_back(RectWithColor(
1046 FloatRect(29.2893, 0.578644, 141.421, 141.421), Color::black)); 1009 FloatRect(29.2893, 0.578644, 141.421, 141.421), Color::black));
1047 rectsWithColor.push_back( 1010 rectsWithColor.push_back(
1048 RectWithColor(FloatRect(00, 42, 200, 300), Color::gray)); 1011 RectWithColor(FloatRect(00, 42, 200, 300), Color::gray));
(...skipping 16 matching lines...) Expand all
1065 testArtifact 1028 testArtifact
1066 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1029 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1067 effect.get()) 1030 effect.get())
1068 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 1031 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
1069 testArtifact 1032 testArtifact
1070 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1033 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1071 EffectPaintPropertyNode::root()) 1034 EffectPaintPropertyNode::root())
1072 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1035 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1073 1036
1074 const PaintArtifact& artifact = testArtifact.build(); 1037 const PaintArtifact& artifact = testArtifact.build();
1075
1076 ASSERT_EQ(3u, artifact.paintChunks().size()); 1038 ASSERT_EQ(3u, artifact.paintChunks().size());
1077 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1078 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1079 artifact, artifact.paintChunks()[1], pendingLayer));
1080 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1081 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1082 artifact, artifact.paintChunks()[2], pendingLayer));
1083
1084 update(artifact); 1039 update(artifact);
1085
1086 ASSERT_EQ(1u, contentLayerCount()); 1040 ASSERT_EQ(1u, contentLayerCount());
1087 { 1041 {
1088 Vector<RectWithColor> rectsWithColor; 1042 Vector<RectWithColor> rectsWithColor;
1089 rectsWithColor.push_back( 1043 rectsWithColor.push_back(
1090 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1044 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1091 // Transform is applied to this PaintChunk. 1045 // Transform is applied to this PaintChunk.
1092 rectsWithColor.push_back( 1046 rectsWithColor.push_back(
1093 RectWithColor(FloatRect(0, 0, 100, 100), 1047 RectWithColor(FloatRect(0, 0, 100, 100),
1094 Color(Color::black).combineWithAlpha(opacity).rgb())); 1048 Color(Color::black).combineWithAlpha(opacity).rgb()));
1095 rectsWithColor.push_back( 1049 rectsWithColor.push_back(
(...skipping 30 matching lines...) Expand all
1126 EffectPaintPropertyNode::root()) 1080 EffectPaintPropertyNode::root())
1127 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 1081 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
1128 testArtifact.chunk(transform.get(), clip.get(), effect.get()) 1082 testArtifact.chunk(transform.get(), clip.get(), effect.get())
1129 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 1083 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
1130 testArtifact 1084 testArtifact
1131 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1085 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1132 EffectPaintPropertyNode::root()) 1086 EffectPaintPropertyNode::root())
1133 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1087 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1134 1088
1135 const PaintArtifact& artifact = testArtifact.build(); 1089 const PaintArtifact& artifact = testArtifact.build();
1136
1137 ASSERT_EQ(3u, artifact.paintChunks().size()); 1090 ASSERT_EQ(3u, artifact.paintChunks().size());
1138 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1139 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1140 artifact, artifact.paintChunks()[1], pendingLayer));
1141 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1142 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1143 artifact, artifact.paintChunks()[2], pendingLayer));
1144 update(artifact); 1091 update(artifact);
1145
1146 ASSERT_EQ(1u, contentLayerCount()); 1092 ASSERT_EQ(1u, contentLayerCount());
1147 { 1093 {
1148 Vector<RectWithColor> rectsWithColor; 1094 Vector<RectWithColor> rectsWithColor;
1149 rectsWithColor.push_back( 1095 rectsWithColor.push_back(
1150 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1096 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1151 // Transform is applied to this PaintChunk. 1097 // Transform is applied to this PaintChunk.
1152 rectsWithColor.push_back( 1098 rectsWithColor.push_back(
1153 RectWithColor(FloatRect(60, 70, 50, 60), 1099 RectWithColor(FloatRect(60, 70, 50, 60),
1154 Color(Color::black).combineWithAlpha(opacity).rgb())); 1100 Color(Color::black).combineWithAlpha(opacity).rgb()));
1155 rectsWithColor.push_back( 1101 rectsWithColor.push_back(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 testArtifact 1134 testArtifact
1189 .chunk(TransformPaintPropertyNode::root(), clip.get(), 1135 .chunk(TransformPaintPropertyNode::root(), clip.get(),
1190 EffectPaintPropertyNode::root()) 1136 EffectPaintPropertyNode::root())
1191 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1137 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1192 testArtifact 1138 testArtifact
1193 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1139 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1194 EffectPaintPropertyNode::root()) 1140 EffectPaintPropertyNode::root())
1195 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1141 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1196 1142
1197 const PaintArtifact& artifact = testArtifact.build(); 1143 const PaintArtifact& artifact = testArtifact.build();
1198
1199 ASSERT_EQ(3u, artifact.paintChunks().size()); 1144 ASSERT_EQ(3u, artifact.paintChunks().size());
1200 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1201 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1202 artifact, artifact.paintChunks()[1], pendingLayer));
1203 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1204 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1205 artifact, artifact.paintChunks()[2], pendingLayer));
1206 update(artifact); 1145 update(artifact);
1207
1208 ASSERT_EQ(1u, contentLayerCount()); 1146 ASSERT_EQ(1u, contentLayerCount());
1209 { 1147 {
1210 Vector<RectWithColor> rectsWithColor; 1148 Vector<RectWithColor> rectsWithColor;
1211 rectsWithColor.push_back( 1149 rectsWithColor.push_back(
1212 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1150 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1213 // The two transforms (combined translation of (40, 50)) are applied here, 1151 // The two transforms (combined translation of (40, 50)) are applied here,
1214 // before clipping. 1152 // before clipping.
1215 rectsWithColor.push_back( 1153 rectsWithColor.push_back(
1216 RectWithColor(FloatRect(50, 70, 50, 60), Color(Color::black))); 1154 RectWithColor(FloatRect(50, 70, 50, 60), Color(Color::black)));
1217 rectsWithColor.push_back( 1155 rectsWithColor.push_back(
1218 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 1156 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
1219 1157
1220 const cc::Layer* layer = contentLayerAt(0); 1158 const cc::Layer* layer = contentLayerAt(0);
1221 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); 1159 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor)));
1222 } 1160 }
1223 } 1161 }
1224 1162
1225 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectPushedUp) { 1163 // TODO(crbug.com/696842): The effect refuses to "decomposite" because it's in
1164 // a deeper transform space than its chunk. We should allow decomposite if
1165 // the two transform nodes share the same direct compositing ancestor.
1166 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectPushedUp_DISABLED) {
1226 // Tests merging of an element which has an effect applied to it, 1167 // Tests merging of an element which has an effect applied to it,
1227 // but has an ancestor transform of them. This can happen for fixed- 1168 // but has an ancestor transform of them. This can happen for fixed-
1228 // or absolute-position elements which escape scroll transforms. 1169 // or absolute-position elements which escape scroll transforms.
1229 1170
1230 RefPtr<TransformPaintPropertyNode> transform = 1171 RefPtr<TransformPaintPropertyNode> transform =
1231 TransformPaintPropertyNode::create( 1172 TransformPaintPropertyNode::create(
1232 TransformPaintPropertyNode::root(), 1173 TransformPaintPropertyNode::root(),
1233 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), 1174 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0),
1234 false, 0); 1175 false, 0);
1235 1176
(...skipping 16 matching lines...) Expand all
1252 testArtifact 1193 testArtifact
1253 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1194 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1254 effect.get()) 1195 effect.get())
1255 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1196 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1256 testArtifact 1197 testArtifact
1257 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1198 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1258 EffectPaintPropertyNode::root()) 1199 EffectPaintPropertyNode::root())
1259 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1200 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1260 1201
1261 const PaintArtifact& artifact = testArtifact.build(); 1202 const PaintArtifact& artifact = testArtifact.build();
1262
1263 ASSERT_EQ(3u, artifact.paintChunks().size()); 1203 ASSERT_EQ(3u, artifact.paintChunks().size());
1264 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1265 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1266 artifact, artifact.paintChunks()[1], pendingLayer));
1267 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1268 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1269 artifact, artifact.paintChunks()[2], pendingLayer));
1270 update(artifact); 1204 update(artifact);
1271
1272 ASSERT_EQ(1u, contentLayerCount()); 1205 ASSERT_EQ(1u, contentLayerCount());
1273 { 1206 {
1274 Vector<RectWithColor> rectsWithColor; 1207 Vector<RectWithColor> rectsWithColor;
1275 rectsWithColor.push_back( 1208 rectsWithColor.push_back(
1276 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1209 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1277 rectsWithColor.push_back( 1210 rectsWithColor.push_back(
1278 RectWithColor(FloatRect(0, 0, 300, 400), 1211 RectWithColor(FloatRect(0, 0, 300, 400),
1279 Color(Color::black).combineWithAlpha(opacity).rgb())); 1212 Color(Color::black).combineWithAlpha(opacity).rgb()));
1280 rectsWithColor.push_back( 1213 rectsWithColor.push_back(
1281 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 1214 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
1282 1215
1283 const cc::Layer* layer = contentLayerAt(0); 1216 const cc::Layer* layer = contentLayerAt(0);
1284 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor))); 1217 EXPECT_THAT(layer->GetPicture(), Pointee(drawsRectangles(rectsWithColor)));
1285 } 1218 }
1286 } 1219 }
1287 1220
1288 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectAndClipPushedUp) { 1221 // TODO(crbug.com/696842): The effect refuses to "decomposite" because it's in
1222 // a deeper transform space than its chunk. We should allow decomposite if
1223 // the two transform nodes share the same direct compositing ancestor.
1224 TEST_F(PaintArtifactCompositorTestWithPropertyTrees,
1225 EffectAndClipPushedUp_DISABLED) {
1289 // Tests merging of an element which has an effect applied to it, 1226 // Tests merging of an element which has an effect applied to it,
1290 // but has an ancestor transform of them. This can happen for fixed- 1227 // but has an ancestor transform of them. This can happen for fixed-
1291 // or absolute-position elements which escape scroll transforms. 1228 // or absolute-position elements which escape scroll transforms.
1292 1229
1293 RefPtr<TransformPaintPropertyNode> transform = 1230 RefPtr<TransformPaintPropertyNode> transform =
1294 TransformPaintPropertyNode::create( 1231 TransformPaintPropertyNode::create(
1295 TransformPaintPropertyNode::root(), 1232 TransformPaintPropertyNode::root(),
1296 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), 1233 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0),
1297 false, 0); 1234 false, 0);
1298 1235
(...skipping 19 matching lines...) Expand all
1318 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 1255 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
1319 testArtifact 1256 testArtifact
1320 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get()) 1257 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get())
1321 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1258 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1322 testArtifact 1259 testArtifact
1323 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1260 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1324 EffectPaintPropertyNode::root()) 1261 EffectPaintPropertyNode::root())
1325 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1262 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1326 1263
1327 const PaintArtifact& artifact = testArtifact.build(); 1264 const PaintArtifact& artifact = testArtifact.build();
1328
1329 ASSERT_EQ(3u, artifact.paintChunks().size()); 1265 ASSERT_EQ(3u, artifact.paintChunks().size());
1330 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1331 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1332 artifact, artifact.paintChunks()[1], pendingLayer));
1333 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1334 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1335 artifact, artifact.paintChunks()[2], pendingLayer));
1336 update(artifact); 1266 update(artifact);
1337
1338 ASSERT_EQ(1u, contentLayerCount()); 1267 ASSERT_EQ(1u, contentLayerCount());
1339 { 1268 {
1340 Vector<RectWithColor> rectsWithColor; 1269 Vector<RectWithColor> rectsWithColor;
1341 rectsWithColor.push_back( 1270 rectsWithColor.push_back(
1342 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1271 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1343 // The clip is under |transform| but not |transform2|, so only an adjustment 1272 // The clip is under |transform| but not |transform2|, so only an adjustment
1344 // of (20, 25) occurs. 1273 // of (20, 25) occurs.
1345 rectsWithColor.push_back( 1274 rectsWithColor.push_back(
1346 RectWithColor(FloatRect(30, 45, 50, 60), 1275 RectWithColor(FloatRect(30, 45, 50, 60),
1347 Color(Color::black).combineWithAlpha(opacity).rgb())); 1276 Color(Color::black).combineWithAlpha(opacity).rgb()));
(...skipping 26 matching lines...) Expand all
1374 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 1303 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
1375 testArtifact 1304 testArtifact
1376 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get()) 1305 .chunk(TransformPaintPropertyNode::root(), clip.get(), effect.get())
1377 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1306 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1378 testArtifact 1307 testArtifact
1379 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1308 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1380 EffectPaintPropertyNode::root()) 1309 EffectPaintPropertyNode::root())
1381 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1310 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1382 1311
1383 const PaintArtifact& artifact = testArtifact.build(); 1312 const PaintArtifact& artifact = testArtifact.build();
1384
1385 ASSERT_EQ(3u, artifact.paintChunks().size()); 1313 ASSERT_EQ(3u, artifact.paintChunks().size());
1386 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1387 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1388 artifact, artifact.paintChunks()[1], pendingLayer));
1389 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1390 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1391 artifact, artifact.paintChunks()[2], pendingLayer));
1392 update(artifact); 1314 update(artifact);
1393
1394 ASSERT_EQ(1u, contentLayerCount()); 1315 ASSERT_EQ(1u, contentLayerCount());
1395 { 1316 {
1396 Vector<RectWithColor> rectsWithColor; 1317 Vector<RectWithColor> rectsWithColor;
1397 rectsWithColor.push_back( 1318 rectsWithColor.push_back(
1398 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1319 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1399 rectsWithColor.push_back( 1320 rectsWithColor.push_back(
1400 RectWithColor(FloatRect(10, 20, 50, 60), 1321 RectWithColor(FloatRect(10, 20, 50, 60),
1401 Color(Color::black).combineWithAlpha(opacity).rgb())); 1322 Color(Color::black).combineWithAlpha(opacity).rgb()));
1402 rectsWithColor.push_back( 1323 rectsWithColor.push_back(
1403 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 1324 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
(...skipping 23 matching lines...) Expand all
1427 testArtifact 1348 testArtifact
1428 .chunk(TransformPaintPropertyNode::root(), clip2.get(), 1349 .chunk(TransformPaintPropertyNode::root(), clip2.get(),
1429 EffectPaintPropertyNode::root()) 1350 EffectPaintPropertyNode::root())
1430 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1351 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1431 testArtifact 1352 testArtifact
1432 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1353 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1433 EffectPaintPropertyNode::root()) 1354 EffectPaintPropertyNode::root())
1434 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1355 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1435 1356
1436 const PaintArtifact& artifact = testArtifact.build(); 1357 const PaintArtifact& artifact = testArtifact.build();
1437
1438 ASSERT_EQ(3u, artifact.paintChunks().size()); 1358 ASSERT_EQ(3u, artifact.paintChunks().size());
1439 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1440 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1441 artifact, artifact.paintChunks()[1], pendingLayer));
1442 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1443 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1444 artifact, artifact.paintChunks()[2], pendingLayer));
1445 update(artifact); 1359 update(artifact);
1446
1447 ASSERT_EQ(1u, contentLayerCount()); 1360 ASSERT_EQ(1u, contentLayerCount());
1448 { 1361 {
1449 Vector<RectWithColor> rectsWithColor; 1362 Vector<RectWithColor> rectsWithColor;
1450 rectsWithColor.push_back( 1363 rectsWithColor.push_back(
1451 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1364 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1452 // The interesction of the two clips is (20, 30, 10, 20). 1365 // The interesction of the two clips is (20, 30, 10, 20).
1453 rectsWithColor.push_back( 1366 rectsWithColor.push_back(
1454 RectWithColor(FloatRect(20, 30, 10, 20), Color(Color::black))); 1367 RectWithColor(FloatRect(20, 30, 10, 20), Color(Color::black)));
1455 rectsWithColor.push_back( 1368 rectsWithColor.push_back(
1456 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 1369 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
(...skipping 21 matching lines...) Expand all
1478 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1391 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1479 EffectPaintPropertyNode::root()) 1392 EffectPaintPropertyNode::root())
1480 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 1393 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
1481 testArtifact 1394 testArtifact
1482 .chunk(transform2.get(), clip.get(), EffectPaintPropertyNode::root()) 1395 .chunk(transform2.get(), clip.get(), EffectPaintPropertyNode::root())
1483 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black); 1396 .rectDrawing(FloatRect(0, 0, 300, 400), Color::black);
1484 testArtifact 1397 testArtifact
1485 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1398 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1486 EffectPaintPropertyNode::root()) 1399 EffectPaintPropertyNode::root())
1487 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1400 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1401
1488 const PaintArtifact& artifact = testArtifact.build(); 1402 const PaintArtifact& artifact = testArtifact.build();
1489 ASSERT_EQ(3u, artifact.paintChunks().size()); 1403 ASSERT_EQ(3u, artifact.paintChunks().size());
1490 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1491 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1492 artifact, artifact.paintChunks()[1], pendingLayer));
1493 pendingLayer.add(artifact.paintChunks()[1], nullptr);
1494 EXPECT_TRUE(PaintArtifactCompositor::canMergeInto(
1495 artifact, artifact.paintChunks()[2], pendingLayer));
1496 update(artifact); 1404 update(artifact);
1497 ASSERT_EQ(1u, contentLayerCount()); 1405 ASSERT_EQ(1u, contentLayerCount());
1498 { 1406 {
1499 Vector<RectWithColor> rectsWithColor; 1407 Vector<RectWithColor> rectsWithColor;
1500 rectsWithColor.push_back( 1408 rectsWithColor.push_back(
1501 RectWithColor(FloatRect(0, 0, 100, 100), Color::white)); 1409 RectWithColor(FloatRect(0, 0, 100, 100), Color::white));
1502 rectsWithColor.push_back( 1410 rectsWithColor.push_back(
1503 RectWithColor(FloatRect(40, 50, 50, 60), Color(Color::black))); 1411 RectWithColor(FloatRect(40, 50, 50, 60), Color(Color::black)));
1504 rectsWithColor.push_back( 1412 rectsWithColor.push_back(
1505 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray)); 1413 RectWithColor(FloatRect(0, 0, 200, 300), Color::gray));
(...skipping 13 matching lines...) Expand all
1519 testArtifact.chunk(defaultPaintChunkProperties()) 1427 testArtifact.chunk(defaultPaintChunkProperties())
1520 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white); 1428 .rectDrawing(FloatRect(0, 0, 100, 100), Color::white);
1521 testArtifact 1429 testArtifact
1522 .chunk(transform.get(), ClipPaintPropertyNode::root(), 1430 .chunk(transform.get(), ClipPaintPropertyNode::root(),
1523 EffectPaintPropertyNode::root()) 1431 EffectPaintPropertyNode::root())
1524 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black); 1432 .rectDrawing(FloatRect(0, 0, 100, 100), Color::black);
1525 testArtifact.chunk(defaultPaintChunkProperties()) 1433 testArtifact.chunk(defaultPaintChunkProperties())
1526 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray); 1434 .rectDrawing(FloatRect(0, 0, 200, 300), Color::gray);
1527 1435
1528 const PaintArtifact& artifact = testArtifact.build(); 1436 const PaintArtifact& artifact = testArtifact.build();
1529
1530 ASSERT_EQ(3u, artifact.paintChunks().size()); 1437 ASSERT_EQ(3u, artifact.paintChunks().size());
1531 PaintArtifactCompositor::PendingLayer pendingLayer(artifact.paintChunks()[0]);
1532
1533 EXPECT_FALSE(PaintArtifactCompositor::canMergeInto(
1534 artifact, artifact.paintChunks()[1], pendingLayer));
1535
1536 PaintArtifactCompositor::PendingLayer pendingLayer2(
1537 artifact.paintChunks()[1]);
1538 EXPECT_FALSE(PaintArtifactCompositor::canMergeInto(
1539 artifact, artifact.paintChunks()[2], pendingLayer2));
1540
1541 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
1542 EXPECT_TRUE(PaintArtifactCompositor::mightOverlap(
1543 artifact.paintChunks()[2], pendingLayer2, *geometryMapper));
1544
1545 update(artifact); 1438 update(artifact);
1546
1547 // The third paint chunk overlaps the second but can't merge due to 1439 // The third paint chunk overlaps the second but can't merge due to
1548 // incompatible transform. The second paint chunk can't merge into the first 1440 // incompatible transform. The second paint chunk can't merge into the first
1549 // due to a direct compositing reason. 1441 // due to a direct compositing reason.
1550 ASSERT_EQ(3u, contentLayerCount()); 1442 ASSERT_EQ(3u, contentLayerCount());
1551 } 1443 }
1552 1444
1553 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MightOverlap) { 1445 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, MightOverlap) {
1554 PaintChunk paintChunk; 1446 PaintChunk paintChunk;
1555 paintChunk.properties = defaultPaintChunkProperties(); 1447 paintChunk.properties = defaultPaintChunkProperties();
1556 paintChunk.bounds = FloatRect(0, 0, 100, 100); 1448 paintChunk.bounds = FloatRect(0, 0, 100, 100);
1449 PaintArtifactCompositor::PendingLayer pendingLayer(paintChunk, false);
1557 1450
1558 PaintChunk paintChunk2; 1451 PaintChunk paintChunk2;
1559 paintChunk2.properties = defaultPaintChunkProperties(); 1452 paintChunk2.properties = defaultPaintChunkProperties();
1560 paintChunk2.bounds = FloatRect(0, 0, 100, 100); 1453 paintChunk2.bounds = FloatRect(0, 0, 100, 100);
1561 1454
1562 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create(); 1455 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
1563 PaintArtifactCompositor::PendingLayer pendingLayer(paintChunk); 1456
1564 EXPECT_TRUE(PaintArtifactCompositor::mightOverlap(paintChunk2, pendingLayer, 1457 {
1565 *geometryMapper)); 1458 PaintArtifactCompositor::PendingLayer pendingLayer2(paintChunk2, false);
1459 EXPECT_TRUE(PaintArtifactCompositor::mightOverlap(
1460 pendingLayer, pendingLayer2, *geometryMapper));
1461 }
1566 1462
1567 RefPtr<TransformPaintPropertyNode> transform = 1463 RefPtr<TransformPaintPropertyNode> transform =
1568 TransformPaintPropertyNode::create( 1464 TransformPaintPropertyNode::create(
1569 TransformPaintPropertyNode::root(), 1465 TransformPaintPropertyNode::root(),
1570 TransformationMatrix().translate(99, 0), FloatPoint3D(100, 100, 0), 1466 TransformationMatrix().translate(99, 0), FloatPoint3D(100, 100, 0),
1571 false); 1467 false);
1572 1468 {
1573 paintChunk2.properties.propertyTreeState.setTransform(transform.get()); 1469 paintChunk2.properties.propertyTreeState.setTransform(transform.get());
1574 EXPECT_TRUE(PaintArtifactCompositor::mightOverlap(paintChunk2, pendingLayer, 1470 PaintArtifactCompositor::PendingLayer pendingLayer2(paintChunk2, false);
1575 *geometryMapper)); 1471 EXPECT_TRUE(PaintArtifactCompositor::mightOverlap(
1472 pendingLayer, pendingLayer2, *geometryMapper));
1473 }
1576 1474
1577 RefPtr<TransformPaintPropertyNode> transform2 = 1475 RefPtr<TransformPaintPropertyNode> transform2 =
1578 TransformPaintPropertyNode::create( 1476 TransformPaintPropertyNode::create(
1579 TransformPaintPropertyNode::root(), 1477 TransformPaintPropertyNode::root(),
1580 TransformationMatrix().translate(100, 0), FloatPoint3D(100, 100, 0), 1478 TransformationMatrix().translate(100, 0), FloatPoint3D(100, 100, 0),
1581 false); 1479 false);
1582 paintChunk2.properties.propertyTreeState.setTransform(transform2.get()); 1480 {
1583 1481 paintChunk2.properties.propertyTreeState.setTransform(transform2.get());
1584 EXPECT_FALSE(PaintArtifactCompositor::mightOverlap(paintChunk2, pendingLayer, 1482 PaintArtifactCompositor::PendingLayer pendingLayer2(paintChunk2, false);
1585 *geometryMapper)); 1483 EXPECT_FALSE(PaintArtifactCompositor::mightOverlap(
1484 pendingLayer, pendingLayer2, *geometryMapper));
1485 }
1586 } 1486 }
1587 1487
1588 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayer) { 1488 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayer) {
1489 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
1490
1589 PaintChunk chunk1; 1491 PaintChunk chunk1;
1590 chunk1.properties.propertyTreeState = PropertyTreeState( 1492 chunk1.properties.propertyTreeState = PropertyTreeState(
1591 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1493 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1592 EffectPaintPropertyNode::root()); 1494 EffectPaintPropertyNode::root());
1593 chunk1.properties.backfaceHidden = true; 1495 chunk1.properties.backfaceHidden = true;
1594 chunk1.knownToBeOpaque = true; 1496 chunk1.knownToBeOpaque = true;
1595 chunk1.bounds = FloatRect(0, 0, 30, 40); 1497 chunk1.bounds = FloatRect(0, 0, 30, 40);
1596 1498
1597 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1); 1499 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1, false);
1598 1500
1599 EXPECT_TRUE(pendingLayer.backfaceHidden); 1501 EXPECT_TRUE(pendingLayer.backfaceHidden);
1600 EXPECT_TRUE(pendingLayer.knownToBeOpaque); 1502 EXPECT_TRUE(pendingLayer.knownToBeOpaque);
1601 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 30, 40), pendingLayer.bounds); 1503 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 30, 40), pendingLayer.bounds);
1602 1504
1603 PaintChunk chunk2; 1505 PaintChunk chunk2;
1604 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState; 1506 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState;
1605 chunk2.properties.backfaceHidden = true; 1507 chunk2.properties.backfaceHidden = true;
1606 chunk2.knownToBeOpaque = true; 1508 chunk2.knownToBeOpaque = true;
1607 chunk2.bounds = FloatRect(10, 20, 30, 40); 1509 chunk2.bounds = FloatRect(10, 20, 30, 40);
1608 pendingLayer.add(chunk2, nullptr); 1510 pendingLayer.merge(PaintArtifactCompositor::PendingLayer(chunk2, false),
1511 *geometryMapper);
1609 1512
1610 EXPECT_TRUE(pendingLayer.backfaceHidden); 1513 EXPECT_TRUE(pendingLayer.backfaceHidden);
1611 // Bounds not equal to one PaintChunk. 1514 // Bounds not equal to one PaintChunk.
1612 EXPECT_FALSE(pendingLayer.knownToBeOpaque); 1515 EXPECT_FALSE(pendingLayer.knownToBeOpaque);
1613 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 40, 60), pendingLayer.bounds); 1516 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 40, 60), pendingLayer.bounds);
1614 1517
1615 PaintChunk chunk3; 1518 PaintChunk chunk3;
1616 chunk3.properties.propertyTreeState = chunk1.properties.propertyTreeState; 1519 chunk3.properties.propertyTreeState = chunk1.properties.propertyTreeState;
1617 chunk3.properties.backfaceHidden = true; 1520 chunk3.properties.backfaceHidden = true;
1618 chunk3.knownToBeOpaque = true; 1521 chunk3.knownToBeOpaque = true;
1619 chunk3.bounds = FloatRect(-5, -25, 20, 20); 1522 chunk3.bounds = FloatRect(-5, -25, 20, 20);
1620 pendingLayer.add(chunk3, nullptr); 1523 pendingLayer.merge(PaintArtifactCompositor::PendingLayer(chunk3, false),
1524 *geometryMapper);
1621 1525
1622 EXPECT_TRUE(pendingLayer.backfaceHidden); 1526 EXPECT_TRUE(pendingLayer.backfaceHidden);
1623 EXPECT_FALSE(pendingLayer.knownToBeOpaque); 1527 EXPECT_FALSE(pendingLayer.knownToBeOpaque);
1624 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(-5, -25, 45, 85), pendingLayer.bounds); 1528 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(-5, -25, 45, 85), pendingLayer.bounds);
1625 } 1529 }
1626 1530
1627 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayerWithGeometry) { 1531 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayerWithGeometry) {
1628 RefPtr<TransformPaintPropertyNode> transform = 1532 RefPtr<TransformPaintPropertyNode> transform =
1629 TransformPaintPropertyNode::create( 1533 TransformPaintPropertyNode::create(
1630 TransformPaintPropertyNode::root(), 1534 TransformPaintPropertyNode::root(),
1631 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0), 1535 TransformationMatrix().translate(20, 25), FloatPoint3D(100, 100, 0),
1632 false, 0); 1536 false, 0);
1633 1537
1634 PaintChunk chunk1; 1538 PaintChunk chunk1;
1635 chunk1.properties.propertyTreeState = PropertyTreeState( 1539 chunk1.properties.propertyTreeState = PropertyTreeState(
1636 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1540 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1637 EffectPaintPropertyNode::root()); 1541 EffectPaintPropertyNode::root());
1638 chunk1.bounds = FloatRect(0, 0, 30, 40); 1542 chunk1.bounds = FloatRect(0, 0, 30, 40);
1639 1543
1640 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1); 1544 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1, false);
1641 1545
1642 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 30, 40), pendingLayer.bounds); 1546 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 30, 40), pendingLayer.bounds);
1643 1547
1644 PaintChunk chunk2; 1548 PaintChunk chunk2;
1645 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState; 1549 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState;
1646 chunk2.properties.propertyTreeState.setTransform(transform); 1550 chunk2.properties.propertyTreeState.setTransform(transform);
1647 chunk2.bounds = FloatRect(0, 0, 50, 60); 1551 chunk2.bounds = FloatRect(0, 0, 50, 60);
1648 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create(); 1552 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
1649 pendingLayer.add(chunk2, geometryMapper.get()); 1553 pendingLayer.merge(PaintArtifactCompositor::PendingLayer(chunk2, false),
1554 *geometryMapper);
1650 1555
1651 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 70, 85), pendingLayer.bounds); 1556 EXPECT_BLINK_FLOAT_RECT_EQ(FloatRect(0, 0, 70, 85), pendingLayer.bounds);
1652 } 1557 }
1653 1558
1654 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, PendingLayerKnownOpaque) { 1559 // TODO(crbug.com/701991):
1560 // The test is disabled because opaque rect mapping is not implemented yet.
1561 TEST_F(PaintArtifactCompositorTestWithPropertyTrees,
1562 PendingLayerKnownOpaque_DISABLED) {
1563 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
1564
1655 PaintChunk chunk1; 1565 PaintChunk chunk1;
1656 chunk1.properties.propertyTreeState = PropertyTreeState( 1566 chunk1.properties.propertyTreeState = PropertyTreeState(
1657 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1567 TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1658 EffectPaintPropertyNode::root()); 1568 EffectPaintPropertyNode::root());
1659 chunk1.bounds = FloatRect(0, 0, 30, 40); 1569 chunk1.bounds = FloatRect(0, 0, 30, 40);
1660 chunk1.knownToBeOpaque = false; 1570 chunk1.knownToBeOpaque = false;
1661 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1); 1571 PaintArtifactCompositor::PendingLayer pendingLayer(chunk1, false);
1662 1572
1663 EXPECT_FALSE(pendingLayer.knownToBeOpaque); 1573 EXPECT_FALSE(pendingLayer.knownToBeOpaque);
1664 1574
1665 PaintChunk chunk2; 1575 PaintChunk chunk2;
1666 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState; 1576 chunk2.properties.propertyTreeState = chunk1.properties.propertyTreeState;
1667 chunk2.bounds = FloatRect(0, 0, 25, 35); 1577 chunk2.bounds = FloatRect(0, 0, 25, 35);
1668 chunk2.knownToBeOpaque = true; 1578 chunk2.knownToBeOpaque = true;
1669 pendingLayer.add(chunk2, nullptr); 1579 pendingLayer.merge(PaintArtifactCompositor::PendingLayer(chunk2, false),
1580 *geometryMapper);
1670 1581
1671 // Chunk 2 doesn't cover the entire layer, so not opaque. 1582 // Chunk 2 doesn't cover the entire layer, so not opaque.
1672 EXPECT_FALSE(pendingLayer.knownToBeOpaque); 1583 EXPECT_FALSE(pendingLayer.knownToBeOpaque);
1673 1584
1674 PaintChunk chunk3; 1585 PaintChunk chunk3;
1675 chunk3.properties.propertyTreeState = chunk1.properties.propertyTreeState; 1586 chunk3.properties.propertyTreeState = chunk1.properties.propertyTreeState;
1676 chunk3.bounds = FloatRect(0, 0, 50, 60); 1587 chunk3.bounds = FloatRect(0, 0, 50, 60);
1677 chunk3.knownToBeOpaque = true; 1588 chunk3.knownToBeOpaque = true;
1678 pendingLayer.add(chunk3, nullptr); 1589 pendingLayer.merge(PaintArtifactCompositor::PendingLayer(chunk3, false),
1590 *geometryMapper);
1679 1591
1680 // Chunk 3 covers the entire layer, so now it's opaque. 1592 // Chunk 3 covers the entire layer, so now it's opaque.
1681 EXPECT_TRUE(pendingLayer.knownToBeOpaque); 1593 EXPECT_TRUE(pendingLayer.knownToBeOpaque);
1682 } 1594 }
1683 1595
1684 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformWithElementId) { 1596 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformWithElementId) {
1685 CompositorElementId expectedCompositorElementId(2, 0); 1597 CompositorElementId expectedCompositorElementId(2, 0);
1686 RefPtr<TransformPaintPropertyNode> transform = 1598 RefPtr<TransformPaintPropertyNode> transform =
1687 TransformPaintPropertyNode::create( 1599 TransformPaintPropertyNode::create(
1688 TransformPaintPropertyNode::root(), TransformationMatrix().rotate(90), 1600 TransformPaintPropertyNode::root(), TransformationMatrix().rotate(90),
(...skipping 10 matching lines...) Expand all
1699 EXPECT_EQ(2, elementIdToTransformNodeIndex(expectedCompositorElementId)); 1611 EXPECT_EQ(2, elementIdToTransformNodeIndex(expectedCompositorElementId));
1700 } 1612 }
1701 1613
1702 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectWithElementId) { 1614 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, EffectWithElementId) {
1703 CompositorElementId expectedCompositorElementId(2, 0); 1615 CompositorElementId expectedCompositorElementId(2, 0);
1704 float opacity = 2.0 / 255.0; 1616 float opacity = 2.0 / 255.0;
1705 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create( 1617 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create(
1706 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(), 1618 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(),
1707 ClipPaintPropertyNode::root(), ColorFilterNone, 1619 ClipPaintPropertyNode::root(), ColorFilterNone,
1708 CompositorFilterOperations(), opacity, SkBlendMode::kSrcOver, 1620 CompositorFilterOperations(), opacity, SkBlendMode::kSrcOver,
1709 CompositingReasonNone, expectedCompositorElementId); 1621 CompositingReasonActiveAnimation, expectedCompositorElementId);
1710 1622
1711 TestPaintArtifact artifact; 1623 TestPaintArtifact artifact;
1712 artifact 1624 artifact
1713 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1625 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1714 effect.get()) 1626 effect.get())
1715 .rectDrawing(FloatRect(100, 100, 200, 100), Color::black); 1627 .rectDrawing(FloatRect(100, 100, 200, 100), Color::black);
1716 update(artifact.build()); 1628 update(artifact.build());
1717 1629
1718 EXPECT_EQ(2, elementIdToEffectNodeIndex(expectedCompositorElementId)); 1630 EXPECT_EQ(2, elementIdToEffectNodeIndex(expectedCompositorElementId));
1719 } 1631 }
(...skipping 12 matching lines...) Expand all
1732 TestPaintArtifact artifact; 1644 TestPaintArtifact artifact;
1733 artifact 1645 artifact
1734 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1646 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1735 masked.get()) 1647 masked.get())
1736 .rectDrawing(FloatRect(100, 100, 200, 200), Color::gray); 1648 .rectDrawing(FloatRect(100, 100, 200, 200), Color::gray);
1737 artifact 1649 artifact
1738 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), 1650 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1739 masking.get()) 1651 masking.get())
1740 .rectDrawing(FloatRect(150, 150, 100, 100), Color::white); 1652 .rectDrawing(FloatRect(150, 150, 100, 100), Color::white);
1741 update(artifact.build()); 1653 update(artifact.build());
1742
1743 ASSERT_EQ(2u, contentLayerCount()); 1654 ASSERT_EQ(2u, contentLayerCount());
1744 1655
1745 const cc::Layer* maskedLayer = contentLayerAt(0); 1656 const cc::Layer* maskedLayer = contentLayerAt(0);
1746 EXPECT_THAT(maskedLayer->GetPicture(), 1657 EXPECT_THAT(maskedLayer->GetPicture(),
1747 Pointee(drawsRectangle(FloatRect(0, 0, 200, 200), Color::gray))); 1658 Pointee(drawsRectangle(FloatRect(0, 0, 200, 200), Color::gray)));
1748 EXPECT_EQ(translation(100, 100), maskedLayer->screen_space_transform()); 1659 EXPECT_EQ(translation(100, 100), maskedLayer->screen_space_transform());
1749 EXPECT_EQ(gfx::Size(200, 200), maskedLayer->bounds()); 1660 EXPECT_EQ(gfx::Size(200, 200), maskedLayer->bounds());
1750 const cc::EffectNode* maskedGroup = 1661 const cc::EffectNode* maskedGroup =
1751 propertyTrees().effect_tree.Node(maskedLayer->effect_tree_index()); 1662 propertyTrees().effect_tree.Node(maskedLayer->effect_tree_index());
1752 EXPECT_TRUE(maskedGroup->has_render_surface); 1663 EXPECT_TRUE(maskedGroup->has_render_surface);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 update(artifact.build()); 1720 update(artifact.build());
1810 1721
1811 EXPECT_EQ(5u, rootLayer()->children().size()); 1722 EXPECT_EQ(5u, rootLayer()->children().size());
1812 sequenceNumber++; 1723 sequenceNumber++;
1813 EXPECT_EQ(sequenceNumber, propertyTrees().sequence_number); 1724 EXPECT_EQ(sequenceNumber, propertyTrees().sequence_number);
1814 for (auto layer : rootLayer()->children()) { 1725 for (auto layer : rootLayer()->children()) {
1815 EXPECT_EQ(sequenceNumber, layer->property_tree_sequence_number()); 1726 EXPECT_EQ(sequenceNumber, layer->property_tree_sequence_number());
1816 } 1727 }
1817 } 1728 }
1818 1729
1730 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DecompositeClip) {
1731 // A clipped paint chunk that gets merged into a previous layer should
1732 // only contribute clipped bounds to the layer bound.
1733
1734 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(
1735 ClipPaintPropertyNode::root(), TransformPaintPropertyNode::root(),
1736 FloatRoundedRect(75, 75, 100, 100));
1737
1738 TestPaintArtifact artifact;
1739 artifact
1740 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1741 EffectPaintPropertyNode::root())
1742 .rectDrawing(FloatRect(50, 50, 100, 100), Color::gray);
1743 artifact
1744 .chunk(TransformPaintPropertyNode::root(), clip.get(),
1745 EffectPaintPropertyNode::root())
1746 .rectDrawing(FloatRect(100, 100, 100, 100), Color::gray);
1747 update(artifact.build());
1748 ASSERT_EQ(1u, contentLayerCount());
1749
1750 const cc::Layer* layer = contentLayerAt(0);
1751 EXPECT_EQ(gfx::Vector2dF(50.f, 50.f), layer->offset_to_transform_parent());
1752 EXPECT_EQ(gfx::Size(125, 125), layer->bounds());
1753 }
1754
1755 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DecompositeEffect) {
1756 // An effect node without direct compositing reason and does not need to
1757 // group compositing descendants should not be composited and can merge
1758 // with other chunks.
1759
1760 RefPtr<EffectPaintPropertyNode> effect =
1761 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5);
1762
1763 TestPaintArtifact artifact;
1764 artifact
1765 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1766 EffectPaintPropertyNode::root())
1767 .rectDrawing(FloatRect(50, 25, 100, 100), Color::gray);
1768 artifact
1769 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1770 effect.get())
1771 .rectDrawing(FloatRect(25, 75, 100, 100), Color::gray);
1772 artifact
1773 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1774 EffectPaintPropertyNode::root())
1775 .rectDrawing(FloatRect(75, 75, 100, 100), Color::gray);
1776 update(artifact.build());
1777 ASSERT_EQ(1u, contentLayerCount());
1778
1779 const cc::Layer* layer = contentLayerAt(0);
1780 EXPECT_EQ(gfx::Vector2dF(25.f, 25.f), layer->offset_to_transform_parent());
1781 EXPECT_EQ(gfx::Size(150, 150), layer->bounds());
1782 EXPECT_EQ(1, layer->effect_tree_index());
1783 }
1784
1785 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DirectlyCompositedEffect) {
1786 // An effect node with direct compositing shall be composited.
1787 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::create(
1788 EffectPaintPropertyNode::root(), TransformPaintPropertyNode::root(),
1789 ClipPaintPropertyNode::root(), ColorFilterNone,
1790 CompositorFilterOperations(), 0.5f, SkBlendMode::kSrcOver,
1791 CompositingReasonAll);
1792
1793 TestPaintArtifact artifact;
1794 artifact
1795 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1796 EffectPaintPropertyNode::root())
1797 .rectDrawing(FloatRect(50, 25, 100, 100), Color::gray);
1798 artifact
1799 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1800 effect.get())
1801 .rectDrawing(FloatRect(25, 75, 100, 100), Color::gray);
1802 artifact
1803 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1804 EffectPaintPropertyNode::root())
1805 .rectDrawing(FloatRect(75, 75, 100, 100), Color::gray);
1806 update(artifact.build());
1807 ASSERT_EQ(3u, contentLayerCount());
1808
1809 const cc::Layer* layer1 = contentLayerAt(0);
1810 EXPECT_EQ(gfx::Vector2dF(50.f, 25.f), layer1->offset_to_transform_parent());
1811 EXPECT_EQ(gfx::Size(100, 100), layer1->bounds());
1812 EXPECT_EQ(1, layer1->effect_tree_index());
1813
1814 const cc::Layer* layer2 = contentLayerAt(1);
1815 EXPECT_EQ(gfx::Vector2dF(25.f, 75.f), layer2->offset_to_transform_parent());
1816 EXPECT_EQ(gfx::Size(100, 100), layer2->bounds());
1817 const cc::EffectNode* effectNode =
1818 propertyTrees().effect_tree.Node(layer2->effect_tree_index());
1819 EXPECT_EQ(1, effectNode->parent_id);
1820 EXPECT_EQ(0.5f, effectNode->opacity);
1821
1822 const cc::Layer* layer3 = contentLayerAt(2);
1823 EXPECT_EQ(gfx::Vector2dF(75.f, 75.f), layer3->offset_to_transform_parent());
1824 EXPECT_EQ(gfx::Size(100, 100), layer3->bounds());
1825 EXPECT_EQ(1, layer3->effect_tree_index());
1826 }
1827
1828 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, DecompositeDeepEffect) {
1829 // A paint chunk may enter multiple level effects with or without compositing
1830 // reasons. This test verifies we still decomposite effects without a direct
1831 // reason, but stop at a directly composited effect.
1832 RefPtr<EffectPaintPropertyNode> effect1 =
1833 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.1f);
1834 RefPtr<EffectPaintPropertyNode> effect2 = EffectPaintPropertyNode::create(
1835 effect1, TransformPaintPropertyNode::root(),
1836 ClipPaintPropertyNode::root(), ColorFilterNone,
1837 CompositorFilterOperations(), 0.2f, SkBlendMode::kSrcOver,
1838 CompositingReasonAll);
1839 RefPtr<EffectPaintPropertyNode> effect3 =
1840 createOpacityOnlyEffect(effect2, 0.3f);
1841
1842 TestPaintArtifact artifact;
1843 artifact
1844 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1845 EffectPaintPropertyNode::root())
1846 .rectDrawing(FloatRect(50, 25, 100, 100), Color::gray);
1847 artifact
1848 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1849 effect3.get())
1850 .rectDrawing(FloatRect(25, 75, 100, 100), Color::gray);
1851 artifact
1852 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1853 EffectPaintPropertyNode::root())
1854 .rectDrawing(FloatRect(75, 75, 100, 100), Color::gray);
1855 update(artifact.build());
1856 ASSERT_EQ(3u, contentLayerCount());
1857
1858 const cc::Layer* layer1 = contentLayerAt(0);
1859 EXPECT_EQ(gfx::Vector2dF(50.f, 25.f), layer1->offset_to_transform_parent());
1860 EXPECT_EQ(gfx::Size(100, 100), layer1->bounds());
1861 EXPECT_EQ(1, layer1->effect_tree_index());
1862
1863 const cc::Layer* layer2 = contentLayerAt(1);
1864 EXPECT_EQ(gfx::Vector2dF(25.f, 75.f), layer2->offset_to_transform_parent());
1865 EXPECT_EQ(gfx::Size(100, 100), layer2->bounds());
1866 const cc::EffectNode* effectNode2 =
1867 propertyTrees().effect_tree.Node(layer2->effect_tree_index());
1868 EXPECT_EQ(0.2f, effectNode2->opacity);
1869 const cc::EffectNode* effectNode1 =
1870 propertyTrees().effect_tree.Node(effectNode2->parent_id);
1871 EXPECT_EQ(1, effectNode1->parent_id);
1872 EXPECT_EQ(0.1f, effectNode1->opacity);
1873
1874 const cc::Layer* layer3 = contentLayerAt(2);
1875 EXPECT_EQ(gfx::Vector2dF(75.f, 75.f), layer3->offset_to_transform_parent());
1876 EXPECT_EQ(gfx::Size(100, 100), layer3->bounds());
1877 EXPECT_EQ(1, layer3->effect_tree_index());
1878 }
1879
1880 TEST_F(PaintArtifactCompositorTestWithPropertyTrees,
1881 IndirectlyCompositedEffect) {
1882 // An effect node without direct compositing still needs to be composited
1883 // for grouping, if some chunks need to be composited.
1884 RefPtr<EffectPaintPropertyNode> effect =
1885 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5f);
1886 RefPtr<TransformPaintPropertyNode> transform =
1887 TransformPaintPropertyNode::create(
1888 TransformPaintPropertyNode::root(), TransformationMatrix(),
1889 FloatPoint3D(), false, 0, CompositingReason3DTransform);
1890
1891 TestPaintArtifact artifact;
1892 artifact
1893 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1894 EffectPaintPropertyNode::root())
1895 .rectDrawing(FloatRect(50, 25, 100, 100), Color::gray);
1896 artifact
1897 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1898 effect.get())
1899 .rectDrawing(FloatRect(25, 75, 100, 100), Color::gray);
1900 artifact.chunk(transform.get(), ClipPaintPropertyNode::root(), effect.get())
1901 .rectDrawing(FloatRect(75, 75, 100, 100), Color::gray);
1902 update(artifact.build());
1903 ASSERT_EQ(3u, contentLayerCount());
1904
1905 const cc::Layer* layer1 = contentLayerAt(0);
1906 EXPECT_EQ(gfx::Vector2dF(50.f, 25.f), layer1->offset_to_transform_parent());
1907 EXPECT_EQ(gfx::Size(100, 100), layer1->bounds());
1908 EXPECT_EQ(1, layer1->effect_tree_index());
1909
1910 const cc::Layer* layer2 = contentLayerAt(1);
1911 EXPECT_EQ(gfx::Vector2dF(25.f, 75.f), layer2->offset_to_transform_parent());
1912 EXPECT_EQ(gfx::Size(100, 100), layer2->bounds());
1913 const cc::EffectNode* effectNode =
1914 propertyTrees().effect_tree.Node(layer2->effect_tree_index());
1915 EXPECT_EQ(1, effectNode->parent_id);
1916 EXPECT_EQ(0.5f, effectNode->opacity);
1917
1918 const cc::Layer* layer3 = contentLayerAt(2);
1919 EXPECT_EQ(gfx::Vector2dF(75.f, 75.f), layer3->offset_to_transform_parent());
1920 EXPECT_EQ(gfx::Size(100, 100), layer3->bounds());
1921 EXPECT_EQ(effectNode->id, layer3->effect_tree_index());
1922 }
1923
1924 TEST_F(PaintArtifactCompositorTestWithPropertyTrees,
1925 DecompositedEffectNotMergingDueToOverlap) {
1926 // This tests an effect that doesn't need to be composited, but needs
1927 // separate backing due to overlap with a previous composited effect.
1928 RefPtr<EffectPaintPropertyNode> effect1 =
1929 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.1f);
1930 RefPtr<EffectPaintPropertyNode> effect2 =
1931 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.2f);
1932 RefPtr<TransformPaintPropertyNode> transform =
1933 TransformPaintPropertyNode::create(
1934 TransformPaintPropertyNode::root(), TransformationMatrix(),
1935 FloatPoint3D(), false, 0, CompositingReason3DTransform);
1936 TestPaintArtifact artifact;
1937 artifact
1938 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1939 EffectPaintPropertyNode::root())
1940 .rectDrawing(FloatRect(0, 0, 50, 50), Color::gray);
1941 artifact
1942 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1943 effect1.get())
1944 .rectDrawing(FloatRect(100, 0, 50, 50), Color::gray);
1945 // This chunk has a transform that must be composited, thus causing effect1
1946 // to be composited too.
1947 artifact.chunk(transform.get(), ClipPaintPropertyNode::root(), effect1.get())
1948 .rectDrawing(FloatRect(200, 0, 50, 50), Color::gray);
1949 artifact
1950 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1951 effect2.get())
1952 .rectDrawing(FloatRect(200, 100, 50, 50), Color::gray);
1953 // This chunk overlaps with the 2nd chunk, but is seemingly safe to merge.
1954 // However because effect1 gets composited due to a composited transform,
1955 // we can't merge with effect1 nor skip it to merge with the first chunk.
1956 artifact
1957 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(),
1958 effect2.get())
1959 .rectDrawing(FloatRect(100, 0, 50, 50), Color::gray);
1960
1961 update(artifact.build());
1962 ASSERT_EQ(4u, contentLayerCount());
1963
1964 const cc::Layer* layer1 = contentLayerAt(0);
1965 EXPECT_EQ(gfx::Vector2dF(0.f, 0.f), layer1->offset_to_transform_parent());
1966 EXPECT_EQ(gfx::Size(50, 50), layer1->bounds());
1967 EXPECT_EQ(1, layer1->effect_tree_index());
1968
1969 const cc::Layer* layer2 = contentLayerAt(1);
1970 EXPECT_EQ(gfx::Vector2dF(100.f, 0.f), layer2->offset_to_transform_parent());
1971 EXPECT_EQ(gfx::Size(50, 50), layer2->bounds());
1972 const cc::EffectNode* effectNode =
1973 propertyTrees().effect_tree.Node(layer2->effect_tree_index());
1974 EXPECT_EQ(1, effectNode->parent_id);
1975 EXPECT_EQ(0.1f, effectNode->opacity);
1976
1977 const cc::Layer* layer3 = contentLayerAt(2);
1978 EXPECT_EQ(gfx::Vector2dF(200.f, 0.f), layer3->offset_to_transform_parent());
1979 EXPECT_EQ(gfx::Size(50, 50), layer3->bounds());
1980 EXPECT_EQ(effectNode->id, layer3->effect_tree_index());
1981
1982 const cc::Layer* layer4 = contentLayerAt(3);
1983 EXPECT_EQ(gfx::Vector2dF(100.f, 0.f), layer4->offset_to_transform_parent());
1984 EXPECT_EQ(gfx::Size(150, 150), layer4->bounds());
1985 EXPECT_EQ(1, layer4->effect_tree_index());
1986 }
1987
1819 } // namespace blink 1988 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698