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

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

Issue 2743733004: Revert of Reduce copying of local data structures in GeometryMapper and PaintLayerClipper. (Closed)
Patch Set: 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
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/RuntimeEnabledFeatures.h" 7 #include "platform/RuntimeEnabledFeatures.h"
8 #include "platform/geometry/LayoutRect.h" 8 #include "platform/geometry/LayoutRect.h"
9 9
10 namespace blink { 10 namespace blink {
11 11
12 void GeometryMapper::sourceToDestinationVisualRect( 12 FloatClipRect GeometryMapper::sourceToDestinationVisualRect(
13 const FloatRect& rect,
14 const PropertyTreeState& sourceState,
15 const PropertyTreeState& destinationState) {
16 bool success = false;
17 FloatClipRect result = sourceToDestinationVisualRectInternal(
18 rect, sourceState, destinationState, success);
19 DCHECK(success);
20 return result;
21 }
22
23 FloatClipRect GeometryMapper::sourceToDestinationVisualRectInternal(
24 const FloatRect& rect,
13 const PropertyTreeState& sourceState, 25 const PropertyTreeState& sourceState,
14 const PropertyTreeState& destinationState, 26 const PropertyTreeState& destinationState,
15 FloatRect& rect) {
16 bool success = false;
17 sourceToDestinationVisualRectInternal(sourceState, destinationState, rect,
18 success);
19 DCHECK(success);
20 }
21
22 void GeometryMapper::sourceToDestinationVisualRectInternal(
23 const PropertyTreeState& sourceState,
24 const PropertyTreeState& destinationState,
25 FloatRect& mappingRect,
26 bool& success) { 27 bool& success) {
27 localToAncestorVisualRectInternal(sourceState, destinationState, mappingRect, 28 FloatClipRect result = localToAncestorVisualRectInternal(
28 success); 29 rect, sourceState, destinationState, success);
29 // Success if destinationState is an ancestor state. 30 // Success if destinationState is an ancestor state.
30 if (success) 31 if (success)
31 return; 32 return result;
32 33
33 // Otherwise first map to the lowest common ancestor, then map to destination. 34 // Otherwise first map to the lowest common ancestor, then map to destination.
34 const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor( 35 const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor(
35 sourceState.transform(), destinationState.transform()); 36 sourceState.transform(), destinationState.transform());
36 DCHECK(lcaTransform); 37 DCHECK(lcaTransform);
37 38
38 // Assume that the clip of destinationState is an ancestor of the clip of 39 // Assume that the clip of destinationState is an ancestor of the clip of
39 // sourceState and is under the space of lcaTransform. Otherwise 40 // sourceState and is under the space of lcaTransform. Otherwise
40 // localToAncestorVisualRect() will fail. 41 // localToAncestorVisualRect() will fail.
41 PropertyTreeState lcaState = destinationState; 42 PropertyTreeState lcaState = destinationState;
42 lcaState.setTransform(lcaTransform); 43 lcaState.setTransform(lcaTransform);
43 44
44 localToAncestorVisualRectInternal(sourceState, lcaState, mappingRect, 45 result =
45 success); 46 localToAncestorVisualRectInternal(rect, sourceState, lcaState, success);
46 if (!success) 47 if (!success)
47 return; 48 return result;
48 49 if (!result.isInfinite()) {
49 ancestorToLocalRect(lcaTransform, destinationState.transform(), mappingRect); 50 FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
51 destinationState.transform());
52 result.setRect(final);
53 }
54 return result;
50 } 55 }
51 56
52 void GeometryMapper::sourceToDestinationRect( 57 FloatRect GeometryMapper::sourceToDestinationRect(
58 const FloatRect& rect,
53 const TransformPaintPropertyNode* sourceTransformNode, 59 const TransformPaintPropertyNode* sourceTransformNode,
54 const TransformPaintPropertyNode* destinationTransformNode, 60 const TransformPaintPropertyNode* destinationTransformNode) {
55 FloatRect& mappingRect) {
56 bool success = false; 61 bool success = false;
57 localToAncestorRectInternal(sourceTransformNode, destinationTransformNode, 62 FloatRect result = localToAncestorRectInternal(
58 mappingRect, success); 63 rect, sourceTransformNode, destinationTransformNode, success);
59 // Success if destinationTransformNode is an ancestor of sourceTransformNode. 64 // Success if destinationTransformNode is an ancestor of sourceTransformNode.
60 if (success) 65 if (success)
61 return; 66 return result;
62 67
63 // Otherwise first map to the least common ancestor, then map to destination. 68 // Otherwise first map to the least common ancestor, then map to destination.
64 const TransformPaintPropertyNode* lcaTransform = 69 const TransformPaintPropertyNode* lcaTransform =
65 lowestCommonAncestor(sourceTransformNode, destinationTransformNode); 70 lowestCommonAncestor(sourceTransformNode, destinationTransformNode);
66 DCHECK(lcaTransform); 71 DCHECK(lcaTransform);
67 72
68 localToAncestorRect(sourceTransformNode, lcaTransform, mappingRect); 73 FloatRect lcaRect =
69 ancestorToLocalRect(lcaTransform, destinationTransformNode, mappingRect); 74 localToAncestorRect(rect, sourceTransformNode, lcaTransform);
75 return ancestorToLocalRect(lcaRect, lcaTransform, destinationTransformNode);
70 } 76 }
71 77
72 void GeometryMapper::localToAncestorVisualRect( 78 FloatClipRect GeometryMapper::localToAncestorVisualRect(
79 const FloatRect& rect,
80 const PropertyTreeState& localState,
81 const PropertyTreeState& ancestorState) {
82 bool success = false;
83 FloatClipRect result = localToAncestorVisualRectInternal(
84 rect, localState, ancestorState, success);
85 DCHECK(success);
86 return result;
87 }
88
89 FloatClipRect GeometryMapper::localToAncestorVisualRectInternal(
90 const FloatRect& rect,
73 const PropertyTreeState& localState, 91 const PropertyTreeState& localState,
74 const PropertyTreeState& ancestorState, 92 const PropertyTreeState& ancestorState,
75 FloatRect& mappingRect) {
76 bool success = false;
77 localToAncestorVisualRectInternal(localState, ancestorState, mappingRect,
78 success);
79 DCHECK(success);
80 }
81
82 void GeometryMapper::localToAncestorVisualRectInternal(
83 const PropertyTreeState& localState,
84 const PropertyTreeState& ancestorState,
85 FloatRect& rectToMap,
86 bool& success) { 93 bool& success) {
87 if (localState == ancestorState) { 94 if (localState == ancestorState) {
88 success = true; 95 success = true;
89 return; 96 return rect;
90 } 97 }
91 98
92 if (localState.effect() != ancestorState.effect()) { 99 if (localState.effect() != ancestorState.effect()) {
93 slowLocalToAncestorVisualRectWithEffects(localState, ancestorState, 100 return slowLocalToAncestorVisualRectWithEffects(rect, localState,
94 rectToMap, success); 101 ancestorState, success);
95 return;
96 } 102 }
97 103
98 const auto& transformMatrix = localToAncestorMatrixInternal( 104 const auto& transformMatrix = localToAncestorMatrixInternal(
99 localState.transform(), ancestorState.transform(), success); 105 localState.transform(), ancestorState.transform(), success);
100 if (!success) { 106 if (!success)
101 return; 107 return rect;
102 }
103 108
104 FloatRect mappedRect = transformMatrix.mapRect(rectToMap); 109 FloatRect mappedRect = transformMatrix.mapRect(rect);
105 110
106 const FloatClipRect& clipRect = 111 FloatClipRect clipRect =
107 localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(), 112 localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(),
108 ancestorState.transform(), success); 113 ancestorState.transform(), success);
109 114
110 if (success) { 115 if (success) {
111 rectToMap = clipRect.rect(); 116 clipRect.intersect(mappedRect);
112 rectToMap.intersect(mappedRect);
113 } else if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { 117 } else if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
114 // On SPv1 we may fail when the paint invalidation container creates an 118 // On SPv1 we may fail when the paint invalidation container creates an
115 // overflow clip (in ancestorState) which is not in localState of an 119 // overflow clip (in ancestorState) which is not in localState of an
116 // out-of-flow positioned descendant. See crbug.com/513108 and layout test 120 // out-of-flow positioned descendant. See crbug.com/513108 and layout test
117 // compositing/overflow/handle-non-ancestor-clip-parent.html (run with 121 // compositing/overflow/handle-non-ancestor-clip-parent.html (run with
118 // --enable-prefer-compositing-to-lcd-text) for details. 122 // --enable-prefer-compositing-to-lcd-text) for details.
119 // Ignore it for SPv1 for now. 123 // Ignore it for SPv1 for now.
120 success = true; 124 success = true;
121 } 125 }
126
127 return clipRect;
122 } 128 }
123 129
124 void GeometryMapper::slowLocalToAncestorVisualRectWithEffects( 130 FloatClipRect GeometryMapper::slowLocalToAncestorVisualRectWithEffects(
131 const FloatRect& rect,
125 const PropertyTreeState& localState, 132 const PropertyTreeState& localState,
126 const PropertyTreeState& ancestorState, 133 const PropertyTreeState& ancestorState,
127 FloatRect& mappingRect,
128 bool& success) { 134 bool& success) {
129 PropertyTreeState lastTransformAndClipState(localState.transform(), 135 PropertyTreeState lastTransformAndClipState(localState.transform(),
130 localState.clip(), nullptr); 136 localState.clip(), nullptr);
137 FloatClipRect result(rect);
131 138
132 for (const auto* effect = localState.effect(); 139 for (const auto* effect = localState.effect();
133 effect && effect != ancestorState.effect(); effect = effect->parent()) { 140 effect && effect != ancestorState.effect(); effect = effect->parent()) {
134 if (!effect->hasFilterThatMovesPixels()) 141 if (!effect->hasFilterThatMovesPixels())
135 continue; 142 continue;
136 143
137 PropertyTreeState transformAndClipState(effect->localTransformSpace(), 144 PropertyTreeState transformAndClipState(effect->localTransformSpace(),
138 effect->outputClip(), nullptr); 145 effect->outputClip(), nullptr);
139 sourceToDestinationVisualRectInternal( 146 bool hasRadius = result.hasRadius();
140 lastTransformAndClipState, transformAndClipState, mappingRect, success); 147 result = sourceToDestinationVisualRectInternal(
141 if (!success) 148 result.rect(), lastTransformAndClipState, transformAndClipState,
142 return; 149 success);
150 hasRadius |= result.hasRadius();
151 if (!success) {
152 if (hasRadius)
153 result.setHasRadius();
154 return result;
155 }
143 156
144 mappingRect = effect->mapRect(mappingRect); 157 result = effect->mapRect(result.rect());
158 if (hasRadius)
159 result.setHasRadius();
145 lastTransformAndClipState = transformAndClipState; 160 lastTransformAndClipState = transformAndClipState;
146 } 161 }
147 162
148 PropertyTreeState finalTransformAndClipState(ancestorState.transform(), 163 PropertyTreeState finalTransformAndClipState(ancestorState.transform(),
149 ancestorState.clip(), nullptr); 164 ancestorState.clip(), nullptr);
150 sourceToDestinationVisualRectInternal(lastTransformAndClipState, 165 bool hasRadius = result.hasRadius();
151 finalTransformAndClipState, mappingRect, 166 result = sourceToDestinationVisualRectInternal(
152 success); 167 result.rect(), lastTransformAndClipState, finalTransformAndClipState,
168 success);
169 if (hasRadius || result.hasRadius())
170 result.setHasRadius();
171 return result;
153 } 172 }
154 173
155 void GeometryMapper::localToAncestorRect( 174 FloatRect GeometryMapper::localToAncestorRect(
175 const FloatRect& rect,
176 const TransformPaintPropertyNode* localTransformNode,
177 const TransformPaintPropertyNode* ancestorTransformNode) {
178 bool success = false;
179 FloatRect result = localToAncestorRectInternal(
180 rect, localTransformNode, ancestorTransformNode, success);
181 DCHECK(success);
182 return result;
183 }
184
185 FloatRect GeometryMapper::localToAncestorRectInternal(
186 const FloatRect& rect,
156 const TransformPaintPropertyNode* localTransformNode, 187 const TransformPaintPropertyNode* localTransformNode,
157 const TransformPaintPropertyNode* ancestorTransformNode, 188 const TransformPaintPropertyNode* ancestorTransformNode,
158 FloatRect& mappingRect) {
159 bool success = false;
160 localToAncestorRectInternal(localTransformNode, ancestorTransformNode,
161 mappingRect, success);
162 DCHECK(success);
163 }
164
165 void GeometryMapper::localToAncestorRectInternal(
166 const TransformPaintPropertyNode* localTransformNode,
167 const TransformPaintPropertyNode* ancestorTransformNode,
168 FloatRect& mappingRect,
169 bool& success) { 189 bool& success) {
170 if (localTransformNode == ancestorTransformNode) { 190 if (localTransformNode == ancestorTransformNode) {
171 success = true; 191 success = true;
172 return; 192 return rect;
173 } 193 }
174 194
175 const auto& transformMatrix = localToAncestorMatrixInternal( 195 const auto& transformMatrix = localToAncestorMatrixInternal(
176 localTransformNode, ancestorTransformNode, success); 196 localTransformNode, ancestorTransformNode, success);
177 if (!success) 197 if (!success)
178 return; 198 return rect;
179 mappingRect = transformMatrix.mapRect(mappingRect); 199 return transformMatrix.mapRect(rect);
180 } 200 }
181 201
182 void GeometryMapper::ancestorToLocalRect( 202 FloatRect GeometryMapper::ancestorToLocalRect(
203 const FloatRect& rect,
183 const TransformPaintPropertyNode* ancestorTransformNode, 204 const TransformPaintPropertyNode* ancestorTransformNode,
184 const TransformPaintPropertyNode* localTransformNode, 205 const TransformPaintPropertyNode* localTransformNode) {
185 FloatRect& rect) {
186 if (localTransformNode == ancestorTransformNode) 206 if (localTransformNode == ancestorTransformNode)
187 return; 207 return rect;
188 208
189 const auto& transformMatrix = 209 const auto& transformMatrix =
190 localToAncestorMatrix(localTransformNode, ancestorTransformNode); 210 localToAncestorMatrix(localTransformNode, ancestorTransformNode);
191 DCHECK(transformMatrix.isInvertible()); 211 DCHECK(transformMatrix.isInvertible());
192 212
193 // TODO(chrishtr): Cache the inverse? 213 // TODO(chrishtr): Cache the inverse?
194 rect = transformMatrix.inverse().mapRect(rect); 214 return transformMatrix.inverse().mapRect(rect);
195 } 215 }
196 216
197 FloatClipRect GeometryMapper::localToAncestorClipRect( 217 FloatClipRect GeometryMapper::localToAncestorClipRect(
198 const PropertyTreeState& localState, 218 const PropertyTreeState& localState,
199 const PropertyTreeState& ancestorState) { 219 const PropertyTreeState& ancestorState) {
200 bool success = false; 220 bool success = false;
201 FloatClipRect result = 221 FloatClipRect result =
202 localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(), 222 localToAncestorClipRectInternal(localState.clip(), ancestorState.clip(),
203 ancestorState.transform(), success); 223 ancestorState.transform(), success);
204 224
205 DCHECK(success); 225 DCHECK(success);
206 226
207 return result; 227 return result;
208 } 228 }
209 229
210 const FloatClipRect& GeometryMapper::sourceToDestinationClipRect( 230 FloatClipRect GeometryMapper::sourceToDestinationClipRect(
211 const PropertyTreeState& sourceState, 231 const PropertyTreeState& sourceState,
212 const PropertyTreeState& destinationState) { 232 const PropertyTreeState& destinationState) {
213 bool success = false; 233 bool success = false;
214 const FloatClipRect& result = sourceToDestinationClipRectInternal( 234 FloatClipRect result = sourceToDestinationClipRectInternal(
215 sourceState, destinationState, success); 235 sourceState, destinationState, success);
216 DCHECK(success); 236 DCHECK(success);
217 237
218 return result; 238 return result;
219 } 239 }
220 240
221 const FloatClipRect& GeometryMapper::sourceToDestinationClipRectInternal( 241 FloatClipRect GeometryMapper::sourceToDestinationClipRectInternal(
222 const PropertyTreeState& sourceState, 242 const PropertyTreeState& sourceState,
223 const PropertyTreeState& destinationState, 243 const PropertyTreeState& destinationState,
224 bool& success) { 244 bool& success) {
225 const FloatClipRect& result = localToAncestorClipRectInternal( 245 FloatClipRect result = localToAncestorClipRectInternal(
226 sourceState.clip(), destinationState.clip(), destinationState.transform(), 246 sourceState.clip(), destinationState.clip(), destinationState.transform(),
227 success); 247 success);
228 // Success if destinationState is an ancestor state. 248 // Success if destinationState is an ancestor state.
229 if (success) 249 if (success)
230 return result; 250 return result;
231 251
232 // Otherwise first map to the lowest common ancestor, then map to 252 // Otherwise first map to the lowest common ancestor, then map to
233 // destination. 253 // destination.
234 const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor( 254 const TransformPaintPropertyNode* lcaTransform = lowestCommonAncestor(
235 sourceState.transform(), destinationState.transform()); 255 sourceState.transform(), destinationState.transform());
236 DCHECK(lcaTransform); 256 DCHECK(lcaTransform);
237 257
238 // Assume that the clip of destinationState is an ancestor of the clip of 258 // Assume that the clip of destinationState is an ancestor of the clip of
239 // sourceState and is under the space of lcaTransform. Otherwise 259 // sourceState and is under the space of lcaTransform. Otherwise
240 // localToAncestorClipRectInternal() will fail. 260 // localToAncestorClipRectInternal() will fail.
241 PropertyTreeState lcaState = destinationState; 261 PropertyTreeState lcaState = destinationState;
242 lcaState.setTransform(lcaTransform); 262 lcaState.setTransform(lcaTransform);
243 263
244 const FloatClipRect& result2 = localToAncestorClipRectInternal( 264 result = localToAncestorClipRectInternal(sourceState.clip(), lcaState.clip(),
245 sourceState.clip(), lcaState.clip(), lcaState.transform(), success); 265 lcaState.transform(), success);
246 if (!success) { 266 if (!success) {
247 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) { 267 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
248 // On SPv1 we may fail when the paint invalidation container creates an 268 // On SPv1 we may fail when the paint invalidation container creates an
249 // overflow clip (in ancestorState) which is not in localState of an 269 // overflow clip (in ancestorState) which is not in localState of an
250 // out-of-flow positioned descendant. See crbug.com/513108 and layout 270 // out-of-flow positioned descendant. See crbug.com/513108 and layout
251 // test compositing/overflow/handle-non-ancestor-clip-parent.html (run 271 // test compositing/overflow/handle-non-ancestor-clip-parent.html (run
252 // with --enable-prefer-compositing-to-lcd-text) for details. 272 // with --enable-prefer-compositing-to-lcd-text) for details.
253 // Ignore it for SPv1 for now. 273 // Ignore it for SPv1 for now.
254 success = true; 274 success = true;
255 } 275 }
256 return result2; 276 return result;
257 } 277 }
258 if (!result2.isInfinite()) { 278 if (!result.isInfinite()) {
259 FloatRect rect = result2.rect(); 279 FloatRect final = ancestorToLocalRect(result.rect(), lcaTransform,
260 ancestorToLocalRect(lcaTransform, destinationState.transform(), rect); 280 destinationState.transform());
261 m_tempRect.setRect(rect); 281 result.setRect(final);
262 if (result2.hasRadius())
263 m_tempRect.setHasRadius();
264 return m_tempRect;
265 } 282 }
266 return result2; 283 return result;
267 } 284 }
268 285
269 const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal( 286 const FloatClipRect& GeometryMapper::localToAncestorClipRectInternal(
270 const ClipPaintPropertyNode* descendant, 287 const ClipPaintPropertyNode* descendant,
271 const ClipPaintPropertyNode* ancestorClip, 288 const ClipPaintPropertyNode* ancestorClip,
272 const TransformPaintPropertyNode* ancestorTransform, 289 const TransformPaintPropertyNode* ancestorTransform,
273 bool& success) { 290 bool& success) {
274 FloatClipRect clip; 291 FloatClipRect clip;
275 if (descendant == ancestorClip) { 292 if (descendant == ancestorClip) {
276 success = true; 293 success = true;
(...skipping 28 matching lines...) Expand all
305 ++it) { 322 ++it) {
306 success = false; 323 success = false;
307 const TransformationMatrix& transformMatrix = localToAncestorMatrixInternal( 324 const TransformationMatrix& transformMatrix = localToAncestorMatrixInternal(
308 (*it)->localTransformSpace(), ancestorTransform, success); 325 (*it)->localTransformSpace(), ancestorTransform, success);
309 if (!success) 326 if (!success)
310 return m_infiniteClip; 327 return m_infiniteClip;
311 FloatRect mappedRect = transformMatrix.mapRect((*it)->clipRect().rect()); 328 FloatRect mappedRect = transformMatrix.mapRect((*it)->clipRect().rect());
312 clip.intersect(mappedRect); 329 clip.intersect(mappedRect);
313 if ((*it)->clipRect().isRounded()) 330 if ((*it)->clipRect().isRounded())
314 clip.setHasRadius(); 331 clip.setHasRadius();
315
316 (*it)->getClipCache().setCachedClip(clipAndTransform, clip); 332 (*it)->getClipCache().setCachedClip(clipAndTransform, clip);
317 } 333 }
318 334
319 success = true; 335 success = true;
320 336
321 const FloatClipRect* cachedClip = 337 const FloatClipRect* cachedClip =
322 descendant->getClipCache().getCachedClip(clipAndTransform); 338 descendant->getClipCache().getCachedClip(clipAndTransform);
323 DCHECK(cachedClip); 339 DCHECK(cachedClip);
324 CHECK(clip.hasRadius() == cachedClip->hasRadius());
325 return *cachedClip; 340 return *cachedClip;
326 } 341 }
327 342
328 const TransformationMatrix& GeometryMapper::localToAncestorMatrix( 343 const TransformationMatrix& GeometryMapper::localToAncestorMatrix(
329 const TransformPaintPropertyNode* localTransformNode, 344 const TransformPaintPropertyNode* localTransformNode,
330 const TransformPaintPropertyNode* ancestorTransformNode) { 345 const TransformPaintPropertyNode* ancestorTransformNode) {
331 bool success = false; 346 bool success = false;
332 const auto& result = localToAncestorMatrixInternal( 347 const auto& result = localToAncestorMatrixInternal(
333 localTransformNode, ancestorTransformNode, success); 348 localTransformNode, ancestorTransformNode, success);
334 DCHECK(success); 349 DCHECK(success);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 const TransformPaintPropertyNode*, 456 const TransformPaintPropertyNode*,
442 const TransformPaintPropertyNode*); 457 const TransformPaintPropertyNode*);
443 template const ClipPaintPropertyNode* GeometryMapper::lowestCommonAncestor( 458 template const ClipPaintPropertyNode* GeometryMapper::lowestCommonAncestor(
444 const ClipPaintPropertyNode*, 459 const ClipPaintPropertyNode*,
445 const ClipPaintPropertyNode*); 460 const ClipPaintPropertyNode*);
446 template const ScrollPaintPropertyNode* GeometryMapper::lowestCommonAncestor( 461 template const ScrollPaintPropertyNode* GeometryMapper::lowestCommonAncestor(
447 const ScrollPaintPropertyNode*, 462 const ScrollPaintPropertyNode*,
448 const ScrollPaintPropertyNode*); 463 const ScrollPaintPropertyNode*);
449 464
450 } // namespace blink 465 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698