| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 // The clip node stores clip rect in its target space. If required, | 78 // The clip node stores clip rect in its target space. If required, |
| 79 // this clip rect should be mapped to the current layer's target space. | 79 // this clip rect should be mapped to the current layer's target space. |
| 80 gfx::Rect clip_rect_in_target_space; | 80 gfx::Rect clip_rect_in_target_space; |
| 81 gfx::Rect combined_clip_rect_in_target_space; | 81 gfx::Rect combined_clip_rect_in_target_space; |
| 82 bool success = true; | 82 bool success = true; |
| 83 | 83 |
| 84 // When we only have a root surface, the clip node and the layer must | 84 // When we only have a root surface, the clip node and the layer must |
| 85 // necessarily have the same target (the root). | 85 // necessarily have the same target (the root). |
| 86 if (clip_node->data.target_id != target_node->id && | 86 if (clip_node->data.target_id != target_node->id && |
| 87 non_root_surfaces_enabled) { | 87 non_root_surfaces_enabled) { |
| 88 // In this case, layer has a clip parent (or shares the target with an | 88 // In this case, layer has a clip parent or scroll parent (or shares the |
| 89 // ancestor layer that has clip parent) and the clip parent's target is | 89 // target with an ancestor layer that has clip parent) and the clip |
| 90 // different from the layer's target. As the layer's target has | 90 // parent's target is different from the layer's target. As the layer's |
| 91 // unclippped descendants, it is unclippped. | 91 // target has unclippped descendants, it is unclippped. |
| 92 if (!clip_node->data.layers_are_clipped) { | 92 if (!clip_node->data.layers_are_clipped) { |
| 93 layer->set_visible_rect_from_property_trees(gfx::Rect(layer_bounds)); | 93 layer->set_visible_rect_from_property_trees(gfx::Rect(layer_bounds)); |
| 94 layer->set_clip_rect_in_target_space_from_property_trees(gfx::Rect()); | 94 layer->set_clip_rect_in_target_space_from_property_trees(gfx::Rect()); |
| 95 continue; | 95 continue; |
| 96 } | 96 } |
| 97 gfx::Transform clip_to_target; | 97 gfx::Transform clip_to_target; |
| 98 success = transform_tree.ComputeTransform( | 98 if (clip_node->data.target_id > target_node->id) { |
| 99 clip_node->data.target_id, target_node->id, &clip_to_target); | 99 // In this case, layer has a scroll parent. We need to keep the scale |
| 100 // at the layer's target but remove the scale at the scroll parent's |
| 101 // target. |
| 102 success = transform_tree.ComputeTransformWithDestinationSublayerScale( |
| 103 clip_node->data.target_id, target_node->id, &clip_to_target); |
| 104 const TransformNode* source_node = |
| 105 transform_tree.Node(clip_node->data.target_id); |
| 106 if (source_node->data.sublayer_scale.x() != 0.f && |
| 107 source_node->data.sublayer_scale.y() != 0.f) |
| 108 clip_to_target.Scale(1.0f / source_node->data.sublayer_scale.x(), |
| 109 1.0f / source_node->data.sublayer_scale.y()); |
| 110 } else { |
| 111 success = transform_tree.ComputeTransform( |
| 112 clip_node->data.target_id, target_node->id, &clip_to_target); |
| 113 } |
| 100 if (!success) { | 114 if (!success) { |
| 101 // An animated singular transform may become non-singular during the | 115 // An animated singular transform may become non-singular during the |
| 102 // animation, so we still need to compute a visible rect. In this | 116 // animation, so we still need to compute a visible rect. In this |
| 103 // situation, we treat the entire layer as visible. | 117 // situation, we treat the entire layer as visible. |
| 104 layer->set_visible_rect_from_property_trees(gfx::Rect(layer_bounds)); | 118 layer->set_visible_rect_from_property_trees(gfx::Rect(layer_bounds)); |
| 105 layer->set_clip_rect_in_target_space_from_property_trees(gfx::Rect()); | 119 layer->set_clip_rect_in_target_space_from_property_trees(gfx::Rect()); |
| 106 continue; | 120 continue; |
| 107 } | 121 } |
| 108 DCHECK_LT(clip_node->data.target_id, target_node->id); | |
| 109 // We use the clip node's clip_in_target_space (and not | 122 // We use the clip node's clip_in_target_space (and not |
| 110 // combined_clip_in_target_space) here because we want to clip | 123 // combined_clip_in_target_space) here because we want to clip |
| 111 // with respect to clip parent's local clip and not its combined clip as | 124 // with respect to clip parent's local clip and not its combined clip as |
| 112 // the combined clip has even the clip parent's target's clip baked into | 125 // the combined clip has even the clip parent's target's clip baked into |
| 113 // it and as our target is different, we don't want to use it in our | 126 // it and as our target is different, we don't want to use it in our |
| 114 // visible rect computation. | 127 // visible rect computation. |
| 115 combined_clip_rect_in_target_space = | 128 if (clip_node->data.target_id < target_node->id) { |
| 116 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 129 combined_clip_rect_in_target_space = |
| 117 clip_to_target, clip_node->data.clip_in_target_space)); | 130 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
| 118 clip_rect_in_target_space = | 131 clip_to_target, clip_node->data.clip_in_target_space)); |
| 119 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 132 clip_rect_in_target_space = |
| 120 clip_to_target, clip_node->data.clip_in_target_space)); | 133 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
| 134 clip_to_target, clip_node->data.clip_in_target_space)); |
| 135 } else { |
| 136 combined_clip_rect_in_target_space = |
| 137 gfx::ToEnclosingRect(MathUtil::MapClippedRect( |
| 138 clip_to_target, clip_node->data.clip_in_target_space)); |
| 139 clip_rect_in_target_space = |
| 140 gfx::ToEnclosingRect(MathUtil::MapClippedRect( |
| 141 clip_to_target, clip_node->data.clip_in_target_space)); |
| 142 } |
| 143 |
| 121 } else { | 144 } else { |
| 122 clip_rect_in_target_space = | 145 clip_rect_in_target_space = |
| 123 gfx::ToEnclosingRect(clip_node->data.clip_in_target_space); | 146 gfx::ToEnclosingRect(clip_node->data.clip_in_target_space); |
| 124 if (clip_node->data.target_is_clipped || !non_root_surfaces_enabled) | 147 if (clip_node->data.target_is_clipped || !non_root_surfaces_enabled) |
| 125 combined_clip_rect_in_target_space = gfx::ToEnclosingRect( | 148 combined_clip_rect_in_target_space = gfx::ToEnclosingRect( |
| 126 clip_node->data.combined_clip_in_target_space); | 149 clip_node->data.combined_clip_in_target_space); |
| 127 else | 150 else |
| 128 combined_clip_rect_in_target_space = clip_rect_in_target_space; | 151 combined_clip_rect_in_target_space = clip_rect_in_target_space; |
| 129 } | 152 } |
| 130 | 153 |
| (...skipping 1046 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 | 1200 |
| 1178 void UpdateElasticOverscrollInPropertyTrees( | 1201 void UpdateElasticOverscrollInPropertyTrees( |
| 1179 PropertyTrees* property_trees, | 1202 PropertyTrees* property_trees, |
| 1180 const Layer* overscroll_elasticity_layer, | 1203 const Layer* overscroll_elasticity_layer, |
| 1181 const gfx::Vector2dF& elastic_overscroll) { | 1204 const gfx::Vector2dF& elastic_overscroll) { |
| 1182 UpdateElasticOverscrollInPropertyTreesInternal( | 1205 UpdateElasticOverscrollInPropertyTreesInternal( |
| 1183 property_trees, overscroll_elasticity_layer, elastic_overscroll); | 1206 property_trees, overscroll_elasticity_layer, elastic_overscroll); |
| 1184 } | 1207 } |
| 1185 | 1208 |
| 1186 } // namespace cc | 1209 } // namespace cc |
| OLD | NEW |