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

Unified Diff: cc/layers/layer.cc

Issue 2189583004: [not for review - epic CL] Adding Elastic+Momentum+Layered scrolling to views::ScrollView Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layers/layer.cc
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 43ad88a526794d27bb0563b93a9ea73d182b6970..572533298c8f767fbb151bc438018c96cae4d1f0 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -771,8 +771,10 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
return;
PropertyTrees* property_trees = layer_tree_->property_trees();
- if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable())
- property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset);
+ if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) {
+ property_trees->scroll_tree.SetScrollOffset(id(), inputs_.scroll_offset,
+ inputs_.overscroll);
+ }
if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
id())) {
@@ -780,7 +782,8 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
property_trees->transform_id_to_index_map[id()]);
TransformNode* transform_node =
property_trees->transform_tree.Node(transform_tree_index());
- transform_node->scroll_offset = CurrentScrollOffset();
+ transform_node->scroll_offset_with_overscroll =
+ inputs_.scroll_offset + inputs_.overscroll;
transform_node->needs_local_transform_update = true;
property_trees->transform_tree.set_needs_update(true);
SetNeedsCommitNoRebuild();
@@ -790,22 +793,33 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
SetNeedsCommit();
}
-void Layer::SetScrollOffsetFromImplSide(
- const gfx::ScrollOffset& scroll_offset) {
+void Layer::SetScrollOffsetFromImplSide(const gfx::ScrollOffset& scroll_offset,
+ gfx::Vector2dF* overscroll_delta) {
DCHECK(IsPropertyChangeAllowed());
// This function only gets called during a BeginMainFrame, so there
// is no need to call SetNeedsUpdate here.
DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested());
- if (inputs_.scroll_offset == scroll_offset)
+
+ gfx::ScrollOffset overscroll = inputs_.overscroll;
+ if (inputs_.can_overscroll && overscroll_delta) {
+ overscroll = gfx::ScrollOffsetWithDelta(overscroll, *overscroll_delta);
+ *overscroll_delta = gfx::Vector2dF();
+ }
+ if (inputs_.scroll_offset == scroll_offset &&
+ inputs_.overscroll == overscroll)
return;
+
inputs_.scroll_offset = scroll_offset;
+ inputs_.overscroll = overscroll;
SetNeedsPushProperties();
bool needs_rebuild = true;
PropertyTrees* property_trees = layer_tree_->property_trees();
- if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable())
- property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset);
+ if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) {
+ property_trees->scroll_tree.SetScrollOffset(id(), inputs_.scroll_offset,
+ inputs_.overscroll);
+ }
if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
id())) {
@@ -813,7 +827,8 @@ void Layer::SetScrollOffsetFromImplSide(
property_trees->transform_id_to_index_map[id()]);
TransformNode* transform_node =
property_trees->transform_tree.Node(transform_tree_index());
- transform_node->scroll_offset = CurrentScrollOffset();
+ transform_node->scroll_offset_with_overscroll =
+ inputs_.scroll_offset + inputs_.overscroll;
transform_node->needs_local_transform_update = true;
property_trees->transform_tree.set_needs_update(true);
needs_rebuild = false;
@@ -828,11 +843,14 @@ void Layer::SetScrollOffsetFromImplSide(
// "this" may have been destroyed during the process.
}
-void Layer::SetScrollClipLayerId(int clip_layer_id) {
+void Layer::SetScrollClipAndCanOverscroll(int clip_layer_id,
+ bool can_overscroll) {
DCHECK(IsPropertyChangeAllowed());
- if (inputs_.scroll_clip_layer_id == clip_layer_id)
+ if (inputs_.scroll_clip_layer_id == clip_layer_id &&
+ inputs_.can_overscroll == can_overscroll)
return;
inputs_.scroll_clip_layer_id = clip_layer_id;
+ inputs_.can_overscroll = can_overscroll;
SetNeedsCommit();
}
@@ -1160,7 +1178,8 @@ void Layer::PushPropertiesTo(LayerImpl* layer) {
layer->SetShouldCheckBackfaceVisibility(should_check_backface_visibility_);
layer->Set3dSortingContextId(inputs_.sorting_context_id);
- layer->SetScrollClipLayer(inputs_.scroll_clip_layer_id);
+ layer->SetScrollClipAndCanOverscroll(inputs_.scroll_clip_layer_id,
+ inputs_.can_overscroll);
layer->set_user_scrollable_horizontal(inputs_.user_scrollable_horizontal);
layer->set_user_scrollable_vertical(inputs_.user_scrollable_vertical);
layer->SetElementId(inputs_.element_id);
@@ -1343,6 +1362,7 @@ void Layer::LayerSpecificPropertiesToProto(proto::LayerProperties* proto,
base->set_scroll_clip_layer_id(inputs_.scroll_clip_layer_id);
base->set_user_scrollable_horizontal(inputs_.user_scrollable_horizontal);
base->set_user_scrollable_vertical(inputs_.user_scrollable_vertical);
+ base->set_can_overscroll(inputs_.can_overscroll);
base->set_main_thread_scrolling_reasons(
inputs_.main_thread_scrolling_reasons);
RegionToProto(inputs_.non_fast_scrollable_region,
@@ -1478,6 +1498,7 @@ void Layer::FromLayerSpecificPropertiesProto(
inputs_.scroll_clip_layer_id = base.scroll_clip_layer_id();
inputs_.user_scrollable_horizontal = base.user_scrollable_horizontal();
inputs_.user_scrollable_vertical = base.user_scrollable_vertical();
+ inputs_.can_overscroll = base.can_overscroll();
inputs_.scroll_parent = base.scroll_parent_id() == INVALID_ID
? nullptr
@@ -1518,6 +1539,7 @@ void Layer::FromLayerSpecificPropertiesProto(
}
inputs_.scroll_offset = ProtoToScrollOffset(base.scroll_offset());
+ inputs_.overscroll = ProtoToScrollOffset(base.overscroll());
inputs_.update_rect.Union(ProtoToRect(base.update_rect()));
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698