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