Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: cc/layers/layer.cc

Issue 1088773003: Reuse property trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove unrelated change Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/layers/layer.cc
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 938449cb968e2e57ac3e792c1c4d9d6ddd1c548b..fe9503a478964a7672dba595b38e5679f23ff5b1 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -118,6 +118,9 @@ void Layer::SetLayerTreeHost(LayerTreeHost* host) {
if (layer_tree_host_ == host)
return;
+ if (layer_tree_host_)
+ layer_tree_host_->property_trees()->needs_rebuild = true;
+
layer_tree_host_ = host;
// When changing hosts, the layer needs to commit its properties to the impl
@@ -154,6 +157,19 @@ void Layer::SetNeedsCommit() {
return;
SetNeedsPushProperties();
+ layer_tree_host_->property_trees()->needs_rebuild = true;
+
+ if (ignore_set_needs_commit_)
+ return;
+
+ layer_tree_host_->SetNeedsCommit();
+}
+
+void Layer::SetNeedsCommitNoRebuild() {
+ if (!layer_tree_host_)
+ return;
+
+ SetNeedsPushProperties();
if (ignore_set_needs_commit_)
return;
@@ -335,9 +351,19 @@ void Layer::SetBounds(const gfx::Size& size) {
DCHECK(IsPropertyChangeAllowed());
if (bounds() == size)
return;
-
bounds_ = size;
- SetNeedsCommit();
+
+ if (!layer_tree_host_)
+ return;
+
+ if (ClipNode* clip_node = layer_tree_host_->property_trees()->clip_tree.Node(
+ clip_tree_index())) {
+ if (clip_node->owner_id == id()) {
+ clip_node->data.clip.set_size(size);
+ }
+ }
+
+ SetNeedsCommitNoRebuild();
}
Layer* Layer::RootLayer() {
@@ -577,6 +603,22 @@ void Layer::SetPosition(const gfx::PointF& position) {
if (position_ == position)
return;
position_ = position;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.update_post_local_transform(position,
+ transform_origin());
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
}
@@ -588,12 +630,53 @@ bool Layer::IsContainerForFixedPositionLayers() const {
return is_container_for_fixed_position_layers_;
}
+bool Are2dAxisAligned(const gfx::Transform& a,
+ const gfx::Transform& b,
+ bool* is_invertible) {
+ if (a.IsScaleOrTranslation() && b.IsScaleOrTranslation()) {
+ *is_invertible = b.IsInvertible();
+ return true;
+ }
+
+ gfx::Transform inverse(gfx::Transform::kSkipInitialization);
+ *is_invertible = b.GetInverse(&inverse);
+
+ inverse *= a;
+ return inverse.Preserves2dAxisAlignment();
+}
+
void Layer::SetTransform(const gfx::Transform& transform) {
DCHECK(IsPropertyChangeAllowed());
if (transform_ == transform)
return;
+
+ if (layer_tree_host_) {
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ // We need to trigger a rebuild if we could have affected 2d axis
+ // alignment. We'll check to see if transform and transform_ are axis
+ // align with respect to one another.
+ bool invertible = false;
+ bool preserves_2d_axis_alignment =
+ Are2dAxisAligned(transform_, transform, &invertible);
+ transform_node->data.local = transform;
+ transform_node->data.needs_local_transform_update = true;
+ if (preserves_2d_axis_alignment)
+ SetNeedsCommitNoRebuild();
+ else
+ SetNeedsCommit();
+ transform_ = transform;
+ transform_is_invertible_ = invertible;
+ return;
+ }
+ }
+ }
+
transform_ = transform;
transform_is_invertible_ = transform.IsInvertible();
+
SetNeedsCommit();
}
@@ -602,6 +685,22 @@ void Layer::SetTransformOrigin(const gfx::Point3F& transform_origin) {
if (transform_origin_ == transform_origin)
return;
transform_origin_ = transform_origin;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.update_post_local_transform(position(),
+ transform_origin);
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
}
@@ -679,6 +778,22 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
if (scroll_offset_ == scroll_offset)
return;
scroll_offset_ = scroll_offset;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.scroll_offset =
+ gfx::ScrollOffsetToVector2dF(CurrentScrollOffset());
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
}
@@ -704,6 +819,22 @@ void Layer::SetScrollOffsetFromImplSide(
return;
scroll_offset_ = scroll_offset;
SetNeedsPushProperties();
+
+ bool needs_rebuild = true;
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.scroll_offset =
+ gfx::ScrollOffsetToVector2dF(CurrentScrollOffset());
+ transform_node->data.needs_local_transform_update = true;
+ needs_rebuild = false;
+ }
+ }
+
+ if (needs_rebuild)
+ layer_tree_host_->property_trees()->needs_rebuild = true;
+
if (!did_scroll_callback_.is_null())
did_scroll_callback_.Run();
// The callback could potentially change the layer structure:
@@ -1019,6 +1150,8 @@ void Layer::PushPropertiesTo(LayerImpl* layer) {
base::Passed(&original_request)));
main_thread_copy_requests.push_back(main_thread_request.Pass());
}
+ if (!copy_requests_.empty() && layer_tree_host_)
+ layer_tree_host_->property_trees()->needs_rebuild = true;
copy_requests_.clear();
layer->PassCopyRequests(&main_thread_copy_requests);
@@ -1157,6 +1290,14 @@ void Layer::OnFilterAnimated(const FilterOperations& filters) {
void Layer::OnOpacityAnimated(float opacity) {
opacity_ = opacity;
+ if (layer_tree_host_) {
+ if (OpacityNode* node =
+ layer_tree_host_->property_trees()->opacity_tree.Node(
+ opacity_tree_index_)) {
+ if (node->owner_id == id())
+ node->data = opacity;
+ }
+ }
}
void Layer::OnTransformAnimated(const gfx::Transform& transform) {
@@ -1164,6 +1305,17 @@ void Layer::OnTransformAnimated(const gfx::Transform& transform) {
return;
transform_ = transform;
transform_is_invertible_ = transform.IsInvertible();
+ if (layer_tree_host_) {
+ if (TransformNode* node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index_)) {
+ if (node->owner_id == id()) {
+ node->data.local = transform;
+ node->data.needs_local_transform_update = true;
+ node->data.is_animated = true;
+ }
+ }
+ }
}
void Layer::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) {

Powered by Google App Engine
This is Rietveld 408576698