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

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

Issue 2117853004: cc: Compute sublayer scale from effect tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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/proto/property_tree.proto ('k') | cc/trees/property_tree.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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 DCHECK_EQ(effect_node->data.replica_layer_id, -1) << "layer: " << layer->id(); 50 DCHECK_EQ(effect_node->data.replica_layer_id, -1) << "layer: " << layer->id();
51 DCHECK(effect_node->data.background_filters.IsEmpty()); 51 DCHECK(effect_node->data.background_filters.IsEmpty());
52 } 52 }
53 53
54 #endif 54 #endif
55 55
56 template <typename LayerType> 56 template <typename LayerType>
57 bool ComputeClipRectInTargetSpace(const LayerType* layer, 57 bool ComputeClipRectInTargetSpace(const LayerType* layer,
58 const ClipNode* clip_node, 58 const ClipNode* clip_node,
59 const TransformTree& transform_tree, 59 const TransformTree& transform_tree,
60 const EffectTree& effect_tree,
60 int target_node_id, 61 int target_node_id,
61 gfx::RectF* clip_rect_in_target_space) { 62 gfx::RectF* clip_rect_in_target_space) {
62 DCHECK(layer->clip_tree_index() == clip_node->id); 63 DCHECK(layer->clip_tree_index() == clip_node->id);
63 DCHECK(clip_node->data.target_id != target_node_id); 64 DCHECK(clip_node->data.target_id != target_node_id);
64 65
65 gfx::Transform clip_to_target; 66 gfx::Transform clip_to_target;
66 if (clip_node->data.target_id > target_node_id) { 67 if (clip_node->data.target_id > target_node_id) {
67 // In this case, layer has a scroll parent. We need to keep the scale 68 // In this case, layer has a scroll parent. We need to keep the scale
68 // at the layer's target but remove the scale at the scroll parent's 69 // at the layer's target but remove the scale at the scroll parent's
69 // target. 70 // target.
70 if (transform_tree.ComputeTransformWithDestinationSublayerScale( 71 if (transform_tree.ComputeTransform(clip_node->data.target_id,
71 clip_node->data.target_id, target_node_id, &clip_to_target)) { 72 target_node_id, &clip_to_target)) {
73 if (target_node_id != 0) {
ajuma 2016/07/04 15:11:50 Does node 0 need to be special-cased only because
jaydasika 2016/07/06 18:52:31 Done.
74 const EffectNode* effect_node =
75 effect_tree.Node(layer->effect_tree_index());
76 const EffectNode* target_effect_node =
77 effect_node->data.has_render_surface
78 ? effect_node
79 : effect_tree.Node(effect_node->data.target_id);
80 const TransformNode* target_transform_node =
81 transform_tree.Node(target_node_id);
ajuma 2016/07/04 15:11:50 Since this is used only for the DCHECK, it might b
jaydasika 2016/07/06 18:52:31 Done.
82 DCHECK(target_transform_node->data.sublayer_scale ==
ajuma 2016/07/04 15:11:50 Can this be a DCHECK_EQ instead?
jaydasika 2016/07/06 18:52:31 DCHECK_EQ doesn't seem to support comparing vector
83 target_effect_node->data.sublayer_scale);
84 clip_to_target.matrix().postScale(
85 target_effect_node->data.sublayer_scale.x(),
86 target_effect_node->data.sublayer_scale.y(), 1.f);
87 }
88
72 const TransformNode* source_node = 89 const TransformNode* source_node =
73 transform_tree.Node(clip_node->data.target_id); 90 transform_tree.Node(clip_node->data.target_id);
74 if (source_node->data.sublayer_scale.x() != 0.f && 91 if (source_node->data.sublayer_scale.x() != 0.f &&
75 source_node->data.sublayer_scale.y() != 0.f) 92 source_node->data.sublayer_scale.y() != 0.f)
76 clip_to_target.Scale(1.0f / source_node->data.sublayer_scale.x(), 93 clip_to_target.Scale(1.0f / source_node->data.sublayer_scale.x(),
77 1.0f / source_node->data.sublayer_scale.y()); 94 1.0f / source_node->data.sublayer_scale.y());
78 *clip_rect_in_target_space = MathUtil::MapClippedRect( 95 *clip_rect_in_target_space = MathUtil::MapClippedRect(
79 clip_to_target, clip_node->data.clip_in_target_space); 96 clip_to_target, clip_node->data.clip_in_target_space);
80 } else { 97 } else {
81 return false; 98 return false;
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 if (clip_node->data.target_id != target_node_id) { 264 if (clip_node->data.target_id != target_node_id) {
248 // In this case, layer has a clip parent or scroll parent (or shares the 265 // In this case, layer has a clip parent or scroll parent (or shares the
249 // target with an ancestor layer that has clip parent) and the clip 266 // target with an ancestor layer that has clip parent) and the clip
250 // parent's target is different from the layer's target. As the layer's 267 // parent's target is different from the layer's target. As the layer's
251 // target has unclippped descendants, it is unclippped. 268 // target has unclippped descendants, it is unclippped.
252 if (!clip_node->data.layers_are_clipped) 269 if (!clip_node->data.layers_are_clipped)
253 continue; 270 continue;
254 271
255 // Compute the clip rect in target space and store it. 272 // Compute the clip rect in target space and store it.
256 if (!ComputeClipRectInTargetSpace(layer, clip_node, transform_tree, 273 if (!ComputeClipRectInTargetSpace(layer, clip_node, transform_tree,
257 target_node_id, 274 effect_tree, target_node_id,
258 &clip_rect_in_target_space)) 275 &clip_rect_in_target_space))
259 continue; 276 continue;
260 } 277 }
261 278
262 if (!clip_rect_in_target_space.IsEmpty()) { 279 if (!clip_rect_in_target_space.IsEmpty()) {
263 layer->set_clip_rect(gfx::ToEnclosingRect(clip_rect_in_target_space)); 280 layer->set_clip_rect(gfx::ToEnclosingRect(clip_rect_in_target_space));
264 } else { 281 } else {
265 layer->set_clip_rect(gfx::Rect()); 282 layer->set_clip_rect(gfx::Rect());
266 } 283 }
267 } 284 }
268 } 285 }
269 } 286 }
270 287
271 bool GetLayerClipRect(const scoped_refptr<Layer> layer, 288 bool GetLayerClipRect(const scoped_refptr<Layer> layer,
272 const ClipNode* clip_node, 289 const ClipNode* clip_node,
273 const TransformTree& transform_tree, 290 const TransformTree& transform_tree,
291 const EffectTree& effect_tree,
274 int target_node_id, 292 int target_node_id,
275 gfx::RectF* clip_rect_in_target_space) { 293 gfx::RectF* clip_rect_in_target_space) {
276 return ComputeClipRectInTargetSpace(layer.get(), clip_node, transform_tree, 294 return ComputeClipRectInTargetSpace(layer.get(), clip_node, transform_tree,
277 target_node_id, 295 effect_tree, target_node_id,
278 clip_rect_in_target_space); 296 clip_rect_in_target_space);
279 } 297 }
280 298
281 bool GetLayerClipRect(const LayerImpl* layer, 299 bool GetLayerClipRect(const LayerImpl* layer,
282 const ClipNode* clip_node, 300 const ClipNode* clip_node,
283 const TransformTree& transform_tree, 301 const TransformTree& transform_tree,
302 const EffectTree& effect_tree,
284 int target_node_id, 303 int target_node_id,
285 gfx::RectF* clip_rect_in_target_space) { 304 gfx::RectF* clip_rect_in_target_space) {
286 // This is equivalent of calling ComputeClipRectInTargetSpace. 305 // This is equivalent of calling ComputeClipRectInTargetSpace.
287 *clip_rect_in_target_space = gfx::RectF(layer->clip_rect()); 306 *clip_rect_in_target_space = gfx::RectF(layer->clip_rect());
288 return transform_tree.Node(target_node_id)->data.ancestors_are_invertible; 307 return transform_tree.Node(target_node_id)->data.ancestors_are_invertible;
289 } 308 }
290 309
291 template <typename LayerType> 310 template <typename LayerType>
292 void CalculateVisibleRects( 311 void CalculateVisibleRects(
293 const typename LayerType::LayerListType& visible_layer_list, 312 const typename LayerType::LayerListType& visible_layer_list,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 401 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
383 continue; 402 continue;
384 } 403 }
385 404
386 // We use the clip node's clip_in_target_space (and not 405 // We use the clip node's clip_in_target_space (and not
387 // combined_clip_in_target_space) here because we want to clip 406 // combined_clip_in_target_space) here because we want to clip
388 // with respect to clip parent's local clip and not its combined clip as 407 // with respect to clip parent's local clip and not its combined clip as
389 // the combined clip has even the clip parent's target's clip baked into 408 // the combined clip has even the clip parent's target's clip baked into
390 // it and as our target is different, we don't want to use it in our 409 // it and as our target is different, we don't want to use it in our
391 // visible rect computation. 410 // visible rect computation.
392 if (!GetLayerClipRect(layer, clip_node, transform_tree, target_node_id, 411 if (!GetLayerClipRect(layer, clip_node, transform_tree, effect_tree,
412 target_node_id,
393 &combined_clip_rect_in_target_space)) { 413 &combined_clip_rect_in_target_space)) {
394 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 414 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
395 continue; 415 continue;
396 } 416 }
397 } else { 417 } else {
398 if (clip_node->data.target_is_clipped) { 418 if (clip_node->data.target_is_clipped) {
399 combined_clip_rect_in_target_space = 419 combined_clip_rect_in_target_space =
400 clip_node->data.combined_clip_in_target_space; 420 clip_node->data.combined_clip_in_target_space;
401 } else { 421 } else {
402 combined_clip_rect_in_target_space = 422 combined_clip_rect_in_target_space =
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 return node->data.transform_id; 916 return node->data.transform_id;
897 node = effect_tree.Node(node->data.target_id); 917 node = effect_tree.Node(node->data.target_id);
898 return node->data.transform_id; 918 return node->data.transform_id;
899 } 919 }
900 920
901 static void VerifyDrawTransformsMatch(LayerImpl* layer, 921 static void VerifyDrawTransformsMatch(LayerImpl* layer,
902 PropertyTrees* property_trees) { 922 PropertyTrees* property_trees) {
903 const int source_id = layer->transform_tree_index(); 923 const int source_id = layer->transform_tree_index();
904 int destination_id = FindTargetTransformTreeIndexFromEffectTree( 924 int destination_id = FindTargetTransformTreeIndexFromEffectTree(
905 property_trees->effect_tree, layer->effect_tree_index()); 925 property_trees->effect_tree, layer->effect_tree_index());
906 // TODO(jaydasika) : Remove this after sorting out how sublayer scale works
907 // for these ids.
908 if (destination_id == 0 || destination_id == 1)
909 return;
910 gfx::Transform draw_transform; 926 gfx::Transform draw_transform;
911 property_trees->transform_tree.ComputeTransform(source_id, destination_id, 927 property_trees->transform_tree.ComputeTransform(source_id, destination_id,
912 &draw_transform); 928 &draw_transform);
913 TransformNode* target_node = 929 TransformNode* target_transform_node =
914 property_trees->transform_tree.Node(destination_id); 930 property_trees->transform_tree.Node(destination_id);
915 draw_transform.matrix().postScale(target_node->data.sublayer_scale.x(), 931 EffectNode* effect_node =
916 target_node->data.sublayer_scale.y(), 1.f); 932 property_trees->effect_tree.Node(layer->effect_tree_index());
933 if (destination_id != 0) {
ajuma 2016/07/04 15:11:50 Same comment as above about special-casing node 0.
jaydasika 2016/07/06 18:52:31 Done.
934 int target_effect_id = effect_node->data.has_render_surface
935 ? effect_node->id
936 : effect_node->data.target_id;
937 EffectNode* target_effect_node =
938 property_trees->effect_tree.Node(target_effect_id);
939 DCHECK(target_transform_node->data.sublayer_scale ==
ajuma 2016/07/04 15:11:50 DCHECK_EQ (and then we get the error message for f
940 target_effect_node->data.sublayer_scale)
941 << " sublayer scale from transform tree: "
942 << target_transform_node->data.sublayer_scale.ToString()
943 << " sublayer scale from effect tree: "
944 << target_effect_node->data.sublayer_scale.ToString();
945 draw_transform.matrix().postScale(
946 target_effect_node->data.sublayer_scale.x(),
947 target_effect_node->data.sublayer_scale.y(), 1.f);
948 }
917 if (layer->should_flatten_transform_from_property_tree()) 949 if (layer->should_flatten_transform_from_property_tree())
918 draw_transform.FlattenTo2d(); 950 draw_transform.FlattenTo2d();
919 draw_transform.Translate(layer->offset_to_transform_parent().x(), 951 draw_transform.Translate(layer->offset_to_transform_parent().x(),
920 layer->offset_to_transform_parent().y()); 952 layer->offset_to_transform_parent().y());
921 DCHECK(draw_transform.ApproximatelyEqual( 953 DCHECK(draw_transform.ApproximatelyEqual(
922 DrawTransform(layer, property_trees->transform_tree))) 954 DrawTransform(layer, property_trees->transform_tree)))
923 << " layer: " << layer->id() << " source transform id: " << source_id 955 << " layer: " << layer->id() << " source transform id: " << source_id
924 << " destination transform id: " << destination_id 956 << " destination transform id: " << destination_id
925 << " draw transform from transform tree: " 957 << " draw transform from transform tree: "
926 << DrawTransform(layer, property_trees->transform_tree).ToString() 958 << DrawTransform(layer, property_trees->transform_tree).ToString()
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 xform.FlattenTo2d(); 1104 xform.FlattenTo2d();
1073 xform.Translate(layer->offset_to_transform_parent().x(), 1105 xform.Translate(layer->offset_to_transform_parent().x(),
1074 layer->offset_to_transform_parent().y()); 1106 layer->offset_to_transform_parent().y());
1075 } else { 1107 } else {
1076 // Surfaces need to apply their sublayer scale. 1108 // Surfaces need to apply their sublayer scale.
1077 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y()); 1109 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y());
1078 } 1110 }
1079 return xform; 1111 return xform;
1080 } 1112 }
1081 1113
1082 static void SetSurfaceDrawTransform(const TransformTree& tree, 1114 static void SetSurfaceDrawTransform(const TransformTree& transform_tree,
1115 const EffectTree& effect_tree,
1083 RenderSurfaceImpl* render_surface) { 1116 RenderSurfaceImpl* render_surface) {
1084 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex()); 1117 const TransformNode* transform_node =
1118 transform_tree.Node(render_surface->TransformTreeIndex());
1119 const EffectNode* effect_node =
1120 effect_tree.Node(render_surface->EffectTreeIndex());
1085 // The draw transform of root render surface is identity tranform. 1121 // The draw transform of root render surface is identity tranform.
1086 if (node->id == 1) { 1122 if (transform_node->id == 1) {
1087 render_surface->SetDrawTransform(gfx::Transform()); 1123 render_surface->SetDrawTransform(gfx::Transform());
1088 return; 1124 return;
1089 } 1125 }
1090 1126
1091 gfx::Transform render_surface_transform; 1127 gfx::Transform render_surface_transform;
1092 const TransformNode* target_node = tree.Node(tree.TargetId(node->id)); 1128 const TransformNode* target_transform_node =
1093 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id, 1129 transform_tree.Node(transform_tree.TargetId(transform_node->id));
1094 &render_surface_transform); 1130 const EffectNode* target_effect_node =
1095 if (node->data.sublayer_scale.x() != 0.0 && 1131 effect_tree.Node(effect_node->data.target_id);
1096 node->data.sublayer_scale.y() != 0.0) 1132 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id,
1097 render_surface_transform.Scale(1.0 / node->data.sublayer_scale.x(), 1133 &render_surface_transform);
1098 1.0 / node->data.sublayer_scale.y()); 1134 if (target_transform_node->id != 0) {
1135 DCHECK(target_transform_node->data.sublayer_scale ==
ajuma 2016/07/04 15:11:50 Here too, same comments about node 0 and DCHECK_EQ
1136 target_effect_node->data.sublayer_scale)
1137 << target_transform_node->id << target_effect_node->id;
1138 render_surface_transform.matrix().postScale(
1139 target_effect_node->data.sublayer_scale.x(),
1140 target_effect_node->data.sublayer_scale.y(), 1.f);
1141 }
ajuma 2016/07/04 15:11:50 Would it make sense to write a helper function wit
jaydasika 2016/07/06 18:52:31 Done.
1142
1143 DCHECK(transform_node->data.sublayer_scale ==
1144 effect_node->data.sublayer_scale);
1145 if (effect_node->data.sublayer_scale.x() != 0.0 &&
1146 effect_node->data.sublayer_scale.y() != 0.0)
1147 render_surface_transform.Scale(1.0 / effect_node->data.sublayer_scale.x(),
1148 1.0 / effect_node->data.sublayer_scale.y());
1099 render_surface->SetDrawTransform(render_surface_transform); 1149 render_surface->SetDrawTransform(render_surface_transform);
1100 } 1150 }
1101 1151
1102 static void SetSurfaceIsClipped(const ClipNode* clip_node, 1152 static void SetSurfaceIsClipped(const ClipNode* clip_node,
1103 RenderSurfaceImpl* render_surface) { 1153 RenderSurfaceImpl* render_surface) {
1104 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) 1154 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id)
1105 << "we now create clip node for every render surface"; 1155 << "we now create clip node for every render surface";
1106 1156
1107 render_surface->SetIsClipped(clip_node->data.target_is_clipped); 1157 render_surface->SetIsClipped(clip_node->data.target_is_clipped);
1108 } 1158 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 gfx::Rect(mask_layer->bounds()); 1332 gfx::Rect(mask_layer->bounds());
1283 } 1333 }
1284 1334
1285 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees, 1335 void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees,
1286 RenderSurfaceImpl* render_surface) { 1336 RenderSurfaceImpl* render_surface) {
1287 const ClipNode* clip_node = 1337 const ClipNode* clip_node =
1288 property_trees->clip_tree.Node(render_surface->ClipTreeIndex()); 1338 property_trees->clip_tree.Node(render_surface->ClipTreeIndex());
1289 1339
1290 SetSurfaceIsClipped(clip_node, render_surface); 1340 SetSurfaceIsClipped(clip_node, render_surface);
1291 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); 1341 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface);
1292 SetSurfaceDrawTransform(property_trees->transform_tree, render_surface); 1342 SetSurfaceDrawTransform(property_trees->transform_tree,
1343 property_trees->effect_tree, render_surface);
1293 render_surface->SetScreenSpaceTransform( 1344 render_surface->SetScreenSpaceTransform(
1294 property_trees->transform_tree.ToScreenSpaceTransformWithoutSublayerScale( 1345 property_trees->transform_tree.ToScreenSpaceTransformWithoutSublayerScale(
1295 render_surface->TransformTreeIndex())); 1346 render_surface->TransformTreeIndex()));
1296 1347
1297 if (render_surface->HasReplica()) { 1348 if (render_surface->HasReplica()) {
1298 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( 1349 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform(
1299 render_surface, property_trees->transform_tree); 1350 render_surface, property_trees->transform_tree);
1300 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * 1351 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() *
1301 replica_to_surface); 1352 replica_to_surface);
1302 render_surface->SetReplicaScreenSpaceTransform( 1353 render_surface->SetReplicaScreenSpaceTransform(
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1457 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1407 const Layer* overscroll_elasticity_layer, 1458 const Layer* overscroll_elasticity_layer,
1408 const gfx::Vector2dF& elastic_overscroll) { 1459 const gfx::Vector2dF& elastic_overscroll) {
1409 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1460 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1410 elastic_overscroll); 1461 elastic_overscroll);
1411 } 1462 }
1412 1463
1413 } // namespace draw_property_utils 1464 } // namespace draw_property_utils
1414 1465
1415 } // namespace cc 1466 } // namespace cc
OLDNEW
« no previous file with comments | « cc/proto/property_tree.proto ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698