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 1025 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1036 #if DCHECK_IS_ON() | 1036 #if DCHECK_IS_ON() |
| 1037 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, | 1037 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, |
| 1038 property_trees->effect_tree, | 1038 property_trees->effect_tree, |
| 1039 property_trees->transform_tree); | 1039 property_trees->transform_tree); |
| 1040 #endif | 1040 #endif |
| 1041 } | 1041 } |
| 1042 if (layer->should_flatten_transform_from_property_tree()) | 1042 if (layer->should_flatten_transform_from_property_tree()) |
| 1043 draw_transform.FlattenTo2d(); | 1043 draw_transform.FlattenTo2d(); |
| 1044 draw_transform.Translate(layer->offset_to_transform_parent().x(), | 1044 draw_transform.Translate(layer->offset_to_transform_parent().x(), |
| 1045 layer->offset_to_transform_parent().y()); | 1045 layer->offset_to_transform_parent().y()); |
| 1046 DCHECK(draw_transform.ApproximatelyEqual( | 1046 DCHECK(draw_transform.ApproximatelyEqual(DrawTransform( |
| 1047 DrawTransform(layer, property_trees->transform_tree))) | 1047 layer, property_trees->transform_tree, property_trees->effect_tree))) |
| 1048 << " layer: " << layer->id() << " source transform id: " << source_id | 1048 << " layer: " << layer->id() << " source transform id: " << source_id |
| 1049 << " destination transform id: " << destination_id | 1049 << " destination transform id: " << destination_id |
| 1050 << " draw transform from transform tree: " | 1050 << " draw transform from transform tree: " |
| 1051 << DrawTransform(layer, property_trees->transform_tree).ToString() | 1051 << DrawTransform(layer, property_trees->transform_tree, |
| 1052 property_trees->effect_tree) | |
| 1053 .ToString() | |
| 1052 << " v.s." << draw_transform.ToString(); | 1054 << " v.s." << draw_transform.ToString(); |
| 1053 } | 1055 } |
| 1054 | 1056 |
| 1055 static void ComputeVisibleRectsInternal( | 1057 static void ComputeVisibleRectsInternal( |
| 1056 LayerImpl* root_layer, | 1058 LayerImpl* root_layer, |
| 1057 PropertyTrees* property_trees, | 1059 PropertyTrees* property_trees, |
| 1058 bool can_render_to_separate_surface, | 1060 bool can_render_to_separate_surface, |
| 1059 std::vector<LayerImpl*>* visible_layer_list) { | 1061 std::vector<LayerImpl*>* visible_layer_list) { |
| 1060 if (property_trees->non_root_surfaces_enabled != | 1062 if (property_trees->non_root_surfaces_enabled != |
| 1061 can_render_to_separate_surface) { | 1063 can_render_to_separate_surface) { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1181 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); | 1183 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); |
| 1182 } | 1184 } |
| 1183 | 1185 |
| 1184 bool LayerNeedsUpdate(LayerImpl* layer, | 1186 bool LayerNeedsUpdate(LayerImpl* layer, |
| 1185 bool layer_is_drawn, | 1187 bool layer_is_drawn, |
| 1186 const TransformTree& tree) { | 1188 const TransformTree& tree) { |
| 1187 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); | 1189 return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); |
| 1188 } | 1190 } |
| 1189 | 1191 |
| 1190 gfx::Transform DrawTransform(const LayerImpl* layer, | 1192 gfx::Transform DrawTransform(const LayerImpl* layer, |
| 1191 const TransformTree& tree) { | 1193 const TransformTree& transform_tree, |
| 1192 const TransformNode* node = tree.Node(layer->transform_tree_index()); | 1194 const EffectTree& effect_tree) { |
| 1193 gfx::Transform xform; | 1195 gfx::Transform xform; |
| 1194 const bool owns_non_root_surface = | 1196 const bool owns_non_root_surface = |
| 1195 !IsRootLayer(layer) && layer->has_render_surface(); | 1197 !IsRootLayer(layer) && layer->has_render_surface(); |
| 1196 if (!owns_non_root_surface) { | 1198 if (!owns_non_root_surface) { |
| 1197 // If you're not the root, or you don't own a surface, you need to apply | 1199 // If you're not the root, or you don't own a surface, you need to apply |
| 1198 // your local offset. | 1200 // your local offset. |
| 1199 xform = tree.ToTarget(layer->transform_tree_index()); | 1201 xform = transform_tree.ToTarget(layer->transform_tree_index()); |
| 1200 if (layer->should_flatten_transform_from_property_tree()) | 1202 if (layer->should_flatten_transform_from_property_tree()) |
| 1201 xform.FlattenTo2d(); | 1203 xform.FlattenTo2d(); |
| 1202 xform.Translate(layer->offset_to_transform_parent().x(), | 1204 xform.Translate(layer->offset_to_transform_parent().x(), |
| 1203 layer->offset_to_transform_parent().y()); | 1205 layer->offset_to_transform_parent().y()); |
| 1204 } else { | 1206 } else { |
| 1205 // Surfaces need to apply their surface contents scale. | 1207 // Surfaces need to apply their surface contents scale. we don't have to |
|
ajuma
2016/07/19 21:59:58
Nit: capitalize 'w'
jaydasika
2016/07/19 22:56:12
Done.
| |
| 1206 xform.Scale(node->surface_contents_scale.x(), | 1208 // apply it for root. |
| 1207 node->surface_contents_scale.y()); | 1209 if (layer->transform_tree_index() != 0) { |
|
ajuma
2016/07/19 21:59:58
Should this be checking for the root surface rathe
jaydasika
2016/07/19 22:56:12
this is inside the else (= owns_non_root_surface).
| |
| 1210 const EffectNode* effect_node = | |
| 1211 effect_tree.Node(layer->effect_tree_index()); | |
| 1212 xform.Scale(effect_node->surface_contents_scale.x(), | |
| 1213 effect_node->surface_contents_scale.y()); | |
| 1214 #if DCHECK_IS_ON() | |
| 1215 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), | |
| 1216 layer->transform_tree_index(), | |
| 1217 effect_tree, transform_tree); | |
| 1218 #endif | |
| 1219 } | |
| 1208 } | 1220 } |
| 1209 return xform; | 1221 return xform; |
| 1210 } | 1222 } |
| 1211 | 1223 |
| 1212 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, | 1224 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, |
| 1213 const EffectTree& effect_tree, | 1225 const EffectTree& effect_tree, |
| 1214 RenderSurfaceImpl* render_surface) { | 1226 RenderSurfaceImpl* render_surface) { |
| 1215 const TransformNode* transform_node = | 1227 const TransformNode* transform_node = |
| 1216 transform_tree.Node(render_surface->TransformTreeIndex()); | 1228 transform_tree.Node(render_surface->TransformTreeIndex()); |
| 1217 const EffectNode* effect_node = | 1229 const EffectNode* effect_node = |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1365 const gfx::Rect& layer_bounds_in_target_space, | 1377 const gfx::Rect& layer_bounds_in_target_space, |
| 1366 const gfx::Rect& clip_rect) { | 1378 const gfx::Rect& clip_rect) { |
| 1367 if (layer->is_clipped()) | 1379 if (layer->is_clipped()) |
| 1368 return IntersectRects(layer_bounds_in_target_space, clip_rect); | 1380 return IntersectRects(layer_bounds_in_target_space, clip_rect); |
| 1369 | 1381 |
| 1370 return layer_bounds_in_target_space; | 1382 return layer_bounds_in_target_space; |
| 1371 } | 1383 } |
| 1372 | 1384 |
| 1373 static gfx::Transform ReplicaToSurfaceTransform( | 1385 static gfx::Transform ReplicaToSurfaceTransform( |
| 1374 const RenderSurfaceImpl* render_surface, | 1386 const RenderSurfaceImpl* render_surface, |
| 1375 const TransformTree& tree) { | 1387 const TransformTree& transform_tree, |
| 1388 const EffectTree& effect_tree) { | |
| 1376 gfx::Transform replica_to_surface; | 1389 gfx::Transform replica_to_surface; |
| 1377 if (!render_surface->HasReplica()) | 1390 if (!render_surface->HasReplica()) |
| 1378 return replica_to_surface; | 1391 return replica_to_surface; |
| 1379 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); | 1392 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); |
| 1380 const TransformNode* surface_transform_node = | 1393 const EffectNode* surface_effect_node = |
| 1381 tree.Node(render_surface->TransformTreeIndex()); | 1394 effect_tree.Node(render_surface->EffectTreeIndex()); |
| 1382 replica_to_surface.Scale(surface_transform_node->surface_contents_scale.x(), | 1395 if (render_surface->TransformTreeIndex() != 0) { |
|
ajuma
2016/07/19 21:59:58
Checking the effect tree index might be cleaner he
jaydasika
2016/07/19 22:56:11
All callsites that apply surface content scale rig
ajuma
2016/07/19 23:08:38
Sounds good.
| |
| 1383 surface_transform_node->surface_contents_scale.y()); | 1396 replica_to_surface.Scale(surface_effect_node->surface_contents_scale.x(), |
| 1397 surface_effect_node->surface_contents_scale.y()); | |
| 1398 #if DCHECK_IS_ON() | |
| 1399 VerifySurfaceContentsScalesMatch(render_surface->EffectTreeIndex(), | |
| 1400 render_surface->TransformTreeIndex(), | |
| 1401 effect_tree, transform_tree); | |
| 1402 #endif | |
| 1403 } | |
| 1384 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), | 1404 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), |
| 1385 replica_layer->offset_to_transform_parent().y()); | 1405 replica_layer->offset_to_transform_parent().y()); |
| 1386 gfx::Transform replica_transform_node_to_surface; | 1406 gfx::Transform replica_transform_node_to_surface; |
| 1387 tree.ComputeTransform(replica_layer->transform_tree_index(), | 1407 transform_tree.ComputeTransform(replica_layer->transform_tree_index(), |
| 1388 render_surface->TransformTreeIndex(), | 1408 render_surface->TransformTreeIndex(), |
| 1389 &replica_transform_node_to_surface); | 1409 &replica_transform_node_to_surface); |
| 1390 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); | 1410 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); |
| 1391 if (surface_transform_node->surface_contents_scale.x() != 0 && | 1411 if (surface_effect_node->surface_contents_scale.x() != 0 && |
| 1392 surface_transform_node->surface_contents_scale.y() != 0) { | 1412 surface_effect_node->surface_contents_scale.y() != 0) { |
| 1393 replica_to_surface.Scale( | 1413 replica_to_surface.Scale( |
| 1394 1.0 / surface_transform_node->surface_contents_scale.x(), | 1414 1.0 / surface_effect_node->surface_contents_scale.x(), |
| 1395 1.0 / surface_transform_node->surface_contents_scale.y()); | 1415 1.0 / surface_effect_node->surface_contents_scale.y()); |
| 1396 } | 1416 } |
| 1397 return replica_to_surface; | 1417 return replica_to_surface; |
| 1398 } | 1418 } |
| 1399 | 1419 |
| 1400 void ComputeLayerDrawProperties(LayerImpl* layer, | 1420 void ComputeLayerDrawProperties(LayerImpl* layer, |
| 1401 const PropertyTrees* property_trees) { | 1421 const PropertyTrees* property_trees) { |
| 1402 const TransformNode* transform_node = | 1422 const TransformNode* transform_node = |
| 1403 property_trees->transform_tree.Node(layer->transform_tree_index()); | 1423 property_trees->transform_tree.Node(layer->transform_tree_index()); |
| 1404 const ClipNode* clip_node = | 1424 const ClipNode* clip_node = |
| 1405 property_trees->clip_tree.Node(layer->clip_tree_index()); | 1425 property_trees->clip_tree.Node(layer->clip_tree_index()); |
| 1406 | 1426 |
| 1407 layer->draw_properties().screen_space_transform = | 1427 layer->draw_properties().screen_space_transform = |
| 1408 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); | 1428 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); |
| 1409 if (property_trees->non_root_surfaces_enabled) { | 1429 if (property_trees->non_root_surfaces_enabled) { |
| 1410 layer->draw_properties().target_space_transform = | 1430 layer->draw_properties().target_space_transform = DrawTransform( |
| 1411 DrawTransform(layer, property_trees->transform_tree); | 1431 layer, property_trees->transform_tree, property_trees->effect_tree); |
| 1412 } else { | 1432 } else { |
| 1413 layer->draw_properties().target_space_transform = | 1433 layer->draw_properties().target_space_transform = |
| 1414 layer->draw_properties().screen_space_transform; | 1434 layer->draw_properties().screen_space_transform; |
| 1415 } | 1435 } |
| 1416 layer->draw_properties().screen_space_transform_is_animating = | 1436 layer->draw_properties().screen_space_transform_is_animating = |
| 1417 transform_node->to_screen_is_potentially_animated; | 1437 transform_node->to_screen_is_potentially_animated; |
| 1418 | 1438 |
| 1419 layer->draw_properties().opacity = | 1439 layer->draw_properties().opacity = |
| 1420 LayerDrawOpacity(layer, property_trees->effect_tree); | 1440 LayerDrawOpacity(layer, property_trees->effect_tree); |
| 1421 if (property_trees->non_root_surfaces_enabled) { | 1441 if (property_trees->non_root_surfaces_enabled) { |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 1452 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); | 1472 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); |
| 1453 SetSurfaceDrawTransform(property_trees->transform_tree, | 1473 SetSurfaceDrawTransform(property_trees->transform_tree, |
| 1454 property_trees->effect_tree, render_surface); | 1474 property_trees->effect_tree, render_surface); |
| 1455 render_surface->SetScreenSpaceTransform( | 1475 render_surface->SetScreenSpaceTransform( |
| 1456 property_trees->transform_tree | 1476 property_trees->transform_tree |
| 1457 .ToScreenSpaceTransformWithoutSurfaceContentsScale( | 1477 .ToScreenSpaceTransformWithoutSurfaceContentsScale( |
| 1458 render_surface->TransformTreeIndex())); | 1478 render_surface->TransformTreeIndex())); |
| 1459 | 1479 |
| 1460 if (render_surface->HasReplica()) { | 1480 if (render_surface->HasReplica()) { |
| 1461 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( | 1481 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( |
| 1462 render_surface, property_trees->transform_tree); | 1482 render_surface, property_trees->transform_tree, |
| 1483 property_trees->effect_tree); | |
| 1463 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * | 1484 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * |
| 1464 replica_to_surface); | 1485 replica_to_surface); |
| 1465 render_surface->SetReplicaScreenSpaceTransform( | 1486 render_surface->SetReplicaScreenSpaceTransform( |
| 1466 render_surface->screen_space_transform() * replica_to_surface); | 1487 render_surface->screen_space_transform() * replica_to_surface); |
| 1467 } else { | 1488 } else { |
| 1468 render_surface->SetReplicaDrawTransform(gfx::Transform()); | 1489 render_surface->SetReplicaDrawTransform(gfx::Transform()); |
| 1469 render_surface->SetReplicaScreenSpaceTransform(gfx::Transform()); | 1490 render_surface->SetReplicaScreenSpaceTransform(gfx::Transform()); |
| 1470 } | 1491 } |
| 1471 | 1492 |
| 1472 SetSurfaceClipRect(property_trees->clip_tree.parent(clip_node), | 1493 SetSurfaceClipRect(property_trees->clip_tree.parent(clip_node), |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1569 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1590 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1570 const Layer* overscroll_elasticity_layer, | 1591 const Layer* overscroll_elasticity_layer, |
| 1571 const gfx::Vector2dF& elastic_overscroll) { | 1592 const gfx::Vector2dF& elastic_overscroll) { |
| 1572 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1593 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1573 elastic_overscroll); | 1594 elastic_overscroll); |
| 1574 } | 1595 } |
| 1575 | 1596 |
| 1576 } // namespace draw_property_utils | 1597 } // namespace draw_property_utils |
| 1577 | 1598 |
| 1578 } // namespace cc | 1599 } // namespace cc |
| OLD | NEW |