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

Side by Side Diff: cc/trees/property_tree.cc

Issue 2148383005: cc: Use sublayer scale from effect tree (2) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: s/sublayer_scale/surface_contents_scale Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 return CombineInversesBetween(source_id, dest_id, transform); 157 return CombineInversesBetween(source_id, dest_id, transform);
158 } 158 }
159 159
160 bool TransformTree::ComputeTransformWithDestinationSublayerScale( 160 bool TransformTree::ComputeTransformWithDestinationSublayerScale(
161 int source_id, 161 int source_id,
162 int dest_id, 162 int dest_id,
163 gfx::Transform* transform) const { 163 gfx::Transform* transform) const {
164 bool success = ComputeTransform(source_id, dest_id, transform); 164 bool success = ComputeTransform(source_id, dest_id, transform);
165 165
166 const TransformNode* dest_node = Node(dest_id); 166 const TransformNode* dest_node = Node(dest_id);
167 if (!dest_node->needs_sublayer_scale) 167 if (!dest_node->needs_surface_contents_scale)
168 return success; 168 return success;
169 169
170 transform->matrix().postScale(dest_node->sublayer_scale.x(), 170 transform->matrix().postScale(dest_node->surface_contents_scale.x(),
171 dest_node->sublayer_scale.y(), 1.f); 171 dest_node->surface_contents_scale.y(), 1.f);
172 return success; 172 return success;
173 } 173 }
174 174
175 bool TransformTree::ComputeTransformWithSourceSublayerScale(
176 int source_id,
177 int dest_id,
178 gfx::Transform* transform) const {
179 bool success = ComputeTransform(source_id, dest_id, transform);
180
181 const TransformNode* source_node = Node(source_id);
182 if (!source_node->needs_sublayer_scale)
183 return success;
184
185 if (source_node->sublayer_scale.x() == 0 ||
186 source_node->sublayer_scale.y() == 0)
187 return false;
188
189 transform->Scale(1.f / source_node->sublayer_scale.x(),
190 1.f / source_node->sublayer_scale.y());
191 return success;
192 }
193
194 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const { 175 bool TransformTree::Are2DAxisAligned(int source_id, int dest_id) const {
195 gfx::Transform transform; 176 gfx::Transform transform;
196 return ComputeTransform(source_id, dest_id, &transform) && 177 return ComputeTransform(source_id, dest_id, &transform) &&
197 transform.Preserves2dAxisAlignment(); 178 transform.Preserves2dAxisAlignment();
198 } 179 }
199 180
200 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) { 181 bool TransformTree::NeedsSourceToParentUpdate(TransformNode* node) {
201 return (source_to_parent_updates_allowed() && 182 return (source_to_parent_updates_allowed() &&
202 node->parent_id != node->source_node_id); 183 node->parent_id != node->source_node_id);
203 } 184 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 // path from the source to the destination (this is traversing upward), and 248 // path from the source to the destination (this is traversing upward), and
268 // then we visit these nodes in reverse order, flattening as needed. We 249 // then we visit these nodes in reverse order, flattening as needed. We
269 // early-out if we get to a node whose target node is the destination, since 250 // early-out if we get to a node whose target node is the destination, since
270 // we can then re-use the target space transform stored at that node. However, 251 // we can then re-use the target space transform stored at that node. However,
271 // we cannot re-use a stored target space transform if the destination has a 252 // we cannot re-use a stored target space transform if the destination has a
272 // zero sublayer scale, since stored target space transforms have sublayer 253 // zero sublayer scale, since stored target space transforms have sublayer
273 // scale baked in, but we need to compute an unscaled transform. 254 // scale baked in, but we need to compute an unscaled transform.
274 std::vector<int> source_to_destination; 255 std::vector<int> source_to_destination;
275 source_to_destination.push_back(current->id); 256 source_to_destination.push_back(current->id);
276 current = parent(current); 257 current = parent(current);
277 bool destination_has_non_zero_sublayer_scale = 258 bool destination_has_non_zero_surface_contents_scale =
278 dest->sublayer_scale.x() != 0.f && dest->sublayer_scale.y() != 0.f; 259 dest->surface_contents_scale.x() != 0.f &&
279 DCHECK(destination_has_non_zero_sublayer_scale || 260 dest->surface_contents_scale.y() != 0.f;
261 DCHECK(destination_has_non_zero_surface_contents_scale ||
280 !dest->ancestors_are_invertible); 262 !dest->ancestors_are_invertible);
281 for (; current && current->id > dest_id; current = parent(current)) { 263 for (; current && current->id > dest_id; current = parent(current)) {
282 if (destination_has_non_zero_sublayer_scale && 264 if (destination_has_non_zero_surface_contents_scale &&
283 TargetId(current->id) == dest_id && 265 TargetId(current->id) == dest_id &&
284 ContentTargetId(current->id) == dest_id) 266 ContentTargetId(current->id) == dest_id)
285 break; 267 break;
286 source_to_destination.push_back(current->id); 268 source_to_destination.push_back(current->id);
287 } 269 }
288 270
289 gfx::Transform combined_transform; 271 gfx::Transform combined_transform;
290 if (current->id > dest_id) { 272 if (current->id > dest_id) {
291 combined_transform = ToTarget(current->id); 273 combined_transform = ToTarget(current->id);
292 // The stored target space transform has sublayer scale baked in, but we 274 // The stored target space transform has sublayer scale baked in, but we
293 // need the unscaled transform. 275 // need the unscaled transform.
294 combined_transform.matrix().postScale( 276 combined_transform.matrix().postScale(
295 1.0f / dest->sublayer_scale.x(), 1.0f / dest->sublayer_scale.y(), 1.0f); 277 1.0f / dest->surface_contents_scale.x(),
278 1.0f / dest->surface_contents_scale.y(), 1.0f);
296 } else if (current->id < dest_id) { 279 } else if (current->id < dest_id) {
297 // We have reached the lowest common ancestor of the source and destination 280 // We have reached the lowest common ancestor of the source and destination
298 // nodes. This case can occur when we are transforming between a node 281 // nodes. This case can occur when we are transforming between a node
299 // corresponding to a fixed-position layer (or its descendant) and the node 282 // corresponding to a fixed-position layer (or its descendant) and the node
300 // corresponding to the layer's render target. For example, consider the 283 // corresponding to the layer's render target. For example, consider the
301 // layer tree R->T->S->F where F is fixed-position, S owns a render surface, 284 // layer tree R->T->S->F where F is fixed-position, S owns a render surface,
302 // and T has a significant transform. This will yield the following 285 // and T has a significant transform. This will yield the following
303 // transform tree: 286 // transform tree:
304 // R 287 // R
305 // | 288 // |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 } 396 }
414 397
415 gfx::Transform from_screen; 398 gfx::Transform from_screen;
416 if (!ToScreen(node->id).GetInverse(&from_screen)) 399 if (!ToScreen(node->id).GetInverse(&from_screen))
417 node->ancestors_are_invertible = false; 400 node->ancestors_are_invertible = false;
418 SetFromScreen(node->id, from_screen); 401 SetFromScreen(node->id, from_screen);
419 } 402 }
420 403
421 void TransformTree::UpdateSublayerScale(TransformNode* node) { 404 void TransformTree::UpdateSublayerScale(TransformNode* node) {
422 // The sublayer scale depends on the screen space transform, so update it too. 405 // The sublayer scale depends on the screen space transform, so update it too.
423 if (!node->needs_sublayer_scale) { 406 if (!node->needs_surface_contents_scale) {
424 node->sublayer_scale = gfx::Vector2dF(1.0f, 1.0f); 407 node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f);
425 return; 408 return;
426 } 409 }
427 410
428 float layer_scale_factor = 411 float layer_scale_factor =
429 device_scale_factor_ * device_transform_scale_factor_; 412 device_scale_factor_ * device_transform_scale_factor_;
430 if (node->in_subtree_of_page_scale_layer) 413 if (node->in_subtree_of_page_scale_layer)
431 layer_scale_factor *= page_scale_factor_; 414 layer_scale_factor *= page_scale_factor_;
432 node->sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( 415 node->surface_contents_scale = MathUtil::ComputeTransform2dScaleComponents(
433 ToScreen(node->id), layer_scale_factor); 416 ToScreen(node->id), layer_scale_factor);
434 } 417 }
435 418
436 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, 419 void TransformTree::UpdateTargetSpaceTransform(TransformNode* node,
437 TransformNode* target_node) { 420 TransformNode* target_node) {
438 gfx::Transform target_space_transform; 421 gfx::Transform target_space_transform;
439 if (node->needs_sublayer_scale) { 422 if (node->needs_surface_contents_scale) {
440 target_space_transform.MakeIdentity(); 423 target_space_transform.MakeIdentity();
441 target_space_transform.Scale(node->sublayer_scale.x(), 424 target_space_transform.Scale(node->surface_contents_scale.x(),
442 node->sublayer_scale.y()); 425 node->surface_contents_scale.y());
443 } else { 426 } else {
444 // In order to include the root transform for the root surface, we walk up 427 // In order to include the root transform for the root surface, we walk up
445 // to the root of the transform tree in ComputeTransform. 428 // to the root of the transform tree in ComputeTransform.
446 int target_id = target_node->id; 429 int target_id = target_node->id;
447 ComputeTransformWithDestinationSublayerScale(node->id, target_id, 430 ComputeTransformWithDestinationSublayerScale(node->id, target_id,
448 &target_space_transform); 431 &target_space_transform);
449 } 432 }
450 433
451 gfx::Transform from_target; 434 gfx::Transform from_target;
452 if (!target_space_transform.GetInverse(&from_target)) 435 if (!target_space_transform.GetInverse(&from_target))
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 } 645 }
663 646
664 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( 647 gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale(
665 int id) const { 648 int id) const {
666 DCHECK_GT(id, 0); 649 DCHECK_GT(id, 0);
667 if (id == 1) { 650 if (id == 1) {
668 return gfx::Transform(); 651 return gfx::Transform();
669 } 652 }
670 const TransformNode* node = Node(id); 653 const TransformNode* node = Node(id);
671 gfx::Transform screen_space_transform = ToScreen(id); 654 gfx::Transform screen_space_transform = ToScreen(id);
672 if (node->sublayer_scale.x() != 0.0 && node->sublayer_scale.y() != 0.0) 655 if (node->surface_contents_scale.x() != 0.0 &&
673 screen_space_transform.Scale(1.0 / node->sublayer_scale.x(), 656 node->surface_contents_scale.y() != 0.0)
674 1.0 / node->sublayer_scale.y()); 657 screen_space_transform.Scale(1.0 / node->surface_contents_scale.x(),
658 1.0 / node->surface_contents_scale.y());
675 return screen_space_transform; 659 return screen_space_transform;
676 } 660 }
677 661
678 bool TransformTree::operator==(const TransformTree& other) const { 662 bool TransformTree::operator==(const TransformTree& other) const {
679 return PropertyTree::operator==(other) && 663 return PropertyTree::operator==(other) &&
680 source_to_parent_updates_allowed_ == 664 source_to_parent_updates_allowed_ ==
681 other.source_to_parent_updates_allowed() && 665 other.source_to_parent_updates_allowed() &&
682 page_scale_factor_ == other.page_scale_factor() && 666 page_scale_factor_ == other.page_scale_factor() &&
683 device_scale_factor_ == other.device_scale_factor() && 667 device_scale_factor_ == other.device_scale_factor() &&
684 device_transform_scale_factor_ == 668 device_transform_scale_factor_ ==
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 } 814 }
831 return; 815 return;
832 } 816 }
833 } 817 }
834 } 818 }
835 node->hidden_by_backface_visibility = false; 819 node->hidden_by_backface_visibility = false;
836 } 820 }
837 821
838 void EffectTree::UpdateSublayerScale(EffectNode* effect_node) { 822 void EffectTree::UpdateSublayerScale(EffectNode* effect_node) {
839 if (!effect_node->has_render_surface || effect_node->transform_id == 0) { 823 if (!effect_node->has_render_surface || effect_node->transform_id == 0) {
840 effect_node->sublayer_scale = gfx::Vector2dF(1.0f, 1.0f); 824 effect_node->surface_contents_scale = gfx::Vector2dF(1.0f, 1.0f);
841 return; 825 return;
842 } 826 }
843 827
844 TransformTree& transform_tree = property_trees()->transform_tree; 828 TransformTree& transform_tree = property_trees()->transform_tree;
845 float layer_scale_factor = transform_tree.device_scale_factor() * 829 float layer_scale_factor = transform_tree.device_scale_factor() *
846 transform_tree.device_transform_scale_factor(); 830 transform_tree.device_transform_scale_factor();
847 TransformNode* transform_node = 831 TransformNode* transform_node =
848 transform_tree.Node(effect_node->transform_id); 832 transform_tree.Node(effect_node->transform_id);
849 if (transform_node->in_subtree_of_page_scale_layer) 833 if (transform_node->in_subtree_of_page_scale_layer)
850 layer_scale_factor *= transform_tree.page_scale_factor(); 834 layer_scale_factor *= transform_tree.page_scale_factor();
851 effect_node->sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( 835 effect_node->surface_contents_scale =
852 transform_tree.ToScreen(transform_node->id), layer_scale_factor); 836 MathUtil::ComputeTransform2dScaleComponents(
837 transform_tree.ToScreen(transform_node->id), layer_scale_factor);
853 } 838 }
854 839
855 void EffectTree::UpdateEffects(int id) { 840 void EffectTree::UpdateEffects(int id) {
856 EffectNode* node = Node(id); 841 EffectNode* node = Node(id);
857 EffectNode* parent_node = parent(node); 842 EffectNode* parent_node = parent(node);
858 843
859 UpdateOpacities(node, parent_node); 844 UpdateOpacities(node, parent_node);
860 UpdateIsDrawn(node, parent_node); 845 UpdateIsDrawn(node, parent_node);
861 UpdateEffectChanged(node, parent_node); 846 UpdateEffectChanged(node, parent_node);
862 UpdateBackfaceVisibility(node, parent_node); 847 UpdateBackfaceVisibility(node, parent_node);
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 cached_data_.property_tree_update_number = 0; 1869 cached_data_.property_tree_update_number = 0;
1885 cached_data_.animation_scales = std::vector<AnimationScaleData>( 1870 cached_data_.animation_scales = std::vector<AnimationScaleData>(
1886 transform_tree.nodes().size(), AnimationScaleData()); 1871 transform_tree.nodes().size(), AnimationScaleData());
1887 } 1872 }
1888 1873
1889 void PropertyTrees::UpdateCachedNumber() { 1874 void PropertyTrees::UpdateCachedNumber() {
1890 cached_data_.property_tree_update_number++; 1875 cached_data_.property_tree_update_number++;
1891 } 1876 }
1892 1877
1893 } // namespace cc 1878 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698