| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/graphics/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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |