Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Side by Side Diff: ui/compositor/layer.cc

Issue 271533014: Make ui::Layer use the cc:LayerTreeHost scale factor directly (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove texture scaling fix Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_animation_element.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 layer_brightness_(0.0f), 67 layer_brightness_(0.0f),
68 layer_grayscale_(0.0f), 68 layer_grayscale_(0.0f),
69 layer_inverted_(false), 69 layer_inverted_(false),
70 layer_mask_(NULL), 70 layer_mask_(NULL),
71 layer_mask_back_link_(NULL), 71 layer_mask_back_link_(NULL),
72 zoom_(1), 72 zoom_(1),
73 zoom_inset_(0), 73 zoom_inset_(0),
74 delegate_(NULL), 74 delegate_(NULL),
75 owner_(NULL), 75 owner_(NULL),
76 cc_layer_(NULL), 76 cc_layer_(NULL),
77 scale_content_(true),
78 device_scale_factor_(1.0f) { 77 device_scale_factor_(1.0f) {
79 CreateWebLayer(); 78 CreateWebLayer();
80 } 79 }
81 80
82 Layer::Layer(LayerType type) 81 Layer::Layer(LayerType type)
83 : type_(type), 82 : type_(type),
84 compositor_(NULL), 83 compositor_(NULL),
85 parent_(NULL), 84 parent_(NULL),
86 visible_(true), 85 visible_(true),
87 force_render_surface_(false), 86 force_render_surface_(false),
88 fills_bounds_opaquely_(true), 87 fills_bounds_opaquely_(true),
89 fills_bounds_completely_(false), 88 fills_bounds_completely_(false),
90 background_blur_radius_(0), 89 background_blur_radius_(0),
91 layer_saturation_(0.0f), 90 layer_saturation_(0.0f),
92 layer_brightness_(0.0f), 91 layer_brightness_(0.0f),
93 layer_grayscale_(0.0f), 92 layer_grayscale_(0.0f),
94 layer_inverted_(false), 93 layer_inverted_(false),
95 layer_mask_(NULL), 94 layer_mask_(NULL),
96 layer_mask_back_link_(NULL), 95 layer_mask_back_link_(NULL),
97 zoom_(1), 96 zoom_(1),
98 zoom_inset_(0), 97 zoom_inset_(0),
99 delegate_(NULL), 98 delegate_(NULL),
100 owner_(NULL), 99 owner_(NULL),
101 cc_layer_(NULL), 100 cc_layer_(NULL),
102 scale_content_(true),
103 device_scale_factor_(1.0f) { 101 device_scale_factor_(1.0f) {
104 CreateWebLayer(); 102 CreateWebLayer();
105 } 103 }
106 104
107 Layer::~Layer() { 105 Layer::~Layer() {
108 // Destroying the animator may cause observers to use the layer (and 106 // Destroying the animator may cause observers to use the layer (and
109 // indirectly the WebLayer). Destroy the animator first so that the WebLayer 107 // indirectly the WebLayer). Destroy the animator first so that the WebLayer
110 // is still around. 108 // is still around.
111 if (animator_.get()) 109 if (animator_.get())
112 animator_->SetDelegate(NULL); 110 animator_->SetDelegate(NULL);
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 static_cast<float>(p->bounds().y())); 433 static_cast<float>(p->bounds().y()));
436 // Use target transform so that result will be correct once animation is 434 // Use target transform so that result will be correct once animation is
437 // finished. 435 // finished.
438 if (!p->GetTargetTransform().IsIdentity()) 436 if (!p->GetTargetTransform().IsIdentity())
439 transform->ConcatTransform(p->GetTargetTransform()); 437 transform->ConcatTransform(p->GetTargetTransform());
440 transform->ConcatTransform(translation); 438 transform->ConcatTransform(translation);
441 } 439 }
442 return p == ancestor; 440 return p == ancestor;
443 } 441 }
444 442
445 // static
446 gfx::Transform Layer::ConvertTransformToCCTransform(
447 const gfx::Transform& transform,
448 float device_scale_factor) {
449 gfx::Transform cc_transform;
450 cc_transform.Scale(device_scale_factor, device_scale_factor);
451 cc_transform.PreconcatTransform(transform);
452 cc_transform.Scale(1.0f / device_scale_factor, 1.0f / device_scale_factor);
453 return cc_transform;
454 }
455
456 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { 443 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
457 if (fills_bounds_opaquely_ == fills_bounds_opaquely) 444 if (fills_bounds_opaquely_ == fills_bounds_opaquely)
458 return; 445 return;
459 446
460 fills_bounds_opaquely_ = fills_bounds_opaquely; 447 fills_bounds_opaquely_ = fills_bounds_opaquely;
461 448
462 cc_layer_->SetContentsOpaque(fills_bounds_opaquely); 449 cc_layer_->SetContentsOpaque(fills_bounds_opaquely);
463 } 450 }
464 451
465 void Layer::SetFillsBoundsCompletely(bool fills_bounds_completely) { 452 void Layer::SetFillsBoundsCompletely(bool fills_bounds_completely) {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 591
605 void Layer::SendDamagedRects() { 592 void Layer::SendDamagedRects() {
606 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) { 593 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) {
607 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { 594 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) {
608 const SkIRect& sk_damaged = iter.rect(); 595 const SkIRect& sk_damaged = iter.rect();
609 gfx::Rect damaged( 596 gfx::Rect damaged(
610 sk_damaged.x(), 597 sk_damaged.x(),
611 sk_damaged.y(), 598 sk_damaged.y(),
612 sk_damaged.width(), 599 sk_damaged.width(),
613 sk_damaged.height()); 600 sk_damaged.height());
614 601 cc_layer_->SetNeedsDisplayRect(damaged);
615 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged);
616 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel);
617 } 602 }
618 damaged_region_.setEmpty(); 603 damaged_region_.setEmpty();
619 } 604 }
620 for (size_t i = 0; i < children_.size(); ++i) 605 for (size_t i = 0; i < children_.size(); ++i)
621 children_[i]->SendDamagedRects(); 606 children_[i]->SendDamagedRects();
622 } 607 }
623 608
624 void Layer::SuppressPaint() { 609 void Layer::SuppressPaint() {
625 if (!delegate_) 610 if (!delegate_)
626 return; 611 return;
627 delegate_ = NULL; 612 delegate_ = NULL;
628 for (size_t i = 0; i < children_.size(); ++i) 613 for (size_t i = 0; i < children_.size(); ++i)
629 children_[i]->SuppressPaint(); 614 children_[i]->SuppressPaint();
630 } 615 }
631 616
632 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { 617 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) {
633 if (device_scale_factor_ == device_scale_factor) 618 if (device_scale_factor_ == device_scale_factor)
634 return; 619 return;
635 if (animator_.get()) 620 if (animator_.get())
636 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM); 621 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM);
637 gfx::Transform transform = this->transform();
638 device_scale_factor_ = device_scale_factor; 622 device_scale_factor_ = device_scale_factor;
639 RecomputeCCTransformFromTransform(transform);
640 RecomputeDrawsContentAndUVRect(); 623 RecomputeDrawsContentAndUVRect();
641 RecomputePosition(); 624 RecomputePosition();
642 SchedulePaint(gfx::Rect(bounds_.size())); 625 SchedulePaint(gfx::Rect(bounds_.size()));
643 if (delegate_) 626 if (delegate_)
644 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); 627 delegate_->OnDeviceScaleFactorChanged(device_scale_factor);
645 for (size_t i = 0; i < children_.size(); ++i) 628 for (size_t i = 0; i < children_.size(); ++i)
646 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); 629 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor);
647 if (layer_mask_) 630 if (layer_mask_)
648 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); 631 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor);
649 } 632 }
650 633
651 void Layer::RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) { 634 void Layer::RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) {
652 cc_layer_->RequestCopyOfOutput(request.Pass()); 635 cc_layer_->RequestCopyOfOutput(request.Pass());
653 } 636 }
654 637
655 void Layer::PaintContents(SkCanvas* sk_canvas, 638 void Layer::PaintContents(SkCanvas* sk_canvas,
656 const gfx::Rect& clip, 639 const gfx::Rect& clip,
657 gfx::RectF* opaque, 640 gfx::RectF* opaque,
658 ContentLayerClient::GraphicsContextStatus gc_status) { 641 ContentLayerClient::GraphicsContextStatus gc_status) {
659 TRACE_EVENT0("ui", "Layer::PaintContents"); 642 TRACE_EVENT0("ui", "Layer::PaintContents");
660 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling( 643 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
661 sk_canvas, device_scale_factor_)); 644 sk_canvas, device_scale_factor_));
662
663 bool scale_content = scale_content_;
664 if (scale_content) {
665 canvas->Save();
666 canvas->sk_canvas()->scale(SkFloatToScalar(device_scale_factor_),
667 SkFloatToScalar(device_scale_factor_));
668 }
669
670 if (delegate_) 645 if (delegate_)
671 delegate_->OnPaintLayer(canvas.get()); 646 delegate_->OnPaintLayer(canvas.get());
672 if (scale_content)
673 canvas->Restore();
674 } 647 }
675 648
676 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } 649 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; }
677 650
678 bool Layer::PrepareTextureMailbox( 651 bool Layer::PrepareTextureMailbox(
679 cc::TextureMailbox* mailbox, 652 cc::TextureMailbox* mailbox,
680 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 653 scoped_ptr<cc::SingleReleaseCallback>* release_callback,
681 bool use_shared_memory) { 654 bool use_shared_memory) {
682 if (!mailbox_release_callback_) 655 if (!mailbox_release_callback_)
683 return false; 656 return false;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 // automatically when we get visible. 754 // automatically when we get visible.
782 if (IsDrawn()) 755 if (IsDrawn())
783 ScheduleDraw(); 756 ScheduleDraw();
784 } else { 757 } else {
785 // Always schedule a paint, even if we're invisible. 758 // Always schedule a paint, even if we're invisible.
786 SchedulePaint(gfx::Rect(bounds.size())); 759 SchedulePaint(gfx::Rect(bounds.size()));
787 } 760 }
788 } 761 }
789 762
790 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) { 763 void Layer::SetTransformFromAnimation(const gfx::Transform& transform) {
791 RecomputeCCTransformFromTransform(transform); 764 cc_layer_->SetTransform(transform);
792 } 765 }
793 766
794 void Layer::SetOpacityFromAnimation(float opacity) { 767 void Layer::SetOpacityFromAnimation(float opacity) {
795 cc_layer_->SetOpacity(opacity); 768 cc_layer_->SetOpacity(opacity);
796 ScheduleDraw(); 769 ScheduleDraw();
797 } 770 }
798 771
799 void Layer::SetVisibilityFromAnimation(bool visible) { 772 void Layer::SetVisibilityFromAnimation(bool visible) {
800 if (visible_ == visible) 773 if (visible_ == visible)
801 return; 774 return;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 cc_layer_ = content_layer_.get(); 899 cc_layer_ = content_layer_.get();
927 } 900 }
928 cc_layer_->SetAnchorPoint(gfx::PointF()); 901 cc_layer_->SetAnchorPoint(gfx::PointF());
929 cc_layer_->SetContentsOpaque(true); 902 cc_layer_->SetContentsOpaque(true);
930 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); 903 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN);
931 cc_layer_->AddLayerAnimationEventObserver(this); 904 cc_layer_->AddLayerAnimationEventObserver(this);
932 cc_layer_->SetLayerClient(this); 905 cc_layer_->SetLayerClient(this);
933 RecomputePosition(); 906 RecomputePosition();
934 } 907 }
935 908
936 void Layer::RecomputeCCTransformFromTransform(const gfx::Transform& transform) {
937 cc_layer_->SetTransform(ConvertTransformToCCTransform(transform,
938 device_scale_factor_));
939 }
940
941 gfx::Transform Layer::transform() const { 909 gfx::Transform Layer::transform() const {
942 gfx::Transform transform; 910 return cc_layer_->transform();
943 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_);
944 transform.PreconcatTransform(cc_layer_->transform());
945 transform.Scale(device_scale_factor_, device_scale_factor_);
946 return transform;
947 } 911 }
948 912
949 void Layer::RecomputeDrawsContentAndUVRect() { 913 void Layer::RecomputeDrawsContentAndUVRect() {
950 DCHECK(cc_layer_); 914 DCHECK(cc_layer_);
951 gfx::Size size(bounds_.size()); 915 gfx::Size size(bounds_.size());
952 if (texture_layer_.get()) { 916 if (texture_layer_.get()) {
953 size.SetToMin(frame_size_in_dip_); 917 size.SetToMin(frame_size_in_dip_);
954 gfx::PointF uv_top_left(0.f, 0.f); 918 gfx::PointF uv_top_left(0.f, 0.f);
955 gfx::PointF uv_bottom_right( 919 gfx::PointF uv_bottom_right(
956 static_cast<float>(size.width()) / frame_size_in_dip_.width(), 920 static_cast<float>(size.width()) / frame_size_in_dip_.width(),
957 static_cast<float>(size.height()) / frame_size_in_dip_.height()); 921 static_cast<float>(size.height()) / frame_size_in_dip_.height());
958 texture_layer_->SetUV(uv_top_left, uv_bottom_right); 922 texture_layer_->SetUV(uv_top_left, uv_bottom_right);
959 } else if (delegated_renderer_layer_.get()) { 923 } else if (delegated_renderer_layer_.get()) {
960 size.SetToMin(frame_size_in_dip_); 924 size.SetToMin(frame_size_in_dip_);
961 delegated_renderer_layer_->SetDisplaySize( 925 delegated_renderer_layer_->SetDisplaySize(frame_size_in_dip_);
962 ConvertSizeToPixel(this, frame_size_in_dip_));
963 } 926 }
964 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); 927 cc_layer_->SetBounds(size);
965 } 928 }
966 929
967 void Layer::RecomputePosition() { 930 void Layer::RecomputePosition() {
968 cc_layer_->SetPosition(gfx::ScalePoint( 931 cc_layer_->SetPosition(gfx::PointF(bounds_.x(), bounds_.y()));
969 gfx::PointF(bounds_.x(), bounds_.y()),
970 device_scale_factor_));
971 } 932 }
972 933
973 } // namespace ui 934 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_animation_element.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698