| 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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 EffectNode* effect_node = | 47 EffectNode* effect_node = |
| 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( | 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node( |
| 49 layer->effect_tree_index()); | 49 layer->effect_tree_index()); |
| 50 if (effect_node->owner_id != layer->id()) | 50 if (effect_node->owner_id != layer->id()) |
| 51 return; | 51 return; |
| 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); | 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id(); |
| 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); | 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id(); |
| 54 DCHECK(effect_node->background_filters.IsEmpty()); | 54 DCHECK(effect_node->background_filters.IsEmpty()); |
| 55 } | 55 } |
| 56 | 56 |
| 57 #endif | |
| 58 | |
| 59 static void ApplySublayerScale(const int effect_node_id, | |
| 60 const EffectTree& effect_tree, | |
| 61 gfx::Transform* transform) { | |
| 62 const EffectNode* effect_node = effect_tree.Node(effect_node_id); | |
| 63 const EffectNode* target_effect_node = | |
| 64 effect_node->has_render_surface | |
| 65 ? effect_node | |
| 66 : effect_tree.Node(effect_node->target_id); | |
| 67 transform->matrix().postScale(target_effect_node->sublayer_scale.x(), | |
| 68 target_effect_node->sublayer_scale.y(), 1.f); | |
| 69 } | |
| 70 | |
| 71 #if DCHECK_IS_ON() | |
| 72 void VerifySublayerScalesMatch(const int effect_node_id, | 57 void VerifySublayerScalesMatch(const int effect_node_id, |
| 73 const int target_transform_id, | 58 const int target_transform_id, |
| 74 const EffectTree& effect_tree, | 59 const EffectTree& effect_tree, |
| 75 const TransformTree& transform_tree) { | 60 const TransformTree& transform_tree) { |
| 76 const TransformNode* target_transform_node = | 61 const TransformNode* target_transform_node = |
| 77 transform_tree.Node(target_transform_id); | 62 transform_tree.Node(target_transform_id); |
| 78 const EffectNode* effect_node = effect_tree.Node(effect_node_id); | 63 const EffectNode* effect_node = effect_tree.Node(effect_node_id); |
| 79 const EffectNode* target_effect_node = | 64 const EffectNode* target_effect_node = |
| 80 effect_node->has_render_surface | 65 effect_node->has_render_surface |
| 81 ? effect_node | 66 ? effect_node |
| (...skipping 19 matching lines...) Expand all Loading... |
| 101 | 86 |
| 102 gfx::Transform clip_to_target; | 87 gfx::Transform clip_to_target; |
| 103 if (clip_node->target_transform_id > target_node_id) { | 88 if (clip_node->target_transform_id > target_node_id) { |
| 104 // In this case, layer has a scroll parent. We need to keep the scale | 89 // In this case, layer has a scroll parent. We need to keep the scale |
| 105 // at the layer's target but remove the scale at the scroll parent's | 90 // at the layer's target but remove the scale at the scroll parent's |
| 106 // target. | 91 // target. |
| 107 if (transform_tree.ComputeTransform(clip_node->target_transform_id, | 92 if (transform_tree.ComputeTransform(clip_node->target_transform_id, |
| 108 target_node_id, &clip_to_target)) { | 93 target_node_id, &clip_to_target)) { |
| 109 // We don't have to apply sublayer scale when target is root. | 94 // We don't have to apply sublayer scale when target is root. |
| 110 if (target_node_id != 0) { | 95 if (target_node_id != 0) { |
| 111 ApplySublayerScale(layer->effect_tree_index(), effect_tree, | 96 PostConcatSublayerScale(layer->effect_tree_index(), effect_tree, |
| 112 &clip_to_target); | 97 &clip_to_target); |
| 113 #if DCHECK_IS_ON() | 98 #if DCHECK_IS_ON() |
| 114 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id, | 99 VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id, |
| 115 effect_tree, transform_tree); | 100 effect_tree, transform_tree); |
| 116 #endif | 101 #endif |
| 117 } | 102 } |
| 118 | 103 |
| 119 const TransformNode* source_node = | 104 const TransformNode* source_node = |
| 120 transform_tree.Node(clip_node->target_transform_id); | 105 transform_tree.Node(clip_node->target_transform_id); |
| 121 if (source_node->sublayer_scale.x() != 0.f && | 106 if (source_node->sublayer_scale.x() != 0.f && |
| 122 source_node->sublayer_scale.y() != 0.f) | 107 source_node->sublayer_scale.y() != 0.f) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 int current_transform_id, | 155 int current_transform_id, |
| 171 int target_transform_id, | 156 int target_transform_id, |
| 172 int target_effect_id) { | 157 int target_effect_id) { |
| 173 gfx::Transform current_to_target; | 158 gfx::Transform current_to_target; |
| 174 if (!transform_tree.ComputeTransform(current_transform_id, | 159 if (!transform_tree.ComputeTransform(current_transform_id, |
| 175 target_transform_id, ¤t_to_target)) | 160 target_transform_id, ¤t_to_target)) |
| 176 // If transform is not invertible, cannot apply clip. | 161 // If transform is not invertible, cannot apply clip. |
| 177 return ConditionalClip{false, gfx::RectF()}; | 162 return ConditionalClip{false, gfx::RectF()}; |
| 178 // We don't have to apply sublayer scale when target is root. | 163 // We don't have to apply sublayer scale when target is root. |
| 179 if (target_transform_id != 0) { | 164 if (target_transform_id != 0) { |
| 180 ApplySublayerScale(target_effect_id, effect_tree, ¤t_to_target); | 165 PostConcatSublayerScale(target_effect_id, effect_tree, ¤t_to_target); |
| 181 #if DCHECK_IS_ON() | 166 #if DCHECK_IS_ON() |
| 182 VerifySublayerScalesMatch(target_effect_id, target_transform_id, | 167 VerifySublayerScalesMatch(target_effect_id, target_transform_id, |
| 183 effect_tree, transform_tree); | 168 effect_tree, transform_tree); |
| 184 #endif | 169 #endif |
| 185 } | 170 } |
| 186 | 171 |
| 187 if (current_transform_id > target_transform_id) | 172 if (current_transform_id > target_transform_id) |
| 188 return ConditionalClip{true, // is_clipped. | 173 return ConditionalClip{true, // is_clipped. |
| 189 MathUtil::MapClippedRect(current_to_target, rect)}; | 174 MathUtil::MapClippedRect(current_to_target, rect)}; |
| 190 | 175 |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 } | 693 } |
| 709 } | 694 } |
| 710 } | 695 } |
| 711 | 696 |
| 712 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { | 697 static void ResetIfHasNanCoordinate(gfx::RectF* rect) { |
| 713 if (std::isnan(rect->x()) || std::isnan(rect->y()) || | 698 if (std::isnan(rect->x()) || std::isnan(rect->y()) || |
| 714 std::isnan(rect->right()) || std::isnan(rect->bottom())) | 699 std::isnan(rect->right()) || std::isnan(rect->bottom())) |
| 715 *rect = gfx::RectF(); | 700 *rect = gfx::RectF(); |
| 716 } | 701 } |
| 717 | 702 |
| 703 void PostConcatSublayerScale(const int effect_node_id, |
| 704 const EffectTree& effect_tree, |
| 705 gfx::Transform* transform) { |
| 706 // TODO(jaydasika): This function should not compute target effect node id. It |
| 707 // should receive it from callers. |
| 708 const EffectNode* effect_node = effect_tree.Node(effect_node_id); |
| 709 const EffectNode* target_effect_node = |
| 710 effect_node->has_render_surface |
| 711 ? effect_node |
| 712 : effect_tree.Node(effect_node->target_id); |
| 713 transform->matrix().postScale(target_effect_node->sublayer_scale.x(), |
| 714 target_effect_node->sublayer_scale.y(), 1.f); |
| 715 } |
| 716 |
| 717 void ConcatInverseSublayerScale(const int effect_node_id, |
| 718 const EffectTree& effect_tree, |
| 719 gfx::Transform* transform) { |
| 720 const EffectNode* effect_node = effect_tree.Node(effect_node_id); |
| 721 if (effect_node->sublayer_scale.x() != 0.0 && |
| 722 effect_node->sublayer_scale.y() != 0.0) |
| 723 transform->Scale(1.0 / effect_node->sublayer_scale.x(), |
| 724 1.0 / effect_node->sublayer_scale.y()); |
| 725 } |
| 726 |
| 718 void ComputeClips(ClipTree* clip_tree, | 727 void ComputeClips(ClipTree* clip_tree, |
| 719 const TransformTree& transform_tree, | 728 const TransformTree& transform_tree, |
| 720 const EffectTree& effect_tree, | 729 const EffectTree& effect_tree, |
| 721 bool non_root_surfaces_enabled) { | 730 bool non_root_surfaces_enabled) { |
| 722 if (!clip_tree->needs_update()) | 731 if (!clip_tree->needs_update()) |
| 723 return; | 732 return; |
| 724 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { | 733 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { |
| 725 ClipNode* clip_node = clip_tree->Node(i); | 734 ClipNode* clip_node = clip_tree->Node(i); |
| 726 | 735 |
| 727 if (clip_node->id == 1) { | 736 if (clip_node->id == 1) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 754 gfx::RectF parent_clip_in_target_space = | 763 gfx::RectF parent_clip_in_target_space = |
| 755 parent_clip_node->clip_in_target_space; | 764 parent_clip_node->clip_in_target_space; |
| 756 if (parent_target_transform_node && | 765 if (parent_target_transform_node && |
| 757 parent_target_transform_node->id != clip_node->target_transform_id && | 766 parent_target_transform_node->id != clip_node->target_transform_id && |
| 758 non_root_surfaces_enabled) { | 767 non_root_surfaces_enabled) { |
| 759 success &= transform_tree.ComputeTransform( | 768 success &= transform_tree.ComputeTransform( |
| 760 parent_target_transform_node->id, clip_node->target_transform_id, | 769 parent_target_transform_node->id, clip_node->target_transform_id, |
| 761 &parent_to_current); | 770 &parent_to_current); |
| 762 // We don't have to apply sublayer scale when target is root. | 771 // We don't have to apply sublayer scale when target is root. |
| 763 if (clip_node->target_transform_id != 0) { | 772 if (clip_node->target_transform_id != 0) { |
| 764 ApplySublayerScale(clip_node->target_effect_id, effect_tree, | 773 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, |
| 765 &parent_to_current); | 774 &parent_to_current); |
| 766 #if DCHECK_IS_ON() | 775 #if DCHECK_IS_ON() |
| 767 VerifySublayerScalesMatch(clip_node->target_effect_id, | 776 VerifySublayerScalesMatch(clip_node->target_effect_id, |
| 768 clip_node->target_transform_id, effect_tree, | 777 clip_node->target_transform_id, effect_tree, |
| 769 transform_tree); | 778 transform_tree); |
| 770 #endif | 779 #endif |
| 771 } | 780 } |
| 772 if (parent_target_transform_node->sublayer_scale.x() > 0 && | 781 if (parent_target_transform_node->sublayer_scale.x() > 0 && |
| 773 parent_target_transform_node->sublayer_scale.y() > 0) | 782 parent_target_transform_node->sublayer_scale.y() > 0) |
| 774 parent_to_current.Scale( | 783 parent_to_current.Scale( |
| 775 1.f / parent_target_transform_node->sublayer_scale.x(), | 784 1.f / parent_target_transform_node->sublayer_scale.x(), |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 source_to_target = transform_tree.ToScreen(clip_node->transform_id); | 837 source_to_target = transform_tree.ToScreen(clip_node->transform_id); |
| 829 } else if (transform_tree.ContentTargetId(transform_node->id) == | 838 } else if (transform_tree.ContentTargetId(transform_node->id) == |
| 830 clip_node->target_transform_id) { | 839 clip_node->target_transform_id) { |
| 831 source_to_target = transform_tree.ToTarget(clip_node->transform_id); | 840 source_to_target = transform_tree.ToTarget(clip_node->transform_id); |
| 832 } else { | 841 } else { |
| 833 success = transform_tree.ComputeTransform( | 842 success = transform_tree.ComputeTransform( |
| 834 transform_node->id, clip_node->target_transform_id, | 843 transform_node->id, clip_node->target_transform_id, |
| 835 &source_to_target); | 844 &source_to_target); |
| 836 // We don't have to apply sublayer scale when target is root. | 845 // We don't have to apply sublayer scale when target is root. |
| 837 if (clip_node->target_transform_id != 0) { | 846 if (clip_node->target_transform_id != 0) { |
| 838 ApplySublayerScale(clip_node->target_effect_id, effect_tree, | 847 PostConcatSublayerScale(clip_node->target_effect_id, effect_tree, |
| 839 &source_to_target); | 848 &source_to_target); |
| 840 #if DCHECK_IS_ON() | 849 #if DCHECK_IS_ON() |
| 841 VerifySublayerScalesMatch(clip_node->target_effect_id, | 850 VerifySublayerScalesMatch(clip_node->target_effect_id, |
| 842 clip_node->target_transform_id, effect_tree, | 851 clip_node->target_transform_id, effect_tree, |
| 843 transform_tree); | 852 transform_tree); |
| 844 #endif | 853 #endif |
| 845 } | 854 } |
| 846 // source_to_target computation should be successful as target is an | 855 // source_to_target computation should be successful as target is an |
| 847 // ancestor of the transform node. | 856 // ancestor of the transform node. |
| 848 DCHECK(success); | 857 DCHECK(success); |
| 849 } | 858 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 static void VerifyDrawTransformsMatch(LayerImpl* layer, | 999 static void VerifyDrawTransformsMatch(LayerImpl* layer, |
| 991 PropertyTrees* property_trees) { | 1000 PropertyTrees* property_trees) { |
| 992 const int source_id = layer->transform_tree_index(); | 1001 const int source_id = layer->transform_tree_index(); |
| 993 int destination_id = FindTargetTransformTreeIndexFromEffectTree( | 1002 int destination_id = FindTargetTransformTreeIndexFromEffectTree( |
| 994 property_trees->effect_tree, layer->effect_tree_index()); | 1003 property_trees->effect_tree, layer->effect_tree_index()); |
| 995 gfx::Transform draw_transform; | 1004 gfx::Transform draw_transform; |
| 996 property_trees->transform_tree.ComputeTransform(source_id, destination_id, | 1005 property_trees->transform_tree.ComputeTransform(source_id, destination_id, |
| 997 &draw_transform); | 1006 &draw_transform); |
| 998 // We don't have to apply sublayer scale when target is root. | 1007 // We don't have to apply sublayer scale when target is root. |
| 999 if (destination_id != 0) { | 1008 if (destination_id != 0) { |
| 1000 ApplySublayerScale(layer->effect_tree_index(), property_trees->effect_tree, | 1009 PostConcatSublayerScale(layer->effect_tree_index(), |
| 1001 &draw_transform); | 1010 property_trees->effect_tree, &draw_transform); |
| 1002 #if DCHECK_IS_ON() | 1011 #if DCHECK_IS_ON() |
| 1003 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id, | 1012 VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id, |
| 1004 property_trees->effect_tree, | 1013 property_trees->effect_tree, |
| 1005 property_trees->transform_tree); | 1014 property_trees->transform_tree); |
| 1006 #endif | 1015 #endif |
| 1007 } | 1016 } |
| 1008 if (layer->should_flatten_transform_from_property_tree()) | 1017 if (layer->should_flatten_transform_from_property_tree()) |
| 1009 draw_transform.FlattenTo2d(); | 1018 draw_transform.FlattenTo2d(); |
| 1010 draw_transform.Translate(layer->offset_to_transform_parent().x(), | 1019 draw_transform.Translate(layer->offset_to_transform_parent().x(), |
| 1011 layer->offset_to_transform_parent().y()); | 1020 layer->offset_to_transform_parent().y()); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1187 return; | 1196 return; |
| 1188 } | 1197 } |
| 1189 | 1198 |
| 1190 gfx::Transform render_surface_transform; | 1199 gfx::Transform render_surface_transform; |
| 1191 const TransformNode* target_transform_node = | 1200 const TransformNode* target_transform_node = |
| 1192 transform_tree.Node(transform_tree.TargetId(transform_node->id)); | 1201 transform_tree.Node(transform_tree.TargetId(transform_node->id)); |
| 1193 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, | 1202 transform_tree.ComputeTransform(transform_node->id, target_transform_node->id, |
| 1194 &render_surface_transform); | 1203 &render_surface_transform); |
| 1195 // We don't have to apply sublayer scale when target is root. | 1204 // We don't have to apply sublayer scale when target is root. |
| 1196 if (target_transform_node->id != 0) { | 1205 if (target_transform_node->id != 0) { |
| 1197 ApplySublayerScale(effect_node->target_id, effect_tree, | 1206 PostConcatSublayerScale(effect_node->target_id, effect_tree, |
| 1198 &render_surface_transform); | 1207 &render_surface_transform); |
| 1199 #if DCHECK_IS_ON() | 1208 #if DCHECK_IS_ON() |
| 1200 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id, | 1209 VerifySublayerScalesMatch(effect_node->target_id, target_transform_node->id, |
| 1201 effect_tree, transform_tree); | 1210 effect_tree, transform_tree); |
| 1202 #endif | 1211 #endif |
| 1203 } | 1212 } |
| 1204 | 1213 |
| 1205 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale); | 1214 DCHECK(transform_node->sublayer_scale == effect_node->sublayer_scale); |
| 1206 if (effect_node->sublayer_scale.x() != 0.0 && | 1215 if (effect_node->sublayer_scale.x() != 0.0 && |
| 1207 effect_node->sublayer_scale.y() != 0.0) | 1216 effect_node->sublayer_scale.y() != 0.0) |
| 1208 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(), | 1217 render_surface_transform.Scale(1.0 / effect_node->sublayer_scale.x(), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 transform_tree.TargetId(transform_node->id), | 1254 transform_tree.TargetId(transform_node->id), |
| 1246 &clip_parent_target_to_target); | 1255 &clip_parent_target_to_target); |
| 1247 | 1256 |
| 1248 if (!success) { | 1257 if (!success) { |
| 1249 render_surface->SetClipRect(gfx::Rect()); | 1258 render_surface->SetClipRect(gfx::Rect()); |
| 1250 return; | 1259 return; |
| 1251 } | 1260 } |
| 1252 | 1261 |
| 1253 // We don't have to apply sublayer scale when target is root. | 1262 // We don't have to apply sublayer scale when target is root. |
| 1254 if (transform_tree.TargetId(transform_node->id) != 0) { | 1263 if (transform_tree.TargetId(transform_node->id) != 0) { |
| 1255 ApplySublayerScale(render_surface->EffectTreeIndex(), effect_tree, | 1264 PostConcatSublayerScale(render_surface->EffectTreeIndex(), effect_tree, |
| 1256 &clip_parent_target_to_target); | 1265 &clip_parent_target_to_target); |
| 1257 #if DCHECK_IS_ON() | 1266 #if DCHECK_IS_ON() |
| 1258 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(), | 1267 VerifySublayerScalesMatch(render_surface->EffectTreeIndex(), |
| 1259 transform_tree.TargetId(transform_node->id), | 1268 transform_tree.TargetId(transform_node->id), |
| 1260 effect_tree, transform_tree); | 1269 effect_tree, transform_tree); |
| 1261 #endif | 1270 #endif |
| 1262 } | 1271 } |
| 1263 | 1272 |
| 1264 DCHECK_LT(parent_clip_node->target_transform_id, | 1273 DCHECK_LT(parent_clip_node->target_transform_id, |
| 1265 transform_tree.TargetId(transform_node->id)); | 1274 transform_tree.TargetId(transform_node->id)); |
| 1266 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 1275 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1527 void UpdateElasticOverscroll(PropertyTrees* property_trees, | 1536 void UpdateElasticOverscroll(PropertyTrees* property_trees, |
| 1528 const Layer* overscroll_elasticity_layer, | 1537 const Layer* overscroll_elasticity_layer, |
| 1529 const gfx::Vector2dF& elastic_overscroll) { | 1538 const gfx::Vector2dF& elastic_overscroll) { |
| 1530 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, | 1539 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, |
| 1531 elastic_overscroll); | 1540 elastic_overscroll); |
| 1532 } | 1541 } |
| 1533 | 1542 |
| 1534 } // namespace draw_property_utils | 1543 } // namespace draw_property_utils |
| 1535 | 1544 |
| 1536 } // namespace cc | 1545 } // namespace cc |
| OLD | NEW |