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 |