12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2010 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/atomic_sequence_num.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/debug/trace_event.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/location.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/single_thread_task_runner.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/time/time.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_events.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/animation/animation_registrar.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/layer_animation_controller.h" 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/simple_enclosed_region.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/layers/layer_client.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/layers/scrollbar_layer_interface.h" 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/vector2d_conversions.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::StaticAtomicSequenceNumber g_next_layer_id; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<Layer> Layer::Create() { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_refptr(new Layer()); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer::Layer() 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : needs_push_properties_(false), 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_dependents_need_push_properties_(false), 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stacking_order_changed_(false), 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Layer IDs start from 1. 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) layer_id_(g_next_layer_id.GetNext() + 1), 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignore_set_needs_commit_(false), 476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) sorting_context_id_(0), 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_(NULL), 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_(NULL), 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_clip_layer_id_(INVALID_ID), 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) num_descendants_that_draw_content_(0), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_scroll_on_main_thread_(false), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) have_wheel_event_handlers_(false), 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch have_scroll_event_handlers_(false), 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) user_scrollable_horizontal_(true), 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) user_scrollable_vertical_(true), 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) is_root_for_isolated_group_(false), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_container_for_fixed_position_layers_(false), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_drawable_(false), 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) draws_content_(false), 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hide_layer_and_subtree_(false), 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masks_to_bounds_(false), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_opaque_(false), 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double_sided_(true), 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) should_flatten_transform_(true), 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_parent_backface_visibility_(false), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_checkerboard_for_missing_tiles_(false), 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_render_surface_(false), 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch transform_is_invertible_(true), 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) background_color_(0), 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) opacity_(1.f), 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blend_mode_(SkXfermode::kSrcOver_Mode), 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_parent_(NULL), 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_parent_(NULL), 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_(NULL), 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) raster_scale_(0.f), 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) client_(NULL) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_animation_controller_ = LayerAnimationController::Create(layer_id_); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->AddValueObserver(this); 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_animation_controller_->set_value_provider(this); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer::~Layer() { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Our parent should be holding a reference to us so there should be no 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // way for us to be destroyed while we still have a parent. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!parent()); 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Similarly we shouldn't have a layer tree host since it also keeps a 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // reference to us. 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!layer_tree_host()); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->RemoveValueObserver(this); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer_animation_controller_->remove_value_provider(this); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveFromScrollTree(); 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RemoveFromClipTree(); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove the parent reference from all children and dependents. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveAllChildren(); 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get()) { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(this, mask_layer_->parent()); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->RemoveFromParent(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get()) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(this, replica_layer_->parent()); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->RemoveFromParent(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetLayerTreeHost(LayerTreeHost* host) { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_ == host) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host_ = host; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // When changing hosts, the layer needs to commit its properties to the impl 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // side for the new host. 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetNeedsPushProperties(); 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) children_[i]->SetLayerTreeHost(host); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get()) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->SetLayerTreeHost(host); 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get()) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->SetLayerTreeHost(host); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (host) { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->SetAnimationRegistrar( 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) host->animation_registrar()); 130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (host->settings().layer_transforms_should_scale_layer_contents) 132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) reset_raster_scale_to_unknown(); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host && layer_animation_controller_->has_any_animation()) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->SetNeedsCommit(); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid Layer::SetNeedsUpdate() { 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (layer_tree_host_ && !ignore_set_needs_commit_) 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch layer_tree_host_->SetNeedsUpdateLayers(); 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsCommit() { 1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!layer_tree_host_) 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetNeedsPushProperties(); 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ignore_set_needs_commit_) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host_->SetNeedsCommit(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsFullTreeSync() { 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!layer_tree_host_) 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer_tree_host_->SetNeedsFullTreeSync(); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void Layer::SetNextCommitWaitsForActivation() { 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!layer_tree_host_) 165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer_tree_host_->SetNextCommitWaitsForActivation(); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid Layer::SetNeedsPushProperties() { 1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (needs_push_properties_) 1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!parent_should_know_need_push_properties() && parent_) 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_->AddDependentNeedsPushProperties(); 1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch needs_push_properties_ = true; 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid Layer::AddDependentNeedsPushProperties() { 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_GE(num_dependents_need_push_properties_, 0); 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!parent_should_know_need_push_properties() && parent_) 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_->AddDependentNeedsPushProperties(); 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_dependents_need_push_properties_++; 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid Layer::RemoveDependentNeedsPushProperties() { 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_dependents_need_push_properties_--; 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_GE(num_dependents_need_push_properties_, 0); 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!parent_should_know_need_push_properties() && parent_) 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_->RemoveDependentNeedsPushProperties(); 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)bool Layer::IsPropertyChangeAllowed() const { 196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!layer_tree_host_) 197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!layer_tree_host_->settings().strict_layer_property_change_checking) 200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return true; 201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return !layer_tree_host_->in_paint_layer_contents(); 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect Layer::LayerRectToContentRect(const gfx::RectF& layer_rect) const { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF content_rect = 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ScaleRect(layer_rect, contents_scale_x(), contents_scale_y()); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Intersect with content rect to avoid the extra pixel because for some 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // values x and y, ceil((x / y) * y) may be x + 1. 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_rect.Intersect(gfx::Rect(content_bounds())); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ToEnclosingRect(content_rect); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)skia::RefPtr<SkPicture> Layer::GetPicture() const { 2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return skia::RefPtr<SkPicture>(); 2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetParent(Layer* layer) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!layer || !layer->HasAncestor(this)); 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (parent_should_know_need_push_properties()) { 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (parent_) 2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parent_->RemoveDependentNeedsPushProperties(); 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (layer) 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layer->AddDependentNeedsPushProperties(); 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_ = layer; 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetLayerTreeHost(parent_ ? parent_->layer_tree_host() : NULL); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!layer_tree_host_) 232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const LayerTreeSettings& settings = layer_tree_host_->settings(); 234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!settings.layer_transforms_should_scale_layer_contents) 235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 236b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) reset_raster_scale_to_unknown(); 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get()) 239b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mask_layer_->reset_raster_scale_to_unknown(); 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get() && replica_layer_->mask_layer_.get()) 241b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) replica_layer_->mask_layer_->reset_raster_scale_to_unknown(); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::AddChild(scoped_refptr<Layer> child) { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InsertChild(child, children_.size()); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::InsertChild(scoped_refptr<Layer> child, size_t index) { 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->RemoveFromParent(); 2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AddDrawableDescendants(child->NumDescendantsThatDrawContent() + 2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (child->DrawsContent() ? 1 : 0)); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetParent(this); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->stacking_order_changed_ = true; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index = std::min(index, children_.size()); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) children_.insert(children_.begin() + index, child); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveFromParent() { 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent_) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->RemoveChildOrDependent(this); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveChildOrDependent(Layer* child) { 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get() == child) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->SetParent(NULL); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_ = NULL; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get() == child) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->SetParent(NULL); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_ = NULL; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (LayerList::iterator iter = children_.begin(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != children_.end(); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (iter->get() != child) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) child->SetParent(NULL); 2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AddDrawableDescendants(-child->NumDescendantsThatDrawContent() - 2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (child->DrawsContent() ? 1 : 0)); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) children_.erase(iter); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(reference); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(reference->parent(), this); 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (reference == new_layer.get()) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int reference_index = IndexOfChild(reference); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (reference_index == -1) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reference->RemoveFromParent(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (new_layer.get()) { 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_layer->RemoveFromParent(); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InsertChild(new_layer, reference_index); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int Layer::IndexOfChild(const Layer* reference) { 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (children_[i].get() == reference) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return i; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::SetBounds(const gfx::Size& size) { 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bounds() == size) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds_ = size; 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetNeedsCommit(); 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer* Layer::RootLayer() { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer = this; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (layer->parent()) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer = layer->parent(); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveAllChildren() { 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (children_.size()) { 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer = children_[0].get(); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(this, layer->parent()); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->RemoveFromParent(); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetChildren(const LayerList& children) { 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (children == children_) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveAllChildren(); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddChild(children[i]); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool Layer::HasAncestor(const Layer* ancestor) const { 36258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch for (const Layer* layer = parent(); layer; layer = layer->parent()) { 36358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch if (layer == ancestor) 36458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return true; 36558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch } 36658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch return false; 36758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} 36858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void Layer::RequestCopyOfOutput( 37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<CopyOutputRequest> request) { 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (request->IsEmpty()) 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 37490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) copy_requests_.push_back(request.Pass()); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetNeedsCommit(); 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetBackgroundColor(SkColor background_color) { 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (background_color_ == background_color) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_color_ = background_color; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)SkColor Layer::SafeOpaqueBackgroundColor() const { 387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SkColor color = background_color(); 388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (SkColorGetA(color) == 255 && !contents_opaque()) { 389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) color = SK_ColorTRANSPARENT; 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (SkColorGetA(color) != 255 && contents_opaque()) { 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (const Layer* layer = parent(); layer; 392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) layer = layer->parent()) { 393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) color = layer->background_color(); 394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (SkColorGetA(color) == 255) 395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) break; 396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (SkColorGetA(color) != 255) 398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) color = layer_tree_host_->background_color(); 399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (SkColorGetA(color) != 255) 400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) color = SkColorSetA(color, 255); 401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return color; 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid Layer::CalculateContentsScale(float ideal_contents_scale, 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch float* contents_scale_x, 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch float* contents_scale_y, 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::Size* content_bounds) { 409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(layer_tree_host_); 410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *contents_scale_x = 1; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *contents_scale_y = 1; 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *content_bounds = bounds(); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetMasksToBounds(bool masks_to_bounds) { 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (masks_to_bounds_ == masks_to_bounds) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) masks_to_bounds_ = masks_to_bounds; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetMaskLayer(Layer* mask_layer) { 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get() == mask_layer) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get()) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(this, mask_layer_->parent()); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->RemoveFromParent(); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_ = mask_layer; 433868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (mask_layer_.get()) { 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!mask_layer_->parent()); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->RemoveFromParent(); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->SetParent(this); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask_layer_->SetIsMask(true); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetReplicaLayer(Layer* layer) { 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get() == layer) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get()) { 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_EQ(this, replica_layer_->parent()); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->RemoveFromParent(); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_ = layer; 451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (replica_layer_.get()) { 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!replica_layer_->parent()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->RemoveFromParent(); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) replica_layer_->SetParent(this); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsFullTreeSync(); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Layer::SetFilters(const FilterOperations& filters) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (filters_ == filters) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) filters_ = filters; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool Layer::FilterIsAnimating() const { 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return layer_animation_controller_->IsAnimatingProperty(Animation::Filter); 4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Layer::SetBackgroundFilters(const FilterOperations& filters) { 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (background_filters_ == filters) 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_filters_ = filters; 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetOpacity(float opacity) { 480c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (opacity_ == opacity) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opacity_ = opacity; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::OpacityIsAnimating() const { 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_animation_controller_->IsAnimatingProperty(Animation::Opacity); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::OpacityCanAnimateOnImplThread() const { 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { 496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (blend_mode_ == blend_mode) 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Allowing only blend modes that are defined in the CSS Compositing standard: 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://dev.w3.org/fxtf/compositing-1/#blending 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switch (blend_mode) { 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSrcOver_Mode: 504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kScreen_Mode: 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kOverlay_Mode: 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDarken_Mode: 507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kLighten_Mode: 508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kColorDodge_Mode: 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kColorBurn_Mode: 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kHardLight_Mode: 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSoftLight_Mode: 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDifference_Mode: 513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kExclusion_Mode: 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kMultiply_Mode: 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kHue_Mode: 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSaturation_Mode: 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kColor_Mode: 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kLuminosity_Mode: 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // supported blend modes 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) break; 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kClear_Mode: 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSrc_Mode: 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDst_Mode: 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDstOver_Mode: 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSrcIn_Mode: 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDstIn_Mode: 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSrcOut_Mode: 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDstOut_Mode: 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kSrcATop_Mode: 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kDstATop_Mode: 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kXor_Mode: 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kPlus_Mode: 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case SkXfermode::kModulate_Mode: 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Porter Duff Compositing Operators are not yet supported 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // http://dev.w3.org/fxtf/compositing-1/#porterduffcompositingoperators 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED(); 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blend_mode_ = blend_mode; 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetNeedsCommit(); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Layer::SetIsRootForIsolatedGroup(bool root) { 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (is_root_for_isolated_group_ == root) 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) is_root_for_isolated_group_ = root; 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetNeedsCommit(); 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetContentsOpaque(bool opaque) { 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_opaque_ == opaque) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_opaque_ = opaque; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::SetPosition(const gfx::PointF& position) { 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (position_ == position) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) position_ = position; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Layer::IsContainerForFixedPositionLayers() const { 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!transform_.IsIdentityOrTranslation()) 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (parent_ && !parent_->transform_.IsIdentityOrTranslation()) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return is_container_for_fixed_position_layers_; 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetTransform(const gfx::Transform& transform) { 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (transform_ == transform) 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform_ = transform; 5810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch transform_is_invertible_ = transform.IsInvertible(); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Layer::SetTransformOrigin(const gfx::Point3F& transform_origin) { 58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (transform_origin_ == transform_origin) 58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) transform_origin_ = transform_origin; 59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetNeedsCommit(); 59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::TransformIsAnimating() const { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_animation_controller_->IsAnimatingProperty(Animation::Transform); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::SetScrollParent(Layer* parent) { 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_parent_ == parent) 6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_parent_) 6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_parent_->RemoveScrollChild(this); 6043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_parent_ = parent; 6063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_parent_) 6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_parent_->AddScrollChild(this); 6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::AddScrollChild(Layer* child) { 6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!scroll_children_) 6153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_children_.reset(new std::set<Layer*>); 6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_children_->insert(child); 6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::RemoveScrollChild(Layer* child) { 6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_children_->erase(child); 6223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_children_->empty()) 6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_children_.reset(); 6243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::SetClipParent(Layer* ancestor) { 6283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 6293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_parent_ == ancestor) 6303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 6313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_parent_) 6333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_parent_->RemoveClipChild(this); 6343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_parent_ = ancestor; 6363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_parent_) 6383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_parent_->AddClipChild(this); 6393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::AddClipChild(Layer* child) { 6443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!clip_children_) 6453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_children_.reset(new std::set<Layer*>); 6463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_children_->insert(child); 6473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::RemoveClipChild(Layer* child) { 6513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_children_->erase(child); 6523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_children_->empty()) 6533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_children_.reset(); 6543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 6553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetScrollOffset(gfx::Vector2d scroll_offset) { 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (scroll_offset_ == scroll_offset) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scroll_offset_ = scroll_offset; 663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SetNeedsCommit(); 664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::SetScrollOffsetFromImplSide(const gfx::Vector2d& scroll_offset) { 667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 6681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // This function only gets called during a BeginMainFrame, so there 669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // is no need to call SetNeedsUpdate here. 670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested()); 671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (scroll_offset_ == scroll_offset) 672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scroll_offset_ = scroll_offset; 674558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetNeedsPushProperties(); 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!did_scroll_callback_.is_null()) 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch did_scroll_callback_.Run(); 677558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // The callback could potentially change the layer structure: 678558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // "this" may have been destroyed during the process. 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::SetScrollClipLayerId(int clip_layer_id) { 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (scroll_clip_layer_id_ == clip_layer_id) 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scroll_clip_layer_id_ = clip_layer_id; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void Layer::SetUserScrollable(bool horizontal, bool vertical) { 6908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 6918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (user_scrollable_horizontal_ == horizontal && 6928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) user_scrollable_vertical_ == vertical) 6938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return; 6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) user_scrollable_horizontal_ = horizontal; 6958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) user_scrollable_vertical_ = vertical; 6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) SetNeedsCommit(); 6978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetShouldScrollOnMainThread(bool should_scroll_on_main_thread) { 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (should_scroll_on_main_thread_ == should_scroll_on_main_thread) 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) should_scroll_on_main_thread_ = should_scroll_on_main_thread; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetHaveWheelEventHandlers(bool have_wheel_event_handlers) { 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (have_wheel_event_handlers_ == have_wheel_event_handlers) 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) have_wheel_event_handlers_ = have_wheel_event_handlers; 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 715e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid Layer::SetHaveScrollEventHandlers(bool have_scroll_event_handlers) { 716e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(IsPropertyChangeAllowed()); 717e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (have_scroll_event_handlers_ == have_scroll_event_handlers) 718e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return; 719e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch have_scroll_event_handlers_ = have_scroll_event_handlers; 720e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SetNeedsCommit(); 721e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 722e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNonFastScrollableRegion(const Region& region) { 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (non_fast_scrollable_region_ == region) 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) non_fast_scrollable_region_ = region; 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetTouchEventHandlerRegion(const Region& region) { 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_event_handler_region_ == region) 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) touch_event_handler_region_ = region; 7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetNeedsCommit(); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetDrawCheckerboardForMissingTiles(bool checkerboard) { 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (draw_checkerboard_for_missing_tiles_ == checkerboard) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_checkerboard_for_missing_tiles_ = checkerboard; 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetForceRenderSurface(bool force) { 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (force_render_surface_ == force) 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) force_render_surface_ = force; 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetDoubleSided(bool double_sided) { 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (double_sided_ == double_sided) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double_sided_ = double_sided; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Layer::Set3dSortingContextId(int id) { 7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (id == sorting_context_id_) 7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) sorting_context_id_ = id; 7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetNeedsCommit(); 7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::SetShouldFlattenTransform(bool should_flatten) { 7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (should_flatten_transform_ == should_flatten) 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) should_flatten_transform_ = should_flatten; 7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetNeedsCommit(); 7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetIsDrawable(bool is_drawable) { 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_drawable_ == is_drawable) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_drawable_ = is_drawable; 7856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) UpdateDrawsContent(HasDrawableContent()); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Layer::SetHideLayerAndSubtree(bool hide) { 789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(IsPropertyChangeAllowed()); 790eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (hide_layer_and_subtree_ == hide) 791eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 792eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 793eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch hide_layer_and_subtree_ = hide; 794eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SetNeedsCommit(); 795eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 796eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) { 798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (dirty_rect.IsEmpty()) 799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return; 800558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SetNeedsPushProperties(); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_rect_.Union(dirty_rect); 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (DrawsContent()) 805558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetNeedsUpdate(); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::DescendantIsFixedToContainerLayer() const { 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < children_.size(); ++i) { 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (children_[i]->position_constraint_.is_fixed_position() || 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) children_[i]->DescendantIsFixedToContainerLayer()) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetIsContainerForFixedPositionLayers(bool container) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_container_for_fixed_position_layers_ == container) 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_container_for_fixed_position_layers_ = container; 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_tree_host_ && layer_tree_host_->CommitRequested()) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only request a commit if we have a fixed positioned descendant. 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (DescendantIsFixedToContainerLayer()) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SetPositionConstraint(const LayerPositionConstraint& constraint) { 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(IsPropertyChangeAllowed()); 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (position_constraint_ == constraint) 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) position_constraint_ = constraint; 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)static void RunCopyCallbackOnMainThread(scoped_ptr<CopyOutputRequest> request, 8397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<CopyOutputResult> result) { 8407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request->SendResult(result.Pass()); 841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstatic void PostCopyCallbackToMainThread( 844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner, 845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<CopyOutputRequest> request, 846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<CopyOutputResult> result) { 847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_thread_task_runner->PostTask(FROM_HERE, 848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RunCopyCallbackOnMainThread, 849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Passed(&request), 850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Passed(&result))); 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::PushPropertiesTo(LayerImpl* layer) { 854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(layer_tree_host_); 855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // If we did not SavePaintProperties() for the layer this frame, then push the 857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // real property values, not the paint property values. 858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool use_paint_properties = paint_properties_.source_frame_number == 859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host_->source_frame_number(); 860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 86146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layer->SetTransformOrigin(transform_origin_); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetBackgroundColor(background_color_); 863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer->SetBounds(use_paint_properties ? paint_properties_.bounds 864a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) : bounds_); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentBounds(content_bounds()); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentsScale(contents_scale_x(), contents_scale_y()); 8673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool is_tracing; 8695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TRACE_EVENT_CATEGORY_GROUP_ENABLED( 8705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TRACE_DISABLED_BY_DEFAULT("cc.debug") "," TRACE_DISABLED_BY_DEFAULT( 8715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "devtools.timeline.layers"), 8725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &is_tracing); 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (is_tracing) 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) layer->SetDebugInfo(TakeDebugInfo()); 8753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetDoubleSided(double_sided_); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetDrawCheckerboardForMissingTiles( 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_checkerboard_for_missing_tiles_); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetForceRenderSurface(force_render_surface_); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetDrawsContent(DrawsContent()); 881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->SetHideLayerAndSubtree(hide_layer_and_subtree_); 8824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!layer->FilterIsAnimatingOnImplOnly() && !FilterIsAnimating()) 8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) layer->SetFilters(filters_); 8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!(FilterIsAnimating() && layer->FilterIsAnimatingOnImplOnly())); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetBackgroundFilters(background_filters()); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetMasksToBounds(masks_to_bounds_); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_); 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_); 889e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch layer->SetHaveScrollEventHandlers(have_scroll_event_handlers_); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetNonFastScrollableRegion(non_fast_scrollable_region_); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetTouchEventHandlerRegion(touch_event_handler_region_); 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentsOpaque(contents_opaque_); 893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!layer->OpacityIsAnimatingOnImplOnly() && !OpacityIsAnimating()) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetOpacity(opacity_); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!(OpacityIsAnimating() && layer->OpacityIsAnimatingOnImplOnly())); 896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer->SetBlendMode(blend_mode_); 897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_); 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetPosition(position_); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetIsContainerForFixedPositionLayers( 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IsContainerForFixedPositionLayers()); 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer->SetPositionConstraint(position_constraint_); 9025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer->SetShouldFlattenTransform(should_flatten_transform_); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_); 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!layer->TransformIsAnimatingOnImplOnly() && !TransformIsAnimating()) 9050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch layer->SetTransformAndInvertibility(transform_, transform_is_invertible_); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!(TransformIsAnimating() && layer->TransformIsAnimatingOnImplOnly())); 9076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) layer->Set3dSortingContextId(sorting_context_id_); 9086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer->SetScrollClipLayer(scroll_clip_layer_id_); 9118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); 9128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) layer->set_user_scrollable_vertical(user_scrollable_vertical_); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerImpl* scroll_parent = NULL; 915a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (scroll_parent_) { 9163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); 917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(scroll_parent); 918a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 9193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->SetScrollParent(scroll_parent); 9213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_children_) { 9223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::set<LayerImpl*>* scroll_children = new std::set<LayerImpl*>; 9233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (std::set<Layer*>::iterator it = scroll_children_->begin(); 924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) it != scroll_children_->end(); 925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++it) { 926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ((*it)->scroll_parent(), this); 927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerImpl* scroll_child = 928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer->layer_tree_impl()->LayerById((*it)->id()); 929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(scroll_child); 930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scroll_children->insert(scroll_child); 931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 9323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->SetScrollChildren(scroll_children); 933a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 934a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer->SetScrollChildren(NULL); 9353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerImpl* clip_parent = NULL; 9383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_parent_) { 9393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_parent = 9403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->layer_tree_impl()->LayerById(clip_parent_->id()); 941a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(clip_parent); 9423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 9443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->SetClipParent(clip_parent); 9453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_children_) { 9463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::set<LayerImpl*>* clip_children = new std::set<LayerImpl*>; 9473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (std::set<Layer*>::iterator it = clip_children_->begin(); 9483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) it != clip_children_->end(); ++it) { 949a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK_EQ((*it)->clip_parent(), this); 9503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LayerImpl* clip_child = layer->layer_tree_impl()->LayerById((*it)->id()); 9513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(clip_child); 9523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) clip_children->insert(clip_child); 9533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) layer->SetClipChildren(clip_children); 955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } else { 956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) layer->SetClipChildren(NULL); 9573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 9583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 959424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Adjust the scroll delta to be just the scrolls that have happened since 9601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // the BeginMainFrame was sent. This happens for impl-side painting 9611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // in LayerImpl::ApplyScrollDeltasSinceBeginMainFrame in a separate tree walk. 962424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (layer->layer_tree_impl()->settings().impl_side_painting) { 963424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer->SetScrollOffset(scroll_offset_); 964424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 965424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer->SetScrollOffsetAndDelta( 966424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scroll_offset_, layer->ScrollDelta() - layer->sent_scroll_delta()); 967424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) layer->SetSentScrollDelta(gfx::Vector2d()); 968424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 969424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 97090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Wrap the copy_requests_ in a PostTask to the main thread. 97190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests; 97290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); 97390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != copy_requests_.end(); 97490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ++it) { 975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner = 976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_tree_host()->proxy()->MainThreadTaskRunner(); 97790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<CopyOutputRequest> original_request = copy_requests_.take(it); 9787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const CopyOutputRequest& original_request_ref = *original_request; 97990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<CopyOutputRequest> main_thread_request = 9807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CopyOutputRequest::CreateRelayRequest( 9817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) original_request_ref, 9827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PostCopyCallbackToMainThread, 983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch main_thread_task_runner, 9847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Passed(&original_request))); 98590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) main_thread_copy_requests.push_back(main_thread_request.Pass()); 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 98790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) copy_requests_.clear(); 98890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) layer->PassCopyRequests(&main_thread_copy_requests); 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the main thread commits multiple times before the impl thread actually 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // draws, then damage tracking will become incorrect if we simply clobber the 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // union) any update changes that have occurred on the main thread. 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_rect_.Union(layer->update_rect()); 9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer->SetUpdateRect(update_rect_); 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetStackingOrderChanged(stacking_order_changed_); 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_animation_controller_->PushAnimationUpdatesTo( 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->layer_animation_controller()); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset any state that should be cleared for the next update. 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stacking_order_changed_ = false; 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) update_rect_ = gfx::RectF(); 10057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1006f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) needs_push_properties_ = false; 10077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch num_dependents_need_push_properties_ = 0; 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> Layer::CreateLayerImpl(LayerTreeImpl* tree_impl) { 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LayerImpl::Create(tree_impl, layer_id_); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::DrawsContent() const { 10156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return draws_content_; 10166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 10176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool Layer::HasDrawableContent() const { 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return is_drawable_; 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void Layer::UpdateDrawsContent(bool has_drawable_content) { 10236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool draws_content = has_drawable_content; 10246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(is_drawable_ || !has_drawable_content); 10256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (draws_content == draws_content_) 10266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 10276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (HasDelegatedContent()) { 10296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Layers with delegated content need to be treated as if they have as 10306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // many children as the number of layers they own delegated quads for. 10316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Since we don't know this number right now, we choose one that acts like 10326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // infinity for our purposes. 10336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AddDrawableDescendants(draws_content ? 1000 : -1000); 10346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 10356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (parent()) 10376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) parent()->AddDrawableDescendants(draws_content ? 1 : -1); 10386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) draws_content_ = draws_content; 10406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SetNeedsCommit(); 10416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 10426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int Layer::NumDescendantsThatDrawContent() const { 10446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return num_descendants_that_draw_content_; 10456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 10466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1047c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SavePaintProperties() { 1048a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(layer_tree_host_); 1049a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1050c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(reveman): Save all layer properties that we depend on not 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // changing until PushProperties() has been called. crbug.com/231016 1052c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) paint_properties_.bounds = bounds_; 1053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) paint_properties_.source_frame_number = 1054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) layer_tree_host_->source_frame_number(); 1055c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool Layer::Update(ResourceUpdateQueue* queue, 1058a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const OcclusionTracker<Layer>* occlusion) { 1059a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK(layer_tree_host_); 1060a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DCHECK_EQ(layer_tree_host_->source_frame_number(), 1061a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) paint_properties_.source_frame_number) << 1062a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "SavePaintProperties must be called for any layer that is painted."; 10637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 10647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 10657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::NeedMoreUpdates() { 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool Layer::IsSuitableForGpuRasterization() const { 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_refptr<base::debug::ConvertableToTraceFormat> Layer::TakeDebugInfo() { 1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (client_) 1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return client_->TakeDebugInfo(); 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else 1078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 1079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::CreateRenderSurface() { 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!draw_properties_.render_surface); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_properties_.render_surface = make_scoped_ptr(new RenderSurface(this)); 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) draw_properties_.render_target = this; 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::ClearRenderSurface() { 1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) draw_properties_.render_surface.reset(); 1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1090c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid Layer::ClearRenderSurfaceLayerList() { 10925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (draw_properties_.render_surface) 10935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu draw_properties_.render_surface->layer_list().clear(); 10945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 10955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Vector2dF Layer::ScrollOffsetForAnimation() const { 1097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return TotalScrollOffset(); 1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 11004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// On<Property>Animated is called due to an ongoing accelerated animation. 11014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Since this animation is also being run on the compositor thread, there 11024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// is no need to request a commit to push this value over, so the value is 11034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// set directly rather than by calling Set<Property>. 11044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Layer::OnFilterAnimated(const FilterOperations& filters) { 11054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) filters_ = filters; 11064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 11074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::OnOpacityAnimated(float opacity) { 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opacity_ = opacity; 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::OnTransformAnimated(const gfx::Transform& transform) { 1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (transform_ == transform) 1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform_ = transform; 1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) transform_is_invertible_ = transform.IsInvertible(); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Layer::OnScrollOffsetAnimated(const gfx::Vector2dF& scroll_offset) { 1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Do nothing. Scroll deltas will be sent from the compositor thread back 1121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to the main thread in the same manner as during non-animated 1122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // compositor-driven scrolling. 1123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Layer::OnAnimationWaitingForDeletion() { 1126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Animations are only deleted during PushProperties. 1127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetNeedsPushProperties(); 1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::IsActive() const { 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::AddAnimation(scoped_ptr <Animation> animation) { 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_animation_controller_->animation_registrar()) 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (animation->target_property() == Animation::ScrollOffset && 1139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !layer_animation_controller_->animation_registrar() 1140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ->supports_scroll_animations()) 1141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 1142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer", 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !layer_tree_host_); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_animation_controller_->AddAnimation(animation.Pass()); 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::PauseAnimation(int animation_id, double time_offset) { 1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layer_animation_controller_->PauseAnimation( 1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) animation_id, base::TimeDelta::FromSecondsD(time_offset)); 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveAnimation(int animation_id) { 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_animation_controller_->RemoveAnimation(animation_id); 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SetLayerAnimationControllerForTest( 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<LayerAnimationController> controller) { 1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->RemoveValueObserver(this); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_animation_controller_ = controller; 1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->AddValueObserver(this); 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetNeedsCommit(); 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::HasActiveAnimation() const { 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return layer_animation_controller_->HasActiveAnimation(); 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::AddLayerAnimationEventObserver( 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationEventObserver* animation_observer) { 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->AddEventObserver(animation_observer); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveLayerAnimationEventObserver( 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationEventObserver* animation_observer) { 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_animation_controller_->RemoveEventObserver(animation_observer); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 118303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SimpleEnclosedRegion Layer::VisibleContentOpaqueRegion() const { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (contents_opaque()) 118503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return SimpleEnclosedRegion(visible_content_rect()); 118603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return SimpleEnclosedRegion(); 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 118958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ScrollbarLayerInterface* Layer::ToScrollbarLayer() { 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderingStatsInstrumentation* Layer::rendering_stats_instrumentation() const { 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return layer_tree_host_->rendering_stats_instrumentation(); 1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool Layer::SupportsLCDText() const { 119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return false; 119990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 120090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::RemoveFromScrollTree() { 12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (scroll_children_.get()) { 12031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::set<Layer*> copy = *scroll_children_; 12041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::set<Layer*>::iterator it = copy.begin(); it != copy.end(); ++it) 12051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*it)->SetScrollParent(NULL); 12063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!scroll_children_); 12091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetScrollParent(NULL); 12103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 12113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void Layer::RemoveFromClipTree() { 12133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (clip_children_.get()) { 12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::set<Layer*> copy = *clip_children_; 12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::set<Layer*>::iterator it = copy.begin(); it != copy.end(); ++it) 12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (*it)->SetClipParent(NULL); 12173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!clip_children_); 12201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetClipParent(NULL); 12213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 12223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 12236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void Layer::AddDrawableDescendants(int num) { 12246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_GE(num_descendants_that_draw_content_, 0); 12256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_GE(num_descendants_that_draw_content_ + num, 0); 12266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (num == 0) 12276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 12286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) num_descendants_that_draw_content_ += num; 12296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SetNeedsCommit(); 12306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (parent()) 12316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) parent()->AddDrawableDescendants(num); 12326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 12336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 12344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) { 12354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) benchmark->RunOnLayer(this); 12364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 12376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 12386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool Layer::HasDelegatedContent() const { 12396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 12406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 12416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1243