OLD | NEW |
1 // Copyright 2010 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/layer.h" | 5 #include "cc/layers/layer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/atomic_sequence_num.h" | 9 #include "base/atomic_sequence_num.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "base/trace_event/trace_event.h" | 14 #include "base/trace_event/trace_event.h" |
15 #include "cc/animation/animation.h" | |
16 #include "cc/animation/animation_events.h" | |
17 #include "cc/animation/animation_registrar.h" | |
18 #include "cc/animation/keyframed_animation_curve.h" | |
19 #include "cc/animation/layer_animation_controller.h" | |
20 #include "cc/base/simple_enclosed_region.h" | 15 #include "cc/base/simple_enclosed_region.h" |
21 #include "cc/debug/frame_viewer_instrumentation.h" | 16 #include "cc/debug/frame_viewer_instrumentation.h" |
22 #include "cc/layers/layer_client.h" | 17 #include "cc/layers/layer_client.h" |
23 #include "cc/layers/layer_impl.h" | 18 #include "cc/layers/layer_impl.h" |
24 #include "cc/layers/scrollbar_layer_interface.h" | 19 #include "cc/layers/scrollbar_layer_interface.h" |
25 #include "cc/output/copy_output_request.h" | 20 #include "cc/output/copy_output_request.h" |
26 #include "cc/output/copy_output_result.h" | 21 #include "cc/output/copy_output_result.h" |
27 #include "cc/trees/layer_tree_host.h" | 22 #include "cc/trees/layer_tree_host.h" |
28 #include "cc/trees/layer_tree_impl.h" | 23 #include "cc/trees/layer_tree_impl.h" |
29 #include "third_party/skia/include/core/SkImageFilter.h" | 24 #include "third_party/skia/include/core/SkImageFilter.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 } | 81 } |
87 | 82 |
88 Layer::~Layer() { | 83 Layer::~Layer() { |
89 // Our parent should be holding a reference to us so there should be no | 84 // Our parent should be holding a reference to us so there should be no |
90 // way for us to be destroyed while we still have a parent. | 85 // way for us to be destroyed while we still have a parent. |
91 DCHECK(!parent()); | 86 DCHECK(!parent()); |
92 // Similarly we shouldn't have a layer tree host since it also keeps a | 87 // Similarly we shouldn't have a layer tree host since it also keeps a |
93 // reference to us. | 88 // reference to us. |
94 DCHECK(!layer_tree_host()); | 89 DCHECK(!layer_tree_host()); |
95 | 90 |
96 if (layer_animation_controller_) { | |
97 layer_animation_controller_->RemoveValueObserver(this); | |
98 layer_animation_controller_->remove_value_provider(this); | |
99 } | |
100 | |
101 RemoveFromScrollTree(); | 91 RemoveFromScrollTree(); |
102 RemoveFromClipTree(); | 92 RemoveFromClipTree(); |
103 | 93 |
104 // Remove the parent reference from all children and dependents. | 94 // Remove the parent reference from all children and dependents. |
105 RemoveAllChildren(); | 95 RemoveAllChildren(); |
106 if (mask_layer_.get()) { | 96 if (mask_layer_.get()) { |
107 DCHECK_EQ(this, mask_layer_->parent()); | 97 DCHECK_EQ(this, mask_layer_->parent()); |
108 mask_layer_->RemoveFromParent(); | 98 mask_layer_->RemoveFromParent(); |
109 } | 99 } |
110 if (replica_layer_.get()) { | 100 if (replica_layer_.get()) { |
(...skipping 20 matching lines...) Expand all Loading... |
131 | 121 |
132 for (size_t i = 0; i < children_.size(); ++i) | 122 for (size_t i = 0; i < children_.size(); ++i) |
133 children_[i]->SetLayerTreeHost(host); | 123 children_[i]->SetLayerTreeHost(host); |
134 | 124 |
135 if (mask_layer_.get()) | 125 if (mask_layer_.get()) |
136 mask_layer_->SetLayerTreeHost(host); | 126 mask_layer_->SetLayerTreeHost(host); |
137 if (replica_layer_.get()) | 127 if (replica_layer_.get()) |
138 replica_layer_->SetLayerTreeHost(host); | 128 replica_layer_->SetLayerTreeHost(host); |
139 | 129 |
140 if (host) { | 130 if (host) { |
141 RegisterForAnimations(host->animation_registrar(), host->settings()); | |
142 if (host->settings().layer_transforms_should_scale_layer_contents) | 131 if (host->settings().layer_transforms_should_scale_layer_contents) |
143 reset_raster_scale_to_unknown(); | 132 reset_raster_scale_to_unknown(); |
144 } | 133 } |
145 | 134 |
146 bool has_any_animation = false; | 135 bool has_any_animation = false; |
147 if (layer_animation_controller_) | 136 if (layer_tree_host_) |
148 has_any_animation = layer_animation_controller_->has_any_animation(); | |
149 else if (layer_tree_host_) | |
150 has_any_animation = layer_tree_host_->HasAnyAnimation(this); | 137 has_any_animation = layer_tree_host_->HasAnyAnimation(this); |
151 | 138 |
152 if (host && has_any_animation) | 139 if (host && has_any_animation) |
153 host->SetNeedsCommit(); | 140 host->SetNeedsCommit(); |
154 } | 141 } |
155 | 142 |
156 void Layer::SetNeedsUpdate() { | 143 void Layer::SetNeedsUpdate() { |
157 if (layer_tree_host_ && !ignore_set_needs_commit_) | 144 if (layer_tree_host_ && !ignore_set_needs_commit_) |
158 layer_tree_host_->SetNeedsUpdateLayers(); | 145 layer_tree_host_->SetNeedsUpdateLayers(); |
159 } | 146 } |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 void Layer::SetFilters(const FilterOperations& filters) { | 494 void Layer::SetFilters(const FilterOperations& filters) { |
508 DCHECK(IsPropertyChangeAllowed()); | 495 DCHECK(IsPropertyChangeAllowed()); |
509 if (filters_ == filters) | 496 if (filters_ == filters) |
510 return; | 497 return; |
511 filters_ = filters; | 498 filters_ = filters; |
512 SetNeedsCommit(); | 499 SetNeedsCommit(); |
513 } | 500 } |
514 | 501 |
515 bool Layer::FilterIsAnimating() const { | 502 bool Layer::FilterIsAnimating() const { |
516 DCHECK(layer_tree_host_); | 503 DCHECK(layer_tree_host_); |
517 return layer_animation_controller_ | 504 return layer_tree_host_->IsAnimatingFilterProperty(this); |
518 ? layer_animation_controller_->IsAnimatingProperty( | |
519 Animation::FILTER) | |
520 : layer_tree_host_->IsAnimatingFilterProperty(this); | |
521 } | 505 } |
522 | 506 |
523 void Layer::SetBackgroundFilters(const FilterOperations& filters) { | 507 void Layer::SetBackgroundFilters(const FilterOperations& filters) { |
524 DCHECK(IsPropertyChangeAllowed()); | 508 DCHECK(IsPropertyChangeAllowed()); |
525 if (background_filters_ == filters) | 509 if (background_filters_ == filters) |
526 return; | 510 return; |
527 background_filters_ = filters; | 511 background_filters_ = filters; |
528 SetNeedsCommit(); | 512 SetNeedsCommit(); |
529 } | 513 } |
530 | 514 |
531 void Layer::SetOpacity(float opacity) { | 515 void Layer::SetOpacity(float opacity) { |
532 DCHECK(IsPropertyChangeAllowed()); | 516 DCHECK(IsPropertyChangeAllowed()); |
533 if (opacity_ == opacity) | 517 if (opacity_ == opacity) |
534 return; | 518 return; |
535 opacity_ = opacity; | 519 opacity_ = opacity; |
536 SetNeedsCommit(); | 520 SetNeedsCommit(); |
537 } | 521 } |
538 | 522 |
539 bool Layer::OpacityIsAnimating() const { | 523 bool Layer::OpacityIsAnimating() const { |
540 DCHECK(layer_tree_host_); | 524 DCHECK(layer_tree_host_); |
541 return layer_animation_controller_ | 525 return layer_tree_host_->IsAnimatingOpacityProperty(this); |
542 ? layer_animation_controller_->IsAnimatingProperty( | |
543 Animation::OPACITY) | |
544 : layer_tree_host_->IsAnimatingOpacityProperty(this); | |
545 } | 526 } |
546 | 527 |
547 bool Layer::HasPotentiallyRunningOpacityAnimation() const { | 528 bool Layer::HasPotentiallyRunningOpacityAnimation() const { |
548 if (layer_animation_controller_) { | 529 DCHECK(layer_tree_host_); |
549 if (Animation* animation = | 530 return layer_tree_host_->HasPotentiallyRunningOpacityAnimation(this); |
550 layer_animation_controller()->GetAnimation(Animation::OPACITY)) { | |
551 return !animation->is_finished(); | |
552 } | |
553 return false; | |
554 } else { | |
555 DCHECK(layer_tree_host_); | |
556 return layer_tree_host_->HasPotentiallyRunningOpacityAnimation(this); | |
557 } | |
558 } | 531 } |
559 | 532 |
560 bool Layer::OpacityCanAnimateOnImplThread() const { | 533 bool Layer::OpacityCanAnimateOnImplThread() const { |
561 return false; | 534 return false; |
562 } | 535 } |
563 | 536 |
564 void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { | 537 void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { |
565 DCHECK(IsPropertyChangeAllowed()); | 538 DCHECK(IsPropertyChangeAllowed()); |
566 if (blend_mode_ == blend_mode) | 539 if (blend_mode_ == blend_mode) |
567 return; | 540 return; |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 SetNeedsCommitNoRebuild(); | 705 SetNeedsCommitNoRebuild(); |
733 return; | 706 return; |
734 } | 707 } |
735 } | 708 } |
736 | 709 |
737 SetNeedsCommit(); | 710 SetNeedsCommit(); |
738 } | 711 } |
739 | 712 |
740 bool Layer::AnimationsPreserveAxisAlignment() const { | 713 bool Layer::AnimationsPreserveAxisAlignment() const { |
741 DCHECK(layer_tree_host_); | 714 DCHECK(layer_tree_host_); |
742 return layer_animation_controller_ | 715 return layer_tree_host_->AnimationsPreserveAxisAlignment(this); |
743 ? layer_animation_controller_->AnimationsPreserveAxisAlignment() | |
744 : layer_tree_host_->AnimationsPreserveAxisAlignment(this); | |
745 } | 716 } |
746 | 717 |
747 bool Layer::TransformIsAnimating() const { | 718 bool Layer::TransformIsAnimating() const { |
748 DCHECK(layer_tree_host_); | 719 DCHECK(layer_tree_host_); |
749 return layer_animation_controller_ | 720 return layer_tree_host_->IsAnimatingTransformProperty(this); |
750 ? layer_animation_controller_->IsAnimatingProperty( | |
751 Animation::TRANSFORM) | |
752 : layer_tree_host_->IsAnimatingTransformProperty(this); | |
753 } | 721 } |
754 | 722 |
755 bool Layer::HasPotentiallyRunningTransformAnimation() const { | 723 bool Layer::HasPotentiallyRunningTransformAnimation() const { |
756 if (layer_animation_controller_) { | 724 DCHECK(layer_tree_host_); |
757 if (Animation* animation = | 725 return layer_tree_host_->HasPotentiallyRunningTransformAnimation(this); |
758 layer_animation_controller()->GetAnimation(Animation::TRANSFORM)) { | |
759 return !animation->is_finished(); | |
760 } | |
761 return false; | |
762 } else { | |
763 DCHECK(layer_tree_host_); | |
764 return layer_tree_host_->HasPotentiallyRunningTransformAnimation(this); | |
765 } | |
766 } | 726 } |
767 | 727 |
768 bool Layer::ScrollOffsetAnimationWasInterrupted() const { | 728 bool Layer::ScrollOffsetAnimationWasInterrupted() const { |
769 DCHECK(layer_tree_host_); | 729 DCHECK(layer_tree_host_); |
770 return layer_animation_controller_ | 730 return layer_tree_host_->ScrollOffsetAnimationWasInterrupted(this); |
771 ? layer_animation_controller_ | |
772 ->scroll_offset_animation_was_interrupted() | |
773 : layer_tree_host_->ScrollOffsetAnimationWasInterrupted(this); | |
774 } | 731 } |
775 | 732 |
776 void Layer::SetScrollParent(Layer* parent) { | 733 void Layer::SetScrollParent(Layer* parent) { |
777 DCHECK(IsPropertyChangeAllowed()); | 734 DCHECK(IsPropertyChangeAllowed()); |
778 if (scroll_parent_ == parent) | 735 if (scroll_parent_ == parent) |
779 return; | 736 return; |
780 | 737 |
781 if (scroll_parent_) | 738 if (scroll_parent_) |
782 scroll_parent_->RemoveScrollChild(this); | 739 scroll_parent_->RemoveScrollChild(this); |
783 | 740 |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1226 | 1183 |
1227 // If the main thread commits multiple times before the impl thread actually | 1184 // If the main thread commits multiple times before the impl thread actually |
1228 // draws, then damage tracking will become incorrect if we simply clobber the | 1185 // draws, then damage tracking will become incorrect if we simply clobber the |
1229 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. | 1186 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. |
1230 // union) any update changes that have occurred on the main thread. | 1187 // union) any update changes that have occurred on the main thread. |
1231 update_rect_.Union(layer->update_rect()); | 1188 update_rect_.Union(layer->update_rect()); |
1232 layer->SetUpdateRect(update_rect_); | 1189 layer->SetUpdateRect(update_rect_); |
1233 | 1190 |
1234 layer->SetStackingOrderChanged(stacking_order_changed_); | 1191 layer->SetStackingOrderChanged(stacking_order_changed_); |
1235 | 1192 |
1236 if (layer->layer_animation_controller() && layer_animation_controller_) | |
1237 layer_animation_controller_->PushAnimationUpdatesTo( | |
1238 layer->layer_animation_controller()); | |
1239 | |
1240 if (frame_timing_requests_dirty_) { | 1193 if (frame_timing_requests_dirty_) { |
1241 layer->PassFrameTimingRequests(&frame_timing_requests_); | 1194 layer->PassFrameTimingRequests(&frame_timing_requests_); |
1242 frame_timing_requests_dirty_ = false; | 1195 frame_timing_requests_dirty_ = false; |
1243 } | 1196 } |
1244 | 1197 |
1245 // Reset any state that should be cleared for the next update. | 1198 // Reset any state that should be cleared for the next update. |
1246 stacking_order_changed_ = false; | 1199 stacking_order_changed_ = false; |
1247 update_rect_ = gfx::Rect(); | 1200 update_rect_ = gfx::Rect(); |
1248 | 1201 |
1249 needs_push_properties_ = false; | 1202 needs_push_properties_ = false; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1383 node->data.local = transform; | 1336 node->data.local = transform; |
1384 node->data.needs_local_transform_update = true; | 1337 node->data.needs_local_transform_update = true; |
1385 node->data.is_animated = true; | 1338 node->data.is_animated = true; |
1386 layer_tree_host_->property_trees()->transform_tree.set_needs_update( | 1339 layer_tree_host_->property_trees()->transform_tree.set_needs_update( |
1387 true); | 1340 true); |
1388 } | 1341 } |
1389 } | 1342 } |
1390 } | 1343 } |
1391 } | 1344 } |
1392 | 1345 |
1393 void Layer::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) { | |
1394 // Do nothing. Scroll deltas will be sent from the compositor thread back | |
1395 // to the main thread in the same manner as during non-animated | |
1396 // compositor-driven scrolling. | |
1397 } | |
1398 | |
1399 void Layer::OnAnimationWaitingForDeletion() { | |
1400 // Animations are only deleted during PushProperties. | |
1401 SetNeedsPushProperties(); | |
1402 } | |
1403 | |
1404 bool Layer::IsActive() const { | |
1405 return true; | |
1406 } | |
1407 | |
1408 bool Layer::AddAnimation(scoped_ptr <Animation> animation) { | |
1409 if (!layer_animation_controller_ || | |
1410 !layer_animation_controller_->animation_registrar()) | |
1411 return false; | |
1412 | |
1413 if (animation->target_property() == Animation::SCROLL_OFFSET && | |
1414 !layer_animation_controller_->animation_registrar() | |
1415 ->supports_scroll_animations()) | |
1416 return false; | |
1417 | |
1418 UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer", | |
1419 !layer_tree_host_); | |
1420 layer_animation_controller_->AddAnimation(animation.Pass()); | |
1421 SetNeedsCommit(); | |
1422 return true; | |
1423 } | |
1424 | |
1425 void Layer::PauseAnimation(int animation_id, double time_offset) { | |
1426 DCHECK(layer_animation_controller_); | |
1427 layer_animation_controller_->PauseAnimation( | |
1428 animation_id, base::TimeDelta::FromSecondsD(time_offset)); | |
1429 SetNeedsCommit(); | |
1430 } | |
1431 | |
1432 void Layer::RemoveAnimation(int animation_id) { | |
1433 DCHECK(layer_animation_controller_); | |
1434 layer_animation_controller_->RemoveAnimation(animation_id); | |
1435 SetNeedsCommit(); | |
1436 } | |
1437 | |
1438 void Layer::RemoveAnimation(int animation_id, | |
1439 Animation::TargetProperty property) { | |
1440 DCHECK(layer_animation_controller_); | |
1441 layer_animation_controller_->RemoveAnimation(animation_id, property); | |
1442 SetNeedsCommit(); | |
1443 } | |
1444 | |
1445 void Layer::SetLayerAnimationControllerForTest( | |
1446 scoped_refptr<LayerAnimationController> controller) { | |
1447 DCHECK(layer_animation_controller_); | |
1448 layer_animation_controller_->RemoveValueObserver(this); | |
1449 layer_animation_controller_ = controller; | |
1450 layer_animation_controller_->AddValueObserver(this); | |
1451 SetNeedsCommit(); | |
1452 } | |
1453 | |
1454 bool Layer::HasActiveAnimation() const { | 1346 bool Layer::HasActiveAnimation() const { |
1455 DCHECK(layer_tree_host_); | 1347 DCHECK(layer_tree_host_); |
1456 return layer_animation_controller_ | 1348 return layer_tree_host_->HasActiveAnimation(this); |
1457 ? layer_animation_controller_->HasActiveAnimation() | |
1458 : layer_tree_host_->HasActiveAnimation(this); | |
1459 } | |
1460 | |
1461 void Layer::RegisterForAnimations(AnimationRegistrar* registrar, | |
1462 const LayerTreeSettings& settings) { | |
1463 if (!settings.use_compositor_animation_timelines && | |
1464 !layer_animation_controller_) { | |
1465 layer_animation_controller_ = LayerAnimationController::Create(layer_id_); | |
1466 layer_animation_controller_->AddValueObserver(this); | |
1467 layer_animation_controller_->set_value_provider(this); | |
1468 } | |
1469 | |
1470 if (layer_animation_controller_) | |
1471 layer_animation_controller_->SetAnimationRegistrar(registrar); | |
1472 } | |
1473 | |
1474 void Layer::AddLayerAnimationEventObserver( | |
1475 LayerAnimationEventObserver* animation_observer) { | |
1476 DCHECK(layer_animation_controller_); | |
1477 layer_animation_controller_->AddEventObserver(animation_observer); | |
1478 } | |
1479 | |
1480 void Layer::RemoveLayerAnimationEventObserver( | |
1481 LayerAnimationEventObserver* animation_observer) { | |
1482 DCHECK(layer_animation_controller_); | |
1483 layer_animation_controller_->RemoveEventObserver(animation_observer); | |
1484 } | 1349 } |
1485 | 1350 |
1486 SimpleEnclosedRegion Layer::VisibleContentOpaqueRegion() const { | 1351 SimpleEnclosedRegion Layer::VisibleContentOpaqueRegion() const { |
1487 if (contents_opaque()) | 1352 if (contents_opaque()) |
1488 return SimpleEnclosedRegion(visible_content_rect()); | 1353 return SimpleEnclosedRegion(visible_content_rect()); |
1489 return SimpleEnclosedRegion(); | 1354 return SimpleEnclosedRegion(); |
1490 } | 1355 } |
1491 | 1356 |
1492 ScrollbarLayerInterface* Layer::ToScrollbarLayer() { | 1357 ScrollbarLayerInterface* Layer::ToScrollbarLayer() { |
1493 return nullptr; | 1358 return nullptr; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 | 1412 |
1548 void Layer::DidBeginTracing() { | 1413 void Layer::DidBeginTracing() { |
1549 // We'll be dumping layer trees as part of trace, so make sure | 1414 // We'll be dumping layer trees as part of trace, so make sure |
1550 // PushPropertiesTo() propagates layer debug info to the impl | 1415 // PushPropertiesTo() propagates layer debug info to the impl |
1551 // side -- otherwise this won't happen for the the layers that | 1416 // side -- otherwise this won't happen for the the layers that |
1552 // remain unchanged since tracing started. | 1417 // remain unchanged since tracing started. |
1553 SetNeedsPushProperties(); | 1418 SetNeedsPushProperties(); |
1554 } | 1419 } |
1555 | 1420 |
1556 } // namespace cc | 1421 } // namespace cc |
OLD | NEW |