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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 if (!p->GetTargetTransform().IsIdentity()) | 418 if (!p->GetTargetTransform().IsIdentity()) |
419 transform->ConcatTransform(p->GetTargetTransform()); | 419 transform->ConcatTransform(p->GetTargetTransform()); |
420 transform->ConcatTransform(translation); | 420 transform->ConcatTransform(translation); |
421 } | 421 } |
422 return p == ancestor; | 422 return p == ancestor; |
423 } | 423 } |
424 | 424 |
425 // static | 425 // static |
426 gfx::Transform Layer::ConvertTransformToCCTransform( | 426 gfx::Transform Layer::ConvertTransformToCCTransform( |
427 const gfx::Transform& transform, | 427 const gfx::Transform& transform, |
428 const gfx::Rect& bounds, | |
429 float device_scale_factor) { | 428 float device_scale_factor) { |
430 gfx::Transform cc_transform; | 429 gfx::Transform cc_transform; |
431 cc_transform.Scale(device_scale_factor, device_scale_factor); | 430 cc_transform.Scale(device_scale_factor, device_scale_factor); |
432 cc_transform.Translate(bounds.x(), bounds.y()); | |
433 cc_transform.PreconcatTransform(transform); | 431 cc_transform.PreconcatTransform(transform); |
434 cc_transform.Scale(1.0f / device_scale_factor, 1.0f / device_scale_factor); | 432 cc_transform.Scale(1.0f / device_scale_factor, 1.0f / device_scale_factor); |
435 return cc_transform; | 433 return cc_transform; |
436 } | 434 } |
437 | 435 |
438 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { | 436 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { |
439 if (fills_bounds_opaquely_ == fills_bounds_opaquely) | 437 if (fills_bounds_opaquely_ == fills_bounds_opaquely) |
440 return; | 438 return; |
441 | 439 |
442 fills_bounds_opaquely_ = fills_bounds_opaquely; | 440 fills_bounds_opaquely_ = fills_bounds_opaquely; |
(...skipping 13 matching lines...) Expand all Loading... |
456 // TODO(piman): delegated_renderer_layer_ cleanup. | 454 // TODO(piman): delegated_renderer_layer_ cleanup. |
457 | 455 |
458 cc_layer_->RemoveAllChildren(); | 456 cc_layer_->RemoveAllChildren(); |
459 if (parent_) { | 457 if (parent_) { |
460 DCHECK(parent_->cc_layer_); | 458 DCHECK(parent_->cc_layer_); |
461 parent_->cc_layer_->ReplaceChild(cc_layer_, new_layer); | 459 parent_->cc_layer_->ReplaceChild(cc_layer_, new_layer); |
462 } | 460 } |
463 cc_layer_->RemoveLayerAnimationEventObserver(this); | 461 cc_layer_->RemoveLayerAnimationEventObserver(this); |
464 new_layer->SetOpacity(cc_layer_->opacity()); | 462 new_layer->SetOpacity(cc_layer_->opacity()); |
465 new_layer->SetTransform(cc_layer_->transform()); | 463 new_layer->SetTransform(cc_layer_->transform()); |
| 464 new_layer->SetPosition(cc_layer_->position()); |
466 | 465 |
467 cc_layer_= new_layer; | 466 cc_layer_= new_layer; |
468 content_layer_ = NULL; | 467 content_layer_ = NULL; |
469 solid_color_layer_ = NULL; | 468 solid_color_layer_ = NULL; |
470 texture_layer_ = NULL; | 469 texture_layer_ = NULL; |
471 delegated_renderer_layer_ = NULL; | 470 delegated_renderer_layer_ = NULL; |
472 | 471 |
473 cc_layer_->AddLayerAnimationEventObserver(this); | 472 cc_layer_->AddLayerAnimationEventObserver(this); |
474 for (size_t i = 0; i < children_.size(); ++i) { | 473 for (size_t i = 0; i < children_.size(); ++i) { |
475 DCHECK(children_[i]->cc_layer_); | 474 DCHECK(children_[i]->cc_layer_); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 | 593 |
595 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { | 594 void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) { |
596 if (device_scale_factor_ == device_scale_factor) | 595 if (device_scale_factor_ == device_scale_factor) |
597 return; | 596 return; |
598 if (animator_) | 597 if (animator_) |
599 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM); | 598 animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM); |
600 gfx::Transform transform = this->transform(); | 599 gfx::Transform transform = this->transform(); |
601 device_scale_factor_ = device_scale_factor; | 600 device_scale_factor_ = device_scale_factor; |
602 RecomputeCCTransformFromTransform(transform); | 601 RecomputeCCTransformFromTransform(transform); |
603 RecomputeDrawsContentAndUVRect(); | 602 RecomputeDrawsContentAndUVRect(); |
| 603 RecomputePosition(); |
604 SchedulePaint(gfx::Rect(bounds_.size())); | 604 SchedulePaint(gfx::Rect(bounds_.size())); |
605 if (delegate_) | 605 if (delegate_) |
606 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); | 606 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); |
607 for (size_t i = 0; i < children_.size(); ++i) | 607 for (size_t i = 0; i < children_.size(); ++i) |
608 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); | 608 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); |
609 if (layer_mask_) | 609 if (layer_mask_) |
610 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); | 610 layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor); |
611 } | 611 } |
612 | 612 |
613 void Layer::PaintContents(SkCanvas* sk_canvas, | 613 void Layer::PaintContents(SkCanvas* sk_canvas, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 } | 697 } |
698 | 698 |
699 void Layer::SetBoundsImmediately(const gfx::Rect& bounds) { | 699 void Layer::SetBoundsImmediately(const gfx::Rect& bounds) { |
700 if (bounds == bounds_) | 700 if (bounds == bounds_) |
701 return; | 701 return; |
702 | 702 |
703 base::Closure closure; | 703 base::Closure closure; |
704 if (delegate_) | 704 if (delegate_) |
705 closure = delegate_->PrepareForLayerBoundsChange(); | 705 closure = delegate_->PrepareForLayerBoundsChange(); |
706 bool was_move = bounds_.size() == bounds.size(); | 706 bool was_move = bounds_.size() == bounds.size(); |
707 gfx::Transform transform = this->transform(); | |
708 bounds_ = bounds; | 707 bounds_ = bounds; |
709 | 708 |
710 RecomputeCCTransformFromTransform(transform); | |
711 RecomputeDrawsContentAndUVRect(); | 709 RecomputeDrawsContentAndUVRect(); |
| 710 RecomputePosition(); |
| 711 |
712 if (!closure.is_null()) | 712 if (!closure.is_null()) |
713 closure.Run(); | 713 closure.Run(); |
714 | 714 |
715 if (was_move) { | 715 if (was_move) { |
716 // Don't schedule a draw if we're invisible. We'll schedule one | 716 // Don't schedule a draw if we're invisible. We'll schedule one |
717 // automatically when we get visible. | 717 // automatically when we get visible. |
718 if (IsDrawn()) | 718 if (IsDrawn()) |
719 ScheduleDraw(); | 719 ScheduleDraw(); |
720 } else { | 720 } else { |
721 // Always schedule a paint, even if we're invisible. | 721 // Always schedule a paint, even if we're invisible. |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 solid_color_layer_ = cc::SolidColorLayer::Create(); | 884 solid_color_layer_ = cc::SolidColorLayer::Create(); |
885 cc_layer_ = solid_color_layer_.get(); | 885 cc_layer_ = solid_color_layer_.get(); |
886 } else { | 886 } else { |
887 content_layer_ = cc::ContentLayer::Create(this); | 887 content_layer_ = cc::ContentLayer::Create(this); |
888 cc_layer_ = content_layer_.get(); | 888 cc_layer_ = content_layer_.get(); |
889 } | 889 } |
890 cc_layer_->SetAnchorPoint(gfx::PointF()); | 890 cc_layer_->SetAnchorPoint(gfx::PointF()); |
891 cc_layer_->SetContentsOpaque(true); | 891 cc_layer_->SetContentsOpaque(true); |
892 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); | 892 cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN); |
893 cc_layer_->AddLayerAnimationEventObserver(this); | 893 cc_layer_->AddLayerAnimationEventObserver(this); |
| 894 RecomputePosition(); |
894 } | 895 } |
895 | 896 |
896 void Layer::RecomputeCCTransformFromTransform(const gfx::Transform& transform) { | 897 void Layer::RecomputeCCTransformFromTransform(const gfx::Transform& transform) { |
897 cc_layer_->SetTransform(ConvertTransformToCCTransform(transform, | 898 cc_layer_->SetTransform(ConvertTransformToCCTransform(transform, |
898 bounds_, | |
899 device_scale_factor_)); | 899 device_scale_factor_)); |
900 } | 900 } |
901 | 901 |
902 gfx::Transform Layer::transform() const { | 902 gfx::Transform Layer::transform() const { |
903 gfx::Transform transform; | 903 gfx::Transform transform; |
904 transform.Translate(-bounds_.x(), -bounds_.y()); | |
905 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); | 904 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); |
906 transform.PreconcatTransform(cc_layer_->transform()); | 905 transform.PreconcatTransform(cc_layer_->transform()); |
907 transform.Scale(device_scale_factor_, device_scale_factor_); | 906 transform.Scale(device_scale_factor_, device_scale_factor_); |
908 return transform; | 907 return transform; |
909 } | 908 } |
910 | 909 |
911 void Layer::RecomputeDrawsContentAndUVRect() { | 910 void Layer::RecomputeDrawsContentAndUVRect() { |
912 DCHECK(cc_layer_); | 911 DCHECK(cc_layer_); |
913 gfx::Size size(bounds_.size()); | 912 gfx::Size size(bounds_.size()); |
914 if (texture_layer_.get()) { | 913 if (texture_layer_.get()) { |
(...skipping 10 matching lines...) Expand all Loading... |
925 static_cast<float>(size.height())/texture_size.height()); | 924 static_cast<float>(size.height())/texture_size.height()); |
926 texture_layer_->SetUV(uv_top_left, uv_bottom_right); | 925 texture_layer_->SetUV(uv_top_left, uv_bottom_right); |
927 } else if (delegated_renderer_layer_.get()) { | 926 } else if (delegated_renderer_layer_.get()) { |
928 delegated_renderer_layer_->SetDisplaySize( | 927 delegated_renderer_layer_->SetDisplaySize( |
929 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); | 928 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); |
930 size.ClampToMax(delegated_frame_size_in_dip_); | 929 size.ClampToMax(delegated_frame_size_in_dip_); |
931 } | 930 } |
932 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); | 931 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); |
933 } | 932 } |
934 | 933 |
| 934 void Layer::RecomputePosition() { |
| 935 cc_layer_->SetPosition(gfx::ScalePoint( |
| 936 gfx::PointF(bounds_.x(), bounds_.y()), |
| 937 device_scale_factor_)); |
| 938 } |
| 939 |
935 } // namespace ui | 940 } // namespace ui |
OLD | NEW |