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

Side by Side Diff: third_party/WebKit/Source/platform/graphics/paint/PropertyTreeStateTest.cpp

Issue 2837183002: [SPv2] Apply effects before clips for when the effect does not move pixels (Closed)
Patch Set: none Created 3 years, 7 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/paint/PropertyTreeState.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/paint/PropertyTreeState.h" 5 #include "platform/graphics/paint/PropertyTreeState.h"
6 6
7 #include "testing/gtest/include/gtest/gtest.h" 7 #include "testing/gtest/include/gtest/gtest.h"
8 8
9 namespace blink { 9 namespace blink {
10 10
11 class PropertyTreeStateTest : public ::testing::Test {}; 11 class PropertyTreeStateTest : public ::testing::Test {};
12 12
13 TEST_F(PropertyTreeStateTest, ClipBelowOutputClipOfEffect) {
14 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
15 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
16 FloatRoundedRect());
17
18 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create(
19 EffectPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
20 ClipPaintPropertyNode::Root(), kColorFilterNone,
21 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver);
22
23 PropertyTreeState state(TransformPaintPropertyNode::Root(), clip.Get(),
24 effect.Get());
25 EXPECT_EQ(PropertyTreeState::kEffect, state.GetInnermostNode());
26
27 PropertyTreeStateIterator iterator(state);
28 EXPECT_EQ(PropertyTreeState::kClip, iterator.Next()->GetInnermostNode());
29 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode());
30 }
31
32 TEST_F(PropertyTreeStateTest, ClipBelowOutputClipOfEffectMovingPixels) {
33 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
34 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
35 FloatRoundedRect());
36
37 CompositorFilterOperations operations;
38 operations.AppendBlurFilter(2);
39 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create(
40 EffectPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
41 ClipPaintPropertyNode::Root(), kColorFilterNone, operations, 1.0,
42 SkBlendMode::kSrcOver);
43
44 PropertyTreeState state(TransformPaintPropertyNode::Root(), clip.Get(),
45 effect.Get());
46 // If the effect moves pixels, the clip must happen first.
47 EXPECT_EQ(PropertyTreeState::kClip, state.GetInnermostNode());
48
49 PropertyTreeStateIterator iterator(state);
50 EXPECT_EQ(PropertyTreeState::kEffect, iterator.Next()->GetInnermostNode());
51 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode());
52 }
53
13 TEST_F(PropertyTreeStateTest, TransformOnEffectOnClip) { 54 TEST_F(PropertyTreeStateTest, TransformOnEffectOnClip) {
14 RefPtr<TransformPaintPropertyNode> transform = 55 RefPtr<TransformPaintPropertyNode> transform =
15 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(), 56 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(),
16 TransformationMatrix(), 57 TransformationMatrix(),
17 FloatPoint3D()); 58 FloatPoint3D());
18 59
19 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create( 60 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
20 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(), 61 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
21 FloatRoundedRect()); 62 FloatRoundedRect());
22 63
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 113
73 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create( 114 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
74 ClipPaintPropertyNode::Root(), transform.Get(), FloatRoundedRect()); 115 ClipPaintPropertyNode::Root(), transform.Get(), FloatRoundedRect());
75 116
76 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create( 117 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create(
77 EffectPaintPropertyNode::Root(), transform.Get(), 118 EffectPaintPropertyNode::Root(), transform.Get(),
78 ClipPaintPropertyNode::Root(), kColorFilterNone, 119 ClipPaintPropertyNode::Root(), kColorFilterNone,
79 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); 120 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver);
80 121
81 PropertyTreeState state(transform.Get(), clip.Get(), effect.Get()); 122 PropertyTreeState state(transform.Get(), clip.Get(), effect.Get());
82 EXPECT_EQ(PropertyTreeState::kClip, state.GetInnermostNode()); 123 EXPECT_EQ(PropertyTreeState::kEffect, state.GetInnermostNode());
83 124
84 PropertyTreeStateIterator iterator(state); 125 PropertyTreeStateIterator iterator(state);
85 EXPECT_EQ(PropertyTreeState::kEffect, iterator.Next()->GetInnermostNode()); 126 EXPECT_EQ(PropertyTreeState::kClip, iterator.Next()->GetInnermostNode());
86 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode()); 127 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode());
87 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode()); 128 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode());
88 } 129 }
89 130
90 TEST_F(PropertyTreeStateTest, ClipDescendantOfTransform) { 131 TEST_F(PropertyTreeStateTest, ClipDescendantOfTransform) {
132 // CSS transform
91 RefPtr<TransformPaintPropertyNode> transform = 133 RefPtr<TransformPaintPropertyNode> transform =
92 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(), 134 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(),
93 TransformationMatrix(), 135 TransformationMatrix(),
94 FloatPoint3D()); 136 FloatPoint3D());
95 137
138 // Scroll transform
96 RefPtr<TransformPaintPropertyNode> transform2 = 139 RefPtr<TransformPaintPropertyNode> transform2 =
97 TransformPaintPropertyNode::Create( 140 TransformPaintPropertyNode::Create(
98 transform.Get(), TransformationMatrix(), FloatPoint3D()); 141 transform.Get(), TransformationMatrix(), FloatPoint3D());
99 142
143 // CSS clip
100 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create( 144 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
101 ClipPaintPropertyNode::Root(), transform2.Get(), FloatRoundedRect()); 145 ClipPaintPropertyNode::Root(), transform2.Get(), FloatRoundedRect());
102 146
103 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create( 147 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create(
104 EffectPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(), 148 EffectPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
105 ClipPaintPropertyNode::Root(), kColorFilterNone, 149 ClipPaintPropertyNode::Root(), kColorFilterNone,
106 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver); 150 CompositorFilterOperations(), 1.0, SkBlendMode::kSrcOver);
107 151
108 // Here the clip is inside of its own transform, but the transform is an 152 // Here the clip is inside of its own transform, but the
109 // ancestor of the clip's transform. This models situations such as 153 // PropertyTreeState of the content is an ancestor of the clip's transform./
110 // a clip inside a scroller that applies to an absolute-positioned element 154 // This models situations such as a CSS clip inside a scroller that applies to
111 // which escapes the scroll transform but not the clip. 155 // an absolute-positioned element which escapes the scroll transforms but not
156 // the clip.
112 PropertyTreeState state(transform.Get(), clip.Get(), effect.Get()); 157 PropertyTreeState state(transform.Get(), clip.Get(), effect.Get());
113 EXPECT_EQ(PropertyTreeState::kClip, state.GetInnermostNode()); 158 EXPECT_EQ(PropertyTreeState::kClip, state.GetInnermostNode());
114 159
115 PropertyTreeStateIterator iterator(state); 160 PropertyTreeStateIterator iterator(state);
116 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode()); 161 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode());
117 EXPECT_EQ(PropertyTreeState::kEffect, iterator.Next()->GetInnermostNode()); 162 EXPECT_EQ(PropertyTreeState::kEffect, iterator.Next()->GetInnermostNode());
118 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode()); 163 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode());
119 } 164 }
120 165
121 TEST_F(PropertyTreeStateTest, EffectDescendantOfTransform) { 166 TEST_F(PropertyTreeStateTest, EffectDescendantOfTransform) {
122 RefPtr<TransformPaintPropertyNode> transform =
123 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(),
124 TransformationMatrix(),
125 FloatPoint3D());
126
127 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create( 167 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::Create(
128 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(), 168 ClipPaintPropertyNode::Root(), TransformPaintPropertyNode::Root(),
129 FloatRoundedRect()); 169 FloatRoundedRect());
130 170
131 RefPtr<TransformPaintPropertyNode> transform2 = 171 RefPtr<TransformPaintPropertyNode> transform2 =
132 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(), 172 TransformPaintPropertyNode::Create(TransformPaintPropertyNode::Root(),
133 TransformationMatrix(), 173 TransformationMatrix(),
134 FloatPoint3D()); 174 FloatPoint3D());
135 175
136 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create( 176 RefPtr<EffectPaintPropertyNode> effect = EffectPaintPropertyNode::Create(
137 EffectPaintPropertyNode::Root(), transform2.Get(), clip.Get(), 177 EffectPaintPropertyNode::Root(), transform2.Get(), clip.Get(),
138 kColorFilterNone, CompositorFilterOperations(), 1.0, 178 kColorFilterNone, CompositorFilterOperations(), 1.0,
139 SkBlendMode::kSrcOver); 179 SkBlendMode::kSrcOver);
140 180
141 // Here the clip is inside of its own transform, but the transform is an 181 PropertyTreeState state(transform2.Get(), clip.Get(), effect.Get());
142 // ancestor of the clip's transform. This models situations such as
143 // a clip inside a scroller that applies to an absolute-positioned element
144 // which escapes the scroll transform but not the clip.
145 PropertyTreeState state(transform.Get(), clip.Get(), effect.Get());
146 EXPECT_EQ(PropertyTreeState::kEffect, state.GetInnermostNode()); 182 EXPECT_EQ(PropertyTreeState::kEffect, state.GetInnermostNode());
147 183
148 PropertyTreeStateIterator iterator(state); 184 PropertyTreeStateIterator iterator(state);
149 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode()); 185 EXPECT_EQ(PropertyTreeState::kTransform, iterator.Next()->GetInnermostNode());
150 EXPECT_EQ(PropertyTreeState::kClip, iterator.Next()->GetInnermostNode()); 186 EXPECT_EQ(PropertyTreeState::kClip, iterator.Next()->GetInnermostNode());
151 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode()); 187 EXPECT_EQ(PropertyTreeState::kNone, iterator.Next()->GetInnermostNode());
152 } 188 }
153 189
154 TEST_F(PropertyTreeStateTest, CompositorElementIdNoElementIdOnAnyNode) { 190 TEST_F(PropertyTreeStateTest, CompositorElementIdNoElementIdOnAnyNode) {
155 PropertyTreeState state(TransformPaintPropertyNode::Root(), 191 PropertyTreeState state(TransformPaintPropertyNode::Root(),
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 EXPECT_EQ(second_compositor_element_id, 263 EXPECT_EQ(second_compositor_element_id,
228 state.GetCompositorElementId(composited_element_ids)); 264 state.GetCompositorElementId(composited_element_ids));
229 265
230 composited_element_ids.clear(); 266 composited_element_ids.clear();
231 composited_element_ids.insert(second_compositor_element_id); 267 composited_element_ids.insert(second_compositor_element_id);
232 EXPECT_EQ(first_compositor_element_id, 268 EXPECT_EQ(first_compositor_element_id,
233 state.GetCompositorElementId(composited_element_ids)); 269 state.GetCompositorElementId(composited_element_ids));
234 } 270 }
235 271
236 } // namespace blink 272 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/paint/PropertyTreeState.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698