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 |