Chromium Code Reviews| 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); |
|
ccameron
2014/05/13 20:06:31
Do you have an example of anything that will trigg
piman
2014/05/13 20:13:10
I think this is only used now with the mirroring p
ccameron
2014/05/13 20:28:25
Okay, this needed to be scaled to work correctly w
piman
2014/05/13 20:32:24
Mmh, why?
ccameron
2014/05/13 20:55:55
Oh, I didn't check the original behavior. It was b
| |
| 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 |