| 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 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 void Layer::SwitchCCLayerForTest() { | 494 void Layer::SwitchCCLayerForTest() { |
| 495 scoped_refptr<cc::Layer> new_layer; | 495 scoped_refptr<cc::Layer> new_layer; |
| 496 if (Layer::UsingPictureLayer()) | 496 if (Layer::UsingPictureLayer()) |
| 497 new_layer = cc::PictureLayer::Create(this); | 497 new_layer = cc::PictureLayer::Create(this); |
| 498 else | 498 else |
| 499 new_layer = cc::ContentLayer::Create(this); | 499 new_layer = cc::ContentLayer::Create(this); |
| 500 SwitchToLayer(new_layer); | 500 SwitchToLayer(new_layer); |
| 501 content_layer_ = new_layer; | 501 content_layer_ = new_layer; |
| 502 } | 502 } |
| 503 | 503 |
| 504 void Layer::SetExternalTexture(Texture* texture) { | |
| 505 DCHECK(texture); | |
| 506 | |
| 507 // Hold a ref to the old |Texture| until we have updated all | |
| 508 // compositor references to the texture id that it holds. | |
| 509 scoped_refptr<ui::Texture> old_texture = texture_; | |
| 510 | |
| 511 DCHECK_EQ(type_, LAYER_TEXTURED); | |
| 512 DCHECK(!solid_color_layer_.get()); | |
| 513 texture_ = texture; | |
| 514 if (!texture_layer_.get()) { | |
| 515 scoped_refptr<cc::TextureLayer> new_layer = cc::TextureLayer::Create(this); | |
| 516 new_layer->SetFlipped(texture_->flipped()); | |
| 517 SwitchToLayer(new_layer); | |
| 518 texture_layer_ = new_layer; | |
| 519 } | |
| 520 RecomputeDrawsContentAndUVRect(); | |
| 521 } | |
| 522 | |
| 523 void Layer::SetTextureMailbox( | 504 void Layer::SetTextureMailbox( |
| 524 const cc::TextureMailbox& mailbox, | 505 const cc::TextureMailbox& mailbox, |
| 525 scoped_ptr<cc::SingleReleaseCallback> release_callback, | 506 scoped_ptr<cc::SingleReleaseCallback> release_callback, |
| 526 float scale_factor) { | 507 gfx::Size texture_size_in_dip) { |
| 527 DCHECK_EQ(type_, LAYER_TEXTURED); | 508 DCHECK_EQ(type_, LAYER_TEXTURED); |
| 528 DCHECK(!solid_color_layer_.get()); | 509 DCHECK(!solid_color_layer_.get()); |
| 529 texture_ = NULL; | 510 DCHECK(mailbox.IsValid()); |
| 530 if (!texture_layer_.get() || !texture_layer_->uses_mailbox()) { | 511 DCHECK(release_callback); |
| 512 if (!texture_layer_) { |
| 531 scoped_refptr<cc::TextureLayer> new_layer = | 513 scoped_refptr<cc::TextureLayer> new_layer = |
| 532 cc::TextureLayer::CreateForMailbox(this); | 514 cc::TextureLayer::CreateForMailbox(this); |
| 533 new_layer->SetFlipped(false); | 515 new_layer->SetFlipped(true); |
| 534 SwitchToLayer(new_layer); | 516 SwitchToLayer(new_layer); |
| 535 texture_layer_ = new_layer; | 517 texture_layer_ = new_layer; |
| 536 } | 518 } |
| 537 texture_layer_->SetTextureMailbox(mailbox, release_callback.Pass()); | 519 if (mailbox_release_callback_) |
| 520 mailbox_release_callback_->Run(0, false); |
| 521 mailbox_release_callback_ = release_callback.Pass(); |
| 538 mailbox_ = mailbox; | 522 mailbox_ = mailbox; |
| 539 mailbox_scale_factor_ = scale_factor; | 523 SetTextureSize(texture_size_in_dip); |
| 540 RecomputeDrawsContentAndUVRect(); | |
| 541 } | 524 } |
| 542 | 525 |
| 543 cc::TextureMailbox Layer::GetTextureMailbox(float* scale_factor) { | 526 void Layer::SetTextureSize(gfx::Size texture_size_in_dip) { |
| 544 if (scale_factor) | 527 DCHECK(texture_layer_.get()); |
| 545 *scale_factor = mailbox_scale_factor_; | 528 if (frame_size_in_dip_ == texture_size_in_dip) |
| 546 return mailbox_; | 529 return; |
| 530 frame_size_in_dip_ = texture_size_in_dip; |
| 531 RecomputeDrawsContentAndUVRect(); |
| 532 texture_layer_->SetNeedsDisplay(); |
| 547 } | 533 } |
| 548 | 534 |
| 549 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, | 535 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, |
| 550 gfx::Size frame_size_in_dip) { | 536 gfx::Size frame_size_in_dip) { |
| 551 DCHECK_EQ(type_, LAYER_TEXTURED); | 537 DCHECK_EQ(type_, LAYER_TEXTURED); |
| 552 | 538 |
| 553 scoped_refptr<cc::DelegatedRendererLayer> new_layer = | 539 scoped_refptr<cc::DelegatedRendererLayer> new_layer = |
| 554 cc::DelegatedRendererLayer::Create(frame_provider); | 540 cc::DelegatedRendererLayer::Create(frame_provider); |
| 555 SwitchToLayer(new_layer); | 541 SwitchToLayer(new_layer); |
| 556 delegated_renderer_layer_ = new_layer; | 542 delegated_renderer_layer_ = new_layer; |
| 557 | 543 |
| 558 delegated_frame_size_in_dip_ = frame_size_in_dip; | 544 frame_size_in_dip_ = frame_size_in_dip; |
| 559 RecomputeDrawsContentAndUVRect(); | 545 RecomputeDrawsContentAndUVRect(); |
| 560 } | 546 } |
| 561 | 547 |
| 562 void Layer::SetShowPaintedContent() { | 548 void Layer::SetShowPaintedContent() { |
| 563 if (content_layer_.get()) | 549 if (content_layer_.get()) |
| 564 return; | 550 return; |
| 565 | 551 |
| 566 scoped_refptr<cc::Layer> new_layer; | 552 scoped_refptr<cc::Layer> new_layer; |
| 567 if (Layer::UsingPictureLayer()) | 553 if (Layer::UsingPictureLayer()) |
| 568 new_layer = cc::PictureLayer::Create(this); | 554 new_layer = cc::PictureLayer::Create(this); |
| 569 else | 555 else |
| 570 new_layer = cc::ContentLayer::Create(this); | 556 new_layer = cc::ContentLayer::Create(this); |
| 571 SwitchToLayer(new_layer); | 557 SwitchToLayer(new_layer); |
| 572 content_layer_ = new_layer; | 558 content_layer_ = new_layer; |
| 573 | 559 |
| 574 mailbox_ = cc::TextureMailbox(); | 560 mailbox_ = cc::TextureMailbox(); |
| 575 texture_ = NULL; | 561 if (mailbox_release_callback_) { |
| 576 | 562 mailbox_release_callback_->Run(0, false); |
| 563 mailbox_release_callback_.reset(); |
| 564 } |
| 577 RecomputeDrawsContentAndUVRect(); | 565 RecomputeDrawsContentAndUVRect(); |
| 578 } | 566 } |
| 579 | 567 |
| 580 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } | 568 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } |
| 581 | 569 |
| 582 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 570 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { |
| 583 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !texture_.get())) | 571 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !mailbox_.IsValid())) |
| 584 return false; | 572 return false; |
| 585 | 573 |
| 586 damaged_region_.op(invalid_rect.x(), | 574 damaged_region_.op(invalid_rect.x(), |
| 587 invalid_rect.y(), | 575 invalid_rect.y(), |
| 588 invalid_rect.right(), | 576 invalid_rect.right(), |
| 589 invalid_rect.bottom(), | 577 invalid_rect.bottom(), |
| 590 SkRegion::kUnion_Op); | 578 SkRegion::kUnion_Op); |
| 591 ScheduleDraw(); | 579 ScheduleDraw(); |
| 592 return true; | 580 return true; |
| 593 } | 581 } |
| 594 | 582 |
| 595 void Layer::ScheduleDraw() { | 583 void Layer::ScheduleDraw() { |
| 596 Compositor* compositor = GetCompositor(); | 584 Compositor* compositor = GetCompositor(); |
| 597 if (compositor) | 585 if (compositor) |
| 598 compositor->ScheduleDraw(); | 586 compositor->ScheduleDraw(); |
| 599 } | 587 } |
| 600 | 588 |
| 601 void Layer::SendDamagedRects() { | 589 void Layer::SendDamagedRects() { |
| 602 if ((delegate_ || texture_.get()) && !damaged_region_.isEmpty()) { | 590 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) { |
| 603 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { | 591 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { |
| 604 const SkIRect& sk_damaged = iter.rect(); | 592 const SkIRect& sk_damaged = iter.rect(); |
| 605 gfx::Rect damaged( | 593 gfx::Rect damaged( |
| 606 sk_damaged.x(), | 594 sk_damaged.x(), |
| 607 sk_damaged.y(), | 595 sk_damaged.y(), |
| 608 sk_damaged.width(), | 596 sk_damaged.width(), |
| 609 sk_damaged.height()); | 597 sk_damaged.height()); |
| 610 | 598 |
| 611 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); | 599 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); |
| 612 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); | 600 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 | 652 |
| 665 if (delegate_) | 653 if (delegate_) |
| 666 delegate_->OnPaintLayer(canvas.get()); | 654 delegate_->OnPaintLayer(canvas.get()); |
| 667 if (scale_content) | 655 if (scale_content) |
| 668 canvas->Restore(); | 656 canvas->Restore(); |
| 669 } | 657 } |
| 670 | 658 |
| 671 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } | 659 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } |
| 672 | 660 |
| 673 unsigned Layer::PrepareTexture() { | 661 unsigned Layer::PrepareTexture() { |
| 674 DCHECK(texture_layer_.get()); | 662 NOTREACHED(); |
| 675 return texture_->PrepareTexture(); | 663 return 0; |
| 676 } | 664 } |
| 677 | 665 |
| 678 bool Layer::PrepareTextureMailbox( | 666 bool Layer::PrepareTextureMailbox( |
| 679 cc::TextureMailbox* mailbox, | 667 cc::TextureMailbox* mailbox, |
| 680 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 668 scoped_ptr<cc::SingleReleaseCallback>* release_callback, |
| 681 bool use_shared_memory) { | 669 bool use_shared_memory) { |
| 682 return false; | 670 if (!mailbox_release_callback_) |
| 671 return false; |
| 672 *mailbox = mailbox_; |
| 673 *release_callback = mailbox_release_callback_.Pass(); |
| 674 return true; |
| 683 } | 675 } |
| 684 | 676 |
| 685 void Layer::SetForceRenderSurface(bool force) { | 677 void Layer::SetForceRenderSurface(bool force) { |
| 686 if (force_render_surface_ == force) | 678 if (force_render_surface_ == force) |
| 687 return; | 679 return; |
| 688 | 680 |
| 689 force_render_surface_ = force; | 681 force_render_surface_ = force; |
| 690 cc_layer_->SetForceRenderSurface(force_render_surface_); | 682 cc_layer_->SetForceRenderSurface(force_render_surface_); |
| 691 } | 683 } |
| 692 | 684 |
| (...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); | 931 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); |
| 940 transform.PreconcatTransform(cc_layer_->transform()); | 932 transform.PreconcatTransform(cc_layer_->transform()); |
| 941 transform.Scale(device_scale_factor_, device_scale_factor_); | 933 transform.Scale(device_scale_factor_, device_scale_factor_); |
| 942 return transform; | 934 return transform; |
| 943 } | 935 } |
| 944 | 936 |
| 945 void Layer::RecomputeDrawsContentAndUVRect() { | 937 void Layer::RecomputeDrawsContentAndUVRect() { |
| 946 DCHECK(cc_layer_); | 938 DCHECK(cc_layer_); |
| 947 gfx::Size size(bounds_.size()); | 939 gfx::Size size(bounds_.size()); |
| 948 if (texture_layer_.get()) { | 940 if (texture_layer_.get()) { |
| 949 gfx::Size texture_size; | 941 size.SetToMin(frame_size_in_dip_); |
| 950 if (!texture_layer_->uses_mailbox()) { | |
| 951 DCHECK(texture_.get()); | |
| 952 float texture_scale_factor = 1.0f / texture_->device_scale_factor(); | |
| 953 texture_size = gfx::ToFlooredSize( | |
| 954 gfx::ScaleSize(texture_->size(), texture_scale_factor)); | |
| 955 } else { | |
| 956 DCHECK(mailbox_.IsSharedMemory()); | |
| 957 float texture_scale_factor = 1.0f / mailbox_scale_factor_; | |
| 958 texture_size = gfx::ToFlooredSize( | |
| 959 gfx::ScaleSize(mailbox_.shared_memory_size(), texture_scale_factor)); | |
| 960 } | |
| 961 size.SetToMin(texture_size); | |
| 962 | |
| 963 gfx::PointF uv_top_left(0.f, 0.f); | 942 gfx::PointF uv_top_left(0.f, 0.f); |
| 964 gfx::PointF uv_bottom_right( | 943 gfx::PointF uv_bottom_right( |
| 965 static_cast<float>(size.width())/texture_size.width(), | 944 static_cast<float>(size.width()) / frame_size_in_dip_.width(), |
| 966 static_cast<float>(size.height())/texture_size.height()); | 945 static_cast<float>(size.height()) / frame_size_in_dip_.height()); |
| 967 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 946 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
| 968 } else if (delegated_renderer_layer_.get()) { | 947 } else if (delegated_renderer_layer_.get()) { |
| 948 size.SetToMin(frame_size_in_dip_); |
| 969 delegated_renderer_layer_->SetDisplaySize( | 949 delegated_renderer_layer_->SetDisplaySize( |
| 970 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); | 950 ConvertSizeToPixel(this, frame_size_in_dip_)); |
| 971 size.SetToMin(delegated_frame_size_in_dip_); | |
| 972 } | 951 } |
| 973 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 952 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); |
| 974 } | 953 } |
| 975 | 954 |
| 976 void Layer::RecomputePosition() { | 955 void Layer::RecomputePosition() { |
| 977 cc_layer_->SetPosition(gfx::ScalePoint( | 956 cc_layer_->SetPosition(gfx::ScalePoint( |
| 978 gfx::PointF(bounds_.x(), bounds_.y()), | 957 gfx::PointF(bounds_.x(), bounds_.y()), |
| 979 device_scale_factor_)); | 958 device_scale_factor_)); |
| 980 } | 959 } |
| 981 | 960 |
| 982 } // namespace ui | 961 } // namespace ui |
| OLD | NEW |