[go: nahoru, domu]

blob: c381f58a3cf95391dee0d8b0cfc39311f2cfa980 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cc/test/property_tree_test_utils.h"
#include "cc/layers/layer.h"
#include "cc/layers/layer_impl.h"
#include "cc/trees/clip_node.h"
#include "cc/trees/effect_node.h"
#include "cc/trees/layer_tree_host.h"
#include "cc/trees/layer_tree_host_common.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/property_tree.h"
#include "cc/trees/scroll_node.h"
#include "cc/trees/transform_node.h"
namespace cc {
namespace {
template <typename LayerType>
void SetupRootPropertiesInternal(LayerType* root) {
root->set_property_tree_sequence_number(
GetPropertyTrees(root)->sequence_number);
auto& root_transform_node =
CreateTransformNode(root, TransformTree::kRootNodeId);
DCHECK_EQ(root_transform_node.id, TransformTree::kContentsRootNodeId);
auto& root_clip_node = CreateClipNode(root, ClipTree::kRootNodeId);
DCHECK_EQ(root_clip_node.id, ClipTree::kViewportNodeId);
root_clip_node.clip = gfx::RectF(gfx::SizeF(800, 600));
auto& root_effect_node = CreateEffectNode(root, EffectTree::kRootNodeId);
DCHECK_EQ(root_effect_node.id, EffectTree::kContentsRootNodeId);
root_effect_node.render_surface_reason = RenderSurfaceReason::kRoot;
auto& root_scroll_node = CreateScrollNode(root, ScrollTree::kRootNodeId);
DCHECK_EQ(root_scroll_node.id, ScrollTree::kSecondaryRootNodeId);
}
template <typename LayerType>
void CopyPropertiesInternal(const LayerType* from, LayerType* to) {
to->SetTransformTreeIndex(from->transform_tree_index());
to->SetClipTreeIndex(from->clip_tree_index());
to->SetEffectTreeIndex(from->effect_tree_index());
to->SetScrollTreeIndex(from->scroll_tree_index());
}
int ParentId(int parent_id, int default_id) {
return parent_id == TransformTree::kInvalidNodeId ? default_id : parent_id;
}
template <typename LayerType>
TransformNode& CreateTransformNodeInternal(LayerType* layer, int parent_id) {
auto* property_trees = GetPropertyTrees(layer);
auto& transform_tree = property_trees->transform_tree;
int id = transform_tree.Insert(
TransformNode(), ParentId(parent_id, layer->transform_tree_index()));
layer->SetTransformTreeIndex(id);
auto* node = transform_tree.Node(id);
node->source_node_id = node->parent_id;
node->element_id = layer->element_id();
if (node->element_id) {
property_trees->element_id_to_transform_node_index[node->element_id] =
node->id;
}
transform_tree.set_needs_update(true);
return *node;
}
template <typename LayerType>
ClipNode& CreateClipNodeInternal(LayerType* layer, int parent_id) {
auto& clip_tree = GetPropertyTrees(layer)->clip_tree;
int id = clip_tree.Insert(ClipNode(),
ParentId(parent_id, layer->clip_tree_index()));
layer->SetClipTreeIndex(id);
auto* node = clip_tree.Node(id);
node->clip_type = ClipNode::ClipType::APPLIES_LOCAL_CLIP;
node->transform_id = layer->transform_tree_index();
clip_tree.set_needs_update(true);
return *node;
}
template <typename LayerType>
EffectNode& CreateEffectNodeInternal(LayerType* layer, int parent_id) {
auto* property_trees = GetPropertyTrees(layer);
auto& effect_tree = property_trees->effect_tree;
int id = effect_tree.Insert(EffectNode(),
ParentId(parent_id, layer->effect_tree_index()));
layer->SetEffectTreeIndex(id);
auto* node = effect_tree.Node(id);
node->stable_id = layer->id();
node->transform_id = layer->transform_tree_index();
node->clip_id = layer->clip_tree_index();
if (layer->element_id()) {
property_trees->element_id_to_effect_node_index[layer->element_id()] =
node->id;
}
effect_tree.set_needs_update(true);
return *node;
}
template <typename LayerType>
ScrollNode& CreateScrollNodeInternal(LayerType* layer, int parent_id) {
auto* property_trees = GetPropertyTrees(layer);
auto& scroll_tree = property_trees->scroll_tree;
int id = scroll_tree.Insert(ScrollNode(),
ParentId(parent_id, layer->scroll_tree_index()));
layer->SetScrollTreeIndex(id);
auto* node = scroll_tree.Node(id);
node->element_id = layer->element_id();
if (node->element_id) {
property_trees->element_id_to_scroll_node_index[node->element_id] =
node->id;
}
node->transform_id = layer->transform_tree_index();
node->container_bounds = layer->bounds();
scroll_tree.set_needs_update(true);
return *node;
}
} // anonymous namespace
void SetupRootProperties(Layer* root) {
SetupRootPropertiesInternal(root);
}
void SetupRootProperties(LayerImpl* root) {
SetupRootPropertiesInternal(root);
}
void CopyProperties(const Layer* from, Layer* to) {
DCHECK(from->layer_tree_host()->IsUsingLayerLists());
to->SetLayerTreeHost(from->layer_tree_host());
to->set_property_tree_sequence_number(from->property_tree_sequence_number());
CopyPropertiesInternal(from, to);
}
void CopyProperties(const LayerImpl* from, LayerImpl* to) {
CopyPropertiesInternal(from, to);
}
TransformNode& CreateTransformNode(Layer* layer, int parent_id) {
DCHECK(layer->layer_tree_host()->IsUsingLayerLists());
return CreateTransformNodeInternal(layer, parent_id);
}
TransformNode& CreateTransformNode(LayerImpl* layer, int parent_id) {
return CreateTransformNodeInternal(layer, parent_id);
}
ClipNode& CreateClipNode(Layer* layer, int parent_id) {
DCHECK(layer->layer_tree_host()->IsUsingLayerLists());
return CreateClipNodeInternal(layer, parent_id);
}
ClipNode& CreateClipNode(LayerImpl* layer, int parent_id) {
return CreateClipNodeInternal(layer, parent_id);
}
EffectNode& CreateEffectNode(Layer* layer, int parent_id) {
DCHECK(layer->layer_tree_host()->IsUsingLayerLists());
return CreateEffectNodeInternal(layer, parent_id);
}
EffectNode& CreateEffectNode(LayerImpl* layer, int parent_id) {
return CreateEffectNodeInternal(layer, parent_id);
}
ScrollNode& CreateScrollNode(Layer* layer, int parent_id) {
DCHECK(layer->layer_tree_host()->IsUsingLayerLists());
return CreateScrollNodeInternal(layer, parent_id);
}
ScrollNode& CreateScrollNode(LayerImpl* layer, int parent_id) {
return CreateScrollNodeInternal(layer, parent_id);
}
} // namespace cc