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 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.get()); |
|
danakj
2014/04/08 16:08:01
nit: no .get() needed for scoped_ptr
piman
2014/04/08 23:17:46
Done.
| |
| 512 if (!texture_layer_.get()) { | |
| 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_.get()) |
|
danakj
2014/04/08 16:08:01
nit: no .get() needed for scoped_ptr
piman
2014/04/08 23:17:46
Done.
| |
| 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 frame_size_in_dip_ = texture_size_in_dip; |
| 546 return mailbox_; | 529 RecomputeDrawsContentAndUVRect(); |
| 530 texture_layer_->SetNeedsDisplay(); | |
| 547 } | 531 } |
| 548 | 532 |
| 549 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, | 533 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, |
| 550 gfx::Size frame_size_in_dip) { | 534 gfx::Size frame_size_in_dip) { |
| 551 DCHECK_EQ(type_, LAYER_TEXTURED); | 535 DCHECK_EQ(type_, LAYER_TEXTURED); |
| 552 | 536 |
| 553 scoped_refptr<cc::DelegatedRendererLayer> new_layer = | 537 scoped_refptr<cc::DelegatedRendererLayer> new_layer = |
| 554 cc::DelegatedRendererLayer::Create(frame_provider); | 538 cc::DelegatedRendererLayer::Create(frame_provider); |
| 555 SwitchToLayer(new_layer); | 539 SwitchToLayer(new_layer); |
| 556 delegated_renderer_layer_ = new_layer; | 540 delegated_renderer_layer_ = new_layer; |
| 557 | 541 |
| 558 delegated_frame_size_in_dip_ = frame_size_in_dip; | 542 frame_size_in_dip_ = frame_size_in_dip; |
| 559 RecomputeDrawsContentAndUVRect(); | 543 RecomputeDrawsContentAndUVRect(); |
| 560 } | 544 } |
| 561 | 545 |
| 562 void Layer::SetShowPaintedContent() { | 546 void Layer::SetShowPaintedContent() { |
| 563 if (content_layer_.get()) | 547 if (content_layer_.get()) |
| 564 return; | 548 return; |
| 565 | 549 |
| 566 scoped_refptr<cc::Layer> new_layer; | 550 scoped_refptr<cc::Layer> new_layer; |
| 567 if (Layer::UsingPictureLayer()) | 551 if (Layer::UsingPictureLayer()) |
| 568 new_layer = cc::PictureLayer::Create(this); | 552 new_layer = cc::PictureLayer::Create(this); |
| 569 else | 553 else |
| 570 new_layer = cc::ContentLayer::Create(this); | 554 new_layer = cc::ContentLayer::Create(this); |
| 571 SwitchToLayer(new_layer); | 555 SwitchToLayer(new_layer); |
| 572 content_layer_ = new_layer; | 556 content_layer_ = new_layer; |
| 573 | 557 |
| 574 mailbox_ = cc::TextureMailbox(); | 558 mailbox_ = cc::TextureMailbox(); |
|
danakj
2014/04/08 16:08:01
should we call the release callback here if there
piman
2014/04/08 23:17:46
Done.
| |
| 575 texture_ = NULL; | |
| 576 | |
| 577 RecomputeDrawsContentAndUVRect(); | 559 RecomputeDrawsContentAndUVRect(); |
| 578 } | 560 } |
| 579 | 561 |
| 580 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } | 562 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } |
| 581 | 563 |
| 582 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 564 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { |
| 583 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !texture_.get())) | 565 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !mailbox_.IsValid())) |
| 584 return false; | 566 return false; |
| 585 | 567 |
| 586 damaged_region_.op(invalid_rect.x(), | 568 damaged_region_.op(invalid_rect.x(), |
| 587 invalid_rect.y(), | 569 invalid_rect.y(), |
| 588 invalid_rect.right(), | 570 invalid_rect.right(), |
| 589 invalid_rect.bottom(), | 571 invalid_rect.bottom(), |
| 590 SkRegion::kUnion_Op); | 572 SkRegion::kUnion_Op); |
| 591 ScheduleDraw(); | 573 ScheduleDraw(); |
| 592 return true; | 574 return true; |
| 593 } | 575 } |
| 594 | 576 |
| 595 void Layer::ScheduleDraw() { | 577 void Layer::ScheduleDraw() { |
| 596 Compositor* compositor = GetCompositor(); | 578 Compositor* compositor = GetCompositor(); |
| 597 if (compositor) | 579 if (compositor) |
| 598 compositor->ScheduleDraw(); | 580 compositor->ScheduleDraw(); |
| 599 } | 581 } |
| 600 | 582 |
| 601 void Layer::SendDamagedRects() { | 583 void Layer::SendDamagedRects() { |
| 602 if ((delegate_ || texture_.get()) && !damaged_region_.isEmpty()) { | 584 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) { |
| 603 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { | 585 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { |
| 604 const SkIRect& sk_damaged = iter.rect(); | 586 const SkIRect& sk_damaged = iter.rect(); |
| 605 gfx::Rect damaged( | 587 gfx::Rect damaged( |
| 606 sk_damaged.x(), | 588 sk_damaged.x(), |
| 607 sk_damaged.y(), | 589 sk_damaged.y(), |
| 608 sk_damaged.width(), | 590 sk_damaged.width(), |
| 609 sk_damaged.height()); | 591 sk_damaged.height()); |
| 610 | 592 |
| 611 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); | 593 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); |
| 612 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); | 594 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 664 | 646 |
| 665 if (delegate_) | 647 if (delegate_) |
| 666 delegate_->OnPaintLayer(canvas.get()); | 648 delegate_->OnPaintLayer(canvas.get()); |
| 667 if (scale_content) | 649 if (scale_content) |
| 668 canvas->Restore(); | 650 canvas->Restore(); |
| 669 } | 651 } |
| 670 | 652 |
| 671 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } | 653 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } |
| 672 | 654 |
| 673 unsigned Layer::PrepareTexture() { | 655 unsigned Layer::PrepareTexture() { |
| 674 DCHECK(texture_layer_.get()); | 656 NOTREACHED(); |
| 675 return texture_->PrepareTexture(); | 657 return 0; |
| 676 } | 658 } |
| 677 | 659 |
| 678 bool Layer::PrepareTextureMailbox( | 660 bool Layer::PrepareTextureMailbox( |
| 679 cc::TextureMailbox* mailbox, | 661 cc::TextureMailbox* mailbox, |
| 680 scoped_ptr<cc::SingleReleaseCallback>* release_callback, | 662 scoped_ptr<cc::SingleReleaseCallback>* release_callback, |
| 681 bool use_shared_memory) { | 663 bool use_shared_memory) { |
| 682 return false; | 664 if (!mailbox_release_callback_.get()) |
|
danakj
2014/04/08 16:08:01
nit: no .get()
piman
2014/04/08 23:17:46
Done.
| |
| 665 return false; | |
| 666 *mailbox = mailbox_; | |
| 667 *release_callback = mailbox_release_callback_.Pass(); | |
| 668 return true; | |
| 683 } | 669 } |
| 684 | 670 |
| 685 void Layer::SetForceRenderSurface(bool force) { | 671 void Layer::SetForceRenderSurface(bool force) { |
| 686 if (force_render_surface_ == force) | 672 if (force_render_surface_ == force) |
| 687 return; | 673 return; |
| 688 | 674 |
| 689 force_render_surface_ = force; | 675 force_render_surface_ = force; |
| 690 cc_layer_->SetForceRenderSurface(force_render_surface_); | 676 cc_layer_->SetForceRenderSurface(force_render_surface_); |
| 691 } | 677 } |
| 692 | 678 |
| (...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_); | 925 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); |
| 940 transform.PreconcatTransform(cc_layer_->transform()); | 926 transform.PreconcatTransform(cc_layer_->transform()); |
| 941 transform.Scale(device_scale_factor_, device_scale_factor_); | 927 transform.Scale(device_scale_factor_, device_scale_factor_); |
| 942 return transform; | 928 return transform; |
| 943 } | 929 } |
| 944 | 930 |
| 945 void Layer::RecomputeDrawsContentAndUVRect() { | 931 void Layer::RecomputeDrawsContentAndUVRect() { |
| 946 DCHECK(cc_layer_); | 932 DCHECK(cc_layer_); |
| 947 gfx::Size size(bounds_.size()); | 933 gfx::Size size(bounds_.size()); |
| 948 if (texture_layer_.get()) { | 934 if (texture_layer_.get()) { |
| 949 gfx::Size texture_size; | 935 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); | 936 gfx::PointF uv_top_left(0.f, 0.f); |
| 964 gfx::PointF uv_bottom_right( | 937 gfx::PointF uv_bottom_right( |
| 965 static_cast<float>(size.width())/texture_size.width(), | 938 static_cast<float>(size.width()) / frame_size_in_dip_.width(), |
| 966 static_cast<float>(size.height())/texture_size.height()); | 939 static_cast<float>(size.height()) / frame_size_in_dip_.height()); |
| 967 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 940 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
| 968 } else if (delegated_renderer_layer_.get()) { | 941 } else if (delegated_renderer_layer_.get()) { |
| 942 size.SetToMin(frame_size_in_dip_); | |
| 969 delegated_renderer_layer_->SetDisplaySize( | 943 delegated_renderer_layer_->SetDisplaySize( |
| 970 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); | 944 ConvertSizeToPixel(this, frame_size_in_dip_)); |
| 971 size.SetToMin(delegated_frame_size_in_dip_); | |
| 972 } | 945 } |
| 973 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 946 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); |
| 974 } | 947 } |
| 975 | 948 |
| 976 void Layer::RecomputePosition() { | 949 void Layer::RecomputePosition() { |
| 977 cc_layer_->SetPosition(gfx::ScalePoint( | 950 cc_layer_->SetPosition(gfx::ScalePoint( |
| 978 gfx::PointF(bounds_.x(), bounds_.y()), | 951 gfx::PointF(bounds_.x(), bounds_.y()), |
| 979 device_scale_factor_)); | 952 device_scale_factor_)); |
| 980 } | 953 } |
| 981 | 954 |
| 982 } // namespace ui | 955 } // namespace ui |
| OLD | NEW |