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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 background_blur_radius_(0), | 79 background_blur_radius_(0), |
80 layer_saturation_(0.0f), | 80 layer_saturation_(0.0f), |
81 layer_brightness_(0.0f), | 81 layer_brightness_(0.0f), |
82 layer_grayscale_(0.0f), | 82 layer_grayscale_(0.0f), |
83 layer_inverted_(false), | 83 layer_inverted_(false), |
84 layer_mask_(NULL), | 84 layer_mask_(NULL), |
85 layer_mask_back_link_(NULL), | 85 layer_mask_back_link_(NULL), |
86 zoom_(1), | 86 zoom_(1), |
87 zoom_inset_(0), | 87 zoom_inset_(0), |
88 delegate_(NULL), | 88 delegate_(NULL), |
| 89 cc_layer_(NULL), |
89 scale_content_(true), | 90 scale_content_(true), |
90 device_scale_factor_(1.0f) { | 91 device_scale_factor_(1.0f) { |
91 CreateWebLayer(); | 92 CreateWebLayer(); |
92 } | 93 } |
93 | 94 |
94 Layer::~Layer() { | 95 Layer::~Layer() { |
95 // Destroying the animator may cause observers to use the layer (and | 96 // Destroying the animator may cause observers to use the layer (and |
96 // indirectly the WebLayer). Destroy the animator first so that the WebLayer | 97 // indirectly the WebLayer). Destroy the animator first so that the WebLayer |
97 // is still around. | 98 // is still around. |
98 if (animator_) | 99 if (animator_) |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 } else { | 508 } else { |
508 scoped_refptr<cc::ContentLayer> new_layer = | 509 scoped_refptr<cc::ContentLayer> new_layer = |
509 cc::ContentLayer::Create(this); | 510 cc::ContentLayer::Create(this); |
510 SwitchToLayer(new_layer); | 511 SwitchToLayer(new_layer); |
511 content_layer_ = new_layer; | 512 content_layer_ = new_layer; |
512 } | 513 } |
513 } | 514 } |
514 RecomputeDrawsContentAndUVRect(); | 515 RecomputeDrawsContentAndUVRect(); |
515 } | 516 } |
516 | 517 |
| 518 void Layer::SetTextureMailbox(const cc::TextureMailbox& mailbox, |
| 519 float scale_factor) { |
| 520 DCHECK_EQ(type_, LAYER_TEXTURED); |
| 521 DCHECK(!solid_color_layer_); |
| 522 layer_updated_externally_ = true; |
| 523 texture_ = NULL; |
| 524 if (!texture_layer_ || !texture_layer_->uses_mailbox()) { |
| 525 scoped_refptr<cc::TextureLayer> new_layer = |
| 526 cc::TextureLayer::CreateForMailbox(this); |
| 527 new_layer->SetFlipped(false); |
| 528 SwitchToLayer(new_layer); |
| 529 texture_layer_ = new_layer; |
| 530 } |
| 531 texture_layer_->SetTextureMailbox(mailbox); |
| 532 mailbox_ = mailbox; |
| 533 mailbox_scale_factor_ = scale_factor; |
| 534 RecomputeDrawsContentAndUVRect(); |
| 535 } |
| 536 |
| 537 cc::TextureMailbox Layer::GetTextureMailbox(float* scale_factor) { |
| 538 if (scale_factor) |
| 539 *scale_factor = mailbox_scale_factor_; |
| 540 cc::TextureMailbox::ReleaseCallback callback; |
| 541 return mailbox_.CopyWithNewCallback(callback); |
| 542 } |
| 543 |
517 void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame, | 544 void Layer::SetDelegatedFrame(scoped_ptr<cc::DelegatedFrameData> frame, |
518 gfx::Size frame_size_in_dip) { | 545 gfx::Size frame_size_in_dip) { |
519 DCHECK_EQ(type_, LAYER_TEXTURED); | 546 DCHECK_EQ(type_, LAYER_TEXTURED); |
520 bool has_frame = frame.get() && !frame->render_pass_list.empty(); | 547 bool has_frame = frame.get() && !frame->render_pass_list.empty(); |
521 layer_updated_externally_ = has_frame; | 548 layer_updated_externally_ = has_frame; |
522 delegated_frame_size_in_dip_ = frame_size_in_dip; | 549 delegated_frame_size_in_dip_ = frame_size_in_dip; |
523 if (!!delegated_renderer_layer_ != has_frame) { | 550 if (!!delegated_renderer_layer_ != has_frame) { |
524 if (has_frame) { | 551 if (has_frame) { |
525 scoped_refptr<cc::DelegatedRendererLayer> new_layer = | 552 scoped_refptr<cc::DelegatedRendererLayer> new_layer = |
526 cc::DelegatedRendererLayer::Create(NULL); | 553 cc::DelegatedRendererLayer::Create(NULL); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 } | 656 } |
630 | 657 |
631 if (delegate_) | 658 if (delegate_) |
632 delegate_->OnPaintLayer(canvas.get()); | 659 delegate_->OnPaintLayer(canvas.get()); |
633 if (scale_content) | 660 if (scale_content) |
634 canvas->Restore(); | 661 canvas->Restore(); |
635 } | 662 } |
636 | 663 |
637 unsigned Layer::PrepareTexture(cc::ResourceUpdateQueue* queue) { | 664 unsigned Layer::PrepareTexture(cc::ResourceUpdateQueue* queue) { |
638 DCHECK(texture_layer_); | 665 DCHECK(texture_layer_); |
639 return texture_->PrepareTexture(); | 666 if (texture_) |
| 667 return texture_->PrepareTexture(); |
| 668 return 0; |
640 } | 669 } |
641 | 670 |
642 WebKit::WebGraphicsContext3D* Layer::Context3d() { | 671 WebKit::WebGraphicsContext3D* Layer::Context3d() { |
643 DCHECK(texture_layer_); | 672 DCHECK(texture_layer_); |
644 return texture_->HostContext3D(); | 673 if (texture_) |
| 674 return texture_->HostContext3D(); |
| 675 return NULL; |
645 } | 676 } |
646 | 677 |
647 bool Layer::PrepareTextureMailbox(cc::TextureMailbox* mailbox) { | 678 bool Layer::PrepareTextureMailbox(cc::TextureMailbox* mailbox) { |
648 return false; | 679 return false; |
649 } | 680 } |
650 | 681 |
651 void Layer::SetForceRenderSurface(bool force) { | 682 void Layer::SetForceRenderSurface(bool force) { |
652 if (force_render_surface_ == force) | 683 if (force_render_surface_ == force) |
653 return; | 684 return; |
654 | 685 |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); | 943 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); |
913 transform.PreconcatTransform(cc_layer_->transform()); | 944 transform.PreconcatTransform(cc_layer_->transform()); |
914 transform.Scale(device_scale_factor_, device_scale_factor_); | 945 transform.Scale(device_scale_factor_, device_scale_factor_); |
915 return transform; | 946 return transform; |
916 } | 947 } |
917 | 948 |
918 void Layer::RecomputeDrawsContentAndUVRect() { | 949 void Layer::RecomputeDrawsContentAndUVRect() { |
919 DCHECK(cc_layer_); | 950 DCHECK(cc_layer_); |
920 gfx::Size size(bounds_.size()); | 951 gfx::Size size(bounds_.size()); |
921 if (texture_layer_.get()) { | 952 if (texture_layer_.get()) { |
922 DCHECK(texture_); | 953 gfx::Size texture_size; |
923 | 954 if (!texture_layer_->uses_mailbox()) { |
924 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); | 955 DCHECK(texture_); |
925 gfx::Size texture_size = gfx::ToFlooredSize( | 956 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); |
926 gfx::ScaleSize(texture_->size(), texture_scale_factor)); | 957 texture_size = gfx::ToFlooredSize( |
| 958 gfx::ScaleSize(texture_->size(), texture_scale_factor)); |
| 959 } else { |
| 960 DCHECK(mailbox_.IsSharedMemory()); |
| 961 float texture_scale_factor = 1.0f / mailbox_scale_factor_; |
| 962 texture_size = gfx::ToFlooredSize( |
| 963 gfx::ScaleSize(mailbox_.shared_memory_size(), texture_scale_factor)); |
| 964 } |
927 size.ClampToMax(texture_size); | 965 size.ClampToMax(texture_size); |
928 | 966 |
929 gfx::PointF uv_top_left(0.f, 0.f); | 967 gfx::PointF uv_top_left(0.f, 0.f); |
930 gfx::PointF uv_bottom_right( | 968 gfx::PointF uv_bottom_right( |
931 static_cast<float>(size.width())/texture_size.width(), | 969 static_cast<float>(size.width())/texture_size.width(), |
932 static_cast<float>(size.height())/texture_size.height()); | 970 static_cast<float>(size.height())/texture_size.height()); |
933 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 971 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
934 } else if (delegated_renderer_layer_.get()) { | 972 } else if (delegated_renderer_layer_.get()) { |
935 delegated_renderer_layer_->SetDisplaySize( | 973 delegated_renderer_layer_->SetDisplaySize( |
936 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); | 974 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); |
937 size.ClampToMax(delegated_frame_size_in_dip_); | 975 size.ClampToMax(delegated_frame_size_in_dip_); |
938 } | 976 } |
939 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 977 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); |
940 } | 978 } |
941 | 979 |
942 void Layer::RecomputePosition() { | 980 void Layer::RecomputePosition() { |
943 cc_layer_->SetPosition(gfx::ScalePoint( | 981 cc_layer_->SetPosition(gfx::ScalePoint( |
944 gfx::PointF(bounds_.x(), bounds_.y()), | 982 gfx::PointF(bounds_.x(), bounds_.y()), |
945 device_scale_factor_)); | 983 device_scale_factor_)); |
946 } | 984 } |
947 | 985 |
948 } // namespace ui | 986 } // namespace ui |
OLD | NEW |