Chromium Code Reviews| Index: cc/trees/property_tree.cc |
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
| index 5bfdb8fe8fc0779ccafcfa7a2851d8ea90cf01c6..d959210a13aa5f462834ccff84f9bc6191282a56 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); |
| + if (!scroll_node->data.scrollable || scroll_node->data.bounds.IsEmpty()) |
|
ajuma
2016/02/09 22:35:05
Do we need to take bounds_delta into account befor
|
| + 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 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()); |
| + } |
| + |
| + 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 |