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

Side by Side Diff: cc/layers/layer_impl.cc

Issue 23983047: Pinch/Zoom Infrastructure & Plumbing CL (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Backup 2013.10.29 Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/layers/layer_impl.h" 5 #include "cc/layers/layer_impl.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "cc/animation/animation_registrar.h" 9 #include "cc/animation/animation_registrar.h"
10 #include "cc/animation/scrollbar_animation_controller.h" 10 #include "cc/animation/scrollbar_animation_controller.h"
(...skipping 21 matching lines...) Expand all
32 : parent_(NULL), 32 : parent_(NULL),
33 scroll_parent_(NULL), 33 scroll_parent_(NULL),
34 clip_parent_(NULL), 34 clip_parent_(NULL),
35 mask_layer_id_(-1), 35 mask_layer_id_(-1),
36 replica_layer_id_(-1), 36 replica_layer_id_(-1),
37 layer_id_(id), 37 layer_id_(id),
38 layer_tree_impl_(tree_impl), 38 layer_tree_impl_(tree_impl),
39 anchor_point_(0.5f, 0.5f), 39 anchor_point_(0.5f, 0.5f),
40 anchor_point_z_(0.f), 40 anchor_point_z_(0.f),
41 scroll_offset_delegate_(NULL), 41 scroll_offset_delegate_(NULL),
42 scrollable_(false), 42 clip_layer_(NULL),
43 should_scroll_on_main_thread_(false), 43 should_scroll_on_main_thread_(false),
44 have_wheel_event_handlers_(false), 44 have_wheel_event_handlers_(false),
45 user_scrollable_horizontal_(true), 45 user_scrollable_horizontal_(true),
46 user_scrollable_vertical_(true), 46 user_scrollable_vertical_(true),
47 background_color_(0), 47 background_color_(0),
48 stacking_order_changed_(false), 48 stacking_order_changed_(false),
49 double_sided_(true), 49 double_sided_(true),
50 layer_property_changed_(false), 50 layer_property_changed_(false),
51 masks_to_bounds_(false), 51 masks_to_bounds_(false),
52 contents_opaque_(false), 52 contents_opaque_(false),
53 opacity_(1.0), 53 opacity_(1.0),
54 preserves_3d_(false), 54 preserves_3d_(false),
55 use_parent_backface_visibility_(false), 55 use_parent_backface_visibility_(false),
56 draw_checkerboard_for_missing_tiles_(false), 56 draw_checkerboard_for_missing_tiles_(false),
57 draws_content_(false), 57 draws_content_(false),
58 hide_layer_and_subtree_(false), 58 hide_layer_and_subtree_(false),
59 force_render_surface_(false), 59 force_render_surface_(false),
60 is_container_for_fixed_position_layers_(false), 60 is_container_for_fixed_position_layers_(false),
61 draw_depth_(0.f), 61 draw_depth_(0.f),
62 compositing_reasons_(kCompositingReasonUnknown), 62 compositing_reasons_(kCompositingReasonUnknown),
63 current_draw_mode_(DRAW_MODE_NONE), 63 current_draw_mode_(DRAW_MODE_NONE) {
64 horizontal_scrollbar_layer_(NULL),
65 vertical_scrollbar_layer_(NULL) {
66 DCHECK_GT(layer_id_, 0); 64 DCHECK_GT(layer_id_, 0);
67 DCHECK(layer_tree_impl_); 65 DCHECK(layer_tree_impl_);
68 layer_tree_impl_->RegisterLayer(this); 66 layer_tree_impl_->RegisterLayer(this);
69 AnimationRegistrar* registrar = layer_tree_impl_->animationRegistrar(); 67 AnimationRegistrar* registrar = layer_tree_impl_->animationRegistrar();
70 layer_animation_controller_ = 68 layer_animation_controller_ =
71 registrar->GetAnimationControllerForId(layer_id_); 69 registrar->GetAnimationControllerForId(layer_id_);
72 layer_animation_controller_->AddValueObserver(this); 70 layer_animation_controller_->AddValueObserver(this);
73 } 71 }
74 72
75 LayerImpl::~LayerImpl() { 73 LayerImpl::~LayerImpl() {
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 if (!user_scrollable_horizontal_) { 345 if (!user_scrollable_horizontal_) {
348 scroll_hidden.set_x(scroll.x()); 346 scroll_hidden.set_x(scroll.x());
349 scroll.set_x(0.f); 347 scroll.set_x(0.f);
350 } 348 }
351 if (!user_scrollable_vertical_) { 349 if (!user_scrollable_vertical_) {
352 scroll_hidden.set_y(scroll.y()); 350 scroll_hidden.set_y(scroll.y());
353 scroll.set_y(0.f); 351 scroll.set_y(0.f);
354 } 352 }
355 353
356 gfx::Vector2dF min_delta = -scroll_offset_; 354 gfx::Vector2dF min_delta = -scroll_offset_;
357 gfx::Vector2dF max_delta = max_scroll_offset_ - scroll_offset_; 355 gfx::Vector2dF max_delta = MaxScrollOffset() - scroll_offset_;
358 // Clamp new_delta so that position + delta stays within scroll bounds. 356 // Clamp new_delta so that position + delta stays within scroll bounds.
359 gfx::Vector2dF new_delta = (ScrollDelta() + scroll); 357 gfx::Vector2dF new_delta = (ScrollDelta() + scroll);
360 new_delta.SetToMax(min_delta); 358 new_delta.SetToMax(min_delta);
361 new_delta.SetToMin(max_delta); 359 new_delta.SetToMin(max_delta);
362 gfx::Vector2dF unscrolled = 360 gfx::Vector2dF unscrolled =
363 ScrollDelta() + scroll + scroll_hidden - new_delta; 361 ScrollDelta() + scroll + scroll_hidden - new_delta;
364 SetScrollDelta(new_delta); 362 SetScrollDelta(new_delta);
363 /*
364 if (this == layer_tree_impl()->OuterViewportScrollLayer() ||
365 this == layer_tree_impl()->InnerViewportScrollLayer()) {
366 gfx::Vector2dF max = MaxScrollOffset();
367 fprintf(stderr, "wjm: LayerImpl::ScrollBy(%p, %f, %f), unscrolled = (%f,%f)"
368 ", offset = (%d,%d), max = (%f,%f), delta = (%f,%f)\n",
369 this, scroll.x(), scroll.y(), unscrolled.x(), unscrolled.y(),
370 scroll_offset_.x(), scroll_offset_.y(), max.x(), max.y(),
371 new_delta.x(), new_delta.y());
372 }
373 */
365 return unscrolled; 374 return unscrolled;
366 } 375 }
367 376
377 void LayerImpl::SetScrollable(int clip_layer_id) {
enne (OOO) 2013/10/31 18:45:58 SetScrollable => SetClipLayerId, or possibly just
wjmaclean 2013/11/13 21:01:29 Sure, we could re-name it to SetClipLayerId(). Not
378 clip_layer_ = layer_tree_impl()->LayerById(clip_layer_id);
379 }
380
368 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { 381 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() {
369 // Pending tree never has sent scroll deltas 382 // Pending tree never has sent scroll deltas
370 DCHECK(layer_tree_impl()->IsActiveTree()); 383 DCHECK(layer_tree_impl()->IsActiveTree());
371 384
372 // Apply sent scroll deltas to scroll position / scroll delta as if the 385 // Apply sent scroll deltas to scroll position / scroll delta as if the
373 // main thread had applied them and then committed those values. 386 // main thread had applied them and then committed those values.
374 // 387 //
375 // This function should not change the total scroll offset; it just shifts 388 // This function should not change the total scroll offset; it just shifts
376 // some of the scroll delta to the scroll offset. Therefore, adjust these 389 // some of the scroll delta to the scroll offset. Therefore, adjust these
377 // variables directly rather than calling the scroll offset delegate to 390 // variables directly rather than calling the scroll offset delegate to
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 if (type == InputHandler::Wheel && have_wheel_event_handlers()) { 460 if (type == InputHandler::Wheel && have_wheel_event_handlers()) {
448 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers"); 461 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Failed WheelEventHandlers");
449 return InputHandler::ScrollOnMainThread; 462 return InputHandler::ScrollOnMainThread;
450 } 463 }
451 464
452 if (!scrollable()) { 465 if (!scrollable()) {
453 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); 466 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable");
454 return InputHandler::ScrollIgnored; 467 return InputHandler::ScrollIgnored;
455 } 468 }
456 469
457 if (max_scroll_offset_.x() <= 0 && max_scroll_offset_.y() <= 0) { 470 gfx::Vector2d max_scroll_offset = MaxScrollOffset();
471 if (max_scroll_offset.x() <= 0 && max_scroll_offset.y() <= 0) {
458 TRACE_EVENT0("cc", 472 TRACE_EVENT0("cc",
459 "LayerImpl::tryScroll: Ignored. Technically scrollable," 473 "LayerImpl::tryScroll: Ignored. Technically scrollable,"
460 " but has no affordance in either direction."); 474 " but has no affordance in either direction.");
461 return InputHandler::ScrollIgnored; 475 return InputHandler::ScrollIgnored;
462 } 476 }
463 477
464 if (!user_scrollable_horizontal_ && !user_scrollable_vertical_) { 478 if (!user_scrollable_horizontal_ && !user_scrollable_vertical_) {
465 TRACE_EVENT0("cc", 479 TRACE_EVENT0("cc",
466 "LayerImpl::TryScroll: Ignored. User gesture is not allowed" 480 "LayerImpl::TryScroll: Ignored. User gesture is not allowed"
467 " to scroll this layer."); 481 " to scroll this layer.");
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 layer->SetPosition(position_); 539 layer->SetPosition(position_);
526 layer->SetIsContainerForFixedPositionLayers( 540 layer->SetIsContainerForFixedPositionLayers(
527 is_container_for_fixed_position_layers_); 541 is_container_for_fixed_position_layers_);
528 layer->SetFixedContainerSizeDelta(fixed_container_size_delta_); 542 layer->SetFixedContainerSizeDelta(fixed_container_size_delta_);
529 layer->SetPositionConstraint(position_constraint_); 543 layer->SetPositionConstraint(position_constraint_);
530 layer->SetPreserves3d(preserves_3d()); 544 layer->SetPreserves3d(preserves_3d());
531 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_); 545 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_);
532 layer->SetSublayerTransform(sublayer_transform_); 546 layer->SetSublayerTransform(sublayer_transform_);
533 layer->SetTransform(transform_); 547 layer->SetTransform(transform_);
534 548
535 layer->SetScrollable(scrollable_); 549 layer->SetScrollable(clip_layer_ ? clip_layer_->id() : Layer::INVALID_ID);
536 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); 550 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_);
537 layer->set_user_scrollable_vertical(user_scrollable_vertical_); 551 layer->set_user_scrollable_vertical(user_scrollable_vertical_);
538 layer->SetScrollOffsetAndDelta( 552 layer->SetScrollOffsetAndDelta(
539 scroll_offset_, layer->ScrollDelta() - layer->sent_scroll_delta()); 553 scroll_offset_, layer->ScrollDelta() - layer->sent_scroll_delta());
540 layer->SetSentScrollDelta(gfx::Vector2d()); 554 layer->SetSentScrollDelta(gfx::Vector2d());
541 555
542 layer->SetMaxScrollOffset(max_scroll_offset_);
543
544 LayerImpl* scroll_parent = NULL; 556 LayerImpl* scroll_parent = NULL;
545 if (scroll_parent_) 557 if (scroll_parent_)
546 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); 558 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id());
547 559
548 layer->SetScrollParent(scroll_parent); 560 layer->SetScrollParent(scroll_parent);
549 if (scroll_children_) { 561 if (scroll_children_) {
550 std::set<LayerImpl*>* scroll_children = new std::set<LayerImpl*>; 562 std::set<LayerImpl*>* scroll_children = new std::set<LayerImpl*>;
551 for (std::set<LayerImpl*>::iterator it = scroll_children_->begin(); 563 for (std::set<LayerImpl*>::iterator it = scroll_children_->begin();
552 it != scroll_children_->end(); ++it) 564 it != scroll_children_->end(); ++it)
553 scroll_children->insert(layer->layer_tree_impl()->LayerById((*it)->id())); 565 scroll_children->insert(layer->layer_tree_impl()->LayerById((*it)->id()));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 gfx_transform.matrix().asColMajord(transform); 616 gfx_transform.matrix().asColMajord(transform);
605 list = new base::ListValue; 617 list = new base::ListValue;
606 for (int i = 0; i < 16; ++i) 618 for (int i = 0; i < 16; ++i)
607 list->AppendDouble(transform[i]); 619 list->AppendDouble(transform[i]);
608 result->Set("DrawTransform", list); 620 result->Set("DrawTransform", list);
609 621
610 result->SetBoolean("DrawsContent", draws_content_); 622 result->SetBoolean("DrawsContent", draws_content_);
611 result->SetDouble("Opacity", opacity()); 623 result->SetDouble("Opacity", opacity());
612 result->SetBoolean("ContentsOpaque", contents_opaque_); 624 result->SetBoolean("ContentsOpaque", contents_opaque_);
613 625
614 if (scrollable_) 626 if (scrollable())
615 result->SetBoolean("Scrollable", scrollable_); 627 result->SetBoolean("Scrollable", true);
616 628
617 list = new base::ListValue; 629 list = new base::ListValue;
618 for (size_t i = 0; i < children_.size(); ++i) 630 for (size_t i = 0; i < children_.size(); ++i)
619 list->Append(children_[i]->LayerTreeAsJson()); 631 list->Append(children_[i]->LayerTreeAsJson());
620 result->Set("Children", list); 632 result->Set("Children", list);
621 633
622 return result; 634 return result;
623 } 635 }
624 636
625 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) { 637 void LayerImpl::SetStackingOrderChanged(bool stacking_order_changed) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 bool LayerImpl::IsActive() const { 700 bool LayerImpl::IsActive() const {
689 return layer_tree_impl_->IsActiveTree(); 701 return layer_tree_impl_->IsActiveTree();
690 } 702 }
691 703
692 void LayerImpl::SetBounds(gfx::Size bounds) { 704 void LayerImpl::SetBounds(gfx::Size bounds) {
693 if (bounds_ == bounds) 705 if (bounds_ == bounds)
694 return; 706 return;
695 707
696 bounds_ = bounds; 708 bounds_ = bounds;
697 709
710 NotifyScrollbars();
698 if (masks_to_bounds()) 711 if (masks_to_bounds())
699 NoteLayerPropertyChangedForSubtree(); 712 NoteLayerPropertyChangedForSubtree();
700 else 713 else
701 NoteLayerPropertyChanged(); 714 NoteLayerPropertyChanged();
702 } 715 }
703 716
704 void LayerImpl::SetMaskLayer(scoped_ptr<LayerImpl> mask_layer) { 717 void LayerImpl::SetMaskLayer(scoped_ptr<LayerImpl> mask_layer) {
705 int new_layer_id = mask_layer ? mask_layer->id() : -1; 718 int new_layer_id = mask_layer ? mask_layer->id() : -1;
706 719
707 if (mask_layer) { 720 if (mask_layer) {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 float* contents_scale_x, 953 float* contents_scale_x,
941 float* contents_scale_y, 954 float* contents_scale_y,
942 gfx::Size* content_bounds) { 955 gfx::Size* content_bounds) {
943 // Base LayerImpl has all of its content scales and content bounds pushed 956 // Base LayerImpl has all of its content scales and content bounds pushed
944 // from its Layer during commit and just reuses those values as-is. 957 // from its Layer during commit and just reuses those values as-is.
945 *contents_scale_x = this->contents_scale_x(); 958 *contents_scale_x = this->contents_scale_x();
946 *contents_scale_y = this->contents_scale_y(); 959 *contents_scale_y = this->contents_scale_y();
947 *content_bounds = this->content_bounds(); 960 *content_bounds = this->content_bounds();
948 } 961 }
949 962
950 void LayerImpl::UpdateScrollbarPositions() {
951 gfx::Vector2dF current_offset = scroll_offset_ + ScrollDelta();
952
953 gfx::RectF viewport(PointAtOffsetFromOrigin(current_offset), bounds_);
954 gfx::SizeF scrollable_size(max_scroll_offset_.x() + bounds_.width(),
955 max_scroll_offset_.y() + bounds_.height());
956 if (horizontal_scrollbar_layer_) {
957 horizontal_scrollbar_layer_->SetCurrentPos(current_offset.x());
958 horizontal_scrollbar_layer_->SetMaximum(max_scroll_offset_.x());
959 horizontal_scrollbar_layer_->SetVisibleToTotalLengthRatio(
960 viewport.width() / scrollable_size.width());
961 }
962 if (vertical_scrollbar_layer_) {
963 vertical_scrollbar_layer_->SetCurrentPos(current_offset.y());
964 vertical_scrollbar_layer_->SetMaximum(max_scroll_offset_.y());
965 vertical_scrollbar_layer_->SetVisibleToTotalLengthRatio(
966 viewport.height() / scrollable_size.height());
967 }
968
969 if (current_offset == last_scroll_offset_)
970 return;
971 last_scroll_offset_ = current_offset;
972
973 if (scrollbar_animation_controller_) {
974 bool should_animate = scrollbar_animation_controller_->DidScrollUpdate(
975 layer_tree_impl_->CurrentPhysicalTimeTicks());
976 if (should_animate)
977 layer_tree_impl_->StartScrollbarAnimation();
978 }
979
980 // Get the current_offset_.y() value for a sanity-check on scrolling
981 // benchmark metrics. Specifically, we want to make sure
982 // BasicMouseWheelSmoothScrollGesture has proper scroll curves.
983 if (layer_tree_impl()->IsActiveTree()) {
984 TRACE_COUNTER_ID1("gpu", "scroll_offset_y", this->id(), current_offset.y());
985 }
986 }
987
988 void LayerImpl::SetScrollOffsetDelegate( 963 void LayerImpl::SetScrollOffsetDelegate(
989 LayerScrollOffsetDelegate* scroll_offset_delegate) { 964 LayerScrollOffsetDelegate* scroll_offset_delegate) {
990 // Having both a scroll parent and a scroll offset delegate is unsupported. 965 // Having both a scroll parent and a scroll offset delegate is unsupported.
991 DCHECK(!scroll_parent_); 966 DCHECK(!scroll_parent_);
992 if (!scroll_offset_delegate && scroll_offset_delegate_) { 967 if (!scroll_offset_delegate && scroll_offset_delegate_) {
993 scroll_delta_ = 968 scroll_delta_ =
994 scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_; 969 scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_;
995 } 970 }
996 gfx::Vector2dF total_offset = TotalScrollOffset();
997 scroll_offset_delegate_ = scroll_offset_delegate; 971 scroll_offset_delegate_ = scroll_offset_delegate;
998 if (scroll_offset_delegate_) {
999 scroll_offset_delegate_->SetMaxScrollOffset(max_scroll_offset_);
1000 scroll_offset_delegate_->SetTotalScrollOffset(total_offset);
1001 }
1002 } 972 }
1003 973
1004 bool LayerImpl::IsExternalFlingActive() const { 974 bool LayerImpl::IsExternalFlingActive() const {
1005 return scroll_offset_delegate_ && 975 return scroll_offset_delegate_ &&
1006 scroll_offset_delegate_->IsExternalFlingActive(); 976 scroll_offset_delegate_->IsExternalFlingActive();
1007 } 977 }
1008 978
1009 void LayerImpl::SetScrollOffset(gfx::Vector2d scroll_offset) { 979 void LayerImpl::SetScrollOffset(gfx::Vector2d scroll_offset) {
1010 SetScrollOffsetAndDelta(scroll_offset, ScrollDelta()); 980 SetScrollOffsetAndDelta(scroll_offset, ScrollDelta());
1011 } 981 }
1012 982
1013 void LayerImpl::SetScrollOffsetAndDelta(gfx::Vector2d scroll_offset, 983 void LayerImpl::SetScrollOffsetAndDelta(gfx::Vector2d scroll_offset,
1014 gfx::Vector2dF scroll_delta) { 984 gfx::Vector2dF scroll_delta) {
1015 bool changed = false; 985 bool changed = false;
1016 986
987 last_scroll_offset_ = scroll_offset;
988
1017 if (scroll_offset_ != scroll_offset) { 989 if (scroll_offset_ != scroll_offset) {
1018 changed = true; 990 changed = true;
1019 scroll_offset_ = scroll_offset; 991 scroll_offset_ = scroll_offset;
992 gfx::Vector2dF max = MaxScrollOffset();
993 if (scroll_offset_.x() > max.x() || scroll_offset_.y() > max.y())
994 fprintf(stderr, "wjm: LI::SetScrollOffsetAndDelta() scroll_offset too larg e!\n");
1020 995
1021 if (scroll_offset_delegate_) 996 if (scroll_offset_delegate_)
1022 scroll_offset_delegate_->SetTotalScrollOffset(TotalScrollOffset()); 997 scroll_offset_delegate_->SetTotalScrollOffset(TotalScrollOffset());
1023 } 998 }
1024 999
1025 if (ScrollDelta() != scroll_delta) { 1000 if (ScrollDelta() != scroll_delta) {
1026 changed = true; 1001 changed = true;
1027 if (layer_tree_impl()->IsActiveTree()) { 1002 if (layer_tree_impl()->IsActiveTree()) {
1028 LayerImpl* pending_twin = 1003 LayerImpl* pending_twin =
1029 layer_tree_impl()->FindPendingTreeLayerById(id()); 1004 layer_tree_impl()->FindPendingTreeLayerById(id());
(...skipping 11 matching lines...) Expand all
1041 if (scroll_offset_delegate_) { 1016 if (scroll_offset_delegate_) {
1042 scroll_offset_delegate_->SetTotalScrollOffset(scroll_offset_ + 1017 scroll_offset_delegate_->SetTotalScrollOffset(scroll_offset_ +
1043 scroll_delta); 1018 scroll_delta);
1044 } else { 1019 } else {
1045 scroll_delta_ = scroll_delta; 1020 scroll_delta_ = scroll_delta;
1046 } 1021 }
1047 } 1022 }
1048 1023
1049 if (changed) { 1024 if (changed) {
1050 NoteLayerPropertyChangedForSubtree(); 1025 NoteLayerPropertyChangedForSubtree();
1051 UpdateScrollbarPositions(); 1026 NotifyScrollbars();
1052 } 1027 }
1053 } 1028 }
1054 1029
1055 gfx::Vector2dF LayerImpl::ScrollDelta() const { 1030 gfx::Vector2dF LayerImpl::ScrollDelta() const {
1056 if (scroll_offset_delegate_) 1031 if (scroll_offset_delegate_)
1057 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_; 1032 return scroll_offset_delegate_->GetTotalScrollOffset() - scroll_offset_;
1058 return scroll_delta_; 1033 return scroll_delta_;
1059 } 1034 }
1060 1035
1061 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) { 1036 void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) {
(...skipping 15 matching lines...) Expand all
1077 Region LayerImpl::VisibleContentOpaqueRegion() const { 1052 Region LayerImpl::VisibleContentOpaqueRegion() const {
1078 if (contents_opaque()) 1053 if (contents_opaque())
1079 return visible_content_rect(); 1054 return visible_content_rect();
1080 return Region(); 1055 return Region();
1081 } 1056 }
1082 1057
1083 void LayerImpl::DidBeginTracing() {} 1058 void LayerImpl::DidBeginTracing() {}
1084 1059
1085 void LayerImpl::DidLoseOutputSurface() {} 1060 void LayerImpl::DidLoseOutputSurface() {}
1086 1061
1087 void LayerImpl::SetMaxScrollOffset(gfx::Vector2d max_scroll_offset) { 1062 gfx::Vector2d LayerImpl::MaxScrollOffset() const {
1088 if (max_scroll_offset_ == max_scroll_offset) 1063 if (!clip_layer_)
1089 return; 1064 return gfx::Vector2d();
1090 max_scroll_offset_ = max_scroll_offset;
1091 1065
1092 if (scroll_offset_delegate_) 1066 gfx::Size scaled_scroll_bounds(bounds());
1093 scroll_offset_delegate_->SetMaxScrollOffset(max_scroll_offset_); 1067 LayerImpl const* current_layer = this;
1068 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer();
1069 float scale_factor = 1.f;
1070 do {
1071 if (current_layer == page_scale_layer) {
1072 scale_factor = layer_tree_impl()->total_page_scale_factor();
1073 scaled_scroll_bounds.SetSize(
1074 scale_factor * scaled_scroll_bounds.width(),
1075 scale_factor * scaled_scroll_bounds.height());
1076 }
1077 current_layer = current_layer->parent();
1078 } while (current_layer && current_layer != clip_layer_);
1079 DCHECK(current_layer == clip_layer_);
1094 1080
1095 layer_tree_impl()->set_needs_update_draw_properties(); 1081 gfx::Vector2dF max_offset(
1096 UpdateScrollbarPositions(); 1082 scaled_scroll_bounds.width() - clip_layer_->bounds().width(),
1083 scaled_scroll_bounds.height() - clip_layer_->bounds().height());
1084 // We need the final scroll offset to be in CSS coords.
1085 max_offset.Scale(1 / scale_factor);
1086 return gfx::Vector2d(max_offset.x(), max_offset.y());
1087 }
1088
1089 gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() {
1090 gfx::Vector2dF max_offset = MaxScrollOffset();
1091 gfx::Vector2dF old_offset = TotalScrollOffset();
1092 gfx::Vector2dF clamped_offset = old_offset;
1093
1094 clamped_offset.SetToMin(max_offset);
1095 clamped_offset.SetToMax(gfx::Vector2d());
1096 gfx::Vector2dF delta = clamped_offset - old_offset;
1097 if (!delta.IsZero())
1098 ScrollBy(delta);
1099
1100 return delta;
1101 }
1102
1103 void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer,
1104 LayerImpl* scrollbar_clip_layer) const {
1105 DCHECK(scrollbar_layer);
1106 LayerImpl* page_scale_layer = layer_tree_impl()->page_scale_layer();
1107
1108 DCHECK(scrollbar_clip_layer);
1109 gfx::RectF clip_rect(gfx::PointF(), scrollbar_clip_layer->bounds());
1110 gfx::RectF scroll_rect(gfx::PointF(), bounds());
1111
1112 gfx::Vector2dF current_offset;
1113
1114 // TODO(wjmaclean): How do I account for vertical adjust, or do I need to?
1115 // Also, I can probably improve some of the variable names.
1116 LayerImpl const* current_layer = this;
1117 float scale_factor = 1.f;
1118 do {
1119 if (current_layer == page_scale_layer) {
1120 scale_factor = layer_tree_impl()->total_page_scale_factor();
1121 current_offset.Scale(scale_factor);
1122 scroll_rect.Scale(scale_factor);
1123 current_offset.Scale(scale_factor);
1124 } else {
1125 gfx::Vector2dF new_offset =
1126 current_layer->scroll_offset() + current_layer->ScrollDelta();
1127 current_offset += new_offset;
1128 }
1129 current_layer = current_layer->parent();
1130 } while (current_layer && current_layer != scrollbar_clip_layer);
1131 DCHECK(current_layer == scrollbar_clip_layer);
1132 current_offset.Scale(1 / scale_factor);
1133 // TODO(wjmaclean) need to think about the effect the size of the non-overlay
1134 // scrollbars have on the scroll size ... the final max value of current_pos
1135 // should not exceed maximum(), but it seems to by roughly
1136 // non_overlay_scroll_bar_width / scale_factor.
1137
1138 if (scrollbar_layer->orientation() == HORIZONTAL) {
1139 float visible_ratio = clip_rect.width() / scroll_rect.width();
1140 scrollbar_layer->SetCurrentPos(visible_ratio * current_offset.x());
1141 scrollbar_layer->SetMaximum(visible_ratio *
1142 (scroll_rect.width() - clip_rect.width()));
1143 scrollbar_layer->SetVisibleToTotalLengthRatio(visible_ratio);
1144 } else {
1145 float visible_ratio = clip_rect.height() / scroll_rect.height();
1146 scrollbar_layer->SetCurrentPos(visible_ratio * current_offset.y());
1147 scrollbar_layer->SetMaximum(visible_ratio *
1148 (scroll_rect.height() - clip_rect.height()));
1149 scrollbar_layer->SetVisibleToTotalLengthRatio(visible_ratio);
1150 }
1151
1152 // TODO(wjmaclean) The scrollbar animator for the pinch-zoom scrollbars should
1153 // activate for every scroll on the main frame, not just the scrolls that move
1154 // the pinch virtual viewport.
1155 if (scrollbar_animation_controller_) {
1156 bool should_animate = scrollbar_animation_controller_->DidScrollUpdate(
1157 layer_tree_impl_->CurrentPhysicalTimeTicks());
1158 if (should_animate)
1159 layer_tree_impl_->StartScrollbarAnimation();
1160 }
1097 } 1161 }
1098 1162
1099 void LayerImpl::DidBecomeActive() { 1163 void LayerImpl::DidBecomeActive() {
1100 if (layer_tree_impl_->settings().scrollbar_animator == 1164 if (layer_tree_impl_->settings().scrollbar_animator ==
1101 LayerTreeSettings::NoAnimator) { 1165 LayerTreeSettings::NoAnimator) {
1102 return; 1166 return;
1103 } 1167 }
1104 1168
1105 bool need_scrollbar_animation_controller = horizontal_scrollbar_layer_ || 1169 bool need_scrollbar_animation_controller = scrollable() && scrollbars_;
1106 vertical_scrollbar_layer_;
1107 if (!need_scrollbar_animation_controller) { 1170 if (!need_scrollbar_animation_controller) {
1108 scrollbar_animation_controller_.reset(); 1171 scrollbar_animation_controller_.reset();
1109 return; 1172 return;
1110 } 1173 }
1111 1174
1112 if (scrollbar_animation_controller_) 1175 if (scrollbar_animation_controller_)
1113 return; 1176 return;
1114 1177
1115 switch (layer_tree_impl_->settings().scrollbar_animator) { 1178 switch (layer_tree_impl_->settings().scrollbar_animator) {
1116 case LayerTreeSettings::LinearFade: { 1179 case LayerTreeSettings::LinearFade: {
(...skipping 12 matching lines...) Expand all
1129 scrollbar_animation_controller_ = 1192 scrollbar_animation_controller_ =
1130 ScrollbarAnimationControllerThinning::Create(this) 1193 ScrollbarAnimationControllerThinning::Create(this)
1131 .PassAs<ScrollbarAnimationController>(); 1194 .PassAs<ScrollbarAnimationController>();
1132 break; 1195 break;
1133 } 1196 }
1134 case LayerTreeSettings::NoAnimator: 1197 case LayerTreeSettings::NoAnimator:
1135 NOTREACHED(); 1198 NOTREACHED();
1136 break; 1199 break;
1137 } 1200 }
1138 } 1201 }
1139 void LayerImpl::SetHorizontalScrollbarLayer( 1202
1140 ScrollbarLayerImplBase* scrollbar_layer) { 1203 void LayerImpl::ClearScrollbars() {
1141 horizontal_scrollbar_layer_ = scrollbar_layer; 1204 if (!scrollbars_)
1142 if (horizontal_scrollbar_layer_) 1205 return;
1143 horizontal_scrollbar_layer_->set_scroll_layer_id(id()); 1206
1207 scrollbars_.reset(NULL);
1144 } 1208 }
1145 1209
1146 void LayerImpl::SetVerticalScrollbarLayer( 1210 void LayerImpl::AddScrollbar(ScrollbarLayerImplBase* layer) {
1147 ScrollbarLayerImplBase* scrollbar_layer) { 1211 DCHECK(layer);
1148 vertical_scrollbar_layer_ = scrollbar_layer; 1212 if (!scrollbars_)
1149 if (vertical_scrollbar_layer_) 1213 scrollbars_.reset(new ScrollbarSet());
1150 vertical_scrollbar_layer_->set_scroll_layer_id(id()); 1214
1215 scrollbars_->insert(layer);
1216 }
1217
1218 void LayerImpl::RemoveScrollbar(ScrollbarLayerImplBase* layer) {
1219 DCHECK(scrollbars_);
1220 DCHECK(layer);
1221
1222 scrollbars_->erase(layer);
1223 if (scrollbars_->empty())
1224 scrollbars_.reset();
1225 }
1226
1227 bool LayerImpl::HasScrollbar(ScrollbarOrientation orientation) const {
1228 if (!scrollbars_)
1229 return false;
1230
1231 for (ScrollbarSet::iterator it = scrollbars_->begin();
1232 it != scrollbars_->end(); ++it)
1233 if ((*it)->orientation() == orientation)
1234 return true;
1235
1236 return false;
1237 }
1238
1239 void LayerImpl::NotifyScrollbars() {
1240 if (!scrollbars_)
1241 return;
1242
1243 for (ScrollbarSet::iterator it = scrollbars_->begin();
1244 it != scrollbars_->end(); ++it)
1245 (*it)->ScrollbarParametersDidChange();
1151 } 1246 }
1152 1247
1153 static scoped_ptr<base::Value> 1248 static scoped_ptr<base::Value>
1154 CompositingReasonsAsValue(CompositingReasons reasons) { 1249 CompositingReasonsAsValue(CompositingReasons reasons) {
1155 scoped_ptr<base::ListValue> reason_list(new base::ListValue()); 1250 scoped_ptr<base::ListValue> reason_list(new base::ListValue());
1156 1251
1157 if (reasons == kCompositingReasonUnknown) { 1252 if (reasons == kCompositingReasonUnknown) {
1158 reason_list->AppendString("No reasons given"); 1253 reason_list->AppendString("No reasons given");
1159 return reason_list.PassAs<base::Value>(); 1254 return reason_list.PassAs<base::Value>();
1160 } 1255 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 1421
1327 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; } 1422 size_t LayerImpl::GPUMemoryUsageInBytes() const { return 0; }
1328 1423
1329 scoped_ptr<base::Value> LayerImpl::AsValue() const { 1424 scoped_ptr<base::Value> LayerImpl::AsValue() const {
1330 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 1425 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
1331 AsValueInto(state.get()); 1426 AsValueInto(state.get());
1332 return state.PassAs<base::Value>(); 1427 return state.PassAs<base::Value>();
1333 } 1428 }
1334 1429
1335 } // namespace cc 1430 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698