| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree.h" | 5 #include "cc/trees/layer_tree.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 9 #include "cc/input/page_scale_animation.h" | 9 #include "cc/input/page_scale_animation.h" |
| 10 #include "cc/layers/heads_up_display_layer.h" | 10 #include "cc/layers/heads_up_display_layer.h" |
| 11 #include "cc/layers/heads_up_display_layer_impl.h" | 11 #include "cc/layers/heads_up_display_layer_impl.h" |
| 12 #include "cc/layers/layer.h" | 12 #include "cc/layers/layer.h" |
| 13 #include "cc/layers/layer_proto_converter.h" | |
| 14 #include "cc/proto/gfx_conversions.h" | 13 #include "cc/proto/gfx_conversions.h" |
| 15 #include "cc/proto/layer_tree.pb.h" | 14 #include "cc/proto/layer_tree.pb.h" |
| 16 #include "cc/trees/layer_tree_host.h" | 15 #include "cc/trees/layer_tree_host.h" |
| 17 #include "cc/trees/layer_tree_host_common.h" | 16 #include "cc/trees/layer_tree_host_common.h" |
| 18 #include "cc/trees/layer_tree_impl.h" | 17 #include "cc/trees/layer_tree_impl.h" |
| 19 #include "cc/trees/mutator_host.h" | 18 #include "cc/trees/mutator_host.h" |
| 20 #include "cc/trees/property_tree_builder.h" | 19 #include "cc/trees/property_tree_builder.h" |
| 21 | 20 |
| 22 namespace cc { | 21 namespace cc { |
| 23 | 22 |
| 24 namespace { | |
| 25 | |
| 26 Layer* UpdateAndGetLayer(Layer* current_layer, | |
| 27 int layer_id, | |
| 28 LayerTree* layer_tree) { | |
| 29 if (layer_id == Layer::INVALID_ID) { | |
| 30 if (current_layer) | |
| 31 current_layer->SetLayerTreeHost(nullptr); | |
| 32 | |
| 33 return nullptr; | |
| 34 } | |
| 35 Layer* layer = layer_tree->LayerById(layer_id); | |
| 36 DCHECK(layer); | |
| 37 if (current_layer && current_layer != layer) | |
| 38 current_layer->SetLayerTreeHost(nullptr); | |
| 39 | |
| 40 return layer; | |
| 41 } | |
| 42 | |
| 43 } // namespace | |
| 44 | |
| 45 LayerTree::Inputs::Inputs() | 23 LayerTree::Inputs::Inputs() |
| 46 : top_controls_height(0.f), | 24 : top_controls_height(0.f), |
| 47 top_controls_shown_ratio(0.f), | 25 top_controls_shown_ratio(0.f), |
| 48 browser_controls_shrink_blink_size(false), | 26 browser_controls_shrink_blink_size(false), |
| 49 bottom_controls_height(0.f), | 27 bottom_controls_height(0.f), |
| 50 device_scale_factor(1.f), | 28 device_scale_factor(1.f), |
| 51 painted_device_scale_factor(1.f), | 29 painted_device_scale_factor(1.f), |
| 52 page_scale_factor(1.f), | 30 page_scale_factor(1.f), |
| 53 min_page_scale_factor(1.f), | 31 min_page_scale_factor(1.f), |
| 54 max_page_scale_factor(1.f), | 32 max_page_scale_factor(1.f), |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 if (inputs_.pending_page_scale_animation) { | 400 if (inputs_.pending_page_scale_animation) { |
| 423 tree_impl->SetPendingPageScaleAnimation( | 401 tree_impl->SetPendingPageScaleAnimation( |
| 424 std::move(inputs_.pending_page_scale_animation)); | 402 std::move(inputs_.pending_page_scale_animation)); |
| 425 } | 403 } |
| 426 | 404 |
| 427 DCHECK(!tree_impl->ViewportSizeInvalid()); | 405 DCHECK(!tree_impl->ViewportSizeInvalid()); |
| 428 | 406 |
| 429 tree_impl->set_has_ever_been_drawn(false); | 407 tree_impl->set_has_ever_been_drawn(false); |
| 430 } | 408 } |
| 431 | 409 |
| 432 void LayerTree::ToProtobuf(proto::LayerTree* proto, bool inputs_only) { | 410 void LayerTree::ToProtobuf(proto::LayerTree* proto) { |
| 433 TRACE_EVENT0("cc.remote", "LayerProtoConverter::SerializeLayerHierarchy"); | 411 TRACE_EVENT0("cc.remote", "LayerProtoConverter::SerializeLayerHierarchy"); |
| 434 | 412 |
| 435 // LayerTree::Inputs Serialization ----------------------------------------- | |
| 436 | |
| 437 // TODO(khushalsagar): Why walk the tree twice? Why not serialize properties | 413 // TODO(khushalsagar): Why walk the tree twice? Why not serialize properties |
| 438 // for dirty layers as you serialize the hierarchy? | 414 // for dirty layers as you serialize the hierarchy? |
| 439 if (inputs_.root_layer) | 415 if (inputs_.root_layer) |
| 440 inputs_.root_layer->ToLayerNodeProto(proto->mutable_root_layer()); | 416 inputs_.root_layer->ToLayerNodeProto(proto->mutable_root_layer()); |
| 441 | 417 |
| 442 // Viewport layers. | 418 // Viewport layers. |
| 443 proto->set_overscroll_elasticity_layer_id( | 419 proto->set_overscroll_elasticity_layer_id( |
| 444 inputs_.overscroll_elasticity_layer | 420 inputs_.overscroll_elasticity_layer |
| 445 ? inputs_.overscroll_elasticity_layer->id() | 421 ? inputs_.overscroll_elasticity_layer->id() |
| 446 : Layer::INVALID_ID); | 422 : Layer::INVALID_ID); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 474 | 450 |
| 475 proto->set_have_scroll_event_handlers(inputs_.have_scroll_event_handlers); | 451 proto->set_have_scroll_event_handlers(inputs_.have_scroll_event_handlers); |
| 476 proto->set_wheel_event_listener_properties(static_cast<uint32_t>( | 452 proto->set_wheel_event_listener_properties(static_cast<uint32_t>( |
| 477 event_listener_properties(EventListenerClass::kMouseWheel))); | 453 event_listener_properties(EventListenerClass::kMouseWheel))); |
| 478 proto->set_touch_start_or_move_event_listener_properties( | 454 proto->set_touch_start_or_move_event_listener_properties( |
| 479 static_cast<uint32_t>( | 455 static_cast<uint32_t>( |
| 480 event_listener_properties(EventListenerClass::kTouchStartOrMove))); | 456 event_listener_properties(EventListenerClass::kTouchStartOrMove))); |
| 481 proto->set_touch_end_or_cancel_event_listener_properties( | 457 proto->set_touch_end_or_cancel_event_listener_properties( |
| 482 static_cast<uint32_t>( | 458 static_cast<uint32_t>( |
| 483 event_listener_properties(EventListenerClass::kTouchEndOrCancel))); | 459 event_listener_properties(EventListenerClass::kTouchEndOrCancel))); |
| 484 | |
| 485 if (inputs_only) | |
| 486 return; | |
| 487 // ---------------------------------------------------------------------- | |
| 488 | |
| 489 for (auto* layer : layers_that_should_push_properties_) { | |
| 490 proto->add_layers_that_should_push_properties(layer->id()); | |
| 491 } | |
| 492 proto->set_in_paint_layer_contents(in_paint_layer_contents()); | |
| 493 | |
| 494 proto->set_needs_full_tree_sync(needs_full_tree_sync_); | |
| 495 proto->set_needs_meta_info_recomputation(needs_meta_info_recomputation_); | |
| 496 proto->set_hud_layer_id(hud_layer_ ? hud_layer_->id() : Layer::INVALID_ID); | |
| 497 | |
| 498 property_trees_.ToProtobuf(proto->mutable_property_trees()); | |
| 499 Vector2dFToProto(elastic_overscroll_, proto->mutable_elastic_overscroll()); | |
| 500 } | |
| 501 | |
| 502 void LayerTree::FromProtobuf(const proto::LayerTree& proto) { | |
| 503 // Layer hierarchy. | |
| 504 scoped_refptr<Layer> new_root_layer; | |
| 505 if (proto.has_root_layer()) | |
| 506 new_root_layer = LayerProtoConverter::DeserializeLayerHierarchy( | |
| 507 inputs_.root_layer, proto.root_layer(), layer_tree_host_); | |
| 508 if (inputs_.root_layer != new_root_layer) { | |
| 509 inputs_.root_layer = new_root_layer; | |
| 510 } | |
| 511 | |
| 512 for (auto layer_id : proto.layers_that_should_push_properties()) { | |
| 513 AddLayerShouldPushProperties(layer_id_map_[layer_id]); | |
| 514 } | |
| 515 in_paint_layer_contents_ = proto.in_paint_layer_contents(); | |
| 516 | |
| 517 needs_full_tree_sync_ = proto.needs_full_tree_sync(); | |
| 518 needs_meta_info_recomputation_ = proto.needs_meta_info_recomputation(); | |
| 519 | |
| 520 inputs_.overscroll_elasticity_layer = | |
| 521 UpdateAndGetLayer(inputs_.overscroll_elasticity_layer.get(), | |
| 522 proto.overscroll_elasticity_layer_id(), this); | |
| 523 inputs_.page_scale_layer = UpdateAndGetLayer( | |
| 524 inputs_.page_scale_layer.get(), proto.page_scale_layer_id(), this); | |
| 525 inputs_.inner_viewport_scroll_layer = | |
| 526 UpdateAndGetLayer(inputs_.inner_viewport_scroll_layer.get(), | |
| 527 proto.inner_viewport_scroll_layer_id(), this); | |
| 528 inputs_.outer_viewport_scroll_layer = | |
| 529 UpdateAndGetLayer(inputs_.outer_viewport_scroll_layer.get(), | |
| 530 proto.outer_viewport_scroll_layer_id(), this); | |
| 531 | |
| 532 inputs_.device_viewport_size = ProtoToSize(proto.device_viewport_size()); | |
| 533 inputs_.device_scale_factor = proto.device_scale_factor(); | |
| 534 inputs_.painted_device_scale_factor = proto.painted_device_scale_factor(); | |
| 535 inputs_.page_scale_factor = proto.page_scale_factor(); | |
| 536 inputs_.min_page_scale_factor = proto.min_page_scale_factor(); | |
| 537 inputs_.max_page_scale_factor = proto.max_page_scale_factor(); | |
| 538 inputs_.background_color = proto.background_color(); | |
| 539 inputs_.has_transparent_background = proto.has_transparent_background(); | |
| 540 inputs_.have_scroll_event_handlers = proto.have_scroll_event_handlers(); | |
| 541 inputs_.event_listener_properties[static_cast<size_t>( | |
| 542 EventListenerClass::kMouseWheel)] = | |
| 543 static_cast<EventListenerProperties>( | |
| 544 proto.wheel_event_listener_properties()); | |
| 545 inputs_.event_listener_properties[static_cast<size_t>( | |
| 546 EventListenerClass::kTouchStartOrMove)] = | |
| 547 static_cast<EventListenerProperties>( | |
| 548 proto.touch_start_or_move_event_listener_properties()); | |
| 549 inputs_.event_listener_properties[static_cast<size_t>( | |
| 550 EventListenerClass::kTouchEndOrCancel)] = | |
| 551 static_cast<EventListenerProperties>( | |
| 552 proto.touch_end_or_cancel_event_listener_properties()); | |
| 553 | |
| 554 hud_layer_ = static_cast<HeadsUpDisplayLayer*>( | |
| 555 UpdateAndGetLayer(hud_layer_.get(), proto.hud_layer_id(), this)); | |
| 556 | |
| 557 LayerSelectionFromProtobuf(&inputs_.selection, proto.selection()); | |
| 558 elastic_overscroll_ = ProtoToVector2dF(proto.elastic_overscroll()); | |
| 559 | |
| 560 // It is required to create new PropertyTrees before deserializing it. | |
| 561 property_trees_ = PropertyTrees(); | |
| 562 property_trees_.FromProtobuf(proto.property_trees()); | |
| 563 | |
| 564 // Forcefully override the sequence number of all layers in the tree to have | |
| 565 // a valid sequence number. Changing the sequence number for a layer does not | |
| 566 // need a commit, so the value will become out of date for layers that are not | |
| 567 // updated for other reasons. All layers that at this point are part of the | |
| 568 // layer tree are valid, so it is OK that they have a valid sequence number. | |
| 569 int seq_num = property_trees_.sequence_number; | |
| 570 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { | |
| 571 layer->set_property_tree_sequence_number(seq_num); | |
| 572 }); | |
| 573 } | 460 } |
| 574 | 461 |
| 575 Layer* LayerTree::LayerByElementId(ElementId element_id) const { | 462 Layer* LayerTree::LayerByElementId(ElementId element_id) const { |
| 576 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); | 463 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); |
| 577 return iter != element_layers_map_.end() ? iter->second : nullptr; | 464 return iter != element_layers_map_.end() ? iter->second : nullptr; |
| 578 } | 465 } |
| 579 | 466 |
| 580 void LayerTree::RegisterElement(ElementId element_id, | 467 void LayerTree::RegisterElement(ElementId element_id, |
| 581 ElementListType list_type, | 468 ElementListType list_type, |
| 582 Layer* layer) { | 469 Layer* layer) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 LayerListReverseIterator<Layer> LayerTree::rend() { | 579 LayerListReverseIterator<Layer> LayerTree::rend() { |
| 693 return LayerListReverseIterator<Layer>(nullptr); | 580 return LayerListReverseIterator<Layer>(nullptr); |
| 694 } | 581 } |
| 695 | 582 |
| 696 void LayerTree::SetNeedsDisplayOnAllLayers() { | 583 void LayerTree::SetNeedsDisplayOnAllLayers() { |
| 697 for (auto* layer : *this) | 584 for (auto* layer : *this) |
| 698 layer->SetNeedsDisplay(); | 585 layer->SetNeedsDisplay(); |
| 699 } | 586 } |
| 700 | 587 |
| 701 } // namespace cc | 588 } // namespace cc |
| OLD | NEW |