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

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

Issue 1038173002: Refactor delegated scrolling in LayerImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove "scrollOffsetDelegate" Created 5 years, 8 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"
11 #include "cc/animation/animation_registrar.h" 11 #include "cc/animation/animation_registrar.h"
12 #include "cc/animation/scrollbar_animation_controller.h" 12 #include "cc/animation/scrollbar_animation_controller.h"
13 #include "cc/base/math_util.h" 13 #include "cc/base/math_util.h"
14 #include "cc/base/simple_enclosed_region.h" 14 #include "cc/base/simple_enclosed_region.h"
15 #include "cc/debug/debug_colors.h" 15 #include "cc/debug/debug_colors.h"
16 #include "cc/debug/layer_tree_debug_state.h" 16 #include "cc/debug/layer_tree_debug_state.h"
17 #include "cc/debug/micro_benchmark_impl.h" 17 #include "cc/debug/micro_benchmark_impl.h"
18 #include "cc/debug/traced_value.h" 18 #include "cc/debug/traced_value.h"
19 #include "cc/input/layer_scroll_offset_delegate.h"
20 #include "cc/layers/layer_utils.h" 19 #include "cc/layers/layer_utils.h"
21 #include "cc/layers/painted_scrollbar_layer_impl.h" 20 #include "cc/layers/painted_scrollbar_layer_impl.h"
22 #include "cc/output/copy_output_request.h" 21 #include "cc/output/copy_output_request.h"
23 #include "cc/quads/debug_border_draw_quad.h" 22 #include "cc/quads/debug_border_draw_quad.h"
24 #include "cc/quads/render_pass.h" 23 #include "cc/quads/render_pass.h"
25 #include "cc/trees/layer_tree_host_common.h" 24 #include "cc/trees/layer_tree_host_common.h"
26 #include "cc/trees/layer_tree_impl.h" 25 #include "cc/trees/layer_tree_impl.h"
27 #include "cc/trees/layer_tree_settings.h" 26 #include "cc/trees/layer_tree_settings.h"
28 #include "cc/trees/proxy.h" 27 #include "cc/trees/proxy.h"
29 #include "ui/gfx/geometry/box_f.h" 28 #include "ui/gfx/geometry/box_f.h"
(...skipping 12 matching lines...) Expand all
42 int id, 41 int id,
43 scoped_refptr<SyncedScrollOffset> scroll_offset) 42 scoped_refptr<SyncedScrollOffset> scroll_offset)
44 : parent_(nullptr), 43 : parent_(nullptr),
45 scroll_parent_(nullptr), 44 scroll_parent_(nullptr),
46 clip_parent_(nullptr), 45 clip_parent_(nullptr),
47 mask_layer_id_(-1), 46 mask_layer_id_(-1),
48 replica_layer_id_(-1), 47 replica_layer_id_(-1),
49 layer_id_(id), 48 layer_id_(id),
50 layer_tree_impl_(tree_impl), 49 layer_tree_impl_(tree_impl),
51 scroll_offset_(scroll_offset), 50 scroll_offset_(scroll_offset),
52 scroll_offset_delegate_(nullptr), 51 scroll_offset_listener_(nullptr),
53 scroll_clip_layer_(nullptr), 52 scroll_clip_layer_(nullptr),
54 should_scroll_on_main_thread_(false), 53 should_scroll_on_main_thread_(false),
55 have_wheel_event_handlers_(false), 54 have_wheel_event_handlers_(false),
56 have_scroll_event_handlers_(false), 55 have_scroll_event_handlers_(false),
57 scroll_blocks_on_(SCROLL_BLOCKS_ON_NONE), 56 scroll_blocks_on_(SCROLL_BLOCKS_ON_NONE),
58 user_scrollable_horizontal_(true), 57 user_scrollable_horizontal_(true),
59 user_scrollable_vertical_(true), 58 user_scrollable_vertical_(true),
60 stacking_order_changed_(false), 59 stacking_order_changed_(false),
61 double_sided_(true), 60 double_sided_(true),
62 should_flatten_transform_(true), 61 should_flatten_transform_(true),
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 } 157 }
159 158
160 return false; 159 return false;
161 } 160 }
162 161
163 void LayerImpl::SetScrollParent(LayerImpl* parent) { 162 void LayerImpl::SetScrollParent(LayerImpl* parent) {
164 if (scroll_parent_ == parent) 163 if (scroll_parent_ == parent)
165 return; 164 return;
166 165
167 // Having both a scroll parent and a scroll offset delegate is unsupported. 166 // Having both a scroll parent and a scroll offset delegate is unsupported.
168 DCHECK(!scroll_offset_delegate_); 167 DCHECK(!scroll_offset_listener_);
169 168
170 if (parent) 169 if (parent)
171 DCHECK_EQ(layer_tree_impl()->LayerById(parent->id()), parent); 170 DCHECK_EQ(layer_tree_impl()->LayerById(parent->id()), parent);
172 171
173 scroll_parent_ = parent; 172 scroll_parent_ = parent;
174 SetNeedsPushProperties(); 173 SetNeedsPushProperties();
175 } 174 }
176 175
177 void LayerImpl::SetDebugInfo( 176 void LayerImpl::SetDebugInfo(
178 scoped_refptr<base::trace_event::ConvertableToTraceFormat> other) { 177 scoped_refptr<base::trace_event::ConvertableToTraceFormat> other) {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 return RenderPassId(0, 0); 377 return RenderPassId(0, 0);
379 } 378 }
380 379
381 void LayerImpl::GetContentsResourceId(ResourceProvider::ResourceId* resource_id, 380 void LayerImpl::GetContentsResourceId(ResourceProvider::ResourceId* resource_id,
382 gfx::Size* resource_size) const { 381 gfx::Size* resource_size) const {
383 NOTREACHED(); 382 NOTREACHED();
384 *resource_id = 0; 383 *resource_id = 0;
385 } 384 }
386 385
387 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) { 386 gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
388 RefreshFromScrollDelegate();
389
390 gfx::ScrollOffset adjusted_scroll(scroll); 387 gfx::ScrollOffset adjusted_scroll(scroll);
391 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) { 388 if (layer_tree_impl()->settings().use_pinch_virtual_viewport) {
392 if (!user_scrollable_horizontal_) 389 if (!user_scrollable_horizontal_)
393 adjusted_scroll.set_x(0); 390 adjusted_scroll.set_x(0);
394 if (!user_scrollable_vertical_) 391 if (!user_scrollable_vertical_)
395 adjusted_scroll.set_y(0); 392 adjusted_scroll.set_y(0);
396 } 393 }
397 DCHECK(scrollable()); 394 DCHECK(scrollable());
398 gfx::ScrollOffset old_offset = CurrentScrollOffset(); 395 gfx::ScrollOffset old_offset = CurrentScrollOffset();
399 gfx::ScrollOffset new_offset = 396 gfx::ScrollOffset new_offset =
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 float contents_scale_y) { 1098 float contents_scale_y) {
1102 if (this->contents_scale_x() == contents_scale_x && 1099 if (this->contents_scale_x() == contents_scale_x &&
1103 this->contents_scale_y() == contents_scale_y) 1100 this->contents_scale_y() == contents_scale_y)
1104 return; 1101 return;
1105 1102
1106 draw_properties_.contents_scale_x = contents_scale_x; 1103 draw_properties_.contents_scale_x = contents_scale_x;
1107 draw_properties_.contents_scale_y = contents_scale_y; 1104 draw_properties_.contents_scale_y = contents_scale_y;
1108 NoteLayerPropertyChanged(); 1105 NoteLayerPropertyChanged();
1109 } 1106 }
1110 1107
1111 void LayerImpl::SetScrollOffsetDelegate( 1108 void LayerImpl::SetExternalScrollOffsetListener(
1112 ScrollOffsetDelegate* scroll_offset_delegate) { 1109 ExternalScrollOffsetListener* scroll_offset_listener) {
1113 // Having both a scroll parent and a scroll offset delegate is unsupported. 1110 // Having both a scroll parent and an external scroll offset listener is
1111 // unsupported.
1114 DCHECK(!scroll_parent_); 1112 DCHECK(!scroll_parent_);
1115 RefreshFromScrollDelegate(); 1113 scroll_offset_listener_ = scroll_offset_listener;
1116 scroll_offset_delegate_ = scroll_offset_delegate; 1114 if (scroll_offset_listener_)
1117 if (scroll_offset_delegate_) 1115 scroll_offset_listener_->DidUpdateScrollOffset();
1118 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset());
1119 } 1116 }
1120 1117
1121 bool LayerImpl::IsExternalFlingActive() const { 1118 bool LayerImpl::IsExternalFlingActive() const {
1122 return scroll_offset_delegate_ && 1119 return scroll_offset_listener_ &&
1123 scroll_offset_delegate_->IsExternalFlingActive(); 1120 scroll_offset_listener_->IsExternalFlingActive();
1124 } 1121 }
1125 1122
1126 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) { 1123 void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
1127 DCHECK(IsActive()); 1124 DCHECK(IsActive());
1128 if (scroll_offset_->SetCurrent(scroll_offset)) 1125 if (scroll_offset_->SetCurrent(scroll_offset))
1129 DidUpdateScrollOffset(); 1126 DidUpdateScrollOffset();
1130 } 1127 }
1131 1128
1132 void LayerImpl::PushScrollOffsetFromMainThread( 1129 void LayerImpl::PushScrollOffsetFromMainThread(
1133 const gfx::ScrollOffset& scroll_offset) { 1130 const gfx::ScrollOffset& scroll_offset) {
1134 PushScrollOffset(&scroll_offset); 1131 PushScrollOffset(&scroll_offset);
1135 } 1132 }
1136 1133
1137 void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue( 1134 void LayerImpl::PushScrollOffsetFromMainThreadAndClobberActiveValue(
1138 const gfx::ScrollOffset& scroll_offset) { 1135 const gfx::ScrollOffset& scroll_offset) {
1139 scroll_offset_->set_clobber_active_value(); 1136 scroll_offset_->set_clobber_active_value();
1140 PushScrollOffset(&scroll_offset); 1137 PushScrollOffset(&scroll_offset);
1141 } 1138 }
1142 1139
1143 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() { 1140 gfx::ScrollOffset LayerImpl::PullDeltaForMainThread() {
1144 RefreshFromScrollDelegate();
1145
1146 // TODO(miletus): Remove all this temporary flooring machinery when 1141 // TODO(miletus): Remove all this temporary flooring machinery when
1147 // Blink fully supports fractional scrolls. 1142 // Blink fully supports fractional scrolls.
1148 gfx::ScrollOffset current_offset = CurrentScrollOffset(); 1143 gfx::ScrollOffset current_offset = CurrentScrollOffset();
1149 gfx::Vector2dF current_delta = ScrollDelta(); 1144 gfx::Vector2dF current_delta = ScrollDelta();
1150 gfx::Vector2dF floored_delta(floor(current_delta.x()), 1145 gfx::Vector2dF floored_delta(floor(current_delta.x()),
1151 floor(current_delta.y())); 1146 floor(current_delta.y()));
1152 gfx::Vector2dF diff_delta = floored_delta - current_delta; 1147 gfx::Vector2dF diff_delta = floored_delta - current_delta;
1153 gfx::ScrollOffset tmp_offset = ScrollOffsetWithDelta(current_offset, 1148 gfx::ScrollOffset tmp_offset = ScrollOffsetWithDelta(current_offset,
1154 diff_delta); 1149 diff_delta);
1155 scroll_offset_->SetCurrent(tmp_offset); 1150 scroll_offset_->SetCurrent(tmp_offset);
1156 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread(); 1151 gfx::ScrollOffset delta = scroll_offset_->PullDeltaForMainThread();
1157 scroll_offset_->SetCurrent(current_offset); 1152 scroll_offset_->SetCurrent(current_offset);
1158 return delta; 1153 return delta;
1159 } 1154 }
1160 1155
1161 void LayerImpl::RefreshFromScrollDelegate() {
1162 if (scroll_offset_delegate_) {
1163 SetCurrentScrollOffset(
1164 gfx::ScrollOffset(scroll_offset_delegate_->GetCurrentScrollOffset()));
1165 }
1166 }
1167
1168 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const { 1156 gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
1169 return scroll_offset_->Current(IsActive()); 1157 return scroll_offset_->Current(IsActive());
1170 } 1158 }
1171 1159
1172 gfx::Vector2dF LayerImpl::ScrollDelta() const { 1160 gfx::Vector2dF LayerImpl::ScrollDelta() const {
1173 if (IsActive()) 1161 if (IsActive())
1174 return gfx::Vector2dF(scroll_offset_->Delta().x(), 1162 return gfx::Vector2dF(scroll_offset_->Delta().x(),
1175 scroll_offset_->Delta().y()); 1163 scroll_offset_->Delta().y());
1176 else 1164 else
1177 return gfx::Vector2dF(scroll_offset_->PendingDelta().get().x(), 1165 return gfx::Vector2dF(scroll_offset_->PendingDelta().get().x(),
(...skipping 22 matching lines...) Expand all
1200 } 1188 }
1201 if (IsActive()) { 1189 if (IsActive()) {
1202 changed |= scroll_offset_->PushPendingToActive(); 1190 changed |= scroll_offset_->PushPendingToActive();
1203 } 1191 }
1204 1192
1205 if (changed) 1193 if (changed)
1206 DidUpdateScrollOffset(); 1194 DidUpdateScrollOffset();
1207 } 1195 }
1208 1196
1209 void LayerImpl::DidUpdateScrollOffset() { 1197 void LayerImpl::DidUpdateScrollOffset() {
1210 if (scroll_offset_delegate_) { 1198 if (scroll_offset_listener_) {
1211 scroll_offset_delegate_->SetCurrentScrollOffset(CurrentScrollOffset()); 1199 scroll_offset_listener_->DidUpdateScrollOffset();
1212 scroll_offset_delegate_->Update();
1213 RefreshFromScrollDelegate();
1214 } 1200 }
1215
1216 NoteLayerPropertyChangedForSubtree(); 1201 NoteLayerPropertyChangedForSubtree();
1217 ScrollbarParametersDidChange(false); 1202 ScrollbarParametersDidChange(false);
1218 } 1203 }
1219 1204
1220 void LayerImpl::SetDoubleSided(bool double_sided) { 1205 void LayerImpl::SetDoubleSided(bool double_sided) {
1221 if (double_sided_ == double_sided) 1206 if (double_sided_ == double_sided)
1222 return; 1207 return;
1223 1208
1224 double_sided_ = double_sided; 1209 double_sided_ = double_sided;
1225 NoteLayerPropertyChangedForSubtree(); 1210 NoteLayerPropertyChangedForSubtree();
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1629 gfx::Transform scaled_draw_transform = 1614 gfx::Transform scaled_draw_transform =
1630 draw_properties_.target_space_transform; 1615 draw_properties_.target_space_transform;
1631 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale); 1616 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale);
1632 gfx::Size scaled_content_bounds = 1617 gfx::Size scaled_content_bounds =
1633 gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), scale)); 1618 gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), scale));
1634 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform, 1619 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform,
1635 gfx::Rect(scaled_content_bounds)); 1620 gfx::Rect(scaled_content_bounds));
1636 } 1621 }
1637 1622
1638 } // namespace cc 1623 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698