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

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

Issue 2338373004: Refactor PropertyTreeState as GeometryPropertyTreeState (Closed)
Patch Set: Rebase Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/graphics/paint/GeometryMapper.h" 5 #include "platform/graphics/paint/GeometryMapper.h"
6 6
7 #include "platform/geometry/GeometryTestHelpers.h" 7 #include "platform/geometry/GeometryTestHelpers.h"
8 #include "platform/geometry/LayoutRect.h" 8 #include "platform/geometry/LayoutRect.h"
9 #include "platform/graphics/paint/ClipPaintPropertyNode.h" 9 #include "platform/graphics/paint/ClipPaintPropertyNode.h"
10 #include "platform/graphics/paint/EffectPaintPropertyNode.h" 10 #include "platform/graphics/paint/EffectPaintPropertyNode.h"
11 #include "platform/graphics/paint/TransformPaintPropertyNode.h" 11 #include "platform/graphics/paint/TransformPaintPropertyNode.h"
12 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
13 13
14 namespace blink { 14 namespace blink {
15 15
16 class GeometryMapperTest : public ::testing::Test { 16 class GeometryMapperTest : public ::testing::Test {
17 public: 17 public:
18 RefPtr<TransformPaintPropertyNode> rootTransformNode; 18 RefPtr<TransformPaintPropertyNode> rootTransformNode;
19 RefPtr<ClipPaintPropertyNode> rootClipNode; 19 RefPtr<ClipPaintPropertyNode> rootClipNode;
20 RefPtr<EffectPaintPropertyNode> rootEffectNode; 20 RefPtr<EffectPaintPropertyNode> rootEffectNode;
21 21
22 std::unique_ptr<GeometryMapper> geometryMapper; 22 std::unique_ptr<GeometryMapper> geometryMapper;
23 23
24 PropertyTreeState rootPropertyTreeState() 24 GeometryPropertyTreeState rootGeometryPropertyTreeState()
25 { 25 {
26 PropertyTreeState state(rootTransformNode.get(), rootClipNode.get(), roo tEffectNode.get()); 26 GeometryPropertyTreeState state(rootTransformNode.get(), rootClipNode.ge t(), rootEffectNode.get());
27 return state; 27 return state;
28 } 28 }
29 29
30 PrecomputedDataForAncestor& getPrecomputedDataForAncestor(const PropertyTree State& propertyTreeState) 30 PrecomputedDataForAncestor& getPrecomputedDataForAncestor(const GeometryProp ertyTreeState& geometryPropertyTreeState)
31 { 31 {
32 return geometryMapper->getPrecomputedDataForAncestor(propertyTreeState); 32 return geometryMapper->getPrecomputedDataForAncestor(geometryPropertyTre eState);
33 } 33 }
34 34
35 private: 35 private:
36 void SetUp() override 36 void SetUp() override
37 { 37 {
38 rootTransformNode = TransformPaintPropertyNode::create(nullptr, Transfor mationMatrix(), FloatPoint3D()); 38 rootTransformNode = TransformPaintPropertyNode::create(nullptr, Transfor mationMatrix(), FloatPoint3D());
39 rootClipNode = ClipPaintPropertyNode::create(nullptr, rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect())); 39 rootClipNode = ClipPaintPropertyNode::create(nullptr, rootTransformNode, FloatRoundedRect(LayoutRect::infiniteIntRect()));
40 rootEffectNode = EffectPaintPropertyNode::create(nullptr, 1.0); 40 rootEffectNode = EffectPaintPropertyNode::create(nullptr, 1.0);
41 geometryMapper = wrapUnique(new GeometryMapper()); 41 geometryMapper = wrapUnique(new GeometryMapper());
42 } 42 }
43 43
44 void TearDown() override 44 void TearDown() override
45 { 45 {
46 geometryMapper.reset(); 46 geometryMapper.reset();
47 } 47 }
48 }; 48 };
49 49
50 const static float kTestEpsilon = 1e-6; 50 const static float kTestEpsilon = 1e-6;
51 51
52 #define EXPECT_RECT_EQ(expected, actual) \ 52 #define EXPECT_RECT_EQ(expected, actual) \
53 do { \ 53 do { \
54 const FloatRect& actualRect = actual; \ 54 const FloatRect& actualRect = actual; \
55 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.x(), actualRect.x(), k TestEpsilon)) << "actual: " << actualRect.x() << ", expected: " << expected.x(); \ 55 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.x(), actualRect.x(), k TestEpsilon)) << "actual: " << actualRect.x() << ", expected: " << expected.x(); \
56 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.y(), actualRect.y(), k TestEpsilon)) << "actual: " << actualRect.y() << ", expected: " << expected.y(); \ 56 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.y(), actualRect.y(), k TestEpsilon)) << "actual: " << actualRect.y() << ", expected: " << expected.y(); \
57 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.width(), actualRect.wi dth(), kTestEpsilon)) << "actual: " << actualRect.width() << ", expected: " << e xpected.width(); \ 57 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.width(), actualRect.wi dth(), kTestEpsilon)) << "actual: " << actualRect.width() << ", expected: " << e xpected.width(); \
58 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.height(), actualRect.h eight(), kTestEpsilon)) << "actual: " << actualRect.height() << ", expected: " < < expected.height(); \ 58 EXPECT_TRUE(GeometryTest::ApproximatelyEqual(expected.height(), actualRect.h eight(), kTestEpsilon)) << "actual: " << actualRect.height() << ", expected: " < < expected.height(); \
59 } while (false) 59 } while (false)
60 60
61 #define CHECK_MAPPINGS(inputRect, expectedVisualRect, expectedTransformedRect, e xpectedTransformToAncestor, expectedClipInAncestorSpace, localPropertyTreeState, ancestorPropertyTreeState) \ 61 #define CHECK_MAPPINGS(inputRect, expectedVisualRect, expectedTransformedRect, e xpectedTransformToAncestor, expectedClipInAncestorSpace, localGeometryPropertyTr eeState, ancestorGeometryPropertyTreeState) \
62 do { \ 62 do { \
63 bool success = false; \ 63 bool success = false; \
64 EXPECT_RECT_EQ(expectedVisualRect, \ 64 EXPECT_RECT_EQ(expectedVisualRect, \
65 geometryMapper->localToVisualRectInAncestorSpace(inputRect, localPropert yTreeState, ancestorPropertyTreeState, success)); \ 65 geometryMapper->localToVisualRectInAncestorSpace(inputRect, localGeometr yPropertyTreeState, ancestorGeometryPropertyTreeState, success)); \
66 EXPECT_TRUE(success); \ 66 EXPECT_TRUE(success); \
67 EXPECT_RECT_EQ(expectedVisualRect, \ 67 EXPECT_RECT_EQ(expectedVisualRect, \
68 geometryMapper->mapToVisualRectInDestinationSpace(inputRect, localProper tyTreeState, ancestorPropertyTreeState, success)); \ 68 geometryMapper->mapToVisualRectInDestinationSpace(inputRect, localGeomet ryPropertyTreeState, ancestorGeometryPropertyTreeState, success)); \
69 EXPECT_TRUE(success); \ 69 EXPECT_TRUE(success); \
70 EXPECT_RECT_EQ(expectedTransformedRect, \ 70 EXPECT_RECT_EQ(expectedTransformedRect, \
71 geometryMapper->localToAncestorRect(inputRect, localPropertyTreeState, a ncestorPropertyTreeState, success)); \ 71 geometryMapper->localToAncestorRect(inputRect, localGeometryPropertyTree State, ancestorGeometryPropertyTreeState, success)); \
72 EXPECT_RECT_EQ(expectedTransformedRect, \ 72 EXPECT_RECT_EQ(expectedTransformedRect, \
73 geometryMapper->mapRectToDestinationSpace(inputRect, localPropertyTreeSt ate, ancestorPropertyTreeState, success)); \ 73 geometryMapper->mapRectToDestinationSpace(inputRect, localGeometryProper tyTreeState, ancestorGeometryPropertyTreeState, success)); \
74 EXPECT_TRUE(success); \ 74 EXPECT_TRUE(success); \
75 EXPECT_EQ(expectedTransformToAncestor, getPrecomputedDataForAncestor(ancesto rPropertyTreeState).toAncestorTransforms.get(localPropertyTreeState.transform.ge t())); \ 75 EXPECT_EQ(expectedTransformToAncestor, getPrecomputedDataForAncestor(ancesto rGeometryPropertyTreeState).toAncestorTransforms.get(localGeometryPropertyTreeSt ate.transform.get())); \
76 EXPECT_EQ(expectedClipInAncestorSpace, getPrecomputedDataForAncestor(ancesto rPropertyTreeState).toAncestorClipRects.get(localPropertyTreeState.clip.get())); \ 76 EXPECT_EQ(expectedClipInAncestorSpace, getPrecomputedDataForAncestor(ancesto rGeometryPropertyTreeState).toAncestorClipRects.get(localGeometryPropertyTreeSta te.clip.get())); \
77 } while (false) 77 } while (false)
78 78
79 TEST_F(GeometryMapperTest, Root) 79 TEST_F(GeometryMapperTest, Root)
80 { 80 {
81 FloatRect input(0, 0, 100, 100); 81 FloatRect input(0, 0, 100, 100);
82 82
83 CHECK_MAPPINGS(input, input, input, rootTransformNode->matrix(), rootClipNod e->clipRect().rect(), rootPropertyTreeState(), rootPropertyTreeState()); 83 CHECK_MAPPINGS(input, input, input, rootTransformNode->matrix(), rootClipNod e->clipRect().rect(), rootGeometryPropertyTreeState(), rootGeometryPropertyTreeS tate());
84 } 84 }
85 85
86 TEST_F(GeometryMapperTest, IdentityTransform) 86 TEST_F(GeometryMapperTest, IdentityTransform)
87 { 87 {
88 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, TransformationMatrix(), FloatPoint3D()) ; 88 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, TransformationMatrix(), FloatPo int3D());
89 PropertyTreeState localState = rootPropertyTreeState(); 89 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
90 localState.transform = transform.get(); 90 localState.transform = transform.get();
91 91
92 FloatRect input(0, 0, 100, 100); 92 FloatRect input(0, 0, 100, 100);
93 93
94 CHECK_MAPPINGS(input, input, input, transform->matrix(), rootClipNode->clipR ect().rect(), localState, rootPropertyTreeState()); 94 CHECK_MAPPINGS(input, input, input, transform->matrix(), rootClipNode->clipR ect().rect(), localState, rootGeometryPropertyTreeState());
95 } 95 }
96 96
97 TEST_F(GeometryMapperTest, TranslationTransform) 97 TEST_F(GeometryMapperTest, TranslationTransform)
98 { 98 {
99 TransformationMatrix transformMatrix; 99 TransformationMatrix transformMatrix;
100 transformMatrix.translate(20, 10); 100 transformMatrix.translate(20, 10);
101 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D()); 101 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, transformMatrix, FloatPoint3D() );
102 PropertyTreeState localState = rootPropertyTreeState(); 102 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
103 localState.transform = transform.get(); 103 localState.transform = transform.get();
104 104
105 FloatRect input(0, 0, 100, 100); 105 FloatRect input(0, 0, 100, 100);
106 FloatRect output = transformMatrix.mapRect(input); 106 FloatRect output = transformMatrix.mapRect(input);
107 107
108 CHECK_MAPPINGS(input, output, output, transform->matrix(), rootClipNode->cli pRect().rect(), localState, rootPropertyTreeState()); 108 CHECK_MAPPINGS(input, output, output, transform->matrix(), rootClipNode->cli pRect().rect(), localState, rootGeometryPropertyTreeState());
109 109
110 bool success = false; 110 bool success = false;
111 EXPECT_RECT_EQ(input, 111 EXPECT_RECT_EQ(input,
112 geometryMapper->ancestorToLocalRect(output, localState, rootPropertyTree State(), success)); 112 geometryMapper->ancestorToLocalRect(output, localState, rootGeometryProp ertyTreeState(), success));
113 EXPECT_TRUE(success); 113 EXPECT_TRUE(success);
114 } 114 }
115 115
116 TEST_F(GeometryMapperTest, RotationAndScaleTransform) 116 TEST_F(GeometryMapperTest, RotationAndScaleTransform)
117 { 117 {
118 TransformationMatrix transformMatrix; 118 TransformationMatrix transformMatrix;
119 transformMatrix.rotate(45); 119 transformMatrix.rotate(45);
120 transformMatrix.scale(2); 120 transformMatrix.scale(2);
121 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D(0, 0, 0)) ; 121 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, transformMatrix, FloatPoint3D(0 , 0, 0));
122 PropertyTreeState localState = rootPropertyTreeState(); 122 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
123 localState.transform = transform.get(); 123 localState.transform = transform.get();
124 124
125 FloatRect input(0, 0, 100, 100); 125 FloatRect input(0, 0, 100, 100);
126 FloatRect output = transformMatrix.mapRect(input); 126 FloatRect output = transformMatrix.mapRect(input);
127 127
128 CHECK_MAPPINGS(input, output, output, transformMatrix, rootClipNode->clipRec t().rect(), localState, rootPropertyTreeState()); 128 CHECK_MAPPINGS(input, output, output, transformMatrix, rootClipNode->clipRec t().rect(), localState, rootGeometryPropertyTreeState());
129 } 129 }
130 130
131 TEST_F(GeometryMapperTest, RotationAndScaleTransformWithTransformOrigin) 131 TEST_F(GeometryMapperTest, RotationAndScaleTransformWithTransformOrigin)
132 { 132 {
133 TransformationMatrix transformMatrix; 133 TransformationMatrix transformMatrix;
134 transformMatrix.rotate(45); 134 transformMatrix.rotate(45);
135 transformMatrix.scale(2); 135 transformMatrix.scale(2);
136 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, transformMatrix, FloatPoint3D(50, 50, 0 )); 136 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, transformMatrix, FloatPoint3D(5 0, 50, 0));
137 PropertyTreeState localState = rootPropertyTreeState(); 137 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
138 localState.transform = transform.get(); 138 localState.transform = transform.get();
139 139
140 FloatRect input(0, 0, 100, 100); 140 FloatRect input(0, 0, 100, 100);
141 transformMatrix.applyTransformOrigin(50, 50, 0); 141 transformMatrix.applyTransformOrigin(50, 50, 0);
142 FloatRect output = transformMatrix.mapRect(input); 142 FloatRect output = transformMatrix.mapRect(input);
143 143
144 CHECK_MAPPINGS(input, output, output, transformMatrix, rootClipNode->clipRec t().rect(), localState, rootPropertyTreeState()); 144 CHECK_MAPPINGS(input, output, output, transformMatrix, rootClipNode->clipRec t().rect(), localState, rootGeometryPropertyTreeState());
145 } 145 }
146 146
147 TEST_F(GeometryMapperTest, NestedTransforms) 147 TEST_F(GeometryMapperTest, NestedTransforms)
148 { 148 {
149 TransformationMatrix rotateTransform; 149 TransformationMatrix rotateTransform;
150 rotateTransform.rotate(45); 150 rotateTransform.rotate(45);
151 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D()); 151 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform, FloatPoint3D( ));
152 152
153 TransformationMatrix scaleTransform; 153 TransformationMatrix scaleTransform;
154 scaleTransform.scale(2); 154 scaleTransform.scale(2);
155 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, scaleTransform, FloatPoint3D()); 155 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, scaleTransform, FloatPoint3D());
156 156
157 PropertyTreeState localState = rootPropertyTreeState(); 157 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
158 localState.transform = transform2.get(); 158 localState.transform = transform2.get();
159 159
160 FloatRect input(0, 0, 100, 100); 160 FloatRect input(0, 0, 100, 100);
161 TransformationMatrix final = rotateTransform * scaleTransform; 161 TransformationMatrix final = rotateTransform * scaleTransform;
162 FloatRect output = final.mapRect(input); 162 FloatRect output = final.mapRect(input);
163 163
164 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect() , localState, rootPropertyTreeState()); 164 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect() , localState, rootGeometryPropertyTreeState());
165 165
166 // Check the cached matrix for the intermediate transform. 166 // Check the cached matrix for the intermediate transform.
167 EXPECT_EQ(rotateTransform, getPrecomputedDataForAncestor(rootPropertyTreeSta te()).toAncestorTransforms.get(transform1.get())); 167 EXPECT_EQ(rotateTransform, getPrecomputedDataForAncestor(rootGeometryPropert yTreeState()).toAncestorTransforms.get(transform1.get()));
168 } 168 }
169 169
170 TEST_F(GeometryMapperTest, NestedTransformsScaleAndTranslation) 170 TEST_F(GeometryMapperTest, NestedTransformsScaleAndTranslation)
171 { 171 {
172 TransformationMatrix scaleTransform; 172 TransformationMatrix scaleTransform;
173 scaleTransform.scale(2); 173 scaleTransform.scale(2);
174 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, scaleTransform, FloatPoint3D()); 174 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, scaleTransform, FloatPoint3D() );
175 175
176 TransformationMatrix translateTransform; 176 TransformationMatrix translateTransform;
177 translateTransform.translate(100, 0); 177 translateTransform.translate(100, 0);
178 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, translateTransform, FloatPoint3D()); 178 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, translateTransform, FloatPoint3D());
179 179
180 PropertyTreeState localState = rootPropertyTreeState(); 180 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
181 localState.transform = transform2.get(); 181 localState.transform = transform2.get();
182 182
183 FloatRect input(0, 0, 100, 100); 183 FloatRect input(0, 0, 100, 100);
184 // Note: unlike NestedTransforms, the order of these transforms matters. Thi s tests correct order of matrix multiplication. 184 // Note: unlike NestedTransforms, the order of these transforms matters. Thi s tests correct order of matrix multiplication.
185 TransformationMatrix final = scaleTransform * translateTransform; 185 TransformationMatrix final = scaleTransform * translateTransform;
186 FloatRect output = final.mapRect(input); 186 FloatRect output = final.mapRect(input);
187 187
188 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect() , localState, rootPropertyTreeState()); 188 CHECK_MAPPINGS(input, output, output, final, rootClipNode->clipRect().rect() , localState, rootGeometryPropertyTreeState());
189 189
190 // Check the cached matrix for the intermediate transform. 190 // Check the cached matrix for the intermediate transform.
191 EXPECT_EQ(scaleTransform, getPrecomputedDataForAncestor(rootPropertyTreeStat e()).toAncestorTransforms.get(transform1.get())); 191 EXPECT_EQ(scaleTransform, getPrecomputedDataForAncestor(rootGeometryProperty TreeState()).toAncestorTransforms.get(transform1.get()));
192 } 192 }
193 193
194 194
195 TEST_F(GeometryMapperTest, NestedTransformsIntermediateDestination) 195 TEST_F(GeometryMapperTest, NestedTransformsIntermediateDestination)
196 { 196 {
197 TransformationMatrix rotateTransform; 197 TransformationMatrix rotateTransform;
198 rotateTransform.rotate(45); 198 rotateTransform.rotate(45);
199 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D()); 199 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform, FloatPoint3D( ));
200 200
201 TransformationMatrix scaleTransform; 201 TransformationMatrix scaleTransform;
202 scaleTransform.scale(2); 202 scaleTransform.scale(2);
203 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, scaleTransform, FloatPoint3D()); 203 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(transform1, scaleTransform, FloatPoint3D());
204 204
205 PropertyTreeState localState = rootPropertyTreeState(); 205 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
206 localState.transform = transform2.get(); 206 localState.transform = transform2.get();
207 207
208 PropertyTreeState intermediateState = rootPropertyTreeState(); 208 GeometryPropertyTreeState intermediateState = rootGeometryPropertyTreeState( );
209 intermediateState.transform = transform1.get(); 209 intermediateState.transform = transform1.get();
210 210
211 FloatRect input(0, 0, 100, 100); 211 FloatRect input(0, 0, 100, 100);
212 FloatRect output = scaleTransform.mapRect(input); 212 FloatRect output = scaleTransform.mapRect(input);
213 213
214 CHECK_MAPPINGS(input, output, output, scaleTransform, rootClipNode->clipRect ().rect(), localState, intermediateState); 214 CHECK_MAPPINGS(input, output, output, scaleTransform, rootClipNode->clipRect ().rect(), localState, intermediateState);
215 } 215 }
216 216
217 TEST_F(GeometryMapperTest, SimpleClip) 217 TEST_F(GeometryMapperTest, SimpleClip)
218 { 218 {
219 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, rootTransformNode, FloatRoundedRect(10, 10, 50, 50)); 219 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, rootTransformNode, FloatRoundedRect(10, 10, 50, 50));
220 220
221 PropertyTreeState localState = rootPropertyTreeState(); 221 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
222 localState.clip = clip.get(); 222 localState.clip = clip.get();
223 223
224 FloatRect input(0, 0, 100, 100); 224 FloatRect input(0, 0, 100, 100);
225 FloatRect output(10, 10, 50, 50); 225 FloatRect output(10, 10, 50, 50);
226 226
227 CHECK_MAPPINGS( 227 CHECK_MAPPINGS(
228 input, // Input 228 input, // Input
229 output, // Visual rect 229 output, // Visual rect
230 input, // Transformed rect (not clipped). 230 input, // Transformed rect (not clipped).
231 rootTransformNode->matrix(), // Transform matrix to ancestor space 231 rootTransformNode->matrix(), // Transform matrix to ancestor space
232 clip->clipRect().rect(), // Clip rect in ancestor space 232 clip->clipRect().rect(), // Clip rect in ancestor space
233 localState, rootPropertyTreeState()); 233 localState, rootGeometryPropertyTreeState());
234 } 234 }
235 235
236 TEST_F(GeometryMapperTest, ClipBeforeTransform) 236 TEST_F(GeometryMapperTest, ClipBeforeTransform)
237 { 237 {
238 TransformationMatrix rotateTransform; 238 TransformationMatrix rotateTransform;
239 rotateTransform.rotate(45); 239 rotateTransform.rotate(45);
240 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D()); 240 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, rotateTransform, FloatPoint3D() );
241 241
242 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, transform.get(), FloatRoundedRect(10, 10, 50, 50)); 242 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, transform.get(), FloatRoundedRect(10, 10, 50, 50));
243 243
244 PropertyTreeState localState = rootPropertyTreeState(); 244 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
245 localState.clip = clip.get(); 245 localState.clip = clip.get();
246 localState.transform = transform.get(); 246 localState.transform = transform.get();
247 247
248 FloatRect input(0, 0, 100, 100); 248 FloatRect input(0, 0, 100, 100);
249 FloatRect output(input); 249 FloatRect output(input);
250 output.intersect(clip->clipRect().rect()); 250 output.intersect(clip->clipRect().rect());
251 output = rotateTransform.mapRect(output); 251 output = rotateTransform.mapRect(output);
252 252
253 CHECK_MAPPINGS( 253 CHECK_MAPPINGS(
254 input, // Input 254 input, // Input
255 output, // Visual rect 255 output, // Visual rect
256 rotateTransform.mapRect(input), // Transformed rect (not clipped). 256 rotateTransform.mapRect(input), // Transformed rect (not clipped).
257 rotateTransform, // Transform matrix to ancestor space 257 rotateTransform, // Transform matrix to ancestor space
258 rotateTransform.mapRect(clip->clipRect().rect()), // Clip rect in ancest or space 258 rotateTransform.mapRect(clip->clipRect().rect()), // Clip rect in ancest or space
259 localState, rootPropertyTreeState()); 259 localState, rootGeometryPropertyTreeState());
260 } 260 }
261 261
262 TEST_F(GeometryMapperTest, ClipAfterTransform) 262 TEST_F(GeometryMapperTest, ClipAfterTransform)
263 { 263 {
264 TransformationMatrix rotateTransform; 264 TransformationMatrix rotateTransform;
265 rotateTransform.rotate(45); 265 rotateTransform.rotate(45);
266 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D()); 266 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, rotateTransform, FloatPoint3D() );
267 267
268 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200)); 268 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootClipN ode, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200));
269 269
270 PropertyTreeState localState = rootPropertyTreeState(); 270 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
271 localState.clip = clip.get(); 271 localState.clip = clip.get();
272 localState.transform = transform.get(); 272 localState.transform = transform.get();
273 273
274 FloatRect input(0, 0, 100, 100); 274 FloatRect input(0, 0, 100, 100);
275 FloatRect output(input); 275 FloatRect output(input);
276 output = rotateTransform.mapRect(output); 276 output = rotateTransform.mapRect(output);
277 output.intersect(clip->clipRect().rect()); 277 output.intersect(clip->clipRect().rect());
278 278
279 CHECK_MAPPINGS( 279 CHECK_MAPPINGS(
280 input, // Input 280 input, // Input
281 output, // Visual rect 281 output, // Visual rect
282 rotateTransform.mapRect(input), // Transformed rect (not clipped) 282 rotateTransform.mapRect(input), // Transformed rect (not clipped)
283 rotateTransform, // Transform matrix to ancestor space 283 rotateTransform, // Transform matrix to ancestor space
284 clip->clipRect().rect(), // Clip rect in ancestor space 284 clip->clipRect().rect(), // Clip rect in ancestor space
285 localState, rootPropertyTreeState()); 285 localState, rootGeometryPropertyTreeState());
286 } 286 }
287 287
288 TEST_F(GeometryMapperTest, TwoClipsWithTransformBetween) 288 TEST_F(GeometryMapperTest, TwoClipsWithTransformBetween)
289 { 289 {
290 RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(rootClip Node, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200)); 290 RefPtr<ClipPaintPropertyNode> clip1 = ClipPaintPropertyNode::create(rootClip Node, rootTransformNode.get(), FloatRoundedRect(10, 10, 200, 200));
291 291
292 TransformationMatrix rotateTransform; 292 TransformationMatrix rotateTransform;
293 rotateTransform.rotate(45); 293 rotateTransform.rotate(45);
294 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootPropertyTreeState().transform, rotateTransform, FloatPoint3D()); 294 RefPtr<TransformPaintPropertyNode> transform = TransformPaintPropertyNode::c reate(rootGeometryPropertyTreeState().transform, rotateTransform, FloatPoint3D() );
295 295
296 RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(clip1, t ransform.get(), FloatRoundedRect(10, 10, 200, 200)); 296 RefPtr<ClipPaintPropertyNode> clip2 = ClipPaintPropertyNode::create(clip1, t ransform.get(), FloatRoundedRect(10, 10, 200, 200));
297 297
298 FloatRect input(0, 0, 100, 100); 298 FloatRect input(0, 0, 100, 100);
299 299
300 { 300 {
301 PropertyTreeState localState = rootPropertyTreeState(); 301 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
302 localState.clip = clip1.get(); 302 localState.clip = clip1.get();
303 localState.transform = transform.get(); 303 localState.transform = transform.get();
304 304
305 FloatRect output(input); 305 FloatRect output(input);
306 output = rotateTransform.mapRect(output); 306 output = rotateTransform.mapRect(output);
307 output.intersect(clip1->clipRect().rect()); 307 output.intersect(clip1->clipRect().rect());
308 308
309 CHECK_MAPPINGS( 309 CHECK_MAPPINGS(
310 input, // Input 310 input, // Input
311 output, // Visual rect 311 output, // Visual rect
312 rotateTransform.mapRect(input), // Transformed rect (not clipped) 312 rotateTransform.mapRect(input), // Transformed rect (not clipped)
313 rotateTransform, // Transform matrix to ancestor space 313 rotateTransform, // Transform matrix to ancestor space
314 clip1->clipRect().rect(), // Clip rect in ancestor space 314 clip1->clipRect().rect(), // Clip rect in ancestor space
315 localState, rootPropertyTreeState()); 315 localState, rootGeometryPropertyTreeState());
316 } 316 }
317 317
318 { 318 {
319 PropertyTreeState localState = rootPropertyTreeState(); 319 GeometryPropertyTreeState localState = rootGeometryPropertyTreeState();
320 localState.clip = clip2.get(); 320 localState.clip = clip2.get();
321 localState.transform = transform.get(); 321 localState.transform = transform.get();
322 322
323 323
324 FloatRect mappedClip = rotateTransform.mapRect(clip2->clipRect().rect()) ; 324 FloatRect mappedClip = rotateTransform.mapRect(clip2->clipRect().rect()) ;
325 mappedClip.intersect(clip1->clipRect().rect()); 325 mappedClip.intersect(clip1->clipRect().rect());
326 326
327 // All clips are performed in the space of the ancestor. In cases such a s this, this means the 327 // All clips are performed in the space of the ancestor. In cases such a s this, this means the
328 // clip is a bit lossy. 328 // clip is a bit lossy.
329 FloatRect output(input); 329 FloatRect output(input);
330 // Map to transformed rect in ancestor space. 330 // Map to transformed rect in ancestor space.
331 output = rotateTransform.mapRect(output); 331 output = rotateTransform.mapRect(output);
332 // Intersect with all clips between local and ancestor, independently ma pped to ancestor space. 332 // Intersect with all clips between local and ancestor, independently ma pped to ancestor space.
333 output.intersect(mappedClip); 333 output.intersect(mappedClip);
334 334
335 CHECK_MAPPINGS( 335 CHECK_MAPPINGS(
336 input, // Input 336 input, // Input
337 output, // Visual rect 337 output, // Visual rect
338 rotateTransform.mapRect(input), // Transformed rect (not clipped) 338 rotateTransform.mapRect(input), // Transformed rect (not clipped)
339 rotateTransform, // Transform matrix to ancestor space 339 rotateTransform, // Transform matrix to ancestor space
340 mappedClip, // Clip rect in ancestor space 340 mappedClip, // Clip rect in ancestor space
341 localState, rootPropertyTreeState()); 341 localState, rootGeometryPropertyTreeState());
342 } 342 }
343 } 343 }
344 344
345 TEST_F(GeometryMapperTest, SiblingTransforms) 345 TEST_F(GeometryMapperTest, SiblingTransforms)
346 { 346 {
347 // These transforms are siblings. Thus mapping from one to the other require s going through the root. 347 // These transforms are siblings. Thus mapping from one to the other require s going through the root.
348 TransformationMatrix rotateTransform1; 348 TransformationMatrix rotateTransform1;
349 rotateTransform1.rotate(45); 349 rotateTransform1.rotate(45);
350 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform1, FloatPoint3D()); 350 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform1, FloatPoint3D ());
351 351
352 TransformationMatrix rotateTransform2; 352 TransformationMatrix rotateTransform2;
353 rotateTransform2.rotate(-45); 353 rotateTransform2.rotate(-45);
354 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform2, FloatPoint3D()); 354 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform2, FloatPoint3D ());
355 355
356 PropertyTreeState transform1State = rootPropertyTreeState(); 356 GeometryPropertyTreeState transform1State = rootGeometryPropertyTreeState();
357 transform1State.transform = transform1; 357 transform1State.transform = transform1;
358 PropertyTreeState transform2State = rootPropertyTreeState(); 358 GeometryPropertyTreeState transform2State = rootGeometryPropertyTreeState();
359 transform2State.transform = transform2; 359 transform2State.transform = transform2;
360 360
361 bool success; 361 bool success;
362 FloatRect input(0, 0, 100, 100); 362 FloatRect input(0, 0, 100, 100);
363 FloatRect result = geometryMapper->localToVisualRectInAncestorSpace(input, t ransform1State, transform2State, success); 363 FloatRect result = geometryMapper->localToVisualRectInAncestorSpace(input, t ransform1State, transform2State, success);
364 // Fails, because the transform2state is not an ancestor of transform1State. 364 // Fails, because the transform2state is not an ancestor of transform1State.
365 EXPECT_FALSE(success); 365 EXPECT_FALSE(success);
366 EXPECT_RECT_EQ(input, result); 366 EXPECT_RECT_EQ(input, result);
367 367
368 result = geometryMapper->localToAncestorRect(input, transform1State, transfo rm2State, success); 368 result = geometryMapper->localToAncestorRect(input, transform1State, transfo rm2State, success);
(...skipping 19 matching lines...) Expand all
388 result = geometryMapper->mapRectToDestinationSpace(input, transform1State, t ransform2State, success); 388 result = geometryMapper->mapRectToDestinationSpace(input, transform1State, t ransform2State, success);
389 EXPECT_TRUE(success); 389 EXPECT_TRUE(success);
390 EXPECT_RECT_EQ(expected, result); 390 EXPECT_RECT_EQ(expected, result);
391 } 391 }
392 392
393 TEST_F(GeometryMapperTest, SiblingTransformsWithClip) 393 TEST_F(GeometryMapperTest, SiblingTransformsWithClip)
394 { 394 {
395 // These transforms are siblings. Thus mapping from one to the other require s going through the root. 395 // These transforms are siblings. Thus mapping from one to the other require s going through the root.
396 TransformationMatrix rotateTransform1; 396 TransformationMatrix rotateTransform1;
397 rotateTransform1.rotate(45); 397 rotateTransform1.rotate(45);
398 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform1, FloatPoint3D()); 398 RefPtr<TransformPaintPropertyNode> transform1 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform1, FloatPoint3D ());
399 399
400 TransformationMatrix rotateTransform2; 400 TransformationMatrix rotateTransform2;
401 rotateTransform2.rotate(-45); 401 rotateTransform2.rotate(-45);
402 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(rootPropertyTreeState().transform, rotateTransform2, FloatPoint3D()); 402 RefPtr<TransformPaintPropertyNode> transform2 = TransformPaintPropertyNode:: create(rootGeometryPropertyTreeState().transform, rotateTransform2, FloatPoint3D ());
403 403
404 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootPrope rtyTreeState().clip, transform2.get(), FloatRoundedRect(10, 10, 70, 70)); 404 RefPtr<ClipPaintPropertyNode> clip = ClipPaintPropertyNode::create(rootGeome tryPropertyTreeState().clip, transform2.get(), FloatRoundedRect(10, 10, 70, 70)) ;
405 405
406 PropertyTreeState transform1State = rootPropertyTreeState(); 406 GeometryPropertyTreeState transform1State = rootGeometryPropertyTreeState();
407 transform1State.transform = transform1; 407 transform1State.transform = transform1;
408 PropertyTreeState transform2AndClipState = rootPropertyTreeState(); 408 GeometryPropertyTreeState transform2AndClipState = rootGeometryPropertyTreeS tate();
409 transform2AndClipState.transform = transform2; 409 transform2AndClipState.transform = transform2;
410 transform2AndClipState.clip = clip; 410 transform2AndClipState.clip = clip;
411 411
412 bool success; 412 bool success;
413 FloatRect input(0, 0, 100, 100); 413 FloatRect input(0, 0, 100, 100);
414 414
415 // Test map from transform1State to transform2AndClipState. 415 // Test map from transform1State to transform2AndClipState.
416 FloatRect expected = rotateTransform2.inverse().mapRect(rotateTransform1.map Rect(input)); 416 FloatRect expected = rotateTransform2.inverse().mapRect(rotateTransform1.map Rect(input));
417 417
418 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor t o destination. 418 // mapToVisualRectInDestinationSpace ignores clip from the common ancestor t o destination.
(...skipping 15 matching lines...) Expand all
434 EXPECT_TRUE(success); 434 EXPECT_TRUE(success);
435 EXPECT_RECT_EQ(expectedClipped, result); 435 EXPECT_RECT_EQ(expectedClipped, result);
436 436
437 // mapRectToDestinationSpace ignores clip. 437 // mapRectToDestinationSpace ignores clip.
438 result = geometryMapper->mapRectToDestinationSpace(input, transform2AndClipS tate, transform1State, success); 438 result = geometryMapper->mapRectToDestinationSpace(input, transform2AndClipS tate, transform1State, success);
439 EXPECT_TRUE(success); 439 EXPECT_TRUE(success);
440 EXPECT_RECT_EQ(expectedUnclipped, result); 440 EXPECT_RECT_EQ(expectedUnclipped, result);
441 } 441 }
442 442
443 } // namespace blink 443 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698