Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index 57645383c088f7e83da9afb3019e34603e6cce56..62f6313bd5215924532af025d358f42b8773bd28 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -9,6 +9,7 @@ |
#include "cc/base/math_util.h" |
#include "cc/layers/layer.h" |
+#include "cc/layers/layer_impl.h" |
#include "cc/trees/layer_tree_host.h" |
#include "ui/gfx/geometry/point_f.h" |
#include "ui/gfx/geometry/vector2d_conversions.h" |
@@ -19,16 +20,17 @@ class LayerTreeHost; |
namespace { |
+template <typename LayerType> |
struct DataForRecursion { |
TransformTree* transform_tree; |
ClipTree* clip_tree; |
OpacityTree* opacity_tree; |
- Layer* transform_tree_parent; |
- Layer* transform_fixed_parent; |
- Layer* render_target; |
+ LayerType* transform_tree_parent; |
+ LayerType* transform_fixed_parent; |
+ LayerType* render_target; |
int clip_tree_parent; |
int opacity_tree_parent; |
- const Layer* page_scale_layer; |
+ const LayerType* page_scale_layer; |
float page_scale_factor; |
float device_scale_factor; |
bool in_subtree_of_page_scale_application_layer; |
@@ -38,20 +40,25 @@ struct DataForRecursion { |
gfx::Vector2dF scroll_compensation_adjustment; |
}; |
-static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { |
+template <typename LayerType> |
+static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, |
+ LayerType* layer) { |
return layer->position_constraint().is_fixed_position() |
? data.transform_fixed_parent |
: data.transform_tree_parent; |
} |
-static ClipNode* GetClipParent(const DataForRecursion& data, Layer* layer) { |
+template <typename LayerType> |
+static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, |
+ LayerType* layer) { |
const bool inherits_clip = !layer->parent() || !layer->clip_parent(); |
const int id = inherits_clip ? data.clip_tree_parent |
: layer->clip_parent()->clip_tree_index(); |
return data.clip_tree->Node(id); |
} |
-static bool HasPotentiallyRunningAnimation(Layer* layer, |
+template <typename LayerType> |
+static bool HasPotentiallyRunningAnimation(LayerType* layer, |
Animation::TargetProperty property) { |
if (Animation* animation = |
layer->layer_animation_controller()->GetAnimation(property)) { |
@@ -60,8 +67,9 @@ static bool HasPotentiallyRunningAnimation(Layer* layer, |
return false; |
} |
-static bool RequiresClipNode(Layer* layer, |
- const DataForRecursion& data, |
+template <typename LayerType> |
+static bool RequiresClipNode(LayerType* layer, |
+ const DataForRecursion<LayerType>& data, |
int parent_transform_id, |
bool is_clipped) { |
const bool render_surface_applies_clip = |
@@ -83,14 +91,16 @@ static bool RequiresClipNode(Layer* layer, |
return !axis_aligned_with_respect_to_parent; |
} |
-static bool LayerClipsSubtree(Layer* layer) { |
+template <typename LayerType> |
+static bool LayerClipsSubtree(LayerType* layer) { |
return layer->masks_to_bounds() || layer->mask_layer(); |
} |
-void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
- Layer* layer, |
+template <typename LayerType> |
+void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, |
+ LayerType* layer, |
bool created_transform_node, |
- DataForRecursion* data_for_children) { |
+ DataForRecursion<LayerType>* data_for_children) { |
ClipNode* parent = GetClipParent(data_from_ancestor, layer); |
int parent_id = parent->id; |
@@ -121,7 +131,7 @@ void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
data_for_children->clip_tree_parent = parent_id; |
} else if (layer->parent()) { |
// Note the root clip gets handled elsewhere. |
- Layer* transform_parent = data_for_children->transform_tree_parent; |
+ LayerType* transform_parent = data_for_children->transform_tree_parent; |
if (layer->position_constraint().is_fixed_position() && |
!created_transform_node) { |
transform_parent = data_for_children->transform_fixed_parent; |
@@ -146,9 +156,11 @@ void AddClipNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
// better way, since we will need both the clipped and unclipped versions. |
} |
-bool AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
- Layer* layer, |
- DataForRecursion* data_for_children) { |
+template <typename LayerType> |
+bool AddTransformNodeIfNeeded( |
+ const DataForRecursion<LayerType>& data_from_ancestor, |
+ LayerType* layer, |
+ DataForRecursion<LayerType>* data_for_children) { |
const bool is_root = !layer->parent(); |
const bool is_page_scale_application_layer = |
layer->parent() && layer->parent() == data_from_ancestor.page_scale_layer; |
@@ -171,13 +183,13 @@ bool AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
has_potentially_animated_transform || has_surface || |
is_page_scale_application_layer; |
- Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); |
+ LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); |
gfx::Vector2dF parent_offset; |
if (transform_parent) { |
if (layer->scroll_parent()) { |
gfx::Transform to_parent; |
- Layer* source = layer->parent(); |
+ LayerType* source = layer->parent(); |
parent_offset += source->offset_to_transform_parent(); |
data_from_ancestor.transform_tree->ComputeTransform( |
source->transform_tree_index(), |
@@ -295,14 +307,23 @@ bool AddTransformNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
return true; |
} |
-void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
- Layer* layer, |
- DataForRecursion* data_for_children) { |
+bool IsAnimatingOpacity(Layer* layer) { |
+ return HasPotentiallyRunningAnimation(layer, Animation::OPACITY) || |
+ layer->OpacityCanAnimateOnImplThread(); |
+} |
+ |
+bool IsAnimatingOpacity(LayerImpl* layer) { |
+ return HasPotentiallyRunningAnimation(layer, Animation::OPACITY); |
+} |
+ |
+template <typename LayerType> |
+void AddOpacityNodeIfNeeded( |
+ const DataForRecursion<LayerType>& data_from_ancestor, |
+ LayerType* layer, |
+ DataForRecursion<LayerType>* data_for_children) { |
const bool is_root = !layer->parent(); |
const bool has_transparency = layer->opacity() != 1.f; |
- const bool has_animated_opacity = |
- HasPotentiallyRunningAnimation(layer, Animation::OPACITY) || |
- layer->OpacityCanAnimateOnImplThread(); |
+ const bool has_animated_opacity = IsAnimatingOpacity(layer); |
bool requires_node = is_root || has_transparency || has_animated_opacity; |
int parent_id = data_from_ancestor.opacity_tree_parent; |
@@ -321,9 +342,11 @@ void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor, |
layer->set_opacity_tree_index(data_for_children->opacity_tree_parent); |
} |
-void BuildPropertyTreesInternal(Layer* layer, |
- const DataForRecursion& data_from_parent) { |
- DataForRecursion data_for_children(data_from_parent); |
+template <typename LayerType> |
+void BuildPropertyTreesInternal( |
+ LayerType* layer, |
+ const DataForRecursion<LayerType>& data_from_parent) { |
+ DataForRecursion<LayerType> data_for_children(data_from_parent); |
if (layer->render_surface()) |
data_for_children.render_target = layer; |
@@ -339,12 +362,12 @@ void BuildPropertyTreesInternal(Layer* layer, |
data_for_children.in_subtree_of_page_scale_application_layer = true; |
for (size_t i = 0; i < layer->children().size(); ++i) { |
- if (!layer->children()[i]->scroll_parent()) |
- BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); |
+ if (!layer->child_at(i)->scroll_parent()) |
+ BuildPropertyTreesInternal(layer->child_at(i), data_for_children); |
} |
if (layer->scroll_children()) { |
- for (Layer* scroll_child : *layer->scroll_children()) { |
+ for (LayerType* scroll_child : *layer->scroll_children()) { |
BuildPropertyTreesInternal(scroll_child, data_for_children); |
} |
} |
@@ -355,18 +378,15 @@ void BuildPropertyTreesInternal(Layer* layer, |
} // namespace |
-void PropertyTreeBuilder::BuildPropertyTrees( |
- Layer* root_layer, |
- const Layer* page_scale_layer, |
- float page_scale_factor, |
- float device_scale_factor, |
- const gfx::Rect& viewport, |
- const gfx::Transform& device_transform, |
- PropertyTrees* property_trees) { |
- if (!property_trees->needs_rebuild) |
- return; |
- |
- DataForRecursion data_for_recursion; |
+template <typename LayerType> |
+void BuildPropertyTreesTopLevelInternal(LayerType* root_layer, |
+ const LayerType* page_scale_layer, |
+ float page_scale_factor, |
+ float device_scale_factor, |
+ const gfx::Rect& viewport, |
+ const gfx::Transform& device_transform, |
+ PropertyTrees* property_trees) { |
+ DataForRecursion<LayerType> data_for_recursion; |
data_for_recursion.transform_tree = &property_trees->transform_tree; |
data_for_recursion.clip_tree = &property_trees->clip_tree; |
data_for_recursion.opacity_tree = &property_trees->opacity_tree; |
@@ -396,4 +416,34 @@ void PropertyTreeBuilder::BuildPropertyTrees( |
property_trees->needs_rebuild = false; |
} |
+void PropertyTreeBuilder::BuildPropertyTrees( |
+ Layer* root_layer, |
+ const Layer* page_scale_layer, |
+ float page_scale_factor, |
+ float device_scale_factor, |
+ const gfx::Rect& viewport, |
+ const gfx::Transform& device_transform, |
+ PropertyTrees* property_trees) { |
+ // TODO(enne): hoist this out of here |
+ if (!property_trees->needs_rebuild) |
+ return; |
+ |
+ BuildPropertyTreesTopLevelInternal( |
+ root_layer, page_scale_layer, page_scale_factor, device_scale_factor, |
+ viewport, device_transform, property_trees); |
+} |
+ |
+void PropertyTreeBuilder::BuildPropertyTrees( |
+ LayerImpl* root_layer, |
+ const LayerImpl* page_scale_layer, |
+ float page_scale_factor, |
+ float device_scale_factor, |
+ const gfx::Rect& viewport, |
+ const gfx::Transform& device_transform, |
+ PropertyTrees* property_trees) { |
+ BuildPropertyTreesTopLevelInternal( |
+ root_layer, page_scale_layer, page_scale_factor, device_scale_factor, |
+ viewport, device_transform, property_trees); |
+} |
+ |
} // namespace cc |