| 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) {
|
|
|