| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
| 13 #include "cc/base/math_util.h" | |
| 14 #include "cc/input/main_thread_scrolling_reason.h" | |
| 15 #include "cc/input/scroll_state.h" | |
| 16 #include "cc/layers/layer_impl.h" | 13 #include "cc/layers/layer_impl.h" |
| 17 #include "cc/output/copy_output_request.h" | 14 #include "cc/output/copy_output_request.h" |
| 18 #include "cc/proto/gfx_conversions.h" | |
| 19 #include "cc/proto/property_tree.pb.h" | 15 #include "cc/proto/property_tree.pb.h" |
| 20 #include "cc/proto/scroll_offset.pb.h" | |
| 21 #include "cc/proto/synced_property_conversions.h" | 16 #include "cc/proto/synced_property_conversions.h" |
| 22 #include "cc/proto/transform.pb.h" | 17 #include "cc/trees/clip_node.h" |
| 23 #include "cc/proto/vector2df.pb.h" | 18 #include "cc/trees/effect_node.h" |
| 24 #include "cc/trees/layer_tree_host_common.h" | 19 #include "cc/trees/layer_tree_host_common.h" |
| 25 #include "cc/trees/layer_tree_impl.h" | 20 #include "cc/trees/layer_tree_impl.h" |
| 26 #include "cc/trees/property_tree.h" | 21 #include "cc/trees/property_tree.h" |
| 22 #include "cc/trees/scroll_node.h" |
| 23 #include "cc/trees/transform_node.h" |
| 27 #include "ui/gfx/geometry/vector2d_conversions.h" | 24 #include "ui/gfx/geometry/vector2d_conversions.h" |
| 28 | 25 |
| 29 namespace cc { | 26 namespace cc { |
| 30 | 27 |
| 31 template <typename T> | 28 template <typename T> |
| 32 bool TreeNode<T>::operator==(const TreeNode<T>& other) const { | |
| 33 return id == other.id && parent_id == other.parent_id && | |
| 34 owner_id == other.owner_id && data == other.data; | |
| 35 } | |
| 36 | |
| 37 template <typename T> | |
| 38 void TreeNode<T>::ToProtobuf(proto::TreeNode* proto) const { | |
| 39 proto->set_id(id); | |
| 40 proto->set_parent_id(parent_id); | |
| 41 proto->set_owner_id(owner_id); | |
| 42 data.ToProtobuf(proto); | |
| 43 } | |
| 44 | |
| 45 template <typename T> | |
| 46 void TreeNode<T>::FromProtobuf(const proto::TreeNode& proto) { | |
| 47 id = proto.id(); | |
| 48 parent_id = proto.parent_id(); | |
| 49 owner_id = proto.owner_id(); | |
| 50 data.FromProtobuf(proto); | |
| 51 } | |
| 52 | |
| 53 template <typename T> | |
| 54 void TreeNode<T>::AsValueInto(base::trace_event::TracedValue* value) const { | |
| 55 value->SetInteger("id", id); | |
| 56 value->SetInteger("parent_id", parent_id); | |
| 57 value->SetInteger("owner_id", owner_id); | |
| 58 data.AsValueInto(value); | |
| 59 } | |
| 60 | |
| 61 template struct TreeNode<TransformNodeData>; | |
| 62 template struct TreeNode<ClipNodeData>; | |
| 63 template struct TreeNode<EffectNodeData>; | |
| 64 template struct TreeNode<ScrollNodeData>; | |
| 65 | |
| 66 template <typename T> | |
| 67 PropertyTree<T>::PropertyTree() | 29 PropertyTree<T>::PropertyTree() |
| 68 : needs_update_(false) { | 30 : needs_update_(false) { |
| 69 nodes_.push_back(T()); | 31 nodes_.push_back(T()); |
| 70 back()->id = 0; | 32 back()->id = 0; |
| 71 back()->parent_id = -1; | 33 back()->parent_id = -1; |
| 72 } | 34 } |
| 73 | 35 |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |