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

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

Powered by Google App Engine
This is Rietveld 408576698