Chromium Code Reviews| Index: cc/blimp/compositor_state_deserializer.cc |
| diff --git a/cc/blimp/compositor_state_deserializer.cc b/cc/blimp/compositor_state_deserializer.cc |
| index 7caf0bff3b0d1b4ffc1dd3216de4b3bd17445f11..f3ca7558a0bfe09d5f69ab1e032f720a55617859 100644 |
| --- a/cc/blimp/compositor_state_deserializer.cc |
| +++ b/cc/blimp/compositor_state_deserializer.cc |
| @@ -7,7 +7,6 @@ |
| #include "base/bind.h" |
| #include "base/memory/ptr_util.h" |
| #include "cc/blimp/client_picture_cache.h" |
| -#include "cc/blimp/compositor_state_deserializer_client.h" |
| #include "cc/blimp/deserialized_content_layer_client.h" |
| #include "cc/blimp/layer_factory.h" |
| #include "cc/blimp/picture_data_conversions.h" |
| @@ -16,10 +15,12 @@ |
| #include "cc/layers/picture_layer.h" |
| #include "cc/layers/solid_color_scrollbar_layer.h" |
| #include "cc/proto/cc_conversions.h" |
| +#include "cc/proto/client_state_update.pb.h" |
| #include "cc/proto/gfx_conversions.h" |
| #include "cc/proto/layer_tree_host.pb.h" |
| #include "cc/proto/skia_conversions.h" |
| -#include "cc/trees/layer_tree_host.h" |
| +#include "cc/trees/layer_tree_host_common.h" |
| +#include "cc/trees/layer_tree_host_in_process.h" |
| namespace cc { |
| namespace { |
| @@ -63,15 +64,14 @@ CompositorStateDeserializer::LayerData& CompositorStateDeserializer::LayerData:: |
| operator=(LayerData&& other) = default; |
| CompositorStateDeserializer::CompositorStateDeserializer( |
| - LayerTreeHost* layer_tree_host, |
| + LayerTreeHostInProcess* layer_tree_host, |
| std::unique_ptr<ClientPictureCache> client_picture_cache, |
| - const ScrollCallback& scroll_callback, |
| CompositorStateDeserializerClient* client) |
| : layer_factory_(base::MakeUnique<DefaultLayerFactory>()), |
| layer_tree_host_(layer_tree_host), |
| client_picture_cache_(std::move(client_picture_cache)), |
| - scroll_callback_(scroll_callback), |
| - client_(client) { |
| + client_(client), |
| + weak_factory_(this) { |
| DCHECK(layer_tree_host_); |
| DCHECK(client_); |
| } |
| @@ -112,6 +112,98 @@ void CompositorStateDeserializer::SetLayerFactoryForTesting( |
| layer_factory_ = std::move(layer_factory); |
| } |
| +void CompositorStateDeserializer::ApplyViewportDeltas( |
| + const gfx::Vector2dF& inner_delta, |
| + const gfx::Vector2dF& outer_delta, |
| + const gfx::Vector2dF& elastic_overscroll_delta, |
| + float page_scale, |
| + float top_controls_delta) { |
| + DCHECK_EQ(top_controls_delta, 0.0f); |
| + DCHECK(elastic_overscroll_delta == gfx::Vector2dF()); |
| + DCHECK(outer_delta == gfx::Vector2dF()); |
| + |
| + // The inner_delta can be ignored here, since we receive that in the scroll |
| + // callback on the layer itself. |
| + if (page_scale != 1.0f) { |
| + LayerTree* layer_tree = layer_tree_host_->GetLayerTree(); |
| + synced_page_scale_.UpdateDeltaFromImplThread( |
| + layer_tree->page_scale_factor()); |
| + layer_tree->SetPageScaleFactorAndLimits( |
| + synced_page_scale_.EngineMain(), layer_tree->min_page_scale_factor(), |
| + layer_tree->max_page_scale_factor()); |
| + client_->DidUpdateLocalState(); |
| + } |
| +} |
| + |
| +void CompositorStateDeserializer::PullClientStateUpdate( |
| + proto::ClientStateUpdate* client_state_update) { |
| + for (auto& layer_it : engine_id_to_layer_) { |
| + int engine_layer_id = layer_it.first; |
| + auto& synced_scroll_offset = layer_it.second.synced_scroll_offset; |
| + gfx::ScrollOffset scroll_offset_delta = |
| + synced_scroll_offset.PullDeltaForEngineUpdate(); |
| + gfx::Vector2d scroll_delta_vector(scroll_offset_delta.x(), |
|
aelias_OOO_until_Jul13
2016/10/28 03:40:20
gfx::Vector2dF
Khushal
2016/10/31 21:02:01
Done.
|
| + scroll_offset_delta.y()); |
| + |
| + if (scroll_delta_vector.IsZero()) { |
| + continue; |
| + } |
| + |
| + proto::ScrollUpdate* scroll_update = |
| + client_state_update->add_scroll_updates(); |
| + scroll_update->set_layer_id(engine_layer_id); |
| + Vector2dToProto(scroll_delta_vector, scroll_update->mutable_scroll_delta()); |
| + } |
| + |
| + float page_scale_delta = synced_page_scale_.PullDeltaForEngineUpdate(); |
| + if (page_scale_delta != 1.0f) { |
| + client_state_update->set_page_scale_delta(page_scale_delta); |
| + } |
| +} |
| + |
| +void CompositorStateDeserializer::DidApplyStateUpdatesOnEngine() { |
| + for (auto& layer_it : engine_id_to_layer_) { |
| + Layer* layer = layer_it.second.layer.get(); |
| + auto& synced_scroll_offset = layer_it.second.synced_scroll_offset; |
| + |
| + synced_scroll_offset.DidApplySentDeltaOnEngine(); |
| + layer->SetScrollOffset(synced_scroll_offset.EngineMain()); |
| + } |
| + |
| + synced_page_scale_.DidApplySentDeltaOnEngine(); |
| + LayerTree* layer_tree = layer_tree_host_->GetLayerTree(); |
| + layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(), |
| + layer_tree->min_page_scale_factor(), |
| + layer_tree->max_page_scale_factor()); |
| +} |
| + |
| +void CompositorStateDeserializer::SendUnappliedDeltasToLayerTreeHost() { |
| + std::unique_ptr<ReflectedMainFrameState> reflected_main_frame_state = |
| + base::MakeUnique<ReflectedMainFrameState>(); |
| + |
| + for (auto& layer_it : engine_id_to_layer_) { |
| + Layer* layer = layer_it.second.layer.get(); |
| + auto& synced_scroll_offset = layer_it.second.synced_scroll_offset; |
| + |
| + gfx::ScrollOffset scroll_offset_delta = |
| + synced_scroll_offset.DeltaNotAppliedOnEngine(); |
| + gfx::Vector2d scroll_delta_vector(scroll_offset_delta.x(), |
|
aelias_OOO_until_Jul13
2016/10/28 03:40:19
gfx::Vector2dF
Khushal
2016/10/31 21:02:01
Done.
|
| + scroll_offset_delta.y()); |
| + if (scroll_delta_vector.IsZero()) |
| + continue; |
| + |
| + LayerTreeHostCommon::ScrollUpdateInfo scroll_update; |
| + scroll_update.layer_id = layer->id(); |
| + scroll_update.scroll_delta = scroll_delta_vector; |
| + reflected_main_frame_state->scrolls.push_back(scroll_update); |
| + } |
| + |
| + reflected_main_frame_state->page_scale_delta = |
| + synced_page_scale_.DeltaNotAppliedOnEngine(); |
| + layer_tree_host_->SetReflectedMainFrameState( |
| + std::move(reflected_main_frame_state)); |
| +} |
| + |
| void CompositorStateDeserializer::SychronizeLayerTreeState( |
| const proto::LayerTree& layer_tree_proto) { |
| LayerTree* layer_tree = layer_tree_host_->GetLayerTree(); |
| @@ -164,10 +256,10 @@ void CompositorStateDeserializer::SychronizeLayerTreeState( |
| float min_page_scale_factor = layer_tree_proto.min_page_scale_factor(); |
| float max_page_scale_factor = layer_tree_proto.max_page_scale_factor(); |
| float page_scale_factor = layer_tree_proto.page_scale_factor(); |
| - if (client_->ShouldRetainClientPageScale(page_scale_factor)) |
| - page_scale_factor = layer_tree->page_scale_factor(); |
| - layer_tree->SetPageScaleFactorAndLimits( |
| - page_scale_factor, min_page_scale_factor, max_page_scale_factor); |
| + synced_page_scale_.PushFromEngineMainThread(page_scale_factor); |
| + layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(), |
| + min_page_scale_factor, |
| + max_page_scale_factor); |
| layer_tree->set_background_color(layer_tree_proto.background_color()); |
| layer_tree->set_has_transparent_background( |
| @@ -219,10 +311,12 @@ void CompositorStateDeserializer::SynchronizeLayerState( |
| layer->SetUseParentBackfaceVisibility(base.use_parent_backface_visibility()); |
| layer->SetBackgroundColor(base.background_color()); |
| - gfx::ScrollOffset scroll_offset = ProtoToScrollOffset(base.scroll_offset()); |
| - if (client_->ShouldRetainClientScroll(engine_layer_id, scroll_offset)) |
| - scroll_offset = layer->scroll_offset(); |
| - layer->SetScrollOffset(scroll_offset); |
| + gfx::ScrollOffset engine_scroll_offset = |
| + ProtoToScrollOffset(base.scroll_offset()); |
| + SyncedRemoteScrollOffset& synced_scroll_offset = |
| + GetLayerData(engine_layer_id)->synced_scroll_offset; |
| + synced_scroll_offset.PushFromEngineMainThread(engine_scroll_offset); |
| + layer->SetScrollOffset(synced_scroll_offset.EngineMain()); |
| layer->SetScrollClipLayerId( |
| GetClientIdFromEngineId(base.scroll_clip_layer_id())); |
| @@ -325,7 +419,9 @@ void CompositorStateDeserializer::SynchronizeLayerHierarchyRecursive( |
| } |
| // Scroll callback. |
| - layer->set_did_scroll_callback(base::Bind(scroll_callback_, layer_node.id())); |
| + layer->set_did_scroll_callback( |
| + base::Bind(&CompositorStateDeserializer::LayerScrolled, |
| + weak_factory_.GetWeakPtr(), layer_node.id())); |
| } |
| scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap( |
| @@ -394,6 +490,16 @@ scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap( |
| return layer; |
| } |
| +void CompositorStateDeserializer::LayerScrolled(int engine_layer_id) { |
| + LayerData* layer_data = GetLayerData(engine_layer_id); |
| + Layer* layer = layer_data->layer.get(); |
| + SyncedRemoteScrollOffset& synced_scroll_offset = |
| + layer_data->synced_scroll_offset; |
| + synced_scroll_offset.UpdateDeltaFromImplThread(layer->scroll_offset()); |
| + layer->SetScrollOffset(synced_scroll_offset.EngineMain()); |
| + client_->DidUpdateLocalState(); |
| +} |
| + |
| int CompositorStateDeserializer::GetClientIdFromEngineId( |
| int engine_layer_id) const { |
| Layer* layer = GetLayerForEngineId(engine_layer_id); |
| @@ -417,4 +523,11 @@ CompositorStateDeserializer::GetContentLayerClient(int engine_layer_id) const { |
| : nullptr; |
| } |
| +CompositorStateDeserializer::LayerData* |
| +CompositorStateDeserializer::GetLayerData(int engine_layer_id) { |
| + EngineIdToLayerMap::iterator layer_it = |
| + engine_id_to_layer_.find(engine_layer_id); |
| + return layer_it != engine_id_to_layer_.end() ? &layer_it->second : nullptr; |
| +} |
| + |
| } // namespace cc |