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

Side by Side Diff: cc/trees/property_tree.cc

Issue 2118993002: Detemplatize cc property nodes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | ui/gfx/transform.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698