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