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

Unified Diff: cc/trees/property_tree.cc

Issue 1675963002: Move MaxScrollOffset to property_trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove comment. Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/property_tree.cc
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 5bfdb8fe8fc0779ccafcfa7a2851d8ea90cf01c6..ac8b60bb2b9184761af6a0461fbb4afffb5b3256 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -16,6 +16,7 @@
#include "cc/proto/transform.pb.h"
#include "cc/proto/vector2df.pb.h"
#include "cc/trees/property_tree.h"
+#include "ui/gfx/geometry/vector2d_conversions.h"
namespace cc {
@@ -476,14 +477,22 @@ ScrollNodeData::ScrollNodeData()
main_thread_scrolling_reasons(
MainThreadScrollingReason::kNotScrollingOnMain),
contains_non_fast_scrollable_region(false),
- transform_id(0) {}
+ max_scroll_offset_affected_by_page_scale(false),
+ is_inner_viewport_scroll_layer(false),
+ is_outer_viewport_scroll_layer(false) {}
bool ScrollNodeData::operator==(const ScrollNodeData& other) const {
return scrollable == other.scrollable &&
main_thread_scrolling_reasons == other.main_thread_scrolling_reasons &&
contains_non_fast_scrollable_region ==
other.contains_non_fast_scrollable_region &&
- transform_id == other.transform_id;
+ scroll_clip_layer_bounds == other.scroll_clip_layer_bounds &&
+ bounds == other.bounds &&
+ max_scroll_offset_affected_by_page_scale ==
+ other.max_scroll_offset_affected_by_page_scale &&
+ is_inner_viewport_scroll_layer ==
+ other.is_inner_viewport_scroll_layer &&
+ is_outer_viewport_scroll_layer == other.is_outer_viewport_scroll_layer;
}
void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const {
@@ -493,7 +502,13 @@ void ScrollNodeData::ToProtobuf(proto::TreeNode* proto) const {
data->set_main_thread_scrolling_reasons(main_thread_scrolling_reasons);
data->set_contains_non_fast_scrollable_region(
contains_non_fast_scrollable_region);
- data->set_transform_id(transform_id);
+ SizeToProto(scroll_clip_layer_bounds,
+ data->mutable_scroll_clip_layer_bounds());
+ SizeToProto(bounds, data->mutable_bounds());
+ data->set_max_scroll_offset_affected_by_page_scale(
+ max_scroll_offset_affected_by_page_scale);
+ data->set_is_inner_viewport_scroll_layer(is_inner_viewport_scroll_layer);
+ data->set_is_outer_viewport_scroll_layer(is_outer_viewport_scroll_layer);
}
void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) {
@@ -504,7 +519,12 @@ void ScrollNodeData::FromProtobuf(const proto::TreeNode& proto) {
main_thread_scrolling_reasons = data.main_thread_scrolling_reasons();
contains_non_fast_scrollable_region =
data.contains_non_fast_scrollable_region();
- transform_id = data.transform_id();
+ scroll_clip_layer_bounds = ProtoToSize(data.scroll_clip_layer_bounds());
+ bounds = ProtoToSize(data.bounds());
+ max_scroll_offset_affected_by_page_scale =
+ data.max_scroll_offset_affected_by_page_scale();
+ is_inner_viewport_scroll_layer = data.is_inner_viewport_scroll_layer();
+ is_outer_viewport_scroll_layer = data.is_outer_viewport_scroll_layer();
}
void TransformTree::clear() {
@@ -733,15 +753,19 @@ void TransformTree::UpdateLocalTransform(TransformNode* node) {
}
gfx::Vector2dF fixed_position_adjustment;
+ gfx::Vector2dF inner_viewport_bounds_delta =
+ property_trees()->inner_viewport_container_bounds_delta();
+ gfx::Vector2dF outer_viewport_bounds_delta =
+ property_trees()->outer_viewport_container_bounds_delta();
if (node->data.affected_by_inner_viewport_bounds_delta_x)
- fixed_position_adjustment.set_x(inner_viewport_bounds_delta_.x());
+ fixed_position_adjustment.set_x(inner_viewport_bounds_delta.x());
else if (node->data.affected_by_outer_viewport_bounds_delta_x)
- fixed_position_adjustment.set_x(outer_viewport_bounds_delta_.x());
+ fixed_position_adjustment.set_x(outer_viewport_bounds_delta.x());
if (node->data.affected_by_inner_viewport_bounds_delta_y)
- fixed_position_adjustment.set_y(inner_viewport_bounds_delta_.y());
+ fixed_position_adjustment.set_y(inner_viewport_bounds_delta.y());
else if (node->data.affected_by_outer_viewport_bounds_delta_y)
- fixed_position_adjustment.set_y(outer_viewport_bounds_delta_.y());
+ fixed_position_adjustment.set_y(outer_viewport_bounds_delta.y());
transform.Translate(
node->data.source_to_parent.x() - node->data.scroll_offset.x() +
@@ -970,12 +994,7 @@ void TransformTree::SetDeviceTransformScaleFactor(
device_transform_scale_components.y());
}
-void TransformTree::SetInnerViewportBoundsDelta(gfx::Vector2dF bounds_delta) {
- if (inner_viewport_bounds_delta_ == bounds_delta)
- return;
-
- inner_viewport_bounds_delta_ = bounds_delta;
-
+void TransformTree::UpdateInnerViewportContainerBoundsDelta() {
if (nodes_affected_by_inner_viewport_bounds_delta_.empty())
return;
@@ -984,12 +1003,7 @@ void TransformTree::SetInnerViewportBoundsDelta(gfx::Vector2dF bounds_delta) {
Node(i)->data.needs_local_transform_update = true;
}
-void TransformTree::SetOuterViewportBoundsDelta(gfx::Vector2dF bounds_delta) {
- if (outer_viewport_bounds_delta_ == bounds_delta)
- return;
-
- outer_viewport_bounds_delta_ = bounds_delta;
-
+void TransformTree::UpdateOuterViewportContainerBoundsDelta() {
if (nodes_affected_by_outer_viewport_bounds_delta_.empty())
return;
@@ -1022,8 +1036,6 @@ bool TransformTree::operator==(const TransformTree& other) const {
device_scale_factor_ == other.device_scale_factor() &&
device_transform_scale_factor_ ==
other.device_transform_scale_factor() &&
- inner_viewport_bounds_delta_ == other.inner_viewport_bounds_delta() &&
- outer_viewport_bounds_delta_ == other.outer_viewport_bounds_delta() &&
nodes_affected_by_inner_viewport_bounds_delta_ ==
other.nodes_affected_by_inner_viewport_bounds_delta() &&
nodes_affected_by_outer_viewport_bounds_delta_ ==
@@ -1042,11 +1054,6 @@ void TransformTree::ToProtobuf(proto::PropertyTree* proto) const {
data->set_device_scale_factor(device_scale_factor_);
data->set_device_transform_scale_factor(device_transform_scale_factor_);
- Vector2dFToProto(inner_viewport_bounds_delta_,
- data->mutable_inner_viewport_bounds_delta());
- Vector2dFToProto(outer_viewport_bounds_delta_,
- data->mutable_outer_viewport_bounds_delta());
-
for (auto i : nodes_affected_by_inner_viewport_bounds_delta_)
data->add_nodes_affected_by_inner_viewport_bounds_delta(i);
@@ -1066,11 +1073,6 @@ void TransformTree::FromProtobuf(const proto::PropertyTree& proto) {
device_scale_factor_ = data.device_scale_factor();
device_transform_scale_factor_ = data.device_transform_scale_factor();
- inner_viewport_bounds_delta_ =
- ProtoToVector2dF(data.inner_viewport_bounds_delta());
- outer_viewport_bounds_delta_ =
- ProtoToVector2dF(data.outer_viewport_bounds_delta());
-
DCHECK(nodes_affected_by_inner_viewport_bounds_delta_.empty());
for (int i = 0; i < data.nodes_affected_by_inner_viewport_bounds_delta_size();
++i) {
@@ -1205,6 +1207,10 @@ void EffectTree::FromProtobuf(const proto::PropertyTree& proto) {
PropertyTree::FromProtobuf(proto);
}
+ScrollTree::ScrollTree() {}
+
+ScrollTree::~ScrollTree() {}
+
bool ScrollTree::operator==(const ScrollTree& other) const {
return PropertyTree::operator==(other);
}
@@ -1223,10 +1229,62 @@ void ScrollTree::FromProtobuf(const proto::PropertyTree& proto) {
PropertyTree::FromProtobuf(proto);
}
+gfx::ScrollOffset ScrollTree::MaxScrollOffset(int scroll_node_id) const {
+ const ScrollNode* scroll_node = Node(scroll_node_id);
+ gfx::SizeF scroll_bounds = gfx::SizeF(scroll_node->data.bounds.width(),
+ scroll_node->data.bounds.height());
+
+ if (scroll_node->data.is_inner_viewport_scroll_layer) {
+ scroll_bounds.Enlarge(
+ property_trees()->inner_viewport_scroll_bounds_delta().x(),
+ property_trees()->inner_viewport_scroll_bounds_delta().y());
+ }
+
+ if (!scroll_node->data.scrollable || scroll_bounds.IsEmpty())
+ return gfx::ScrollOffset();
+
+ TransformTree& transform_tree = property_trees()->transform_tree;
+ float scale_factor = 1.f;
+ if (scroll_node->data.max_scroll_offset_affected_by_page_scale)
+ scale_factor = transform_tree.page_scale_factor();
+
+ gfx::SizeF scaled_scroll_bounds = gfx::ScaleSize(scroll_bounds, scale_factor);
+ scaled_scroll_bounds.SetSize(std::floor(scaled_scroll_bounds.width()),
+ std::floor(scaled_scroll_bounds.height()));
+
+ gfx::Size scroll_clip_layer_bounds =
+ scroll_node->data.scroll_clip_layer_bounds;
+
+ gfx::Vector2dF scroll_clip_layer_bounds_delta;
+ if (scroll_node->data.is_inner_viewport_scroll_layer) {
+ scroll_clip_layer_bounds_delta.Add(
+ property_trees()->inner_viewport_container_bounds_delta());
+ } else if (scroll_node->data.is_outer_viewport_scroll_layer) {
+ scroll_clip_layer_bounds_delta.Add(
+ property_trees()->outer_viewport_container_bounds_delta());
+ }
+
+ gfx::Vector2d delta = gfx::ToCeiledVector2d(scroll_clip_layer_bounds_delta);
+ scroll_clip_layer_bounds.SetSize(
+ scroll_clip_layer_bounds.width() + delta.x(),
+ scroll_clip_layer_bounds.height() + delta.y());
+
+ gfx::ScrollOffset max_offset(
+ scaled_scroll_bounds.width() - scroll_clip_layer_bounds.width(),
+ scaled_scroll_bounds.height() - scroll_clip_layer_bounds.height());
+
+ max_offset.Scale(1 / scale_factor);
+ max_offset.SetToMax(gfx::ScrollOffset());
+ return max_offset;
+}
+
PropertyTrees::PropertyTrees()
- : needs_rebuild(true),
- non_root_surfaces_enabled(true),
- sequence_number(0) {}
+ : needs_rebuild(true), non_root_surfaces_enabled(true), sequence_number(0) {
+ transform_tree.SetPropertyTrees(this);
+ effect_tree.SetPropertyTrees(this);
+ clip_tree.SetPropertyTrees(this);
+ scroll_tree.SetPropertyTrees(this);
+}
PropertyTrees::~PropertyTrees() {}
@@ -1239,6 +1297,27 @@ bool PropertyTrees::operator==(const PropertyTrees& other) const {
sequence_number == other.sequence_number;
}
+PropertyTrees& PropertyTrees::operator=(const PropertyTrees& from) {
+ transform_tree = from.transform_tree;
+ effect_tree = from.effect_tree;
+ clip_tree = from.clip_tree;
+ scroll_tree = from.scroll_tree;
+ needs_rebuild = from.needs_rebuild;
+ non_root_surfaces_enabled = from.non_root_surfaces_enabled;
+ sequence_number = from.sequence_number;
+ inner_viewport_container_bounds_delta_ =
+ from.inner_viewport_container_bounds_delta();
+ outer_viewport_container_bounds_delta_ =
+ from.outer_viewport_container_bounds_delta();
+ inner_viewport_scroll_bounds_delta_ =
+ from.inner_viewport_scroll_bounds_delta();
+ transform_tree.SetPropertyTrees(this);
+ effect_tree.SetPropertyTrees(this);
+ clip_tree.SetPropertyTrees(this);
+ scroll_tree.SetPropertyTrees(this);
+ return *this;
+}
+
void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const {
// TODO(khushalsagar): Add support for sending diffs when serializaing
// property trees. See crbug/555370.
@@ -1264,6 +1343,34 @@ void PropertyTrees::FromProtobuf(const proto::PropertyTrees& proto) {
needs_rebuild = proto.needs_rebuild();
non_root_surfaces_enabled = proto.non_root_surfaces_enabled();
sequence_number = proto.sequence_number();
+
+ transform_tree.SetPropertyTrees(this);
+ effect_tree.SetPropertyTrees(this);
+ clip_tree.SetPropertyTrees(this);
+ scroll_tree.SetPropertyTrees(this);
+}
+
+void PropertyTrees::SetInnerViewportContainerBoundsDelta(
+ gfx::Vector2dF bounds_delta) {
+ if (inner_viewport_container_bounds_delta_ == bounds_delta)
+ return;
+
+ inner_viewport_container_bounds_delta_ = bounds_delta;
+ transform_tree.UpdateInnerViewportContainerBoundsDelta();
+}
+
+void PropertyTrees::SetOuterViewportContainerBoundsDelta(
+ gfx::Vector2dF bounds_delta) {
+ if (outer_viewport_container_bounds_delta_ == bounds_delta)
+ return;
+
+ outer_viewport_container_bounds_delta_ = bounds_delta;
+ transform_tree.UpdateOuterViewportContainerBoundsDelta();
+}
+
+void PropertyTrees::SetInnerViewportScrollBoundsDelta(
+ gfx::Vector2dF bounds_delta) {
+ inner_viewport_scroll_bounds_delta_ = bounds_delta;
}
} // namespace cc
« no previous file with comments | « cc/trees/property_tree.h ('k') | cc/trees/property_tree_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698