Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: ui/compositor/layer.cc

Issue 12226080: Thread ui transform animations (Closed) Base URL: http://git.chromium.org/chromium/src.git@DefineThreadedLayerAnimationElements
Patch Set: Speed up animations in WebContentsViewAuraTest.QuickOverscrollDirectionChange Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_animation_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/compositor/layer.h" 5 #include "ui/compositor/layer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 201
202 void Layer::SetTransform(const gfx::Transform& transform) { 202 void Layer::SetTransform(const gfx::Transform& transform) {
203 GetAnimator()->SetTransform(transform); 203 GetAnimator()->SetTransform(transform);
204 } 204 }
205 205
206 gfx::Transform Layer::GetTargetTransform() const { 206 gfx::Transform Layer::GetTargetTransform() const {
207 if (animator_.get() && animator_->IsAnimatingProperty( 207 if (animator_.get() && animator_->IsAnimatingProperty(
208 LayerAnimationElement::TRANSFORM)) { 208 LayerAnimationElement::TRANSFORM)) {
209 return animator_->GetTargetTransform(); 209 return animator_->GetTargetTransform();
210 } 210 }
211 return transform_; 211 return transform();
212 } 212 }
213 213
214 void Layer::SetBounds(const gfx::Rect& bounds) { 214 void Layer::SetBounds(const gfx::Rect& bounds) {
215 GetAnimator()->SetBounds(bounds); 215 GetAnimator()->SetBounds(bounds);
216 } 216 }
217 217
218 gfx::Rect Layer::GetTargetBounds() const { 218 gfx::Rect Layer::GetTargetBounds() const {
219 if (animator_.get() && animator_->IsAnimatingProperty( 219 if (animator_.get() && animator_->IsAnimatingProperty(
220 LayerAnimationElement::BOUNDS)) { 220 LayerAnimationElement::BOUNDS)) {
221 return animator_->GetTargetBounds(); 221 return animator_->GetTargetBounds();
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 411
412 const Layer* root_layer = GetRoot(source); 412 const Layer* root_layer = GetRoot(source);
413 CHECK_EQ(root_layer, GetRoot(target)); 413 CHECK_EQ(root_layer, GetRoot(target));
414 414
415 if (source != root_layer) 415 if (source != root_layer)
416 source->ConvertPointForAncestor(root_layer, point); 416 source->ConvertPointForAncestor(root_layer, point);
417 if (target != root_layer) 417 if (target != root_layer)
418 target->ConvertPointFromAncestor(root_layer, point); 418 target->ConvertPointFromAncestor(root_layer, point);
419 } 419 }
420 420
421 // static
422 gfx::Transform Layer::ConvertTransformToCCTransform(
423 const gfx::Transform& transform,
424 const gfx::Rect& bounds,
425 float device_scale_factor) {
426 gfx::Transform cc_transform;
427 cc_transform.Scale(device_scale_factor, device_scale_factor);
428 cc_transform.Translate(bounds.x(), bounds.y());
429 cc_transform.PreconcatTransform(transform);
430 cc_transform.Scale(1.0f / device_scale_factor, 1.0f / device_scale_factor);
431 return cc_transform;
432 }
433
421 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { 434 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
422 if (fills_bounds_opaquely_ == fills_bounds_opaquely) 435 if (fills_bounds_opaquely_ == fills_bounds_opaquely)
423 return; 436 return;
424 437
425 fills_bounds_opaquely_ = fills_bounds_opaquely; 438 fills_bounds_opaquely_ = fills_bounds_opaquely;
426 439
427 cc_layer_->SetContentsOpaque(fills_bounds_opaquely); 440 cc_layer_->SetContentsOpaque(fills_bounds_opaquely);
428 } 441 }
429 442
430 void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) { 443 void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
431 if (texture_layer_.get()) 444 if (texture_layer_.get())
432 texture_layer_->willModifyTexture(); 445 texture_layer_->willModifyTexture();
433 // TODO(piman): delegated_renderer_layer_ cleanup. 446 // TODO(piman): delegated_renderer_layer_ cleanup.
434 447
435 cc_layer_->RemoveAllChildren(); 448 cc_layer_->RemoveAllChildren();
436 if (parent_) { 449 if (parent_) {
437 DCHECK(parent_->cc_layer_); 450 DCHECK(parent_->cc_layer_);
438 parent_->cc_layer_->ReplaceChild(cc_layer_, new_layer); 451 parent_->cc_layer_->ReplaceChild(cc_layer_, new_layer);
439 } 452 }
440 cc_layer_->RemoveLayerAnimationEventObserver(this); 453 cc_layer_->RemoveLayerAnimationEventObserver(this);
441 new_layer->SetOpacity(cc_layer_->opacity()); 454 new_layer->SetOpacity(cc_layer_->opacity());
455 new_layer->SetTransform(cc_layer_->transform());
442 456
443 cc_layer_= new_layer; 457 cc_layer_= new_layer;
444 content_layer_ = NULL; 458 content_layer_ = NULL;
445 solid_color_layer_ = NULL; 459 solid_color_layer_ = NULL;
446 texture_layer_ = NULL; 460 texture_layer_ = NULL;
447 delegated_renderer_layer_ = NULL; 461 delegated_renderer_layer_ = NULL;
448 462
449 cc_layer_->AddLayerAnimationEventObserver(this); 463 cc_layer_->AddLayerAnimationEventObserver(this);
450 for (size_t i = 0; i < children_.size(); ++i) { 464 for (size_t i = 0; i < children_.size(); ++i) {
451 DCHECK(children_[i]->cc_layer_); 465 DCHECK(children_[i]->cc_layer_);
(...skipping 18 matching lines...) Expand all
470 cc::TextureLayer::Create(this); 484 cc::TextureLayer::Create(this);
471 new_layer->setFlipped(texture_->flipped()); 485 new_layer->setFlipped(texture_->flipped());
472 SwitchToLayer(new_layer); 486 SwitchToLayer(new_layer);
473 texture_layer_ = new_layer; 487 texture_layer_ = new_layer;
474 } else { 488 } else {
475 scoped_refptr<cc::ContentLayer> new_layer = 489 scoped_refptr<cc::ContentLayer> new_layer =
476 cc::ContentLayer::Create(this); 490 cc::ContentLayer::Create(this);
477 SwitchToLayer(new_layer); 491 SwitchToLayer(new_layer);
478 content_layer_ = new_layer; 492 content_layer_ = new_layer;
479 } 493 }
480 RecomputeTransform();
481 } 494 }
482 RecomputeDrawsContentAndUVRect(); 495 RecomputeDrawsContentAndUVRect();
483 } 496 }
484 497
485 void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame, 498 void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame,
486 gfx::Size frame_size_in_dip) { 499 gfx::Size frame_size_in_dip) {
487 DCHECK_EQ(type_, LAYER_TEXTURED); 500 DCHECK_EQ(type_, LAYER_TEXTURED);
488 bool has_frame = frame.get() && !frame->render_pass_list.empty(); 501 bool has_frame = frame.get() && !frame->render_pass_list.empty();
489 layer_updated_externally_ = has_frame; 502 layer_updated_externally_ = has_frame;
490 delegated_frame_size_in_dip_ = frame_size_in_dip; 503 delegated_frame_size_in_dip_ = frame_size_in_dip;
491 if (!!delegated_renderer_layer_ != has_frame) { 504 if (!!delegated_renderer_layer_ != has_frame) {
492 if (has_frame) { 505 if (has_frame) {
493 scoped_refptr<cc::DelegatedRendererLayer> new_layer = 506 scoped_refptr<cc::DelegatedRendererLayer> new_layer =
494 cc::DelegatedRendererLayer::Create(); 507 cc::DelegatedRendererLayer::Create();
495 SwitchToLayer(new_layer); 508 SwitchToLayer(new_layer);
496 delegated_renderer_layer_ = new_layer; 509 delegated_renderer_layer_ = new_layer;
497 } else { 510 } else {
498 scoped_refptr<cc::ContentLayer> new_layer = 511 scoped_refptr<cc::ContentLayer> new_layer =
499 cc::ContentLayer::Create(this); 512 cc::ContentLayer::Create(this);
500 SwitchToLayer(new_layer); 513 SwitchToLayer(new_layer);
501 content_layer_ = new_layer; 514 content_layer_ = new_layer;
502 } 515 }
503 RecomputeTransform();
504 } 516 }
505 if (has_frame) 517 if (has_frame)
506 delegated_renderer_layer_->SetFrameData(frame.Pass()); 518 delegated_renderer_layer_->SetFrameData(frame.Pass());
507 RecomputeDrawsContentAndUVRect(); 519 RecomputeDrawsContentAndUVRect();
508 } 520 }
509 521
510 void Layer::TakeUnusedResourcesForChildCompositor( 522 void Layer::TakeUnusedResourcesForChildCompositor(
511 cc::TransferableResourceArray* list) { 523 cc::TransferableResourceArray* list) {
512 if (delegated_renderer_layer_) 524 if (delegated_renderer_layer_)
513 delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor(list); 525 delegated_renderer_layer_->TakeUnusedResourcesForChildCompositor(list);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 if (!delegate_) 572 if (!delegate_)
561 return; 573 return;
562 delegate_ = NULL; 574 delegate_ = NULL;
563 for (size_t i = 0; i < children_.size(); ++i) 575 for (size_t i = 0; i < children_.size(); ++i)
564 children_[i]->SuppressPaint(); 576 children_[i]->SuppressPaint();
565 } 577 }
566 578
567 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { 579 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) {
568 if (device_scale_factor_ == device_scale_factor) 580 if (device_scale_factor_ == device_scale_factor)
569 return; 581 return;
582 if (animator_)
583 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM);
584 gfx::Transform transform = this->transform();
570 device_scale_factor_ = device_scale_factor; 585 device_scale_factor_ = device_scale_factor;
571 RecomputeTransform(); 586 RecomputeCCTransformFromTransform(transform);
572 RecomputeDrawsContentAndUVRect(); 587 RecomputeDrawsContentAndUVRect();
573 SchedulePaint(gfx::Rect(bounds_.size())); 588 SchedulePaint(gfx::Rect(bounds_.size()));
574 if (delegate_) 589 if (delegate_)
575 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); 590 delegate_->OnDeviceScaleFactorChanged(device_scale_factor);
576 for (size_t i = 0; i < children_.size(); ++i) 591 for (size_t i = 0; i < children_.size(); ++i)
577 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); 592 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor);
578 if (layer_mask_) 593 if (layer_mask_)
579 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); 594 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor);
580 } 595 }
581 596
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 } 697 }
683 698
684 void Layer::SetBoundsImmediately(const gfx::Rect& bounds) { 699 void Layer::SetBoundsImmediately(const gfx::Rect& bounds) {
685 if (bounds == bounds_) 700 if (bounds == bounds_)
686 return; 701 return;
687 702
688 base::Closure closure; 703 base::Closure closure;
689 if (delegate_) 704 if (delegate_)
690 closure = delegate_->PrepareForLayerBoundsChange(); 705 closure = delegate_->PrepareForLayerBoundsChange();
691 bool was_move = bounds_.size() == bounds.size(); 706 bool was_move = bounds_.size() == bounds.size();
707 gfx::Transform transform = this->transform();
692 bounds_ = bounds; 708 bounds_ = bounds;
693 709
694 RecomputeTransform(); 710 RecomputeCCTransformFromTransform(transform);
695 RecomputeDrawsContentAndUVRect(); 711 RecomputeDrawsContentAndUVRect();
696 if (!closure.is_null()) 712 if (!closure.is_null())
697 closure.Run(); 713 closure.Run();
698 714
699 if (was_move) { 715 if (was_move) {
700 // Don't schedule a draw if we're invisible. We'll schedule one 716 // Don't schedule a draw if we're invisible. We'll schedule one
701 // automatically when we get visible. 717 // automatically when we get visible.
702 if (IsDrawn()) 718 if (IsDrawn())
703 ScheduleDraw(); 719 ScheduleDraw();
704 } else { 720 } else {
705 // Always schedule a paint, even if we're invisible. 721 // Always schedule a paint, even if we're invisible.
706 SchedulePaint(gfx::Rect(bounds.size())); 722 SchedulePaint(gfx::Rect(bounds.size()));
707 } 723 }
708 } 724 }
709 725
710 void Layer::SetTransformImmediately(const gfx::Transform& transform) { 726 void Layer::SetTransformImmediately(const gfx::Transform& transform) {
711 transform_ = transform; 727 RecomputeCCTransformFromTransform(transform);
712
713 RecomputeTransform();
714 } 728 }
715 729
716 void Layer::SetOpacityImmediately(float opacity) { 730 void Layer::SetOpacityImmediately(float opacity) {
717 cc_layer_->SetOpacity(opacity); 731 cc_layer_->SetOpacity(opacity);
718 ScheduleDraw(); 732 ScheduleDraw();
719 } 733 }
720 734
721 void Layer::SetVisibilityImmediately(bool visible) { 735 void Layer::SetVisibilityImmediately(bool visible) {
722 if (visible_ == visible) 736 if (visible_ == visible)
723 return; 737 return;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 } 786 }
773 787
774 void Layer::ScheduleDrawForAnimation() { 788 void Layer::ScheduleDrawForAnimation() {
775 ScheduleDraw(); 789 ScheduleDraw();
776 } 790 }
777 791
778 const gfx::Rect& Layer::GetBoundsForAnimation() const { 792 const gfx::Rect& Layer::GetBoundsForAnimation() const {
779 return bounds(); 793 return bounds();
780 } 794 }
781 795
782 const gfx::Transform& Layer::GetTransformForAnimation() const { 796 gfx::Transform Layer::GetTransformForAnimation() const {
783 return transform(); 797 return transform();
784 } 798 }
785 799
786 float Layer::GetOpacityForAnimation() const { 800 float Layer::GetOpacityForAnimation() const {
787 return opacity(); 801 return opacity();
788 } 802 }
789 803
790 bool Layer::GetVisibilityForAnimation() const { 804 bool Layer::GetVisibilityForAnimation() const {
791 return visible(); 805 return visible();
792 } 806 }
793 807
794 float Layer::GetBrightnessForAnimation() const { 808 float Layer::GetBrightnessForAnimation() const {
795 return layer_brightness(); 809 return layer_brightness();
796 } 810 }
797 811
798 float Layer::GetGrayscaleForAnimation() const { 812 float Layer::GetGrayscaleForAnimation() const {
799 return layer_grayscale(); 813 return layer_grayscale();
800 } 814 }
801 815
802 SkColor Layer::GetColorForAnimation() const { 816 SkColor Layer::GetColorForAnimation() const {
803 // WebColor is equivalent to SkColor, per WebColor.h. 817 // WebColor is equivalent to SkColor, per WebColor.h.
804 // The NULL check is here since this is invoked regardless of whether we have 818 // The NULL check is here since this is invoked regardless of whether we have
805 // been configured as LAYER_SOLID_COLOR. 819 // been configured as LAYER_SOLID_COLOR.
806 return solid_color_layer_.get() ? 820 return solid_color_layer_.get() ?
807 solid_color_layer_->background_color() : SK_ColorBLACK; 821 solid_color_layer_->background_color() : SK_ColorBLACK;
808 } 822 }
809 823
824 float Layer::GetDeviceScaleFactor() const {
825 return device_scale_factor_;
826 }
827
810 void Layer::AddThreadedAnimation(scoped_ptr<cc::Animation> animation) { 828 void Layer::AddThreadedAnimation(scoped_ptr<cc::Animation> animation) {
811 DCHECK(cc_layer_); 829 DCHECK(cc_layer_);
812 // Until this layer has a compositor (and hence cc_layer_ has a 830 // Until this layer has a compositor (and hence cc_layer_ has a
813 // LayerTreeHost), addAnimation will fail. 831 // LayerTreeHost), addAnimation will fail.
814 if (GetCompositor()) 832 if (GetCompositor())
815 cc_layer_->AddAnimation(animation.Pass()); 833 cc_layer_->AddAnimation(animation.Pass());
816 else 834 else
817 pending_threaded_animations_.push_back(animation.Pass()); 835 pending_threaded_animations_.push_back(animation.Pass());
818 } 836 }
819 837
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 } else { 886 } else {
869 content_layer_ = cc::ContentLayer::Create(this); 887 content_layer_ = cc::ContentLayer::Create(this);
870 cc_layer_ = content_layer_.get(); 888 cc_layer_ = content_layer_.get();
871 } 889 }
872 cc_layer_->SetAnchorPoint(gfx::PointF()); 890 cc_layer_->SetAnchorPoint(gfx::PointF());
873 cc_layer_->SetContentsOpaque(true); 891 cc_layer_->SetContentsOpaque(true);
874 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); 892 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN);
875 cc_layer_->AddLayerAnimationEventObserver(this); 893 cc_layer_->AddLayerAnimationEventObserver(this);
876 } 894 }
877 895
878 void Layer::RecomputeTransform() { 896 void Layer::RecomputeCCTransformFromTransform(const gfx::Transform& transform) {
879 gfx::Transform scale_translate; 897 cc_layer_->SetTransform(ConvertTransformToCCTransform(transform,
880 scale_translate.matrix().set3x3(device_scale_factor_, 0, 0, 898 bounds_,
881 0, device_scale_factor_, 0, 899 device_scale_factor_));
882 0, 0, 1); 900 }
883 // Start with the inverse matrix of above. 901
902 gfx::Transform Layer::transform() const {
884 gfx::Transform transform; 903 gfx::Transform transform;
885 transform.matrix().set3x3(1.0f / device_scale_factor_, 0, 0, 904 transform.Translate(-bounds_.x(), -bounds_.y());
886 0, 1.0f / device_scale_factor_, 0, 905 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_);
887 0, 0, 1); 906 transform.PreconcatTransform(cc_layer_->transform());
888 transform.ConcatTransform(transform_); 907 transform.Scale(device_scale_factor_, device_scale_factor_);
889 gfx::Transform translate; 908 return transform;
890 translate.Translate(bounds_.x(), bounds_.y());
891 transform.ConcatTransform(translate);
892 transform.ConcatTransform(scale_translate);
893 cc_layer_->SetTransform(transform);
894 } 909 }
895 910
896 void Layer::RecomputeDrawsContentAndUVRect() { 911 void Layer::RecomputeDrawsContentAndUVRect() {
897 DCHECK(cc_layer_); 912 DCHECK(cc_layer_);
898 gfx::Size size(bounds_.size()); 913 gfx::Size size(bounds_.size());
899 if (texture_layer_.get()) { 914 if (texture_layer_.get()) {
900 DCHECK(texture_); 915 DCHECK(texture_);
901 916
902 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); 917 float texture_scale_factor = 1.0f / texture_->device_scale_factor();
903 gfx::Size texture_size = gfx::ToFlooredSize( 918 gfx::Size texture_size = gfx::ToFlooredSize(
904 gfx::ScaleSize(texture_->size(), texture_scale_factor)); 919 gfx::ScaleSize(texture_->size(), texture_scale_factor));
905 size.ClampToMax(texture_size); 920 size.ClampToMax(texture_size);
906 921
907 gfx::PointF uv_top_left(0.f, 0.f); 922 gfx::PointF uv_top_left(0.f, 0.f);
908 gfx::PointF uv_bottom_right( 923 gfx::PointF uv_bottom_right(
909 static_cast<float>(size.width())/texture_size.width(), 924 static_cast<float>(size.width())/texture_size.width(),
910 static_cast<float>(size.height())/texture_size.height()); 925 static_cast<float>(size.height())/texture_size.height());
911 texture_layer_->setUV(uv_top_left, uv_bottom_right); 926 texture_layer_->setUV(uv_top_left, uv_bottom_right);
912 } else if (delegated_renderer_layer_.get()) { 927 } else if (delegated_renderer_layer_.get()) {
913 delegated_renderer_layer_->SetDisplaySize( 928 delegated_renderer_layer_->SetDisplaySize(
914 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); 929 ConvertSizeToPixel(this, delegated_frame_size_in_dip_));
915 size.ClampToMax(delegated_frame_size_in_dip_); 930 size.ClampToMax(delegated_frame_size_in_dip_);
916 } 931 }
917 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); 932 cc_layer_->SetBounds(ConvertSizeToPixel(this, size));
918 } 933 }
919 934
920 } // namespace ui 935 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_animation_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698