Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |