layer.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_events.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/layer_animation_controller.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/base/thread.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebAnimationDelegate.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebLayerScrollClient.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static int s_next_layer_id = 1;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<Layer> Layer::Create() {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return make_scoped_refptr(new Layer());
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer::Layer()
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : needs_display_(false),
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      stacking_order_changed_(false),
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_id_(s_next_layer_id++),
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ignore_set_needs_commit_(false),
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_(NULL),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_tree_host_(NULL),
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scrollable_(false),
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      should_scroll_on_main_thread_(false),
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      have_wheel_event_handlers_(false),
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      anchor_point_(0.5f, 0.5f),
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      background_color_(0),
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      opacity_(1.f),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      anchor_point_z_(0.f),
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_container_for_fixed_position_layers_(false),
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      is_drawable_(false),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      masks_to_bounds_(false),
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      contents_opaque_(false),
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      double_sided_(true),
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      preserves_3d_(false),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      use_parent_backface_visibility_(false),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      draw_checkerboard_for_missing_tiles_(false),
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      force_render_surface_(false),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      replica_layer_(NULL),
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raster_scale_(1.f),
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      automatically_compute_raster_scale_(false),
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_scroll_client_(NULL) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_id_ < 0) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    s_next_layer_id = 1;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_id_ = s_next_layer_id++;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_ = LayerAnimationController::Create(layer_id_);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->AddValueObserver(this);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer::~Layer() {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Our parent should be holding a reference to us so there should be no
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // way for us to be destroyed while we still have a parent.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!parent());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < request_copy_callbacks_.size(); ++i)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    request_copy_callbacks_[i].Run(scoped_ptr<SkBitmap>());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->RemoveValueObserver(this);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the parent reference from all children and dependents.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveAllChildren();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(this, mask_layer_->parent());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->RemoveFromParent();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(this, replica_layer_->parent());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->RemoveFromParent();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetLayerTreeHost(LayerTreeHost* host) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_ == host)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_tree_host_ = host;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    children_[i]->SetLayerTreeHost(host);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->SetLayerTreeHost(host);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->SetLayerTreeHost(host);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host) {
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer_animation_controller_->SetAnimationRegistrar(
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        host->animation_registrar());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host && layer_animation_controller_->has_any_animation())
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host->SetNeedsCommit();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host &&
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!filters_.isEmpty() || !background_filters_.isEmpty() || filter_))
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->set_needs_filter_context();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsCommit() {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ignore_set_needs_commit_)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetNeedsCommit();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsFullTreeSync() {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->SetNeedsFullTreeSync();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Layer::IsPropertyChangeAllowed() const {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer_tree_host_)
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer_tree_host_->settings().strict_layer_property_change_checking)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !layer_tree_host_->in_paint_layer_contents();
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect Layer::LayerRectToContentRect(const gfx::RectF& layer_rect) const {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::RectF content_rect =
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::ScaleRect(layer_rect, contents_scale_x(), contents_scale_y());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Intersect with content rect to avoid the extra pixel because for some
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values x and y, ceil((x / y) * y) may be x + 1.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_rect.Intersect(gfx::Rect(content_bounds()));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::ToEnclosingRect(content_rect);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::BlocksPendingCommit() const {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::CanClipSelf() const {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::BlocksPendingCommitRecursive() const {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (BlocksPendingCommit())
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer() && mask_layer()->BlocksPendingCommitRecursive())
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer() && replica_layer()->BlocksPendingCommitRecursive())
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (children_[i]->BlocksPendingCommitRecursive())
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetParent(Layer* layer) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!layer || !layer->HasAncestor(this));
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  parent_ = layer;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayerTreeHost(parent_ ? parent_->layer_tree_host() : NULL);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ForceAutomaticRasterScaleToBeRecomputed();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->ForceAutomaticRasterScaleToBeRecomputed();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_ && replica_layer_->mask_layer_)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->mask_layer_->ForceAutomaticRasterScaleToBeRecomputed();
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::HasAncestor(Layer* ancestor) const {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (const Layer* layer = parent(); layer; layer = layer->parent()) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (layer == ancestor)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::AddChild(scoped_refptr<Layer> child) {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InsertChild(child, children_.size());
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::InsertChild(scoped_refptr<Layer> child, size_t index) {
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->RemoveFromParent();
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->SetParent(this);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child->stacking_order_changed_ = true;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  index = std::min(index, children_.size());
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  children_.insert(children_.begin() + index, child);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsFullTreeSync();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveFromParent() {
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (parent_)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_->RemoveChildOrDependent(this);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveChildOrDependent(Layer* child) {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_ == child) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->SetParent(NULL);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_ = NULL;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsFullTreeSync();
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_ == child) {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->SetParent(NULL);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_ = NULL;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsFullTreeSync();
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (LayerList::iterator iter = children_.begin();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       iter != children_.end();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       ++iter) {
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*iter != child)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      continue;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    child->SetParent(NULL);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    children_.erase(iter);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsFullTreeSync();
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(reference);
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(reference->parent(), this);
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (reference == new_layer)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int reference_index = IndexOfChild(reference);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (reference_index == -1) {
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED();
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  reference->RemoveFromParent();
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_layer) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_layer->RemoveFromParent();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InsertChild(new_layer, reference_index);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int Layer::IndexOfChild(const Layer* reference) {
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (children_[i] == reference)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return i;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return -1;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetBounds(gfx::Size size) {
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (bounds() == size)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool first_resize = bounds().IsEmpty() && !size.IsEmpty();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bounds_ = size;
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (first_resize)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsDisplay();
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsCommit();
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer* Layer::RootLayer() {
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Layer* layer = this;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (layer->parent())
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer = layer->parent();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveAllChildren() {
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  while (children_.size()) {
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layer* layer = children_[0].get();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(this, layer->parent());
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->RemoveFromParent();
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetChildren(const LayerList& children) {
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (children == children_)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RemoveAllChildren();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < children.size(); ++i)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChild(children[i]);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::RequestCopyAsBitmap(RequestCopyAsBitmapCallback callback) {
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (callback.is_null())
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_copy_callbacks_.push_back(callback);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetNeedsCommit();
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetAnchorPoint(gfx::PointF anchor_point) {
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (anchor_point_ == anchor_point)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  anchor_point_ = anchor_point;
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetAnchorPointZ(float anchor_point_z) {
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (anchor_point_z_ == anchor_point_z)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  anchor_point_z_ = anchor_point_z;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetBackgroundColor(SkColor background_color) {
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (background_color_ == background_color)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  background_color_ = background_color;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::CalculateContentsScale(
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float ideal_contents_scale,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool animating_transform_to_screen,
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float* contents_scale_x,
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float* contents_scale_y,
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size* content_bounds) {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *contents_scale_x = 1;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *contents_scale_y = 1;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *content_bounds = bounds();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetMasksToBounds(bool masks_to_bounds) {
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (masks_to_bounds_ == masks_to_bounds)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  masks_to_bounds_ = masks_to_bounds;
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetMaskLayer(Layer* mask_layer) {
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_ == mask_layer)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_) {
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(this, mask_layer_->parent());
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->RemoveFromParent();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mask_layer_ = mask_layer;
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mask_layer_) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!mask_layer_->parent());
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->RemoveFromParent();
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->SetParent(this);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mask_layer_->SetIsMask(true);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsFullTreeSync();
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetReplicaLayer(Layer* layer) {
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_ == layer)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(this, replica_layer_->parent());
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->RemoveFromParent();
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  replica_layer_ = layer;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (replica_layer_) {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!replica_layer_->parent());
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->RemoveFromParent();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replica_layer_->SetParent(this);
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsFullTreeSync();
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetFilters(const WebKit::WebFilterOperations& filters) {
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (filters_ == filters)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!filter_);
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filters_ = filters;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!filters.isEmpty() && layer_tree_host_)
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->set_needs_filter_context();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetFilter(const skia::RefPtr<SkImageFilter>& filter) {
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (filter_.get() == filter.get())
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(filters_.isEmpty());
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  filter_ = filter;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (filter && layer_tree_host_)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->set_needs_filter_context();
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetBackgroundFilters(const WebKit::WebFilterOperations& filters) {
416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (background_filters_ == filters)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  background_filters_ = filters;
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!filters.isEmpty() && layer_tree_host_)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_tree_host_->set_needs_filter_context();
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetOpacity(float opacity) {
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (opacity_ == opacity)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  opacity_ = opacity;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::OpacityIsAnimating() const {
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_animation_controller_->IsAnimatingProperty(Animation::Opacity);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::OpacityCanAnimateOnImplThread() const {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetContentsOpaque(bool opaque) {
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_opaque_ == opaque)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents_opaque_ = opaque;
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetPosition(gfx::PointF position) {
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (position_ == position)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  position_ = position;
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Layer::IsContainerForFixedPositionLayers() const {
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!transform_.IsIdentityOrTranslation())
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (parent_ && !parent_->sublayer_transform_.IsIdentityOrTranslation())
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return is_container_for_fixed_position_layers_;
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetSublayerTransform(const gfx::Transform& sublayer_transform) {
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (sublayer_transform_ == sublayer_transform)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sublayer_transform_ = sublayer_transform;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetTransform(const gfx::Transform& transform) {
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (transform_ == transform)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform_ = transform;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::TransformIsAnimating() const {
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_animation_controller_->IsAnimatingProperty(Animation::Transform);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetScrollOffset(gfx::Vector2d scroll_offset) {
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (scroll_offset_ == scroll_offset)
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scroll_offset_ = scroll_offset;
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_scroll_client_)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer_scroll_client_->didScroll();
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetMaxScrollOffset(gfx::Vector2d max_scroll_offset) {
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (max_scroll_offset_ == max_scroll_offset)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  max_scroll_offset_ = max_scroll_offset;
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetScrollable(bool scrollable) {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (scrollable_ == scrollable)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scrollable_ = scrollable;
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetShouldScrollOnMainThread(bool should_scroll_on_main_thread) {
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (should_scroll_on_main_thread_ == should_scroll_on_main_thread)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  should_scroll_on_main_thread_ = should_scroll_on_main_thread;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetHaveWheelEventHandlers(bool have_wheel_event_handlers) {
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (have_wheel_event_handlers_ == have_wheel_event_handlers)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  have_wheel_event_handlers_ = have_wheel_event_handlers;
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNonFastScrollableRegion(const Region& region) {
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (non_fast_scrollable_region_ == region)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  non_fast_scrollable_region_ = region;
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetTouchEventHandlerRegion(const Region& region) {
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (touch_event_handler_region_ == region)
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  touch_event_handler_region_ = region;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetDrawCheckerboardForMissingTiles(bool checkerboard) {
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (draw_checkerboard_for_missing_tiles_ == checkerboard)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  draw_checkerboard_for_missing_tiles_ = checkerboard;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetForceRenderSurface(bool force) {
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (force_render_surface_ == force)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  force_render_surface_ = force;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetDoubleSided(bool double_sided) {
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (double_sided_ == double_sided)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  double_sided_ = double_sided;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetIsDrawable(bool is_drawable) {
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_drawable_ == is_drawable)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_drawable_ = is_drawable;
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) {
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_rect_.Union(dirty_rect);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  needs_display_ = true;
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simply mark the contents as dirty. For non-root layers, the call to
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetNeedsCommit will schedule a fresh compositing pass.
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For the root layer, SetNeedsCommit has no effect.
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (DrawsContent() && !update_rect_.IsEmpty())
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsCommit();
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::DescendantIsFixedToContainerLayer() const {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < children_.size(); ++i) {
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (children_[i]->position_constraint_.is_fixed_position() ||
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        children_[i]->DescendantIsFixedToContainerLayer())
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetIsContainerForFixedPositionLayers(bool container) {
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (is_container_for_fixed_position_layers_ == container)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_container_for_fixed_position_layers_ = container;
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_tree_host_ && layer_tree_host_->CommitRequested())
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only request a commit if we have a fixed positioned descendant.
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (DescendantIsFixedToContainerLayer())
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetNeedsCommit();
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SetPositionConstraint(const LayerPositionConstraint& constraint) {
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(IsPropertyChangeAllowed());
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (position_constraint_ == constraint)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  position_constraint_ = constraint;
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void RunCopyCallbackOnMainThread(
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Layer::RequestCopyAsBitmapCallback& callback,
618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SkBitmap> bitmap) {
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.Run(bitmap.Pass());
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void PostCopyCallbackToMainThread(
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Thread* main_thread,
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const Layer::RequestCopyAsBitmapCallback& callback,
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<SkBitmap> bitmap) {
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  main_thread->PostTask(base::Bind(&RunCopyCallbackOnMainThread,
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   callback,
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::Passed(&bitmap)));
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::PushPropertiesTo(LayerImpl* layer) {
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetAnchorPoint(anchor_point_);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetAnchorPointZ(anchor_point_z_);
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBackgroundColor(background_color_);
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetBounds(paint_properties_.bounds);
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentBounds(content_bounds());
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentsScale(contents_scale_x(), contents_scale_y());
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetDebugName(debug_name_);
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetDoubleSided(double_sided_);
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetDrawCheckerboardForMissingTiles(
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      draw_checkerboard_for_missing_tiles_);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetForceRenderSurface(force_render_surface_);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetDrawsContent(DrawsContent());
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetFilters(filters());
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetFilter(filter());
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetBackgroundFilters(background_filters());
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetMasksToBounds(masks_to_bounds_);
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_);
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetNonFastScrollableRegion(non_fast_scrollable_region_);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetTouchEventHandlerRegion(touch_event_handler_region_);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetContentsOpaque(contents_opaque_);
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->OpacityIsAnimatingOnImplOnly() && !OpacityIsAnimating())
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetOpacity(opacity_);
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!(OpacityIsAnimating() && layer->OpacityIsAnimatingOnImplOnly()));
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetPosition(position_);
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetIsContainerForFixedPositionLayers(
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IsContainerForFixedPositionLayers());
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetFixedContainerSizeDelta(gfx::Vector2dF());
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->SetPositionConstraint(position_constraint_);
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetPreserves3d(preserves_3d());
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetSublayerTransform(sublayer_transform_);
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!layer->TransformIsAnimatingOnImplOnly() && !TransformIsAnimating())
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetTransform(transform_);
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!(TransformIsAnimating() && layer->TransformIsAnimatingOnImplOnly()));
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetScrollable(scrollable_);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetScrollOffset(scroll_offset_);
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetMaxScrollOffset(max_scroll_offset_);
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wrap the request_copy_callbacks_ in a PostTask to the main thread.
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<RequestCopyAsBitmapCallback> main_thread_request_copy_callbacks;
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < request_copy_callbacks_.size(); ++i) {
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    main_thread_request_copy_callbacks.push_back(
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&PostCopyCallbackToMainThread,
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   layer_tree_host()->proxy()->MainThread(),
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   request_copy_callbacks_[i]));
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  request_copy_callbacks_.clear();
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer->PassRequestCopyCallbacks(&main_thread_request_copy_callbacks);
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the main thread commits multiple times before the impl thread actually
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // draws, then damage tracking will become incorrect if we simply clobber the
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // union) any update changes that have occurred on the main thread.
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_rect_.Union(layer->update_rect());
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->set_update_rect(update_rect_);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer->layer_tree_impl()->settings().impl_side_painting) {
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(layer->layer_tree_impl()->IsPendingTree());
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerImpl* active_twin =
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        layer->layer_tree_impl()->FindActiveTreeLayerById(id());
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Update the scroll delta from the active layer, which may have
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // adjusted its scroll delta prior to this pending layer being created.
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This code is identical to that in LayerImpl::SetScrollDelta.
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (active_twin) {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(layer->sent_scroll_delta().IsZero());
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->SetScrollDelta(active_twin->ScrollDelta() -
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            active_twin->sent_scroll_delta());
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layer->SetScrollDelta(layer->ScrollDelta() - layer->sent_scroll_delta());
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer->SetSentScrollDelta(gfx::Vector2d());
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer->SetStackingOrderChanged(stacking_order_changed_);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->PushAnimationUpdatesTo(
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer->layer_animation_controller());
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset any state that should be cleared for the next update.
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  stacking_order_changed_ = false;
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  update_rect_ = gfx::RectF();
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> Layer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return LayerImpl::Create(tree_impl, layer_id_);
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::DrawsContent() const {
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_drawable_;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SavePaintProperties() {
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(reveman): Save all layer properties that we depend on not
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // changing until PushProperties() has been called. crbug.com/231016
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  paint_properties_.bounds = bounds_;
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::NeedMoreUpdates() {
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetDebugName(const std::string& debug_name) {
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  debug_name_ = debug_name;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetRasterScale(float scale) {
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (raster_scale_ == scale)
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  raster_scale_ = scale;
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When automatically computed, this acts like a draw property.
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (automatically_compute_raster_scale_)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsDisplay();
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SetAutomaticallyComputeRasterScale(bool automatic) {
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (automatically_compute_raster_scale_ == automatic)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  automatically_compute_raster_scale_ = automatic;
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (automatically_compute_raster_scale_)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ForceAutomaticRasterScaleToBeRecomputed();
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetRasterScale(1);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::ForceAutomaticRasterScaleToBeRecomputed() {
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!automatically_compute_raster_scale_)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!raster_scale_)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  raster_scale_ = 0.f;
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::CreateRenderSurface() {
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!draw_properties_.render_surface);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  draw_properties_.render_surface = make_scoped_ptr(new RenderSurface(this));
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  draw_properties_.render_target = this;
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::ClearRenderSurface() {
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  draw_properties_.render_surface.reset();
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::OnOpacityAnimated(float opacity) {
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is called due to an ongoing accelerated animation. Since this
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation is also being run on the impl thread, there is no need to request
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a commit to push this value over, so set the value directly rather than
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // calling SetOpacity.
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  opacity_ = opacity;
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::OnTransformAnimated(const gfx::Transform& transform) {
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is called due to an ongoing accelerated animation. Since this
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation is also being run on the impl thread, there is no need to request
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // a commit to push this value over, so set this value directly rather than
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // calling SetTransform.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform_ = transform;
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::IsActive() const {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::AddAnimation(scoped_ptr <Animation> animation) {
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!layer_animation_controller_->animation_registrar())
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer",
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        !layer_tree_host_);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->AddAnimation(animation.Pass());
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::PauseAnimation(int animation_id, double time_offset) {
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->PauseAnimation(animation_id, time_offset);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveAnimation(int animation_id) {
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->RemoveAnimation(animation_id);
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::TransferAnimationsTo(Layer* layer) {
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->TransferAnimationsTo(
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      layer->layer_animation_controller());
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::SuspendAnimations(double monotonic_time) {
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->SuspendAnimations(monotonic_time);
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::ResumeAnimations(double monotonic_time) {
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->ResumeAnimations(monotonic_time);
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Layer::SetLayerAnimationControllerForTest(
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<LayerAnimationController> controller) {
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->RemoveValueObserver(this);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_ = controller;
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_animation_controller_->set_force_sync();
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->AddValueObserver(this);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetNeedsCommit();
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Layer::HasActiveAnimation() const {
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_animation_controller_->HasActiveAnimation();
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::AddLayerAnimationEventObserver(
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerAnimationEventObserver* animation_observer) {
852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->AddEventObserver(animation_observer);
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Layer::RemoveLayerAnimationEventObserver(
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LayerAnimationEventObserver* animation_observer) {
857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_animation_controller_->RemoveEventObserver(animation_observer);
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Region Layer::VisibleContentOpaqueRegion() const {
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (contents_opaque())
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return visible_content_rect();
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return Region();
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollbarLayer* Layer::ToScrollbarLayer() {
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderingStatsInstrumentation* Layer::rendering_stats_instrumentation() const {
871c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return layer_tree_host_->rendering_stats_instrumentation();
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
873c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
875