Chromium Code Reviews| Index: cc/trees/layer_tree_host.cc |
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc |
| index ff4d0079fe3983e8096afe381a0cafaa7035ad7f..68fdf792f45b566764c7d804cf48b1de46b24b84 100644 |
| --- a/cc/trees/layer_tree_host.cc |
| +++ b/cc/trees/layer_tree_host.cc |
| @@ -465,6 +465,10 @@ void LayerTreeHost::SetNeedsAnimate() { |
| proxy_->SetNeedsAnimate(); |
| } |
| +void LayerTreeHost::SetNeedsUpdateLayers() { |
| + proxy_->SetNeedsUpdateLayers(); |
| +} |
| + |
| void LayerTreeHost::SetNeedsCommit() { |
| if (!prepaint_callback_.IsCancelled()) { |
| TRACE_EVENT_INSTANT0("cc", |
| @@ -580,15 +584,21 @@ void LayerTreeHost::SetOverdrawBottomHeight(float overdraw_bottom_height) { |
| void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, |
| float min_page_scale_factor, |
| float max_page_scale_factor) { |
| - if (page_scale_factor == page_scale_factor_ && |
| + bool same_page_scale_factor = page_scale_factor == page_scale_factor_; |
| + bool same_page_scale_limits = |
| min_page_scale_factor == min_page_scale_factor_ && |
| - max_page_scale_factor == max_page_scale_factor_) |
| + max_page_scale_factor == max_page_scale_factor_; |
| + if (same_page_scale_factor && same_page_scale_limits) |
| return; |
| page_scale_factor_ = page_scale_factor; |
| min_page_scale_factor_ = min_page_scale_factor; |
| max_page_scale_factor_ = max_page_scale_factor; |
| - SetNeedsCommit(); |
| + |
| + if (same_page_scale_limits) |
|
danakj
2013/07/17 20:53:24
So I guess the main thread is not able to set the
enne (OOO)
2013/07/18 17:36:37
Done.
|
| + SetNeedsUpdateLayers(); |
| + else |
| + SetNeedsCommit(); |
| } |
| void LayerTreeHost::SetVisible(bool visible) { |
| @@ -948,8 +958,8 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
| if (!root_layer_.get()) |
| return; |
| - Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
| gfx::Vector2d root_scroll_delta; |
| + Layer* root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
| for (size_t i = 0; i < info.scrolls.size(); ++i) { |
| Layer* layer = |
| @@ -964,8 +974,21 @@ void LayerTreeHost::ApplyScrollAndScale(const ScrollAndScaleSet& info) { |
| info.scrolls[i].scroll_delta); |
| } |
| } |
| - if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) |
| + |
| + if (!root_scroll_delta.IsZero() || info.page_scale_delta != 1.f) { |
| + // SetScrollOffsetFromImplSide above could have destroyed the tree, |
| + // so re-get this layer before doing anything to it. |
| + root_scroll_layer = FindFirstScrollableLayer(root_layer_.get()); |
| + |
| + // Preemptively apply the scroll offset here before sending it to |
| + // the client. If the client comes back and sets it to the same value, |
| + // then the layer can early out without needing a full commit. |
| + if (root_scroll_layer) { |
| + root_scroll_layer->SetScrollOffsetFromImplSide( |
| + root_scroll_layer->scroll_offset() + root_scroll_delta); |
| + } |
| client_->ApplyScrollAndScale(root_scroll_delta, info.page_scale_delta); |
| + } |
| } |
| void LayerTreeHost::StartRateLimiter(WebKit::WebGraphicsContext3D* context3d) { |