OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |