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

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

Issue 2464103005: cc : Reland Move screen space scale factor to root transform node (Closed)
Patch Set: Reland patch Created 4 years, 1 month 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 | « no previous file | cc/trees/effect_node.cc » ('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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 for_visible_rect_calculation ? clip_node->combined_clip_in_target_space 102 for_visible_rect_calculation ? clip_node->combined_clip_in_target_space
103 : clip_node->clip_in_target_space; 103 : clip_node->clip_in_target_space;
104 104
105 if (clip_node->target_transform_id > target_node_id) { 105 if (clip_node->target_transform_id > target_node_id) {
106 // In this case, layer has a scroll parent. We need to keep the scale 106 // In this case, layer has a scroll parent. We need to keep the scale
107 // at the layer's target but remove the scale at the scroll parent's 107 // at the layer's target but remove the scale at the scroll parent's
108 // target. 108 // target.
109 if (property_trees->ComputeTransformToTarget(clip_node->target_transform_id, 109 if (property_trees->ComputeTransformToTarget(clip_node->target_transform_id,
110 target_effect_node->id, 110 target_effect_node->id,
111 &clip_to_target)) { 111 &clip_to_target)) {
112 // We don't have to apply surface contents scale when target is root. 112 PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target);
113 if (target_effect_node->id != EffectTree::kContentsRootNodeId) {
114 PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target);
115 #if DCHECK_IS_ON() 113 #if DCHECK_IS_ON()
116 const TransformTree& transform_tree = property_trees->transform_tree; 114 const TransformTree& transform_tree = property_trees->transform_tree;
117 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), 115 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(),
118 target_node_id, effect_tree, 116 target_node_id, effect_tree,
119 transform_tree); 117 transform_tree);
120 #endif 118 #endif
121 }
122 119
123 const EffectNode* source_node = 120 const EffectNode* source_node =
124 effect_tree.Node(clip_node->target_effect_id); 121 effect_tree.Node(clip_node->target_effect_id);
125 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target); 122 ConcatInverseSurfaceContentsScale(source_node, &clip_to_target);
126 #if DCHECK_IS_ON() 123 #if DCHECK_IS_ON()
127 const TransformTree& transform_tree = property_trees->transform_tree;
128 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, 124 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
129 clip_node->target_transform_id, 125 clip_node->target_transform_id,
130 effect_tree, transform_tree); 126 effect_tree, transform_tree);
131 #endif 127 #endif
132 *clip_rect_in_target_space = 128 *clip_rect_in_target_space =
133 MathUtil::MapClippedRect(clip_to_target, clip_from_clip_node); 129 MathUtil::MapClippedRect(clip_to_target, clip_from_clip_node);
134 } else { 130 } else {
135 return false; 131 return false;
136 } 132 }
137 } else { 133 } else {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 } 172 }
177 173
178 static ConditionalClip ComputeLocalRectInTargetSpace( 174 static ConditionalClip ComputeLocalRectInTargetSpace(
179 gfx::RectF rect, 175 gfx::RectF rect,
180 const PropertyTrees* property_trees, 176 const PropertyTrees* property_trees,
181 int current_transform_id, 177 int current_transform_id,
182 int target_transform_id, 178 int target_transform_id,
183 int target_effect_id) { 179 int target_effect_id) {
184 gfx::Transform current_to_target; 180 gfx::Transform current_to_target;
185 if (!property_trees->ComputeTransformToTarget( 181 if (!property_trees->ComputeTransformToTarget(
186 current_transform_id, target_effect_id, &current_to_target)) 182 current_transform_id, target_effect_id, &current_to_target)) {
187 // If transform is not invertible, cannot apply clip. 183 // If transform is not invertible, cannot apply clip.
188 return ConditionalClip{false, gfx::RectF()}; 184 return ConditionalClip{false, gfx::RectF()};
189 // We don't have to apply surface contents scale when target is root. 185 }
190 if (target_effect_id != EffectTree::kContentsRootNodeId) { 186 const EffectTree& effect_tree = property_trees->effect_tree;
191 const EffectTree& effect_tree = property_trees->effect_tree; 187 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id);
192 const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); 188 PostConcatSurfaceContentsScale(target_effect_node, &current_to_target);
193 PostConcatSurfaceContentsScale(target_effect_node, &current_to_target);
194 #if DCHECK_IS_ON() 189 #if DCHECK_IS_ON()
195 const TransformTree& transform_tree = property_trees->transform_tree; 190 const TransformTree& transform_tree = property_trees->transform_tree;
196 VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id, 191 VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id,
197 effect_tree, transform_tree); 192 effect_tree, transform_tree);
198 #endif 193 #endif
199 }
200 194
201 if (current_transform_id > target_transform_id) 195 if (current_transform_id > target_transform_id)
202 return ConditionalClip{true, // is_clipped. 196 return ConditionalClip{true, // is_clipped.
203 MathUtil::MapClippedRect(current_to_target, rect)}; 197 MathUtil::MapClippedRect(current_to_target, rect)};
204 198
205 return ConditionalClip{true, // is_clipped. 199 return ConditionalClip{true, // is_clipped.
206 MathUtil::ProjectClippedRect(current_to_target, rect)}; 200 MathUtil::ProjectClippedRect(current_to_target, rect)};
207 } 201 }
208 202
209 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, 203 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node,
210 const PropertyTrees* property_trees, 204 const PropertyTrees* property_trees,
211 int target_transform_id, 205 int target_transform_id,
212 int target_effect_id) { 206 int target_effect_id) {
213 if (clip_node->transform_id != target_transform_id) 207 if (clip_node->transform_id != target_transform_id)
214 return ComputeLocalRectInTargetSpace(clip_node->clip, property_trees, 208 return ComputeLocalRectInTargetSpace(clip_node->clip, property_trees,
215 clip_node->transform_id, 209 clip_node->transform_id,
216 target_transform_id, target_effect_id); 210 target_transform_id, target_effect_id);
217 211
218 const EffectTree& effect_tree = property_trees->effect_tree; 212 const EffectTree& effect_tree = property_trees->effect_tree;
219 gfx::RectF current_clip = clip_node->clip; 213 gfx::RectF current_clip = clip_node->clip;
220 gfx::Vector2dF surface_contents_scale = 214 gfx::Vector2dF surface_contents_scale =
221 effect_tree.Node(target_effect_id)->surface_contents_scale; 215 effect_tree.Node(target_effect_id)->surface_contents_scale;
222 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0) 216 // The viewport clip should not be scaled
217 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0 &&
218 clip_node->transform_id != TransformTree::kRootNodeId)
223 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y()); 219 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y());
224 return ConditionalClip{true /* is_clipped */, current_clip}; 220 return ConditionalClip{true /* is_clipped */, current_clip};
225 } 221 }
226 222
227 static ConditionalClip ComputeAccumulatedClip( 223 static ConditionalClip ComputeAccumulatedClip(
228 const PropertyTrees* property_trees, 224 const PropertyTrees* property_trees,
229 int local_clip_id, 225 int local_clip_id,
230 int target_id) { 226 int target_id) {
231 const ClipTree& clip_tree = property_trees->clip_tree; 227 const ClipTree& clip_tree = property_trees->clip_tree;
232 const EffectTree& effect_tree = property_trees->effect_tree; 228 const EffectTree& effect_tree = property_trees->effect_tree;
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); 529 ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree);
534 bool success = property_trees->ComputeTransformFromTarget( 530 bool success = property_trees->ComputeTransformFromTarget(
535 transform_node->id, target_effect_node->id, &target_to_layer); 531 transform_node->id, target_effect_node->id, &target_to_layer);
536 if (!success) { 532 if (!success) {
537 // An animated singular transform may become non-singular during the 533 // An animated singular transform may become non-singular during the
538 // animation, so we still need to compute a visible rect. In this 534 // animation, so we still need to compute a visible rect. In this
539 // situation, we treat the entire layer as visible. 535 // situation, we treat the entire layer as visible.
540 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 536 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
541 continue; 537 continue;
542 } 538 }
543 if (target_effect_node->id > EffectTree::kContentsRootNodeId) { 539 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer);
544 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer);
545 #if DCHECK_IS_ON() 540 #if DCHECK_IS_ON()
546 VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id, 541 VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id,
547 effect_tree, transform_tree); 542 effect_tree, transform_tree);
548 #endif 543 #endif
549 }
550 } 544 }
551 gfx::Transform target_to_content; 545 gfx::Transform target_to_content;
552 target_to_content.Translate(-layer->offset_to_transform_parent().x(), 546 target_to_content.Translate(-layer->offset_to_transform_parent().x(),
553 -layer->offset_to_transform_parent().y()); 547 -layer->offset_to_transform_parent().y());
554 target_to_content.PreconcatTransform(target_to_layer); 548 target_to_content.PreconcatTransform(target_to_layer);
555 549
556 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 550 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
557 target_to_content, combined_clip_rect_in_target_space)); 551 target_to_content, combined_clip_rect_in_target_space));
558 visible_rect.Intersect(gfx::Rect(layer_bounds)); 552 visible_rect.Intersect(gfx::Rect(layer_bounds));
559 layer->set_visible_layer_rect(visible_rect); 553 layer->set_visible_layer_rect(visible_rect);
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 gfx::RectF parent_combined_clip_in_target_space = 812 gfx::RectF parent_combined_clip_in_target_space =
819 parent_clip_node->combined_clip_in_target_space; 813 parent_clip_node->combined_clip_in_target_space;
820 gfx::RectF parent_clip_in_target_space = 814 gfx::RectF parent_clip_in_target_space =
821 parent_clip_node->clip_in_target_space; 815 parent_clip_node->clip_in_target_space;
822 if (parent_target_transform_node && 816 if (parent_target_transform_node &&
823 parent_target_transform_node->id != clip_node->target_transform_id && 817 parent_target_transform_node->id != clip_node->target_transform_id &&
824 non_root_surfaces_enabled) { 818 non_root_surfaces_enabled) {
825 success &= property_trees->ComputeTransformFromTarget( 819 success &= property_trees->ComputeTransformFromTarget(
826 clip_node->target_transform_id, parent_clip_node->target_effect_id, 820 clip_node->target_transform_id, parent_clip_node->target_effect_id,
827 &parent_to_current); 821 &parent_to_current);
828 // We don't have to apply surface contents scale when target is root. 822 const EffectNode* target_effect_node =
829 if (clip_node->target_effect_id != EffectTree::kContentsRootNodeId) { 823 effect_tree.Node(clip_node->target_effect_id);
830 const EffectNode* target_effect_node = 824 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current);
831 effect_tree.Node(clip_node->target_effect_id);
832 PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current);
833 #if DCHECK_IS_ON() 825 #if DCHECK_IS_ON()
834 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, 826 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
835 clip_node->target_transform_id, 827 clip_node->target_transform_id,
836 effect_tree, transform_tree); 828 effect_tree, transform_tree);
837 #endif 829 #endif
838 } 830 const EffectNode* parent_target_effect_node =
839 if (parent_clip_node->target_effect_id != 831 effect_tree.Node(parent_clip_node->target_effect_id);
840 EffectTree::kContentsRootNodeId) { 832 ConcatInverseSurfaceContentsScale(parent_target_effect_node,
841 const EffectNode* parent_target_effect_node = 833 &parent_to_current);
842 effect_tree.Node(parent_clip_node->target_effect_id);
843 ConcatInverseSurfaceContentsScale(parent_target_effect_node,
844 &parent_to_current);
845 #if DCHECK_IS_ON() 834 #if DCHECK_IS_ON()
846 VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id, 835 VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id,
847 parent_clip_node->target_transform_id, 836 parent_clip_node->target_transform_id,
848 effect_tree, transform_tree); 837 effect_tree, transform_tree);
849 #endif 838 #endif
850 }
851 // If we can't compute a transform, it's because we had to use the inverse 839 // If we can't compute a transform, it's because we had to use the inverse
852 // of a singular transform. We won't draw in this case, so there's no need 840 // of a singular transform. We won't draw in this case, so there's no need
853 // to compute clips. 841 // to compute clips.
854 if (!success) 842 if (!success)
855 continue; 843 continue;
856 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( 844 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect(
857 parent_to_current, parent_clip_node->combined_clip_in_target_space); 845 parent_to_current, parent_clip_node->combined_clip_in_target_space);
858 parent_clip_in_target_space = MathUtil::ProjectClippedRect( 846 parent_clip_in_target_space = MathUtil::ProjectClippedRect(
859 parent_to_current, parent_clip_node->clip_in_target_space); 847 parent_to_current, parent_clip_node->clip_in_target_space);
860 } 848 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 890
903 if (!non_root_surfaces_enabled) { 891 if (!non_root_surfaces_enabled) {
904 source_to_target = transform_tree.ToScreen(clip_node->transform_id); 892 source_to_target = transform_tree.ToScreen(clip_node->transform_id);
905 } else if (transform_tree.ContentTargetId(transform_node->id) == 893 } else if (transform_tree.ContentTargetId(transform_node->id) ==
906 clip_node->target_transform_id) { 894 clip_node->target_transform_id) {
907 source_to_target = transform_tree.ToTarget(clip_node->transform_id, 895 source_to_target = transform_tree.ToTarget(clip_node->transform_id,
908 clip_node->target_effect_id); 896 clip_node->target_effect_id);
909 } else { 897 } else {
910 success = property_trees->ComputeTransformToTarget( 898 success = property_trees->ComputeTransformToTarget(
911 transform_node->id, clip_node->target_effect_id, &source_to_target); 899 transform_node->id, clip_node->target_effect_id, &source_to_target);
912 // We don't have to apply surface contents scale when target is root. 900 const EffectNode* target_effect_node =
913 if (clip_node->target_effect_id != EffectTree::kContentsRootNodeId) { 901 effect_tree.Node(clip_node->target_effect_id);
914 const EffectNode* target_effect_node = 902 PostConcatSurfaceContentsScale(target_effect_node, &source_to_target);
915 effect_tree.Node(clip_node->target_effect_id);
916 PostConcatSurfaceContentsScale(target_effect_node, &source_to_target);
917 #if DCHECK_IS_ON() 903 #if DCHECK_IS_ON()
918 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, 904 VerifySurfaceContentsScalesMatch(clip_node->target_effect_id,
919 clip_node->target_transform_id, 905 clip_node->target_transform_id,
920 effect_tree, transform_tree); 906 effect_tree, transform_tree);
921 #endif 907 #endif
922 }
923 // source_to_target computation should be successful as target is an 908 // source_to_target computation should be successful as target is an
924 // ancestor of the transform node. 909 // ancestor of the transform node.
925 DCHECK(success); 910 DCHECK(success);
926 } 911 }
927 912
928 gfx::RectF source_clip_in_target_space = 913 gfx::RectF source_clip_in_target_space =
929 MathUtil::MapClippedRect(source_to_target, clip_node->clip); 914 MathUtil::MapClippedRect(source_to_target, clip_node->clip);
930 915
931 // With surfaces disabled, the only case where we use only the local clip 916 // With surfaces disabled, the only case where we use only the local clip
932 // for layer clipping is the case where no non-viewport ancestor node 917 // for layer clipping is the case where no non-viewport ancestor node
(...skipping 24 matching lines...) Expand all
957 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) 942 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i)
958 transform_tree->UpdateTransforms(i); 943 transform_tree->UpdateTransforms(i);
959 transform_tree->set_needs_update(false); 944 transform_tree->set_needs_update(false);
960 } 945 }
961 946
962 void UpdateRenderTarget(EffectTree* effect_tree, 947 void UpdateRenderTarget(EffectTree* effect_tree,
963 bool can_render_to_separate_surface) { 948 bool can_render_to_separate_surface) {
964 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { 949 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) {
965 EffectNode* node = effect_tree->Node(i); 950 EffectNode* node = effect_tree->Node(i);
966 if (i == 1) { 951 if (i == 1) {
967 // Render target on the first effect node is root. 952 // Render target on the node corresponding to root is itself.
968 node->target_id = 0; 953 node->target_id = 1;
969 } else if (!can_render_to_separate_surface) { 954 } else if (!can_render_to_separate_surface) {
970 node->target_id = 1; 955 node->target_id = 1;
971 } else if (effect_tree->parent(node)->has_render_surface) { 956 } else if (effect_tree->parent(node)->has_render_surface) {
972 node->target_id = node->parent_id; 957 node->target_id = node->parent_id;
973 } else { 958 } else {
974 node->target_id = effect_tree->parent(node)->target_id; 959 node->target_id = effect_tree->parent(node)->target_id;
975 } 960 }
976 } 961 }
977 } 962 }
978 963
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 static void VerifyDrawTransformsMatch(LayerImpl* layer, 1048 static void VerifyDrawTransformsMatch(LayerImpl* layer,
1064 PropertyTrees* property_trees) { 1049 PropertyTrees* property_trees) {
1065 const int source_id = layer->transform_tree_index(); 1050 const int source_id = layer->transform_tree_index();
1066 int destination_id = FindTargetTransformTreeIndexFromEffectTree( 1051 int destination_id = FindTargetTransformTreeIndexFromEffectTree(
1067 property_trees->effect_tree, layer->effect_tree_index()); 1052 property_trees->effect_tree, layer->effect_tree_index());
1068 const EffectNode* target_effect_node = ContentsTargetEffectNode( 1053 const EffectNode* target_effect_node = ContentsTargetEffectNode(
1069 layer->effect_tree_index(), property_trees->effect_tree); 1054 layer->effect_tree_index(), property_trees->effect_tree);
1070 gfx::Transform draw_transform; 1055 gfx::Transform draw_transform;
1071 property_trees->ComputeTransformToTarget(source_id, target_effect_node->id, 1056 property_trees->ComputeTransformToTarget(source_id, target_effect_node->id,
1072 &draw_transform); 1057 &draw_transform);
1073 // We don't have to apply surface contents scale when target is root. 1058 PostConcatSurfaceContentsScale(target_effect_node, &draw_transform);
1074 if (target_effect_node->id != EffectTree::kContentsRootNodeId) {
1075 PostConcatSurfaceContentsScale(target_effect_node, &draw_transform);
1076 #if DCHECK_IS_ON() 1059 #if DCHECK_IS_ON()
1077 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, 1060 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id,
1078 property_trees->effect_tree, 1061 property_trees->effect_tree,
1079 property_trees->transform_tree); 1062 property_trees->transform_tree);
1080 #endif 1063 #endif
1081 }
1082 if (layer->should_flatten_transform_from_property_tree()) 1064 if (layer->should_flatten_transform_from_property_tree())
1083 draw_transform.FlattenTo2d(); 1065 draw_transform.FlattenTo2d();
1084 draw_transform.Translate(layer->offset_to_transform_parent().x(), 1066 draw_transform.Translate(layer->offset_to_transform_parent().x(),
1085 layer->offset_to_transform_parent().y()); 1067 layer->offset_to_transform_parent().y());
1086 DCHECK(draw_transform.ApproximatelyEqual(DrawTransform( 1068 DCHECK(draw_transform.ApproximatelyEqual(DrawTransform(
1087 layer, property_trees->transform_tree, property_trees->effect_tree))) 1069 layer, property_trees->transform_tree, property_trees->effect_tree)))
1088 << " layer: " << layer->id() << " source transform id: " << source_id 1070 << " layer: " << layer->id() << " source transform id: " << source_id
1089 << " destination transform id: " << destination_id 1071 << " destination transform id: " << destination_id
1090 << " draw transform from transform tree: " 1072 << " draw transform from transform tree: "
1091 << DrawTransform(layer, property_trees->transform_tree, 1073 << DrawTransform(layer, property_trees->transform_tree,
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 if (transform_node->id == 1) { 1295 if (transform_node->id == 1) {
1314 render_surface->SetDrawTransform(gfx::Transform()); 1296 render_surface->SetDrawTransform(gfx::Transform());
1315 return; 1297 return;
1316 } 1298 }
1317 1299
1318 gfx::Transform render_surface_transform; 1300 gfx::Transform render_surface_transform;
1319 const EffectNode* target_effect_node = 1301 const EffectNode* target_effect_node =
1320 effect_tree.Node(effect_node->target_id); 1302 effect_tree.Node(effect_node->target_id);
1321 property_trees->ComputeTransformToTarget( 1303 property_trees->ComputeTransformToTarget(
1322 transform_node->id, target_effect_node->id, &render_surface_transform); 1304 transform_node->id, target_effect_node->id, &render_surface_transform);
1323 // We don't have to apply surface contents scale when target is root. 1305 PostConcatSurfaceContentsScale(target_effect_node, &render_surface_transform);
1324 if (effect_node->target_id != EffectTree::kContentsRootNodeId) {
1325 PostConcatSurfaceContentsScale(target_effect_node,
1326 &render_surface_transform);
1327 #if DCHECK_IS_ON() 1306 #if DCHECK_IS_ON()
1328 const TransformNode* target_transform_node = 1307 const TransformNode* target_transform_node =
1329 transform_tree.Node(transform_tree.TargetId(transform_node->id)); 1308 transform_tree.Node(transform_tree.TargetId(transform_node->id));
1330 VerifySurfaceContentsScalesMatch(effect_node->target_id, 1309 VerifySurfaceContentsScalesMatch(effect_node->target_id,
1331 target_transform_node->id, effect_tree, 1310 target_transform_node->id, effect_tree,
1332 transform_tree); 1311 transform_tree);
1333 #endif 1312 #endif
1334 }
1335 1313
1336 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform); 1314 ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform);
1337 #if DCHECK_IS_ON() 1315 #if DCHECK_IS_ON()
1338 VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id, 1316 VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id,
1339 effect_tree, transform_tree); 1317 effect_tree, transform_tree);
1340 #endif 1318 #endif
1341 render_surface->SetDrawTransform(render_surface_transform); 1319 render_surface->SetDrawTransform(render_surface_transform);
1342 } 1320 }
1343 1321
1344 static void SetSurfaceIsClipped(const ClipNode* clip_node, 1322 static void SetSurfaceIsClipped(const ClipNode* clip_node,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1377 int target_effect_id = effect_node->target_id; 1355 int target_effect_id = effect_node->target_id;
1378 const bool success = property_trees->ComputeTransformToTarget( 1356 const bool success = property_trees->ComputeTransformToTarget(
1379 parent_clip_node->target_transform_id, target_effect_id, 1357 parent_clip_node->target_transform_id, target_effect_id,
1380 &clip_parent_target_to_target); 1358 &clip_parent_target_to_target);
1381 1359
1382 if (!success) { 1360 if (!success) {
1383 render_surface->SetClipRect(gfx::Rect()); 1361 render_surface->SetClipRect(gfx::Rect());
1384 return; 1362 return;
1385 } 1363 }
1386 1364
1387 // We don't have to apply surface contents scale when target is root. 1365 PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target);
1388 if (render_surface->EffectTreeIndex() != EffectTree::kContentsRootNodeId) {
1389 const EffectNode* effect_node =
1390 effect_tree.Node(render_surface->EffectTreeIndex());
1391 PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target);
1392 #if DCHECK_IS_ON() 1366 #if DCHECK_IS_ON()
1393 VerifySurfaceContentsScalesMatch( 1367 VerifySurfaceContentsScalesMatch(render_surface->EffectTreeIndex(),
1394 render_surface->EffectTreeIndex(), 1368 transform_tree.TargetId(transform_node->id),
1395 transform_tree.TargetId(transform_node->id), effect_tree, 1369 effect_tree, transform_tree);
1396 transform_tree);
1397 #endif 1370 #endif
1398 }
1399 1371
1400 DCHECK_LT(parent_clip_node->target_transform_id, 1372 DCHECK_LT(parent_clip_node->target_transform_id,
1401 transform_tree.TargetId(transform_node->id)); 1373 transform_tree.TargetId(transform_node->id));
1402 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 1374 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
1403 clip_parent_target_to_target, parent_clip_node->clip_in_target_space))); 1375 clip_parent_target_to_target, parent_clip_node->clip_in_target_space)));
1404 } 1376 }
1405 1377
1406 template <typename LayerType> 1378 template <typename LayerType>
1407 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer, 1379 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
1408 const TransformTree& tree) { 1380 const TransformTree& tree) {
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
1620 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1592 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1621 const Layer* overscroll_elasticity_layer, 1593 const Layer* overscroll_elasticity_layer,
1622 const gfx::Vector2dF& elastic_overscroll) { 1594 const gfx::Vector2dF& elastic_overscroll) {
1623 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1595 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1624 elastic_overscroll); 1596 elastic_overscroll);
1625 } 1597 }
1626 1598
1627 } // namespace draw_property_utils 1599 } // namespace draw_property_utils
1628 1600
1629 } // namespace cc 1601 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/trees/effect_node.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698