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