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" |
11 #include "cc/layers/layer.h" | 11 #include "cc/layers/layer.h" |
12 #include "cc/trees/layer_tree_host.h" | 12 #include "cc/trees/layer_tree_host.h" |
13 #include "ui/gfx/geometry/point_f.h" | 13 #include "ui/gfx/geometry/point_f.h" |
14 | 14 |
15 namespace cc { | 15 namespace cc { |
16 | 16 |
17 class LayerTreeHost; | 17 class LayerTreeHost; |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 struct DataForRecursion { | 21 struct DataForRecursion { |
22 TransformTree* transform_tree; | 22 TransformTree* transform_tree; |
23 ClipTree* clip_tree; | 23 ClipTree* clip_tree; |
24 OpacityTree* opacity_tree; | 24 OpacityTree* opacity_tree; |
25 Layer* transform_tree_parent; | 25 Layer* transform_tree_parent; |
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; | |
31 gfx::Vector2dF offset_to_transform_fixed_parent; | |
32 const Layer* page_scale_layer; | 30 const Layer* page_scale_layer; |
33 float page_scale_factor; | 31 float page_scale_factor; |
34 float device_scale_factor; | 32 float device_scale_factor; |
35 bool in_subtree_of_page_scale_application_layer; | 33 bool in_subtree_of_page_scale_application_layer; |
36 bool should_flatten; | 34 bool should_flatten; |
37 const gfx::Transform* device_transform; | 35 const gfx::Transform* device_transform; |
38 }; | 36 }; |
39 | 37 |
40 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { | 38 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { |
41 return layer->position_constraint().is_fixed_position() | 39 return layer->position_constraint().is_fixed_position() |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 Animation::TRANSFORM); | 122 Animation::TRANSFORM); |
125 | 123 |
126 const bool has_surface = !!layer->render_surface(); | 124 const bool has_surface = !!layer->render_surface(); |
127 | 125 |
128 bool requires_node = is_root || is_scrollable || has_significant_transform || | 126 bool requires_node = is_root || is_scrollable || has_significant_transform || |
129 has_animated_transform || has_surface || | 127 has_animated_transform || has_surface || |
130 is_page_scale_application_layer; | 128 is_page_scale_application_layer; |
131 | 129 |
132 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); | 130 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); |
133 | 131 |
134 // May be non-zero if layer is fixed or has a scroll parent. | |
135 gfx::Vector2dF parent_offset; | 132 gfx::Vector2dF parent_offset; |
136 if (transform_parent) { | 133 if (transform_parent) { |
137 // TODO(vollick): This is to mimic existing bugs (crbug.com/441447). | 134 if (layer->scroll_parent()) { |
138 if (!is_fixed) { | 135 gfx::Transform to_parent; |
| 136 Layer* source = layer->parent(); |
| 137 parent_offset += source->offset_to_transform_parent(); |
| 138 data_from_ancestor.transform_tree->ComputeTransform( |
| 139 source->transform_tree_index(), |
| 140 transform_parent->transform_tree_index(), &to_parent); |
| 141 parent_offset += to_parent.To2dTranslation(); |
| 142 } else if (!is_fixed) { |
139 parent_offset = transform_parent->offset_to_transform_parent(); | 143 parent_offset = transform_parent->offset_to_transform_parent(); |
140 } else if (data_from_ancestor.transform_tree_parent != | 144 } else if (data_from_ancestor.transform_tree_parent != |
141 data_from_ancestor.transform_fixed_parent) { | 145 data_from_ancestor.transform_fixed_parent) { |
142 gfx::Vector2dF fixed_offset = data_from_ancestor.transform_tree_parent | 146 gfx::Vector2dF fixed_offset = data_from_ancestor.transform_tree_parent |
143 ->offset_to_transform_parent(); | 147 ->offset_to_transform_parent(); |
144 gfx::Transform parent_to_parent; | 148 gfx::Transform parent_to_parent; |
145 data_from_ancestor.transform_tree->ComputeTransform( | 149 data_from_ancestor.transform_tree->ComputeTransform( |
146 data_from_ancestor.transform_tree_parent->transform_tree_index(), | 150 data_from_ancestor.transform_tree_parent->transform_tree_index(), |
147 data_from_ancestor.transform_fixed_parent->transform_tree_index(), | 151 data_from_ancestor.transform_fixed_parent->transform_tree_index(), |
148 &parent_to_parent); | 152 &parent_to_parent); |
149 | 153 |
150 fixed_offset += parent_to_parent.To2dTranslation(); | 154 fixed_offset += parent_to_parent.To2dTranslation(); |
151 parent_offset += fixed_offset; | 155 parent_offset += fixed_offset; |
152 } | 156 } |
153 | |
154 gfx::Transform to_parent; | |
155 Layer* source = data_from_ancestor.transform_tree_parent; | |
156 if (layer->scroll_parent()) { | |
157 source = layer->parent(); | |
158 parent_offset += layer->parent()->offset_to_transform_parent(); | |
159 } | |
160 data_from_ancestor.transform_tree->ComputeTransform( | |
161 source->transform_tree_index(), | |
162 transform_parent->transform_tree_index(), &to_parent); | |
163 | |
164 parent_offset += to_parent.To2dTranslation(); | |
165 } | 157 } |
166 | 158 |
167 if (layer->IsContainerForFixedPositionLayers() || is_root) | 159 if (layer->IsContainerForFixedPositionLayers() || is_root) |
168 data_for_children->transform_fixed_parent = layer; | 160 data_for_children->transform_fixed_parent = layer; |
169 data_for_children->transform_tree_parent = layer; | 161 data_for_children->transform_tree_parent = layer; |
170 | 162 |
171 if (!requires_node) { | 163 if (!requires_node) { |
172 data_for_children->should_flatten |= layer->should_flatten_transform(); | 164 data_for_children->should_flatten |= layer->should_flatten_transform(); |
173 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + | 165 gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + |
174 layer->transform().To2dTranslation(); | 166 layer->transform().To2dTranslation(); |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 data_for_recursion.device_transform = &device_transform; | 319 data_for_recursion.device_transform = &device_transform; |
328 | 320 |
329 ClipNode root_clip; | 321 ClipNode root_clip; |
330 root_clip.data.clip = viewport; | 322 root_clip.data.clip = viewport; |
331 root_clip.data.transform_id = 0; | 323 root_clip.data.transform_id = 0; |
332 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); | 324 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); |
333 BuildPropertyTreesInternal(root_layer, data_for_recursion); | 325 BuildPropertyTreesInternal(root_layer, data_for_recursion); |
334 } | 326 } |
335 | 327 |
336 } // namespace cc | 328 } // namespace cc |
OLD | NEW |