Chromium Code Reviews| Index: cc/trees/property_tree.cc |
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
| index 570a687dadbad4b7a15383e17b48f4354c14a23c..2edd7a0ce7472ea52a2f18514df8c33249783f6a 100644 |
| --- a/cc/trees/property_tree.cc |
| +++ b/cc/trees/property_tree.cc |
| @@ -7,10 +7,59 @@ |
| #include "base/logging.h" |
| #include "cc/base/math_util.h" |
| +#include "cc/proto/gfx_conversions.h" |
| +#include "cc/proto/property_tree.pb.h" |
| +#include "cc/proto/scroll_offset.pb.h" |
| +#include "cc/proto/transform.pb.h" |
| +#include "cc/proto/vector2df.pb.h" |
| #include "cc/trees/property_tree.h" |
| namespace cc { |
| +namespace { |
| + |
| +void CheckIsValidTreeNodeProto( |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
Can we just DCHECK(proto.has_***_node_data()) inst
Khushal
2015/11/13 10:33:12
The function is to make sure that the proto has on
|
| + const proto::TreeNode& proto, |
| + const proto::PropertyTree::PropertyType expected_type) { |
| + switch (expected_type) { |
| + case proto::PropertyTree::Transform: |
| + DCHECK(proto.has_transform_node_data()); |
| + DCHECK(!proto.has_clip_node_data()); |
| + DCHECK(!proto.has_effect_node_data()); |
| + return; |
| + case proto::PropertyTree::Clip: |
| + DCHECK(!proto.has_transform_node_data()); |
| + DCHECK(proto.has_clip_node_data()); |
| + DCHECK(!proto.has_effect_node_data()); |
| + return; |
| + case proto::PropertyTree::Effect: |
| + DCHECK(!proto.has_transform_node_data()); |
| + DCHECK(!proto.has_clip_node_data()); |
| + DCHECK(proto.has_effect_node_data()); |
| + return; |
| + default: |
| + NOTREACHED(); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +template <typename T> |
| +void TreeNode<T>::ToProtobuf(proto::TreeNode* proto) const { |
| + proto->set_id(id); |
| + proto->set_parent_id(parent_id); |
| + proto->set_owner_id(owner_id); |
| + data.ToProtobuf(proto); |
| +} |
| + |
| +template <typename T> |
| +void TreeNode<T>::FromProtobuf(const proto::TreeNode& proto) { |
| + id = proto.id(); |
| + parent_id = proto.parent_id(); |
| + owner_id = proto.owner_id(); |
| + data.FromProtobuf(proto); |
| +} |
| + |
| template <typename T> |
| PropertyTree<T>::PropertyTree() |
| : needs_update_(false) { |
| @@ -50,6 +99,31 @@ void PropertyTree<T>::clear() { |
| back()->parent_id = -1; |
| } |
| +template <typename T> |
| +void PropertyTree<T>::ToProtobuf(proto::PropertyTree* proto) const { |
| + DCHECK_EQ(0, proto->nodes_size()); |
| + for (size_t i = 0; i < nodes_.size(); i++) |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
for (const auto& node : nodes_)
...
Maybe remove
Khushal
2015/11/13 10:33:13
Done. Let's let the const stay for now. That's a T
|
| + nodes_[i].ToProtobuf(proto->add_nodes()); |
| + proto->set_needs_update(needs_update_); |
| +} |
| + |
| +template <typename T> |
| +void PropertyTree<T>::FromProtobuf(const proto::PropertyTree& proto) { |
| + // Verify that the property tree is empty. |
| + DCHECK_EQ(static_cast<int>(nodes_.size()), 1); |
| + DCHECK_EQ(back()->id, 0); |
| + DCHECK_EQ(back()->parent_id, -1); |
| + |
| + // Add the first node. |
| + DCHECK_GT(proto.nodes_size(), 0); |
| + nodes_[0].FromProtobuf(proto.nodes(0)); |
| + |
| + for (int i = 1; i < proto.nodes_size(); i++) { |
| + nodes_.push_back(T()); |
| + nodes_[i].FromProtobuf(proto.nodes(i)); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:10
Maybe just nodes_.back().FromProtobuf(proto.nodes(
Khushal
2015/11/13 10:33:12
Done.
|
| + } |
| +} |
| + |
| template class PropertyTree<TransformNode>; |
| template class PropertyTree<ClipNode>; |
| template class PropertyTree<EffectNode>; |
| @@ -102,6 +176,134 @@ void TransformNodeData::update_post_local_transform( |
| transform_origin.z()); |
| } |
| +void TransformNodeData::ToProtobuf(proto::TreeNode* proto) const { |
| + DCHECK(!proto->has_transform_node_data()); |
| + proto::TranformNodeData* data = proto->mutable_transform_node_data(); |
| + |
| + TransformToProto(pre_local, data->mutable_pre_local()); |
| + TransformToProto(local, data->mutable_local()); |
| + TransformToProto(post_local, data->mutable_post_local()); |
| + |
| + TransformToProto(to_parent, data->mutable_to_parent()); |
| + |
| + TransformToProto(to_target, data->mutable_to_target()); |
| + TransformToProto(from_target, data->mutable_from_target()); |
| + |
| + TransformToProto(to_screen, data->mutable_to_screen()); |
| + TransformToProto(from_screen, data->mutable_from_screen()); |
| + |
| + data->set_target_id(target_id); |
| + data->set_content_target_id(content_target_id); |
| + data->set_source_node_id(source_node_id); |
| + |
| + data->set_needs_local_transform_update(needs_local_transform_update); |
| + |
| + data->set_is_invertible(is_invertible); |
| + data->set_ancestors_are_invertible(ancestors_are_invertible); |
| + |
| + data->set_is_animated(is_animated); |
| + data->set_to_screen_is_animated(to_screen_is_animated); |
| + data->set_has_only_translation_animations(has_only_translation_animations); |
| + data->set_to_screen_has_scale_animation(to_screen_has_scale_animation); |
| + |
| + data->set_flattens_inherited_transform(flattens_inherited_transform); |
| + data->set_node_and_ancestors_are_flat(node_and_ancestors_are_flat); |
| + |
| + data->set_node_and_ancestors_have_only_integer_translation( |
| + node_and_ancestors_have_only_integer_translation); |
| + data->set_scrolls(scrolls); |
| + data->set_needs_sublayer_scale(needs_sublayer_scale); |
| + |
| + data->set_affected_by_inner_viewport_bounds_delta_x( |
| + affected_by_inner_viewport_bounds_delta_x); |
| + data->set_affected_by_inner_viewport_bounds_delta_y( |
| + affected_by_inner_viewport_bounds_delta_y); |
| + data->set_affected_by_outer_viewport_bounds_delta_x( |
| + affected_by_outer_viewport_bounds_delta_x); |
| + data->set_affected_by_outer_viewport_bounds_delta_y( |
| + affected_by_outer_viewport_bounds_delta_y); |
| + |
| + data->set_in_subtree_of_page_scale_layer(in_subtree_of_page_scale_layer); |
| + data->set_post_local_scale_factor(post_local_scale_factor); |
| + data->set_local_maximum_animation_target_scale( |
| + local_maximum_animation_target_scale); |
| + data->set_local_starting_animation_scale(local_starting_animation_scale); |
| + data->set_combined_maximum_animation_target_scale( |
| + combined_maximum_animation_target_scale); |
| + data->set_combined_starting_animation_scale( |
| + combined_starting_animation_scale); |
| + |
| + Vector2dFToProto(sublayer_scale, data->mutable_sublayer_scale()); |
| + ScrollOffsetToProto(scroll_offset, data->mutable_scroll_offset()); |
| + Vector2dFToProto(scroll_snap, data->mutable_scroll_snap()); |
| + Vector2dFToProto(source_offset, data->mutable_source_offset()); |
| + Vector2dFToProto(source_to_parent, data->mutable_source_to_parent()); |
| +} |
| + |
| +void TransformNodeData::FromProtobuf(const proto::TreeNode& proto) { |
| + CheckIsValidTreeNodeProto(proto, proto::PropertyTree::Transform); |
| + |
| + proto::TranformNodeData data = proto.transform_node_data(); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
const proto::TransformNodeData& data = ...;? Same
Khushal
2015/11/13 10:33:12
Done.
|
| + |
| + pre_local = ProtoToTransform(data.pre_local()); |
| + local = ProtoToTransform(data.local()); |
| + post_local = ProtoToTransform(data.post_local()); |
| + |
| + to_parent = ProtoToTransform(data.to_parent()); |
| + |
| + to_target = ProtoToTransform(data.to_target()); |
| + from_target = ProtoToTransform(data.from_target()); |
| + |
| + to_screen = ProtoToTransform(data.to_screen()); |
| + from_screen = ProtoToTransform(data.from_screen()); |
| + |
| + target_id = data.target_id(); |
| + content_target_id = data.content_target_id(); |
| + source_node_id = data.source_node_id(); |
| + |
| + needs_local_transform_update = data.needs_local_transform_update(); |
| + |
| + is_invertible = data.is_invertible(); |
| + ancestors_are_invertible = data.ancestors_are_invertible(); |
| + |
| + is_animated = data.is_animated(); |
| + to_screen_is_animated = data.to_screen_is_animated(); |
| + has_only_translation_animations = data.has_only_translation_animations(); |
| + to_screen_has_scale_animation = data.to_screen_has_scale_animation(); |
| + |
| + flattens_inherited_transform = data.flattens_inherited_transform(); |
| + node_and_ancestors_are_flat = data.node_and_ancestors_are_flat(); |
| + |
| + node_and_ancestors_have_only_integer_translation = |
| + data.node_and_ancestors_have_only_integer_translation(); |
| + scrolls = data.scrolls(); |
| + needs_sublayer_scale = data.needs_sublayer_scale(); |
| + |
| + affected_by_inner_viewport_bounds_delta_x = |
| + data.affected_by_inner_viewport_bounds_delta_x(); |
| + affected_by_inner_viewport_bounds_delta_y = |
| + data.affected_by_inner_viewport_bounds_delta_y(); |
| + affected_by_outer_viewport_bounds_delta_x = |
| + data.affected_by_outer_viewport_bounds_delta_x(); |
| + affected_by_outer_viewport_bounds_delta_y = |
| + data.affected_by_outer_viewport_bounds_delta_y(); |
| + |
| + in_subtree_of_page_scale_layer = data.in_subtree_of_page_scale_layer(); |
| + post_local_scale_factor = data.post_local_scale_factor(); |
| + local_maximum_animation_target_scale = |
| + data.local_maximum_animation_target_scale(); |
| + local_starting_animation_scale = data.local_starting_animation_scale(); |
| + combined_maximum_animation_target_scale = |
| + data.combined_maximum_animation_target_scale(); |
| + combined_starting_animation_scale = data.combined_starting_animation_scale(); |
| + |
| + sublayer_scale = ProtoToVector2dF(data.sublayer_scale()); |
| + scroll_offset = ProtoToScrollOffset(data.scroll_offset()); |
| + scroll_snap = ProtoToVector2dF(data.scroll_snap()); |
| + source_offset = ProtoToVector2dF(data.source_offset()); |
| + source_to_parent = ProtoToVector2dF(data.source_to_parent()); |
| +} |
| + |
| ClipNodeData::ClipNodeData() |
| : transform_id(-1), |
| target_id(-1), |
| @@ -112,6 +314,64 @@ ClipNodeData::ClipNodeData() |
| layers_are_clipped_when_surfaces_disabled(false), |
| resets_clip(false) {} |
| +bool ClipNodeData::operator==(const ClipNodeData& other) const { |
| + return clip == other.clip && |
| + combined_clip_in_target_space == other.combined_clip_in_target_space && |
| + clip_in_target_space == other.clip_in_target_space && |
| + transform_id == other.transform_id && target_id == other.target_id && |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
one per line looks a lot cleaner imo. does the pr
Khushal
2015/11/13 10:33:13
The presubmit asks me to run git cl format for cc.
David Trainor- moved to gerrit
2015/11/13 16:28:21
K no worries then!
|
| + applies_local_clip == other.applies_local_clip && |
| + layer_clipping_uses_only_local_clip == |
| + other.layer_clipping_uses_only_local_clip && |
| + target_is_clipped == other.target_is_clipped && |
| + layers_are_clipped == other.layers_are_clipped && |
| + layers_are_clipped_when_surfaces_disabled == |
| + other.layers_are_clipped_when_surfaces_disabled && |
| + resets_clip == other.resets_clip; |
| +} |
| + |
| +void ClipNodeData::ToProtobuf(proto::TreeNode* proto) const { |
| + DCHECK(!proto->has_clip_node_data()); |
| + proto::ClipNodeData* data = proto->mutable_clip_node_data(); |
| + |
| + RectFToProto(clip, data->mutable_clip()); |
| + RectFToProto(combined_clip_in_target_space, |
| + data->mutable_combined_clip_in_target_space()); |
| + RectFToProto(clip_in_target_space, data->mutable_clip_in_target_space()); |
| + |
| + data->set_transform_id(transform_id); |
| + data->set_target_id(target_id); |
| + data->set_applies_local_clip(applies_local_clip); |
| + data->set_layer_clipping_uses_only_local_clip( |
| + layer_clipping_uses_only_local_clip); |
| + data->set_target_is_clipped(target_is_clipped); |
| + data->set_layers_are_clipped(layers_are_clipped); |
| + data->set_layers_are_clipped_when_surfaces_disabled( |
| + layers_are_clipped_when_surfaces_disabled); |
| + data->set_resets_clip(resets_clip); |
| +} |
| + |
| +void ClipNodeData::FromProtobuf(const proto::TreeNode& proto) { |
| + CheckIsValidTreeNodeProto(proto, proto::PropertyTree::Clip); |
| + |
| + proto::ClipNodeData data = proto.clip_node_data(); |
| + |
| + clip = ProtoToRectF(data.clip()); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
const &
Khushal
2015/11/13 10:33:13
Done.
|
| + combined_clip_in_target_space = |
| + ProtoToRectF(data.combined_clip_in_target_space()); |
| + clip_in_target_space = ProtoToRectF(data.clip_in_target_space()); |
| + |
| + transform_id = data.transform_id(); |
| + target_id = data.target_id(); |
| + applies_local_clip = data.applies_local_clip(); |
| + layer_clipping_uses_only_local_clip = |
| + data.layer_clipping_uses_only_local_clip(); |
| + target_is_clipped = data.target_is_clipped(); |
| + layers_are_clipped = data.layers_are_clipped(); |
| + layers_are_clipped_when_surfaces_disabled = |
| + data.layers_are_clipped_when_surfaces_disabled(); |
| + resets_clip = data.resets_clip(); |
| +} |
| + |
| EffectNodeData::EffectNodeData() |
| : opacity(1.f), |
| screen_space_opacity(1.f), |
| @@ -119,6 +379,35 @@ EffectNodeData::EffectNodeData() |
| transform_id(0), |
| clip_id(0) {} |
| +bool EffectNodeData::operator==(const EffectNodeData& other) const { |
|
David Trainor- moved to gerrit
2015/11/12 22:46:10
Need one for TransformNodeData?
Khushal
2015/11/13 10:33:13
Done.
|
| + return opacity == other.opacity && |
| + screen_space_opacity == other.screen_space_opacity && |
| + has_render_surface == other.has_render_surface && |
| + transform_id == other.transform_id && clip_id == other.clip_id; |
|
David Trainor- moved to gerrit
2015/11/12 22:46:10
new line imo
Khushal
2015/11/13 10:33:12
presubmit complains. :(
|
| +} |
| + |
| +void EffectNodeData::ToProtobuf(proto::TreeNode* proto) const { |
| + DCHECK(!proto->has_effect_node_data()); |
| + proto::EffectNodeData* data = proto->mutable_effect_node_data(); |
| + data->set_opacity(opacity); |
| + data->set_screen_space_opacity(screen_space_opacity); |
| + data->set_has_render_surface(has_render_surface); |
| + data->set_transform_id(transform_id); |
| + data->set_clip_id(clip_id); |
| +} |
| + |
| +void EffectNodeData::FromProtobuf(const proto::TreeNode& proto) { |
| + CheckIsValidTreeNodeProto(proto, proto::PropertyTree::Effect); |
| + |
| + proto::EffectNodeData data = proto.effect_node_data(); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
const &
Khushal
2015/11/13 10:33:12
Done.
|
| + |
| + opacity = data.opacity(); |
| + screen_space_opacity = data.screen_space_opacity(); |
| + has_render_surface = data.has_render_surface(); |
| + transform_id = data.transform_id(); |
| + clip_id = data.clip_id(); |
| +} |
| + |
| void TransformTree::clear() { |
| PropertyTree<TransformNode>::clear(); |
| @@ -624,6 +913,62 @@ bool TransformTree::HasNodesAffectedByOuterViewportBoundsDelta() const { |
| return !nodes_affected_by_outer_viewport_bounds_delta_.empty(); |
| } |
| +void TransformTree::ToProtobuf(proto::PropertyTree* proto) const { |
| + DCHECK(!proto->has_property_type()); |
| + proto->set_property_type(proto::PropertyTree::Transform); |
| + |
| + PropertyTree::ToProtobuf(proto); |
| + proto::TransformTreeData* data = proto->mutable_transform_tree_data(); |
| + |
| + data->set_source_to_parent_updates_allowed(source_to_parent_updates_allowed_); |
| + data->set_page_scale_factor(page_scale_factor_); |
| + 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 (int i : nodes_affected_by_inner_viewport_bounds_delta_) |
|
David Trainor- moved to gerrit
2015/11/12 22:46:10
would it be cleaner to use auto here and below?
Khushal
2015/11/13 10:33:12
Done.
|
| + data->add_nodes_affected_by_inner_viewport_bounds_delta(i); |
| + |
| + for (int i : nodes_affected_by_outer_viewport_bounds_delta_) |
| + data->add_nodes_affected_by_outer_viewport_bounds_delta(i); |
| +} |
| + |
| +void TransformTree::FromProtobuf(const proto::PropertyTree& proto) { |
| + DCHECK(proto.has_property_type()); |
| + DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform); |
| + |
| + PropertyTree::FromProtobuf(proto); |
| + proto::TransformTreeData data = proto.transform_tree_data(); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
const &
Khushal
2015/11/13 10:33:12
Done.
|
| + |
| + source_to_parent_updates_allowed_ = data.source_to_parent_updates_allowed(); |
| + page_scale_factor_ = data.page_scale_factor(); |
| + 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++) { |
| + nodes_affected_by_inner_viewport_bounds_delta_.push_back( |
| + data.nodes_affected_by_inner_viewport_bounds_delta(i)); |
| + } |
| + |
| + DCHECK(nodes_affected_by_outer_viewport_bounds_delta_.empty()); |
| + for (int i = 0; i < data.nodes_affected_by_outer_viewport_bounds_delta_size(); |
| + i++) { |
| + nodes_affected_by_outer_viewport_bounds_delta_.push_back( |
| + data.nodes_affected_by_outer_viewport_bounds_delta(i)); |
| + } |
| +} |
| + |
| void EffectTree::UpdateOpacities(int id) { |
| EffectNode* node = Node(id); |
| node->data.screen_space_opacity = node->data.opacity; |
| @@ -660,9 +1005,67 @@ gfx::RectF ClipTree::ViewportClip() { |
| return Node(1)->data.clip; |
| } |
| +void ClipTree::ToProtobuf(proto::PropertyTree* proto) const { |
| + DCHECK(!proto->has_property_type()); |
| + proto->set_property_type(proto::PropertyTree::Clip); |
| + |
| + PropertyTree::ToProtobuf(proto); |
| +} |
| + |
| +void ClipTree::FromProtobuf(const proto::PropertyTree& proto) { |
| + DCHECK(proto.has_property_type()); |
| + DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip); |
| + |
| + PropertyTree::FromProtobuf(proto); |
| +} |
| + |
| +void EffectTree::ToProtobuf(proto::PropertyTree* proto) const { |
| + DCHECK(!proto->has_property_type()); |
| + proto->set_property_type(proto::PropertyTree::Effect); |
| + |
| + PropertyTree::ToProtobuf(proto); |
| +} |
| + |
| +void EffectTree::FromProtobuf(const proto::PropertyTree& proto) { |
| + DCHECK(proto.has_property_type()); |
| + DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect); |
| + |
| + PropertyTree::FromProtobuf(proto); |
| +} |
| + |
| PropertyTrees::PropertyTrees() |
| : needs_rebuild(true), |
| non_root_surfaces_enabled(true), |
| sequence_number(0) {} |
| +void PropertyTrees::ToProtobuf(proto::PropertyTrees* proto) const { |
| + // TODO(khushalsagar): Add support for sending diffs when serializaing |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
Add a bug number.
Khushal
2015/11/13 10:33:13
Done.
|
| + // property trees. |
| + transform_tree.ToProtobuf(proto->mutable_transform_tree()); |
| + effect_tree.ToProtobuf(proto->mutable_effect_tree()); |
| + clip_tree.ToProtobuf(proto->mutable_clip_tree()); |
| + proto->set_needs_rebuild(needs_rebuild); |
|
David Trainor- moved to gerrit
2015/11/12 22:46:11
Do we actually need this? I guess it's fine to se
Khushal
2015/11/13 10:33:12
Not really. Once the tree has been re-built when u
|
| + proto->set_non_root_surfaces_enabled(non_root_surfaces_enabled); |
| + |
| + // TODO(khushalsagar): Consider using the sequence number to decide if |
|
David Trainor- moved to gerrit
2015/11/12 22:46:10
Use same bug number as above imo :)
Khushal
2015/11/13 10:33:13
Done.
|
| + // property trees need to be serialized again for a commit. |
| + proto->set_sequence_number(sequence_number); |
| +} |
| + |
| +// static |
| +PropertyTrees PropertyTrees::CreateFromProtobuf( |
| + const proto::PropertyTrees& proto) { |
| + PropertyTrees property_trees; |
| + |
| + property_trees.transform_tree.FromProtobuf(proto.transform_tree()); |
| + property_trees.effect_tree.FromProtobuf(proto.effect_tree()); |
| + property_trees.clip_tree.FromProtobuf(proto.clip_tree()); |
| + |
| + property_trees.needs_rebuild = proto.needs_rebuild(); |
| + property_trees.non_root_surfaces_enabled = proto.non_root_surfaces_enabled(); |
| + property_trees.sequence_number = proto.sequence_number(); |
| + |
| + return property_trees; |
| +} |
| + |
| } // namespace cc |