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

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

Issue 800613009: Convert scroll offsets to use SyncedProperty. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clean up, rebase Created 5 years, 10 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "cc/layers/layer_impl.h" 5 #include "cc/layers/layer_impl.h"
6 6
7 #include "base/json/json_reader.h" 7 #include "base/json/json_reader.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "base/trace_event/trace_event_argument.h" 10 #include "base/trace_event/trace_event_argument.h"
(...skipping 16 matching lines...) Expand all
27 #include "cc/trees/layer_tree_settings.h" 27 #include "cc/trees/layer_tree_settings.h"
28 #include "cc/trees/proxy.h" 28 #include "cc/trees/proxy.h"
29 #include "ui/gfx/geometry/box_f.h" 29 #include "ui/gfx/geometry/box_f.h"
30 #include "ui/gfx/geometry/point_conversions.h" 30 #include "ui/gfx/geometry/point_conversions.h"
31 #include "ui/gfx/geometry/quad_f.h" 31 #include "ui/gfx/geometry/quad_f.h"
32 #include "ui/gfx/geometry/rect_conversions.h" 32 #include "ui/gfx/geometry/rect_conversions.h"
33 #include "ui/gfx/geometry/size_conversions.h" 33 #include "ui/gfx/geometry/size_conversions.h"
34 #include "ui/gfx/geometry/vector2d_conversions.h" 34 #include "ui/gfx/geometry/vector2d_conversions.h"
35 35
36 namespace cc { 36 namespace cc {
37 LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id) 37 LayerImpl::LayerImpl(LayerTreeImpl* layer_impl, int id)
38 : LayerImpl(layer_impl, id, new LayerImpl::SyncedScrollOffset) {
39 }
40
41 LayerImpl::LayerImpl(LayerTreeImpl* tree_impl,
42 int id,
43 scoped_refptr<SyncedScrollOffset> scroll_offset)
38 : parent_(nullptr), 44 : parent_(nullptr),
39 scroll_parent_(nullptr), 45 scroll_parent_(nullptr),
40 clip_parent_(nullptr), 46 clip_parent_(nullptr),
41 mask_layer_id_(-1), 47 mask_layer_id_(-1),
42 replica_layer_id_(-1), 48 replica_layer_id_(-1),
43 layer_id_(id), 49 layer_id_(id),
44 layer_tree_impl_(tree_impl), 50 layer_tree_impl_(tree_impl),
51 scroll_offset_(scroll_offset),
45 scroll_offset_delegate_(nullptr), 52 scroll_offset_delegate_(nullptr),
46 scroll_clip_layer_(nullptr), 53 scroll_clip_layer_(nullptr),
47 should_scroll_on_main_thread_(false), 54 should_scroll_on_main_thread_(false),
48 have_wheel_event_handlers_(false), 55 have_wheel_event_handlers_(false),
49 have_scroll_event_handlers_(false), 56 have_scroll_event_handlers_(false),
50 user_scrollable_horizontal_(true), 57 user_scrollable_horizontal_(true),
51 user_scrollable_vertical_(true), 58 user_scrollable_vertical_(true),
52 stacking_order_changed_(false), 59 stacking_order_changed_(false),
53 double_sided_(true), 60 double_sided_(true),
54 should_flatten_transform_(true), 61 should_flatten_transform_(true),
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 bool resourceless_software_draw) { 348 bool resourceless_software_draw) {
342 return false; 349 return false;
343 } 350 }
344 351
345 void LayerImpl::GetContentsResourceId(ResourceProvider::ResourceId* resource_id, 352 void LayerImpl::GetContentsResourceId(ResourceProvider::ResourceId* resource_id,
346 gfx::Size* resource_size) const { 353 gfx::Size* resource_size) const {
347 NOTREACHED(); 354 NOTREACHED();
348 *resource_id = 0; 355 *resource_id = 0;
349 } 356 }
350 357
351 void LayerImpl::SetSentScrollDelta(const gfx::Vector2dF& sent_scroll_delta) { 358 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
352 // Pending tree never has sent scroll deltas 359 RefreshFromScrollDelegate();
353 DCHECK(layer_tree_impl()->IsActiveTree());
354 360
355 if (sent_scroll_delta_ == sent_scroll_delta) 361 gfx::ScrollOffset adjusted_scroll(scroll);
356 return;
357
358 sent_scroll_delta_ = sent_scroll_delta;
359 }
360
361 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
362 gfx::Vector2dF adjusted_scroll = scroll;
363 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) { 362 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) {
364 if (!user_scrollable_horizontal_) 363 if (!user_scrollable_horizontal_)
365 adjusted_scroll.set_x(0); 364 adjusted_scroll.set_x(0);
366 if (!user_scrollable_vertical_) 365 if (!user_scrollable_vertical_)
367 adjusted_scroll.set_y(0); 366 adjusted_scroll.set_y(0);
368 } 367 }
369 DCHECK(scrollable()); 368 DCHECK(scrollable());
370 gfx::Vector2dF min_delta = -ScrollOffsetToVector2dF(scroll_offset_); 369 gfx::ScrollOffset old_offset = CurrentScrollOffset();
371 gfx::Vector2dF max_delta = MaxScrollOffset().DeltaFrom(scroll_offset_); 370 gfx::ScrollOffset new_offset =
372 // Clamp new_delta so that position + delta stays within scroll bounds. 371 ClampScrollOffsetToLimits(old_offset + adjusted_scroll);
373 gfx::Vector2dF new_delta = (ScrollDelta() + adjusted_scroll); 372 SetCurrentScrollOffset(new_offset);
374 new_delta.SetToMax(min_delta);
375 new_delta.SetToMin(max_delta);
376 gfx::Vector2dF unscrolled =
377 ScrollDelta() + scroll - new_delta;
378 SetScrollDelta(new_delta);
379 373
380 return unscrolled; 374 gfx::ScrollOffset unscrolled =
375 old_offset + gfx::ScrollOffset(scroll) - new_offset;
376 return gfx::Vector2dF(unscrolled.x(), unscrolled.y());
381 } 377 }
382 378
383 void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) { 379 void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) {
384 scroll_clip_layer_ = layer_tree_impl()->LayerById(scroll_clip_layer_id); 380 scroll_clip_layer_ = layer_tree_impl()->LayerById(scroll_clip_layer_id);
385 } 381 }
386 382
387 bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const { 383 bool LayerImpl::user_scrollable(ScrollbarOrientation orientation) const {
388 return (orientation == HORIZONTAL) ? user_scrollable_horizontal_ 384 return (orientation == HORIZONTAL) ? user_scrollable_horizontal_
389 : user_scrollable_vertical_; 385 : user_scrollable_vertical_;
390 } 386 }
391 387
392 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() { 388 void LayerImpl::ApplySentScrollDeltasFromAbortedCommit() {
393 if (sent_scroll_delta_.IsZero())
394 return;
395
396 // Pending tree never has sent scroll deltas
397 DCHECK(layer_tree_impl()->IsActiveTree()); 389 DCHECK(layer_tree_impl()->IsActiveTree());
398 390 scroll_offset_->AbortCommit();
399 // The combination of pending tree and aborted commits with impl scrolls
400 // shouldn't happen; we don't know how to update its deltas correctly.
401 DCHECK(!layer_tree_impl()->FindPendingTreeLayerById(id()));
402
403 // Apply sent scroll deltas to scroll position / scroll delta as if the
404 // main thread had applied them and then committed those values.
405 SetScrollOffsetAndDelta(
406 scroll_offset_ + gfx::ScrollOffset(sent_scroll_delta_),
407 ScrollDelta() - sent_scroll_delta_);
408 SetSentScrollDelta(gfx::Vector2dF());
409 }
410
411 void LayerImpl::ApplyScrollDeltasSinceBeginMainFrame() {
412 // Only the pending tree can have missing scrolls.
413 DCHECK(layer_tree_impl()->IsPendingTree());
414 if (!scrollable())
415 return;
416
417 // Pending tree should never have sent scroll deltas.
418 DCHECK(sent_scroll_delta().IsZero());
419
420 LayerImpl* active_twin = layer_tree_impl()->FindActiveTreeLayerById(id());
421 if (active_twin) {
422 // Scrolls that happens after begin frame (where the sent scroll delta
423 // comes from) and commit need to be applied to the pending tree
424 // so that it is up to date with the total scroll.
425 SetScrollDelta(active_twin->ScrollDelta() -
426 active_twin->sent_scroll_delta());
427 }
428 } 391 }
429 392
430 InputHandler::ScrollStatus LayerImpl::TryScroll( 393 InputHandler::ScrollStatus LayerImpl::TryScroll(
431 const gfx::PointF& screen_space_point, 394 const gfx::PointF& screen_space_point,
432 InputHandler::ScrollInputType type) const { 395 InputHandler::ScrollInputType type) const {
433 if (should_scroll_on_main_thread()) { 396 if (should_scroll_on_main_thread()) {
434 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); 397 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread");
435 return InputHandler::ScrollOnMainThread; 398 return InputHandler::ScrollOnMainThread;
436 } 399 }
437 400
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 // values x and y, ceil((x / y) * y) may be x + 1. 459 // values x and y, ceil((x / y) * y) may be x + 1.
497 content_rect.Intersect(gfx::Rect(content_bounds())); 460 content_rect.Intersect(gfx::Rect(content_bounds()));
498 return gfx::ToEnclosingRect(content_rect); 461 return gfx::ToEnclosingRect(content_rect);
499 } 462 }
500 463
501 skia::RefPtr<SkPicture> LayerImpl::GetPicture() { 464 skia::RefPtr<SkPicture> LayerImpl::GetPicture() {
502 return skia::RefPtr<SkPicture>(); 465 return skia::RefPtr<SkPicture>();
503 } 466 }
504 467
505 scoped_ptr<LayerImpl> LayerImpl::CreateLayerImpl(LayerTreeImpl* tree_impl) { 468 scoped_ptr<LayerImpl> LayerImpl::CreateLayerImpl(LayerTreeImpl* tree_impl) {
506 return LayerImpl::Create(tree_impl, layer_id_); 469 return LayerImpl::Create(tree_impl, layer_id_, scroll_offset_);
507 } 470 }
508 471
509 void LayerImpl::PushPropertiesTo(LayerImpl* layer) { 472 void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
510 layer->SetTransformOrigin(transform_origin_); 473 layer->SetTransformOrigin(transform_origin_);
511 layer->SetBackgroundColor(background_color_); 474 layer->SetBackgroundColor(background_color_);
512 layer->SetBounds(bounds_); 475 layer->SetBounds(bounds_);
513 layer->SetContentBounds(content_bounds()); 476 layer->SetContentBounds(content_bounds());
514 layer->SetContentsScale(contents_scale_x(), contents_scale_y()); 477 layer->SetContentsScale(contents_scale_x(), contents_scale_y());
515 layer->SetDoubleSided(double_sided_); 478 layer->SetDoubleSided(double_sided_);
516 layer->SetDrawCheckerboardForMissingTiles( 479 layer->SetDrawCheckerboardForMissingTiles(
(...skipping 19 matching lines...) Expand all
536 layer->SetPositionConstraint(position_constraint_); 499 layer->SetPositionConstraint(position_constraint_);
537 layer->SetShouldFlattenTransform(should_flatten_transform_); 500 layer->SetShouldFlattenTransform(should_flatten_transform_);
538 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_); 501 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_);
539 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_); 502 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_);
540 503
541 layer->SetScrollClipLayer(scroll_clip_layer_ ? scroll_clip_layer_->id() 504 layer->SetScrollClipLayer(scroll_clip_layer_ ? scroll_clip_layer_->id()
542 : Layer::INVALID_ID); 505 : Layer::INVALID_ID);
543 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); 506 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_);
544 layer->set_user_scrollable_vertical(user_scrollable_vertical_); 507 layer->set_user_scrollable_vertical(user_scrollable_vertical_);
545 508
546 // Save the difference but clear the sent delta so that we don't subtract 509 layer->SetMainScrollOffsetFractionalPart(main_scroll_offset_fractional_part_);
547 // it again in SetScrollOffsetAndDelta's pending twin mirroring logic.
548 gfx::Vector2dF remaining_delta =
549 layer_animation_controller_->scroll_offset_animation_was_interrupted()
550 ? gfx::Vector2dF()
551 : layer->ScrollDelta() - layer->sent_scroll_delta();
552 510
553 layer->SetSentScrollDelta(gfx::Vector2dF()); 511 layer->PushScrollOffset(nullptr);
554 layer->SetScrollOffsetAndDelta(scroll_offset_, remaining_delta);
555 layer->SetMainScrollOffsetFractionalPart(main_scroll_offset_fractional_part_);
556 512
557 layer->Set3dSortingContextId(sorting_context_id_); 513 layer->Set3dSortingContextId(sorting_context_id_);
558 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_); 514 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_);
559 515
560 LayerImpl* scroll_parent = nullptr; 516 LayerImpl* scroll_parent = nullptr;
561 if (scroll_parent_) { 517 if (scroll_parent_) {
562 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); 518 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id());
563 DCHECK(scroll_parent); 519 DCHECK(scroll_parent);
564 } 520 }
565 521
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 } 713 }
758 714
759 for (size_t i = 0; i < children_.size(); ++i) 715 for (size_t i = 0; i < children_.size(); ++i)
760 children_[i]->ResetAllChangeTrackingForSubtree(); 716 children_[i]->ResetAllChangeTrackingForSubtree();
761 717
762 needs_push_properties_ = false; 718 needs_push_properties_ = false;
763 num_dependents_need_push_properties_ = 0; 719 num_dependents_need_push_properties_ = 0;
764 } 720 }
765 721
766 gfx::ScrollOffset LayerImpl::ScrollOffsetForAnimation() const { 722 gfx::ScrollOffset LayerImpl::ScrollOffsetForAnimation() const {
767 return TotalScrollOffset(); 723 return CurrentScrollOffset();
768 } 724 }
769 725
770 void LayerImpl::OnFilterAnimated(const FilterOperations& filters) { 726 void LayerImpl::OnFilterAnimated(const FilterOperations& filters) {
771 SetFilters(filters); 727 SetFilters(filters);
772 } 728 }
773 729
774 void LayerImpl::OnOpacityAnimated(float opacity) { 730 void LayerImpl::OnOpacityAnimated(float opacity) {
775 SetOpacity(opacity); 731 SetOpacity(opacity);
776 } 732 }
777 733
778 void LayerImpl::OnTransformAnimated(const gfx::Transform& transform) { 734 void LayerImpl::OnTransformAnimated(const gfx::Transform& transform) {
779 SetTransform(transform); 735 SetTransform(transform);
780 } 736 }
781 737
782 void LayerImpl::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) { 738 void LayerImpl::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) {
783 // Only layers in the active tree should need to do anything here, since 739 // Only layers in the active tree should need to do anything here, since
784 // layers in the pending tree will find out about these changes as a 740 // layers in the pending tree will find out about these changes as a
785 // result of the call to SetScrollDelta. 741 // result of the shared SyncedProperty.
786 if (!IsActive()) 742 if (!IsActive())
787 return; 743 return;
788 744
789 SetScrollDelta(scroll_offset.DeltaFrom(scroll_offset_)); 745 SetCurrentScrollOffset(scroll_offset);
790 746
791 layer_tree_impl_->DidAnimateScrollOffset(); 747 layer_tree_impl_->DidAnimateScrollOffset();
792 } 748 }
793 749
794 void LayerImpl::OnAnimationWaitingForDeletion() {} 750 void LayerImpl::OnAnimationWaitingForDeletion() {}
795 751
796 bool LayerImpl::IsActive() const { 752 bool LayerImpl::IsActive() const {
797 return layer_tree_impl_->IsActiveTree(); 753 return layer_tree_impl_->IsActiveTree();
798 } 754 }
799 755
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 1051
1096 draw_properties_.contents_scale_x = contents_scale_x; 1052 draw_properties_.contents_scale_x = contents_scale_x;
1097 draw_properties_.contents_scale_y = contents_scale_y; 1053 draw_properties_.contents_scale_y = contents_scale_y;
1098 NoteLayerPropertyChanged(); 1054 NoteLayerPropertyChanged();
1099 } 1055 }
1100 1056
1101 void LayerImpl::SetScrollOffsetDelegate( 1057 void LayerImpl::SetScrollOffsetDelegate(
1102 ScrollOffsetDelegate* scroll_offset_delegate) { 1058 ScrollOffsetDelegate* scroll_offset_delegate) {
1103 // Having both a scroll parent and a scroll offset delegate is unsupported. 1059 // Having both a scroll parent and a scroll offset delegate is unsupported.
1104 DCHECK(!scroll_parent_); 1060 DCHECK(!scroll_parent_);
1105 if (!scroll_offset_delegate && scroll_offset_delegate_) { 1061 RefreshFromScrollDelegate();
1106 scroll_delta_ = scroll_offset_delegate_->GetTotalScrollOffset().DeltaFrom( 1062 scroll_offset_delegate_ = scroll_offset_delegate;
1107 scroll_offset_); 1063 if (scroll_offset_delegate_) {
1064 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset());
1065 RefreshFromScrollDelegate();
1108 } 1066 }
1109 gfx::ScrollOffset total_offset = TotalScrollOffset();
1110 scroll_offset_delegate_ = scroll_offset_delegate;
1111 if (scroll_offset_delegate_)
1112 scroll_offset_delegate_->SetTotalScrollOffset(total_offset);
1113 } 1067 }
1114 1068
1115 bool LayerImpl::IsExternalFlingActive() const { 1069 bool LayerImpl::IsExternalFlingActive() const {
1116 return scroll_offset_delegate_ && 1070 return scroll_offset_delegate_ &&
1117 scroll_offset_delegate_->IsExternalFlingActive(); 1071 scroll_offset_delegate_->IsExternalFlingActive();
1118 } 1072 }
1119 1073
1120 void LayerImpl::DidScroll() { 1074 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
1075 DCHECK(IsActive());
1076 if (scroll_offset_->SetCurrent(scroll_offset))
1077 DidUpdateScrollOffset();
1078 }
1079
1080 void LayerImpl::PushScrollOffsetFromMainThread(
1081 const gfx::ScrollOffset& scroll_offset) {
1082 PushScrollOffset(&scroll_offset);
1083 }
1084
1085 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() {
1086 RefreshFromScrollDelegate();
1087
1088 // TODO(aelias): Remove all this temporary flooring machinery when Blink
aelias_OOO_until_Jul13 2015/01/30 05:52:31 miletus@ is working on this right now and hopefull
1089 // fully supports fractional scrolls.
1090 gfx::ScrollOffset current = CurrentScrollOffset();
1091 gfx::ScrollOffset floored(floor(current.x()), floor(current.y()));
1092 scroll_offset_->SetCurrent(floored);
1093 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread();
1094 scroll_offset_->SetCurrent(current);
1095 return delta;
1096 }
1097
1098 void LayerImpl::RefreshFromScrollDelegate() {
1099 if (scroll_offset_delegate_) {
1100 SetCurrentScrollOffset(
1101 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset()));
1102 }
1103 }
1104
1105 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
1106 return scroll_offset_->Current(IsActive());
1107 }
1108
1109 gfx::Vector2dF LayerImpl::ScrollDelta() const {
1110 if (IsActive())
1111 return gfx::Vector2dF(scroll_offset_->Delta().x(),
1112 scroll_offset_->Delta().y());
1113 else
1114 return gfx::Vector2dF(scroll_offset_->PendingDelta().get().x(),
1115 scroll_offset_->PendingDelta().get().y());
1116 }
1117
1118 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& delta) {
1119 DCHECK(IsActive());
1120 SetCurrentScrollOffset(scroll_offset_->ActiveBase() +
1121 gfx::ScrollOffset(delta));
1122 }
1123
1124 gfx::ScrollOffset LayerImpl::BaseScrollOffset() const {
1125 if (IsActive())
1126 return scroll_offset_->ActiveBase();
1127 else
1128 return scroll_offset_->PendingBase();
1129 }
1130
1131 void LayerImpl::PushScrollOffset(const gfx::ScrollOffset* scroll_offset) {
1132 DCHECK(scroll_offset || IsActive());
1133 bool changed = false;
1134 if (scroll_offset) {
1135 DCHECK(!IsActive() || !layer_tree_impl_->FindPendingTreeLayerById(id()));
1136 changed |= scroll_offset_->PushFromMainThread(*scroll_offset);
1137 }
1138 if (IsActive()) {
1139 changed |= scroll_offset_->PushPendingToActive();
1140 if (layer_animation_controller_->scroll_offset_animation_was_interrupted())
1141 SetScrollDelta(gfx::Vector2dF());
1142 }
1143
1144 if (changed)
1145 DidUpdateScrollOffset();
1146 }
1147
1148 void LayerImpl::DidUpdateScrollOffset() {
1149 if (scroll_offset_delegate_) {
1150 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset());
1151 scroll_offset_delegate_->Update();
1152 RefreshFromScrollDelegate();
1153 }
1154
1121 NoteLayerPropertyChangedForSubtree(); 1155 NoteLayerPropertyChangedForSubtree();
1122 ScrollbarParametersDidChange(false); 1156 ScrollbarParametersDidChange(false);
1123 } 1157 }
1124 1158
1125 void LayerImpl::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
1126 SetScrollOffsetAndDelta(scroll_offset, ScrollDelta());
1127 }
1128
1129 void LayerImpl::SetScrollOffsetAndDelta(const gfx::ScrollOffset& scroll_offset,
1130 const gfx::Vector2dF& scroll_delta) {
1131 bool changed = false;
1132
1133 last_scroll_offset_ = scroll_offset;
1134
1135 if (scroll_offset_ != scroll_offset) {
1136 changed = true;
1137 scroll_offset_ = scroll_offset;
1138
1139 if (scroll_offset_delegate_)
1140 scroll_offset_delegate_->SetTotalScrollOffset(TotalScrollOffset());
1141 }
1142
1143 if (ScrollDelta() != scroll_delta) {
1144 changed = true;
1145 if (layer_tree_impl()->IsActiveTree()) {
1146 LayerImpl* pending_twin =
1147 layer_tree_impl()->FindPendingTreeLayerById(id());
1148 if (pending_twin) {
1149 // The pending twin can't mirror the scroll delta of the active
1150 // layer. Although the delta - sent scroll delta difference is
1151 // identical for both twins, the sent scroll delta for the pending
1152 // layer is zero, as anything that has been sent has been baked
1153 // into the layer's position/scroll offset as a part of commit.
1154 DCHECK(pending_twin->sent_scroll_delta().IsZero());
1155 pending_twin->SetScrollDelta(scroll_delta - sent_scroll_delta());
1156 }
1157 }
1158
1159 if (scroll_offset_delegate_) {
1160 scroll_offset_delegate_->SetTotalScrollOffset(
1161 ScrollOffsetWithDelta(scroll_offset_, scroll_delta));
1162 } else {
1163 scroll_delta_ = scroll_delta;
1164 }
1165 }
1166
1167 if (changed) {
1168 if (scroll_offset_delegate_)
1169 scroll_offset_delegate_->Update();
1170 DidScroll();
1171 }
1172 }
1173
1174 gfx::Vector2dF LayerImpl::ScrollDelta() const {
1175 if (scroll_offset_delegate_) {
1176 return scroll_offset_delegate_->GetTotalScrollOffset().DeltaFrom(
1177 scroll_offset_);
1178 }
1179 return scroll_delta_;
1180 }
1181
1182 void LayerImpl::SetScrollDelta(const gfx::Vector2dF& scroll_delta) {
1183 SetScrollOffsetAndDelta(scroll_offset_, scroll_delta);
1184 }
1185
1186 gfx::ScrollOffset LayerImpl::TotalScrollOffset() const {
1187 return ScrollOffsetWithDelta(scroll_offset_, ScrollDelta());
1188 }
1189
1190 void LayerImpl::SetDoubleSided(bool double_sided) { 1159 void LayerImpl::SetDoubleSided(bool double_sided) {
1191 if (double_sided_ == double_sided) 1160 if (double_sided_ == double_sided)
1192 return; 1161 return;
1193 1162
1194 double_sided_ = double_sided; 1163 double_sided_ = double_sided;
1195 NoteLayerPropertyChangedForSubtree(); 1164 NoteLayerPropertyChangedForSubtree();
1196 } 1165 }
1197 1166
1198 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const { 1167 SimpleEnclosedRegion LayerImpl::VisibleContentOpaqueRegion() const {
1199 if (contents_opaque()) 1168 if (contents_opaque())
1200 return SimpleEnclosedRegion(visible_content_rect()); 1169 return SimpleEnclosedRegion(visible_content_rect());
1201 return SimpleEnclosedRegion(); 1170 return SimpleEnclosedRegion();
1202 } 1171 }
1203 1172
1204 void LayerImpl::DidBeginTracing() {} 1173 void LayerImpl::DidBeginTracing() {}
1205 1174
1206 void LayerImpl::ReleaseResources() {} 1175 void LayerImpl::ReleaseResources() {}
1207 1176
1208 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const { 1177 gfx::ScrollOffset LayerImpl::MaxScrollOffset() const {
1209 if (!scroll_clip_layer_ || bounds().IsEmpty()) 1178 if (!scroll_clip_layer_ || bounds().IsEmpty())
1210 return gfx::ScrollOffset(); 1179 return gfx::ScrollOffset();
1211 1180
1212 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer(); 1181 LayerImpl const* page_scale_layer = layer_tree_impl()->page_scale_layer();
1213 DCHECK(this != page_scale_layer); 1182 DCHECK(this != page_scale_layer);
1214 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() || 1183 DCHECK(this != layer_tree_impl()->InnerViewportScrollLayer() ||
1215 IsContainerForFixedPositionLayers()); 1184 IsContainerForFixedPositionLayers());
1216 1185
1217 gfx::SizeF scaled_scroll_bounds(BoundsForScrolling());
1218
1219 float scale_factor = 1.f; 1186 float scale_factor = 1.f;
1220 for (LayerImpl const* current_layer = this; 1187 for (LayerImpl const* current_layer = this;
1221 current_layer != scroll_clip_layer_; 1188 current_layer != scroll_clip_layer_->parent();
1222 current_layer = current_layer->parent()) { 1189 current_layer = current_layer->parent()) {
1223 DCHECK(current_layer); 1190 if (current_layer == page_scale_layer)
1224 float current_layer_scale = 1.f; 1191 scale_factor = layer_tree_impl()->current_page_scale_factor();
1192 }
1225 1193
1226 const gfx::Transform& layer_transform = current_layer->transform(); 1194 gfx::SizeF scaled_scroll_bounds =
aelias_OOO_until_Jul13 2015/01/30 05:52:31 This deletion (and the one in SetScrollbarPosition
enne (OOO) 2015/01/30 21:08:14 Seems fine to do that while you're here.
1227 if (current_layer == page_scale_layer) { 1195 gfx::ToFlooredSize(gfx::ScaleSize(BoundsForScrolling(), scale_factor));
1228 DCHECK(layer_transform.IsIdentity());
1229 current_layer_scale = layer_tree_impl()->current_page_scale_factor();
1230 } else {
1231 // TODO(wjmaclean) Should we allow for translation too?
1232 DCHECK(layer_transform.IsScale2d());
1233 gfx::Vector2dF layer_scale = layer_transform.Scale2d();
1234 // TODO(wjmaclean) Allow for non-isotropic scales.
1235 DCHECK(layer_scale.x() == layer_scale.y());
1236 current_layer_scale = layer_scale.x();
1237 }
1238
1239 scale_factor *= current_layer_scale;
1240 }
1241 // TODO(wjmaclean) Once we move to a model where the two-viewport model is
1242 // turned on in all builds, remove the next two lines. For now however, the
1243 // page scale layer may coincide with the clip layer, and so this is
1244 // necessary.
1245 if (page_scale_layer == scroll_clip_layer_)
1246 scale_factor *= layer_tree_impl()->current_page_scale_factor();
1247
1248 scaled_scroll_bounds.SetSize(scale_factor * scaled_scroll_bounds.width(),
1249 scale_factor * scaled_scroll_bounds.height());
1250 scaled_scroll_bounds = gfx::ToFlooredSize(scaled_scroll_bounds); 1196 scaled_scroll_bounds = gfx::ToFlooredSize(scaled_scroll_bounds);
1251 1197
1252 gfx::ScrollOffset max_offset( 1198 gfx::ScrollOffset max_offset(
1253 scaled_scroll_bounds.width() - scroll_clip_layer_->bounds().width(), 1199 scaled_scroll_bounds.width() - scroll_clip_layer_->bounds().width(),
1254 scaled_scroll_bounds.height() - scroll_clip_layer_->bounds().height()); 1200 scaled_scroll_bounds.height() - scroll_clip_layer_->bounds().height());
1255 // We need the final scroll offset to be in CSS coords. 1201 // We need the final scroll offset to be in CSS coords.
1256 max_offset.Scale(1 / scale_factor); 1202 max_offset.Scale(1 / scale_factor);
1257 max_offset.SetToMax(gfx::ScrollOffset()); 1203 max_offset.SetToMax(gfx::ScrollOffset());
1258 return max_offset; 1204 return max_offset;
1259 } 1205 }
1260 1206
1207 gfx::ScrollOffset LayerImpl::ClampScrollOffsetToLimits(
1208 gfx::ScrollOffset offset) const {
1209 offset.SetToMin(MaxScrollOffset());
1210 offset.SetToMax(gfx::ScrollOffset());
1211 return offset;
1212 }
1213
1261 gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() { 1214 gfx::Vector2dF LayerImpl::ClampScrollToMaxScrollOffset() {
1262 gfx::ScrollOffset max_offset = MaxScrollOffset(); 1215 gfx::ScrollOffset old_offset = CurrentScrollOffset();
1263 gfx::ScrollOffset old_offset = TotalScrollOffset(); 1216 gfx::ScrollOffset clamped_offset = ClampScrollOffsetToLimits(old_offset);
1264 gfx::ScrollOffset clamped_offset = old_offset;
1265
1266 clamped_offset.SetToMin(max_offset);
1267 clamped_offset.SetToMax(gfx::ScrollOffset());
1268 gfx::Vector2dF delta = clamped_offset.DeltaFrom(old_offset); 1217 gfx::Vector2dF delta = clamped_offset.DeltaFrom(old_offset);
1269 if (!delta.IsZero()) 1218 if (!delta.IsZero())
1270 ScrollBy(delta); 1219 ScrollBy(delta);
1271
1272 return delta; 1220 return delta;
1273 } 1221 }
1274 1222
1275 void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer, 1223 void LayerImpl::SetScrollbarPosition(ScrollbarLayerImplBase* scrollbar_layer,
1276 LayerImpl* scrollbar_clip_layer, 1224 LayerImpl* scrollbar_clip_layer,
1277 bool on_resize) const { 1225 bool on_resize) const {
1278 DCHECK(scrollbar_layer); 1226 DCHECK(scrollbar_layer);
1279 LayerImpl* page_scale_layer = layer_tree_impl()->page_scale_layer(); 1227 LayerImpl* page_scale_layer = layer_tree_impl()->page_scale_layer();
1280 1228
1281 DCHECK(this != page_scale_layer); 1229 DCHECK(this != page_scale_layer);
1282 DCHECK(scrollbar_clip_layer); 1230 DCHECK(scrollbar_clip_layer);
1283 gfx::RectF clip_rect(gfx::PointF(), 1231 gfx::RectF clip_rect(gfx::PointF(),
1284 scrollbar_clip_layer->BoundsForScrolling()); 1232 scrollbar_clip_layer->BoundsForScrolling());
1285 1233
1286 // See comment in MaxScrollOffset() regarding the use of the content layer 1234 // See comment in MaxScrollOffset() regarding the use of the content layer
1287 // bounds here. 1235 // bounds here.
1288 gfx::RectF scroll_rect(gfx::PointF(), BoundsForScrolling()); 1236 gfx::RectF scroll_rect(gfx::PointF(), BoundsForScrolling());
1289 1237
1290 if (scroll_rect.size().IsEmpty()) 1238 if (scroll_rect.size().IsEmpty())
1291 return; 1239 return;
1292 1240
1293 // TODO(wjmaclean) This computation is nearly identical to the one in
1294 // MaxScrollOffset. Find some way to combine these.
1295 gfx::ScrollOffset current_offset; 1241 gfx::ScrollOffset current_offset;
1296 for (LayerImpl const* current_layer = this; 1242 for (LayerImpl const* current_layer = this;
1297 current_layer != scrollbar_clip_layer; 1243 current_layer != scrollbar_clip_layer->parent();
1298 current_layer = current_layer->parent()) { 1244 current_layer = current_layer->parent()) {
1299 DCHECK(current_layer); 1245 current_offset += current_layer->CurrentScrollOffset();
1300 const gfx::Transform& layer_transform = current_layer->transform();
1301 if (current_layer == page_scale_layer) { 1246 if (current_layer == page_scale_layer) {
1302 DCHECK(layer_transform.IsIdentity());
1303 float scale_factor = layer_tree_impl()->current_page_scale_factor(); 1247 float scale_factor = layer_tree_impl()->current_page_scale_factor();
1304 current_offset.Scale(scale_factor); 1248 current_offset.Scale(scale_factor);
1305 scroll_rect.Scale(scale_factor); 1249 scroll_rect.Scale(scale_factor);
1306 } else {
1307 DCHECK(layer_transform.IsScale2d());
1308 gfx::Vector2dF layer_scale = layer_transform.Scale2d();
1309 DCHECK(layer_scale.x() == layer_scale.y());
1310 gfx::ScrollOffset new_offset = ScrollOffsetWithDelta(
1311 current_layer->scroll_offset(), current_layer->ScrollDelta());
1312 new_offset.Scale(layer_scale.x(), layer_scale.y());
1313 current_offset += new_offset;
1314 } 1250 }
1315 } 1251 }
1316 // TODO(wjmaclean) Once we move to a model where the two-viewport model is
1317 // turned on in all builds, remove the next two lines. For now however, the
1318 // page scale layer may coincide with the clip layer, and so this is
1319 // necessary.
1320 if (page_scale_layer == scrollbar_clip_layer) {
1321 scroll_rect.Scale(layer_tree_impl()->current_page_scale_factor());
1322 current_offset.Scale(layer_tree_impl()->current_page_scale_factor());
1323 }
1324 1252
1325 bool scrollbar_needs_animation = false; 1253 bool scrollbar_needs_animation = false;
1326 scrollbar_needs_animation |= scrollbar_layer->SetVerticalAdjust( 1254 scrollbar_needs_animation |= scrollbar_layer->SetVerticalAdjust(
1327 scrollbar_clip_layer->bounds_delta().y()); 1255 scrollbar_clip_layer->bounds_delta().y());
1328 if (scrollbar_layer->orientation() == HORIZONTAL) { 1256 if (scrollbar_layer->orientation() == HORIZONTAL) {
1329 float visible_ratio = clip_rect.width() / scroll_rect.width(); 1257 float visible_ratio = clip_rect.width() / scroll_rect.width();
1330 scrollbar_needs_animation |= 1258 scrollbar_needs_animation |=
1331 scrollbar_layer->SetCurrentPos(current_offset.x()); 1259 scrollbar_layer->SetCurrentPos(current_offset.x());
1332 scrollbar_needs_animation |= 1260 scrollbar_needs_animation |=
1333 scrollbar_layer->SetMaximum(scroll_rect.width() - clip_rect.width()); 1261 scrollbar_layer->SetMaximum(scroll_rect.width() - clip_rect.width());
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 state->SetInteger("layer_id", id()); 1393 state->SetInteger("layer_id", id());
1466 MathUtil::AddToTracedValue("bounds", bounds_, state); 1394 MathUtil::AddToTracedValue("bounds", bounds_, state);
1467 1395
1468 state->SetDouble("opacity", opacity()); 1396 state->SetDouble("opacity", opacity());
1469 1397
1470 MathUtil::AddToTracedValue("position", position_, state); 1398 MathUtil::AddToTracedValue("position", position_, state);
1471 1399
1472 state->SetInteger("draws_content", DrawsContent()); 1400 state->SetInteger("draws_content", DrawsContent());
1473 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes()); 1401 state->SetInteger("gpu_memory_usage", GPUMemoryUsageInBytes());
1474 1402
1475 MathUtil::AddToTracedValue("scroll_offset", scroll_offset_, state); 1403 MathUtil::AddToTracedValue(
1404 "scroll_offset", scroll_offset_ ? scroll_offset_->Current(IsActive())
1405 : gfx::ScrollOffset(),
1406 state);
1407
1476 MathUtil::AddToTracedValue("transform_origin", transform_origin_, state); 1408 MathUtil::AddToTracedValue("transform_origin", transform_origin_, state);
1477 1409
1478 bool clipped; 1410 bool clipped;
1479 gfx::QuadF layer_quad = MathUtil::MapQuad( 1411 gfx::QuadF layer_quad = MathUtil::MapQuad(
1480 screen_space_transform(), 1412 screen_space_transform(),
1481 gfx::QuadF(gfx::Rect(content_bounds())), 1413 gfx::QuadF(gfx::Rect(content_bounds())),
1482 &clipped); 1414 &clipped);
1483 MathUtil::AddToTracedValue("layer_quad", layer_quad, state); 1415 MathUtil::AddToTracedValue("layer_quad", layer_quad, state);
1484 if (!touch_event_handler_region_.IsEmpty()) { 1416 if (!touch_event_handler_region_.IsEmpty()) {
1485 state->BeginArray("touch_event_handler_region"); 1417 state->BeginArray("touch_event_handler_region");
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 SetNeedsPushProperties(); 1535 SetNeedsPushProperties();
1604 layer_tree_impl()->set_needs_update_draw_properties(); 1536 layer_tree_impl()->set_needs_update_draw_properties();
1605 if (should_have_render_surface) { 1537 if (should_have_render_surface) {
1606 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); 1538 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this));
1607 return; 1539 return;
1608 } 1540 }
1609 render_surface_.reset(); 1541 render_surface_.reset();
1610 } 1542 }
1611 1543
1612 } // namespace cc 1544 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698