| Index: cc/trees/property_tree.cc
|
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
|
| index d2b3783a5724dc82c0c44fadb6e5c24e3e3b5279..1fdb436c840423e9b6935907b4b66cb328957f73 100644
|
| --- a/cc/trees/property_tree.cc
|
| +++ b/cc/trees/property_tree.cc
|
| @@ -29,9 +29,6 @@ namespace cc {
|
| template <typename T>
|
| PropertyTree<T>::PropertyTree()
|
| : needs_update_(false) {
|
| - nodes_.push_back(T());
|
| - back()->id = 0;
|
| - back()->parent_id = -1;
|
| }
|
|
|
| // Equivalent to
|
| @@ -49,7 +46,7 @@ TransformTree::TransformTree()
|
| page_scale_factor_(1.f),
|
| device_scale_factor_(1.f),
|
| device_transform_scale_factor_(1.f) {
|
| - cached_data_.push_back(TransformCachedNodeData());
|
| + Insert(TransformNode(), kInvalidNodeId);
|
| }
|
|
|
| TransformTree::~TransformTree() = default;
|
| @@ -57,7 +54,9 @@ TransformTree& TransformTree::operator=(const TransformTree&) = default;
|
|
|
| template <typename T>
|
| int PropertyTree<T>::Insert(const T& tree_node, int parent_id) {
|
| - DCHECK_GT(nodes_.size(), 0u);
|
| + if (nodes_.size() == 0u)
|
| + DCHECK_EQ(parent_id, kInvalidNodeId) << "size" << nodes_.size()
|
| + << "parentid" << parent_id;
|
| nodes_.push_back(tree_node);
|
| T& node = nodes_.back();
|
| node.parent_id = parent_id;
|
| @@ -68,9 +67,6 @@ int PropertyTree<T>::Insert(const T& tree_node, int parent_id) {
|
| template <typename T>
|
| void PropertyTree<T>::clear() {
|
| nodes_.clear();
|
| - nodes_.push_back(T());
|
| - back()->id = 0;
|
| - back()->parent_id = -1;
|
| }
|
|
|
| template <typename T>
|
| @@ -90,17 +86,12 @@ template <typename T>
|
| void PropertyTree<T>::FromProtobuf(
|
| const proto::PropertyTree& proto,
|
| std::unordered_map<int, int>* node_id_to_index_map) {
|
| - // 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_.back().FromProtobuf(proto.nodes(0));
|
| + DCHECK_GE(proto.nodes_size(), 0);
|
| + nodes_.clear();
|
|
|
| - DCHECK(!node_id_to_index_map || (*node_id_to_index_map).empty());
|
| - for (int i = 1; i < proto.nodes_size(); ++i) {
|
| + node_id_to_index_map->clear();
|
| + for (int i = 0; i < proto.nodes_size(); ++i) {
|
| nodes_.push_back(T());
|
| nodes_.back().FromProtobuf(proto.nodes(i));
|
| (*node_id_to_index_map)[nodes_.back().owner_id] = nodes_.back().id;
|
| @@ -127,9 +118,9 @@ template class PropertyTree<ScrollNode>;
|
|
|
| int TransformTree::Insert(const TransformNode& tree_node, int parent_id) {
|
| int node_id = PropertyTree<TransformNode>::Insert(tree_node, parent_id);
|
| - DCHECK_EQ(node_id, static_cast<int>(cached_data_.size()));
|
| -
|
| cached_data_.push_back(TransformCachedNodeData());
|
| + DCHECK_EQ(size(), cached_data_.size());
|
| +
|
| return node_id;
|
| }
|
|
|
| @@ -139,7 +130,7 @@ void TransformTree::clear() {
|
| nodes_affected_by_inner_viewport_bounds_delta_.clear();
|
| nodes_affected_by_outer_viewport_bounds_delta_.clear();
|
| cached_data_.clear();
|
| - cached_data_.push_back(TransformCachedNodeData());
|
| + Insert(TransformNode(), TransformTree::kInvalidNodeId);
|
| }
|
|
|
| bool TransformTree::ComputeTransform(int source_id,
|
| @@ -203,7 +194,8 @@ bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) {
|
| }
|
|
|
| void TransformTree::ResetChangeTracking() {
|
| - for (int id = 1; id < static_cast<int>(size()); ++id) {
|
| + for (int id = TransformTree::kDeviceNodeId; id < static_cast<int>(size());
|
| + ++id) {
|
| TransformNode* node = Node(id);
|
| node->transform_changed = false;
|
| }
|
| @@ -435,6 +427,8 @@ void TransformTree::UpdateSublayerScale(TransformNode* node) {
|
|
|
| void TransformTree::UpdateTargetSpaceTransform(TransformNode* node,
|
| TransformNode* target_node) {
|
| + DCHECK(node);
|
| + DCHECK(target_node);
|
| gfx::Transform target_space_transform;
|
| if (node->needs_sublayer_scale) {
|
| target_space_transform.MakeIdentity();
|
| @@ -542,7 +536,7 @@ void TransformTree::UpdateNodeAndAncestorsAreAnimatedOrInvertible(
|
| void TransformTree::SetDeviceTransform(const gfx::Transform& transform,
|
| gfx::PointF root_position) {
|
| gfx::Transform root_post_local = transform;
|
| - TransformNode* node = Node(1);
|
| + TransformNode* node = Node(TransformTree::kRootNodeId);
|
| root_post_local.Scale(node->post_local_scale_factor,
|
| node->post_local_scale_factor);
|
| root_post_local.Translate(root_position.x(), root_position.y());
|
| @@ -647,7 +641,11 @@ int TransformTree::TargetId(int node_id) const {
|
| }
|
|
|
| void TransformTree::SetTargetId(int node_id, int target_id) {
|
| - DCHECK(static_cast<int>(cached_data_.size()) > node_id);
|
| + DCHECK(static_cast<int>(cached_data_.size()) > node_id) << node_id;
|
| + DCHECK(static_cast<int>(size()) > target_id) << target_id << " v.s. "
|
| + << size();
|
| + DCHECK_GE(target_id, TransformTree::kDeviceNodeId) << target_id;
|
| + DCHECK_LE(target_id, node_id) << target_id << " v.s. " << node_id;
|
| cached_data_[node_id].target_id = target_id;
|
| }
|
|
|
| @@ -663,8 +661,8 @@ void TransformTree::SetContentTargetId(int node_id, int content_target_id) {
|
|
|
| gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale(
|
| int id) const {
|
| - DCHECK_GT(id, 0);
|
| - if (id == 1) {
|
| + DCHECK_GE(id, TransformTree::kRootNodeId);
|
| + if (id == TransformTree::kRootNodeId) {
|
| return gfx::Transform();
|
| }
|
| const TransformNode* node = Node(id);
|
| @@ -717,6 +715,8 @@ void TransformTree::FromProtobuf(
|
| std::unordered_map<int, int>* node_id_to_index_map) {
|
| DCHECK(proto.has_property_type());
|
| DCHECK_EQ(proto.property_type(), proto::PropertyTree::Transform);
|
| + // Verify that the property tree is empty.
|
| + DCHECK_EQ(static_cast<int>(size()), TransformTree::kRootNodeId);
|
|
|
| PropertyTree::FromProtobuf(proto, node_id_to_index_map);
|
| const proto::TransformTreeData& data = proto.transform_tree_data();
|
| @@ -739,10 +739,10 @@ void TransformTree::FromProtobuf(
|
| nodes_affected_by_outer_viewport_bounds_delta_.push_back(
|
| data.nodes_affected_by_outer_viewport_bounds_delta(i));
|
| }
|
| -
|
| DCHECK_EQ(static_cast<int>(cached_data_.size()), 1);
|
| - cached_data_.back().FromProtobuf(data.cached_data(0));
|
| - for (int i = 1; i < data.cached_data_size(); ++i) {
|
| + cached_data_.clear();
|
| + // cached_data_.back().FromProtobuf(data.cached_data(0));
|
| + for (int i = 0; i < data.cached_data_size(); ++i) {
|
| cached_data_.push_back(TransformCachedNodeData());
|
| cached_data_.back().FromProtobuf(data.cached_data(i));
|
| }
|
| @@ -914,7 +914,7 @@ void EffectTree::TakeCopyRequestsAndTransformToSurface(
|
| // the surface to the space of the surface itself.
|
| int destination_id = effect_node->transform_id;
|
| int source_id;
|
| - if (effect_node->parent_id != -1) {
|
| + if (effect_node->parent_id != EffectTree::kInvalidNodeId) {
|
| // For non-root surfaces, transform only by sub-layer scale.
|
| source_id = destination_id;
|
| } else {
|
| @@ -949,19 +949,16 @@ void EffectTree::ClearCopyRequests() {
|
| }
|
|
|
| int EffectTree::ClosestAncestorWithCopyRequest(int id) const {
|
| - DCHECK_GE(id, 0);
|
| + DCHECK_GE(id, EffectTree::kRootNodeId);
|
| const EffectNode* node = Node(id);
|
| - while (node->id > 1) {
|
| + while (node) {
|
| if (node->has_copy_request)
|
| return node->id;
|
|
|
| node = parent(node);
|
| }
|
|
|
| - if (node->has_copy_request)
|
| - return node->id;
|
| - else
|
| - return -1;
|
| + return EffectTree::kInvalidNodeId;
|
| }
|
|
|
| void EffectTree::AddMaskOrReplicaLayerId(int id) {
|
| @@ -978,7 +975,7 @@ bool EffectTree::ContributesToDrawnSurface(int id) {
|
| }
|
|
|
| void EffectTree::ResetChangeTracking() {
|
| - for (int id = 1; id < static_cast<int>(size()); ++id) {
|
| + for (int id = EffectTree::kRootNodeId; id < static_cast<int>(size()); ++id) {
|
| EffectNode* node = Node(id);
|
| node->effect_changed = false;
|
| }
|
| @@ -998,7 +995,7 @@ void TransformTree::UpdateNodeAndAncestorsHaveIntegerTranslations(
|
| void ClipTree::SetViewportClip(gfx::RectF viewport_rect) {
|
| if (size() < 2)
|
| return;
|
| - ClipNode* node = Node(1);
|
| + ClipNode* node = Node(ClipTree::kViewportNodeId);
|
| if (viewport_rect == node->clip)
|
| return;
|
| node->clip = viewport_rect;
|
| @@ -1008,7 +1005,7 @@ void ClipTree::SetViewportClip(gfx::RectF viewport_rect) {
|
| gfx::RectF ClipTree::ViewportClip() {
|
| const unsigned long min_size = 1;
|
| DCHECK_GT(size(), min_size);
|
| - return Node(1)->clip;
|
| + return Node(ClipTree::kViewportNodeId)->clip;
|
| }
|
|
|
| bool ClipTree::operator==(const ClipTree& other) const {
|
| @@ -1027,6 +1024,8 @@ void ClipTree::FromProtobuf(
|
| std::unordered_map<int, int>* node_id_to_index_map) {
|
| DCHECK(proto.has_property_type());
|
| DCHECK_EQ(proto.property_type(), proto::PropertyTree::Clip);
|
| + // Verify that the property tree is empty.
|
| + DCHECK_EQ(static_cast<int>(size()), ClipTree::kRootNodeId);
|
|
|
| PropertyTree::FromProtobuf(proto, node_id_to_index_map);
|
| }
|
| @@ -1060,6 +1059,8 @@ void EffectTree::FromProtobuf(
|
| std::unordered_map<int, int>* node_id_to_index_map) {
|
| DCHECK(proto.has_property_type());
|
| DCHECK_EQ(proto.property_type(), proto::PropertyTree::Effect);
|
| + // Verify that the property tree is empty.
|
| + DCHECK_EQ(static_cast<int>(size()), EffectTree::kRootNodeId);
|
|
|
| PropertyTree::FromProtobuf(proto, node_id_to_index_map);
|
| const proto::EffectTreeData& data = proto.effect_tree_data();
|
| @@ -1135,6 +1136,8 @@ void ScrollTree::FromProtobuf(
|
| std::unordered_map<int, int>* node_id_to_index_map) {
|
| DCHECK(proto.has_property_type());
|
| DCHECK_EQ(proto.property_type(), proto::PropertyTree::Scroll);
|
| + // Verify that the property tree is empty.
|
| + DCHECK_EQ(static_cast<int>(size()), ScrollTree::kRootNodeId);
|
|
|
| PropertyTree::FromProtobuf(proto, node_id_to_index_map);
|
| const proto::ScrollTreeData& data = proto.scroll_tree_data();
|
| @@ -1494,6 +1497,7 @@ PropertyTrees::PropertyTrees()
|
| effect_tree.SetPropertyTrees(this);
|
| clip_tree.SetPropertyTrees(this);
|
| scroll_tree.SetPropertyTrees(this);
|
| + transform_id_to_index_map[Layer::INVALID_ID] = TransformTree::kDeviceNodeId;
|
| }
|
|
|
| PropertyTrees::~PropertyTrees() {}
|
| @@ -1661,12 +1665,14 @@ bool PropertyTrees::IsInIdToIndexMap(TreeType tree_type, int id) {
|
| }
|
|
|
| void PropertyTrees::UpdateChangeTracking() {
|
| - for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) {
|
| + for (int id = EffectTree::kRootNodeId;
|
| + id < static_cast<int>(effect_tree.size()); ++id) {
|
| EffectNode* node = effect_tree.Node(id);
|
| EffectNode* parent_node = effect_tree.parent(node);
|
| effect_tree.UpdateEffectChanged(node, parent_node);
|
| }
|
| - for (int i = 1; i < static_cast<int>(transform_tree.size()); ++i) {
|
| + for (int i = TransformTree::kRootNodeId;
|
| + i < static_cast<int>(transform_tree.size()); ++i) {
|
| TransformNode* node = transform_tree.Node(i);
|
| TransformNode* parent_node = transform_tree.parent(node);
|
| TransformNode* source_node = transform_tree.Node(node->source_node_id);
|
| @@ -1675,14 +1681,16 @@ void PropertyTrees::UpdateChangeTracking() {
|
| }
|
|
|
| void PropertyTrees::PushChangeTrackingTo(PropertyTrees* tree) {
|
| - for (int id = 1; id < static_cast<int>(effect_tree.size()); ++id) {
|
| + for (int id = EffectTree::kRootNodeId;
|
| + id < static_cast<int>(effect_tree.size()); ++id) {
|
| EffectNode* node = effect_tree.Node(id);
|
| if (node->effect_changed) {
|
| EffectNode* target_node = tree->effect_tree.Node(node->id);
|
| target_node->effect_changed = true;
|
| }
|
| }
|
| - for (int id = 1; id < static_cast<int>(transform_tree.size()); ++id) {
|
| + for (int id = TransformTree::kRootNodeId;
|
| + id < static_cast<int>(transform_tree.size()); ++id) {
|
| TransformNode* node = transform_tree.Node(id);
|
| if (node->transform_changed) {
|
| TransformNode* target_node = tree->transform_tree.Node(node->id);
|
|
|