OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
255 scrollbar->SetScrollLayerLength(scroll_size.width()); | 255 scrollbar->SetScrollLayerLength(scroll_size.width()); |
256 } else { | 256 } else { |
257 scrollbar_needs_animation |= y_offset_did_change |= | 257 scrollbar_needs_animation |= y_offset_did_change |= |
258 scrollbar->SetCurrentPos(current_offset.y()); | 258 scrollbar->SetCurrentPos(current_offset.y()); |
259 clip_layer_size_did_change |= | 259 clip_layer_size_did_change |= |
260 scrollbar->SetClipLayerLength(clip_size.height()); | 260 scrollbar->SetClipLayerLength(clip_size.height()); |
261 scroll_layer_size_did_change |= | 261 scroll_layer_size_did_change |= |
262 scrollbar->SetScrollLayerLength(scroll_size.height()); | 262 scrollbar->SetScrollLayerLength(scroll_size.height()); |
263 } | 263 } |
264 scrollbar_needs_animation |= | 264 scrollbar_needs_animation |= |
265 scrollbar->SetVerticalAdjust(clip_layer->bounds_delta().y()); | 265 scrollbar->SetVerticalAdjust(clip_layer->ViewportBoundsDelta().y()); |
266 } | 266 } |
267 | 267 |
268 scrollbar_needs_animation |= | 268 scrollbar_needs_animation |= |
269 (clip_layer_size_did_change || scroll_layer_size_did_change); | 269 (clip_layer_size_did_change || scroll_layer_size_did_change); |
270 | 270 |
271 if (y_offset_did_change && IsViewportLayerId(scroll_layer_id)) | 271 if (y_offset_did_change && IsViewportLayerId(scroll_layer_id)) |
272 TRACE_COUNTER_ID1("cc", "scroll_offset_y", scroll_layer->id(), | 272 TRACE_COUNTER_ID1("cc", "scroll_offset_y", scroll_layer->id(), |
273 current_offset.y()); | 273 current_offset.y()); |
274 | 274 |
275 if (scrollbar_needs_animation) { | 275 if (scrollbar_needs_animation) { |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 std::unique_ptr<OwnedLayerImplList> LayerTreeImpl::DetachLayers() { | 379 std::unique_ptr<OwnedLayerImplList> LayerTreeImpl::DetachLayers() { |
380 root_layer_for_testing_ = nullptr; | 380 root_layer_for_testing_ = nullptr; |
381 layer_list_.clear(); | 381 layer_list_.clear(); |
382 render_surface_layer_list_.clear(); | 382 render_surface_layer_list_.clear(); |
383 set_needs_update_draw_properties(); | 383 set_needs_update_draw_properties(); |
384 std::unique_ptr<OwnedLayerImplList> ret = std::move(layers_); | 384 std::unique_ptr<OwnedLayerImplList> ret = std::move(layers_); |
385 layers_.reset(new OwnedLayerImplList); | 385 layers_.reset(new OwnedLayerImplList); |
386 return ret; | 386 return ret; |
387 } | 387 } |
388 | 388 |
389 static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, | |
390 ClipTree* clip_tree) { | |
391 if (layer && layer->masks_to_bounds()) { | |
392 ClipNode* clip_node = clip_tree->Node(layer->clip_tree_index()); | |
393 if (clip_node) { | |
394 DCHECK_EQ(layer->id(), clip_node->owning_layer_id); | |
395 gfx::SizeF bounds = gfx::SizeF(layer->bounds()); | |
396 if (clip_node->clip.size() != bounds) { | |
397 clip_node->clip.set_size(bounds); | |
398 clip_tree->set_needs_update(true); | |
399 } | |
400 } | |
401 } | |
402 } | |
403 | |
404 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { | 389 void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { |
405 std::vector<std::unique_ptr<RenderSurfaceImpl>> old_render_surfaces; | 390 std::vector<std::unique_ptr<RenderSurfaceImpl>> old_render_surfaces; |
406 property_trees_.effect_tree.TakeRenderSurfaces(&old_render_surfaces); | 391 property_trees_.effect_tree.TakeRenderSurfaces(&old_render_surfaces); |
407 property_trees_ = *property_trees; | 392 property_trees_ = *property_trees; |
408 bool render_surfaces_changed = | 393 bool render_surfaces_changed = |
409 property_trees_.effect_tree.CreateOrReuseRenderSurfaces( | 394 property_trees_.effect_tree.CreateOrReuseRenderSurfaces( |
410 &old_render_surfaces, this); | 395 &old_render_surfaces, this); |
411 if (render_surfaces_changed) | 396 if (render_surfaces_changed) |
412 set_needs_update_draw_properties(); | 397 set_needs_update_draw_properties(); |
413 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); | 398 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); |
414 property_trees_.is_main_thread = false; | 399 property_trees_.is_main_thread = false; |
415 property_trees_.is_active = IsActiveTree(); | 400 property_trees_.is_active = IsActiveTree(); |
416 property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); | 401 property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); |
417 // The value of some effect node properties (like is_drawn) depends on | 402 // The value of some effect node properties (like is_drawn) depends on |
418 // whether we are on the active tree or not. So, we need to update the | 403 // whether we are on the active tree or not. So, we need to update the |
419 // effect tree. | 404 // effect tree. |
420 if (IsActiveTree()) | 405 if (IsActiveTree()) |
421 property_trees_.effect_tree.set_needs_update(true); | 406 property_trees_.effect_tree.set_needs_update(true); |
422 } | 407 } |
423 | 408 |
424 void LayerTreeImpl::UpdatePropertyTreesForBoundsDelta() { | |
425 DCHECK(IsActiveTree()); | |
426 LayerImpl* inner_container = InnerViewportContainerLayer(); | |
427 LayerImpl* outer_container = OuterViewportContainerLayer(); | |
428 LayerImpl* inner_scroll = InnerViewportScrollLayer(); | |
429 | |
430 UpdateClipTreeForBoundsDeltaOnLayer(inner_container, | |
431 &property_trees_.clip_tree); | |
432 UpdateClipTreeForBoundsDeltaOnLayer(InnerViewportScrollLayer(), | |
433 &property_trees_.clip_tree); | |
434 UpdateClipTreeForBoundsDeltaOnLayer(outer_container, | |
435 &property_trees_.clip_tree); | |
436 | |
437 if (inner_container) | |
438 property_trees_.SetInnerViewportContainerBoundsDelta( | |
439 inner_container->bounds_delta()); | |
440 if (outer_container) | |
441 property_trees_.SetOuterViewportContainerBoundsDelta( | |
442 outer_container->bounds_delta()); | |
443 if (inner_scroll) | |
444 property_trees_.SetInnerViewportScrollBoundsDelta( | |
445 inner_scroll->bounds_delta()); | |
446 } | |
447 | |
448 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { | 409 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
449 // The request queue should have been processed and does not require a push. | 410 // The request queue should have been processed and does not require a push. |
450 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); | 411 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
451 | 412 |
452 // To maintain the current scrolling node we need to use element ids which | 413 // To maintain the current scrolling node we need to use element ids which |
453 // are stable across the property tree update in SetPropertyTrees. | 414 // are stable across the property tree update in SetPropertyTrees. |
454 ElementId scrolling_element_id; | 415 ElementId scrolling_element_id; |
455 if (ScrollNode* scrolling_node = target_tree->CurrentlyScrollingNode()) | 416 if (ScrollNode* scrolling_node = target_tree->CurrentlyScrollingNode()) |
456 scrolling_element_id = scrolling_node->element_id; | 417 scrolling_element_id = scrolling_node->element_id; |
457 | 418 |
458 target_tree->SetPropertyTrees(&property_trees_); | 419 target_tree->SetPropertyTrees(&property_trees_); |
459 | 420 |
460 ScrollNode* scrolling_node = nullptr; | 421 ScrollNode* scrolling_node = nullptr; |
461 if (scrolling_element_id) { | 422 if (scrolling_element_id) { |
462 auto& scroll_tree = target_tree->property_trees()->scroll_tree; | 423 auto& scroll_tree = target_tree->property_trees()->scroll_tree; |
463 scrolling_node = scroll_tree.FindNodeFromElementId(scrolling_element_id); | 424 scrolling_node = scroll_tree.FindNodeFromElementId(scrolling_element_id); |
464 } | 425 } |
465 target_tree->SetCurrentlyScrollingNode(scrolling_node); | 426 target_tree->SetCurrentlyScrollingNode(scrolling_node); |
466 | 427 |
467 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( | 428 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( |
468 &property_trees_, target_tree); | 429 &property_trees_, target_tree); |
469 | 430 |
470 // This needs to be called early so that we don't clamp with incorrect max | |
471 // offsets when UpdateViewportContainerSizes is called from e.g. | |
472 // PushBrowserControls | |
473 target_tree->UpdatePropertyTreesForBoundsDelta(); | |
ajuma
2017/04/24 17:37:09
Just to make sure, the newly-pushed property trees
pdr.
2017/04/24 20:06:49
I don't think so. Instead, the newly-pushed proper
ajuma
2017/04/24 21:06:20
My understanding was that the pending tree never f
pdr.
2017/04/25 04:01:55
You are right, here's my (new) understanding:
The
bokan
2017/04/25 19:01:46
Yes, I think your understanding is correct but I'm
| |
474 | |
475 if (next_activation_forces_redraw_) { | 431 if (next_activation_forces_redraw_) { |
476 target_tree->ForceRedrawNextActivation(); | 432 target_tree->ForceRedrawNextActivation(); |
477 next_activation_forces_redraw_ = false; | 433 next_activation_forces_redraw_ = false; |
478 } | 434 } |
479 | 435 |
480 target_tree->PassSwapPromises(std::move(swap_promise_list_)); | 436 target_tree->PassSwapPromises(std::move(swap_promise_list_)); |
481 swap_promise_list_.clear(); | 437 swap_promise_list_.clear(); |
482 | 438 |
483 target_tree->set_browser_controls_shrink_blink_size( | 439 target_tree->set_browser_controls_shrink_blink_size( |
484 browser_controls_shrink_blink_size_); | 440 browser_controls_shrink_blink_size_); |
(...skipping 1696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2181 | 2137 |
2182 void LayerTreeImpl::ResetAllChangeTracking() { | 2138 void LayerTreeImpl::ResetAllChangeTracking() { |
2183 layers_that_should_push_properties_.clear(); | 2139 layers_that_should_push_properties_.clear(); |
2184 // Iterate over all layers, including masks. | 2140 // Iterate over all layers, including masks. |
2185 for (auto& layer : *layers_) | 2141 for (auto& layer : *layers_) |
2186 layer->ResetChangeTracking(); | 2142 layer->ResetChangeTracking(); |
2187 property_trees_.ResetAllChangeTracking(); | 2143 property_trees_.ResetAllChangeTracking(); |
2188 } | 2144 } |
2189 | 2145 |
2190 } // namespace cc | 2146 } // namespace cc |
OLD | NEW |