OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
13 #include "cc/base/math_util.h" | |
14 #include "cc/input/main_thread_scrolling_reason.h" | |
15 #include "cc/input/scroll_state.h" | |
16 #include "cc/layers/layer_impl.h" | 13 #include "cc/layers/layer_impl.h" |
17 #include "cc/output/copy_output_request.h" | 14 #include "cc/output/copy_output_request.h" |
18 #include "cc/proto/gfx_conversions.h" | |
19 #include "cc/proto/property_tree.pb.h" | 15 #include "cc/proto/property_tree.pb.h" |
20 #include "cc/proto/scroll_offset.pb.h" | |
21 #include "cc/proto/synced_property_conversions.h" | 16 #include "cc/proto/synced_property_conversions.h" |
22 #include "cc/proto/transform.pb.h" | 17 #include "cc/trees/clip_node.h" |
23 #include "cc/proto/vector2df.pb.h" | 18 #include "cc/trees/effect_node.h" |
24 #include "cc/trees/layer_tree_host_common.h" | 19 #include "cc/trees/layer_tree_host_common.h" |
25 #include "cc/trees/layer_tree_impl.h" | 20 #include "cc/trees/layer_tree_impl.h" |
26 #include "cc/trees/property_tree.h" | 21 #include "cc/trees/property_tree.h" |
| 22 #include "cc/trees/scroll_node.h" |
| 23 #include "cc/trees/transform_node.h" |
27 #include "ui/gfx/geometry/vector2d_conversions.h" | 24 #include "ui/gfx/geometry/vector2d_conversions.h" |
28 | 25 |
29 namespace cc { | 26 namespace cc { |
30 | 27 |
31 template <typename T> | 28 template <typename T> |
32 bool TreeNode<T>::operator==(const TreeNode<T>& other) const { | |
33 return id == other.id && parent_id == other.parent_id && | |
34 owner_id == other.owner_id && data == other.data; | |
35 } | |
36 | |
37 template <typename T> | |
38 void TreeNode<T>::ToProtobuf(proto::TreeNode* proto) const { | |
39 proto->set_id(id); | |
40 proto->set_parent_id(parent_id); | |
41 proto->set_owner_id(owner_id); | |
42 data.ToProtobuf(proto); | |
43 } | |
44 | |
45 template <typename T> | |
46 void TreeNode<T>::FromProtobuf(const proto::TreeNode& proto) { | |
47 id = proto.id(); | |
48 parent_id = proto.parent_id(); | |
49 owner_id = proto.owner_id(); | |
50 data.FromProtobuf(proto); | |
51 } | |
52 | |
53 template <typename T> | |
54 void TreeNode<T>::AsValueInto(base::trace_event::TracedValue* value) const { | |
55 value->SetInteger("id", id); | |
56 value->SetInteger("parent_id", parent_id); | |
57 value->SetInteger("owner_id", owner_id); | |
58 data.AsValueInto(value); | |
59 } | |
60 | |
61 template struct TreeNode<TransformNodeData>; | |
62 template struct TreeNode<ClipNodeData>; | |
63 template struct TreeNode<EffectNodeData>; | |
64 template struct TreeNode<ScrollNodeData>; | |
65 | |
66 template <typename T> | |
67 PropertyTree<T>::PropertyTree() | 29 PropertyTree<T>::PropertyTree() |
68 : needs_update_(false) { | 30 : needs_update_(false) { |
69 nodes_.push_back(T()); | 31 nodes_.push_back(T()); |
70 back()->id = 0; | 32 back()->id = 0; |
71 back()->parent_id = -1; | 33 back()->parent_id = -1; |
72 } | 34 } |
73 | 35 |
74 template <typename T> | 36 template <typename T> |
75 PropertyTree<T>::~PropertyTree() { | 37 PropertyTree<T>::~PropertyTree() { |
76 } | 38 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 value->EndDictionary(); | 111 value->EndDictionary(); |
150 } | 112 } |
151 value->EndArray(); | 113 value->EndArray(); |
152 } | 114 } |
153 | 115 |
154 template class PropertyTree<TransformNode>; | 116 template class PropertyTree<TransformNode>; |
155 template class PropertyTree<ClipNode>; | 117 template class PropertyTree<ClipNode>; |
156 template class PropertyTree<EffectNode>; | 118 template class PropertyTree<EffectNode>; |
157 template class PropertyTree<ScrollNode>; | 119 template class PropertyTree<ScrollNode>; |
158 | 120 |
159 TransformNodeData::TransformNodeData() | |
160 : source_node_id(-1), | |
161 sorting_context_id(0), | |
162 needs_local_transform_update(true), | |
163 node_and_ancestors_are_animated_or_invertible(true), | |
164 is_invertible(true), | |
165 ancestors_are_invertible(true), | |
166 has_potential_animation(false), | |
167 is_currently_animating(false), | |
168 to_screen_is_potentially_animated(false), | |
169 has_only_translation_animations(true), | |
170 flattens_inherited_transform(false), | |
171 node_and_ancestors_are_flat(true), | |
172 node_and_ancestors_have_only_integer_translation(true), | |
173 scrolls(false), | |
174 needs_sublayer_scale(false), | |
175 affected_by_inner_viewport_bounds_delta_x(false), | |
176 affected_by_inner_viewport_bounds_delta_y(false), | |
177 affected_by_outer_viewport_bounds_delta_x(false), | |
178 affected_by_outer_viewport_bounds_delta_y(false), | |
179 in_subtree_of_page_scale_layer(false), | |
180 transform_changed(false), | |
181 post_local_scale_factor(1.0f) {} | |
182 | |
183 TransformNodeData::TransformNodeData(const TransformNodeData& other) = default; | |
184 | |
185 TransformNodeData::~TransformNodeData() { | |
186 } | |
187 | |
188 bool TransformNodeData::operator==(const TransformNodeData& other) const { | |
189 return pre_local == other.pre_local && local == other.local && | |
190 post_local == other.post_local && to_parent == other.to_parent && | |
191 source_node_id == other.source_node_id && | |
192 sorting_context_id == other.sorting_context_id && | |
193 needs_local_transform_update == other.needs_local_transform_update && | |
194 node_and_ancestors_are_animated_or_invertible == | |
195 other.node_and_ancestors_are_animated_or_invertible && | |
196 is_invertible == other.is_invertible && | |
197 ancestors_are_invertible == other.ancestors_are_invertible && | |
198 has_potential_animation == other.has_potential_animation && | |
199 is_currently_animating == other.is_currently_animating && | |
200 to_screen_is_potentially_animated == | |
201 other.to_screen_is_potentially_animated && | |
202 has_only_translation_animations == | |
203 other.has_only_translation_animations && | |
204 flattens_inherited_transform == other.flattens_inherited_transform && | |
205 node_and_ancestors_are_flat == other.node_and_ancestors_are_flat && | |
206 node_and_ancestors_have_only_integer_translation == | |
207 other.node_and_ancestors_have_only_integer_translation && | |
208 scrolls == other.scrolls && | |
209 needs_sublayer_scale == other.needs_sublayer_scale && | |
210 affected_by_inner_viewport_bounds_delta_x == | |
211 other.affected_by_inner_viewport_bounds_delta_x && | |
212 affected_by_inner_viewport_bounds_delta_y == | |
213 other.affected_by_inner_viewport_bounds_delta_y && | |
214 affected_by_outer_viewport_bounds_delta_x == | |
215 other.affected_by_outer_viewport_bounds_delta_x && | |
216 affected_by_outer_viewport_bounds_delta_y == | |
217 other.affected_by_outer_viewport_bounds_delta_y && | |
218 in_subtree_of_page_scale_layer == | |
219 other.in_subtree_of_page_scale_layer && | |
220 transform_changed == other.transform_changed && | |
221 post_local_scale_factor == other.post_local_scale_factor && | |
222 sublayer_scale == other.sublayer_scale && | |
223 scroll_offset == other.scroll_offset && | |
224 scroll_snap == other.scroll_snap && | |
225 source_offset == other.source_offset && | |
226 source_to_parent == other.source_to_parent; | |
227 } | |
228 | |
229 void TransformNodeData::update_pre_local_transform( | |
230 const gfx::Point3F& transform_origin) { | |
231 pre_local.MakeIdentity(); | |
232 pre_local.Translate3d(-transform_origin.x(), -transform_origin.y(), | |
233 -transform_origin.z()); | |
234 } | |
235 | |
236 void TransformNodeData::update_post_local_transform( | |
237 const gfx::PointF& position, | |
238 const gfx::Point3F& transform_origin) { | |
239 post_local.MakeIdentity(); | |
240 post_local.Scale(post_local_scale_factor, post_local_scale_factor); | |
241 post_local.Translate3d( | |
242 position.x() + source_offset.x() + transform_origin.x(), | |
243 position.y() + source_offset.y() + transform_origin.y(), | |
244 transform_origin.z()); | |
245 } | |
246 | |
247 void TransformNodeData::ToProtobuf(proto::TreeNode* proto) const { | |
248 DCHECK(!proto->has_transform_node_data()); | |
249 proto::TranformNodeData* data = proto->mutable_transform_node_data(); | |
250 | |
251 TransformToProto(pre_local, data->mutable_pre_local()); | |
252 TransformToProto(local, data->mutable_local()); | |
253 TransformToProto(post_local, data->mutable_post_local()); | |
254 | |
255 TransformToProto(to_parent, data->mutable_to_parent()); | |
256 | |
257 data->set_source_node_id(source_node_id); | |
258 data->set_sorting_context_id(sorting_context_id); | |
259 | |
260 data->set_needs_local_transform_update(needs_local_transform_update); | |
261 | |
262 data->set_node_and_ancestors_are_animated_or_invertible( | |
263 node_and_ancestors_are_animated_or_invertible); | |
264 | |
265 data->set_is_invertible(is_invertible); | |
266 data->set_ancestors_are_invertible(ancestors_are_invertible); | |
267 | |
268 data->set_has_potential_animation(has_potential_animation); | |
269 data->set_is_currently_animating(is_currently_animating); | |
270 data->set_to_screen_is_potentially_animated( | |
271 to_screen_is_potentially_animated); | |
272 data->set_has_only_translation_animations(has_only_translation_animations); | |
273 | |
274 data->set_flattens_inherited_transform(flattens_inherited_transform); | |
275 data->set_node_and_ancestors_are_flat(node_and_ancestors_are_flat); | |
276 | |
277 data->set_node_and_ancestors_have_only_integer_translation( | |
278 node_and_ancestors_have_only_integer_translation); | |
279 data->set_scrolls(scrolls); | |
280 data->set_needs_sublayer_scale(needs_sublayer_scale); | |
281 | |
282 data->set_affected_by_inner_viewport_bounds_delta_x( | |
283 affected_by_inner_viewport_bounds_delta_x); | |
284 data->set_affected_by_inner_viewport_bounds_delta_y( | |
285 affected_by_inner_viewport_bounds_delta_y); | |
286 data->set_affected_by_outer_viewport_bounds_delta_x( | |
287 affected_by_outer_viewport_bounds_delta_x); | |
288 data->set_affected_by_outer_viewport_bounds_delta_y( | |
289 affected_by_outer_viewport_bounds_delta_y); | |
290 | |
291 data->set_in_subtree_of_page_scale_layer(in_subtree_of_page_scale_layer); | |
292 data->set_transform_changed(transform_changed); | |
293 data->set_post_local_scale_factor(post_local_scale_factor); | |
294 | |
295 Vector2dFToProto(sublayer_scale, data->mutable_sublayer_scale()); | |
296 ScrollOffsetToProto(scroll_offset, data->mutable_scroll_offset()); | |
297 Vector2dFToProto(scroll_snap, data->mutable_scroll_snap()); | |
298 Vector2dFToProto(source_offset, data->mutable_source_offset()); | |
299 Vector2dFToProto(source_to_parent, data->mutable_source_to_parent()); | |
300 } | |
301 | |
302 void TransformNodeData::FromProtobuf(const proto::TreeNode& proto) { | |
303 DCHECK(proto.has_transform_node_data()); | |
304 const proto::TranformNodeData& data = proto.transform_node_data(); | |
305 | |
306 pre_local = ProtoToTransform(data.pre_local()); | |
307 local = ProtoToTransform(data.local()); | |
308 post_local = ProtoToTransform(data.post_local()); | |
309 | |
310 to_parent = ProtoToTransform(data.to_parent()); | |
311 | |
312 source_node_id = data.source_node_id(); | |
313 sorting_context_id = data.sorting_context_id(); | |
314 | |
315 needs_local_transform_update = data.needs_local_transform_update(); | |
316 | |
317 node_and_ancestors_are_animated_or_invertible = | |
318 data.node_and_ancestors_are_animated_or_invertible(); | |
319 | |
320 is_invertible = data.is_invertible(); | |
321 ancestors_are_invertible = data.ancestors_are_invertible(); | |
322 | |
323 has_potential_animation = data.has_potential_animation(); | |
324 is_currently_animating = data.is_currently_animating(); | |
325 to_screen_is_potentially_animated = data.to_screen_is_potentially_animated(); | |
326 has_only_translation_animations = data.has_only_translation_animations(); | |
327 | |
328 flattens_inherited_transform = data.flattens_inherited_transform(); | |
329 node_and_ancestors_are_flat = data.node_and_ancestors_are_flat(); | |
330 | |
331 node_and_ancestors_have_only_integer_translation = | |
332 data.node_and_ancestors_have_only_integer_translation(); | |
333 scrolls = data.scrolls(); | |
334 needs_sublayer_scale = data.needs_sublayer_scale(); | |
335 | |
336 affected_by_inner_viewport_bounds_delta_x = | |
337 data.affected_by_inner_viewport_bounds_delta_x(); | |
338 affected_by_inner_viewport_bounds_delta_y = | |
339 data.affected_by_inner_viewport_bounds_delta_y(); | |
340 affected_by_outer_viewport_bounds_delta_x = | |
341 data.affected_by_outer_viewport_bounds_delta_x(); | |
342 affected_by_outer_viewport_bounds_delta_y = | |
343 data.affected_by_outer_viewport_bounds_delta_y(); | |
344 | |
345 in_subtree_of_page_scale_layer = data.in_subtree_of_page_scale_layer(); | |
346 transform_changed = data.transform_changed(); | |
347 post_local_scale_factor = data.post_local_scale_factor(); | |
348 | |
349 sublayer_scale = ProtoToVector2dF(data.sublayer_scale()); | |
350 scroll_offset = ProtoToScrollOffset(data.scroll_offset()); | |
351 scroll_snap = ProtoToVector2dF(data.scroll_snap()); | |
352 source_offset = ProtoToVector2dF(data.source_offset()); | |
353 source_to_parent = ProtoToVector2dF(data.source_to_parent()); | |
354 } | |
355 | |
356 void TransformNodeData::AsValueInto( | |
357 base::trace_event::TracedValue* value) const { | |
358 MathUtil::AddToTracedValue("pre_local", pre_local, value); | |
359 MathUtil::AddToTracedValue("local", local, value); | |
360 MathUtil::AddToTracedValue("post_local", post_local, value); | |
361 // TODO(sunxd): make frameviewer work without target_id | |
362 value->SetInteger("target_id", 0); | |
363 value->SetInteger("content_target_id", 0); | |
364 value->SetInteger("source_node_id", source_node_id); | |
365 value->SetInteger("sorting_context_id", sorting_context_id); | |
366 } | |
367 | |
368 TransformCachedNodeData::TransformCachedNodeData() | |
369 : target_id(-1), content_target_id(-1) {} | |
370 | |
371 TransformCachedNodeData::TransformCachedNodeData( | |
372 const TransformCachedNodeData& other) = default; | |
373 | |
374 TransformCachedNodeData::~TransformCachedNodeData() {} | |
375 | |
376 bool TransformCachedNodeData::operator==( | |
377 const TransformCachedNodeData& other) const { | |
378 return from_target == other.from_target && to_target == other.to_target && | |
379 from_screen == other.from_screen && to_screen == other.to_screen && | |
380 target_id == other.target_id && | |
381 content_target_id == other.content_target_id; | |
382 } | |
383 | |
384 void TransformCachedNodeData::ToProtobuf( | |
385 proto::TransformCachedNodeData* proto) const { | |
386 TransformToProto(from_target, proto->mutable_from_target()); | |
387 TransformToProto(to_target, proto->mutable_to_target()); | |
388 TransformToProto(from_screen, proto->mutable_from_screen()); | |
389 TransformToProto(to_screen, proto->mutable_to_screen()); | |
390 proto->set_target_id(target_id); | |
391 proto->set_content_target_id(content_target_id); | |
392 } | |
393 | |
394 void TransformCachedNodeData::FromProtobuf( | |
395 const proto::TransformCachedNodeData& proto) { | |
396 from_target = ProtoToTransform(proto.from_target()); | |
397 to_target = ProtoToTransform(proto.to_target()); | |
398 from_screen = ProtoToTransform(proto.from_screen()); | |
399 to_screen = ProtoToTransform(proto.to_screen()); | |
400 target_id = proto.target_id(); | |
401 content_target_id = proto.content_target_id(); | |
402 } | |
403 | |
404 ClipNodeData::ClipNodeData() | |
405 : transform_id(-1), | |
406 target_id(-1), | |
407 applies_local_clip(true), | |
408 layer_clipping_uses_only_local_clip(false), | |
409 target_is_clipped(false), | |
410 layers_are_clipped(false), | |
411 layers_are_clipped_when_surfaces_disabled(false), | |
412 resets_clip(false) {} | |
413 | |
414 ClipNodeData::ClipNodeData(const ClipNodeData& other) = default; | |
415 | |
416 bool ClipNodeData::operator==(const ClipNodeData& other) const { | |
417 return clip == other.clip && | |
418 combined_clip_in_target_space == other.combined_clip_in_target_space && | |
419 clip_in_target_space == other.clip_in_target_space && | |
420 transform_id == other.transform_id && target_id == other.target_id && | |
421 applies_local_clip == other.applies_local_clip && | |
422 layer_clipping_uses_only_local_clip == | |
423 other.layer_clipping_uses_only_local_clip && | |
424 target_is_clipped == other.target_is_clipped && | |
425 layers_are_clipped == other.layers_are_clipped && | |
426 layers_are_clipped_when_surfaces_disabled == | |
427 other.layers_are_clipped_when_surfaces_disabled && | |
428 resets_clip == other.resets_clip; | |
429 } | |
430 | |
431 void ClipNodeData::ToProtobuf(proto::TreeNode* proto) const { | |
432 DCHECK(!proto->has_clip_node_data()); | |
433 proto::ClipNodeData* data = proto->mutable_clip_node_data(); | |
434 | |
435 RectFToProto(clip, data->mutable_clip()); | |
436 RectFToProto(combined_clip_in_target_space, | |
437 data->mutable_combined_clip_in_target_space()); | |
438 RectFToProto(clip_in_target_space, data->mutable_clip_in_target_space()); | |
439 | |
440 data->set_transform_id(transform_id); | |
441 data->set_target_id(target_id); | |
442 data->set_applies_local_clip(applies_local_clip); | |
443 data->set_layer_clipping_uses_only_local_clip( | |
444 layer_clipping_uses_only_local_clip); | |
445 data->set_target_is_clipped(target_is_clipped); | |
446 data->set_layers_are_clipped(layers_are_clipped); | |
447 data->set_layers_are_clipped_when_surfaces_disabled( | |
448 layers_are_clipped_when_surfaces_disabled); | |
449 data->set_resets_clip(resets_clip); | |
450 } | |
451 | |
452 void ClipNodeData::FromProtobuf(const proto::TreeNode& proto) { | |
453 DCHECK(proto.has_clip_node_data()); | |
454 const proto::ClipNodeData& data = proto.clip_node_data(); | |
455 | |
456 clip = ProtoToRectF(data.clip()); | |
457 combined_clip_in_target_space = | |
458 ProtoToRectF(data.combined_clip_in_target_space()); | |
459 clip_in_target_space = ProtoToRectF(data.clip_in_target_space()); | |
460 | |
461 transform_id = data.transform_id(); | |
462 target_id = data.target_id(); | |
463 applies_local_clip = data.applies_local_clip(); | |
464 layer_clipping_uses_only_local_clip = | |
465 data.layer_clipping_uses_only_local_clip(); | |
466 target_is_clipped = data.target_is_clipped(); | |
467 layers_are_clipped = data.layers_are_clipped(); | |
468 layers_are_clipped_when_surfaces_disabled = | |
469 data.layers_are_clipped_when_surfaces_disabled(); | |
470 resets_clip = data.resets_clip(); | |
471 } | |
472 | |
473 void ClipNodeData::AsValueInto(base::trace_event::TracedValue* value) const { | |
474 MathUtil::AddToTracedValue("clip", clip, value); | |
475 value->SetInteger("transform_id", transform_id); | |
476 value->SetInteger("target_id", target_id); | |
477 value->SetBoolean("applies_local_clip", applies_local_clip); | |
478 value->SetBoolean("layer_clipping_uses_only_local_clip", | |
479 layer_clipping_uses_only_local_clip); | |
480 value->SetBoolean("target_is_clipped", target_is_clipped); | |
481 value->SetBoolean("layers_are_clipped", layers_are_clipped); | |
482 value->SetBoolean("layers_are_clipped_when_surfaces_disabled", | |
483 layers_are_clipped_when_surfaces_disabled); | |
484 value->SetBoolean("resets_clip", resets_clip); | |
485 } | |
486 | |
487 EffectNodeData::EffectNodeData() | |
488 : opacity(1.f), | |
489 screen_space_opacity(1.f), | |
490 has_render_surface(false), | |
491 render_surface(nullptr), | |
492 has_copy_request(false), | |
493 hidden_by_backface_visibility(false), | |
494 double_sided(false), | |
495 is_drawn(true), | |
496 subtree_hidden(false), | |
497 has_potential_opacity_animation(false), | |
498 is_currently_animating_opacity(false), | |
499 effect_changed(false), | |
500 num_copy_requests_in_subtree(0), | |
501 has_unclipped_descendants(false), | |
502 transform_id(0), | |
503 clip_id(0), | |
504 target_id(0), | |
505 mask_layer_id(-1), | |
506 replica_layer_id(-1), | |
507 replica_mask_layer_id(-1) {} | |
508 | |
509 EffectNodeData::EffectNodeData(const EffectNodeData& other) = default; | |
510 | |
511 bool EffectNodeData::operator==(const EffectNodeData& other) const { | |
512 return opacity == other.opacity && | |
513 screen_space_opacity == other.screen_space_opacity && | |
514 has_render_surface == other.has_render_surface && | |
515 has_copy_request == other.has_copy_request && | |
516 background_filters == other.background_filters && | |
517 hidden_by_backface_visibility == other.hidden_by_backface_visibility && | |
518 double_sided == other.double_sided && is_drawn == other.is_drawn && | |
519 subtree_hidden == other.subtree_hidden && | |
520 has_potential_opacity_animation == | |
521 other.has_potential_opacity_animation && | |
522 is_currently_animating_opacity == | |
523 other.is_currently_animating_opacity && | |
524 effect_changed == other.effect_changed && | |
525 num_copy_requests_in_subtree == other.num_copy_requests_in_subtree && | |
526 transform_id == other.transform_id && clip_id == other.clip_id && | |
527 target_id == other.target_id && mask_layer_id == other.mask_layer_id && | |
528 replica_layer_id == other.replica_layer_id && | |
529 replica_mask_layer_id == other.replica_mask_layer_id; | |
530 } | |
531 | |
532 void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { | |
533 DCHECK(!proto->has_effect_node_data()); | |
534 proto::EffectNodeData* data = proto->mutable_effect_node_data(); | |
535 data->set_opacity(opacity); | |
536 data->set_screen_space_opacity(screen_space_opacity); | |
537 data->set_has_render_surface(has_render_surface); | |
538 data->set_has_copy_request(has_copy_request); | |
539 data->set_hidden_by_backface_visibility(hidden_by_backface_visibility); | |
540 data->set_double_sided(double_sided); | |
541 data->set_is_drawn(is_drawn); | |
542 data->set_subtree_hidden(subtree_hidden); | |
543 data->set_has_potential_opacity_animation(has_potential_opacity_animation); | |
544 data->set_is_currently_animating_opacity(is_currently_animating_opacity); | |
545 data->set_effect_changed(effect_changed); | |
546 data->set_num_copy_requests_in_subtree(num_copy_requests_in_subtree); | |
547 data->set_transform_id(transform_id); | |
548 data->set_clip_id(clip_id); | |
549 data->set_target_id(target_id); | |
550 data->set_mask_layer_id(mask_layer_id); | |
551 data->set_replica_layer_id(replica_layer_id); | |
552 data->set_replica_mask_layer_id(replica_mask_layer_id); | |
553 } | |
554 | |
555 void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { | |
556 DCHECK(proto.has_effect_node_data()); | |
557 const proto::EffectNodeData& data = proto.effect_node_data(); | |
558 | |
559 opacity = data.opacity(); | |
560 screen_space_opacity = data.screen_space_opacity(); | |
561 has_render_surface = data.has_render_surface(); | |
562 has_copy_request = data.has_copy_request(); | |
563 hidden_by_backface_visibility = data.hidden_by_backface_visibility(); | |
564 double_sided = data.double_sided(); | |
565 is_drawn = data.is_drawn(); | |
566 subtree_hidden = data.subtree_hidden(); | |
567 has_potential_opacity_animation = data.has_potential_opacity_animation(); | |
568 is_currently_animating_opacity = data.is_currently_animating_opacity(); | |
569 effect_changed = data.effect_changed(); | |
570 num_copy_requests_in_subtree = data.num_copy_requests_in_subtree(); | |
571 transform_id = data.transform_id(); | |
572 clip_id = data.clip_id(); | |
573 target_id = data.target_id(); | |
574 mask_layer_id = data.mask_layer_id(); | |
575 replica_layer_id = data.replica_layer_id(); | |
576 replica_mask_layer_id = data.replica_mask_layer_id(); | |
577 } | |
578 | |
579 void EffectNodeData::AsValueInto(base::trace_event::TracedValue* value) const { | |
580 value->SetDouble("opacity", opacity); | |
581 value->SetBoolean("has_render_surface", has_render_surface); | |
582 value->SetBoolean("has_copy_request", has_copy_request); | |
583 value->SetBoolean("double_sided", double_sided); | |
584 value->SetBoolean("is_drawn", is_drawn); | |
585 value->SetBoolean("has_potential_opacity_animation", | |
586 has_potential_opacity_animation); | |
587 value->SetBoolean("effect_changed", effect_changed); | |
588 value->SetInteger("num_copy_requests_in_subtree", | |
589 num_copy_requests_in_subtree); | |
590 value->SetInteger("transform_id", transform_id); | |
591 value->SetInteger("clip_id", clip_id); | |
592 value->SetInteger("target_id", target_id); | |
593 value->SetInteger("mask_layer_id", mask_layer_id); | |
594 value->SetInteger("replica_layer_id", replica_layer_id); | |
595 value->SetInteger("replica_mask_layer_id", replica_mask_layer_id); | |
596 } | |
597 | |
598 ScrollNodeData::ScrollNodeData() | |
599 : scrollable(false), | |
600 main_thread_scrolling_reasons( | |
601 MainThreadScrollingReason::kNotScrollingOnMain), | |
602 contains_non_fast_scrollable_region(false), | |
603 max_scroll_offset_affected_by_page_scale(false), | |
604 is_inner_viewport_scroll_layer(false), | |
605 is_outer_viewport_scroll_layer(false), | |
606 should_flatten(false), | |
607 user_scrollable_horizontal(false), | |
608 user_scrollable_vertical(false), | |
609 transform_id(0), | |
610 num_drawn_descendants(0) {} | |
611 | |
612 ScrollNodeData::ScrollNodeData(const ScrollNodeData& other) = default; | |
613 | |
614 bool ScrollNodeData::operator==(const ScrollNodeData& other) const { | |
615 return scrollable == other.scrollable && | |
616 main_thread_scrolling_reasons == other.main_thread_scrolling_reasons && | |
617 contains_non_fast_scrollable_region == | |
618 other.contains_non_fast_scrollable_region && | |
619 scroll_clip_layer_bounds == other.scroll_clip_layer_bounds && | |
620 bounds == other.bounds && | |
621 max_scroll_offset_affected_by_page_scale == | |
622 other.max_scroll_offset_affected_by_page_scale && | |
623 is_inner_viewport_scroll_layer == | |
624 other.is_inner_viewport_scroll_layer && | |
625 is_outer_viewport_scroll_layer == | |
626 other.is_outer_viewport_scroll_layer && | |
627 offset_to_transform_parent == other.offset_to_transform_parent && | |
628 should_flatten == other.should_flatten && | |
629 user_scrollable_horizontal == other.user_scrollable_horizontal && | |
630 user_scrollable_vertical == other.user_scrollable_vertical && | |
631 element_id == other.element_id && transform_id == other.transform_id; | |
632 } | |
633 | |
634 void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const { | |
635 DCHECK(!proto->has_scroll_node_data()); | |
636 proto::ScrollNodeData* data = proto->mutable_scroll_node_data(); | |
637 data->set_scrollable(scrollable); | |
638 data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons); | |
639 data->set_contains_non_fast_scrollable_region( | |
640 contains_non_fast_scrollable_region); | |
641 SizeToProto(scroll_clip_layer_bounds, | |
642 data->mutable_scroll_clip_layer_bounds()); | |
643 SizeToProto(bounds, data->mutable_bounds()); | |
644 data->set_max_scroll_offset_affected_by_page_scale( | |
645 max_scroll_offset_affected_by_page_scale); | |
646 data->set_is_inner_viewport_scroll_layer(is_inner_viewport_scroll_layer); | |
647 data->set_is_outer_viewport_scroll_layer(is_outer_viewport_scroll_layer); | |
648 Vector2dFToProto(offset_to_transform_parent, | |
649 data->mutable_offset_to_transform_parent()); | |
650 data->set_should_flatten(should_flatten); | |
651 data->set_user_scrollable_horizontal(user_scrollable_horizontal); | |
652 data->set_user_scrollable_vertical(user_scrollable_vertical); | |
653 element_id.ToProtobuf(data->mutable_element_id()); | |
654 data->set_transform_id(transform_id); | |
655 } | |
656 | |
657 void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) { | |
658 DCHECK(proto.has_scroll_node_data()); | |
659 const proto::ScrollNodeData& data = proto.scroll_node_data(); | |
660 | |
661 scrollable = data.scrollable(); | |
662 main_thread_scrolling_reasons = data.main_thread_scrolling_reasons(); | |
663 contains_non_fast_scrollable_region = | |
664 data.contains_non_fast_scrollable_region(); | |
665 scroll_clip_layer_bounds = ProtoToSize(data.scroll_clip_layer_bounds()); | |
666 bounds = ProtoToSize(data.bounds()); | |
667 max_scroll_offset_affected_by_page_scale = | |
668 data.max_scroll_offset_affected_by_page_scale(); | |
669 is_inner_viewport_scroll_layer = data.is_inner_viewport_scroll_layer(); | |
670 is_outer_viewport_scroll_layer = data.is_outer_viewport_scroll_layer(); | |
671 offset_to_transform_parent = | |
672 ProtoToVector2dF(data.offset_to_transform_parent()); | |
673 should_flatten = data.should_flatten(); | |
674 user_scrollable_horizontal = data.user_scrollable_horizontal(); | |
675 user_scrollable_vertical = data.user_scrollable_vertical(); | |
676 element_id.FromProtobuf(data.element_id()); | |
677 transform_id = data.transform_id(); | |
678 } | |
679 | |
680 void ScrollNodeData::AsValueInto(base::trace_event::TracedValue* value) const { | |
681 value->SetBoolean("scrollable", scrollable); | |
682 MathUtil::AddToTracedValue("scroll_clip_layer_bounds", | |
683 scroll_clip_layer_bounds, value); | |
684 MathUtil::AddToTracedValue("bounds", bounds, value); | |
685 MathUtil::AddToTracedValue("offset_to_transform_parent", | |
686 offset_to_transform_parent, value); | |
687 value->SetBoolean("should_flatten", should_flatten); | |
688 value->SetBoolean("user_scrollable_horizontal", user_scrollable_horizontal); | |
689 value->SetBoolean("user_scrollable_vertical", user_scrollable_vertical); | |
690 | |
691 element_id.AddToTracedValue(value); | |
692 value->SetInteger("transform_id", transform_id); | |
693 } | |
694 | |
695 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) { | 121 int TransformTree::Insert(const TransformNode& tree_node, int parent_id) { |
696 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id); | 122 int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id); |
697 DCHECK_EQ(node_id, static_cast<int>(cached_data_.size())); | 123 DCHECK_EQ(node_id, static_cast<int>(cached_data_.size())); |
698 | 124 |
699 cached_data_.push_back(TransformCachedNodeData()); | 125 cached_data_.push_back(TransformCachedNodeData()); |
700 return node_id; | 126 return node_id; |
701 } | 127 } |
702 | 128 |
703 void TransformTree::clear() { | 129 void TransformTree::clear() { |
704 PropertyTree<TransformNode>::clear(); | 130 PropertyTree<TransformNode>::clear(); |
(...skipping 19 matching lines...) Expand all Loading... |
724 return CombineInversesBetween(source_id, dest_id, transform); | 150 return CombineInversesBetween(source_id, dest_id, transform); |
725 } | 151 } |
726 | 152 |
727 bool TransformTree::ComputeTransformWithDestinationSublayerScale( | 153 bool TransformTree::ComputeTransformWithDestinationSublayerScale( |
728 int source_id, | 154 int source_id, |
729 int dest_id, | 155 int dest_id, |
730 gfx::Transform* transform) const { | 156 gfx::Transform* transform) const { |
731 bool success = ComputeTransform(source_id, dest_id, transform); | 157 bool success = ComputeTransform(source_id, dest_id, transform); |
732 | 158 |
733 const TransformNode* dest_node = Node(dest_id); | 159 const TransformNode* dest_node = Node(dest_id); |
734 if (!dest_node->data.needs_sublayer_scale) | 160 if (!dest_node->needs_sublayer_scale) |
735 return success; | 161 return success; |
736 | 162 |
737 transform->matrix().postScale(dest_node->data.sublayer_scale.x(), | 163 transform->matrix().postScale(dest_node->sublayer_scale.x(), |
738 dest_node->data.sublayer_scale.y(), 1.f); | 164 dest_node->sublayer_scale.y(), 1.f); |
739 return success; | 165 return success; |
740 } | 166 } |
741 | 167 |
742 bool TransformTree::ComputeTransformWithSourceSublayerScale( | 168 bool TransformTree::ComputeTransformWithSourceSublayerScale( |
743 int source_id, | 169 int source_id, |
744 int dest_id, | 170 int dest_id, |
745 gfx::Transform* transform) const { | 171 gfx::Transform* transform) const { |
746 bool success = ComputeTransform(source_id, dest_id, transform); | 172 bool success = ComputeTransform(source_id, dest_id, transform); |
747 | 173 |
748 const TransformNode* source_node = Node(source_id); | 174 const TransformNode* source_node = Node(source_id); |
749 if (!source_node->data.needs_sublayer_scale) | 175 if (!source_node->needs_sublayer_scale) |
750 return success; | 176 return success; |
751 | 177 |
752 if (source_node->data.sublayer_scale.x() == 0 || | 178 if (source_node->sublayer_scale.x() == 0 || |
753 source_node->data.sublayer_scale.y() == 0) | 179 source_node->sublayer_scale.y() == 0) |
754 return false; | 180 return false; |
755 | 181 |
756 transform->Scale(1.f / source_node->data.sublayer_scale.x(), | 182 transform->Scale(1.f / source_node->sublayer_scale.x(), |
757 1.f / source_node->data.sublayer_scale.y()); | 183 1.f / source_node->sublayer_scale.y()); |
758 return success; | 184 return success; |
759 } | 185 } |
760 | 186 |
761 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const { | 187 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const { |
762 gfx::Transform transform; | 188 gfx::Transform transform; |
763 return ComputeTransform(source_id, dest_id, &transform) && | 189 return ComputeTransform(source_id, dest_id, &transform) && |
764 transform.Preserves2dAxisAlignment(); | 190 transform.Preserves2dAxisAlignment(); |
765 } | 191 } |
766 | 192 |
767 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { | 193 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { |
768 return (source_to_parent_updates_allowed() && | 194 return (source_to_parent_updates_allowed() && |
769 node->parent_id != node->data.source_node_id); | 195 node->parent_id != node->source_node_id); |
770 } | 196 } |
771 | 197 |
772 void TransformTree::ResetChangeTracking() { | 198 void TransformTree::ResetChangeTracking() { |
773 for (int id = 1; id < static_cast<int>(size()); ++id) { | 199 for (int id = 1; id < static_cast<int>(size()); ++id) { |
774 TransformNode* node = Node(id); | 200 TransformNode* node = Node(id); |
775 node->data.transform_changed = false; | 201 node->transform_changed = false; |
776 } | 202 } |
777 } | 203 } |
778 | 204 |
779 void TransformTree::UpdateTransforms(int id) { | 205 void TransformTree::UpdateTransforms(int id) { |
780 TransformNode* node = Node(id); | 206 TransformNode* node = Node(id); |
781 TransformNode* parent_node = parent(node); | 207 TransformNode* parent_node = parent(node); |
782 TransformNode* target_node = Node(TargetId(id)); | 208 TransformNode* target_node = Node(TargetId(id)); |
783 TransformNode* source_node = Node(node->data.source_node_id); | 209 TransformNode* source_node = Node(node->source_node_id); |
784 property_trees()->UpdateCachedNumber(); | 210 property_trees()->UpdateCachedNumber(); |
785 if (node->data.needs_local_transform_update || | 211 if (node->needs_local_transform_update || NeedsSourceToParentUpdate(node)) |
786 NeedsSourceToParentUpdate(node)) | |
787 UpdateLocalTransform(node); | 212 UpdateLocalTransform(node); |
788 else | 213 else |
789 UndoSnapping(node); | 214 UndoSnapping(node); |
790 UpdateScreenSpaceTransform(node, parent_node, target_node); | 215 UpdateScreenSpaceTransform(node, parent_node, target_node); |
791 UpdateSublayerScale(node); | 216 UpdateSublayerScale(node); |
792 UpdateTargetSpaceTransform(node, target_node); | 217 UpdateTargetSpaceTransform(node, target_node); |
793 UpdateAnimationProperties(node, parent_node); | 218 UpdateAnimationProperties(node, parent_node); |
794 UpdateSnapping(node); | 219 UpdateSnapping(node); |
795 UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node); | 220 UpdateNodeAndAncestorsHaveIntegerTranslations(node, parent_node); |
796 UpdateTransformChanged(node, parent_node, source_node); | 221 UpdateTransformChanged(node, parent_node, source_node); |
(...skipping 18 matching lines...) Expand all Loading... |
815 // Combine transforms to and from the screen when possible. Since flattening | 240 // Combine transforms to and from the screen when possible. Since flattening |
816 // is a non-linear operation, we cannot use this approach when there is | 241 // is a non-linear operation, we cannot use this approach when there is |
817 // non-trivial flattening between the source and destination nodes. For | 242 // non-trivial flattening between the source and destination nodes. For |
818 // example, consider the tree R->A->B->C, where B flattens its inherited | 243 // example, consider the tree R->A->B->C, where B flattens its inherited |
819 // transform, and A has a non-flat transform. Suppose C is the source and A is | 244 // transform, and A has a non-flat transform. Suppose C is the source and A is |
820 // the destination. The expected result is C * B. But C's to_screen | 245 // the destination. The expected result is C * B. But C's to_screen |
821 // transform is C * B * flattened(A * R), and A's from_screen transform is | 246 // transform is C * B * flattened(A * R), and A's from_screen transform is |
822 // R^{-1} * A^{-1}. If at least one of A and R isn't flat, the inverse of | 247 // R^{-1} * A^{-1}. If at least one of A and R isn't flat, the inverse of |
823 // flattened(A * R) won't be R^{-1} * A{-1}, so multiplying C's to_screen and | 248 // flattened(A * R) won't be R^{-1} * A{-1}, so multiplying C's to_screen and |
824 // A's from_screen will not produce the correct result. | 249 // A's from_screen will not produce the correct result. |
825 if (!dest || (dest->data.ancestors_are_invertible && | 250 if (!dest || |
826 dest->data.node_and_ancestors_are_flat)) { | 251 (dest->ancestors_are_invertible && dest->node_and_ancestors_are_flat)) { |
827 transform->ConcatTransform(ToScreen(current->id)); | 252 transform->ConcatTransform(ToScreen(current->id)); |
828 if (dest) | 253 if (dest) |
829 transform->ConcatTransform(FromScreen(dest->id)); | 254 transform->ConcatTransform(FromScreen(dest->id)); |
830 return true; | 255 return true; |
831 } | 256 } |
832 | 257 |
833 // Flattening is defined in a way that requires it to be applied while | 258 // Flattening is defined in a way that requires it to be applied while |
834 // traversing downward in the tree. We first identify nodes that are on the | 259 // traversing downward in the tree. We first identify nodes that are on the |
835 // path from the source to the destination (this is traversing upward), and | 260 // path from the source to the destination (this is traversing upward), and |
836 // then we visit these nodes in reverse order, flattening as needed. We | 261 // then we visit these nodes in reverse order, flattening as needed. We |
837 // early-out if we get to a node whose target node is the destination, since | 262 // early-out if we get to a node whose target node is the destination, since |
838 // we can then re-use the target space transform stored at that node. However, | 263 // we can then re-use the target space transform stored at that node. However, |
839 // we cannot re-use a stored target space transform if the destination has a | 264 // we cannot re-use a stored target space transform if the destination has a |
840 // zero sublayer scale, since stored target space transforms have sublayer | 265 // zero sublayer scale, since stored target space transforms have sublayer |
841 // scale baked in, but we need to compute an unscaled transform. | 266 // scale baked in, but we need to compute an unscaled transform. |
842 std::vector<int> source_to_destination; | 267 std::vector<int> source_to_destination; |
843 source_to_destination.push_back(current->id); | 268 source_to_destination.push_back(current->id); |
844 current = parent(current); | 269 current = parent(current); |
845 bool destination_has_non_zero_sublayer_scale = | 270 bool destination_has_non_zero_sublayer_scale = |
846 dest->data.sublayer_scale.x() != 0.f && | 271 dest->sublayer_scale.x() != 0.f && dest->sublayer_scale.y() != 0.f; |
847 dest->data.sublayer_scale.y() != 0.f; | |
848 DCHECK(destination_has_non_zero_sublayer_scale || | 272 DCHECK(destination_has_non_zero_sublayer_scale || |
849 !dest->data.ancestors_are_invertible); | 273 !dest->ancestors_are_invertible); |
850 for (; current && current->id > dest_id; current = parent(current)) { | 274 for (; current && current->id > dest_id; current = parent(current)) { |
851 if (destination_has_non_zero_sublayer_scale && | 275 if (destination_has_non_zero_sublayer_scale && |
852 TargetId(current->id) == dest_id && | 276 TargetId(current->id) == dest_id && |
853 ContentTargetId(current->id) == dest_id) | 277 ContentTargetId(current->id) == dest_id) |
854 break; | 278 break; |
855 source_to_destination.push_back(current->id); | 279 source_to_destination.push_back(current->id); |
856 } | 280 } |
857 | 281 |
858 gfx::Transform combined_transform; | 282 gfx::Transform combined_transform; |
859 if (current->id > dest_id) { | 283 if (current->id > dest_id) { |
860 combined_transform = ToTarget(current->id); | 284 combined_transform = ToTarget(current->id); |
861 // The stored target space transform has sublayer scale baked in, but we | 285 // The stored target space transform has sublayer scale baked in, but we |
862 // need the unscaled transform. | 286 // need the unscaled transform. |
863 combined_transform.matrix().postScale(1.0f / dest->data.sublayer_scale.x(), | 287 combined_transform.matrix().postScale( |
864 1.0f / dest->data.sublayer_scale.y(), | 288 1.0f / dest->sublayer_scale.x(), 1.0f / dest->sublayer_scale.y(), 1.0f); |
865 1.0f); | |
866 } else if (current->id < dest_id) { | 289 } else if (current->id < dest_id) { |
867 // We have reached the lowest common ancestor of the source and destination | 290 // We have reached the lowest common ancestor of the source and destination |
868 // nodes. This case can occur when we are transforming between a node | 291 // nodes. This case can occur when we are transforming between a node |
869 // corresponding to a fixed-position layer (or its descendant) and the node | 292 // corresponding to a fixed-position layer (or its descendant) and the node |
870 // corresponding to the layer's render target. For example, consider the | 293 // corresponding to the layer's render target. For example, consider the |
871 // layer tree R->T->S->F where F is fixed-position, S owns a render surface, | 294 // layer tree R->T->S->F where F is fixed-position, S owns a render surface, |
872 // and T has a significant transform. This will yield the following | 295 // and T has a significant transform. This will yield the following |
873 // transform tree: | 296 // transform tree: |
874 // R | 297 // R |
875 // | | 298 // | |
876 // T | 299 // T |
877 // /| | 300 // /| |
878 // S F | 301 // S F |
879 // In this example, T will have id 2, S will have id 3, and F will have id | 302 // In this example, T will have id 2, S will have id 3, and F will have id |
880 // 4. When walking up the ancestor chain from F, the first node with a | 303 // 4. When walking up the ancestor chain from F, the first node with a |
881 // smaller id than S will be T, the lowest common ancestor of these nodes. | 304 // smaller id than S will be T, the lowest common ancestor of these nodes. |
882 // We compute the transform from T to S here, and then from F to T in the | 305 // We compute the transform from T to S here, and then from F to T in the |
883 // loop below. | 306 // loop below. |
884 DCHECK(IsDescendant(dest_id, current->id)); | 307 DCHECK(IsDescendant(dest_id, current->id)); |
885 CombineInversesBetween(current->id, dest_id, &combined_transform); | 308 CombineInversesBetween(current->id, dest_id, &combined_transform); |
886 DCHECK(combined_transform.IsApproximatelyIdentityOrTranslation( | 309 DCHECK(combined_transform.IsApproximatelyIdentityOrTranslation( |
887 SkDoubleToMScalar(1e-4))); | 310 SkDoubleToMScalar(1e-4))); |
888 } | 311 } |
889 | 312 |
890 size_t source_to_destination_size = source_to_destination.size(); | 313 size_t source_to_destination_size = source_to_destination.size(); |
891 for (size_t i = 0; i < source_to_destination_size; ++i) { | 314 for (size_t i = 0; i < source_to_destination_size; ++i) { |
892 size_t index = source_to_destination_size - 1 - i; | 315 size_t index = source_to_destination_size - 1 - i; |
893 const TransformNode* node = Node(source_to_destination[index]); | 316 const TransformNode* node = Node(source_to_destination[index]); |
894 if (node->data.flattens_inherited_transform) | 317 if (node->flattens_inherited_transform) |
895 combined_transform.FlattenTo2d(); | 318 combined_transform.FlattenTo2d(); |
896 combined_transform.PreconcatTransform(node->data.to_parent); | 319 combined_transform.PreconcatTransform(node->to_parent); |
897 } | 320 } |
898 | 321 |
899 transform->ConcatTransform(combined_transform); | 322 transform->ConcatTransform(combined_transform); |
900 return true; | 323 return true; |
901 } | 324 } |
902 | 325 |
903 bool TransformTree::CombineInversesBetween(int source_id, | 326 bool TransformTree::CombineInversesBetween(int source_id, |
904 int dest_id, | 327 int dest_id, |
905 gfx::Transform* transform) const { | 328 gfx::Transform* transform) const { |
906 DCHECK(source_id < dest_id); | 329 DCHECK(source_id < dest_id); |
907 const TransformNode* current = Node(dest_id); | 330 const TransformNode* current = Node(dest_id); |
908 const TransformNode* dest = Node(source_id); | 331 const TransformNode* dest = Node(source_id); |
909 // Just as in CombineTransformsBetween, we can use screen space transforms in | 332 // Just as in CombineTransformsBetween, we can use screen space transforms in |
910 // this computation only when there isn't any non-trivial flattening | 333 // this computation only when there isn't any non-trivial flattening |
911 // involved. | 334 // involved. |
912 if (current->data.ancestors_are_invertible && | 335 if (current->ancestors_are_invertible && |
913 current->data.node_and_ancestors_are_flat) { | 336 current->node_and_ancestors_are_flat) { |
914 transform->PreconcatTransform(FromScreen(current->id)); | 337 transform->PreconcatTransform(FromScreen(current->id)); |
915 if (dest) | 338 if (dest) |
916 transform->PreconcatTransform(ToScreen(dest->id)); | 339 transform->PreconcatTransform(ToScreen(dest->id)); |
917 return true; | 340 return true; |
918 } | 341 } |
919 | 342 |
920 // Inverting a flattening is not equivalent to flattening an inverse. This | 343 // Inverting a flattening is not equivalent to flattening an inverse. This |
921 // means we cannot, for example, use the inverse of each node's to_parent | 344 // means we cannot, for example, use the inverse of each node's to_parent |
922 // transform, flattening where needed. Instead, we must compute the transform | 345 // transform, flattening where needed. Instead, we must compute the transform |
923 // from the destination to the source, with flattening, and then invert the | 346 // from the destination to the source, with flattening, and then invert the |
924 // result. | 347 // result. |
925 gfx::Transform dest_to_source; | 348 gfx::Transform dest_to_source; |
926 CombineTransformsBetween(dest_id, source_id, &dest_to_source); | 349 CombineTransformsBetween(dest_id, source_id, &dest_to_source); |
927 gfx::Transform source_to_dest; | 350 gfx::Transform source_to_dest; |
928 bool all_are_invertible = dest_to_source.GetInverse(&source_to_dest); | 351 bool all_are_invertible = dest_to_source.GetInverse(&source_to_dest); |
929 transform->PreconcatTransform(source_to_dest); | 352 transform->PreconcatTransform(source_to_dest); |
930 return all_are_invertible; | 353 return all_are_invertible; |
931 } | 354 } |
932 | 355 |
933 void TransformTree::UpdateLocalTransform(TransformNode* node) { | 356 void TransformTree::UpdateLocalTransform(TransformNode* node) { |
934 gfx::Transform transform = node->data.post_local; | 357 gfx::Transform transform = node->post_local; |
935 if (NeedsSourceToParentUpdate(node)) { | 358 if (NeedsSourceToParentUpdate(node)) { |
936 gfx::Transform to_parent; | 359 gfx::Transform to_parent; |
937 ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent); | 360 ComputeTransform(node->source_node_id, node->parent_id, &to_parent); |
938 node->data.source_to_parent = to_parent.To2dTranslation(); | 361 node->source_to_parent = to_parent.To2dTranslation(); |
939 } | 362 } |
940 | 363 |
941 gfx::Vector2dF fixed_position_adjustment; | 364 gfx::Vector2dF fixed_position_adjustment; |
942 gfx::Vector2dF inner_viewport_bounds_delta = | 365 gfx::Vector2dF inner_viewport_bounds_delta = |
943 property_trees()->inner_viewport_container_bounds_delta(); | 366 property_trees()->inner_viewport_container_bounds_delta(); |
944 gfx::Vector2dF outer_viewport_bounds_delta = | 367 gfx::Vector2dF outer_viewport_bounds_delta = |
945 property_trees()->outer_viewport_container_bounds_delta(); | 368 property_trees()->outer_viewport_container_bounds_delta(); |
946 if (node->data.affected_by_inner_viewport_bounds_delta_x) | 369 if (node->affected_by_inner_viewport_bounds_delta_x) |
947 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); | 370 fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x()); |
948 else if (node->data.affected_by_outer_viewport_bounds_delta_x) | 371 else if (node->affected_by_outer_viewport_bounds_delta_x) |
949 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); | 372 fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x()); |
950 | 373 |
951 if (node->data.affected_by_inner_viewport_bounds_delta_y) | 374 if (node->affected_by_inner_viewport_bounds_delta_y) |
952 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); | 375 fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y()); |
953 else if (node->data.affected_by_outer_viewport_bounds_delta_y) | 376 else if (node->affected_by_outer_viewport_bounds_delta_y) |
954 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); | 377 fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y()); |
955 | 378 |
956 transform.Translate( | 379 transform.Translate(node->source_to_parent.x() - node->scroll_offset.x() + |
957 node->data.source_to_parent.x() - node->data.scroll_offset.x() + | 380 fixed_position_adjustment.x(), |
958 fixed_position_adjustment.x(), | 381 node->source_to_parent.y() - node->scroll_offset.y() + |
959 node->data.source_to_parent.y() - node->data.scroll_offset.y() + | 382 fixed_position_adjustment.y()); |
960 fixed_position_adjustment.y()); | 383 transform.PreconcatTransform(node->local); |
961 transform.PreconcatTransform(node->data.local); | 384 transform.PreconcatTransform(node->pre_local); |
962 transform.PreconcatTransform(node->data.pre_local); | 385 node->set_to_parent(transform); |
963 node->data.set_to_parent(transform); | 386 node->needs_local_transform_update = false; |
964 node->data.needs_local_transform_update = false; | |
965 } | 387 } |
966 | 388 |
967 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, | 389 void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, |
968 TransformNode* parent_node, | 390 TransformNode* parent_node, |
969 TransformNode* target_node) { | 391 TransformNode* target_node) { |
970 if (!parent_node) { | 392 if (!parent_node) { |
971 SetToScreen(node->id, node->data.to_parent); | 393 SetToScreen(node->id, node->to_parent); |
972 node->data.ancestors_are_invertible = true; | 394 node->ancestors_are_invertible = true; |
973 node->data.to_screen_is_potentially_animated = false; | 395 node->to_screen_is_potentially_animated = false; |
974 node->data.node_and_ancestors_are_flat = node->data.to_parent.IsFlat(); | 396 node->node_and_ancestors_are_flat = node->to_parent.IsFlat(); |
975 } else { | 397 } else { |
976 gfx::Transform to_screen_space_transform = ToScreen(parent_node->id); | 398 gfx::Transform to_screen_space_transform = ToScreen(parent_node->id); |
977 if (node->data.flattens_inherited_transform) | 399 if (node->flattens_inherited_transform) |
978 to_screen_space_transform.FlattenTo2d(); | 400 to_screen_space_transform.FlattenTo2d(); |
979 to_screen_space_transform.PreconcatTransform(node->data.to_parent); | 401 to_screen_space_transform.PreconcatTransform(node->to_parent); |
980 node->data.ancestors_are_invertible = | 402 node->ancestors_are_invertible = parent_node->ancestors_are_invertible; |
981 parent_node->data.ancestors_are_invertible; | 403 node->node_and_ancestors_are_flat = |
982 node->data.node_and_ancestors_are_flat = | 404 parent_node->node_and_ancestors_are_flat && node->to_parent.IsFlat(); |
983 parent_node->data.node_and_ancestors_are_flat && | |
984 node->data.to_parent.IsFlat(); | |
985 SetToScreen(node->id, to_screen_space_transform); | 405 SetToScreen(node->id, to_screen_space_transform); |
986 } | 406 } |
987 | 407 |
988 gfx::Transform from_screen; | 408 gfx::Transform from_screen; |
989 if (!ToScreen(node->id).GetInverse(&from_screen)) | 409 if (!ToScreen(node->id).GetInverse(&from_screen)) |
990 node->data.ancestors_are_invertible = false; | 410 node->ancestors_are_invertible = false; |
991 SetFromScreen(node->id, from_screen); | 411 SetFromScreen(node->id, from_screen); |
992 } | 412 } |
993 | 413 |
994 void TransformTree::UpdateSublayerScale(TransformNode* node) { | 414 void TransformTree::UpdateSublayerScale(TransformNode* node) { |
995 // The sublayer scale depends on the screen space transform, so update it too. | 415 // The sublayer scale depends on the screen space transform, so update it too. |
996 if (!node->data.needs_sublayer_scale) { | 416 if (!node->needs_sublayer_scale) { |
997 node->data.sublayer_scale = gfx::Vector2dF(1.0f, 1.0f); | 417 node->sublayer_scale = gfx::Vector2dF(1.0f, 1.0f); |
998 return; | 418 return; |
999 } | 419 } |
1000 | 420 |
1001 float layer_scale_factor = | 421 float layer_scale_factor = |
1002 device_scale_factor_ * device_transform_scale_factor_; | 422 device_scale_factor_ * device_transform_scale_factor_; |
1003 if (node->data.in_subtree_of_page_scale_layer) | 423 if (node->in_subtree_of_page_scale_layer) |
1004 layer_scale_factor *= page_scale_factor_; | 424 layer_scale_factor *= page_scale_factor_; |
1005 node->data.sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( | 425 node->sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( |
1006 ToScreen(node->id), layer_scale_factor); | 426 ToScreen(node->id), layer_scale_factor); |
1007 } | 427 } |
1008 | 428 |
1009 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, | 429 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, |
1010 TransformNode* target_node) { | 430 TransformNode* target_node) { |
1011 gfx::Transform target_space_transform; | 431 gfx::Transform target_space_transform; |
1012 if (node->data.needs_sublayer_scale) { | 432 if (node->needs_sublayer_scale) { |
1013 target_space_transform.MakeIdentity(); | 433 target_space_transform.MakeIdentity(); |
1014 target_space_transform.Scale(node->data.sublayer_scale.x(), | 434 target_space_transform.Scale(node->sublayer_scale.x(), |
1015 node->data.sublayer_scale.y()); | 435 node->sublayer_scale.y()); |
1016 } else { | 436 } else { |
1017 // In order to include the root transform for the root surface, we walk up | 437 // In order to include the root transform for the root surface, we walk up |
1018 // to the root of the transform tree in ComputeTransform. | 438 // to the root of the transform tree in ComputeTransform. |
1019 int target_id = target_node->id; | 439 int target_id = target_node->id; |
1020 ComputeTransformWithDestinationSublayerScale(node->id, target_id, | 440 ComputeTransformWithDestinationSublayerScale(node->id, target_id, |
1021 &target_space_transform); | 441 &target_space_transform); |
1022 } | 442 } |
1023 | 443 |
1024 gfx::Transform from_target; | 444 gfx::Transform from_target; |
1025 if (!target_space_transform.GetInverse(&from_target)) | 445 if (!target_space_transform.GetInverse(&from_target)) |
1026 node->data.ancestors_are_invertible = false; | 446 node->ancestors_are_invertible = false; |
1027 SetToTarget(node->id, target_space_transform); | 447 SetToTarget(node->id, target_space_transform); |
1028 SetFromTarget(node->id, from_target); | 448 SetFromTarget(node->id, from_target); |
1029 } | 449 } |
1030 | 450 |
1031 void TransformTree::UpdateAnimationProperties(TransformNode* node, | 451 void TransformTree::UpdateAnimationProperties(TransformNode* node, |
1032 TransformNode* parent_node) { | 452 TransformNode* parent_node) { |
1033 bool ancestor_is_animating = false; | 453 bool ancestor_is_animating = false; |
1034 if (parent_node) | 454 if (parent_node) |
1035 ancestor_is_animating = parent_node->data.to_screen_is_potentially_animated; | 455 ancestor_is_animating = parent_node->to_screen_is_potentially_animated; |
1036 node->data.to_screen_is_potentially_animated = | 456 node->to_screen_is_potentially_animated = |
1037 node->data.has_potential_animation || ancestor_is_animating; | 457 node->has_potential_animation || ancestor_is_animating; |
1038 } | 458 } |
1039 | 459 |
1040 void TransformTree::UndoSnapping(TransformNode* node) { | 460 void TransformTree::UndoSnapping(TransformNode* node) { |
1041 // to_parent transform has the scroll snap from previous frame baked in. | 461 // to_parent transform has the scroll snap from previous frame baked in. |
1042 // We need to undo it and use the un-snapped transform to compute current | 462 // We need to undo it and use the un-snapped transform to compute current |
1043 // target and screen space transforms. | 463 // target and screen space transforms. |
1044 node->data.to_parent.Translate(-node->data.scroll_snap.x(), | 464 node->to_parent.Translate(-node->scroll_snap.x(), -node->scroll_snap.y()); |
1045 -node->data.scroll_snap.y()); | |
1046 } | 465 } |
1047 | 466 |
1048 void TransformTree::UpdateSnapping(TransformNode* node) { | 467 void TransformTree::UpdateSnapping(TransformNode* node) { |
1049 if (!node->data.scrolls || node->data.to_screen_is_potentially_animated || | 468 if (!node->scrolls || node->to_screen_is_potentially_animated || |
1050 !ToScreen(node->id).IsScaleOrTranslation() || | 469 !ToScreen(node->id).IsScaleOrTranslation() || |
1051 !node->data.ancestors_are_invertible) { | 470 !node->ancestors_are_invertible) { |
1052 return; | 471 return; |
1053 } | 472 } |
1054 | 473 |
1055 // Scroll snapping must be done in screen space (the pixels we care about). | 474 // Scroll snapping must be done in screen space (the pixels we care about). |
1056 // This means we effectively snap the screen space transform. If ST is the | 475 // This means we effectively snap the screen space transform. If ST is the |
1057 // screen space transform and ST' is ST with its translation components | 476 // screen space transform and ST' is ST with its translation components |
1058 // rounded, then what we're after is the scroll delta X, where ST * X = ST'. | 477 // rounded, then what we're after is the scroll delta X, where ST * X = ST'. |
1059 // I.e., we want a transform that will realize our scroll snap. It follows | 478 // I.e., we want a transform that will realize our scroll snap. It follows |
1060 // that X = ST^-1 * ST'. We cache ST and ST^-1 to make this more efficient. | 479 // that X = ST^-1 * ST'. We cache ST and ST^-1 to make this more efficient. |
1061 gfx::Transform rounded = ToScreen(node->id); | 480 gfx::Transform rounded = ToScreen(node->id); |
1062 rounded.RoundTranslationComponents(); | 481 rounded.RoundTranslationComponents(); |
1063 gfx::Transform delta = FromScreen(node->id); | 482 gfx::Transform delta = FromScreen(node->id); |
1064 delta *= rounded; | 483 delta *= rounded; |
1065 | 484 |
1066 DCHECK(delta.IsApproximatelyIdentityOrTranslation(SkDoubleToMScalar(1e-4))) | 485 DCHECK(delta.IsApproximatelyIdentityOrTranslation(SkDoubleToMScalar(1e-4))) |
1067 << delta.ToString(); | 486 << delta.ToString(); |
1068 | 487 |
1069 gfx::Vector2dF translation = delta.To2dTranslation(); | 488 gfx::Vector2dF translation = delta.To2dTranslation(); |
1070 | 489 |
1071 // Now that we have our scroll delta, we must apply it to each of our | 490 // Now that we have our scroll delta, we must apply it to each of our |
1072 // combined, to/from matrices. | 491 // combined, to/from matrices. |
1073 SetToScreen(node->id, rounded); | 492 SetToScreen(node->id, rounded); |
1074 node->data.to_parent.Translate(translation.x(), translation.y()); | 493 node->to_parent.Translate(translation.x(), translation.y()); |
1075 gfx::Transform from_screen = FromScreen(node->id); | 494 gfx::Transform from_screen = FromScreen(node->id); |
1076 from_screen.matrix().postTranslate(-translation.x(), -translation.y(), 0); | 495 from_screen.matrix().postTranslate(-translation.x(), -translation.y(), 0); |
1077 SetFromScreen(node->id, from_screen); | 496 SetFromScreen(node->id, from_screen); |
1078 gfx::Transform to_target = ToTarget(node->id); | 497 gfx::Transform to_target = ToTarget(node->id); |
1079 to_target.Translate(translation.x(), translation.y()); | 498 to_target.Translate(translation.x(), translation.y()); |
1080 SetToTarget(node->id, to_target); | 499 SetToTarget(node->id, to_target); |
1081 gfx::Transform from_target = FromTarget(node->id); | 500 gfx::Transform from_target = FromTarget(node->id); |
1082 from_target.matrix().postTranslate(-translation.x(), -translation.y(), 0); | 501 from_target.matrix().postTranslate(-translation.x(), -translation.y(), 0); |
1083 SetFromTarget(node->id, from_target); | 502 SetFromTarget(node->id, from_target); |
1084 node->data.scroll_snap = translation; | 503 node->scroll_snap = translation; |
1085 } | 504 } |
1086 | 505 |
1087 void TransformTree::UpdateTransformChanged(TransformNode* node, | 506 void TransformTree::UpdateTransformChanged(TransformNode* node, |
1088 TransformNode* parent_node, | 507 TransformNode* parent_node, |
1089 TransformNode* source_node) { | 508 TransformNode* source_node) { |
1090 if (parent_node && parent_node->data.transform_changed) { | 509 if (parent_node && parent_node->transform_changed) { |
1091 node->data.transform_changed = true; | 510 node->transform_changed = true; |
1092 return; | 511 return; |
1093 } | 512 } |
1094 | 513 |
1095 if (source_node && source_node->id != parent_node->id && | 514 if (source_node && source_node->id != parent_node->id && |
1096 source_to_parent_updates_allowed_ && source_node->data.transform_changed) | 515 source_to_parent_updates_allowed_ && source_node->transform_changed) |
1097 node->data.transform_changed = true; | 516 node->transform_changed = true; |
1098 } | 517 } |
1099 | 518 |
1100 void TransformTree::UpdateNodeAndAncestorsAreAnimatedOrInvertible( | 519 void TransformTree::UpdateNodeAndAncestorsAreAnimatedOrInvertible( |
1101 TransformNode* node, | 520 TransformNode* node, |
1102 TransformNode* parent_node) { | 521 TransformNode* parent_node) { |
1103 if (!parent_node) { | 522 if (!parent_node) { |
1104 node->data.node_and_ancestors_are_animated_or_invertible = | 523 node->node_and_ancestors_are_animated_or_invertible = |
1105 node->data.has_potential_animation || node->data.is_invertible; | 524 node->has_potential_animation || node->is_invertible; |
1106 return; | 525 return; |
1107 } | 526 } |
1108 if (!parent_node->data.node_and_ancestors_are_animated_or_invertible) { | 527 if (!parent_node->node_and_ancestors_are_animated_or_invertible) { |
1109 node->data.node_and_ancestors_are_animated_or_invertible = false; | 528 node->node_and_ancestors_are_animated_or_invertible = false; |
1110 return; | 529 return; |
1111 } | 530 } |
1112 bool is_invertible = node->data.is_invertible; | 531 bool is_invertible = node->is_invertible; |
1113 // Even when the current node's transform and the parent's screen space | 532 // Even when the current node's transform and the parent's screen space |
1114 // transform are invertible, the current node's screen space transform can | 533 // transform are invertible, the current node's screen space transform can |
1115 // become uninvertible due to floating-point arithmetic. | 534 // become uninvertible due to floating-point arithmetic. |
1116 if (!node->data.ancestors_are_invertible && | 535 if (!node->ancestors_are_invertible && parent_node->ancestors_are_invertible) |
1117 parent_node->data.ancestors_are_invertible) | |
1118 is_invertible = false; | 536 is_invertible = false; |
1119 node->data.node_and_ancestors_are_animated_or_invertible = | 537 node->node_and_ancestors_are_animated_or_invertible = |
1120 node->data.has_potential_animation || is_invertible; | 538 node->has_potential_animation || is_invertible; |
1121 } | 539 } |
1122 | 540 |
1123 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, | 541 void TransformTree::SetDeviceTransform(const gfx::Transform& transform, |
1124 gfx::PointF root_position) { | 542 gfx::PointF root_position) { |
1125 gfx::Transform root_post_local = transform; | 543 gfx::Transform root_post_local = transform; |
1126 TransformNode* node = Node(1); | 544 TransformNode* node = Node(1); |
1127 root_post_local.Scale(node->data.post_local_scale_factor, | 545 root_post_local.Scale(node->post_local_scale_factor, |
1128 node->data.post_local_scale_factor); | 546 node->post_local_scale_factor); |
1129 root_post_local.Translate(root_position.x(), root_position.y()); | 547 root_post_local.Translate(root_position.x(), root_position.y()); |
1130 if (node->data.post_local == root_post_local) | 548 if (node->post_local == root_post_local) |
1131 return; | 549 return; |
1132 | 550 |
1133 node->data.post_local = root_post_local; | 551 node->post_local = root_post_local; |
1134 node->data.needs_local_transform_update = true; | 552 node->needs_local_transform_update = true; |
1135 set_needs_update(true); | 553 set_needs_update(true); |
1136 } | 554 } |
1137 | 555 |
1138 void TransformTree::SetDeviceTransformScaleFactor( | 556 void TransformTree::SetDeviceTransformScaleFactor( |
1139 const gfx::Transform& transform) { | 557 const gfx::Transform& transform) { |
1140 gfx::Vector2dF device_transform_scale_components = | 558 gfx::Vector2dF device_transform_scale_components = |
1141 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); | 559 MathUtil::ComputeTransform2dScaleComponents(transform, 1.f); |
1142 | 560 |
1143 // Not handling the rare case of different x and y device scale. | 561 // Not handling the rare case of different x and y device scale. |
1144 device_transform_scale_factor_ = | 562 device_transform_scale_factor_ = |
1145 std::max(device_transform_scale_components.x(), | 563 std::max(device_transform_scale_components.x(), |
1146 device_transform_scale_components.y()); | 564 device_transform_scale_components.y()); |
1147 } | 565 } |
1148 | 566 |
1149 void TransformTree::UpdateInnerViewportContainerBoundsDelta() { | 567 void TransformTree::UpdateInnerViewportContainerBoundsDelta() { |
1150 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) | 568 if (nodes_affected_by_inner_viewport_bounds_delta_.empty()) |
1151 return; | 569 return; |
1152 | 570 |
1153 set_needs_update(true); | 571 set_needs_update(true); |
1154 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) | 572 for (int i : nodes_affected_by_inner_viewport_bounds_delta_) |
1155 Node(i)->data.needs_local_transform_update = true; | 573 Node(i)->needs_local_transform_update = true; |
1156 } | 574 } |
1157 | 575 |
1158 void TransformTree::UpdateOuterViewportContainerBoundsDelta() { | 576 void TransformTree::UpdateOuterViewportContainerBoundsDelta() { |
1159 if (nodes_affected_by_outer_viewport_bounds_delta_.empty()) | 577 if (nodes_affected_by_outer_viewport_bounds_delta_.empty()) |
1160 return; | 578 return; |
1161 | 579 |
1162 set_needs_update(true); | 580 set_needs_update(true); |
1163 for (int i : nodes_affected_by_outer_viewport_bounds_delta_) | 581 for (int i : nodes_affected_by_outer_viewport_bounds_delta_) |
1164 Node(i)->data.needs_local_transform_update = true; | 582 Node(i)->needs_local_transform_update = true; |
1165 } | 583 } |
1166 | 584 |
1167 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) { | 585 void TransformTree::AddNodeAffectedByInnerViewportBoundsDelta(int node_id) { |
1168 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id); | 586 nodes_affected_by_inner_viewport_bounds_delta_.push_back(node_id); |
1169 } | 587 } |
1170 | 588 |
1171 void TransformTree::AddNodeAffectedByOuterViewportBoundsDelta(int node_id) { | 589 void TransformTree::AddNodeAffectedByOuterViewportBoundsDelta(int node_id) { |
1172 nodes_affected_by_outer_viewport_bounds_delta_.push_back(node_id); | 590 nodes_affected_by_outer_viewport_bounds_delta_.push_back(node_id); |
1173 } | 591 } |
1174 | 592 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 } | 661 } |
1244 | 662 |
1245 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( | 663 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( |
1246 int id) const { | 664 int id) const { |
1247 DCHECK_GT(id, 0); | 665 DCHECK_GT(id, 0); |
1248 if (id == 1) { | 666 if (id == 1) { |
1249 return gfx::Transform(); | 667 return gfx::Transform(); |
1250 } | 668 } |
1251 const TransformNode* node = Node(id); | 669 const TransformNode* node = Node(id); |
1252 gfx::Transform screen_space_transform = ToScreen(id); | 670 gfx::Transform screen_space_transform = ToScreen(id); |
1253 if (node->data.sublayer_scale.x() != 0.0 && | 671 if (node->sublayer_scale.x() != 0.0 && node->sublayer_scale.y() != 0.0) |
1254 node->data.sublayer_scale.y() != 0.0) | 672 screen_space_transform.Scale(1.0 / node->sublayer_scale.x(), |
1255 screen_space_transform.Scale(1.0 / node->data.sublayer_scale.x(), | 673 1.0 / node->sublayer_scale.y()); |
1256 1.0 / node->data.sublayer_scale.y()); | |
1257 return screen_space_transform; | 674 return screen_space_transform; |
1258 } | 675 } |
1259 | 676 |
1260 bool TransformTree::operator==(const TransformTree& other) const { | 677 bool TransformTree::operator==(const TransformTree& other) const { |
1261 return PropertyTree::operator==(other) && | 678 return PropertyTree::operator==(other) && |
1262 source_to_parent_updates_allowed_ == | 679 source_to_parent_updates_allowed_ == |
1263 other.source_to_parent_updates_allowed() && | 680 other.source_to_parent_updates_allowed() && |
1264 page_scale_factor_ == other.page_scale_factor() && | 681 page_scale_factor_ == other.page_scale_factor() && |
1265 device_scale_factor_ == other.device_scale_factor() && | 682 device_scale_factor_ == other.device_scale_factor() && |
1266 device_transform_scale_factor_ == | 683 device_transform_scale_factor_ == |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1333 EffectTree::EffectTree() {} | 750 EffectTree::EffectTree() {} |
1334 | 751 |
1335 EffectTree::~EffectTree() {} | 752 EffectTree::~EffectTree() {} |
1336 | 753 |
1337 void EffectTree::clear() { | 754 void EffectTree::clear() { |
1338 PropertyTree<EffectNode>::clear(); | 755 PropertyTree<EffectNode>::clear(); |
1339 mask_replica_layer_ids_.clear(); | 756 mask_replica_layer_ids_.clear(); |
1340 } | 757 } |
1341 | 758 |
1342 float EffectTree::EffectiveOpacity(const EffectNode* node) const { | 759 float EffectTree::EffectiveOpacity(const EffectNode* node) const { |
1343 return node->data.subtree_hidden ? 0.f : node->data.opacity; | 760 return node->subtree_hidden ? 0.f : node->opacity; |
1344 } | 761 } |
1345 | 762 |
1346 void EffectTree::UpdateOpacities(EffectNode* node, EffectNode* parent_node) { | 763 void EffectTree::UpdateOpacities(EffectNode* node, EffectNode* parent_node) { |
1347 node->data.screen_space_opacity = EffectiveOpacity(node); | 764 node->screen_space_opacity = EffectiveOpacity(node); |
1348 | 765 |
1349 if (parent_node) | 766 if (parent_node) |
1350 node->data.screen_space_opacity *= parent_node->data.screen_space_opacity; | 767 node->screen_space_opacity *= parent_node->screen_space_opacity; |
1351 } | 768 } |
1352 | 769 |
1353 void EffectTree::UpdateIsDrawn(EffectNode* node, EffectNode* parent_node) { | 770 void EffectTree::UpdateIsDrawn(EffectNode* node, EffectNode* parent_node) { |
1354 // Nodes that have screen space opacity 0 are hidden. So they are not drawn. | 771 // Nodes that have screen space opacity 0 are hidden. So they are not drawn. |
1355 // Exceptions: | 772 // Exceptions: |
1356 // 1) Nodes that contribute to copy requests, whether hidden or not, must be | 773 // 1) Nodes that contribute to copy requests, whether hidden or not, must be |
1357 // drawn. | 774 // drawn. |
1358 // 2) Nodes that have a background filter. | 775 // 2) Nodes that have a background filter. |
1359 // 3) Nodes with animating screen space opacity on main thread or pending tree | 776 // 3) Nodes with animating screen space opacity on main thread or pending tree |
1360 // are drawn if their parent is drawn irrespective of their opacity. | 777 // are drawn if their parent is drawn irrespective of their opacity. |
1361 if (node->data.has_copy_request) | 778 if (node->has_copy_request) |
1362 node->data.is_drawn = true; | 779 node->is_drawn = true; |
1363 else if (EffectiveOpacity(node) == 0.f && | 780 else if (EffectiveOpacity(node) == 0.f && |
1364 (!node->data.has_potential_opacity_animation || | 781 (!node->has_potential_opacity_animation || |
1365 property_trees()->is_active) && | 782 property_trees()->is_active) && |
1366 node->data.background_filters.IsEmpty()) | 783 node->background_filters.IsEmpty()) |
1367 node->data.is_drawn = false; | 784 node->is_drawn = false; |
1368 else if (parent_node) | 785 else if (parent_node) |
1369 node->data.is_drawn = parent_node->data.is_drawn; | 786 node->is_drawn = parent_node->is_drawn; |
1370 else | 787 else |
1371 node->data.is_drawn = true; | 788 node->is_drawn = true; |
1372 } | 789 } |
1373 | 790 |
1374 void EffectTree::UpdateEffectChanged(EffectNode* node, | 791 void EffectTree::UpdateEffectChanged(EffectNode* node, |
1375 EffectNode* parent_node) { | 792 EffectNode* parent_node) { |
1376 if (parent_node && parent_node->data.effect_changed) { | 793 if (parent_node && parent_node->effect_changed) { |
1377 node->data.effect_changed = true; | 794 node->effect_changed = true; |
1378 } | 795 } |
1379 } | 796 } |
1380 | 797 |
1381 void EffectTree::UpdateBackfaceVisibility(EffectNode* node, | 798 void EffectTree::UpdateBackfaceVisibility(EffectNode* node, |
1382 EffectNode* parent_node) { | 799 EffectNode* parent_node) { |
1383 if (!parent_node) { | 800 if (!parent_node) { |
1384 node->data.hidden_by_backface_visibility = false; | 801 node->hidden_by_backface_visibility = false; |
1385 return; | 802 return; |
1386 } | 803 } |
1387 if (parent_node->data.hidden_by_backface_visibility) { | 804 if (parent_node->hidden_by_backface_visibility) { |
1388 node->data.hidden_by_backface_visibility = true; | 805 node->hidden_by_backface_visibility = true; |
1389 return; | 806 return; |
1390 } | 807 } |
1391 | 808 |
1392 TransformTree& transform_tree = property_trees()->transform_tree; | 809 TransformTree& transform_tree = property_trees()->transform_tree; |
1393 if (node->data.has_render_surface && !node->data.double_sided) { | 810 if (node->has_render_surface && !node->double_sided) { |
1394 TransformNode* transform_node = | 811 TransformNode* transform_node = transform_tree.Node(node->transform_id); |
1395 transform_tree.Node(node->data.transform_id); | 812 if (transform_node->is_invertible && |
1396 if (transform_node->data.is_invertible && | 813 transform_node->ancestors_are_invertible) { |
1397 transform_node->data.ancestors_are_invertible) { | 814 if (transform_node->sorting_context_id) { |
1398 if (transform_node->data.sorting_context_id) { | |
1399 const TransformNode* parent_transform_node = | 815 const TransformNode* parent_transform_node = |
1400 transform_tree.parent(transform_node); | 816 transform_tree.parent(transform_node); |
1401 if (parent_transform_node && | 817 if (parent_transform_node && |
1402 parent_transform_node->data.sorting_context_id == | 818 parent_transform_node->sorting_context_id == |
1403 transform_node->data.sorting_context_id) { | 819 transform_node->sorting_context_id) { |
1404 gfx::Transform surface_draw_transform; | 820 gfx::Transform surface_draw_transform; |
1405 transform_tree.ComputeTransform( | 821 transform_tree.ComputeTransform( |
1406 transform_node->id, transform_tree.TargetId(transform_node->id), | 822 transform_node->id, transform_tree.TargetId(transform_node->id), |
1407 &surface_draw_transform); | 823 &surface_draw_transform); |
1408 node->data.hidden_by_backface_visibility = | 824 node->hidden_by_backface_visibility = |
1409 surface_draw_transform.IsBackFaceVisible(); | 825 surface_draw_transform.IsBackFaceVisible(); |
1410 } else { | 826 } else { |
1411 node->data.hidden_by_backface_visibility = | 827 node->hidden_by_backface_visibility = |
1412 transform_node->data.local.IsBackFaceVisible(); | 828 transform_node->local.IsBackFaceVisible(); |
1413 } | 829 } |
1414 return; | 830 return; |
1415 } | 831 } |
1416 } | 832 } |
1417 } | 833 } |
1418 node->data.hidden_by_backface_visibility = false; | 834 node->hidden_by_backface_visibility = false; |
1419 } | 835 } |
1420 | 836 |
1421 void EffectTree::UpdateEffects(int id) { | 837 void EffectTree::UpdateEffects(int id) { |
1422 EffectNode* node = Node(id); | 838 EffectNode* node = Node(id); |
1423 EffectNode* parent_node = parent(node); | 839 EffectNode* parent_node = parent(node); |
1424 | 840 |
1425 UpdateOpacities(node, parent_node); | 841 UpdateOpacities(node, parent_node); |
1426 UpdateIsDrawn(node, parent_node); | 842 UpdateIsDrawn(node, parent_node); |
1427 UpdateEffectChanged(node, parent_node); | 843 UpdateEffectChanged(node, parent_node); |
1428 UpdateBackfaceVisibility(node, parent_node); | 844 UpdateBackfaceVisibility(node, parent_node); |
(...skipping 27 matching lines...) Expand all Loading... |
1456 // that were created only for the copy requests we just pushed are no longer | 872 // that were created only for the copy requests we just pushed are no longer |
1457 // needed. | 873 // needed. |
1458 if (property_trees()->is_main_thread) | 874 if (property_trees()->is_main_thread) |
1459 property_trees()->needs_rebuild = true; | 875 property_trees()->needs_rebuild = true; |
1460 } | 876 } |
1461 | 877 |
1462 void EffectTree::TakeCopyRequestsAndTransformToSurface( | 878 void EffectTree::TakeCopyRequestsAndTransformToSurface( |
1463 int node_id, | 879 int node_id, |
1464 std::vector<std::unique_ptr<CopyOutputRequest>>* requests) { | 880 std::vector<std::unique_ptr<CopyOutputRequest>>* requests) { |
1465 EffectNode* effect_node = Node(node_id); | 881 EffectNode* effect_node = Node(node_id); |
1466 DCHECK(effect_node->data.has_render_surface); | 882 DCHECK(effect_node->has_render_surface); |
1467 DCHECK(effect_node->data.has_copy_request); | 883 DCHECK(effect_node->has_copy_request); |
1468 | 884 |
1469 auto range = copy_requests_.equal_range(node_id); | 885 auto range = copy_requests_.equal_range(node_id); |
1470 for (auto it = range.first; it != range.second; ++it) | 886 for (auto it = range.first; it != range.second; ++it) |
1471 requests->push_back(std::move(it->second)); | 887 requests->push_back(std::move(it->second)); |
1472 copy_requests_.erase(range.first, range.second); | 888 copy_requests_.erase(range.first, range.second); |
1473 | 889 |
1474 for (auto& it : *requests) { | 890 for (auto& it : *requests) { |
1475 if (!it->has_area()) | 891 if (!it->has_area()) |
1476 continue; | 892 continue; |
1477 | 893 |
1478 // The area needs to be transformed from the space of content that draws to | 894 // The area needs to be transformed from the space of content that draws to |
1479 // the surface to the space of the surface itself. | 895 // the surface to the space of the surface itself. |
1480 int destination_id = effect_node->data.transform_id; | 896 int destination_id = effect_node->transform_id; |
1481 int source_id; | 897 int source_id; |
1482 if (effect_node->parent_id != -1) { | 898 if (effect_node->parent_id != -1) { |
1483 // For non-root surfaces, transform only by sub-layer scale. | 899 // For non-root surfaces, transform only by sub-layer scale. |
1484 source_id = destination_id; | 900 source_id = destination_id; |
1485 } else { | 901 } else { |
1486 // The root surface doesn't have the notion of sub-layer scale, but | 902 // The root surface doesn't have the notion of sub-layer scale, but |
1487 // instead has a similar notion of transforming from the space of the root | 903 // instead has a similar notion of transforming from the space of the root |
1488 // layer to the space of the screen. | 904 // layer to the space of the screen. |
1489 DCHECK_EQ(0, destination_id); | 905 DCHECK_EQ(0, destination_id); |
1490 source_id = 1; | 906 source_id = 1; |
1491 } | 907 } |
1492 gfx::Transform transform; | 908 gfx::Transform transform; |
1493 property_trees() | 909 property_trees() |
1494 ->transform_tree.ComputeTransformWithDestinationSublayerScale( | 910 ->transform_tree.ComputeTransformWithDestinationSublayerScale( |
1495 source_id, destination_id, &transform); | 911 source_id, destination_id, &transform); |
1496 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area())); | 912 it->set_area(MathUtil::MapEnclosingClippedRect(transform, it->area())); |
1497 } | 913 } |
1498 } | 914 } |
1499 | 915 |
1500 bool EffectTree::HasCopyRequests() const { | 916 bool EffectTree::HasCopyRequests() const { |
1501 return !copy_requests_.empty(); | 917 return !copy_requests_.empty(); |
1502 } | 918 } |
1503 | 919 |
1504 void EffectTree::ClearCopyRequests() { | 920 void EffectTree::ClearCopyRequests() { |
1505 for (auto& node : nodes()) { | 921 for (auto& node : nodes()) { |
1506 node.data.num_copy_requests_in_subtree = 0; | 922 node.num_copy_requests_in_subtree = 0; |
1507 node.data.has_copy_request = false; | 923 node.has_copy_request = false; |
1508 } | 924 } |
1509 | 925 |
1510 // Any copy requests that are still left will be aborted (sending an empty | 926 // Any copy requests that are still left will be aborted (sending an empty |
1511 // result) on destruction. | 927 // result) on destruction. |
1512 copy_requests_.clear(); | 928 copy_requests_.clear(); |
1513 set_needs_update(true); | 929 set_needs_update(true); |
1514 } | 930 } |
1515 | 931 |
1516 int EffectTree::ClosestAncestorWithCopyRequest(int id) const { | 932 int EffectTree::ClosestAncestorWithCopyRequest(int id) const { |
1517 DCHECK_GE(id, 0); | 933 DCHECK_GE(id, 0); |
1518 const EffectNode* node = Node(id); | 934 const EffectNode* node = Node(id); |
1519 while (node->id > 1) { | 935 while (node->id > 1) { |
1520 if (node->data.has_copy_request) | 936 if (node->has_copy_request) |
1521 return node->id; | 937 return node->id; |
1522 | 938 |
1523 node = parent(node); | 939 node = parent(node); |
1524 } | 940 } |
1525 | 941 |
1526 if (node->data.has_copy_request) | 942 if (node->has_copy_request) |
1527 return node->id; | 943 return node->id; |
1528 else | 944 else |
1529 return -1; | 945 return -1; |
1530 } | 946 } |
1531 | 947 |
1532 void EffectTree::AddMaskOrReplicaLayerId(int id) { | 948 void EffectTree::AddMaskOrReplicaLayerId(int id) { |
1533 mask_replica_layer_ids_.push_back(id); | 949 mask_replica_layer_ids_.push_back(id); |
1534 } | 950 } |
1535 | 951 |
1536 bool EffectTree::ContributesToDrawnSurface(int id) { | 952 bool EffectTree::ContributesToDrawnSurface(int id) { |
1537 // All drawn nodes contribute to drawn surface. | 953 // All drawn nodes contribute to drawn surface. |
1538 // Exception : Nodes that are hidden and are drawn only for the sake of | 954 // Exception : Nodes that are hidden and are drawn only for the sake of |
1539 // copy requests. | 955 // copy requests. |
1540 EffectNode* node = Node(id); | 956 EffectNode* node = Node(id); |
1541 EffectNode* parent_node = parent(node); | 957 EffectNode* parent_node = parent(node); |
1542 return node->data.is_drawn && (!parent_node || parent_node->data.is_drawn); | 958 return node->is_drawn && (!parent_node || parent_node->is_drawn); |
1543 } | 959 } |
1544 | 960 |
1545 void EffectTree::ResetChangeTracking() { | 961 void EffectTree::ResetChangeTracking() { |
1546 for (int id = 1; id < static_cast<int>(size()); ++id) { | 962 for (int id = 1; id < static_cast<int>(size()); ++id) { |
1547 EffectNode* node = Node(id); | 963 EffectNode* node = Node(id); |
1548 node->data.effect_changed = false; | 964 node->effect_changed = false; |
1549 } | 965 } |
1550 } | 966 } |
1551 | 967 |
1552 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( | 968 void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations( |
1553 TransformNode* node, | 969 TransformNode* node, |
1554 TransformNode* parent_node) { | 970 TransformNode* parent_node) { |
1555 node->data.node_and_ancestors_have_only_integer_translation = | 971 node->node_and_ancestors_have_only_integer_translation = |
1556 node->data.to_parent.IsIdentityOrIntegerTranslation(); | 972 node->to_parent.IsIdentityOrIntegerTranslation(); |
1557 if (parent_node) | 973 if (parent_node) |
1558 node->data.node_and_ancestors_have_only_integer_translation = | 974 node->node_and_ancestors_have_only_integer_translation = |
1559 node->data.node_and_ancestors_have_only_integer_translation && | 975 node->node_and_ancestors_have_only_integer_translation && |
1560 parent_node->data.node_and_ancestors_have_only_integer_translation; | 976 parent_node->node_and_ancestors_have_only_integer_translation; |
1561 } | 977 } |
1562 | 978 |
1563 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { | 979 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) { |
1564 if (size() < 2) | 980 if (size() < 2) |
1565 return; | 981 return; |
1566 ClipNode* node = Node(1); | 982 ClipNode* node = Node(1); |
1567 if (viewport_rect == node->data.clip) | 983 if (viewport_rect == node->clip) |
1568 return; | 984 return; |
1569 node->data.clip = viewport_rect; | 985 node->clip = viewport_rect; |
1570 set_needs_update(true); | 986 set_needs_update(true); |
1571 } | 987 } |
1572 | 988 |
1573 gfx::RectF ClipTree::ViewportClip() { | 989 gfx::RectF ClipTree::ViewportClip() { |
1574 const unsigned long min_size = 1; | 990 const unsigned long min_size = 1; |
1575 DCHECK_GT(size(), min_size); | 991 DCHECK_GT(size(), min_size); |
1576 return Node(1)->data.clip; | 992 return Node(1)->clip; |
1577 } | 993 } |
1578 | 994 |
1579 bool ClipTree::operator==(const ClipTree& other) const { | 995 bool ClipTree::operator==(const ClipTree& other) const { |
1580 return PropertyTree::operator==(other); | 996 return PropertyTree::operator==(other); |
1581 } | 997 } |
1582 | 998 |
1583 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { | 999 void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { |
1584 DCHECK(!proto->has_property_type()); | 1000 DCHECK(!proto->has_property_type()); |
1585 proto->set_property_type(proto::PropertyTree::Clip); | 1001 proto->set_property_type(proto::PropertyTree::Clip); |
1586 | 1002 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1723 PropertyTree<ScrollNode>::clear(); | 1139 PropertyTree<ScrollNode>::clear(); |
1724 | 1140 |
1725 if (property_trees()->is_main_thread) { | 1141 if (property_trees()->is_main_thread) { |
1726 currently_scrolling_node_id_ = -1; | 1142 currently_scrolling_node_id_ = -1; |
1727 layer_id_to_scroll_offset_map_.clear(); | 1143 layer_id_to_scroll_offset_map_.clear(); |
1728 } | 1144 } |
1729 } | 1145 } |
1730 | 1146 |
1731 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { | 1147 gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const { |
1732 const ScrollNode* scroll_node = Node(scroll_node_id); | 1148 const ScrollNode* scroll_node = Node(scroll_node_id); |
1733 gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(), | 1149 gfx::SizeF scroll_bounds = |
1734 scroll_node->data.bounds.height()); | 1150 gfx::SizeF(scroll_node->bounds.width(), scroll_node->bounds.height()); |
1735 | 1151 |
1736 if (scroll_node->data.is_inner_viewport_scroll_layer) { | 1152 if (scroll_node->is_inner_viewport_scroll_layer) { |
1737 scroll_bounds.Enlarge( | 1153 scroll_bounds.Enlarge( |
1738 property_trees()->inner_viewport_scroll_bounds_delta().x(), | 1154 property_trees()->inner_viewport_scroll_bounds_delta().x(), |
1739 property_trees()->inner_viewport_scroll_bounds_delta().y()); | 1155 property_trees()->inner_viewport_scroll_bounds_delta().y()); |
1740 } | 1156 } |
1741 | 1157 |
1742 if (!scroll_node->data.scrollable || scroll_bounds.IsEmpty()) | 1158 if (!scroll_node->scrollable || scroll_bounds.IsEmpty()) |
1743 return gfx::ScrollOffset(); | 1159 return gfx::ScrollOffset(); |
1744 | 1160 |
1745 TransformTree& transform_tree = property_trees()->transform_tree; | 1161 TransformTree& transform_tree = property_trees()->transform_tree; |
1746 float scale_factor = 1.f; | 1162 float scale_factor = 1.f; |
1747 if (scroll_node->data.max_scroll_offset_affected_by_page_scale) | 1163 if (scroll_node->max_scroll_offset_affected_by_page_scale) |
1748 scale_factor = transform_tree.page_scale_factor(); | 1164 scale_factor = transform_tree.page_scale_factor(); |
1749 | 1165 |
1750 gfx::SizeF scaled_scroll_bounds = gfx::ScaleSize(scroll_bounds, scale_factor); | 1166 gfx::SizeF scaled_scroll_bounds = gfx::ScaleSize(scroll_bounds, scale_factor); |
1751 scaled_scroll_bounds.SetSize(std::floor(scaled_scroll_bounds.width()), | 1167 scaled_scroll_bounds.SetSize(std::floor(scaled_scroll_bounds.width()), |
1752 std::floor(scaled_scroll_bounds.height())); | 1168 std::floor(scaled_scroll_bounds.height())); |
1753 | 1169 |
1754 gfx::Size clip_layer_bounds = scroll_clip_layer_bounds(scroll_node->id); | 1170 gfx::Size clip_layer_bounds = scroll_clip_layer_bounds(scroll_node->id); |
1755 | 1171 |
1756 gfx::ScrollOffset max_offset( | 1172 gfx::ScrollOffset max_offset( |
1757 scaled_scroll_bounds.width() - clip_layer_bounds.width(), | 1173 scaled_scroll_bounds.width() - clip_layer_bounds.width(), |
1758 scaled_scroll_bounds.height() - clip_layer_bounds.height()); | 1174 scaled_scroll_bounds.height() - clip_layer_bounds.height()); |
1759 | 1175 |
1760 max_offset.Scale(1 / scale_factor); | 1176 max_offset.Scale(1 / scale_factor); |
1761 max_offset.SetToMax(gfx::ScrollOffset()); | 1177 max_offset.SetToMax(gfx::ScrollOffset()); |
1762 return max_offset; | 1178 return max_offset; |
1763 } | 1179 } |
1764 | 1180 |
1765 gfx::Size ScrollTree::scroll_clip_layer_bounds(int scroll_node_id) const { | 1181 gfx::Size ScrollTree::scroll_clip_layer_bounds(int scroll_node_id) const { |
1766 const ScrollNode* scroll_node = Node(scroll_node_id); | 1182 const ScrollNode* scroll_node = Node(scroll_node_id); |
1767 gfx::Size scroll_clip_layer_bounds = | 1183 gfx::Size scroll_clip_layer_bounds = scroll_node->scroll_clip_layer_bounds; |
1768 scroll_node->data.scroll_clip_layer_bounds; | |
1769 | 1184 |
1770 gfx::Vector2dF scroll_clip_layer_bounds_delta; | 1185 gfx::Vector2dF scroll_clip_layer_bounds_delta; |
1771 if (scroll_node->data.is_inner_viewport_scroll_layer) { | 1186 if (scroll_node->is_inner_viewport_scroll_layer) { |
1772 scroll_clip_layer_bounds_delta.Add( | 1187 scroll_clip_layer_bounds_delta.Add( |
1773 property_trees()->inner_viewport_container_bounds_delta()); | 1188 property_trees()->inner_viewport_container_bounds_delta()); |
1774 } else if (scroll_node->data.is_outer_viewport_scroll_layer) { | 1189 } else if (scroll_node->is_outer_viewport_scroll_layer) { |
1775 scroll_clip_layer_bounds_delta.Add( | 1190 scroll_clip_layer_bounds_delta.Add( |
1776 property_trees()->outer_viewport_container_bounds_delta()); | 1191 property_trees()->outer_viewport_container_bounds_delta()); |
1777 } | 1192 } |
1778 | 1193 |
1779 gfx::Vector2d delta = gfx::ToCeiledVector2d(scroll_clip_layer_bounds_delta); | 1194 gfx::Vector2d delta = gfx::ToCeiledVector2d(scroll_clip_layer_bounds_delta); |
1780 scroll_clip_layer_bounds.SetSize( | 1195 scroll_clip_layer_bounds.SetSize( |
1781 scroll_clip_layer_bounds.width() + delta.x(), | 1196 scroll_clip_layer_bounds.width() + delta.x(), |
1782 scroll_clip_layer_bounds.height() + delta.y()); | 1197 scroll_clip_layer_bounds.height() + delta.y()); |
1783 | 1198 |
1784 return scroll_clip_layer_bounds; | 1199 return scroll_clip_layer_bounds; |
(...skipping 10 matching lines...) Expand all Loading... |
1795 } | 1210 } |
1796 | 1211 |
1797 void ScrollTree::set_currently_scrolling_node(int scroll_node_id) { | 1212 void ScrollTree::set_currently_scrolling_node(int scroll_node_id) { |
1798 currently_scrolling_node_id_ = scroll_node_id; | 1213 currently_scrolling_node_id_ = scroll_node_id; |
1799 } | 1214 } |
1800 | 1215 |
1801 gfx::Transform ScrollTree::ScreenSpaceTransform(int scroll_node_id) const { | 1216 gfx::Transform ScrollTree::ScreenSpaceTransform(int scroll_node_id) const { |
1802 const ScrollNode* scroll_node = Node(scroll_node_id); | 1217 const ScrollNode* scroll_node = Node(scroll_node_id); |
1803 const TransformTree& transform_tree = property_trees()->transform_tree; | 1218 const TransformTree& transform_tree = property_trees()->transform_tree; |
1804 const TransformNode* transform_node = | 1219 const TransformNode* transform_node = |
1805 transform_tree.Node(scroll_node->data.transform_id); | 1220 transform_tree.Node(scroll_node->transform_id); |
1806 gfx::Transform screen_space_transform( | 1221 gfx::Transform screen_space_transform( |
1807 1, 0, 0, 1, scroll_node->data.offset_to_transform_parent.x(), | 1222 1, 0, 0, 1, scroll_node->offset_to_transform_parent.x(), |
1808 scroll_node->data.offset_to_transform_parent.y()); | 1223 scroll_node->offset_to_transform_parent.y()); |
1809 screen_space_transform.ConcatTransform( | 1224 screen_space_transform.ConcatTransform( |
1810 transform_tree.ToScreen(transform_node->id)); | 1225 transform_tree.ToScreen(transform_node->id)); |
1811 if (scroll_node->data.should_flatten) | 1226 if (scroll_node->should_flatten) |
1812 screen_space_transform.FlattenTo2d(); | 1227 screen_space_transform.FlattenTo2d(); |
1813 return screen_space_transform; | 1228 return screen_space_transform; |
1814 } | 1229 } |
1815 | 1230 |
1816 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { | 1231 SyncedScrollOffset* ScrollTree::synced_scroll_offset(int layer_id) { |
1817 if (layer_id_to_scroll_offset_map_.find(layer_id) == | 1232 if (layer_id_to_scroll_offset_map_.find(layer_id) == |
1818 layer_id_to_scroll_offset_map_.end()) { | 1233 layer_id_to_scroll_offset_map_.end()) { |
1819 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset; | 1234 layer_id_to_scroll_offset_map_[layer_id] = new SyncedScrollOffset; |
1820 } | 1235 } |
1821 return layer_id_to_scroll_offset_map_[layer_id].get(); | 1236 return layer_id_to_scroll_offset_map_[layer_id].get(); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2009 return; | 1424 return; |
2010 } | 1425 } |
2011 | 1426 |
2012 scroll_state->layer_tree_impl()->ApplyScroll(scroll_node, scroll_state); | 1427 scroll_state->layer_tree_impl()->ApplyScroll(scroll_node, scroll_state); |
2013 } | 1428 } |
2014 | 1429 |
2015 gfx::Vector2dF ScrollTree::ScrollBy(ScrollNode* scroll_node, | 1430 gfx::Vector2dF ScrollTree::ScrollBy(ScrollNode* scroll_node, |
2016 const gfx::Vector2dF& scroll, | 1431 const gfx::Vector2dF& scroll, |
2017 LayerTreeImpl* layer_tree_impl) { | 1432 LayerTreeImpl* layer_tree_impl) { |
2018 gfx::ScrollOffset adjusted_scroll(scroll); | 1433 gfx::ScrollOffset adjusted_scroll(scroll); |
2019 if (!scroll_node->data.user_scrollable_horizontal) | 1434 if (!scroll_node->user_scrollable_horizontal) |
2020 adjusted_scroll.set_x(0); | 1435 adjusted_scroll.set_x(0); |
2021 if (!scroll_node->data.user_scrollable_vertical) | 1436 if (!scroll_node->user_scrollable_vertical) |
2022 adjusted_scroll.set_y(0); | 1437 adjusted_scroll.set_y(0); |
2023 DCHECK(scroll_node->data.scrollable); | 1438 DCHECK(scroll_node->scrollable); |
2024 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); | 1439 gfx::ScrollOffset old_offset = current_scroll_offset(scroll_node->owner_id); |
2025 gfx::ScrollOffset new_offset = | 1440 gfx::ScrollOffset new_offset = |
2026 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); | 1441 ClampScrollOffsetToLimits(old_offset + adjusted_scroll, scroll_node); |
2027 if (SetScrollOffset(scroll_node->owner_id, new_offset)) | 1442 if (SetScrollOffset(scroll_node->owner_id, new_offset)) |
2028 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, | 1443 layer_tree_impl->DidUpdateScrollOffset(scroll_node->owner_id, |
2029 scroll_node->data.transform_id); | 1444 scroll_node->transform_id); |
2030 | 1445 |
2031 gfx::ScrollOffset unscrolled = | 1446 gfx::ScrollOffset unscrolled = |
2032 old_offset + gfx::ScrollOffset(scroll) - new_offset; | 1447 old_offset + gfx::ScrollOffset(scroll) - new_offset; |
2033 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); | 1448 return gfx::Vector2dF(unscrolled.x(), unscrolled.y()); |
2034 } | 1449 } |
2035 | 1450 |
2036 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( | 1451 gfx::ScrollOffset ScrollTree::ClampScrollOffsetToLimits( |
2037 gfx::ScrollOffset offset, | 1452 gfx::ScrollOffset offset, |
2038 ScrollNode* scroll_node) const { | 1453 ScrollNode* scroll_node) const { |
2039 offset.SetToMin(MaxScrollOffset(scroll_node->id)); | 1454 offset.SetToMin(MaxScrollOffset(scroll_node->id)); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2184 } | 1599 } |
2185 | 1600 |
2186 void PropertyTrees::PushOpacityIfNeeded(PropertyTrees* target_tree) { | 1601 void PropertyTrees::PushOpacityIfNeeded(PropertyTrees* target_tree) { |
2187 for (int id : target_tree->always_use_active_tree_opacity_effect_ids) { | 1602 for (int id : target_tree->always_use_active_tree_opacity_effect_ids) { |
2188 if (effect_id_to_index_map.find(id) == effect_id_to_index_map.end()) | 1603 if (effect_id_to_index_map.find(id) == effect_id_to_index_map.end()) |
2189 continue; | 1604 continue; |
2190 EffectNode* source_effect_node = | 1605 EffectNode* source_effect_node = |
2191 effect_tree.Node(effect_id_to_index_map[id]); | 1606 effect_tree.Node(effect_id_to_index_map[id]); |
2192 EffectNode* target_effect_node = | 1607 EffectNode* target_effect_node = |
2193 target_tree->effect_tree.Node(target_tree->effect_id_to_index_map[id]); | 1608 target_tree->effect_tree.Node(target_tree->effect_id_to_index_map[id]); |
2194 float source_opacity = source_effect_node->data.opacity; | 1609 float source_opacity = source_effect_node->opacity; |
2195 float target_opacity = target_effect_node->data.opacity; | 1610 float target_opacity = target_effect_node->opacity; |
2196 if (source_opacity == target_opacity) | 1611 if (source_opacity == target_opacity) |
2197 continue; | 1612 continue; |
2198 target_effect_node->data.opacity = source_opacity; | 1613 target_effect_node->opacity = source_opacity; |
2199 target_tree->effect_tree.set_needs_update(true); | 1614 target_tree->effect_tree.set_needs_update(true); |
2200 } | 1615 } |
2201 } | 1616 } |
2202 | 1617 |
2203 void PropertyTrees::RemoveIdFromIdToIndexMaps(int id) { | 1618 void PropertyTrees::RemoveIdFromIdToIndexMaps(int id) { |
2204 transform_id_to_index_map.erase(id); | 1619 transform_id_to_index_map.erase(id); |
2205 effect_id_to_index_map.erase(id); | 1620 effect_id_to_index_map.erase(id); |
2206 clip_id_to_index_map.erase(id); | 1621 clip_id_to_index_map.erase(id); |
2207 scroll_id_to_index_map.erase(id); | 1622 scroll_id_to_index_map.erase(id); |
2208 } | 1623 } |
(...skipping 19 matching lines...) Expand all Loading... |
2228 | 1643 |
2229 void PropertyTrees::UpdateChangeTracking() { | 1644 void PropertyTrees::UpdateChangeTracking() { |
2230 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 1645 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { |
2231 EffectNode* node = effect_tree.Node(id); | 1646 EffectNode* node = effect_tree.Node(id); |
2232 EffectNode* parent_node = effect_tree.parent(node); | 1647 EffectNode* parent_node = effect_tree.parent(node); |
2233 effect_tree.UpdateEffectChanged(node, parent_node); | 1648 effect_tree.UpdateEffectChanged(node, parent_node); |
2234 } | 1649 } |
2235 for (int i = 1; i < static_cast<int>(transform_tree.size()); ++i) { | 1650 for (int i = 1; i < static_cast<int>(transform_tree.size()); ++i) { |
2236 TransformNode* node = transform_tree.Node(i); | 1651 TransformNode* node = transform_tree.Node(i); |
2237 TransformNode* parent_node = transform_tree.parent(node); | 1652 TransformNode* parent_node = transform_tree.parent(node); |
2238 TransformNode* source_node = transform_tree.Node(node->data.source_node_id); | 1653 TransformNode* source_node = transform_tree.Node(node->source_node_id); |
2239 transform_tree.UpdateTransformChanged(node, parent_node, source_node); | 1654 transform_tree.UpdateTransformChanged(node, parent_node, source_node); |
2240 } | 1655 } |
2241 } | 1656 } |
2242 | 1657 |
2243 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { | 1658 void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) { |
2244 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { | 1659 for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) { |
2245 EffectNode* node = effect_tree.Node(id); | 1660 EffectNode* node = effect_tree.Node(id); |
2246 if (node->data.effect_changed) { | 1661 if (node->effect_changed) { |
2247 EffectNode* target_node = tree->effect_tree.Node(node->id); | 1662 EffectNode* target_node = tree->effect_tree.Node(node->id); |
2248 target_node->data.effect_changed = true; | 1663 target_node->effect_changed = true; |
2249 } | 1664 } |
2250 } | 1665 } |
2251 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { | 1666 for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) { |
2252 TransformNode* node = transform_tree.Node(id); | 1667 TransformNode* node = transform_tree.Node(id); |
2253 if (node->data.transform_changed) { | 1668 if (node->transform_changed) { |
2254 TransformNode* target_node = tree->transform_tree.Node(node->id); | 1669 TransformNode* target_node = tree->transform_tree.Node(node->id); |
2255 target_node->data.transform_changed = true; | 1670 target_node->transform_changed = true; |
2256 } | 1671 } |
2257 } | 1672 } |
2258 // Ensure that change tracking is updated even if property trees don't have | 1673 // Ensure that change tracking is updated even if property trees don't have |
2259 // other reasons to get updated. | 1674 // other reasons to get updated. |
2260 tree->UpdateChangeTracking(); | 1675 tree->UpdateChangeTracking(); |
2261 tree->full_tree_damaged = full_tree_damaged; | 1676 tree->full_tree_damaged = full_tree_damaged; |
2262 } | 1677 } |
2263 | 1678 |
2264 void PropertyTrees::ResetAllChangeTracking() { | 1679 void PropertyTrees::ResetAllChangeTracking() { |
2265 transform_tree.ResetChangeTracking(); | 1680 transform_tree.ResetChangeTracking(); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2325 combined_animation_scale.maximum_animation_scale; | 1740 combined_animation_scale.maximum_animation_scale; |
2326 ancestor_starting_animation_scale = | 1741 ancestor_starting_animation_scale = |
2327 combined_animation_scale.starting_animation_scale; | 1742 combined_animation_scale.starting_animation_scale; |
2328 ancestor_is_animating_scale = | 1743 ancestor_is_animating_scale = |
2329 cached_data_.animation_scales[parent_node->id] | 1744 cached_data_.animation_scales[parent_node->id] |
2330 .to_screen_has_scale_animation; | 1745 .to_screen_has_scale_animation; |
2331 } | 1746 } |
2332 | 1747 |
2333 cached_data_.animation_scales[transform_node_id] | 1748 cached_data_.animation_scales[transform_node_id] |
2334 .to_screen_has_scale_animation = | 1749 .to_screen_has_scale_animation = |
2335 !node->data.has_only_translation_animations || | 1750 !node->has_only_translation_animations || ancestor_is_animating_scale; |
2336 ancestor_is_animating_scale; | |
2337 | 1751 |
2338 // Once we've failed to compute a maximum animated scale at an ancestor, we | 1752 // Once we've failed to compute a maximum animated scale at an ancestor, we |
2339 // continue to fail. | 1753 // continue to fail. |
2340 bool failed_at_ancestor = | 1754 bool failed_at_ancestor = |
2341 ancestor_is_animating_scale && ancestor_maximum_target_scale == 0.f; | 1755 ancestor_is_animating_scale && ancestor_maximum_target_scale == 0.f; |
2342 | 1756 |
2343 // Computing maximum animated scale in the presence of non-scale/translation | 1757 // Computing maximum animated scale in the presence of non-scale/translation |
2344 // transforms isn't supported. | 1758 // transforms isn't supported. |
2345 bool failed_for_non_scale_or_translation = | 1759 bool failed_for_non_scale_or_translation = |
2346 !transform_tree.ToTarget(transform_node_id).IsScaleOrTranslation(); | 1760 !transform_tree.ToTarget(transform_node_id).IsScaleOrTranslation(); |
2347 | 1761 |
2348 // We don't attempt to accumulate animation scale from multiple nodes with | 1762 // We don't attempt to accumulate animation scale from multiple nodes with |
2349 // scale animations, because of the risk of significant overestimation. For | 1763 // scale animations, because of the risk of significant overestimation. For |
2350 // example, one node might be increasing scale from 1 to 10 at the same time | 1764 // example, one node might be increasing scale from 1 to 10 at the same time |
2351 // as another node is decreasing scale from 10 to 1. Naively combining these | 1765 // as another node is decreasing scale from 10 to 1. Naively combining these |
2352 // scales would produce a scale of 100. | 1766 // scales would produce a scale of 100. |
2353 bool failed_for_multiple_scale_animations = | 1767 bool failed_for_multiple_scale_animations = |
2354 ancestor_is_animating_scale && | 1768 ancestor_is_animating_scale && !node->has_only_translation_animations; |
2355 !node->data.has_only_translation_animations; | |
2356 | 1769 |
2357 if (failed_at_ancestor || failed_for_non_scale_or_translation || | 1770 if (failed_at_ancestor || failed_for_non_scale_or_translation || |
2358 failed_for_multiple_scale_animations) { | 1771 failed_for_multiple_scale_animations) { |
2359 // This ensures that descendants know we've failed to compute a maximum | 1772 // This ensures that descendants know we've failed to compute a maximum |
2360 // animated scale. | 1773 // animated scale. |
2361 cached_data_.animation_scales[transform_node_id] | 1774 cached_data_.animation_scales[transform_node_id] |
2362 .to_screen_has_scale_animation = true; | 1775 .to_screen_has_scale_animation = true; |
2363 | 1776 |
2364 cached_data_.animation_scales[transform_node_id] | 1777 cached_data_.animation_scales[transform_node_id] |
2365 .combined_maximum_animation_target_scale = 0.f; | 1778 .combined_maximum_animation_target_scale = 0.f; |
2366 cached_data_.animation_scales[transform_node_id] | 1779 cached_data_.animation_scales[transform_node_id] |
2367 .combined_starting_animation_scale = 0.f; | 1780 .combined_starting_animation_scale = 0.f; |
2368 } else if (!cached_data_.animation_scales[transform_node_id] | 1781 } else if (!cached_data_.animation_scales[transform_node_id] |
2369 .to_screen_has_scale_animation) { | 1782 .to_screen_has_scale_animation) { |
2370 cached_data_.animation_scales[transform_node_id] | 1783 cached_data_.animation_scales[transform_node_id] |
2371 .combined_maximum_animation_target_scale = 0.f; | 1784 .combined_maximum_animation_target_scale = 0.f; |
2372 cached_data_.animation_scales[transform_node_id] | 1785 cached_data_.animation_scales[transform_node_id] |
2373 .combined_starting_animation_scale = 0.f; | 1786 .combined_starting_animation_scale = 0.f; |
2374 } else if (node->data.has_only_translation_animations) { | 1787 } else if (node->has_only_translation_animations) { |
2375 // An ancestor is animating scale. | 1788 // An ancestor is animating scale. |
2376 gfx::Vector2dF local_scales = | 1789 gfx::Vector2dF local_scales = |
2377 MathUtil::ComputeTransform2dScaleComponents(node->data.local, 0.f); | 1790 MathUtil::ComputeTransform2dScaleComponents(node->local, 0.f); |
2378 float max_local_scale = std::max(local_scales.x(), local_scales.y()); | 1791 float max_local_scale = std::max(local_scales.x(), local_scales.y()); |
2379 cached_data_.animation_scales[transform_node_id] | 1792 cached_data_.animation_scales[transform_node_id] |
2380 .combined_maximum_animation_target_scale = | 1793 .combined_maximum_animation_target_scale = |
2381 max_local_scale * ancestor_maximum_target_scale; | 1794 max_local_scale * ancestor_maximum_target_scale; |
2382 cached_data_.animation_scales[transform_node_id] | 1795 cached_data_.animation_scales[transform_node_id] |
2383 .combined_starting_animation_scale = | 1796 .combined_starting_animation_scale = |
2384 max_local_scale * ancestor_starting_animation_scale; | 1797 max_local_scale * ancestor_starting_animation_scale; |
2385 } else { | 1798 } else { |
2386 // TODO(sunxd): make LayerTreeImpl::MaximumTargetScale take layer id as | 1799 // TODO(sunxd): make LayerTreeImpl::MaximumTargetScale take layer id as |
2387 // parameter. | 1800 // parameter. |
2388 LayerImpl* layer_impl = layer_tree_impl->LayerById(node->owner_id); | 1801 LayerImpl* layer_impl = layer_tree_impl->LayerById(node->owner_id); |
2389 layer_tree_impl->MaximumTargetScale( | 1802 layer_tree_impl->MaximumTargetScale( |
2390 layer_impl, &cached_data_.animation_scales[transform_node_id] | 1803 layer_impl, &cached_data_.animation_scales[transform_node_id] |
2391 .local_maximum_animation_target_scale); | 1804 .local_maximum_animation_target_scale); |
2392 layer_tree_impl->AnimationStartScale( | 1805 layer_tree_impl->AnimationStartScale( |
2393 layer_impl, &cached_data_.animation_scales[transform_node_id] | 1806 layer_impl, &cached_data_.animation_scales[transform_node_id] |
2394 .local_starting_animation_scale); | 1807 .local_starting_animation_scale); |
2395 gfx::Vector2dF local_scales = | 1808 gfx::Vector2dF local_scales = |
2396 MathUtil::ComputeTransform2dScaleComponents(node->data.local, 0.f); | 1809 MathUtil::ComputeTransform2dScaleComponents(node->local, 0.f); |
2397 float max_local_scale = std::max(local_scales.x(), local_scales.y()); | 1810 float max_local_scale = std::max(local_scales.x(), local_scales.y()); |
2398 | 1811 |
2399 if (cached_data_.animation_scales[transform_node_id] | 1812 if (cached_data_.animation_scales[transform_node_id] |
2400 .local_starting_animation_scale == 0.f || | 1813 .local_starting_animation_scale == 0.f || |
2401 cached_data_.animation_scales[transform_node_id] | 1814 cached_data_.animation_scales[transform_node_id] |
2402 .local_maximum_animation_target_scale == 0.f) { | 1815 .local_maximum_animation_target_scale == 0.f) { |
2403 cached_data_.animation_scales[transform_node_id] | 1816 cached_data_.animation_scales[transform_node_id] |
2404 .combined_maximum_animation_target_scale = | 1817 .combined_maximum_animation_target_scale = |
2405 max_local_scale * ancestor_maximum_target_scale; | 1818 max_local_scale * ancestor_maximum_target_scale; |
2406 cached_data_.animation_scales[transform_node_id] | 1819 cached_data_.animation_scales[transform_node_id] |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2450 cached_data_.property_tree_update_number = 0; | 1863 cached_data_.property_tree_update_number = 0; |
2451 cached_data_.animation_scales = std::vector<AnimationScaleData>( | 1864 cached_data_.animation_scales = std::vector<AnimationScaleData>( |
2452 transform_tree.nodes().size(), AnimationScaleData()); | 1865 transform_tree.nodes().size(), AnimationScaleData()); |
2453 } | 1866 } |
2454 | 1867 |
2455 void PropertyTrees::UpdateCachedNumber() { | 1868 void PropertyTrees::UpdateCachedNumber() { |
2456 cached_data_.property_tree_update_number++; | 1869 cached_data_.property_tree_update_number++; |
2457 } | 1870 } |
2458 | 1871 |
2459 } // namespace cc | 1872 } // namespace cc |
OLD | NEW |