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_.get()) | 99 if (animator_.get()) |
(...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_.get() != has_frame) { | 550 if (!!delegated_renderer_layer_.get() != 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 canvas->Restore(); | 660 canvas->Restore(); |
634 } | 661 } |
635 | 662 |
636 unsigned Layer::PrepareTexture(cc::ResourceUpdateQueue* queue) { | 663 unsigned Layer::PrepareTexture(cc::ResourceUpdateQueue* queue) { |
637 DCHECK(texture_layer_.get()); | 664 DCHECK(texture_layer_.get()); |
638 return texture_->PrepareTexture(); | 665 return texture_->PrepareTexture(); |
639 } | 666 } |
640 | 667 |
641 WebKit::WebGraphicsContext3D* Layer::Context3d() { | 668 WebKit::WebGraphicsContext3D* Layer::Context3d() { |
642 DCHECK(texture_layer_.get()); | 669 DCHECK(texture_layer_.get()); |
643 return texture_->HostContext3D(); | 670 if (texture_) |
| 671 return texture_->HostContext3D(); |
| 672 return NULL; |
644 } | 673 } |
645 | 674 |
646 bool Layer::PrepareTextureMailbox(cc::TextureMailbox* mailbox) { | 675 bool Layer::PrepareTextureMailbox(cc::TextureMailbox* mailbox) { |
647 return false; | 676 return false; |
648 } | 677 } |
649 | 678 |
650 void Layer::SetForceRenderSurface(bool force) { | 679 void Layer::SetForceRenderSurface(bool force) { |
651 if (force_render_surface_ == force) | 680 if (force_render_surface_ == force) |
652 return; | 681 return; |
653 | 682 |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
911 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); | 940 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); |
912 transform.PreconcatTransform(cc_layer_->transform()); | 941 transform.PreconcatTransform(cc_layer_->transform()); |
913 transform.Scale(device_scale_factor_, device_scale_factor_); | 942 transform.Scale(device_scale_factor_, device_scale_factor_); |
914 return transform; | 943 return transform; |
915 } | 944 } |
916 | 945 |
917 void Layer::RecomputeDrawsContentAndUVRect() { | 946 void Layer::RecomputeDrawsContentAndUVRect() { |
918 DCHECK(cc_layer_); | 947 DCHECK(cc_layer_); |
919 gfx::Size size(bounds_.size()); | 948 gfx::Size size(bounds_.size()); |
920 if (texture_layer_.get()) { | 949 if (texture_layer_.get()) { |
921 DCHECK(texture_.get()); | 950 gfx::Size texture_size; |
922 | 951 if (!texture_layer_->uses_mailbox()) { |
923 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); | 952 DCHECK(texture_); |
924 gfx::Size texture_size = gfx::ToFlooredSize( | 953 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); |
925 gfx::ScaleSize(texture_->size(), texture_scale_factor)); | 954 texture_size = gfx::ToFlooredSize( |
| 955 gfx::ScaleSize(texture_->size(), texture_scale_factor)); |
| 956 } else { |
| 957 DCHECK(mailbox_.IsSharedMemory()); |
| 958 float texture_scale_factor = 1.0f / mailbox_scale_factor_; |
| 959 texture_size = gfx::ToFlooredSize( |
| 960 gfx::ScaleSize(mailbox_.shared_memory_size(), texture_scale_factor)); |
| 961 } |
926 size.SetToMin(texture_size); | 962 size.SetToMin(texture_size); |
927 | 963 |
928 gfx::PointF uv_top_left(0.f, 0.f); | 964 gfx::PointF uv_top_left(0.f, 0.f); |
929 gfx::PointF uv_bottom_right( | 965 gfx::PointF uv_bottom_right( |
930 static_cast<float>(size.width())/texture_size.width(), | 966 static_cast<float>(size.width())/texture_size.width(), |
931 static_cast<float>(size.height())/texture_size.height()); | 967 static_cast<float>(size.height())/texture_size.height()); |
932 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 968 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
933 } else if (delegated_renderer_layer_.get()) { | 969 } else if (delegated_renderer_layer_.get()) { |
934 delegated_renderer_layer_->SetDisplaySize( | 970 delegated_renderer_layer_->SetDisplaySize( |
935 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); | 971 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); |
936 size.SetToMin(delegated_frame_size_in_dip_); | 972 size.SetToMin(delegated_frame_size_in_dip_); |
937 } | 973 } |
938 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 974 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); |
939 } | 975 } |
940 | 976 |
941 void Layer::RecomputePosition() { | 977 void Layer::RecomputePosition() { |
942 cc_layer_->SetPosition(gfx::ScalePoint( | 978 cc_layer_->SetPosition(gfx::ScalePoint( |
943 gfx::PointF(bounds_.x(), bounds_.y()), | 979 gfx::PointF(bounds_.x(), bounds_.y()), |
944 device_scale_factor_)); | 980 device_scale_factor_)); |
945 } | 981 } |
946 | 982 |
947 } // namespace ui | 983 } // namespace ui |
OLD | NEW |