Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index 23299211fa6138631559290c0dca4dcab1629d39..379cda3e16f543daed05925b0277715140fd0604 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -4,8 +4,8 @@ |
#include "cc/trees/property_tree_builder.h" |
-#include <set> |
#include <map> |
+#include <set> |
#include "cc/base/math_util.h" |
#include "cc/layers/layer.h" |
@@ -18,68 +18,33 @@ class LayerTreeHost; |
namespace { |
-// For convenience, we'll use a pointery data structure while we're building |
-// the property trees (since we won't necessarily be visiting the nodes in |
-// order and this will make for faster insertions). We'll flatten these pointery |
-// trees later. Eventually cc clients could produce flattened trees directly |
-// obviating this step. |
-template <typename T> |
-struct UnflattenedTreeNode { |
- scoped_ptr<T> data; |
- // There could be costs assoc'd with copying here if the trees get big, but we |
- // don't think that they will. |
- ScopedPtrVector<UnflattenedTreeNode<T>> descendants; |
+struct ClipAncestorData { |
+ int node_id; |
+ Layer* layer; |
}; |
-typedef UnflattenedTreeNode<OpacityTreeNode> UnflattenedOpacityNode; |
-typedef UnflattenedTreeNode<TransformTreeNode> UnflattenedTransformNode; |
-typedef UnflattenedTreeNode<ClipTreeNode> UnflattenedClipNode; |
- |
struct DataForRecursion { |
- UnflattenedOpacityNode* opacity_tree_parent; |
- UnflattenedTransformNode* transform_tree_parent; |
- UnflattenedTransformNode* transform_fixed_parent; |
- std::vector<UnflattenedClipNode*> clip_ancestors; |
+ TransformTree* transform_tree; |
+ ClipTree* clip_tree; |
+ OpacityTree* opacity_tree; |
+ int transform_tree_parent; |
+ int transform_fixed_parent; |
+ int opacity_tree_parent; |
+ std::vector<ClipAncestorData> clip_ancestors; |
gfx::Vector2dF offset_to_transform_parent; |
+ // TODO(vollick): is this used? |
gfx::Vector2dF offset_to_fixed_parent; |
const Layer* page_scale_layer; |
float page_scale_factor; |
float device_scale_factor; |
}; |
-template <typename T> |
-void SetIndexForLayer(Layer* layer, int index) { |
- CHECK(false); // We should not be getting here |
-} |
- |
-template <> |
-void SetIndexForLayer<OpacityTreeNode>(Layer* layer, int index) { |
- layer->set_opacity_tree_index(index); |
-} |
-template <> |
-void SetIndexForLayer<ClipTreeNode>(Layer* layer, int index) { |
- layer->set_clip_tree_index(index); |
-} |
- |
-template <> |
-void SetIndexForLayer<TransformTreeNode>(Layer* layer, int index) { |
- layer->set_transform_tree_index(index); |
-} |
- |
-template <typename T> |
-void AssignLayerIndex(Layer* layer, int current_index, T* tree) { |
- CHECK(false); // We should not be getting here |
-} |
- |
-template <> |
-void AssignLayerIndex<OpacityTree>(Layer* layer, |
- int current_index, |
- OpacityTree* opacity_tree) { |
- if (opacity_tree->Node(current_index)->layer == layer) { |
- SetIndexForLayer<OpacityTreeNode>(layer, current_index); |
- return; |
- } |
- layer->set_opacity_tree_index(current_index); |
+// Sad trombone. |
+static void UnassignLayersToTree(Layer* layer) { |
+ layer->set_clip_tree_index(-1); |
+ layer->set_transform_tree_index(-1); |
+ for (size_t i = 0; i < layer->children().size(); ++i) |
+ UnassignLayersToTree(layer->children()[i].get()); |
} |
// Computes the 2d translation from descendant space to ancestor space, assuming |
@@ -93,133 +58,39 @@ gfx::Vector2dF ComputeTranslation(const Layer* ancestor, |
gfx::Vector2dF accumulated_translation; |
for (const Layer* current_layer = descendant; current_layer != ancestor; |
current_layer = current_layer->parent()) { |
- //TODO(awoloszyn) This fires from time to time. Figure out why this |
- // happening, and whether or not this should be a valid DCHECK |
- /*DCHECK_EQ(gfx::Vector2dF().ToString(), |
- current_layer->TotalScrollOffset().ToString());*/ |
- accumulated_translation -= gfx::Vector2dF(current_layer->TotalScrollOffset().x(), current_layer->TotalScrollOffset().y()); |
+ // TODO(awoloszyn) This fires from time to time. Figure out why this |
+ // happening, and whether or not this should be a valid DCHECK |
+ // DCHECK_EQ(gfx::Vector2dF().ToString(), |
+ // current_layer->TotalScrollOffset().ToString()); |
+ accumulated_translation -= |
+ gfx::Vector2dF(current_layer->TotalScrollOffset().x(), |
+ current_layer->TotalScrollOffset().y()); |
accumulated_translation += (current_layer->position() - gfx::PointF()) + |
current_layer->transform().To2dTranslation(); |
} |
return accumulated_translation; |
} |
-template <> |
-void AssignLayerIndex<TransformTree>(Layer* layer, |
- int current_index, |
- TransformTree* transform_tree) { |
- if (transform_tree->Node(current_index)->layer == layer) { |
- SetIndexForLayer<TransformTreeNode>(layer, current_index); |
- return; |
- } |
- // TODO(ajuma): Compute offset_to_parent for the scroll_parent and clip_parent |
- // cases during the earlier tree walk rather than here. |
- if (layer->position_constraint().is_fixed_position()) { |
- layer->set_transform_tree_index( |
- layer->fixed_position_container()->transform_tree_index()); |
- } else if (layer->scroll_parent()) { |
- layer->set_transform_tree_index( |
- layer->scroll_parent()->transform_tree_index()); |
- } else { |
- layer->set_transform_tree_index(layer->parent()->transform_tree_index()); |
- if (layer->clip_parent()) { |
- layer->set_offset_to_transform_parent(ComputeTranslation( |
- transform_tree->Node(layer->transform_tree_index())->layer, layer)); |
- } |
- } |
- DCHECK_LT(-1, layer->transform_tree_index()); |
-} |
- |
-template <> |
-void AssignLayerIndex<ClipTree>(Layer* layer, |
- int current_index, |
- ClipTree* clip_tree) { |
- if (clip_tree->Node(current_index)->layer == layer) { |
- SetIndexForLayer<ClipTreeNode>(layer, current_index); |
- return; |
- } |
- if (layer->scroll_parent()) { |
- layer->set_clip_tree_index(layer->scroll_parent()->clip_tree_index()); |
- } else if (layer->clip_parent()) { |
- layer->set_clip_tree_index(layer->clip_parent()->clip_tree_index()); |
- } else { |
- layer->set_clip_tree_index(layer->parent()->clip_tree_index()); |
- } |
- DCHECK_LT(-1, layer->clip_tree_index()); |
-} |
- |
-struct FlatteningData { |
- Layer* layer; |
- UnflattenedOpacityNode* opacity_node; |
- UnflattenedTransformNode* transform_node; |
- UnflattenedClipNode* clip_node; |
-}; |
- |
-//TODO(awoloszyn) This is currently WIP for fixing the fixed element |
-// with clip parent. May not stay. |
+// TODO(awoloszyn): This is currently WIP for fixing the fixed element with clip |
+// parent. May not stay. |
struct SupplementalData { |
Layer* layer; |
gfx::Vector2dF offset_from_fixed_parent; |
}; |
-void AssignLayersToTree(ClipTree* clip_tree, |
- TransformTree* transform_tree, |
- OpacityTree* opacity_tree, |
- std::vector<FlatteningData>* flattening_data) { |
- for(FlatteningData& data: *flattening_data) { |
- AssignLayerIndex(data.layer, data.clip_node->data->id, clip_tree); |
- AssignLayerIndex(data.layer, data.transform_node->data->id, transform_tree); |
- AssignLayerIndex(data.layer, data.opacity_node->data->id, opacity_tree); |
- } |
-} |
- |
-template <typename T> |
-void FlattenTreeInternal(UnflattenedTreeNode<T>* unflattened_tree, |
- PropertyTree<T>* flattened_tree, |
- int parent_id) { |
- int currentIndex = |
- flattened_tree->InsertWithParent(*unflattened_tree->data, parent_id); |
- unflattened_tree->data->id = currentIndex; |
- |
- for (size_t i = 0; i < unflattened_tree->descendants.size(); ++i) { |
- FlattenTreeInternal( |
- unflattened_tree->descendants[i], flattened_tree, currentIndex); |
- } |
-} |
- |
-template <typename T> |
-void FlattenTree(UnflattenedTreeNode<T>* unflattened_tree, |
- PropertyTree<T>* flattened_tree) { |
- int root_idx = flattened_tree->InsertRootNode(*unflattened_tree->data); |
- unflattened_tree->data->id = root_idx; |
- for (size_t i = 0; i < unflattened_tree->descendants.size(); ++i) { |
- FlattenTreeInternal( |
- unflattened_tree->descendants[i], flattened_tree, root_idx); |
- } |
-} |
- |
-UnflattenedTransformNode* GetTransformParent( |
+static TransformNode* GetTransformParent( |
const DataForRecursion& data_for_recursion, |
Layer* layer) { |
if (layer->position_constraint().is_fixed_position()) |
- return data_for_recursion.transform_fixed_parent; |
- return data_for_recursion.transform_tree_parent; |
+ return data_for_recursion.transform_tree->Node( |
+ data_for_recursion.transform_fixed_parent); |
+ return data_for_recursion.transform_tree->Node( |
+ data_for_recursion.transform_tree_parent); |
} |
-bool RequiresClipNode(Layer* layer) { |
- if (!layer->parent()) { |
- return true; |
- } |
- if(layer->masks_to_bounds()) { |
- return true; |
- } |
- if (layer->mask_layer()) { |
- return true; |
- } |
- if (layer->render_surface()) { |
- return true; |
- } |
- return false; |
+static bool RequiresClipNode(Layer* layer) { |
+ return !layer->parent() || layer->masks_to_bounds() || layer->mask_layer() || |
+ layer->render_surface(); |
} |
bool Clips(Layer* layer) { |
@@ -244,19 +115,25 @@ Layer* ClipNodeAncestor(Layer* layer) { |
return ClipNodeAncestor(clip_ancestor); |
} |
-UnflattenedClipNode* GetClipParent(const DataForRecursion& data_for_recursion, |
- Layer* layer) { |
- if (!layer->clip_parent()) |
- return data_for_recursion.clip_ancestors.back(); |
+static ClipNode* GetClipParent(const DataForRecursion& data_for_recursion, |
+ Layer* layer) { |
+ if (!layer->parent() || !layer->clip_parent()) { |
+ fprintf(stderr, "aoeu id --> %d\n", |
+ data_for_recursion.clip_ancestors.back().node_id); |
+ return data_for_recursion.clip_tree->Node( |
+ data_for_recursion.clip_ancestors.back().node_id); |
+ } |
+ |
Layer* clip_node_ancestor = ClipNodeAncestor(layer->clip_parent()); |
- std::vector<UnflattenedClipNode*>::const_reverse_iterator iter = |
+ fprintf(stderr, "looking for clip parent %p\n", clip_node_ancestor); |
+ std::vector<ClipAncestorData>::const_reverse_iterator iter = |
data_for_recursion.clip_ancestors.rbegin(); |
for (; iter != data_for_recursion.clip_ancestors.rend(); ++iter) { |
- if ((*iter)->data->layer == clip_node_ancestor) |
+ if (iter->layer == clip_node_ancestor) |
break; |
} |
DCHECK(iter != data_for_recursion.clip_ancestors.rend()); |
- return *iter; |
+ return data_for_recursion.clip_tree->Node(iter->node_id); |
} |
void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
@@ -265,34 +142,39 @@ void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
if (layer->parent() && layer->opacity() == 1.0) |
return; |
- UnflattenedOpacityNode* node = data_from_ancestor.opacity_tree_parent; |
if (layer->parent()) { |
- data_from_ancestor.opacity_tree_parent->descendants.push_back( |
- scoped_ptr<UnflattenedOpacityNode>(new UnflattenedOpacityNode())); |
- node = data_from_ancestor.opacity_tree_parent->descendants.back(); |
- data_for_children->opacity_tree_parent = node; |
+ data_for_children->opacity_tree_parent = |
+ data_from_ancestor.opacity_tree->InsertWithParent( |
+ OpacityNode(layer, layer->opacity()), |
+ data_from_ancestor.opacity_tree_parent); |
} |
- |
- node->data.reset(new OpacityTreeNode(layer, layer->opacity())); |
} |
void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
Layer* layer, |
DataForRecursion* data_for_children) { |
- if (!RequiresClipNode(layer)) |
+ ClipNode* parent = GetClipParent(data_from_ancestor, layer); |
+ if (!RequiresClipNode(layer)) { |
+ layer->set_clip_tree_index(parent->id); |
+// if (layer->scroll_parent()) { |
+// layer->set_clip_tree_index(layer->scroll_parent()->clip_tree_index()); |
+// } else if (layer->clip_parent()) { |
+// layer->set_clip_tree_index(layer->clip_parent()->clip_tree_index()); |
+// } else { |
+// layer->set_clip_tree_index(layer->parent()->clip_tree_index()); |
+// } |
return; |
+ } |
- UnflattenedClipNode* node = data_from_ancestor.clip_ancestors.back(); |
+ // TODO(vollick): we should add the node for the parent here.. |
if (layer->parent()) { |
- UnflattenedClipNode* parent = GetClipParent(data_from_ancestor, layer); |
- parent->descendants.push_back( |
- scoped_ptr<UnflattenedClipNode>(new UnflattenedClipNode())); |
- node = parent->descendants.back(); |
- data_for_children->clip_ancestors.push_back(node); |
+ ClipAncestorData clip_ancestor_data; |
+ clip_ancestor_data.node_id = data_for_children->clip_tree->InsertWithParent( |
+ ClipNode(layer, gfx::RectF(layer->bounds()), Clips(layer)), parent->id); |
+ clip_ancestor_data.layer = layer; |
+ data_for_children->clip_ancestors.push_back(clip_ancestor_data); |
} |
- node->data.reset(new ClipTreeNode(layer, gfx::RectF(layer->bounds()), |
- Clips(layer))); |
// TODO(awoloszyn): Right now when we hit a node with a replica, we |
// reset the clip for all children since we may need to draw. We |
// need to figure out a better way, since we will need both the |
@@ -321,24 +203,28 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
has_animated_transform || is_page_scale_application_layer; |
if (!requires_transform_node) { |
-// DCHECK_EQ(gfx::Vector2dF().ToString(), |
- // layer->TotalScrollOffset().ToString()); |
- // TODO(vollick): it's a little silly we have to jump through these hoops to |
- // get a vector from a point. Surely there's a better way. |
+ // TODO(vollick): This can be drastrically simplified if we don't have an |
+ // unflattened tree. We should be able to grab the transform parent |
+ // immediately and then compute an offset to it in a helper that can account |
+ // for scroll parents, fixed pos, etc. Leaving the logic here like this |
+ // temporarily while I convert away from unflattened trees. |
data_for_children->offset_to_transform_parent += |
- (layer->position() - gfx::PointF()) + |
+ layer->position().OffsetFromOrigin() + |
awoloszyn
2014/11/12 19:38:59
That is way nicer.
|
layer->transform().To2dTranslation(); |
if (layer->IsContainerForFixedPositionLayers()) { |
data_for_children->transform_fixed_parent = |
- GetTransformParent(data_from_ancestor, layer); |
+ GetTransformParent(data_from_ancestor, layer)->id; |
} |
data_for_children->offset_to_fixed_parent = |
data_from_ancestor.offset_to_fixed_parent; |
if(layer->scroll_parent()) { |
- gfx::Vector2dF offset_from_transform_parent_to_parent = ComputeTranslation( |
- layer->parent(), |
- data_from_ancestor.transform_tree_parent->data->layer); |
+ gfx::Vector2dF offset_from_transform_parent_to_parent = |
+ ComputeTranslation( |
+ layer->parent(), |
+ data_from_ancestor.transform_tree |
+ ->Node(data_from_ancestor.transform_tree_parent) |
+ ->layer); |
gfx::Vector2dF offset_to_parent = |
ComputeTranslation(layer->parent(), layer); |
layer->set_offset_to_transform_parent( |
@@ -348,45 +234,41 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
layer->set_offset_to_transform_parent( |
data_for_children->offset_to_transform_parent); |
} |
+ |
+ TransformNode* transform_parent = |
+ GetTransformParent(data_from_ancestor, layer); |
awoloszyn
2014/11/12 19:38:59
GetTransformParent does not take into account scro
|
+ |
+ layer->set_transform_tree_index(transform_parent->id); |
+ |
+ // TODO(vollick): see note above. |
+ if (!is_fixed && !layer->scroll_parent() && layer->clip_parent()) { |
+ if (layer->clip_parent()) { |
awoloszyn
2014/11/12 19:38:59
This line is redundant.
|
+ layer->set_offset_to_transform_parent( |
+ ComputeTranslation(data_from_ancestor.transform_tree |
+ ->Node(layer->transform_tree_index()) |
+ ->layer, |
+ layer)); |
+ } |
+ } |
+ |
return; |
} |
if (is_fixed) { |
layer->set_fixed_position_container( |
- GetTransformParent(data_from_ancestor, layer)->data->layer); |
+ GetTransformParent(data_from_ancestor, layer)->layer); |
} else { |
layer->set_fixed_position_container(NULL); |
} |
- UnflattenedTransformNode* node = data_from_ancestor.transform_tree_parent; |
- if (layer->parent()) { |
- UnflattenedTransformNode* parent = |
- GetTransformParent(data_from_ancestor, layer); |
- parent->descendants.push_back( |
- scoped_ptr<UnflattenedTransformNode>(new UnflattenedTransformNode())); |
- node = parent->descendants.back(); |
- } |
- |
- if (layer->IsContainerForFixedPositionLayers()) { |
- data_for_children->transform_fixed_parent = node; |
- data_for_children->offset_to_fixed_parent = gfx::Vector2dF(); |
- } else { |
- data_for_children->offset_to_fixed_parent += |
- data_for_children->offset_to_transform_parent; |
- } |
- |
- data_for_children->transform_tree_parent = node; |
- data_for_children->offset_to_transform_parent = gfx::Vector2dF(); |
- layer->set_offset_to_transform_parent( |
- data_for_children->offset_to_transform_parent); |
- |
gfx::Vector2dF offset_to_transform_parent = |
data_from_ancestor.offset_to_transform_parent; |
if(layer->scroll_parent()) { |
gfx::Vector2dF offset_from_transform_parent_to_parent = ComputeTranslation( |
- layer->parent(), |
- data_from_ancestor.transform_tree_parent->data->layer); |
+ layer->parent(), data_from_ancestor.transform_tree |
+ ->Node(data_from_ancestor.transform_tree_parent) |
+ ->layer); |
gfx::Vector2dF offset_to_parent = |
ComputeTranslation(layer->parent(), layer); |
layer->set_offset_to_transform_parent( |
@@ -415,12 +297,9 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
// record, the slight difference should be inconsequential). |
gfx::Vector2dF position = layer->position() - gfx::PointF(); |
if (!layer->scroll_parent()) { |
- position -= gfx::Vector2dF(layer->TotalScrollOffset().x(), |
- layer->TotalScrollOffset().y()); |
+ position -= gfx::Vector2dF(layer->TotalScrollOffset().x(), |
+ layer->TotalScrollOffset().y()); |
} |
-// - |
-// / gfx::PointF(layer->TotalScrollOffset().x(), |
-// layer->TotalScrollOffset().y()); |
if (is_fixed) { |
auto supplemental = supplemental_data->find(layer); |
if (supplemental != supplemental_data->end()) { |
@@ -430,7 +309,6 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
} |
} else { |
position += offset_to_transform_parent; |
- |
} |
transform.Translate3d(position.x() + layer->transform_origin().x(), |
position.y() + layer->transform_origin().y(), |
@@ -440,24 +318,44 @@ void AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
-layer->transform_origin().y(), |
-layer->transform_origin().z()); |
- node->data.reset(new TransformTreeNode(layer, transform)); |
+ if (is_root) { |
+ data_from_ancestor.transform_tree->root()->value = transform; |
+ } else { |
+ data_for_children->transform_tree_parent = |
+ data_from_ancestor.transform_tree->InsertWithParent( |
+ TransformNode(layer, transform), |
+ GetTransformParent(data_from_ancestor, layer)->id); |
+ } |
+ |
+ if (layer->IsContainerForFixedPositionLayers() || is_root) { |
+ data_for_children->transform_fixed_parent = |
+ data_for_children->transform_tree_parent; |
+ data_for_children->offset_to_fixed_parent = gfx::Vector2dF(); |
+ } else { |
+ data_for_children->offset_to_fixed_parent += |
+ data_for_children->offset_to_transform_parent; |
+ } |
+ |
+ data_for_children->offset_to_transform_parent = gfx::Vector2dF(); |
+ layer->set_offset_to_transform_parent(gfx::Vector2dF()); |
+ layer->set_transform_tree_index(data_for_children->transform_tree_parent); |
} |
void BuildPropertyTreesInternal(Layer* layer, |
const DataForRecursion& data_from_parent, |
- std::vector<FlatteningData>* flattening_data, |
std::map<Layer*, SupplementalData>* supplemental_data) { |
DataForRecursion data_for_children(data_from_parent); |
AddOpacityNodeIfNeeded(data_from_parent, layer, &data_for_children); |
- AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); |
AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children, supplemental_data); |
+ layer->set_transform_tree_index(data_for_children.transform_tree_parent); |
+ |
+ AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); |
+ layer->set_clip_tree_index(data_for_children.clip_ancestors.back().node_id); |
- flattening_data->push_back((FlatteningData){layer, data_for_children.opacity_tree_parent, |
- data_for_children.transform_tree_parent, |
- data_for_children.clip_ancestors.back()}); |
for (size_t i = 0; i < layer->children().size(); ++i) { |
+ // TODO(vollick): this should read: if (!scroll child) { recur; } |
if ((layer->children()[i]->scroll_parent() && |
layer->children()[i]->scroll_parent() != layer) || |
(!layer->children()[i]->scroll_parent() && |
@@ -470,37 +368,23 @@ void BuildPropertyTreesInternal(Layer* layer, |
DCHECK(a.second); |
continue; |
} |
- BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children, flattening_data, supplemental_data); |
+ BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children, supplemental_data); |
} |
if (std::set<Layer*>* scroll_children = layer->scroll_children()) { |
std::set<Layer*>::const_iterator iter = scroll_children->begin(); |
for (; iter != scroll_children->end(); ++iter) |
- BuildPropertyTreesInternal(*iter, data_for_children, flattening_data, supplemental_data); |
+ BuildPropertyTreesInternal(*iter, data_for_children, supplemental_data); |
} |
+ // TODO(vollick): we should be able to visit clip children during the "normal" |
+ // recursion. |
if (std::set<Layer*>* clip_children = layer->clip_children()) { |
std::set<Layer*>::const_iterator iter = clip_children->begin(); |
for (; iter != clip_children->end(); ++iter) |
- BuildPropertyTreesInternal(*iter, data_for_children, flattening_data, supplemental_data); |
+ BuildPropertyTreesInternal(*iter, data_for_children, supplemental_data); |
} |
} |
-template void FlattenTreeInternal(UnflattenedClipNode* unflattened_tree, |
- ClipTree* flattened_tree, |
- int parent_id); |
-template void FlattenTreeInternal(UnflattenedOpacityNode* unflattened_tree, |
- OpacityTree* flattened_tree, |
- int parent_id); |
-template void FlattenTreeInternal(UnflattenedTransformNode* unflattened_tree, |
- TransformTree* flattened_tree, |
- int parent_id); |
- |
-template void FlattenTree(UnflattenedClipNode* unflattened_tree, |
- ClipTree* flattened_tree); |
-template void FlattenTree(UnflattenedOpacityNode* unflattened_tree, |
- OpacityTree* flattened_tree); |
-template void FlattenTree(UnflattenedTransformNode* unflattened_tree, |
- TransformTree* flattened_tree); |
} // namespace |
void PropertyTreeBuilder::BuildPropertyTrees( |
@@ -513,32 +397,28 @@ void PropertyTreeBuilder::BuildPropertyTrees( |
OpacityTree* opacity_tree, |
TransformTree* transform_tree, |
ClipTree* clip_tree) { |
- std::vector<FlatteningData> flattening_data; |
std::map<Layer*, SupplementalData> supplemental_data; |
- UnflattenedOpacityNode unflattened_opacity_tree; |
- UnflattenedTransformNode unflattened_transform_tree; |
- UnflattenedClipNode unflattened_clip_tree; |
DataForRecursion data_for_recursion; |
- data_for_recursion.opacity_tree_parent = &unflattened_opacity_tree; |
- data_for_recursion.transform_tree_parent = &unflattened_transform_tree; |
- data_for_recursion.transform_fixed_parent = &unflattened_transform_tree; |
- data_for_recursion.clip_ancestors.push_back(&unflattened_clip_tree); |
+ data_for_recursion.transform_tree = transform_tree; |
+ data_for_recursion.clip_tree = clip_tree; |
+ data_for_recursion.opacity_tree = opacity_tree; |
+ data_for_recursion.transform_tree_parent = 0; |
+ data_for_recursion.transform_fixed_parent = 0; |
data_for_recursion.page_scale_layer = page_scale_layer; |
data_for_recursion.page_scale_factor = page_scale_factor; |
data_for_recursion.device_scale_factor = device_scale_factor; |
- BuildPropertyTreesInternal(root_layer, data_for_recursion, &flattening_data, &supplemental_data); |
+ ClipAncestorData root_clip_data = { 0, root_layer }; |
+ data_for_recursion.clip_ancestors.push_back(root_clip_data); |
+ |
+ BuildPropertyTreesInternal(root_layer, data_for_recursion, &supplemental_data); |
- FlattenTree(&unflattened_opacity_tree, opacity_tree); |
- FlattenTree(&unflattened_clip_tree, clip_tree); |
- FlattenTree(&unflattened_transform_tree, transform_tree); |
- AssignLayersToTree(clip_tree, transform_tree, opacity_tree, &flattening_data); |
if (viewport.IsEmpty()) |
clip_tree->root()->clips = false; |
- |
+ |
gfx::RectF transformed_viewport; |
gfx::Transform combined_transform = transform_tree->root()->value; |
combined_transform.ConcatTransform(device_transform); |