OLD | NEW |
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 layer_grayscale_(0.0f), | 70 layer_grayscale_(0.0f), |
71 layer_inverted_(false), | 71 layer_inverted_(false), |
72 layer_mask_(NULL), | 72 layer_mask_(NULL), |
73 layer_mask_back_link_(NULL), | 73 layer_mask_back_link_(NULL), |
74 zoom_(1), | 74 zoom_(1), |
75 zoom_inset_(0), | 75 zoom_inset_(0), |
76 delegate_(NULL), | 76 delegate_(NULL), |
77 owner_(NULL), | 77 owner_(NULL), |
78 cc_layer_(NULL), | 78 cc_layer_(NULL), |
79 device_scale_factor_(1.0f) { | 79 device_scale_factor_(1.0f) { |
80 CreateWebLayer(); | 80 CreateCcLayer(); |
81 } | 81 } |
82 | 82 |
83 Layer::Layer(LayerType type) | 83 Layer::Layer(LayerType type) |
84 : type_(type), | 84 : type_(type), |
85 compositor_(NULL), | 85 compositor_(NULL), |
86 parent_(NULL), | 86 parent_(NULL), |
87 visible_(true), | 87 visible_(true), |
88 force_render_surface_(false), | 88 force_render_surface_(false), |
89 fills_bounds_opaquely_(true), | 89 fills_bounds_opaquely_(true), |
90 fills_bounds_completely_(false), | 90 fills_bounds_completely_(false), |
91 background_blur_radius_(0), | 91 background_blur_radius_(0), |
92 layer_saturation_(0.0f), | 92 layer_saturation_(0.0f), |
93 layer_brightness_(0.0f), | 93 layer_brightness_(0.0f), |
94 layer_grayscale_(0.0f), | 94 layer_grayscale_(0.0f), |
95 layer_inverted_(false), | 95 layer_inverted_(false), |
96 layer_mask_(NULL), | 96 layer_mask_(NULL), |
97 layer_mask_back_link_(NULL), | 97 layer_mask_back_link_(NULL), |
98 zoom_(1), | 98 zoom_(1), |
99 zoom_inset_(0), | 99 zoom_inset_(0), |
100 delegate_(NULL), | 100 delegate_(NULL), |
101 owner_(NULL), | 101 owner_(NULL), |
102 cc_layer_(NULL), | 102 cc_layer_(NULL), |
103 device_scale_factor_(1.0f) { | 103 device_scale_factor_(1.0f) { |
104 CreateWebLayer(); | 104 CreateCcLayer(); |
105 } | 105 } |
106 | 106 |
107 Layer::~Layer() { | 107 Layer::~Layer() { |
108 // Destroying the animator may cause observers to use the layer (and | 108 // Destroying the animator may cause observers to use the layer (and |
109 // indirectly the WebLayer). Destroy the animator first so that the WebLayer | 109 // indirectly the WebLayer). Destroy the animator first so that the WebLayer |
110 // is still around. | 110 // is still around. |
111 if (animator_.get()) | 111 if (animator_.get()) |
112 animator_->SetDelegate(NULL); | 112 animator_->SetDelegate(NULL); |
113 animator_ = NULL; | 113 animator_ = NULL; |
114 if (compositor_) | 114 if (compositor_) |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 | 484 |
485 cc_layer_->RemoveAllChildren(); | 485 cc_layer_->RemoveAllChildren(); |
486 if (cc_layer_->parent()) { | 486 if (cc_layer_->parent()) { |
487 cc_layer_->parent()->ReplaceChild(cc_layer_, new_layer); | 487 cc_layer_->parent()->ReplaceChild(cc_layer_, new_layer); |
488 } | 488 } |
489 cc_layer_->SetLayerClient(NULL); | 489 cc_layer_->SetLayerClient(NULL); |
490 cc_layer_->RemoveLayerAnimationEventObserver(this); | 490 cc_layer_->RemoveLayerAnimationEventObserver(this); |
491 new_layer->SetOpacity(cc_layer_->opacity()); | 491 new_layer->SetOpacity(cc_layer_->opacity()); |
492 new_layer->SetTransform(cc_layer_->transform()); | 492 new_layer->SetTransform(cc_layer_->transform()); |
493 new_layer->SetPosition(cc_layer_->position()); | 493 new_layer->SetPosition(cc_layer_->position()); |
| 494 new_layer->SetBackgroundColor(cc_layer_->background_color()); |
494 | 495 |
495 cc_layer_ = new_layer.get(); | 496 cc_layer_ = new_layer.get(); |
496 content_layer_ = NULL; | 497 content_layer_ = NULL; |
497 solid_color_layer_ = NULL; | 498 solid_color_layer_ = NULL; |
498 texture_layer_ = NULL; | 499 texture_layer_ = NULL; |
499 delegated_renderer_layer_ = NULL; | 500 delegated_renderer_layer_ = NULL; |
500 surface_layer_ = NULL; | 501 surface_layer_ = NULL; |
501 | 502 |
502 cc_layer_->AddLayerAnimationEventObserver(this); | 503 cc_layer_->AddLayerAnimationEventObserver(this); |
503 for (size_t i = 0; i < children_.size(); ++i) { | 504 for (size_t i = 0; i < children_.size(); ++i) { |
(...skipping 18 matching lines...) Expand all Loading... |
522 else | 523 else |
523 new_layer = cc::ContentLayer::Create(this); | 524 new_layer = cc::ContentLayer::Create(this); |
524 SwitchToLayer(new_layer); | 525 SwitchToLayer(new_layer); |
525 content_layer_ = new_layer; | 526 content_layer_ = new_layer; |
526 } | 527 } |
527 | 528 |
528 void Layer::SetTextureMailbox( | 529 void Layer::SetTextureMailbox( |
529 const cc::TextureMailbox& mailbox, | 530 const cc::TextureMailbox& mailbox, |
530 scoped_ptr<cc::SingleReleaseCallback> release_callback, | 531 scoped_ptr<cc::SingleReleaseCallback> release_callback, |
531 gfx::Size texture_size_in_dip) { | 532 gfx::Size texture_size_in_dip) { |
532 DCHECK_EQ(type_, LAYER_TEXTURED); | 533 DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR); |
533 DCHECK(!solid_color_layer_.get()); | |
534 DCHECK(mailbox.IsValid()); | 534 DCHECK(mailbox.IsValid()); |
535 DCHECK(release_callback); | 535 DCHECK(release_callback); |
536 if (!texture_layer_.get()) { | 536 if (!texture_layer_.get()) { |
537 scoped_refptr<cc::TextureLayer> new_layer = | 537 scoped_refptr<cc::TextureLayer> new_layer = |
538 cc::TextureLayer::CreateForMailbox(this); | 538 cc::TextureLayer::CreateForMailbox(this); |
539 new_layer->SetFlipped(true); | 539 new_layer->SetFlipped(true); |
540 SwitchToLayer(new_layer); | 540 SwitchToLayer(new_layer); |
541 texture_layer_ = new_layer; | 541 texture_layer_ = new_layer; |
542 } | 542 } |
543 if (mailbox_release_callback_) | 543 if (mailbox_release_callback_) |
544 mailbox_release_callback_->Run(0, false); | 544 mailbox_release_callback_->Run(0, false); |
545 mailbox_release_callback_ = release_callback.Pass(); | 545 mailbox_release_callback_ = release_callback.Pass(); |
546 mailbox_ = mailbox; | 546 mailbox_ = mailbox; |
547 SetTextureSize(texture_size_in_dip); | 547 SetTextureSize(texture_size_in_dip); |
548 } | 548 } |
549 | 549 |
550 void Layer::SetTextureSize(gfx::Size texture_size_in_dip) { | 550 void Layer::SetTextureSize(gfx::Size texture_size_in_dip) { |
551 DCHECK(texture_layer_.get()); | 551 DCHECK(texture_layer_.get()); |
552 if (frame_size_in_dip_ == texture_size_in_dip) | 552 if (frame_size_in_dip_ == texture_size_in_dip) |
553 return; | 553 return; |
554 frame_size_in_dip_ = texture_size_in_dip; | 554 frame_size_in_dip_ = texture_size_in_dip; |
555 RecomputeDrawsContentAndUVRect(); | 555 RecomputeDrawsContentAndUVRect(); |
556 texture_layer_->SetNeedsDisplay(); | 556 texture_layer_->SetNeedsDisplay(); |
557 } | 557 } |
558 | 558 |
559 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, | 559 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, |
560 gfx::Size frame_size_in_dip) { | 560 gfx::Size frame_size_in_dip) { |
561 DCHECK_EQ(type_, LAYER_TEXTURED); | 561 DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR); |
562 | 562 |
563 scoped_refptr<cc::DelegatedRendererLayer> new_layer = | 563 scoped_refptr<cc::DelegatedRendererLayer> new_layer = |
564 cc::DelegatedRendererLayer::Create(frame_provider); | 564 cc::DelegatedRendererLayer::Create(frame_provider); |
565 SwitchToLayer(new_layer); | 565 SwitchToLayer(new_layer); |
566 delegated_renderer_layer_ = new_layer; | 566 delegated_renderer_layer_ = new_layer; |
567 | 567 |
568 frame_size_in_dip_ = frame_size_in_dip; | 568 frame_size_in_dip_ = frame_size_in_dip; |
569 RecomputeDrawsContentAndUVRect(); | 569 RecomputeDrawsContentAndUVRect(); |
570 } | 570 } |
571 | 571 |
572 void Layer::SetShowSurface(cc::SurfaceId id, gfx::Size frame_size_in_dip) { | 572 void Layer::SetShowSurface(cc::SurfaceId id, gfx::Size frame_size_in_dip) { |
573 DCHECK_EQ(type_, LAYER_TEXTURED); | 573 DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR); |
574 | 574 |
575 scoped_refptr<cc::SurfaceLayer> new_layer = cc::SurfaceLayer::Create(); | 575 scoped_refptr<cc::SurfaceLayer> new_layer = cc::SurfaceLayer::Create(); |
576 new_layer->SetSurfaceId(id); | 576 new_layer->SetSurfaceId(id); |
577 SwitchToLayer(new_layer); | 577 SwitchToLayer(new_layer); |
578 surface_layer_ = new_layer; | 578 surface_layer_ = new_layer; |
579 | 579 |
580 frame_size_in_dip_ = frame_size_in_dip; | 580 frame_size_in_dip_ = frame_size_in_dip; |
581 RecomputeDrawsContentAndUVRect(); | 581 RecomputeDrawsContentAndUVRect(); |
582 } | 582 } |
583 | 583 |
584 void Layer::SetShowPaintedContent() { | 584 void Layer::SetShowSolidColorContent() { |
585 if (content_layer_.get()) | 585 DCHECK_EQ(type_, LAYER_SOLID_COLOR); |
| 586 |
| 587 if (solid_color_layer_.get()) |
586 return; | 588 return; |
587 | 589 |
588 scoped_refptr<cc::Layer> new_layer; | 590 scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create(); |
589 if (Layer::UsingPictureLayer()) | |
590 new_layer = cc::PictureLayer::Create(this); | |
591 else | |
592 new_layer = cc::ContentLayer::Create(this); | |
593 SwitchToLayer(new_layer); | 591 SwitchToLayer(new_layer); |
594 content_layer_ = new_layer; | 592 solid_color_layer_ = new_layer; |
595 | 593 |
596 mailbox_ = cc::TextureMailbox(); | 594 mailbox_ = cc::TextureMailbox(); |
597 if (mailbox_release_callback_) { | 595 if (mailbox_release_callback_) { |
598 mailbox_release_callback_->Run(0, false); | 596 mailbox_release_callback_->Run(0, false); |
599 mailbox_release_callback_.reset(); | 597 mailbox_release_callback_.reset(); |
600 } | 598 } |
601 RecomputeDrawsContentAndUVRect(); | 599 RecomputeDrawsContentAndUVRect(); |
602 } | 600 } |
603 | 601 |
604 void Layer::UpdateNinePatchLayerBitmap(const SkBitmap& bitmap) { | 602 void Layer::UpdateNinePatchLayerBitmap(const SkBitmap& bitmap) { |
(...skipping 15 matching lines...) Expand all Loading... |
620 } | 618 } |
621 | 619 |
622 void Layer::UpdateNinePatchLayerBorder(const gfx::Rect& border) { | 620 void Layer::UpdateNinePatchLayerBorder(const gfx::Rect& border) { |
623 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get()); | 621 DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get()); |
624 nine_patch_layer_->SetBorder(border); | 622 nine_patch_layer_->SetBorder(border); |
625 } | 623 } |
626 | 624 |
627 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } | 625 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } |
628 | 626 |
629 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 627 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { |
630 if (type_ == LAYER_SOLID_COLOR || | 628 if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) || |
631 type_ == LAYER_NINE_PATCH || | 629 type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid())) |
632 (!delegate_ && !mailbox_.IsValid())) | |
633 return false; | 630 return false; |
634 | 631 |
635 damaged_region_.op(invalid_rect.x(), | 632 damaged_region_.op(invalid_rect.x(), |
636 invalid_rect.y(), | 633 invalid_rect.y(), |
637 invalid_rect.right(), | 634 invalid_rect.right(), |
638 invalid_rect.bottom(), | 635 invalid_rect.bottom(), |
639 SkRegion::kUnion_Op); | 636 SkRegion::kUnion_Op); |
640 ScheduleDraw(); | 637 ScheduleDraw(); |
641 return true; | 638 return true; |
642 } | 639 } |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 SetLayerFilters(); | 863 SetLayerFilters(); |
867 } | 864 } |
868 | 865 |
869 void Layer::SetGrayscaleFromAnimation(float grayscale) { | 866 void Layer::SetGrayscaleFromAnimation(float grayscale) { |
870 layer_grayscale_ = grayscale; | 867 layer_grayscale_ = grayscale; |
871 SetLayerFilters(); | 868 SetLayerFilters(); |
872 } | 869 } |
873 | 870 |
874 void Layer::SetColorFromAnimation(SkColor color) { | 871 void Layer::SetColorFromAnimation(SkColor color) { |
875 DCHECK_EQ(type_, LAYER_SOLID_COLOR); | 872 DCHECK_EQ(type_, LAYER_SOLID_COLOR); |
876 solid_color_layer_->SetBackgroundColor(color); | 873 cc_layer_->SetBackgroundColor(color); |
877 SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF); | 874 SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF); |
878 } | 875 } |
879 | 876 |
880 void Layer::ScheduleDrawForAnimation() { | 877 void Layer::ScheduleDrawForAnimation() { |
881 ScheduleDraw(); | 878 ScheduleDraw(); |
882 } | 879 } |
883 | 880 |
884 const gfx::Rect& Layer::GetBoundsForAnimation() const { | 881 const gfx::Rect& Layer::GetBoundsForAnimation() const { |
885 return bounds(); | 882 return bounds(); |
886 } | 883 } |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 it != pending_threaded_animations_.end(); | 966 it != pending_threaded_animations_.end(); |
970 ++it) | 967 ++it) |
971 cc_layer_->AddAnimation(pending_threaded_animations_.take(it)); | 968 cc_layer_->AddAnimation(pending_threaded_animations_.take(it)); |
972 | 969 |
973 pending_threaded_animations_.clear(); | 970 pending_threaded_animations_.clear(); |
974 | 971 |
975 for (size_t i = 0; i < children_.size(); ++i) | 972 for (size_t i = 0; i < children_.size(); ++i) |
976 children_[i]->SendPendingThreadedAnimations(); | 973 children_[i]->SendPendingThreadedAnimations(); |
977 } | 974 } |
978 | 975 |
979 void Layer::CreateWebLayer() { | 976 void Layer::CreateCcLayer() { |
980 if (type_ == LAYER_SOLID_COLOR) { | 977 if (type_ == LAYER_SOLID_COLOR) { |
981 solid_color_layer_ = cc::SolidColorLayer::Create(); | 978 solid_color_layer_ = cc::SolidColorLayer::Create(); |
982 cc_layer_ = solid_color_layer_.get(); | 979 cc_layer_ = solid_color_layer_.get(); |
983 } else if (type_ == LAYER_NINE_PATCH) { | 980 } else if (type_ == LAYER_NINE_PATCH) { |
984 nine_patch_layer_ = cc::NinePatchLayer::Create(); | 981 nine_patch_layer_ = cc::NinePatchLayer::Create(); |
985 cc_layer_ = nine_patch_layer_.get(); | 982 cc_layer_ = nine_patch_layer_.get(); |
986 } else { | 983 } else { |
987 if (Layer::UsingPictureLayer()) | 984 if (Layer::UsingPictureLayer()) |
988 content_layer_ = cc::PictureLayer::Create(this); | 985 content_layer_ = cc::PictureLayer::Create(this); |
989 else | 986 else |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 children_.end(), | 1041 children_.end(), |
1045 std::bind2nd(std::mem_fun(&Layer::RemoveAnimatorsInTreeFromCollection), | 1042 std::bind2nd(std::mem_fun(&Layer::RemoveAnimatorsInTreeFromCollection), |
1046 collection)); | 1043 collection)); |
1047 } | 1044 } |
1048 | 1045 |
1049 bool Layer::IsAnimating() const { | 1046 bool Layer::IsAnimating() const { |
1050 return animator_.get() && animator_->is_animating(); | 1047 return animator_.get() && animator_->is_animating(); |
1051 } | 1048 } |
1052 | 1049 |
1053 } // namespace ui | 1050 } // namespace ui |
OLD | NEW |