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

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

Issue 2148383005: cc: Use sublayer scale from effect tree (2) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments 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
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/effect_node.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "cc/trees/draw_property_utils.h" 5 #include "cc/trees/draw_property_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 EffectNode* effect_node = 47 EffectNode* effect_node =
48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node(
49 layer->effect_tree_index()); 49 layer->effect_tree_index());
50 if (effect_node->owner_id != layer->id()) 50 if (effect_node->owner_id != layer->id())
51 return; 51 return;
52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id();
53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id();
54 DCHECK(effect_node->background_filters.IsEmpty()); 54 DCHECK(effect_node->background_filters.IsEmpty());
55 } 55 }
56 56
57 void VerifySublayerScalesMatch(const int effect_node_id, 57 void VerifySurfaceContentsScalesMatch(const int target_effect_id,
58 const int target_transform_id, 58 const int target_transform_id,
59 const EffectTree& effect_tree, 59 const EffectTree& effect_tree,
60 const TransformTree& transform_tree) { 60 const TransformTree& transform_tree) {
61 const TransformNode* target_transform_node = 61 const TransformNode* target_transform_node =
62 transform_tree.Node(target_transform_id); 62 transform_tree.Node(target_transform_id);
63 const EffectNode* effect_node = effect_tree.Node(effect_node_id); 63 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id);
64 const EffectNode* target_effect_node = 64 DCHECK(target_transform_node->surface_contents_scale ==
65 effect_node->has_render_surface 65 target_effect_node->surface_contents_scale)
66 ? effect_node 66 << " surface contents scale from transform tree: "
67 : effect_tree.Node(effect_node->target_id); 67 << target_transform_node->surface_contents_scale.ToString()
68 DCHECK(target_transform_node->sublayer_scale == 68 << " surface contents scale from effect tree: "
69 target_effect_node->sublayer_scale) 69 << target_effect_node->surface_contents_scale.ToString();
70 << " sublayer scale from transform tree: "
71 << target_transform_node->sublayer_scale.ToString()
72 << " sublayer scale from effect tree: "
73 << target_effect_node->sublayer_scale.ToString();
74 } 70 }
75 #endif 71 #endif
76 72
73 static const EffectNode* ContentsTargetEffectNode(
74 const int effect_tree_index,
75 const EffectTree& effect_tree) {
76 const EffectNode* effect_node = effect_tree.Node(effect_tree_index);
77 return effect_node->has_render_surface
78 ? effect_node
79 : effect_tree.Node(effect_node->target_id);
80 }
81
77 template <typename LayerType> 82 template <typename LayerType>
78 bool ComputeClipRectInTargetSpace(const LayerType* layer, 83 bool ComputeClipRectInTargetSpace(const LayerType* layer,
79 const ClipNode* clip_node, 84 const ClipNode* clip_node,
80 const TransformTree& transform_tree, 85 const TransformTree& transform_tree,
81 const EffectTree& effect_tree, 86 const EffectTree& effect_tree,
82 int target_node_id, 87 int target_node_id,
83 gfx::RectF* clip_rect_in_target_space) { 88 gfx::RectF* clip_rect_in_target_space) {
84 DCHECK(layer->clip_tree_index() == clip_node->id); 89 DCHECK(layer->clip_tree_index() == clip_node->id);
85 DCHECK(clip_node->target_transform_id != target_node_id); 90 DCHECK(clip_node->target_transform_id != target_node_id);
86 91
87 gfx::Transform clip_to_target; 92 gfx::Transform clip_to_target;
88 if (clip_node->target_transform_id > target_node_id) { 93 if (clip_node->target_transform_id > target_node_id) {
89 // In this case, layer has a scroll parent. We need to keep the scale 94 // In this case, layer has a scroll parent. We need to keep the scale
90 // at the layer's target but remove the scale at the scroll parent's 95 // at the layer's target but remove the scale at the scroll parent's
91 // target. 96 // target.
92 if (transform_tree.ComputeTransform(clip_node->target_transform_id, 97 if (transform_tree.ComputeTransform(clip_node->target_transform_id,
93 target_node_id, &clip_to_target)) { 98 target_node_id, &clip_to_target)) {
94 // We don't have to apply sublayer scale when target is root. 99 // We don't have to apply surface contents scale when target is root.
95 if (target_node_id != 0) { 100 if (target_node_id != 0) {
96 PostConcatSublayerScale(layer->effect_tree_index(), effect_tree, 101 const EffectNode* target_effect_node =
97 &clip_to_target); 102 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree);
103 PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target);
98 #if DCHECK_IS_ON() 104 #if DCHECK_IS_ON()
99 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id, 105 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(),
100 effect_tree, transform_tree); 106 target_node_id, effect_tree,
107 transform_tree);
101 #endif 108 #endif
102 } 109 }
103 110
104 const TransformNode* source_node = 111 const EffectNode* source_node =
105 transform_tree.Node(clip_node->target_transform_id); 112 effect_tree.Node(clip_node->target_effect_id);
106 if (source_node->sublayer_scale.x() != 0.f && 113 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target);
107 source_node->sublayer_scale.y() != 0.f) 114 #if DCHECK_IS_ON()
108 clip_to_target.Scale(1.0f / source_node->sublayer_scale.x(), 115 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
109 1.0f / source_node->sublayer_scale.y()); 116 clip_node->target_transform_id,
117 effect_tree, transform_tree);
118 #endif
110 *clip_rect_in_target_space = MathUtil::MapClippedRect( 119 *clip_rect_in_target_space = MathUtil::MapClippedRect(
111 clip_to_target, clip_node->clip_in_target_space); 120 clip_to_target, clip_node->clip_in_target_space);
112 } else { 121 } else {
113 return false; 122 return false;
114 } 123 }
115 } else { 124 } else {
116 if (transform_tree.ComputeTransform(clip_node->target_transform_id, 125 if (transform_tree.ComputeTransform(clip_node->target_transform_id,
117 target_node_id, &clip_to_target)) { 126 target_node_id, &clip_to_target)) {
118 *clip_rect_in_target_space = MathUtil::ProjectClippedRect( 127 *clip_rect_in_target_space = MathUtil::ProjectClippedRect(
119 clip_to_target, clip_node->clip_in_target_space); 128 clip_to_target, clip_node->clip_in_target_space);
120 } else { 129 } else {
121 return false; 130 return false;
122 } 131 }
123 } 132 }
124 return true; 133 return true;
125 } 134 }
126 135
127 struct ConditionalClip { 136 struct ConditionalClip {
128 bool is_clipped; 137 bool is_clipped;
129 gfx::RectF clip_rect; 138 gfx::RectF clip_rect;
130 }; 139 };
131 140
132 static ConditionalClip ComputeTargetRectInLocalSpace( 141 static ConditionalClip ComputeTargetRectInLocalSpace(
133 gfx::RectF rect, 142 gfx::RectF rect,
134 const TransformTree& transform_tree, 143 const TransformTree& transform_tree,
144 const EffectTree& effect_tree,
135 int current_transform_id, 145 int current_transform_id,
136 int target_transform_id) { 146 int target_transform_id,
147 const int current_effect_id) {
137 gfx::Transform current_to_target; 148 gfx::Transform current_to_target;
138 if (!transform_tree.ComputeTransformWithSourceSublayerScale( 149 bool success = transform_tree.ComputeTransform(
139 current_transform_id, target_transform_id, &current_to_target)) 150 current_transform_id, target_transform_id, &current_to_target);
151 if (!success)
140 // If transform is not invertible, cannot apply clip. 152 // If transform is not invertible, cannot apply clip.
141 return ConditionalClip{false, gfx::RectF()}; 153 return ConditionalClip{false, gfx::RectF()};
154 const EffectNode* current_effect_node = effect_tree.Node(current_effect_id);
155 ConcatInverseSurfaceContentsScale(current_effect_node, &current_to_target);
142 156
143 if (current_transform_id > target_transform_id) 157 if (current_transform_id > target_transform_id)
144 return ConditionalClip{true, // is_clipped. 158 return ConditionalClip{true, // is_clipped.
145 MathUtil::MapClippedRect(current_to_target, rect)}; 159 MathUtil::MapClippedRect(current_to_target, rect)};
146 160
147 return ConditionalClip{true, // is_clipped. 161 return ConditionalClip{true, // is_clipped.
148 MathUtil::ProjectClippedRect(current_to_target, rect)}; 162 MathUtil::ProjectClippedRect(current_to_target, rect)};
149 } 163 }
150 164
151 static ConditionalClip ComputeLocalRectInTargetSpace( 165 static ConditionalClip ComputeLocalRectInTargetSpace(
152 gfx::RectF rect, 166 gfx::RectF rect,
153 const TransformTree& transform_tree, 167 const TransformTree& transform_tree,
154 const EffectTree& effect_tree, 168 const EffectTree& effect_tree,
155 int current_transform_id, 169 int current_transform_id,
156 int target_transform_id, 170 int target_transform_id,
157 int target_effect_id) { 171 int target_effect_id) {
158 gfx::Transform current_to_target; 172 gfx::Transform current_to_target;
159 if (!transform_tree.ComputeTransform(current_transform_id, 173 if (!transform_tree.ComputeTransform(current_transform_id,
160 target_transform_id, &current_to_target)) 174 target_transform_id, &current_to_target))
161 // If transform is not invertible, cannot apply clip. 175 // If transform is not invertible, cannot apply clip.
162 return ConditionalClip{false, gfx::RectF()}; 176 return ConditionalClip{false, gfx::RectF()};
163 // We don't have to apply sublayer scale when target is root. 177 // We don't have to apply surface contents scale when target is root.
164 if (target_transform_id != 0) { 178 if (target_transform_id != 0) {
165 PostConcatSublayerScale(target_effect_id, effect_tree, &current_to_target); 179 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id);
180 PostConcatSurfaceContentsScale(target_effect_node, &current_to_target);
166 #if DCHECK_IS_ON() 181 #if DCHECK_IS_ON()
167 VerifySublayerScalesMatch(target_effect_id, target_transform_id, 182 VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id,
168 effect_tree, transform_tree); 183 effect_tree, transform_tree);
169 #endif 184 #endif
170 } 185 }
171 186
172 if (current_transform_id > target_transform_id) 187 if (current_transform_id > target_transform_id)
173 return ConditionalClip{true, // is_clipped. 188 return ConditionalClip{true, // is_clipped.
174 MathUtil::MapClippedRect(current_to_target, rect)}; 189 MathUtil::MapClippedRect(current_to_target, rect)};
175 190
176 return ConditionalClip{true, // is_clipped. 191 return ConditionalClip{true, // is_clipped.
177 MathUtil::ProjectClippedRect(current_to_target, rect)}; 192 MathUtil::ProjectClippedRect(current_to_target, rect)};
178 } 193 }
179 194
180 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, 195 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node,
181 const TransformTree& transform_tree, 196 const TransformTree& transform_tree,
182 const EffectTree& effect_tree, 197 const EffectTree& effect_tree,
183 int target_transform_id, 198 int target_transform_id,
184 int target_effect_id) { 199 int target_effect_id) {
185 if (clip_node->transform_id != target_transform_id) 200 if (clip_node->transform_id != target_transform_id)
186 return ComputeLocalRectInTargetSpace(clip_node->clip, transform_tree, 201 return ComputeLocalRectInTargetSpace(clip_node->clip, transform_tree,
187 effect_tree, clip_node->transform_id, 202 effect_tree, clip_node->transform_id,
188 target_transform_id, target_effect_id); 203 target_transform_id, target_effect_id);
189 204
190 gfx::RectF current_clip = clip_node->clip; 205 gfx::RectF current_clip = clip_node->clip;
191 gfx::Vector2dF sublayer_scale = 206 gfx::Vector2dF surface_contents_scale =
192 transform_tree.Node(target_transform_id)->sublayer_scale; 207 effect_tree.Node(target_effect_id)->surface_contents_scale;
193 if (sublayer_scale.x() > 0 && sublayer_scale.y() > 0) 208 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0)
194 current_clip.Scale(sublayer_scale.x(), sublayer_scale.y()); 209 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y());
195 return ConditionalClip{true /* is_clipped */, current_clip}; 210 return ConditionalClip{true /* is_clipped */, current_clip};
196 } 211 }
197 212
198 static ConditionalClip ComputeAccumulatedClip( 213 static ConditionalClip ComputeAccumulatedClip(
199 const ClipTree& clip_tree, 214 const ClipTree& clip_tree,
200 int local_clip_id, 215 int local_clip_id,
201 const EffectTree& effect_tree, 216 const EffectTree& effect_tree,
202 int target_id, 217 int target_id,
203 const TransformTree& transform_tree) { 218 const TransformTree& transform_tree) {
204 const ClipNode* clip_node = clip_tree.Node(local_clip_id); 219 const ClipNode* clip_node = clip_tree.Node(local_clip_id);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
368 continue; 383 continue;
369 } 384 }
370 385
371 gfx::RectF accumulated_clip_in_copy_request_space = 386 gfx::RectF accumulated_clip_in_copy_request_space =
372 accumulated_clip_rect.clip_rect; 387 accumulated_clip_rect.clip_rect;
373 388
374 const EffectNode* copy_request_effect_node = 389 const EffectNode* copy_request_effect_node =
375 effect_tree.Node(effect_ancestor_with_copy_request); 390 effect_tree.Node(effect_ancestor_with_copy_request);
376 ConditionalClip clip_in_layer_space = ComputeTargetRectInLocalSpace( 391 ConditionalClip clip_in_layer_space = ComputeTargetRectInLocalSpace(
377 accumulated_clip_in_copy_request_space, transform_tree, 392 accumulated_clip_in_copy_request_space, transform_tree, effect_tree,
378 copy_request_effect_node->transform_id, 393 copy_request_effect_node->transform_id, layer->transform_tree_index(),
379 layer->transform_tree_index()); 394 copy_request_effect_node->id);
380 395
381 if (clip_in_layer_space.is_clipped) { 396 if (clip_in_layer_space.is_clipped) {
382 gfx::RectF clip_rect = clip_in_layer_space.clip_rect; 397 gfx::RectF clip_rect = clip_in_layer_space.clip_rect;
383 clip_rect.Offset(-layer->offset_to_transform_parent()); 398 clip_rect.Offset(-layer->offset_to_transform_parent());
384 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect); 399 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect);
385 visible_rect.Intersect(gfx::Rect(layer_bounds)); 400 visible_rect.Intersect(gfx::Rect(layer_bounds));
386 layer->set_visible_layer_rect(visible_rect); 401 layer->set_visible_layer_rect(visible_rect);
387 } else { 402 } else {
388 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 403 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
389 } 404 }
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 layer_content_bounds_in_target_space); 499 layer_content_bounds_in_target_space);
485 if (combined_clip_rect_in_target_space.IsEmpty()) { 500 if (combined_clip_rect_in_target_space.IsEmpty()) {
486 layer->set_visible_layer_rect(gfx::Rect()); 501 layer->set_visible_layer_rect(gfx::Rect());
487 continue; 502 continue;
488 } 503 }
489 504
490 gfx::Transform target_to_layer; 505 gfx::Transform target_to_layer;
491 if (transform_node->ancestors_are_invertible) { 506 if (transform_node->ancestors_are_invertible) {
492 target_to_layer = transform_tree.FromTarget(transform_node->id); 507 target_to_layer = transform_tree.FromTarget(transform_node->id);
493 } else { 508 } else {
494 if (!transform_tree.ComputeTransformWithSourceSublayerScale( 509 bool success = transform_tree.ComputeTransform(
495 target_node_id, transform_node->id, &target_to_layer)) { 510 target_node_id, transform_node->id, &target_to_layer);
511 if (!success) {
496 // An animated singular transform may become non-singular during the 512 // An animated singular transform may become non-singular during the
497 // animation, so we still need to compute a visible rect. In this 513 // animation, so we still need to compute a visible rect. In this
498 // situation, we treat the entire layer as visible. 514 // situation, we treat the entire layer as visible.
499 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 515 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
500 continue; 516 continue;
501 } 517 }
518 if (target_node_id != 0) {
519 const EffectNode* target_effect_node =
520 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree);
521 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer);
522 #if DCHECK_IS_ON()
523 VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id,
524 effect_tree, transform_tree);
525 #endif
526 }
502 } 527 }
503
504 gfx::Transform target_to_content; 528 gfx::Transform target_to_content;
505 target_to_content.Translate(-layer->offset_to_transform_parent().x(), 529 target_to_content.Translate(-layer->offset_to_transform_parent().x(),
506 -layer->offset_to_transform_parent().y()); 530 -layer->offset_to_transform_parent().y());
507 target_to_content.PreconcatTransform(target_to_layer); 531 target_to_content.PreconcatTransform(target_to_layer);
508 532
509 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 533 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
510 target_to_content, combined_clip_rect_in_target_space)); 534 target_to_content, combined_clip_rect_in_target_space));
511 visible_rect.Intersect(gfx::Rect(layer_bounds)); 535 visible_rect.Intersect(gfx::Rect(layer_bounds));
512 layer->set_visible_layer_rect(visible_rect); 536 layer->set_visible_layer_rect(visible_rect);
513 } 537 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } 717 }
694 } 718 }
695 } 719 }
696 720
697 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { 721 static void ResetIfHasNanCoordinate(gfx::RectF* rect) {
698 if (std::isnan(rect->x()) || std::isnan(rect->y()) || 722 if (std::isnan(rect->x()) || std::isnan(rect->y()) ||
699 std::isnan(rect->right()) || std::isnan(rect->bottom())) 723 std::isnan(rect->right()) || std::isnan(rect->bottom()))
700 *rect = gfx::RectF(); 724 *rect = gfx::RectF();
701 } 725 }
702 726
703 void PostConcatSublayerScale(const int effect_node_id, 727 void PostConcatSurfaceContentsScale(const EffectNode* effect_node,
704 const EffectTree& effect_tree, 728 gfx::Transform* transform) {
705 gfx::Transform* transform) { 729 DCHECK(effect_node->has_render_surface);
706 // TODO(jaydasika): This function should not compute target effect node id. It 730 transform->matrix().postScale(effect_node->surface_contents_scale.x(),
707 // should receive it from callers. 731 effect_node->surface_contents_scale.y(), 1.f);
708 const EffectNode* effect_node = effect_tree.Node(effect_node_id);
709 const EffectNode* target_effect_node =
710 effect_node->has_render_surface
711 ? effect_node
712 : effect_tree.Node(effect_node->target_id);
713 transform->matrix().postScale(target_effect_node->sublayer_scale.x(),
714 target_effect_node->sublayer_scale.y(), 1.f);
715 } 732 }
716 733
717 void ConcatInverseSublayerScale(const int effect_node_id, 734 void ConcatInverseSurfaceContentsScale(const EffectNode* effect_node,
718 const EffectTree& effect_tree, 735 gfx::Transform* transform) {
719 gfx::Transform* transform) { 736 DCHECK(effect_node->has_render_surface);
720 const EffectNode* effect_node = effect_tree.Node(effect_node_id); 737 if (effect_node->surface_contents_scale.x() != 0.0 &&
721 if (effect_node->sublayer_scale.x() != 0.0 && 738 effect_node->surface_contents_scale.y() != 0.0)
722 effect_node->sublayer_scale.y() != 0.0) 739 transform->Scale(1.0 / effect_node->surface_contents_scale.x(),
723 transform->Scale(1.0 / effect_node->sublayer_scale.x(), 740 1.0 / effect_node->surface_contents_scale.y());
724 1.0 / effect_node->sublayer_scale.y());
725 } 741 }
726 742
727 void ComputeClips(ClipTree* clip_tree, 743 void ComputeClips(ClipTree* clip_tree,
728 const TransformTree& transform_tree, 744 const TransformTree& transform_tree,
729 const EffectTree& effect_tree, 745 const EffectTree& effect_tree,
730 bool non_root_surfaces_enabled) { 746 bool non_root_surfaces_enabled) {
731 if (!clip_tree->needs_update()) 747 if (!clip_tree->needs_update())
732 return; 748 return;
733 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { 749 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) {
734 ClipNode* clip_node = clip_tree->Node(i); 750 ClipNode* clip_node = clip_tree->Node(i);
(...skipping 26 matching lines...) Expand all
761 gfx::RectF parent_combined_clip_in_target_space = 777 gfx::RectF parent_combined_clip_in_target_space =
762 parent_clip_node->combined_clip_in_target_space; 778 parent_clip_node->combined_clip_in_target_space;
763 gfx::RectF parent_clip_in_target_space = 779 gfx::RectF parent_clip_in_target_space =
764 parent_clip_node->clip_in_target_space; 780 parent_clip_node->clip_in_target_space;
765 if (parent_target_transform_node && 781 if (parent_target_transform_node &&
766 parent_target_transform_node->id != clip_node->target_transform_id && 782 parent_target_transform_node->id != clip_node->target_transform_id &&
767 non_root_surfaces_enabled) { 783 non_root_surfaces_enabled) {
768 success &= transform_tree.ComputeTransform( 784 success &= transform_tree.ComputeTransform(
769 parent_target_transform_node->id, clip_node->target_transform_id, 785 parent_target_transform_node->id, clip_node->target_transform_id,
770 &parent_to_current); 786 &parent_to_current);
771 // We don't have to apply sublayer scale when target is root. 787 // We don't have to apply surface contents scale when target is root.
772 if (clip_node->target_transform_id != 0) { 788 if (clip_node->target_transform_id != 0) {
773 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, 789 const EffectNode* target_effect_node =
774 &parent_to_current); 790 effect_tree.Node(clip_node->target_effect_id);
791 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current);
775 #if DCHECK_IS_ON() 792 #if DCHECK_IS_ON()
776 VerifySublayerScalesMatch(clip_node->target_effect_id, 793 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
777 clip_node->target_transform_id, effect_tree, 794 clip_node->target_transform_id,
778 transform_tree); 795 effect_tree, transform_tree);
779 #endif 796 #endif
780 } 797 }
781 if (parent_target_transform_node->sublayer_scale.x() > 0 && 798 if (parent_clip_node->target_transform_id != 0) {
782 parent_target_transform_node->sublayer_scale.y() > 0) 799 const EffectNode* parent_target_effect_node =
783 parent_to_current.Scale( 800 effect_tree.Node(parent_clip_node->target_effect_id);
784 1.f / parent_target_transform_node->sublayer_scale.x(), 801 ConcatInverseSurfaceContentsScale(parent_target_effect_node,
785 1.f / parent_target_transform_node->sublayer_scale.y()); 802 &parent_to_current);
803 #if DCHECK_IS_ON()
804 VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id,
805 parent_clip_node->target_transform_id,
806 effect_tree, transform_tree);
807 #endif
808 }
786 // If we can't compute a transform, it's because we had to use the inverse 809 // If we can't compute a transform, it's because we had to use the inverse
787 // of a singular transform. We won't draw in this case, so there's no need 810 // of a singular transform. We won't draw in this case, so there's no need
788 // to compute clips. 811 // to compute clips.
789 if (!success) 812 if (!success)
790 continue; 813 continue;
791 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( 814 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect(
792 parent_to_current, parent_clip_node->combined_clip_in_target_space); 815 parent_to_current, parent_clip_node->combined_clip_in_target_space);
793 parent_clip_in_target_space = MathUtil::ProjectClippedRect( 816 parent_clip_in_target_space = MathUtil::ProjectClippedRect(
794 parent_to_current, parent_clip_node->clip_in_target_space); 817 parent_to_current, parent_clip_node->clip_in_target_space);
795 } 818 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 858
836 if (!non_root_surfaces_enabled) { 859 if (!non_root_surfaces_enabled) {
837 source_to_target = transform_tree.ToScreen(clip_node->transform_id); 860 source_to_target = transform_tree.ToScreen(clip_node->transform_id);
838 } else if (transform_tree.ContentTargetId(transform_node->id) == 861 } else if (transform_tree.ContentTargetId(transform_node->id) ==
839 clip_node->target_transform_id) { 862 clip_node->target_transform_id) {
840 source_to_target = transform_tree.ToTarget(clip_node->transform_id); 863 source_to_target = transform_tree.ToTarget(clip_node->transform_id);
841 } else { 864 } else {
842 success = transform_tree.ComputeTransform( 865 success = transform_tree.ComputeTransform(
843 transform_node->id, clip_node->target_transform_id, 866 transform_node->id, clip_node->target_transform_id,
844 &source_to_target); 867 &source_to_target);
845 // We don't have to apply sublayer scale when target is root. 868 // We don't have to apply surface contents scale when target is root.
846 if (clip_node->target_transform_id != 0) { 869 if (clip_node->target_transform_id != 0) {
847 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, 870 const EffectNode* target_effect_node =
848 &source_to_target); 871 effect_tree.Node(clip_node->target_effect_id);
872 PostConcatSurfaceContentsScale(target_effect_node, &source_to_target);
849 #if DCHECK_IS_ON() 873 #if DCHECK_IS_ON()
850 VerifySublayerScalesMatch(clip_node->target_effect_id, 874 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
851 clip_node->target_transform_id, effect_tree, 875 clip_node->target_transform_id,
852 transform_tree); 876 effect_tree, transform_tree);
853 #endif 877 #endif
854 } 878 }
855 // source_to_target computation should be successful as target is an 879 // source_to_target computation should be successful as target is an
856 // ancestor of the transform node. 880 // ancestor of the transform node.
857 DCHECK(success); 881 DCHECK(success);
858 } 882 }
859 883
860 gfx::RectF source_clip_in_target_space = 884 gfx::RectF source_clip_in_target_space =
861 MathUtil::MapClippedRect(source_to_target, clip_node->clip); 885 MathUtil::MapClippedRect(source_to_target, clip_node->clip);
862 886
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 } 1021 }
998 1022
999 static void VerifyDrawTransformsMatch(LayerImpl* layer, 1023 static void VerifyDrawTransformsMatch(LayerImpl* layer,
1000 PropertyTrees* property_trees) { 1024 PropertyTrees* property_trees) {
1001 const int source_id = layer->transform_tree_index(); 1025 const int source_id = layer->transform_tree_index();
1002 int destination_id = FindTargetTransformTreeIndexFromEffectTree( 1026 int destination_id = FindTargetTransformTreeIndexFromEffectTree(
1003 property_trees->effect_tree, layer->effect_tree_index()); 1027 property_trees->effect_tree, layer->effect_tree_index());
1004 gfx::Transform draw_transform; 1028 gfx::Transform draw_transform;
1005 property_trees->transform_tree.ComputeTransform(source_id, destination_id, 1029 property_trees->transform_tree.ComputeTransform(source_id, destination_id,
1006 &draw_transform); 1030 &draw_transform);
1007 // We don't have to apply sublayer scale when target is root. 1031 // We don't have to apply surface contents scale when target is root.
1008 if (destination_id != 0) { 1032 if (destination_id != 0) {
1009 PostConcatSublayerScale(layer->effect_tree_index(), 1033 const EffectNode* target_effect_node = ContentsTargetEffectNode(
1010 property_trees->effect_tree, &draw_transform); 1034 layer->effect_tree_index(), property_trees->effect_tree);
1035 PostConcatSurfaceContentsScale(target_effect_node, &draw_transform);
1011 #if DCHECK_IS_ON() 1036 #if DCHECK_IS_ON()
1012 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id, 1037 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id,
1013 property_trees->effect_tree, 1038 property_trees->effect_tree,
1014 property_trees->transform_tree); 1039 property_trees->transform_tree);
1015 #endif 1040 #endif
1016 } 1041 }
1017 if (layer->should_flatten_transform_from_property_tree()) 1042 if (layer->should_flatten_transform_from_property_tree())
1018 draw_transform.FlattenTo2d(); 1043 draw_transform.FlattenTo2d();
1019 draw_transform.Translate(layer->offset_to_transform_parent().x(), 1044 draw_transform.Translate(layer->offset_to_transform_parent().x(),
1020 layer->offset_to_transform_parent().y()); 1045 layer->offset_to_transform_parent().y());
1021 DCHECK(draw_transform.ApproximatelyEqual( 1046 DCHECK(draw_transform.ApproximatelyEqual(
1022 DrawTransform(layer, property_trees->transform_tree))) 1047 DrawTransform(layer, property_trees->transform_tree)))
1023 << " layer: " << layer->id() << " source transform id: " << source_id 1048 << " layer: " << layer->id() << " source transform id: " << source_id
1024 << " destination transform id: " << destination_id 1049 << " destination transform id: " << destination_id
(...skipping 12 matching lines...) Expand all
1037 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; 1062 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
1038 property_trees->transform_tree.set_needs_update(true); 1063 property_trees->transform_tree.set_needs_update(true);
1039 } 1064 }
1040 if (property_trees->transform_tree.needs_update()) { 1065 if (property_trees->transform_tree.needs_update()) {
1041 property_trees->clip_tree.set_needs_update(true); 1066 property_trees->clip_tree.set_needs_update(true);
1042 property_trees->effect_tree.set_needs_update(true); 1067 property_trees->effect_tree.set_needs_update(true);
1043 } 1068 }
1044 UpdateRenderTarget(&property_trees->effect_tree, 1069 UpdateRenderTarget(&property_trees->effect_tree,
1045 property_trees->non_root_surfaces_enabled); 1070 property_trees->non_root_surfaces_enabled);
1046 ComputeTransforms(&property_trees->transform_tree); 1071 ComputeTransforms(&property_trees->transform_tree);
1047 // Computation of clips uses sublayer scale which is updated while computing 1072 // Computation of clips uses surface contents scale which is updated while
1048 // effects. So, ComputeEffects should be before ComputeClips. 1073 // computing effects. So, ComputeEffects should be before ComputeClips.
1049 ComputeEffects(&property_trees->effect_tree); 1074 ComputeEffects(&property_trees->effect_tree);
1050 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, 1075 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
1051 property_trees->effect_tree, can_render_to_separate_surface); 1076 property_trees->effect_tree, can_render_to_separate_surface);
1052 1077
1053 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), 1078 FindLayersThatNeedUpdates(root_layer->layer_tree_impl(),
1054 property_trees->transform_tree, 1079 property_trees->transform_tree,
1055 property_trees->effect_tree, visible_layer_list); 1080 property_trees->effect_tree, visible_layer_list);
1056 CalculateClipRects<LayerImpl>(*visible_layer_list, property_trees->clip_tree, 1081 CalculateClipRects<LayerImpl>(*visible_layer_list, property_trees->clip_tree,
1057 property_trees->transform_tree, 1082 property_trees->transform_tree,
1058 property_trees->effect_tree, 1083 property_trees->effect_tree,
1059 can_render_to_separate_surface); 1084 can_render_to_separate_surface);
1060 CalculateVisibleRects<LayerImpl>( 1085 CalculateVisibleRects<LayerImpl>(
1061 *visible_layer_list, property_trees->clip_tree, 1086 *visible_layer_list, property_trees->clip_tree,
1062 property_trees->transform_tree, property_trees->effect_tree, 1087 property_trees->transform_tree, property_trees->effect_tree,
1063 can_render_to_separate_surface); 1088 can_render_to_separate_surface);
1064 } 1089 }
1065 1090
1066 void UpdatePropertyTrees(PropertyTrees* property_trees, 1091 void UpdatePropertyTrees(PropertyTrees* property_trees,
1067 bool can_render_to_separate_surface) { 1092 bool can_render_to_separate_surface) {
1068 if (property_trees->non_root_surfaces_enabled != 1093 if (property_trees->non_root_surfaces_enabled !=
1069 can_render_to_separate_surface) { 1094 can_render_to_separate_surface) {
1070 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; 1095 property_trees->non_root_surfaces_enabled = can_render_to_separate_surface;
1071 property_trees->transform_tree.set_needs_update(true); 1096 property_trees->transform_tree.set_needs_update(true);
1072 } 1097 }
1073 if (property_trees->transform_tree.needs_update()) { 1098 if (property_trees->transform_tree.needs_update()) {
1074 property_trees->clip_tree.set_needs_update(true); 1099 property_trees->clip_tree.set_needs_update(true);
1075 property_trees->effect_tree.set_needs_update(true); 1100 property_trees->effect_tree.set_needs_update(true);
1076 } 1101 }
1077 ComputeTransforms(&property_trees->transform_tree); 1102 ComputeTransforms(&property_trees->transform_tree);
1078 // Computation of clips uses sublayer scale which is updated while computing 1103 // Computation of clips uses surface contents scale which is updated while
1079 // effects. So, ComputeEffects should be before ComputeClips. 1104 // computing effects. So, ComputeEffects should be before ComputeClips.
1080 ComputeEffects(&property_trees->effect_tree); 1105 ComputeEffects(&property_trees->effect_tree);
1081 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, 1106 ComputeClips(&property_trees->clip_tree, property_trees->transform_tree,
1082 property_trees->effect_tree, can_render_to_separate_surface); 1107 property_trees->effect_tree, can_render_to_separate_surface);
1083 } 1108 }
1084 1109
1085 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees, 1110 void ComputeVisibleRectsForTesting(PropertyTrees* property_trees,
1086 bool can_render_to_separate_surface, 1111 bool can_render_to_separate_surface,
1087 LayerList* update_layer_list) { 1112 LayerList* update_layer_list) {
1088 CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree, 1113 CalculateVisibleRects<Layer>(*update_layer_list, property_trees->clip_tree,
1089 property_trees->transform_tree, 1114 property_trees->transform_tree,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1170 !IsRootLayer(layer) && layer->has_render_surface(); 1195 !IsRootLayer(layer) && layer->has_render_surface();
1171 if (!owns_non_root_surface) { 1196 if (!owns_non_root_surface) {
1172 // If you're not the root, or you don't own a surface, you need to apply 1197 // If you're not the root, or you don't own a surface, you need to apply
1173 // your local offset. 1198 // your local offset.
1174 xform = tree.ToTarget(layer->transform_tree_index()); 1199 xform = tree.ToTarget(layer->transform_tree_index());
1175 if (layer->should_flatten_transform_from_property_tree()) 1200 if (layer->should_flatten_transform_from_property_tree())
1176 xform.FlattenTo2d(); 1201 xform.FlattenTo2d();
1177 xform.Translate(layer->offset_to_transform_parent().x(), 1202 xform.Translate(layer->offset_to_transform_parent().x(),
1178 layer->offset_to_transform_parent().y()); 1203 layer->offset_to_transform_parent().y());
1179 } else { 1204 } else {
1180 // Surfaces need to apply their sublayer scale. 1205 // Surfaces need to apply their surface contents scale.
1181 xform.Scale(node->sublayer_scale.x(), node->sublayer_scale.y()); 1206 xform.Scale(node->surface_contents_scale.x(),
1207 node->surface_contents_scale.y());
1182 } 1208 }
1183 return xform; 1209 return xform;
1184 } 1210 }
1185 1211
1186 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, 1212 static void SetSurfaceDrawTransform(const TransformTree& transform_tree,
1187 const EffectTree& effect_tree, 1213 const EffectTree& effect_tree,
1188 RenderSurfaceImpl* render_surface) { 1214 RenderSurfaceImpl* render_surface) {
1189 const TransformNode* transform_node = 1215 const TransformNode* transform_node =
1190 transform_tree.Node(render_surface->TransformTreeIndex()); 1216 transform_tree.Node(render_surface->TransformTreeIndex());
1191 const EffectNode* effect_node = 1217 const EffectNode* effect_node =
1192 effect_tree.Node(render_surface->EffectTreeIndex()); 1218 effect_tree.Node(render_surface->EffectTreeIndex());
1193 // The draw transform of root render surface is identity tranform. 1219 // The draw transform of root render surface is identity tranform.
1194 if (transform_node->id == 1) { 1220 if (transform_node->id == 1) {
1195 render_surface->SetDrawTransform(gfx::Transform()); 1221 render_surface->SetDrawTransform(gfx::Transform());
1196 return; 1222 return;
1197 } 1223 }
1198 1224
1199 gfx::Transform render_surface_transform; 1225 gfx::Transform render_surface_transform;
1200 const TransformNode* target_transform_node = 1226 const TransformNode* target_transform_node =
1201 transform_tree.Node(transform_tree.TargetId(transform_node->id)); 1227 transform_tree.Node(transform_tree.TargetId(transform_node->id));
1202 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, 1228 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id,
1203 &render_surface_transform); 1229 &render_surface_transform);
1204 // We don't have to apply sublayer scale when target is root. 1230 // We don't have to apply surface contents scale when target is root.
1205 if (target_transform_node->id != 0) { 1231 if (target_transform_node->id != 0) {
1206 PostConcatSublayerScale(effect_node->target_id, effect_tree, 1232 const EffectNode* target_effect_node =
1207 &render_surface_transform); 1233 effect_tree.Node(effect_node->target_id);
1234 PostConcatSurfaceContentsScale(target_effect_node,
1235 &render_surface_transform);
1208 #if DCHECK_IS_ON() 1236 #if DCHECK_IS_ON()
1209 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id, 1237 VerifySurfaceContentsScalesMatch(effect_node->target_id,
1210 effect_tree, transform_tree); 1238 target_transform_node->id, effect_tree,
1239 transform_tree);
1211 #endif 1240 #endif
1212 } 1241 }
1213 1242
1214 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale); 1243 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
1215 if (effect_node->sublayer_scale.x() != 0.0 && 1244 #if DCHECK_IS_ON()
1216 effect_node->sublayer_scale.y() != 0.0) 1245 VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id,
1217 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(), 1246 effect_tree, transform_tree);
1218 1.0 / effect_node->sublayer_scale.y()); 1247 #endif
1219 render_surface->SetDrawTransform(render_surface_transform); 1248 render_surface->SetDrawTransform(render_surface_transform);
1220 } 1249 }
1221 1250
1222 static void SetSurfaceIsClipped(const ClipNode* clip_node, 1251 static void SetSurfaceIsClipped(const ClipNode* clip_node,
1223 RenderSurfaceImpl* render_surface) { 1252 RenderSurfaceImpl* render_surface) {
1224 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) 1253 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id)
1225 << "we now create clip node for every render surface"; 1254 << "we now create clip node for every render surface";
1226 1255
1227 render_surface->SetIsClipped(clip_node->target_is_clipped); 1256 render_surface->SetIsClipped(clip_node->target_is_clipped);
1228 } 1257 }
(...skipping 23 matching lines...) Expand all
1252 const bool success = transform_tree.ComputeTransform( 1281 const bool success = transform_tree.ComputeTransform(
1253 parent_clip_node->target_transform_id, 1282 parent_clip_node->target_transform_id,
1254 transform_tree.TargetId(transform_node->id), 1283 transform_tree.TargetId(transform_node->id),
1255 &clip_parent_target_to_target); 1284 &clip_parent_target_to_target);
1256 1285
1257 if (!success) { 1286 if (!success) {
1258 render_surface->SetClipRect(gfx::Rect()); 1287 render_surface->SetClipRect(gfx::Rect());
1259 return; 1288 return;
1260 } 1289 }
1261 1290
1262 // We don't have to apply sublayer scale when target is root. 1291 // We don't have to apply surface contents scale when target is root.
1263 if (transform_tree.TargetId(transform_node->id) != 0) { 1292 if (transform_tree.TargetId(transform_node->id) != 0) {
1264 PostConcatSublayerScale(render_surface->EffectTreeIndex(), effect_tree, 1293 const EffectNode* effect_node =
1265 &clip_parent_target_to_target); 1294 effect_tree.Node(render_surface->EffectTreeIndex());
1295 PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target);
1266 #if DCHECK_IS_ON() 1296 #if DCHECK_IS_ON()
1267 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(), 1297 VerifySurfaceContentsScalesMatch(
1268 transform_tree.TargetId(transform_node->id), 1298 render_surface->EffectTreeIndex(),
1269 effect_tree, transform_tree); 1299 transform_tree.TargetId(transform_node->id), effect_tree,
1300 transform_tree);
1270 #endif 1301 #endif
1271 } 1302 }
1272 1303
1273 DCHECK_LT(parent_clip_node->target_transform_id, 1304 DCHECK_LT(parent_clip_node->target_transform_id,
1274 transform_tree.TargetId(transform_node->id)); 1305 transform_tree.TargetId(transform_node->id));
1275 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 1306 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
1276 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); 1307 clip_parent_target_to_target, parent_clip_node->clip_in_target_space)));
1277 } 1308 }
1278 1309
1279 template <typename LayerType> 1310 template <typename LayerType>
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1341 1372
1342 static gfx::Transform ReplicaToSurfaceTransform( 1373 static gfx::Transform ReplicaToSurfaceTransform(
1343 const RenderSurfaceImpl* render_surface, 1374 const RenderSurfaceImpl* render_surface,
1344 const TransformTree& tree) { 1375 const TransformTree& tree) {
1345 gfx::Transform replica_to_surface; 1376 gfx::Transform replica_to_surface;
1346 if (!render_surface->HasReplica()) 1377 if (!render_surface->HasReplica())
1347 return replica_to_surface; 1378 return replica_to_surface;
1348 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); 1379 const LayerImpl* replica_layer = render_surface->ReplicaLayer();
1349 const TransformNode* surface_transform_node = 1380 const TransformNode* surface_transform_node =
1350 tree.Node(render_surface->TransformTreeIndex()); 1381 tree.Node(render_surface->TransformTreeIndex());
1351 replica_to_surface.Scale(surface_transform_node->sublayer_scale.x(), 1382 replica_to_surface.Scale(surface_transform_node->surface_contents_scale.x(),
1352 surface_transform_node->sublayer_scale.y()); 1383 surface_transform_node->surface_contents_scale.y());
1353 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), 1384 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(),
1354 replica_layer->offset_to_transform_parent().y()); 1385 replica_layer->offset_to_transform_parent().y());
1355 gfx::Transform replica_transform_node_to_surface; 1386 gfx::Transform replica_transform_node_to_surface;
1356 tree.ComputeTransform(replica_layer->transform_tree_index(), 1387 tree.ComputeTransform(replica_layer->transform_tree_index(),
1357 render_surface->TransformTreeIndex(), 1388 render_surface->TransformTreeIndex(),
1358 &replica_transform_node_to_surface); 1389 &replica_transform_node_to_surface);
1359 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); 1390 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface);
1360 if (surface_transform_node->sublayer_scale.x() != 0 && 1391 if (surface_transform_node->surface_contents_scale.x() != 0 &&
1361 surface_transform_node->sublayer_scale.y() != 0) { 1392 surface_transform_node->surface_contents_scale.y() != 0) {
1362 replica_to_surface.Scale(1.0 / surface_transform_node->sublayer_scale.x(), 1393 replica_to_surface.Scale(
1363 1.0 / surface_transform_node->sublayer_scale.y()); 1394 1.0 / surface_transform_node->surface_contents_scale.x(),
1395 1.0 / surface_transform_node->surface_contents_scale.y());
1364 } 1396 }
1365 return replica_to_surface; 1397 return replica_to_surface;
1366 } 1398 }
1367 1399
1368 void ComputeLayerDrawProperties(LayerImpl* layer, 1400 void ComputeLayerDrawProperties(LayerImpl* layer,
1369 const PropertyTrees* property_trees) { 1401 const PropertyTrees* property_trees) {
1370 const TransformNode* transform_node = 1402 const TransformNode* transform_node =
1371 property_trees->transform_tree.Node(layer->transform_tree_index()); 1403 property_trees->transform_tree.Node(layer->transform_tree_index());
1372 const ClipNode* clip_node = 1404 const ClipNode* clip_node =
1373 property_trees->clip_tree.Node(layer->clip_tree_index()); 1405 property_trees->clip_tree.Node(layer->clip_tree_index());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees, 1446 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees,
1415 RenderSurfaceImpl* render_surface) { 1447 RenderSurfaceImpl* render_surface) {
1416 const ClipNode* clip_node = 1448 const ClipNode* clip_node =
1417 property_trees->clip_tree.Node(render_surface->ClipTreeIndex()); 1449 property_trees->clip_tree.Node(render_surface->ClipTreeIndex());
1418 1450
1419 SetSurfaceIsClipped(clip_node, render_surface); 1451 SetSurfaceIsClipped(clip_node, render_surface);
1420 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); 1452 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface);
1421 SetSurfaceDrawTransform(property_trees->transform_tree, 1453 SetSurfaceDrawTransform(property_trees->transform_tree,
1422 property_trees->effect_tree, render_surface); 1454 property_trees->effect_tree, render_surface);
1423 render_surface->SetScreenSpaceTransform( 1455 render_surface->SetScreenSpaceTransform(
1424 property_trees->transform_tree.ToScreenSpaceTransformWithoutSublayerScale( 1456 property_trees->transform_tree
1425 render_surface->TransformTreeIndex())); 1457 .ToScreenSpaceTransformWithoutSurfaceContentsScale(
1458 render_surface->TransformTreeIndex()));
1426 1459
1427 if (render_surface->HasReplica()) { 1460 if (render_surface->HasReplica()) {
1428 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( 1461 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform(
1429 render_surface, property_trees->transform_tree); 1462 render_surface, property_trees->transform_tree);
1430 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * 1463 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() *
1431 replica_to_surface); 1464 replica_to_surface);
1432 render_surface->SetReplicaScreenSpaceTransform( 1465 render_surface->SetReplicaScreenSpaceTransform(
1433 render_surface->screen_space_transform() * replica_to_surface); 1466 render_surface->screen_space_transform() * replica_to_surface);
1434 } else { 1467 } else {
1435 render_surface->SetReplicaDrawTransform(gfx::Transform()); 1468 render_surface->SetReplicaDrawTransform(gfx::Transform());
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1536 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1569 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1537 const Layer* overscroll_elasticity_layer, 1570 const Layer* overscroll_elasticity_layer,
1538 const gfx::Vector2dF& elastic_overscroll) { 1571 const gfx::Vector2dF& elastic_overscroll) {
1539 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1572 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1540 elastic_overscroll); 1573 elastic_overscroll);
1541 } 1574 }
1542 1575
1543 } // namespace draw_property_utils 1576 } // namespace draw_property_utils
1544 1577
1545 } // namespace cc 1578 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/draw_property_utils.h ('k') | cc/trees/effect_node.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698