| 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. |
| 1206 xform.Scale(node->surface_contents_scale.x(), | 1208 const EffectNode* effect_node = |
| 1207 node->surface_contents_scale.y()); | 1209 effect_tree.Node(layer->effect_tree_index()); |
| 1210 xform.Scale(effect_node->surface_contents_scale.x(), |
| 1211 effect_node->surface_contents_scale.y()); |
| 1212 #if DCHECK_IS_ON() |
| 1213 VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), |
| 1214 layer->transform_tree_index(), effect_tree, |
| 1215 transform_tree); |
| 1216 #endif |
| 1208 } | 1217 } |
| 1209 return xform; | 1218 return xform; |
| 1210 } | 1219 } |
| 1211 | 1220 |
| 1212 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, | 1221 static void SetSurfaceDrawTransform(const TransformTree& transform_tree, |
| 1213 const EffectTree& effect_tree, | 1222 const EffectTree& effect_tree, |
| 1214 RenderSurfaceImpl* render_surface) { | 1223 RenderSurfaceImpl* render_surface) { |
| 1215 const TransformNode* transform_node = | 1224 const TransformNode* transform_node = |
| 1216 transform_tree.Node(render_surface->TransformTreeIndex()); | 1225 transform_tree.Node(render_surface->TransformTreeIndex()); |
| 1217 const EffectNode* effect_node = | 1226 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, | 1374 const gfx::Rect& layer_bounds_in_target_space, |
| 1366 const gfx::Rect& clip_rect) { | 1375 const gfx::Rect& clip_rect) { |
| 1367 if (layer->is_clipped()) | 1376 if (layer->is_clipped()) |
| 1368 return IntersectRects(layer_bounds_in_target_space, clip_rect); | 1377 return IntersectRects(layer_bounds_in_target_space, clip_rect); |
| 1369 | 1378 |
| 1370 return layer_bounds_in_target_space; | 1379 return layer_bounds_in_target_space; |
| 1371 } | 1380 } |
| 1372 | 1381 |
| 1373 static gfx::Transform ReplicaToSurfaceTransform( | 1382 static gfx::Transform ReplicaToSurfaceTransform( |
| 1374 const RenderSurfaceImpl* render_surface, | 1383 const RenderSurfaceImpl* render_surface, |
| 1375 const TransformTree& tree) { | 1384 const TransformTree& transform_tree, |
| 1385 const EffectTree& effect_tree) { |
| 1376 gfx::Transform replica_to_surface; | 1386 gfx::Transform replica_to_surface; |
| 1377 if (!render_surface->HasReplica()) | 1387 if (!render_surface->HasReplica()) |
| 1378 return replica_to_surface; | 1388 return replica_to_surface; |
| 1379 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); | 1389 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); |
| 1380 const TransformNode* surface_transform_node = | 1390 const EffectNode* surface_effect_node = |
| 1381 tree.Node(render_surface->TransformTreeIndex()); | 1391 effect_tree.Node(render_surface->EffectTreeIndex()); |
| 1382 replica_to_surface.Scale(surface_transform_node->surface_contents_scale.x(), | 1392 if (render_surface->TransformTreeIndex() != 0) { |
| 1383 surface_transform_node->surface_contents_scale.y()); | 1393 replica_to_surface.Scale(surface_effect_node->surface_contents_scale.x(), |
| 1394 surface_effect_node->surface_contents_scale.y()); |
| 1395 #if DCHECK_IS_ON() |
| 1396 VerifySurfaceContentsScalesMatch(render_surface->EffectTreeIndex(), |
| 1397 render_surface->TransformTreeIndex(), |
| 1398 effect_tree, transform_tree); |
| 1399 #endif |
| 1400 } |
| 1384 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), | 1401 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), |
| 1385 replica_layer->offset_to_transform_parent().y()); | 1402 replica_layer->offset_to_transform_parent().y()); |
| 1386 gfx::Transform replica_transform_node_to_surface; | 1403 gfx::Transform replica_transform_node_to_surface; |
| 1387 tree.ComputeTransform(replica_layer->transform_tree_index(), | 1404 transform_tree.ComputeTransform(replica_layer->transform_tree_index(), |
| 1388 render_surface->TransformTreeIndex(), | 1405 render_surface->TransformTreeIndex(), |
| 1389 &replica_transform_node_to_surface); | 1406 &replica_transform_node_to_surface); |
| 1390 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); | 1407 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); |
| 1391 if (surface_transform_node->surface_contents_scale.x() != 0 && | 1408 if (surface_effect_node->surface_contents_scale.x() != 0 && |
| 1392 surface_transform_node->surface_contents_scale.y() != 0) { | 1409 surface_effect_node->surface_contents_scale.y() != 0) { |
| 1393 replica_to_surface.Scale( | 1410 replica_to_surface.Scale( |
| 1394 1.0 / surface_transform_node->surface_contents_scale.x(), | 1411 1.0 / surface_effect_node->surface_contents_scale.x(), |
| 1395 1.0 / surface_transform_node->surface_contents_scale.y()); | 1412 1.0 / surface_effect_node->surface_contents_scale.y()); |
| 1396 } | 1413 } |
| 1397 return replica_to_surface; | 1414 return replica_to_surface; |
| 1398 } | 1415 } |
| 1399 | 1416 |
| 1400 void ComputeLayerDrawProperties(LayerImpl* layer, | 1417 void ComputeLayerDrawProperties(LayerImpl* layer, |
| 1401 const PropertyTrees* property_trees) { | 1418 const PropertyTrees* property_trees) { |
| 1402 const TransformNode* transform_node = | 1419 const TransformNode* transform_node = |
| 1403 property_trees->transform_tree.Node(layer->transform_tree_index()); | 1420 property_trees->transform_tree.Node(layer->transform_tree_index()); |
| 1404 const ClipNode* clip_node = | 1421 const ClipNode* clip_node = |
| 1405 property_trees->clip_tree.Node(layer->clip_tree_index()); | 1422 property_trees->clip_tree.Node(layer->clip_tree_index()); |
| 1406 | 1423 |
| 1407 layer->draw_properties().screen_space_transform = | 1424 layer->draw_properties().screen_space_transform = |
| 1408 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); | 1425 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); |
| 1409 if (property_trees->non_root_surfaces_enabled) { | 1426 if (property_trees->non_root_surfaces_enabled) { |
| 1410 layer->draw_properties().target_space_transform = | 1427 layer->draw_properties().target_space_transform = DrawTransform( |
| 1411 DrawTransform(layer, property_trees->transform_tree); | 1428 layer, property_trees->transform_tree, property_trees->effect_tree); |
| 1412 } else { | 1429 } else { |
| 1413 layer->draw_properties().target_space_transform = | 1430 layer->draw_properties().target_space_transform = |
| 1414 layer->draw_properties().screen_space_transform; | 1431 layer->draw_properties().screen_space_transform; |
| 1415 } | 1432 } |
| 1416 layer->draw_properties().screen_space_transform_is_animating = | 1433 layer->draw_properties().screen_space_transform_is_animating = |
| 1417 transform_node->to_screen_is_potentially_animated; | 1434 transform_node->to_screen_is_potentially_animated; |
| 1418 | 1435 |
| 1419 layer->draw_properties().opacity = | 1436 layer->draw_properties().opacity = |
| 1420 LayerDrawOpacity(layer, property_trees->effect_tree); | 1437 LayerDrawOpacity(layer, property_trees->effect_tree); |
| 1421 if (property_trees->non_root_surfaces_enabled) { | 1438 if (property_trees->non_root_surfaces_enabled) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1452 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); | 1469 SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface); |
| 1453 SetSurfaceDrawTransform(property_trees->transform_tree, | 1470 SetSurfaceDrawTransform(property_trees->transform_tree, |
| 1454 property_trees->effect_tree, render_surface); | 1471 property_trees->effect_tree, render_surface); |
| 1455 render_surface->SetScreenSpaceTransform( | 1472 render_surface->SetScreenSpaceTransform( |
| 1456 property_trees->transform_tree | 1473 property_trees->transform_tree |
| 1457 .ToScreenSpaceTransformWithoutSurfaceContentsScale( | 1474 .ToScreenSpaceTransformWithoutSurfaceContentsScale( |
| 1458 render_surface->TransformTreeIndex())); | 1475 render_surface->TransformTreeIndex())); |
| 1459 | 1476 |
| 1460 if (render_surface->HasReplica()) { | 1477 if (render_surface->HasReplica()) { |
| 1461 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( | 1478 gfx::Transform replica_to_surface = ReplicaToSurfaceTransform( |
| 1462 render_surface, property_trees->transform_tree); | 1479 render_surface, property_trees->transform_tree, |
| 1480 property_trees->effect_tree); |
| 1463 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * | 1481 render_surface->SetReplicaDrawTransform(render_surface->draw_transform() * |
| 1464 replica_to_surface); | 1482 replica_to_surface); |
| 1465 render_surface->SetReplicaScreenSpaceTransform( | 1483 render_surface->SetReplicaScreenSpaceTransform( |
| 1466 render_surface->screen_space_transform() * replica_to_surface); | 1484 render_surface->screen_space_transform() * replica_to_surface); |
| 1467 } else { | 1485 } else { |
| 1468 render_surface->SetReplicaDrawTransform(gfx::Transform()); | 1486 render_surface->SetReplicaDrawTransform(gfx::Transform()); |
| 1469 render_surface->SetReplicaScreenSpaceTransform(gfx::Transform()); | 1487 render_surface->SetReplicaScreenSpaceTransform(gfx::Transform()); |
| 1470 } | 1488 } |
| 1471 | 1489 |
| 1472 SetSurfaceClipRect(property_trees->clip_tree.parent(clip_node), | 1490 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, | 1587 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1570 const Layer* overscroll_elasticity_layer, | 1588 const Layer* overscroll_elasticity_layer, |
| 1571 const gfx::Vector2dF& elastic_overscroll) { | 1589 const gfx::Vector2dF& elastic_overscroll) { |
| 1572 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1590 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1573 elastic_overscroll); | 1591 elastic_overscroll); |
| 1574 } | 1592 } |
| 1575 | 1593 |
| 1576 } // namespace draw_property_utils | 1594 } // namespace draw_property_utils |
| 1577 | 1595 |
| 1578 } // namespace cc | 1596 } // namespace cc |
| OLD | NEW |