Home | History | Annotate | Download | only in layers
      1 // Copyright 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "cc/layers/layer.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/debug/trace_event.h"
     10 #include "base/location.h"
     11 #include "base/metrics/histogram.h"
     12 #include "base/single_thread_task_runner.h"
     13 #include "cc/animation/animation.h"
     14 #include "cc/animation/animation_events.h"
     15 #include "cc/animation/keyframed_animation_curve.h"
     16 #include "cc/animation/layer_animation_controller.h"
     17 #include "cc/layers/layer_client.h"
     18 #include "cc/layers/layer_impl.h"
     19 #include "cc/output/copy_output_request.h"
     20 #include "cc/output/copy_output_result.h"
     21 #include "cc/trees/layer_tree_host.h"
     22 #include "cc/trees/layer_tree_impl.h"
     23 #include "third_party/skia/include/core/SkImageFilter.h"
     24 #include "ui/gfx/rect_conversions.h"
     25 
     26 namespace cc {
     27 
     28 static int s_next_layer_id = 1;
     29 
     30 scoped_refptr<Layer> Layer::Create() {
     31   return make_scoped_refptr(new Layer());
     32 }
     33 
     34 Layer::Layer()
     35     : needs_push_properties_(false),
     36       num_dependents_need_push_properties_(false),
     37       stacking_order_changed_(false),
     38       layer_id_(s_next_layer_id++),
     39       ignore_set_needs_commit_(false),
     40       parent_(NULL),
     41       layer_tree_host_(NULL),
     42       scrollable_(false),
     43       should_scroll_on_main_thread_(false),
     44       have_wheel_event_handlers_(false),
     45       user_scrollable_horizontal_(true),
     46       user_scrollable_vertical_(true),
     47       is_root_for_isolated_group_(false),
     48       is_container_for_fixed_position_layers_(false),
     49       is_drawable_(false),
     50       hide_layer_and_subtree_(false),
     51       masks_to_bounds_(false),
     52       contents_opaque_(false),
     53       double_sided_(true),
     54       preserves_3d_(false),
     55       use_parent_backface_visibility_(false),
     56       draw_checkerboard_for_missing_tiles_(false),
     57       force_render_surface_(false),
     58       anchor_point_(0.5f, 0.5f),
     59       background_color_(0),
     60       compositing_reasons_(kCompositingReasonUnknown),
     61       opacity_(1.f),
     62       blend_mode_(SkXfermode::kSrcOver_Mode),
     63       anchor_point_z_(0.f),
     64       scroll_parent_(NULL),
     65       clip_parent_(NULL),
     66       replica_layer_(NULL),
     67       raster_scale_(0.f),
     68       client_(NULL) {
     69   if (layer_id_ < 0) {
     70     s_next_layer_id = 1;
     71     layer_id_ = s_next_layer_id++;
     72   }
     73 
     74   layer_animation_controller_ = LayerAnimationController::Create(layer_id_);
     75   layer_animation_controller_->AddValueObserver(this);
     76   layer_animation_controller_->set_value_provider(this);
     77 }
     78 
     79 Layer::~Layer() {
     80   // Our parent should be holding a reference to us so there should be no
     81   // way for us to be destroyed while we still have a parent.
     82   DCHECK(!parent());
     83   // Similarly we shouldn't have a layer tree host since it also keeps a
     84   // reference to us.
     85   DCHECK(!layer_tree_host());
     86 
     87   layer_animation_controller_->RemoveValueObserver(this);
     88   layer_animation_controller_->remove_value_provider(this);
     89 
     90   // Remove the parent reference from all children and dependents.
     91   RemoveAllChildren();
     92   if (mask_layer_.get()) {
     93     DCHECK_EQ(this, mask_layer_->parent());
     94     mask_layer_->RemoveFromParent();
     95   }
     96   if (replica_layer_.get()) {
     97     DCHECK_EQ(this, replica_layer_->parent());
     98     replica_layer_->RemoveFromParent();
     99   }
    100 
    101   RemoveFromScrollTree();
    102   RemoveFromClipTree();
    103 }
    104 
    105 void Layer::SetLayerTreeHost(LayerTreeHost* host) {
    106   if (layer_tree_host_ == host)
    107     return;
    108 
    109   layer_tree_host_ = host;
    110 
    111   // When changing hosts, the layer needs to commit its properties to the impl
    112   // side for the new host.
    113   SetNeedsPushProperties();
    114 
    115   for (size_t i = 0; i < children_.size(); ++i)
    116     children_[i]->SetLayerTreeHost(host);
    117 
    118   if (mask_layer_.get())
    119     mask_layer_->SetLayerTreeHost(host);
    120   if (replica_layer_.get())
    121     replica_layer_->SetLayerTreeHost(host);
    122 
    123   if (host) {
    124     layer_animation_controller_->SetAnimationRegistrar(
    125         host->animation_registrar());
    126 
    127     if (host->settings().layer_transforms_should_scale_layer_contents)
    128       reset_raster_scale_to_unknown();
    129   }
    130 
    131   if (host && layer_animation_controller_->has_any_animation())
    132     host->SetNeedsCommit();
    133   SetNeedsFilterContextIfNeeded();
    134 }
    135 
    136 void Layer::SetNeedsUpdate() {
    137   if (layer_tree_host_ && !ignore_set_needs_commit_)
    138     layer_tree_host_->SetNeedsUpdateLayers();
    139 }
    140 
    141 void Layer::SetNeedsCommit() {
    142   if (!layer_tree_host_)
    143     return;
    144 
    145   SetNeedsPushProperties();
    146 
    147   if (ignore_set_needs_commit_)
    148     return;
    149 
    150   layer_tree_host_->SetNeedsCommit();
    151 }
    152 
    153 void Layer::SetNeedsFullTreeSync() {
    154   if (!layer_tree_host_)
    155     return;
    156 
    157   layer_tree_host_->SetNeedsFullTreeSync();
    158 }
    159 
    160 void Layer::SetNextCommitWaitsForActivation() {
    161   if (!layer_tree_host_)
    162     return;
    163 
    164   layer_tree_host_->SetNextCommitWaitsForActivation();
    165 }
    166 
    167 void Layer::SetNeedsFilterContextIfNeeded() {
    168   if (!layer_tree_host_)
    169     return;
    170 
    171   if (!filters_.IsEmpty() || !background_filters_.IsEmpty() ||
    172       !uses_default_blend_mode())
    173     layer_tree_host_->set_needs_filter_context();
    174 }
    175 
    176 void Layer::SetNeedsPushProperties() {
    177   if (needs_push_properties_)
    178     return;
    179   if (!parent_should_know_need_push_properties() && parent_)
    180     parent_->AddDependentNeedsPushProperties();
    181   needs_push_properties_ = true;
    182 }
    183 
    184 void Layer::AddDependentNeedsPushProperties() {
    185   DCHECK_GE(num_dependents_need_push_properties_, 0);
    186 
    187   if (!parent_should_know_need_push_properties() && parent_)
    188     parent_->AddDependentNeedsPushProperties();
    189 
    190   num_dependents_need_push_properties_++;
    191 }
    192 
    193 void Layer::RemoveDependentNeedsPushProperties() {
    194   num_dependents_need_push_properties_--;
    195   DCHECK_GE(num_dependents_need_push_properties_, 0);
    196 
    197   if (!parent_should_know_need_push_properties() && parent_)
    198       parent_->RemoveDependentNeedsPushProperties();
    199 }
    200 
    201 bool Layer::IsPropertyChangeAllowed() const {
    202   if (!layer_tree_host_)
    203     return true;
    204 
    205   if (!layer_tree_host_->settings().strict_layer_property_change_checking)
    206     return true;
    207 
    208   return !layer_tree_host_->in_paint_layer_contents();
    209 }
    210 
    211 gfx::Rect Layer::LayerRectToContentRect(const gfx::RectF& layer_rect) const {
    212   gfx::RectF content_rect =
    213       gfx::ScaleRect(layer_rect, contents_scale_x(), contents_scale_y());
    214   // Intersect with content rect to avoid the extra pixel because for some
    215   // values x and y, ceil((x / y) * y) may be x + 1.
    216   content_rect.Intersect(gfx::Rect(content_bounds()));
    217   return gfx::ToEnclosingRect(content_rect);
    218 }
    219 
    220 skia::RefPtr<SkPicture> Layer::GetPicture() const {
    221   return skia::RefPtr<SkPicture>();
    222 }
    223 
    224 void Layer::SetParent(Layer* layer) {
    225   DCHECK(!layer || !layer->HasAncestor(this));
    226 
    227   if (parent_should_know_need_push_properties()) {
    228     if (parent_)
    229       parent_->RemoveDependentNeedsPushProperties();
    230     if (layer)
    231       layer->AddDependentNeedsPushProperties();
    232   }
    233 
    234   parent_ = layer;
    235   SetLayerTreeHost(parent_ ? parent_->layer_tree_host() : NULL);
    236 
    237   if (!layer_tree_host_)
    238     return;
    239   const LayerTreeSettings& settings = layer_tree_host_->settings();
    240   if (!settings.layer_transforms_should_scale_layer_contents)
    241     return;
    242 
    243   reset_raster_scale_to_unknown();
    244   if (mask_layer_.get())
    245     mask_layer_->reset_raster_scale_to_unknown();
    246   if (replica_layer_.get() && replica_layer_->mask_layer_.get())
    247     replica_layer_->mask_layer_->reset_raster_scale_to_unknown();
    248 }
    249 
    250 void Layer::AddChild(scoped_refptr<Layer> child) {
    251   InsertChild(child, children_.size());
    252 }
    253 
    254 void Layer::InsertChild(scoped_refptr<Layer> child, size_t index) {
    255   DCHECK(IsPropertyChangeAllowed());
    256   child->RemoveFromParent();
    257   child->SetParent(this);
    258   child->stacking_order_changed_ = true;
    259 
    260   index = std::min(index, children_.size());
    261   children_.insert(children_.begin() + index, child);
    262   SetNeedsFullTreeSync();
    263 }
    264 
    265 void Layer::RemoveFromParent() {
    266   DCHECK(IsPropertyChangeAllowed());
    267   if (parent_)
    268     parent_->RemoveChildOrDependent(this);
    269 }
    270 
    271 void Layer::RemoveChildOrDependent(Layer* child) {
    272   if (mask_layer_.get() == child) {
    273     mask_layer_->SetParent(NULL);
    274     mask_layer_ = NULL;
    275     SetNeedsFullTreeSync();
    276     return;
    277   }
    278   if (replica_layer_.get() == child) {
    279     replica_layer_->SetParent(NULL);
    280     replica_layer_ = NULL;
    281     SetNeedsFullTreeSync();
    282     return;
    283   }
    284 
    285   for (LayerList::iterator iter = children_.begin();
    286        iter != children_.end();
    287        ++iter) {
    288     if (iter->get() != child)
    289       continue;
    290 
    291     child->SetParent(NULL);
    292     children_.erase(iter);
    293     SetNeedsFullTreeSync();
    294     return;
    295   }
    296 }
    297 
    298 void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) {
    299   DCHECK(reference);
    300   DCHECK_EQ(reference->parent(), this);
    301   DCHECK(IsPropertyChangeAllowed());
    302 
    303   if (reference == new_layer.get())
    304     return;
    305 
    306   int reference_index = IndexOfChild(reference);
    307   if (reference_index == -1) {
    308     NOTREACHED();
    309     return;
    310   }
    311 
    312   reference->RemoveFromParent();
    313 
    314   if (new_layer.get()) {
    315     new_layer->RemoveFromParent();
    316     InsertChild(new_layer, reference_index);
    317   }
    318 }
    319 
    320 int Layer::IndexOfChild(const Layer* reference) {
    321   for (size_t i = 0; i < children_.size(); ++i) {
    322     if (children_[i].get() == reference)
    323       return i;
    324   }
    325   return -1;
    326 }
    327 
    328 void Layer::SetBounds(gfx::Size size) {
    329   DCHECK(IsPropertyChangeAllowed());
    330   if (bounds() == size)
    331     return;
    332 
    333   bounds_ = size;
    334   SetNeedsCommit();
    335 }
    336 
    337 Layer* Layer::RootLayer() {
    338   Layer* layer = this;
    339   while (layer->parent())
    340     layer = layer->parent();
    341   return layer;
    342 }
    343 
    344 void Layer::RemoveAllChildren() {
    345   DCHECK(IsPropertyChangeAllowed());
    346   while (children_.size()) {
    347     Layer* layer = children_[0].get();
    348     DCHECK_EQ(this, layer->parent());
    349     layer->RemoveFromParent();
    350   }
    351 }
    352 
    353 void Layer::SetChildren(const LayerList& children) {
    354   DCHECK(IsPropertyChangeAllowed());
    355   if (children == children_)
    356     return;
    357 
    358   RemoveAllChildren();
    359   for (size_t i = 0; i < children.size(); ++i)
    360     AddChild(children[i]);
    361 }
    362 
    363 bool Layer::HasAncestor(const Layer* ancestor) const {
    364   for (const Layer* layer = parent(); layer; layer = layer->parent()) {
    365     if (layer == ancestor)
    366       return true;
    367   }
    368   return false;
    369 }
    370 
    371 void Layer::RequestCopyOfOutput(
    372     scoped_ptr<CopyOutputRequest> request) {
    373   DCHECK(IsPropertyChangeAllowed());
    374   if (request->IsEmpty())
    375     return;
    376   copy_requests_.push_back(request.Pass());
    377   SetNeedsCommit();
    378 }
    379 
    380 void Layer::SetAnchorPoint(gfx::PointF anchor_point) {
    381   DCHECK(IsPropertyChangeAllowed());
    382   if (anchor_point_ == anchor_point)
    383     return;
    384   anchor_point_ = anchor_point;
    385   SetNeedsCommit();
    386 }
    387 
    388 void Layer::SetAnchorPointZ(float anchor_point_z) {
    389   DCHECK(IsPropertyChangeAllowed());
    390   if (anchor_point_z_ == anchor_point_z)
    391     return;
    392   anchor_point_z_ = anchor_point_z;
    393   SetNeedsCommit();
    394 }
    395 
    396 void Layer::SetBackgroundColor(SkColor background_color) {
    397   DCHECK(IsPropertyChangeAllowed());
    398   if (background_color_ == background_color)
    399     return;
    400   background_color_ = background_color;
    401   SetNeedsCommit();
    402 }
    403 
    404 SkColor Layer::SafeOpaqueBackgroundColor() const {
    405   SkColor color = background_color();
    406   if (SkColorGetA(color) == 255 && !contents_opaque()) {
    407     color = SK_ColorTRANSPARENT;
    408   } else if (SkColorGetA(color) != 255 && contents_opaque()) {
    409     for (const Layer* layer = parent(); layer;
    410          layer = layer->parent()) {
    411       color = layer->background_color();
    412       if (SkColorGetA(color) == 255)
    413         break;
    414     }
    415     if (SkColorGetA(color) != 255)
    416       color = layer_tree_host_->background_color();
    417     if (SkColorGetA(color) != 255)
    418       color = SkColorSetA(color, 255);
    419   }
    420   return color;
    421 }
    422 
    423 void Layer::CalculateContentsScale(
    424     float ideal_contents_scale,
    425     float device_scale_factor,
    426     float page_scale_factor,
    427     bool animating_transform_to_screen,
    428     float* contents_scale_x,
    429     float* contents_scale_y,
    430     gfx::Size* content_bounds) {
    431   DCHECK(layer_tree_host_);
    432 
    433   *contents_scale_x = 1;
    434   *contents_scale_y = 1;
    435   *content_bounds = bounds();
    436 }
    437 
    438 void Layer::SetMasksToBounds(bool masks_to_bounds) {
    439   DCHECK(IsPropertyChangeAllowed());
    440   if (masks_to_bounds_ == masks_to_bounds)
    441     return;
    442   masks_to_bounds_ = masks_to_bounds;
    443   SetNeedsCommit();
    444 }
    445 
    446 void Layer::SetMaskLayer(Layer* mask_layer) {
    447   DCHECK(IsPropertyChangeAllowed());
    448   if (mask_layer_.get() == mask_layer)
    449     return;
    450   if (mask_layer_.get()) {
    451     DCHECK_EQ(this, mask_layer_->parent());
    452     mask_layer_->RemoveFromParent();
    453   }
    454   mask_layer_ = mask_layer;
    455   if (mask_layer_.get()) {
    456     DCHECK(!mask_layer_->parent());
    457     mask_layer_->RemoveFromParent();
    458     mask_layer_->SetParent(this);
    459     mask_layer_->SetIsMask(true);
    460   }
    461   SetNeedsFullTreeSync();
    462 }
    463 
    464 void Layer::SetReplicaLayer(Layer* layer) {
    465   DCHECK(IsPropertyChangeAllowed());
    466   if (replica_layer_.get() == layer)
    467     return;
    468   if (replica_layer_.get()) {
    469     DCHECK_EQ(this, replica_layer_->parent());
    470     replica_layer_->RemoveFromParent();
    471   }
    472   replica_layer_ = layer;
    473   if (replica_layer_.get()) {
    474     DCHECK(!replica_layer_->parent());
    475     replica_layer_->RemoveFromParent();
    476     replica_layer_->SetParent(this);
    477   }
    478   SetNeedsFullTreeSync();
    479 }
    480 
    481 void Layer::SetFilters(const FilterOperations& filters) {
    482   DCHECK(IsPropertyChangeAllowed());
    483   if (filters_ == filters)
    484     return;
    485   filters_ = filters;
    486   SetNeedsCommit();
    487   SetNeedsFilterContextIfNeeded();
    488 }
    489 
    490 bool Layer::FilterIsAnimating() const {
    491   return layer_animation_controller_->IsAnimatingProperty(Animation::Filter);
    492 }
    493 
    494 void Layer::SetBackgroundFilters(const FilterOperations& filters) {
    495   DCHECK(IsPropertyChangeAllowed());
    496   if (background_filters_ == filters)
    497     return;
    498   background_filters_ = filters;
    499   SetNeedsCommit();
    500   SetNeedsFilterContextIfNeeded();
    501 }
    502 
    503 void Layer::SetOpacity(float opacity) {
    504   DCHECK(IsPropertyChangeAllowed());
    505   if (opacity_ == opacity)
    506     return;
    507   opacity_ = opacity;
    508   SetNeedsCommit();
    509 }
    510 
    511 bool Layer::OpacityIsAnimating() const {
    512   return layer_animation_controller_->IsAnimatingProperty(Animation::Opacity);
    513 }
    514 
    515 bool Layer::OpacityCanAnimateOnImplThread() const {
    516   return false;
    517 }
    518 
    519 void Layer::SetBlendMode(SkXfermode::Mode blend_mode) {
    520   DCHECK(IsPropertyChangeAllowed());
    521   if (blend_mode_ == blend_mode)
    522     return;
    523 
    524   // Allowing only blend modes that are defined in the CSS Compositing standard:
    525   // http://dev.w3.org/fxtf/compositing-1/#blending
    526   switch (blend_mode) {
    527     case SkXfermode::kSrcOver_Mode:
    528     case SkXfermode::kScreen_Mode:
    529     case SkXfermode::kOverlay_Mode:
    530     case SkXfermode::kDarken_Mode:
    531     case SkXfermode::kLighten_Mode:
    532     case SkXfermode::kColorDodge_Mode:
    533     case SkXfermode::kColorBurn_Mode:
    534     case SkXfermode::kHardLight_Mode:
    535     case SkXfermode::kSoftLight_Mode:
    536     case SkXfermode::kDifference_Mode:
    537     case SkXfermode::kExclusion_Mode:
    538     case SkXfermode::kMultiply_Mode:
    539     case SkXfermode::kHue_Mode:
    540     case SkXfermode::kSaturation_Mode:
    541     case SkXfermode::kColor_Mode:
    542     case SkXfermode::kLuminosity_Mode:
    543       // supported blend modes
    544       break;
    545     case SkXfermode::kClear_Mode:
    546     case SkXfermode::kSrc_Mode:
    547     case SkXfermode::kDst_Mode:
    548     case SkXfermode::kDstOver_Mode:
    549     case SkXfermode::kSrcIn_Mode:
    550     case SkXfermode::kDstIn_Mode:
    551     case SkXfermode::kSrcOut_Mode:
    552     case SkXfermode::kDstOut_Mode:
    553     case SkXfermode::kSrcATop_Mode:
    554     case SkXfermode::kDstATop_Mode:
    555     case SkXfermode::kXor_Mode:
    556     case SkXfermode::kPlus_Mode:
    557     case SkXfermode::kModulate_Mode:
    558       // Porter Duff Compositing Operators are not yet supported
    559       // http://dev.w3.org/fxtf/compositing-1/#porterduffcompositingoperators
    560       NOTREACHED();
    561       return;
    562   }
    563 
    564   blend_mode_ = blend_mode;
    565   SetNeedsCommit();
    566   SetNeedsFilterContextIfNeeded();
    567 }
    568 
    569 void Layer::SetIsRootForIsolatedGroup(bool root) {
    570   DCHECK(IsPropertyChangeAllowed());
    571   if (is_root_for_isolated_group_ == root)
    572     return;
    573   is_root_for_isolated_group_ = root;
    574   SetNeedsCommit();
    575 }
    576 
    577 void Layer::SetContentsOpaque(bool opaque) {
    578   DCHECK(IsPropertyChangeAllowed());
    579   if (contents_opaque_ == opaque)
    580     return;
    581   contents_opaque_ = opaque;
    582   SetNeedsCommit();
    583 }
    584 
    585 void Layer::SetPosition(gfx::PointF position) {
    586   DCHECK(IsPropertyChangeAllowed());
    587   if (position_ == position)
    588     return;
    589   position_ = position;
    590   SetNeedsCommit();
    591 }
    592 
    593 bool Layer::IsContainerForFixedPositionLayers() const {
    594   if (!transform_.IsIdentityOrTranslation())
    595     return true;
    596   if (parent_ && !parent_->sublayer_transform_.IsIdentityOrTranslation())
    597     return true;
    598   return is_container_for_fixed_position_layers_;
    599 }
    600 
    601 void Layer::SetSublayerTransform(const gfx::Transform& sublayer_transform) {
    602   DCHECK(IsPropertyChangeAllowed());
    603   if (sublayer_transform_ == sublayer_transform)
    604     return;
    605   sublayer_transform_ = sublayer_transform;
    606   SetNeedsCommit();
    607 }
    608 
    609 void Layer::SetTransform(const gfx::Transform& transform) {
    610   DCHECK(IsPropertyChangeAllowed());
    611   if (transform_ == transform)
    612     return;
    613   transform_ = transform;
    614   SetNeedsCommit();
    615 }
    616 
    617 bool Layer::TransformIsAnimating() const {
    618   return layer_animation_controller_->IsAnimatingProperty(Animation::Transform);
    619 }
    620 
    621 void Layer::SetScrollParent(Layer* parent) {
    622   DCHECK(IsPropertyChangeAllowed());
    623   if (scroll_parent_ == parent)
    624     return;
    625 
    626   if (scroll_parent_)
    627     scroll_parent_->RemoveScrollChild(this);
    628 
    629   scroll_parent_ = parent;
    630 
    631   if (scroll_parent_)
    632     scroll_parent_->AddScrollChild(this);
    633 
    634   SetNeedsCommit();
    635 }
    636 
    637 void Layer::AddScrollChild(Layer* child) {
    638   if (!scroll_children_)
    639     scroll_children_.reset(new std::set<Layer*>);
    640   scroll_children_->insert(child);
    641   SetNeedsCommit();
    642 }
    643 
    644 void Layer::RemoveScrollChild(Layer* child) {
    645   scroll_children_->erase(child);
    646   if (scroll_children_->empty())
    647     scroll_children_.reset();
    648   SetNeedsCommit();
    649 }
    650 
    651 void Layer::SetClipParent(Layer* ancestor) {
    652   DCHECK(IsPropertyChangeAllowed());
    653   if (clip_parent_ == ancestor)
    654     return;
    655 
    656   if (clip_parent_)
    657     clip_parent_->RemoveClipChild(this);
    658 
    659   clip_parent_ = ancestor;
    660 
    661   if (clip_parent_)
    662     clip_parent_->AddClipChild(this);
    663 
    664   SetNeedsCommit();
    665 }
    666 
    667 void Layer::AddClipChild(Layer* child) {
    668   if (!clip_children_)
    669     clip_children_.reset(new std::set<Layer*>);
    670   clip_children_->insert(child);
    671   SetNeedsCommit();
    672 }
    673 
    674 void Layer::RemoveClipChild(Layer* child) {
    675   clip_children_->erase(child);
    676   if (clip_children_->empty())
    677     clip_children_.reset();
    678   SetNeedsCommit();
    679 }
    680 
    681 void Layer::SetScrollOffset(gfx::Vector2d scroll_offset) {
    682   DCHECK(IsPropertyChangeAllowed());
    683   if (scroll_offset_ == scroll_offset)
    684     return;
    685   scroll_offset_ = scroll_offset;
    686   SetNeedsCommit();
    687 }
    688 
    689 void Layer::SetScrollOffsetFromImplSide(gfx::Vector2d scroll_offset) {
    690   DCHECK(IsPropertyChangeAllowed());
    691   // This function only gets called during a BeginMainFrame, so there
    692   // is no need to call SetNeedsUpdate here.
    693   DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested());
    694   if (scroll_offset_ == scroll_offset)
    695     return;
    696   scroll_offset_ = scroll_offset;
    697   SetNeedsPushProperties();
    698   if (!did_scroll_callback_.is_null())
    699     did_scroll_callback_.Run();
    700   // The callback could potentially change the layer structure:
    701   // "this" may have been destroyed during the process.
    702 }
    703 
    704 void Layer::SetMaxScrollOffset(gfx::Vector2d max_scroll_offset) {
    705   DCHECK(IsPropertyChangeAllowed());
    706   if (max_scroll_offset_ == max_scroll_offset)
    707     return;
    708   max_scroll_offset_ = max_scroll_offset;
    709   SetNeedsCommit();
    710 }
    711 
    712 void Layer::SetScrollable(bool scrollable) {
    713   DCHECK(IsPropertyChangeAllowed());
    714   if (scrollable_ == scrollable)
    715     return;
    716   scrollable_ = scrollable;
    717   SetNeedsCommit();
    718 }
    719 
    720 void Layer::SetUserScrollable(bool horizontal, bool vertical) {
    721   DCHECK(IsPropertyChangeAllowed());
    722   if (user_scrollable_horizontal_ == horizontal &&
    723       user_scrollable_vertical_ == vertical)
    724     return;
    725   user_scrollable_horizontal_ = horizontal;
    726   user_scrollable_vertical_ = vertical;
    727   SetNeedsCommit();
    728 }
    729 
    730 void Layer::SetShouldScrollOnMainThread(bool should_scroll_on_main_thread) {
    731   DCHECK(IsPropertyChangeAllowed());
    732   if (should_scroll_on_main_thread_ == should_scroll_on_main_thread)
    733     return;
    734   should_scroll_on_main_thread_ = should_scroll_on_main_thread;
    735   SetNeedsCommit();
    736 }
    737 
    738 void Layer::SetHaveWheelEventHandlers(bool have_wheel_event_handlers) {
    739   DCHECK(IsPropertyChangeAllowed());
    740   if (have_wheel_event_handlers_ == have_wheel_event_handlers)
    741     return;
    742   have_wheel_event_handlers_ = have_wheel_event_handlers;
    743   SetNeedsCommit();
    744 }
    745 
    746 void Layer::SetNonFastScrollableRegion(const Region& region) {
    747   DCHECK(IsPropertyChangeAllowed());
    748   if (non_fast_scrollable_region_ == region)
    749     return;
    750   non_fast_scrollable_region_ = region;
    751   SetNeedsCommit();
    752 }
    753 
    754 void Layer::SetTouchEventHandlerRegion(const Region& region) {
    755   DCHECK(IsPropertyChangeAllowed());
    756   if (touch_event_handler_region_ == region)
    757     return;
    758   touch_event_handler_region_ = region;
    759   SetNeedsCommit();
    760 }
    761 
    762 void Layer::SetDrawCheckerboardForMissingTiles(bool checkerboard) {
    763   DCHECK(IsPropertyChangeAllowed());
    764   if (draw_checkerboard_for_missing_tiles_ == checkerboard)
    765     return;
    766   draw_checkerboard_for_missing_tiles_ = checkerboard;
    767   SetNeedsCommit();
    768 }
    769 
    770 void Layer::SetForceRenderSurface(bool force) {
    771   DCHECK(IsPropertyChangeAllowed());
    772   if (force_render_surface_ == force)
    773     return;
    774   force_render_surface_ = force;
    775   SetNeedsCommit();
    776 }
    777 
    778 void Layer::SetDoubleSided(bool double_sided) {
    779   DCHECK(IsPropertyChangeAllowed());
    780   if (double_sided_ == double_sided)
    781     return;
    782   double_sided_ = double_sided;
    783   SetNeedsCommit();
    784 }
    785 
    786 void Layer::SetIsDrawable(bool is_drawable) {
    787   DCHECK(IsPropertyChangeAllowed());
    788   if (is_drawable_ == is_drawable)
    789     return;
    790 
    791   is_drawable_ = is_drawable;
    792   SetNeedsCommit();
    793 }
    794 
    795 void Layer::SetHideLayerAndSubtree(bool hide) {
    796   DCHECK(IsPropertyChangeAllowed());
    797   if (hide_layer_and_subtree_ == hide)
    798     return;
    799 
    800   hide_layer_and_subtree_ = hide;
    801   SetNeedsCommit();
    802 }
    803 
    804 void Layer::SetNeedsDisplayRect(const gfx::RectF& dirty_rect) {
    805   if (dirty_rect.IsEmpty())
    806     return;
    807 
    808   SetNeedsPushProperties();
    809   update_rect_.Union(dirty_rect);
    810 
    811   if (DrawsContent())
    812     SetNeedsUpdate();
    813 }
    814 
    815 bool Layer::DescendantIsFixedToContainerLayer() const {
    816   for (size_t i = 0; i < children_.size(); ++i) {
    817     if (children_[i]->position_constraint_.is_fixed_position() ||
    818         children_[i]->DescendantIsFixedToContainerLayer())
    819       return true;
    820   }
    821   return false;
    822 }
    823 
    824 void Layer::SetIsContainerForFixedPositionLayers(bool container) {
    825   if (is_container_for_fixed_position_layers_ == container)
    826     return;
    827   is_container_for_fixed_position_layers_ = container;
    828 
    829   if (layer_tree_host_ && layer_tree_host_->CommitRequested())
    830     return;
    831 
    832   // Only request a commit if we have a fixed positioned descendant.
    833   if (DescendantIsFixedToContainerLayer())
    834     SetNeedsCommit();
    835 }
    836 
    837 void Layer::SetPositionConstraint(const LayerPositionConstraint& constraint) {
    838   DCHECK(IsPropertyChangeAllowed());
    839   if (position_constraint_ == constraint)
    840     return;
    841   position_constraint_ = constraint;
    842   SetNeedsCommit();
    843 }
    844 
    845 static void RunCopyCallbackOnMainThread(scoped_ptr<CopyOutputRequest> request,
    846                                         scoped_ptr<CopyOutputResult> result) {
    847   request->SendResult(result.Pass());
    848 }
    849 
    850 static void PostCopyCallbackToMainThread(
    851     scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
    852     scoped_ptr<CopyOutputRequest> request,
    853     scoped_ptr<CopyOutputResult> result) {
    854   main_thread_task_runner->PostTask(FROM_HERE,
    855                                     base::Bind(&RunCopyCallbackOnMainThread,
    856                                                base::Passed(&request),
    857                                                base::Passed(&result)));
    858 }
    859 
    860 void Layer::PushPropertiesTo(LayerImpl* layer) {
    861   DCHECK(layer_tree_host_);
    862 
    863   // If we did not SavePaintProperties() for the layer this frame, then push the
    864   // real property values, not the paint property values.
    865   bool use_paint_properties = paint_properties_.source_frame_number ==
    866                               layer_tree_host_->source_frame_number();
    867 
    868   layer->SetAnchorPoint(anchor_point_);
    869   layer->SetAnchorPointZ(anchor_point_z_);
    870   layer->SetBackgroundColor(background_color_);
    871   layer->SetBounds(use_paint_properties ? paint_properties_.bounds
    872                                         : bounds_);
    873   layer->SetContentBounds(content_bounds());
    874   layer->SetContentsScale(contents_scale_x(), contents_scale_y());
    875 
    876   bool is_tracing;
    877   TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
    878                                      &is_tracing);
    879   if (is_tracing) {
    880     layer->SetDebugName(DebugName());
    881     layer->SetDebugInfo(TakeDebugInfo());
    882   } else {
    883     layer->SetDebugName(std::string());
    884   }
    885 
    886   layer->SetCompositingReasons(compositing_reasons_);
    887   layer->SetDoubleSided(double_sided_);
    888   layer->SetDrawCheckerboardForMissingTiles(
    889       draw_checkerboard_for_missing_tiles_);
    890   layer->SetForceRenderSurface(force_render_surface_);
    891   layer->SetDrawsContent(DrawsContent());
    892   layer->SetHideLayerAndSubtree(hide_layer_and_subtree_);
    893   if (!layer->FilterIsAnimatingOnImplOnly() && !FilterIsAnimating())
    894     layer->SetFilters(filters_);
    895   DCHECK(!(FilterIsAnimating() && layer->FilterIsAnimatingOnImplOnly()));
    896   layer->SetBackgroundFilters(background_filters());
    897   layer->SetMasksToBounds(masks_to_bounds_);
    898   layer->SetShouldScrollOnMainThread(should_scroll_on_main_thread_);
    899   layer->SetHaveWheelEventHandlers(have_wheel_event_handlers_);
    900   layer->SetNonFastScrollableRegion(non_fast_scrollable_region_);
    901   layer->SetTouchEventHandlerRegion(touch_event_handler_region_);
    902   layer->SetContentsOpaque(contents_opaque_);
    903   if (!layer->OpacityIsAnimatingOnImplOnly() && !OpacityIsAnimating())
    904     layer->SetOpacity(opacity_);
    905   DCHECK(!(OpacityIsAnimating() && layer->OpacityIsAnimatingOnImplOnly()));
    906   layer->SetBlendMode(blend_mode_);
    907   layer->SetIsRootForIsolatedGroup(is_root_for_isolated_group_);
    908   layer->SetPosition(position_);
    909   layer->SetIsContainerForFixedPositionLayers(
    910       IsContainerForFixedPositionLayers());
    911   layer->SetFixedContainerSizeDelta(gfx::Vector2dF());
    912   layer->SetPositionConstraint(position_constraint_);
    913   layer->SetPreserves3d(preserves_3d());
    914   layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_);
    915   layer->SetSublayerTransform(sublayer_transform_);
    916   if (!layer->TransformIsAnimatingOnImplOnly() && !TransformIsAnimating())
    917     layer->SetTransform(transform_);
    918   DCHECK(!(TransformIsAnimating() && layer->TransformIsAnimatingOnImplOnly()));
    919 
    920   layer->SetScrollable(scrollable_);
    921   layer->set_user_scrollable_horizontal(user_scrollable_horizontal_);
    922   layer->set_user_scrollable_vertical(user_scrollable_vertical_);
    923   layer->SetMaxScrollOffset(max_scroll_offset_);
    924 
    925   LayerImpl* scroll_parent = NULL;
    926   if (scroll_parent_)
    927     scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id());
    928 
    929   layer->SetScrollParent(scroll_parent);
    930   if (scroll_children_) {
    931     std::set<LayerImpl*>* scroll_children = new std::set<LayerImpl*>;
    932     for (std::set<Layer*>::iterator it = scroll_children_->begin();
    933         it != scroll_children_->end(); ++it)
    934       scroll_children->insert(layer->layer_tree_impl()->LayerById((*it)->id()));
    935     layer->SetScrollChildren(scroll_children);
    936   }
    937 
    938   LayerImpl* clip_parent = NULL;
    939   if (clip_parent_) {
    940     clip_parent =
    941         layer->layer_tree_impl()->LayerById(clip_parent_->id());
    942   }
    943 
    944   layer->SetClipParent(clip_parent);
    945   if (clip_children_) {
    946     std::set<LayerImpl*>* clip_children = new std::set<LayerImpl*>;
    947     for (std::set<Layer*>::iterator it = clip_children_->begin();
    948         it != clip_children_->end(); ++it) {
    949       LayerImpl* clip_child = layer->layer_tree_impl()->LayerById((*it)->id());
    950       DCHECK(clip_child);
    951       clip_children->insert(clip_child);
    952     }
    953     layer->SetClipChildren(clip_children);
    954   }
    955 
    956   // Adjust the scroll delta to be just the scrolls that have happened since
    957   // the BeginMainFrame was sent.  This happens for impl-side painting
    958   // in LayerImpl::ApplyScrollDeltasSinceBeginMainFrame in a separate tree walk.
    959   if (layer->layer_tree_impl()->settings().impl_side_painting) {
    960     layer->SetScrollOffset(scroll_offset_);
    961   } else {
    962     layer->SetScrollOffsetAndDelta(
    963         scroll_offset_, layer->ScrollDelta() - layer->sent_scroll_delta());
    964     layer->SetSentScrollDelta(gfx::Vector2d());
    965   }
    966 
    967   // Wrap the copy_requests_ in a PostTask to the main thread.
    968   ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests;
    969   for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin();
    970        it != copy_requests_.end();
    971        ++it) {
    972     scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner =
    973         layer_tree_host()->proxy()->MainThreadTaskRunner();
    974     scoped_ptr<CopyOutputRequest> original_request = copy_requests_.take(it);
    975     const CopyOutputRequest& original_request_ref = *original_request;
    976     scoped_ptr<CopyOutputRequest> main_thread_request =
    977         CopyOutputRequest::CreateRelayRequest(
    978             original_request_ref,
    979             base::Bind(&PostCopyCallbackToMainThread,
    980                        main_thread_task_runner,
    981                        base::Passed(&original_request)));
    982     main_thread_copy_requests.push_back(main_thread_request.Pass());
    983   }
    984   copy_requests_.clear();
    985   layer->PassCopyRequests(&main_thread_copy_requests);
    986 
    987   // If the main thread commits multiple times before the impl thread actually
    988   // draws, then damage tracking will become incorrect if we simply clobber the
    989   // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
    990   // union) any update changes that have occurred on the main thread.
    991   update_rect_.Union(layer->update_rect());
    992   layer->set_update_rect(update_rect_);
    993 
    994   layer->SetStackingOrderChanged(stacking_order_changed_);
    995 
    996   layer_animation_controller_->PushAnimationUpdatesTo(
    997       layer->layer_animation_controller());
    998 
    999   // Reset any state that should be cleared for the next update.
   1000   stacking_order_changed_ = false;
   1001   update_rect_ = gfx::RectF();
   1002 
   1003   needs_push_properties_ = false;
   1004   num_dependents_need_push_properties_ = 0;
   1005 }
   1006 
   1007 scoped_ptr<LayerImpl> Layer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
   1008   return LayerImpl::Create(tree_impl, layer_id_);
   1009 }
   1010 
   1011 bool Layer::DrawsContent() const {
   1012   return is_drawable_;
   1013 }
   1014 
   1015 void Layer::SavePaintProperties() {
   1016   DCHECK(layer_tree_host_);
   1017 
   1018   // TODO(reveman): Save all layer properties that we depend on not
   1019   // changing until PushProperties() has been called. crbug.com/231016
   1020   paint_properties_.bounds = bounds_;
   1021   paint_properties_.source_frame_number =
   1022       layer_tree_host_->source_frame_number();
   1023 }
   1024 
   1025 bool Layer::Update(ResourceUpdateQueue* queue,
   1026                    const OcclusionTracker* occlusion) {
   1027   DCHECK(layer_tree_host_);
   1028   DCHECK_EQ(layer_tree_host_->source_frame_number(),
   1029             paint_properties_.source_frame_number) <<
   1030       "SavePaintProperties must be called for any layer that is painted.";
   1031   return false;
   1032 }
   1033 
   1034 bool Layer::NeedMoreUpdates() {
   1035   return false;
   1036 }
   1037 
   1038 std::string Layer::DebugName() {
   1039   return client_ ? client_->DebugName() : std::string();
   1040 }
   1041 
   1042 scoped_refptr<base::debug::ConvertableToTraceFormat> Layer::TakeDebugInfo() {
   1043   if (client_)
   1044     return client_->TakeDebugInfo();
   1045   else
   1046     return NULL;
   1047 }
   1048 
   1049 
   1050 void Layer::SetCompositingReasons(CompositingReasons reasons) {
   1051   compositing_reasons_ = reasons;
   1052 }
   1053 
   1054 void Layer::CreateRenderSurface() {
   1055   DCHECK(!draw_properties_.render_surface);
   1056   draw_properties_.render_surface = make_scoped_ptr(new RenderSurface(this));
   1057   draw_properties_.render_target = this;
   1058 }
   1059 
   1060 void Layer::ClearRenderSurface() {
   1061   draw_properties_.render_surface.reset();
   1062 }
   1063 
   1064 gfx::Vector2dF Layer::ScrollOffsetForAnimation() const {
   1065   return TotalScrollOffset();
   1066 }
   1067 
   1068 // On<Property>Animated is called due to an ongoing accelerated animation.
   1069 // Since this animation is also being run on the compositor thread, there
   1070 // is no need to request a commit to push this value over, so the value is
   1071 // set directly rather than by calling Set<Property>.
   1072 void Layer::OnFilterAnimated(const FilterOperations& filters) {
   1073   filters_ = filters;
   1074 }
   1075 
   1076 void Layer::OnOpacityAnimated(float opacity) {
   1077   opacity_ = opacity;
   1078 }
   1079 
   1080 void Layer::OnTransformAnimated(const gfx::Transform& transform) {
   1081   transform_ = transform;
   1082 }
   1083 
   1084 void Layer::OnScrollOffsetAnimated(gfx::Vector2dF scroll_offset) {
   1085   // Do nothing. Scroll deltas will be sent from the compositor thread back
   1086   // to the main thread in the same manner as during non-animated
   1087   // compositor-driven scrolling.
   1088 }
   1089 
   1090 void Layer::OnAnimationWaitingForDeletion() {
   1091   // Animations are only deleted during PushProperties.
   1092   SetNeedsPushProperties();
   1093 }
   1094 
   1095 bool Layer::IsActive() const {
   1096   return true;
   1097 }
   1098 
   1099 bool Layer::AddAnimation(scoped_ptr <Animation> animation) {
   1100   if (!layer_animation_controller_->animation_registrar())
   1101     return false;
   1102 
   1103   UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer",
   1104                         !layer_tree_host_);
   1105   layer_animation_controller_->AddAnimation(animation.Pass());
   1106   SetNeedsCommit();
   1107   return true;
   1108 }
   1109 
   1110 void Layer::PauseAnimation(int animation_id, double time_offset) {
   1111   layer_animation_controller_->PauseAnimation(animation_id, time_offset);
   1112   SetNeedsCommit();
   1113 }
   1114 
   1115 void Layer::RemoveAnimation(int animation_id) {
   1116   layer_animation_controller_->RemoveAnimation(animation_id);
   1117   SetNeedsCommit();
   1118 }
   1119 
   1120 void Layer::SetLayerAnimationControllerForTest(
   1121     scoped_refptr<LayerAnimationController> controller) {
   1122   layer_animation_controller_->RemoveValueObserver(this);
   1123   layer_animation_controller_ = controller;
   1124   layer_animation_controller_->AddValueObserver(this);
   1125   SetNeedsCommit();
   1126 }
   1127 
   1128 bool Layer::HasActiveAnimation() const {
   1129   return layer_animation_controller_->HasActiveAnimation();
   1130 }
   1131 
   1132 void Layer::AddLayerAnimationEventObserver(
   1133     LayerAnimationEventObserver* animation_observer) {
   1134   layer_animation_controller_->AddEventObserver(animation_observer);
   1135 }
   1136 
   1137 void Layer::RemoveLayerAnimationEventObserver(
   1138     LayerAnimationEventObserver* animation_observer) {
   1139   layer_animation_controller_->RemoveEventObserver(animation_observer);
   1140 }
   1141 
   1142 Region Layer::VisibleContentOpaqueRegion() const {
   1143   if (contents_opaque())
   1144     return visible_content_rect();
   1145   return Region();
   1146 }
   1147 
   1148 ScrollbarLayerInterface* Layer::ToScrollbarLayer() {
   1149   return NULL;
   1150 }
   1151 
   1152 RenderingStatsInstrumentation* Layer::rendering_stats_instrumentation() const {
   1153   return layer_tree_host_->rendering_stats_instrumentation();
   1154 }
   1155 
   1156 bool Layer::SupportsLCDText() const {
   1157   return false;
   1158 }
   1159 
   1160 void Layer::RemoveFromScrollTree() {
   1161   if (scroll_children_.get()) {
   1162     for (std::set<Layer*>::iterator it = scroll_children_->begin();
   1163         it != scroll_children_->end(); ++it)
   1164       (*it)->scroll_parent_ = NULL;
   1165   }
   1166 
   1167   if (scroll_parent_)
   1168     scroll_parent_->RemoveScrollChild(this);
   1169 
   1170   scroll_parent_ = NULL;
   1171 }
   1172 
   1173 void Layer::RemoveFromClipTree() {
   1174   if (clip_children_.get()) {
   1175     for (std::set<Layer*>::iterator it = clip_children_->begin();
   1176         it != clip_children_->end(); ++it)
   1177       (*it)->clip_parent_ = NULL;
   1178   }
   1179 
   1180   if (clip_parent_)
   1181     clip_parent_->RemoveClipChild(this);
   1182 
   1183   clip_parent_ = NULL;
   1184 }
   1185 
   1186 void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) {
   1187   benchmark->RunOnLayer(this);
   1188 }
   1189 
   1190 }  // namespace cc
   1191