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/property_tree_builder.h" | 5 #include "cc/trees/property_tree_builder.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 Layer* transform_fixed_parent; | 26 Layer* transform_fixed_parent; |
27 Layer* render_target; | 27 Layer* render_target; |
28 int clip_tree_parent; | 28 int clip_tree_parent; |
29 int opacity_tree_parent; | 29 int opacity_tree_parent; |
30 gfx::Vector2dF offset_to_transform_tree_parent; | 30 gfx::Vector2dF offset_to_transform_tree_parent; |
31 gfx::Vector2dF offset_to_transform_fixed_parent; | 31 gfx::Vector2dF offset_to_transform_fixed_parent; |
32 const Layer* page_scale_layer; | 32 const Layer* page_scale_layer; |
33 float page_scale_factor; | 33 float page_scale_factor; |
34 float device_scale_factor; | 34 float device_scale_factor; |
35 bool in_subtree_of_page_scale_application_layer; | 35 bool in_subtree_of_page_scale_application_layer; |
| 36 bool should_flatten; |
36 const gfx::Transform* device_transform; | 37 const gfx::Transform* device_transform; |
37 }; | 38 }; |
38 | 39 |
39 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { | 40 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { |
40 return layer->position_constraint().is_fixed_position() | 41 return layer->position_constraint().is_fixed_position() |
41 ? data.transform_fixed_parent | 42 ? data.transform_fixed_parent |
42 : data.transform_tree_parent; | 43 : data.transform_tree_parent; |
43 } | 44 } |
44 | 45 |
45 static ClipNode* GetClipParent(const DataForRecursion& data, Layer* layer) { | 46 static ClipNode* GetClipParent(const DataForRecursion& data, Layer* layer) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 | 118 |
118 const bool has_significant_transform = | 119 const bool has_significant_transform = |
119 !layer->transform().IsIdentityOr2DTranslation(); | 120 !layer->transform().IsIdentityOr2DTranslation(); |
120 | 121 |
121 const bool has_animated_transform = | 122 const bool has_animated_transform = |
122 layer->layer_animation_controller()->IsAnimatingProperty( | 123 layer->layer_animation_controller()->IsAnimatingProperty( |
123 Animation::TRANSFORM); | 124 Animation::TRANSFORM); |
124 | 125 |
125 const bool has_surface = !!layer->render_surface(); | 126 const bool has_surface = !!layer->render_surface(); |
126 | 127 |
127 const bool flattening_change = layer->parent() && | |
128 layer->should_flatten_transform() && | |
129 !layer->parent()->should_flatten_transform(); | |
130 | |
131 bool requires_node = is_root || is_scrollable || has_significant_transform || | 128 bool requires_node = is_root || is_scrollable || has_significant_transform || |
132 has_animated_transform || has_surface || | 129 has_animated_transform || has_surface || |
133 is_page_scale_application_layer || flattening_change; | 130 is_page_scale_application_layer; |
134 | 131 |
135 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); | 132 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); |
136 | 133 |
137 // May be non-zero if layer is fixed or has a scroll parent. | 134 // May be non-zero if layer is fixed or has a scroll parent. |
138 gfx::Vector2dF parent_offset; | 135 gfx::Vector2dF parent_offset; |
139 if (transform_parent) { | 136 if (transform_parent) { |
140 // TODO(vollick): This is to mimic existing bugs (crbug.com/441447). | 137 // TODO(vollick): This is to mimic existing bugs (crbug.com/441447). |
141 if (!is_fixed) { | 138 if (!is_fixed) { |
142 parent_offset = transform_parent->offset_to_transform_parent(); | 139 parent_offset = transform_parent->offset_to_transform_parent(); |
143 } else if (data_from_ancestor.transform_tree_parent != | 140 } else if (data_from_ancestor.transform_tree_parent != |
(...skipping 21 matching lines...) Expand all Loading... |
165 transform_parent->transform_tree_index(), &to_parent); | 162 transform_parent->transform_tree_index(), &to_parent); |
166 | 163 |
167 parent_offset += to_parent.To2dTranslation(); | 164 parent_offset += to_parent.To2dTranslation(); |
168 } | 165 } |
169 | 166 |
170 if (layer->IsContainerForFixedPositionLayers() || is_root) | 167 if (layer->IsContainerForFixedPositionLayers() || is_root) |
171 data_for_children->transform_fixed_parent = layer; | 168 data_for_children->transform_fixed_parent = layer; |
172 data_for_children->transform_tree_parent = layer; | 169 data_for_children->transform_tree_parent = layer; |
173 | 170 |
174 if (!requires_node) { | 171 if (!requires_node) { |
| 172 data_for_children->should_flatten |= layer->should_flatten_transform(); |
175 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + | 173 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + |
176 layer->transform().To2dTranslation(); | 174 layer->transform().To2dTranslation(); |
177 layer->set_offset_to_transform_parent(parent_offset + local_offset); | 175 layer->set_offset_to_transform_parent(parent_offset + local_offset); |
178 layer->set_transform_tree_index(transform_parent->transform_tree_index()); | 176 layer->set_transform_tree_index(transform_parent->transform_tree_index()); |
179 return; | 177 return; |
180 } | 178 } |
181 | 179 |
182 int parent_index = 0; | 180 int parent_index = 0; |
183 if (transform_parent) | 181 if (transform_parent) |
184 parent_index = transform_parent->transform_tree_index(); | 182 parent_index = transform_parent->transform_tree_index(); |
185 | 183 |
186 data_for_children->transform_tree->Insert(TransformNode(), parent_index); | 184 data_for_children->transform_tree->Insert(TransformNode(), parent_index); |
187 | 185 |
188 TransformNode* node = data_for_children->transform_tree->back(); | 186 TransformNode* node = data_for_children->transform_tree->back(); |
189 layer->set_transform_tree_index(node->id); | 187 layer->set_transform_tree_index(node->id); |
190 | 188 |
191 node->data.scrolls = is_scrollable; | 189 node->data.scrolls = is_scrollable; |
192 node->data.flattens = layer->should_flatten_transform(); | 190 node->data.flattens_inherited_transform = data_for_children->should_flatten; |
| 191 node->data.flattens_local_transform = layer->should_flatten_transform(); |
| 192 data_for_children->should_flatten = false; |
193 node->data.target_id = | 193 node->data.target_id = |
194 data_from_ancestor.render_target->transform_tree_index(); | 194 data_from_ancestor.render_target->transform_tree_index(); |
195 node->data.content_target_id = | 195 node->data.content_target_id = |
196 data_for_children->render_target->transform_tree_index(); | 196 data_for_children->render_target->transform_tree_index(); |
197 DCHECK_NE(node->data.target_id, -1); | 197 DCHECK_NE(node->data.target_id, -1); |
198 node->data.is_animated = layer->TransformIsAnimating(); | 198 node->data.is_animated = layer->TransformIsAnimating(); |
199 | 199 |
200 float scale_factors = 1.0f; | 200 float scale_factors = 1.0f; |
201 if (is_root) { | 201 if (is_root) { |
202 node->data.post_local = *data_from_ancestor.device_transform; | 202 node->data.post_local = *data_from_ancestor.device_transform; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 data_for_recursion.opacity_tree = opacity_tree; | 309 data_for_recursion.opacity_tree = opacity_tree; |
310 data_for_recursion.transform_tree_parent = nullptr; | 310 data_for_recursion.transform_tree_parent = nullptr; |
311 data_for_recursion.transform_fixed_parent = nullptr; | 311 data_for_recursion.transform_fixed_parent = nullptr; |
312 data_for_recursion.render_target = root_layer; | 312 data_for_recursion.render_target = root_layer; |
313 data_for_recursion.clip_tree_parent = 0; | 313 data_for_recursion.clip_tree_parent = 0; |
314 data_for_recursion.opacity_tree_parent = -1; | 314 data_for_recursion.opacity_tree_parent = -1; |
315 data_for_recursion.page_scale_layer = page_scale_layer; | 315 data_for_recursion.page_scale_layer = page_scale_layer; |
316 data_for_recursion.page_scale_factor = page_scale_factor; | 316 data_for_recursion.page_scale_factor = page_scale_factor; |
317 data_for_recursion.device_scale_factor = device_scale_factor; | 317 data_for_recursion.device_scale_factor = device_scale_factor; |
318 data_for_recursion.in_subtree_of_page_scale_application_layer = false; | 318 data_for_recursion.in_subtree_of_page_scale_application_layer = false; |
| 319 data_for_recursion.should_flatten = false; |
319 data_for_recursion.device_transform = &device_transform; | 320 data_for_recursion.device_transform = &device_transform; |
320 | 321 |
321 ClipNode root_clip; | 322 ClipNode root_clip; |
322 root_clip.data.clip = viewport; | 323 root_clip.data.clip = viewport; |
323 root_clip.data.transform_id = 0; | 324 root_clip.data.transform_id = 0; |
324 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); | 325 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); |
325 BuildPropertyTreesInternal(root_layer, data_for_recursion); | 326 BuildPropertyTreesInternal(root_layer, data_for_recursion); |
326 } | 327 } |
327 | 328 |
328 } // namespace cc | 329 } // namespace cc |
OLD | NEW |