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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 layer_brightness_(0.0f), | 67 layer_brightness_(0.0f), |
68 layer_grayscale_(0.0f), | 68 layer_grayscale_(0.0f), |
69 layer_inverted_(false), | 69 layer_inverted_(false), |
70 layer_mask_(NULL), | 70 layer_mask_(NULL), |
71 layer_mask_back_link_(NULL), | 71 layer_mask_back_link_(NULL), |
72 zoom_(1), | 72 zoom_(1), |
73 zoom_inset_(0), | 73 zoom_inset_(0), |
74 delegate_(NULL), | 74 delegate_(NULL), |
75 owner_(NULL), | 75 owner_(NULL), |
76 cc_layer_(NULL), | 76 cc_layer_(NULL), |
77 scale_content_(true), | |
78 device_scale_factor_(1.0f) { | 77 device_scale_factor_(1.0f) { |
79 CreateWebLayer(); | 78 CreateWebLayer(); |
80 } | 79 } |
81 | 80 |
82 Layer::Layer(LayerType type) | 81 Layer::Layer(LayerType type) |
83 : type_(type), | 82 : type_(type), |
84 compositor_(NULL), | 83 compositor_(NULL), |
85 parent_(NULL), | 84 parent_(NULL), |
86 visible_(true), | 85 visible_(true), |
87 force_render_surface_(false), | 86 force_render_surface_(false), |
88 fills_bounds_opaquely_(true), | 87 fills_bounds_opaquely_(true), |
89 fills_bounds_completely_(false), | 88 fills_bounds_completely_(false), |
90 background_blur_radius_(0), | 89 background_blur_radius_(0), |
91 layer_saturation_(0.0f), | 90 layer_saturation_(0.0f), |
92 layer_brightness_(0.0f), | 91 layer_brightness_(0.0f), |
93 layer_grayscale_(0.0f), | 92 layer_grayscale_(0.0f), |
94 layer_inverted_(false), | 93 layer_inverted_(false), |
95 layer_mask_(NULL), | 94 layer_mask_(NULL), |
96 layer_mask_back_link_(NULL), | 95 layer_mask_back_link_(NULL), |
97 zoom_(1), | 96 zoom_(1), |
98 zoom_inset_(0), | 97 zoom_inset_(0), |
99 delegate_(NULL), | 98 delegate_(NULL), |
100 owner_(NULL), | 99 owner_(NULL), |
101 cc_layer_(NULL), | 100 cc_layer_(NULL), |
102 scale_content_(true), | |
103 device_scale_factor_(1.0f) { | 101 device_scale_factor_(1.0f) { |
104 CreateWebLayer(); | 102 CreateWebLayer(); |
105 } | 103 } |
106 | 104 |
107 Layer::~Layer() { | 105 Layer::~Layer() { |
108 // Destroying the animator may cause observers to use the layer (and | 106 // Destroying the animator may cause observers to use the layer (and |
109 // indirectly the WebLayer). Destroy the animator first so that the WebLayer | 107 // indirectly the WebLayer). Destroy the animator first so that the WebLayer |
110 // is still around. | 108 // is still around. |
111 if (animator_.get()) | 109 if (animator_.get()) |
112 animator_->SetDelegate(NULL); | 110 animator_->SetDelegate(NULL); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 static_cast<float>(p->bounds().y())); | 433 static_cast<float>(p->bounds().y())); |
436 // Use target transform so that result will be correct once animation is | 434 // Use target transform so that result will be correct once animation is |
437 // finished. | 435 // finished. |
438 if (!p->GetTargetTransform().IsIdentity()) | 436 if (!p->GetTargetTransform().IsIdentity()) |
439 transform->ConcatTransform(p->GetTargetTransform()); | 437 transform->ConcatTransform(p->GetTargetTransform()); |
440 transform->ConcatTransform(translation); | 438 transform->ConcatTransform(translation); |
441 } | 439 } |
442 return p == ancestor; | 440 return p == ancestor; |
443 } | 441 } |
444 | 442 |
445 // static | |
446 gfx::Transform Layer::ConvertTransformToCCTransform( | |
447 const gfx::Transform& transform, | |
448 float device_scale_factor) { | |
449 gfx::Transform cc_transform; | |
450 cc_transform.Scale(device_scale_factor, device_scale_factor); | |
451 cc_transform.PreconcatTransform(transform); | |
452 cc_transform.Scale(1.0f / device_scale_factor, 1.0f / device_scale_factor); | |
453 return cc_transform; | |
454 } | |
455 | |
456 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { | 443 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { |
457 if (fills_bounds_opaquely_ == fills_bounds_opaquely) | 444 if (fills_bounds_opaquely_ == fills_bounds_opaquely) |
458 return; | 445 return; |
459 | 446 |
460 fills_bounds_opaquely_ = fills_bounds_opaquely; | 447 fills_bounds_opaquely_ = fills_bounds_opaquely; |
461 | 448 |
462 cc_layer_->SetContentsOpaque(fills_bounds_opaquely); | 449 cc_layer_->SetContentsOpaque(fills_bounds_opaquely); |
463 } | 450 } |
464 | 451 |
465 void Layer::SetFillsBoundsCompletely(bool fills_bounds_completely) { | 452 void Layer::SetFillsBoundsCompletely(bool fills_bounds_completely) { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 | 591 |
605 void Layer::SendDamagedRects() { | 592 void Layer::SendDamagedRects() { |
606 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) { | 593 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) { |
607 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { | 594 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { |
608 const SkIRect& sk_damaged = iter.rect(); | 595 const SkIRect& sk_damaged = iter.rect(); |
609 gfx::Rect damaged( | 596 gfx::Rect damaged( |
610 sk_damaged.x(), | 597 sk_damaged.x(), |
611 sk_damaged.y(), | 598 sk_damaged.y(), |
612 sk_damaged.width(), | 599 sk_damaged.width(), |
613 sk_damaged.height()); | 600 sk_damaged.height()); |
614 | 601 cc_layer_->SetNeedsDisplayRect(damaged); |
615 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); | |
616 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); | |
617 } | 602 } |
618 damaged_region_.setEmpty(); | 603 damaged_region_.setEmpty(); |
619 } | 604 } |
620 for (size_t i = 0; i < children_.size(); ++i) | 605 for (size_t i = 0; i < children_.size(); ++i) |
621 children_[i]->SendDamagedRects(); | 606 children_[i]->SendDamagedRects(); |
622 } | 607 } |
623 | 608 |
624 void Layer::SuppressPaint() { | 609 void Layer::SuppressPaint() { |
625 if (!delegate_) | 610 if (!delegate_) |
626 return; | 611 return; |
627 delegate_ = NULL; | 612 delegate_ = NULL; |
628 for (size_t i = 0; i < children_.size(); ++i) | 613 for (size_t i = 0; i < children_.size(); ++i) |
629 children_[i]->SuppressPaint(); | 614 children_[i]->SuppressPaint(); |
630 } | 615 } |
631 | 616 |
632 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { | 617 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { |
633 if (device_scale_factor_ == device_scale_factor) | 618 if (device_scale_factor_ == device_scale_factor) |
634 return; | 619 return; |
635 if (animator_.get()) | 620 if (animator_.get()) |
636 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM); | 621 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM); |
637 gfx::Transform transform = this->transform(); | |
638 device_scale_factor_ = device_scale_factor; | 622 device_scale_factor_ = device_scale_factor; |
639 RecomputeCCTransformFromTransform(transform); | |
640 RecomputeDrawsContentAndUVRect(); | 623 RecomputeDrawsContentAndUVRect(); |
641 RecomputePosition(); | 624 RecomputePosition(); |
642 SchedulePaint(gfx::Rect(bounds_.size())); | 625 SchedulePaint(gfx::Rect(bounds_.size())); |
643 if (delegate_) | 626 if (delegate_) |
644 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); | 627 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); |
645 for (size_t i = 0; i < children_.size(); ++i) | 628 for (size_t i = 0; i < children_.size(); ++i) |
646 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); | 629 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); |
647 if (layer_mask_) | 630 if (layer_mask_) |
648 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); | 631 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); |
649 } | 632 } |
650 | 633 |
651 void Layer::RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) { | 634 void Layer::RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) { |
652 cc_layer_->RequestCopyOfOutput(request.Pass()); | 635 cc_layer_->RequestCopyOfOutput(request.Pass()); |
653 } | 636 } |
654 | 637 |
655 void Layer::PaintContents(SkCanvas* sk_canvas, | 638 void Layer::PaintContents(SkCanvas* sk_canvas, |
656 const gfx::Rect& clip, | 639 const gfx::Rect& clip, |
657 gfx::RectF* opaque, | 640 gfx::RectF* opaque, |
658 ContentLayerClient::GraphicsContextStatus gc_status) { | 641 ContentLayerClient::GraphicsContextStatus gc_status) { |
659 TRACE_EVENT0("ui", "Layer::PaintContents"); | 642 TRACE_EVENT0("ui", "Layer::PaintContents"); |
660 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling( | 643 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling( |
661 sk_canvas, device_scale_factor_)); | 644 sk_canvas, device_scale_factor_)); |
662 | |
663 bool scale_content = scale_content_; | |
664 if (scale_content) { | |
665 canvas->Save(); | |
666 canvas->sk_canvas()->scale(SkFloatToScalar(device_scale_factor_), | |
667 SkFloatToScalar(device_scale_factor_)); | |
668 } | |
669 | |
670 if (delegate_) | 645 if (delegate_) |
671 delegate_->OnPaintLayer(canvas.get()); | 646 delegate_->OnPaintLayer(canvas.get()); |
672 if (scale_content) | |
673 canvas->Restore(); | |
674 } | 647 } |
675 | 648 |
676 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } | 649 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } |
677 | 650 |
678 bool Layer::PrepareTextureMailbox( | 651 bool Layer::PrepareTextureMailbox( |
679 cc::TextureMailbox* mailbox, | 652 cc::TextureMailbox* mailbox, |
680 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 653 scoped_ptr<cc::SingleReleaseCallback>* release_callback, |
681 bool use_shared_memory) { | 654 bool use_shared_memory) { |
682 if (!mailbox_release_callback_) | 655 if (!mailbox_release_callback_) |
683 return false; | 656 return false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 // automatically when we get visible. | 754 // automatically when we get visible. |
782 if (IsDrawn()) | 755 if (IsDrawn()) |
783 ScheduleDraw(); | 756 ScheduleDraw(); |
784 } else { | 757 } else { |
785 // Always schedule a paint, even if we're invisible. | 758 // Always schedule a paint, even if we're invisible. |
786 SchedulePaint(gfx::Rect(bounds.size())); | 759 SchedulePaint(gfx::Rect(bounds.size())); |
787 } | 760 } |
788 } | 761 } |
789 | 762 |
790 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { | 763 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { |
791 RecomputeCCTransformFromTransform(transform); | 764 cc_layer_->SetTransform(transform); |
792 } | 765 } |
793 | 766 |
794 void Layer::SetOpacityFromAnimation(float opacity) { | 767 void Layer::SetOpacityFromAnimation(float opacity) { |
795 cc_layer_->SetOpacity(opacity); | 768 cc_layer_->SetOpacity(opacity); |
796 ScheduleDraw(); | 769 ScheduleDraw(); |
797 } | 770 } |
798 | 771 |
799 void Layer::SetVisibilityFromAnimation(bool visible) { | 772 void Layer::SetVisibilityFromAnimation(bool visible) { |
800 if (visible_ == visible) | 773 if (visible_ == visible) |
801 return; | 774 return; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
926 cc_layer_ = content_layer_.get(); | 899 cc_layer_ = content_layer_.get(); |
927 } | 900 } |
928 cc_layer_->SetAnchorPoint(gfx::PointF()); | 901 cc_layer_->SetAnchorPoint(gfx::PointF()); |
929 cc_layer_->SetContentsOpaque(true); | 902 cc_layer_->SetContentsOpaque(true); |
930 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); | 903 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); |
931 cc_layer_->AddLayerAnimationEventObserver(this); | 904 cc_layer_->AddLayerAnimationEventObserver(this); |
932 cc_layer_->SetLayerClient(this); | 905 cc_layer_->SetLayerClient(this); |
933 RecomputePosition(); | 906 RecomputePosition(); |
934 } | 907 } |
935 | 908 |
936 void Layer::RecomputeCCTransformFromTransform(const gfx::Transform& transform) { | |
937 cc_layer_->SetTransform(ConvertTransformToCCTransform(transform, | |
938 device_scale_factor_)); | |
939 } | |
940 | |
941 gfx::Transform Layer::transform() const { | 909 gfx::Transform Layer::transform() const { |
942 gfx::Transform transform; | 910 return cc_layer_->transform(); |
943 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); | |
944 transform.PreconcatTransform(cc_layer_->transform()); | |
945 transform.Scale(device_scale_factor_, device_scale_factor_); | |
946 return transform; | |
947 } | 911 } |
948 | 912 |
949 void Layer::RecomputeDrawsContentAndUVRect() { | 913 void Layer::RecomputeDrawsContentAndUVRect() { |
950 DCHECK(cc_layer_); | 914 DCHECK(cc_layer_); |
951 gfx::Size size(bounds_.size()); | 915 gfx::Size size(bounds_.size()); |
952 if (texture_layer_.get()) { | 916 if (texture_layer_.get()) { |
953 size.SetToMin(frame_size_in_dip_); | 917 size.SetToMin(frame_size_in_dip_); |
954 gfx::PointF uv_top_left(0.f, 0.f); | 918 gfx::PointF uv_top_left(0.f, 0.f); |
955 gfx::PointF uv_bottom_right( | 919 gfx::PointF uv_bottom_right( |
956 static_cast<float>(size.width()) / frame_size_in_dip_.width(), | 920 static_cast<float>(size.width()) / frame_size_in_dip_.width(), |
957 static_cast<float>(size.height()) / frame_size_in_dip_.height()); | 921 static_cast<float>(size.height()) / frame_size_in_dip_.height()); |
958 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 922 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
959 } else if (delegated_renderer_layer_.get()) { | 923 } else if (delegated_renderer_layer_.get()) { |
960 size.SetToMin(frame_size_in_dip_); | 924 size.SetToMin(frame_size_in_dip_); |
961 delegated_renderer_layer_->SetDisplaySize( | 925 delegated_renderer_layer_->SetDisplaySize(frame_size_in_dip_); |
962 ConvertSizeToPixel(this, frame_size_in_dip_)); | |
963 } | 926 } |
964 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 927 cc_layer_->SetBounds(size); |
965 } | 928 } |
966 | 929 |
967 void Layer::RecomputePosition() { | 930 void Layer::RecomputePosition() { |
968 cc_layer_->SetPosition(gfx::ScalePoint( | 931 cc_layer_->SetPosition(gfx::PointF(bounds_.x(), bounds_.y())); |
969 gfx::PointF(bounds_.x(), bounds_.y()), | |
970 device_scale_factor_)); | |
971 } | 932 } |
972 | 933 |
973 } // namespace ui | 934 } // namespace ui |
OLD | NEW |