Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(521)

Side by Side Diff: cc/trees/property_tree_builder.cc

Issue 960873002: Update from https://crrev.com/318214 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/property_tree_builder.h ('k') | cc/trees/single_thread_proxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 Layer* transform_tree_parent; 25 Layer* transform_tree_parent;
25 Layer* transform_fixed_parent; 26 Layer* transform_fixed_parent;
26 Layer* render_target; 27 Layer* render_target;
27 int clip_tree_parent; 28 int clip_tree_parent;
29 int opacity_tree_parent;
28 gfx::Vector2dF offset_to_transform_tree_parent; 30 gfx::Vector2dF offset_to_transform_tree_parent;
29 gfx::Vector2dF offset_to_transform_fixed_parent; 31 gfx::Vector2dF offset_to_transform_fixed_parent;
30 const Layer* page_scale_layer; 32 const Layer* page_scale_layer;
31 float page_scale_factor; 33 float page_scale_factor;
32 float device_scale_factor; 34 float device_scale_factor;
33 bool in_subtree_of_page_scale_application_layer; 35 bool in_subtree_of_page_scale_application_layer;
34 const gfx::Transform* device_transform; 36 const gfx::Transform* device_transform;
35 }; 37 };
36 38
37 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) { 39 static Layer* GetTransformParent(const DataForRecursion& data, Layer* layer) {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 const bool is_scrollable = layer->scrollable(); 115 const bool is_scrollable = layer->scrollable();
114 const bool is_fixed = layer->position_constraint().is_fixed_position(); 116 const bool is_fixed = layer->position_constraint().is_fixed_position();
115 117
116 const bool has_significant_transform = 118 const bool has_significant_transform =
117 !layer->transform().IsIdentityOr2DTranslation(); 119 !layer->transform().IsIdentityOr2DTranslation();
118 120
119 const bool has_animated_transform = 121 const bool has_animated_transform =
120 layer->layer_animation_controller()->IsAnimatingProperty( 122 layer->layer_animation_controller()->IsAnimatingProperty(
121 Animation::TRANSFORM); 123 Animation::TRANSFORM);
122 124
123 const bool has_transform_origin = layer->transform_origin() != gfx::Point3F();
124
125 const bool has_surface = !!layer->render_surface(); 125 const bool has_surface = !!layer->render_surface();
126 126
127 const bool flattening_change = layer->parent() && 127 const bool flattening_change = layer->parent() &&
128 layer->should_flatten_transform() && 128 layer->should_flatten_transform() &&
129 !layer->parent()->should_flatten_transform(); 129 !layer->parent()->should_flatten_transform();
130 130
131 bool requires_node = is_root || is_scrollable || is_fixed || 131 bool requires_node = is_root || is_scrollable || is_fixed ||
132 has_significant_transform || has_animated_transform || 132 has_significant_transform || has_animated_transform ||
133 is_page_scale_application_layer || flattening_change || 133 is_page_scale_application_layer || flattening_change ||
134 has_transform_origin || has_surface; 134 has_surface;
135 135
136 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer); 136 Layer* transform_parent = GetTransformParent(data_from_ancestor, layer);
137 137
138 // May be non-zero if layer is fixed or has a scroll parent. 138 // May be non-zero if layer is fixed or has a scroll parent.
139 gfx::Vector2dF parent_offset; 139 gfx::Vector2dF parent_offset;
140 if (transform_parent) { 140 if (transform_parent) {
141 // TODO(vollick): This is to mimic existing bugs (crbug.com/441447). 141 // TODO(vollick): This is to mimic existing bugs (crbug.com/441447).
142 if (!is_fixed) 142 if (!is_fixed)
143 parent_offset = transform_parent->offset_to_transform_parent(); 143 parent_offset = transform_parent->offset_to_transform_parent();
144 144
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 node->data.pre_local.Translate3d(-layer->transform_origin().x(), 216 node->data.pre_local.Translate3d(-layer->transform_origin().x(),
217 -layer->transform_origin().y(), 217 -layer->transform_origin().y(),
218 -layer->transform_origin().z()); 218 -layer->transform_origin().z());
219 219
220 node->data.needs_local_transform_update = true; 220 node->data.needs_local_transform_update = true;
221 data_from_ancestor.transform_tree->UpdateTransforms(node->id); 221 data_from_ancestor.transform_tree->UpdateTransforms(node->id);
222 222
223 layer->set_offset_to_transform_parent(gfx::Vector2dF()); 223 layer->set_offset_to_transform_parent(gfx::Vector2dF());
224 } 224 }
225 225
226 void AddOpacityNodeIfNeeded(const DataForRecursion& data_from_ancestor,
227 Layer* layer,
228 DataForRecursion* data_for_children) {
229 const bool is_root = !layer->parent();
230 const bool has_transparency = layer->opacity() != 1.f;
231 const bool has_animated_opacity =
232 layer->layer_animation_controller()->IsAnimatingProperty(
233 Animation::OPACITY) ||
234 layer->OpacityCanAnimateOnImplThread();
235 bool requires_node = is_root || has_transparency || has_animated_opacity;
236
237 int parent_id = data_from_ancestor.opacity_tree_parent;
238
239 if (!requires_node) {
240 layer->set_opacity_tree_index(parent_id);
241 data_for_children->opacity_tree_parent = parent_id;
242 return;
243 }
244
245 OpacityNode node;
246 node.data = layer->opacity();
247 data_for_children->opacity_tree_parent =
248 data_for_children->opacity_tree->Insert(node, parent_id);
249 layer->set_opacity_tree_index(data_for_children->opacity_tree_parent);
250 }
251
226 void BuildPropertyTreesInternal(Layer* layer, 252 void BuildPropertyTreesInternal(Layer* layer,
227 const DataForRecursion& data_from_parent) { 253 const DataForRecursion& data_from_parent) {
228 DataForRecursion data_for_children(data_from_parent); 254 DataForRecursion data_for_children(data_from_parent);
229 if (layer->render_surface()) 255 if (layer->render_surface())
230 data_for_children.render_target = layer; 256 data_for_children.render_target = layer;
231 257
232 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children); 258 AddTransformNodeIfNeeded(data_from_parent, layer, &data_for_children);
233 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children); 259 AddClipNodeIfNeeded(data_from_parent, layer, &data_for_children);
234 260
261 if (data_from_parent.opacity_tree)
262 AddOpacityNodeIfNeeded(data_from_parent, layer, &data_for_children);
263
235 if (layer == data_from_parent.page_scale_layer) 264 if (layer == data_from_parent.page_scale_layer)
236 data_for_children.in_subtree_of_page_scale_application_layer = true; 265 data_for_children.in_subtree_of_page_scale_application_layer = true;
237 266
238 for (size_t i = 0; i < layer->children().size(); ++i) { 267 for (size_t i = 0; i < layer->children().size(); ++i) {
239 if (!layer->children()[i]->scroll_parent()) 268 if (!layer->children()[i]->scroll_parent())
240 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children); 269 BuildPropertyTreesInternal(layer->children()[i].get(), data_for_children);
241 } 270 }
242 271
243 if (layer->scroll_children()) { 272 if (layer->scroll_children()) {
244 for (Layer* scroll_child : *layer->scroll_children()) { 273 for (Layer* scroll_child : *layer->scroll_children()) {
245 BuildPropertyTreesInternal(scroll_child, data_for_children); 274 BuildPropertyTreesInternal(scroll_child, data_for_children);
246 } 275 }
247 } 276 }
248 277
249 if (layer->has_replica()) 278 if (layer->has_replica())
250 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children); 279 BuildPropertyTreesInternal(layer->replica_layer(), data_for_children);
251 } 280 }
252 281
253 } // namespace 282 } // namespace
254 283
255 void PropertyTreeBuilder::BuildPropertyTrees( 284 void PropertyTreeBuilder::BuildPropertyTrees(
256 Layer* root_layer, 285 Layer* root_layer,
257 const Layer* page_scale_layer, 286 const Layer* page_scale_layer,
258 float page_scale_factor, 287 float page_scale_factor,
259 float device_scale_factor, 288 float device_scale_factor,
260 const gfx::Rect& viewport, 289 const gfx::Rect& viewport,
261 const gfx::Transform& device_transform, 290 const gfx::Transform& device_transform,
262 TransformTree* transform_tree, 291 TransformTree* transform_tree,
263 ClipTree* clip_tree) { 292 ClipTree* clip_tree,
293 OpacityTree* opacity_tree) {
264 DataForRecursion data_for_recursion; 294 DataForRecursion data_for_recursion;
265 data_for_recursion.transform_tree = transform_tree; 295 data_for_recursion.transform_tree = transform_tree;
266 data_for_recursion.clip_tree = clip_tree; 296 data_for_recursion.clip_tree = clip_tree;
297 data_for_recursion.opacity_tree = opacity_tree;
267 data_for_recursion.transform_tree_parent = nullptr; 298 data_for_recursion.transform_tree_parent = nullptr;
268 data_for_recursion.transform_fixed_parent = nullptr; 299 data_for_recursion.transform_fixed_parent = nullptr;
269 data_for_recursion.render_target = root_layer; 300 data_for_recursion.render_target = root_layer;
270 data_for_recursion.clip_tree_parent = 0; 301 data_for_recursion.clip_tree_parent = 0;
302 data_for_recursion.opacity_tree_parent = -1;
271 data_for_recursion.page_scale_layer = page_scale_layer; 303 data_for_recursion.page_scale_layer = page_scale_layer;
272 data_for_recursion.page_scale_factor = page_scale_factor; 304 data_for_recursion.page_scale_factor = page_scale_factor;
273 data_for_recursion.device_scale_factor = device_scale_factor; 305 data_for_recursion.device_scale_factor = device_scale_factor;
274 data_for_recursion.in_subtree_of_page_scale_application_layer = false; 306 data_for_recursion.in_subtree_of_page_scale_application_layer = false;
275 data_for_recursion.device_transform = &device_transform; 307 data_for_recursion.device_transform = &device_transform;
276 308
277 ClipNode root_clip; 309 ClipNode root_clip;
278 root_clip.data.clip = viewport; 310 root_clip.data.clip = viewport;
279 root_clip.data.transform_id = 0; 311 root_clip.data.transform_id = 0;
280 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0); 312 data_for_recursion.clip_tree_parent = clip_tree->Insert(root_clip, 0);
281 BuildPropertyTreesInternal(root_layer, data_for_recursion); 313 BuildPropertyTreesInternal(root_layer, data_for_recursion);
282 } 314 }
283 315
284 } // namespace cc 316 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree_builder.h ('k') | cc/trees/single_thread_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698