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 |