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

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

Issue 2118993002: Detemplatize cc property nodes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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
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/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
11 #include "cc/base/math_util.h" 11 #include "cc/base/math_util.h"
12 #include "cc/layers/draw_properties.h" 12 #include "cc/layers/draw_properties.h"
13 #include "cc/layers/layer.h" 13 #include "cc/layers/layer.h"
14 #include "cc/layers/layer_impl.h" 14 #include "cc/layers/layer_impl.h"
15 #include "cc/trees/clip_node.h"
16 #include "cc/trees/effect_node.h"
15 #include "cc/trees/layer_tree_host.h" 17 #include "cc/trees/layer_tree_host.h"
16 #include "cc/trees/layer_tree_impl.h" 18 #include "cc/trees/layer_tree_impl.h"
17 #include "cc/trees/property_tree.h" 19 #include "cc/trees/property_tree.h"
18 #include "cc/trees/property_tree_builder.h" 20 #include "cc/trees/property_tree_builder.h"
21 #include "cc/trees/transform_node.h"
19 #include "ui/gfx/geometry/rect_conversions.h" 22 #include "ui/gfx/geometry/rect_conversions.h"
20 23
21 namespace cc { 24 namespace cc {
22 25
23 namespace draw_property_utils { 26 namespace draw_property_utils {
24 27
25 namespace { 28 namespace {
26 29
27 static bool IsRootLayer(const Layer* layer) { 30 static bool IsRootLayer(const Layer* layer) {
28 return !layer->parent(); 31 return !layer->parent();
(...skipping 10 matching lines...) Expand all
39 if (layer->has_render_surface()) 42 if (layer->has_render_surface())
40 return; 43 return;
41 44
42 DCHECK(layer->filters().IsEmpty()) << "layer: " << layer->id(); 45 DCHECK(layer->filters().IsEmpty()) << "layer: " << layer->id();
43 DCHECK(!IsRootLayer(layer)) << "layer: " << layer->id(); 46 DCHECK(!IsRootLayer(layer)) << "layer: " << layer->id();
44 EffectNode* effect_node = 47 EffectNode* effect_node =
45 layer->layer_tree_impl()->property_trees()->effect_tree.Node( 48 layer->layer_tree_impl()->property_trees()->effect_tree.Node(
46 layer->effect_tree_index()); 49 layer->effect_tree_index());
47 if (effect_node->owner_id != layer->id()) 50 if (effect_node->owner_id != layer->id())
48 return; 51 return;
49 DCHECK_EQ(effect_node->data.mask_layer_id, -1) << "layer: " << layer->id(); 52 DCHECK_EQ(effect_node->mask_layer_id, -1) << "layer: " << layer->id();
50 DCHECK_EQ(effect_node->data.replica_layer_id, -1) << "layer: " << layer->id(); 53 DCHECK_EQ(effect_node->replica_layer_id, -1) << "layer: " << layer->id();
51 DCHECK(effect_node->data.background_filters.IsEmpty()); 54 DCHECK(effect_node->background_filters.IsEmpty());
52 } 55 }
53 56
54 #endif 57 #endif
55 58
56 template <typename LayerType> 59 template <typename LayerType>
57 bool ComputeClipRectInTargetSpace(const LayerType* layer, 60 bool ComputeClipRectInTargetSpace(const LayerType* layer,
58 const ClipNode* clip_node, 61 const ClipNode* clip_node,
59 const TransformTree& transform_tree, 62 const TransformTree& transform_tree,
60 int target_node_id, 63 int target_node_id,
61 gfx::RectF* clip_rect_in_target_space) { 64 gfx::RectF* clip_rect_in_target_space) {
62 DCHECK(layer->clip_tree_index() == clip_node->id); 65 DCHECK(layer->clip_tree_index() == clip_node->id);
63 DCHECK(clip_node->data.target_id != target_node_id); 66 DCHECK(clip_node->target_id != target_node_id);
64 67
65 gfx::Transform clip_to_target; 68 gfx::Transform clip_to_target;
66 if (clip_node->data.target_id > target_node_id) { 69 if (clip_node->target_id > target_node_id) {
67 // In this case, layer has a scroll parent. We need to keep the scale 70 // In this case, layer has a scroll parent. We need to keep the scale
68 // at the layer's target but remove the scale at the scroll parent's 71 // at the layer's target but remove the scale at the scroll parent's
69 // target. 72 // target.
70 if (transform_tree.ComputeTransformWithDestinationSublayerScale( 73 if (transform_tree.ComputeTransformWithDestinationSublayerScale(
71 clip_node->data.target_id, target_node_id, &clip_to_target)) { 74 clip_node->target_id, target_node_id, &clip_to_target)) {
72 const TransformNode* source_node = 75 const TransformNode* source_node =
73 transform_tree.Node(clip_node->data.target_id); 76 transform_tree.Node(clip_node->target_id);
74 if (source_node->data.sublayer_scale.x() != 0.f && 77 if (source_node->sublayer_scale.x() != 0.f &&
75 source_node->data.sublayer_scale.y() != 0.f) 78 source_node->sublayer_scale.y() != 0.f)
76 clip_to_target.Scale(1.0f / source_node->data.sublayer_scale.x(), 79 clip_to_target.Scale(1.0f / source_node->sublayer_scale.x(),
77 1.0f / source_node->data.sublayer_scale.y()); 80 1.0f / source_node->sublayer_scale.y());
78 *clip_rect_in_target_space = MathUtil::MapClippedRect( 81 *clip_rect_in_target_space = MathUtil::MapClippedRect(
79 clip_to_target, clip_node->data.clip_in_target_space); 82 clip_to_target, clip_node->clip_in_target_space);
80 } else { 83 } else {
81 return false; 84 return false;
82 } 85 }
83 } else { 86 } else {
84 if (transform_tree.ComputeTransform(clip_node->data.target_id, 87 if (transform_tree.ComputeTransform(clip_node->target_id, target_node_id,
85 target_node_id, &clip_to_target)) { 88 &clip_to_target)) {
86 *clip_rect_in_target_space = MathUtil::ProjectClippedRect( 89 *clip_rect_in_target_space = MathUtil::ProjectClippedRect(
87 clip_to_target, clip_node->data.clip_in_target_space); 90 clip_to_target, clip_node->clip_in_target_space);
88 } else { 91 } else {
89 return false; 92 return false;
90 } 93 }
91 } 94 }
92 return true; 95 return true;
93 } 96 }
94 97
95 struct ConditionalClip { 98 struct ConditionalClip {
96 bool is_clipped; 99 bool is_clipped;
97 gfx::RectF clip_rect; 100 gfx::RectF clip_rect;
(...skipping 13 matching lines...) Expand all
111 return ConditionalClip{true, // is_clipped. 114 return ConditionalClip{true, // is_clipped.
112 MathUtil::MapClippedRect(current_to_target, rect)}; 115 MathUtil::MapClippedRect(current_to_target, rect)};
113 116
114 return ConditionalClip{true, // is_clipped. 117 return ConditionalClip{true, // is_clipped.
115 MathUtil::ProjectClippedRect(current_to_target, rect)}; 118 MathUtil::ProjectClippedRect(current_to_target, rect)};
116 } 119 }
117 120
118 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node, 121 static ConditionalClip ComputeCurrentClip(const ClipNode* clip_node,
119 const TransformTree& transform_tree, 122 const TransformTree& transform_tree,
120 int target_transform_id) { 123 int target_transform_id) {
121 if (clip_node->data.transform_id != target_transform_id) 124 if (clip_node->transform_id != target_transform_id)
122 return ComputeRectInTargetSpace(clip_node->data.clip, transform_tree, 125 return ComputeRectInTargetSpace(clip_node->clip, transform_tree,
123 clip_node->data.transform_id, 126 clip_node->transform_id,
124 target_transform_id); 127 target_transform_id);
125 128
126 gfx::RectF current_clip = clip_node->data.clip; 129 gfx::RectF current_clip = clip_node->clip;
127 gfx::Vector2dF sublayer_scale = 130 gfx::Vector2dF sublayer_scale =
128 transform_tree.Node(target_transform_id)->data.sublayer_scale; 131 transform_tree.Node(target_transform_id)->sublayer_scale;
129 if (sublayer_scale.x() > 0 && sublayer_scale.y() > 0) 132 if (sublayer_scale.x() > 0 && sublayer_scale.y() > 0)
130 current_clip.Scale(sublayer_scale.x(), sublayer_scale.y()); 133 current_clip.Scale(sublayer_scale.x(), sublayer_scale.y());
131 return ConditionalClip{true /* is_clipped */, current_clip}; 134 return ConditionalClip{true /* is_clipped */, current_clip};
132 } 135 }
133 136
134 static ConditionalClip ComputeAccumulatedClip( 137 static ConditionalClip ComputeAccumulatedClip(
135 const ClipTree& clip_tree, 138 const ClipTree& clip_tree,
136 int local_clip_id, 139 int local_clip_id,
137 const EffectTree& effect_tree, 140 const EffectTree& effect_tree,
138 int target_id, 141 int target_id,
139 const TransformTree& transform_tree) { 142 const TransformTree& transform_tree) {
140 const ClipNode* clip_node = clip_tree.Node(local_clip_id); 143 const ClipNode* clip_node = clip_tree.Node(local_clip_id);
141 const EffectNode* target_node = effect_tree.Node(target_id); 144 const EffectNode* target_node = effect_tree.Node(target_id);
142 int target_transform_id = target_node->data.transform_id; 145 int target_transform_id = target_node->transform_id;
143 bool is_clipped = false; 146 bool is_clipped = false;
144 147
145 // Collect all the clips that need to be accumulated. 148 // Collect all the clips that need to be accumulated.
146 std::stack<const ClipNode*> parent_chain; 149 std::stack<const ClipNode*> parent_chain;
147 150
148 // If target is not direct ancestor of clip, this will find least common 151 // If target is not direct ancestor of clip, this will find least common
149 // ancestor between the target and the clip. 152 // ancestor between the target and the clip.
150 while (target_node->id >= 0 && clip_node->id >= 0) { 153 while (target_node->id >= 0 && clip_node->id >= 0) {
151 while (target_node->data.clip_id > clip_node->id || 154 while (target_node->clip_id > clip_node->id ||
152 target_node->data.has_unclipped_descendants) { 155 target_node->has_unclipped_descendants) {
153 target_node = effect_tree.Node(target_node->data.target_id); 156 target_node = effect_tree.Node(target_node->target_id);
154 } 157 }
155 if (target_node->data.clip_id == clip_node->id) 158 if (target_node->clip_id == clip_node->id)
156 break; 159 break;
157 while (target_node->data.clip_id < clip_node->id) { 160 while (target_node->clip_id < clip_node->id) {
158 parent_chain.push(clip_node); 161 parent_chain.push(clip_node);
159 clip_node = clip_tree.parent(clip_node); 162 clip_node = clip_tree.parent(clip_node);
160 } 163 }
161 if (target_node->data.clip_id == clip_node->id) { 164 if (target_node->clip_id == clip_node->id) {
162 // Target is responsible for applying this clip_node (id equals to 165 // Target is responsible for applying this clip_node (id equals to
163 // target_node's clip id), no need to accumulate this as part of clip 166 // target_node's clip id), no need to accumulate this as part of clip
164 // rect. 167 // rect.
165 clip_node = parent_chain.top(); 168 clip_node = parent_chain.top();
166 parent_chain.pop(); 169 parent_chain.pop();
167 break; 170 break;
168 } 171 }
169 } 172 }
170 173
171 // TODO(weiliangc): If we don't create clip for render surface, we don't need 174 // TODO(weiliangc): If we don't create clip for render surface, we don't need
172 // to check applies_local_clip. 175 // to check applies_local_clip.
173 while (!clip_node->data.applies_local_clip && parent_chain.size() > 0) { 176 while (!clip_node->applies_local_clip && parent_chain.size() > 0) {
174 clip_node = parent_chain.top(); 177 clip_node = parent_chain.top();
175 parent_chain.pop(); 178 parent_chain.pop();
176 } 179 }
177 180
178 if (!clip_node->data.applies_local_clip) 181 if (!clip_node->applies_local_clip)
179 // No clip node applying clip in between. 182 // No clip node applying clip in between.
180 return ConditionalClip{false, gfx::RectF()}; 183 return ConditionalClip{false, gfx::RectF()};
181 184
182 ConditionalClip current_clip = 185 ConditionalClip current_clip =
183 ComputeCurrentClip(clip_node, transform_tree, target_transform_id); 186 ComputeCurrentClip(clip_node, transform_tree, target_transform_id);
184 is_clipped = current_clip.is_clipped; 187 is_clipped = current_clip.is_clipped;
185 gfx::RectF accumulated_clip = current_clip.clip_rect; 188 gfx::RectF accumulated_clip = current_clip.clip_rect;
186 189
187 while (parent_chain.size() > 0) { 190 while (parent_chain.size() > 0) {
188 clip_node = parent_chain.top(); 191 clip_node = parent_chain.top();
189 parent_chain.pop(); 192 parent_chain.pop();
190 if (!clip_node->data.applies_local_clip) { 193 if (!clip_node->applies_local_clip) {
191 continue; 194 continue;
192 } 195 }
193 ConditionalClip current_clip = 196 ConditionalClip current_clip =
194 ComputeCurrentClip(clip_node, transform_tree, target_transform_id); 197 ComputeCurrentClip(clip_node, transform_tree, target_transform_id);
195 198
196 // If transform is not invertible, no clip will be applied. 199 // If transform is not invertible, no clip will be applied.
197 if (!current_clip.is_clipped) 200 if (!current_clip.is_clipped)
198 return ConditionalClip{false, gfx::RectF()}; 201 return ConditionalClip{false, gfx::RectF()};
199 202
200 is_clipped = true; 203 is_clipped = true;
(...skipping 10 matching lines...) Expand all
211 const typename LayerType::LayerListType& visible_layer_list, 214 const typename LayerType::LayerListType& visible_layer_list,
212 const ClipTree& clip_tree, 215 const ClipTree& clip_tree,
213 const TransformTree& transform_tree, 216 const TransformTree& transform_tree,
214 const EffectTree& effect_tree, 217 const EffectTree& effect_tree,
215 bool non_root_surfaces_enabled) { 218 bool non_root_surfaces_enabled) {
216 for (auto& layer : visible_layer_list) { 219 for (auto& layer : visible_layer_list) {
217 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 220 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
218 // The entire layer is visible if it has copy requests. 221 // The entire layer is visible if it has copy requests.
219 const EffectNode* effect_node = 222 const EffectNode* effect_node =
220 effect_tree.Node(layer->effect_tree_index()); 223 effect_tree.Node(layer->effect_tree_index());
221 if (effect_node->data.has_copy_request && 224 if (effect_node->has_copy_request && effect_node->owner_id == layer->id())
222 effect_node->owner_id == layer->id())
223 continue; 225 continue;
224 226
225 if (!non_root_surfaces_enabled) { 227 if (!non_root_surfaces_enabled) {
226 layer->set_clip_rect( 228 layer->set_clip_rect(
227 gfx::ToEnclosingRect(clip_node->data.clip_in_target_space)); 229 gfx::ToEnclosingRect(clip_node->clip_in_target_space));
228 continue; 230 continue;
229 } 231 }
230 232
231 // When both the layer and the target are unclipped, the entire layer 233 // When both the layer and the target are unclipped, the entire layer
232 // content rect is visible. 234 // content rect is visible.
233 const bool fully_visible = !clip_node->data.layers_are_clipped && 235 const bool fully_visible =
234 !clip_node->data.target_is_clipped; 236 !clip_node->layers_are_clipped && !clip_node->target_is_clipped;
235 237
236 if (!fully_visible) { 238 if (!fully_visible) {
237 const TransformNode* transform_node = 239 const TransformNode* transform_node =
238 transform_tree.Node(layer->transform_tree_index()); 240 transform_tree.Node(layer->transform_tree_index());
239 int target_node_id = transform_tree.ContentTargetId(transform_node->id); 241 int target_node_id = transform_tree.ContentTargetId(transform_node->id);
240 242
241 // The clip node stores clip rect in its target space. 243 // The clip node stores clip rect in its target space.
242 gfx::RectF clip_rect_in_target_space = 244 gfx::RectF clip_rect_in_target_space = clip_node->clip_in_target_space;
243 clip_node->data.clip_in_target_space;
244 245
245 // If required, this clip rect should be mapped to the current layer's 246 // If required, this clip rect should be mapped to the current layer's
246 // target space. 247 // target space.
247 if (clip_node->data.target_id != target_node_id) { 248 if (clip_node->target_id != target_node_id) {
248 // In this case, layer has a clip parent or scroll parent (or shares the 249 // In this case, layer has a clip parent or scroll parent (or shares the
249 // target with an ancestor layer that has clip parent) and the clip 250 // target with an ancestor layer that has clip parent) and the clip
250 // parent's target is different from the layer's target. As the layer's 251 // parent's target is different from the layer's target. As the layer's
251 // target has unclippped descendants, it is unclippped. 252 // target has unclippped descendants, it is unclippped.
252 if (!clip_node->data.layers_are_clipped) 253 if (!clip_node->layers_are_clipped)
253 continue; 254 continue;
254 255
255 // Compute the clip rect in target space and store it. 256 // Compute the clip rect in target space and store it.
256 if (!ComputeClipRectInTargetSpace(layer, clip_node, transform_tree, 257 if (!ComputeClipRectInTargetSpace(layer, clip_node, transform_tree,
257 target_node_id, 258 target_node_id,
258 &clip_rect_in_target_space)) 259 &clip_rect_in_target_space))
259 continue; 260 continue;
260 } 261 }
261 262
262 if (!clip_rect_in_target_space.IsEmpty()) { 263 if (!clip_rect_in_target_space.IsEmpty()) {
(...skipping 15 matching lines...) Expand all
278 clip_rect_in_target_space); 279 clip_rect_in_target_space);
279 } 280 }
280 281
281 bool GetLayerClipRect(const LayerImpl* layer, 282 bool GetLayerClipRect(const LayerImpl* layer,
282 const ClipNode* clip_node, 283 const ClipNode* clip_node,
283 const TransformTree& transform_tree, 284 const TransformTree& transform_tree,
284 int target_node_id, 285 int target_node_id,
285 gfx::RectF* clip_rect_in_target_space) { 286 gfx::RectF* clip_rect_in_target_space) {
286 // This is equivalent of calling ComputeClipRectInTargetSpace. 287 // This is equivalent of calling ComputeClipRectInTargetSpace.
287 *clip_rect_in_target_space = gfx::RectF(layer->clip_rect()); 288 *clip_rect_in_target_space = gfx::RectF(layer->clip_rect());
288 return transform_tree.Node(target_node_id)->data.ancestors_are_invertible; 289 return transform_tree.Node(target_node_id)->ancestors_are_invertible;
289 } 290 }
290 291
291 template <typename LayerType> 292 template <typename LayerType>
292 void CalculateVisibleRects( 293 void CalculateVisibleRects(
293 const typename LayerType::LayerListType& visible_layer_list, 294 const typename LayerType::LayerListType& visible_layer_list,
294 const ClipTree& clip_tree, 295 const ClipTree& clip_tree,
295 const TransformTree& transform_tree, 296 const TransformTree& transform_tree,
296 const EffectTree& effect_tree, 297 const EffectTree& effect_tree,
297 bool non_root_surfaces_enabled) { 298 bool non_root_surfaces_enabled) {
298 for (auto& layer : visible_layer_list) { 299 for (auto& layer : visible_layer_list) {
(...skipping 11 matching lines...) Expand all
310 continue; 311 continue;
311 } 312 }
312 313
313 gfx::RectF accumulated_clip_in_copy_request_space = 314 gfx::RectF accumulated_clip_in_copy_request_space =
314 accumulated_clip_rect.clip_rect; 315 accumulated_clip_rect.clip_rect;
315 316
316 const EffectNode* copy_request_effect_node = 317 const EffectNode* copy_request_effect_node =
317 effect_tree.Node(effect_ancestor_with_copy_request); 318 effect_tree.Node(effect_ancestor_with_copy_request);
318 ConditionalClip clip_in_layer_space = ComputeRectInTargetSpace( 319 ConditionalClip clip_in_layer_space = ComputeRectInTargetSpace(
319 accumulated_clip_in_copy_request_space, transform_tree, 320 accumulated_clip_in_copy_request_space, transform_tree,
320 copy_request_effect_node->data.transform_id, 321 copy_request_effect_node->transform_id,
321 layer->transform_tree_index()); 322 layer->transform_tree_index());
322 if (clip_in_layer_space.is_clipped) { 323 if (clip_in_layer_space.is_clipped) {
323 gfx::RectF clip_rect = clip_in_layer_space.clip_rect; 324 gfx::RectF clip_rect = clip_in_layer_space.clip_rect;
324 clip_rect.Offset(-layer->offset_to_transform_parent()); 325 clip_rect.Offset(-layer->offset_to_transform_parent());
325 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect); 326 gfx::Rect visible_rect = gfx::ToEnclosingRect(clip_rect);
326 visible_rect.Intersect(gfx::Rect(layer_bounds)); 327 visible_rect.Intersect(gfx::Rect(layer_bounds));
327 layer->set_visible_layer_rect(visible_rect); 328 layer->set_visible_layer_rect(visible_rect);
328 } else { 329 } else {
329 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 330 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
330 } 331 }
331 continue; 332 continue;
332 } 333 }
333 334
334 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 335 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
335 const TransformNode* transform_node = 336 const TransformNode* transform_node =
336 transform_tree.Node(layer->transform_tree_index()); 337 transform_tree.Node(layer->transform_tree_index());
337 if (!non_root_surfaces_enabled) { 338 if (!non_root_surfaces_enabled) {
338 // When we only have a root surface, the clip node and the layer must 339 // When we only have a root surface, the clip node and the layer must
339 // necessarily have the same target (the root). 340 // necessarily have the same target (the root).
340 if (transform_node->data.ancestors_are_invertible) { 341 if (transform_node->ancestors_are_invertible) {
341 gfx::RectF combined_clip_rect_in_target_space = 342 gfx::RectF combined_clip_rect_in_target_space =
342 clip_node->data.combined_clip_in_target_space; 343 clip_node->combined_clip_in_target_space;
343 gfx::Transform target_to_content; 344 gfx::Transform target_to_content;
344 target_to_content.Translate(-layer->offset_to_transform_parent().x(), 345 target_to_content.Translate(-layer->offset_to_transform_parent().x(),
345 -layer->offset_to_transform_parent().y()); 346 -layer->offset_to_transform_parent().y());
346 target_to_content.PreconcatTransform( 347 target_to_content.PreconcatTransform(
347 transform_tree.FromScreen(transform_node->id)); 348 transform_tree.FromScreen(transform_node->id));
348 349
349 gfx::Rect visible_rect = 350 gfx::Rect visible_rect =
350 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 351 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
351 target_to_content, combined_clip_rect_in_target_space)); 352 target_to_content, combined_clip_rect_in_target_space));
352 visible_rect.Intersect(gfx::Rect(layer_bounds)); 353 visible_rect.Intersect(gfx::Rect(layer_bounds));
353 layer->set_visible_layer_rect(visible_rect); 354 layer->set_visible_layer_rect(visible_rect);
354 } else { 355 } else {
355 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 356 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
356 } 357 }
357 continue; 358 continue;
358 } 359 }
359 360
360 // When both the layer and the target are unclipped, the entire layer 361 // When both the layer and the target are unclipped, the entire layer
361 // content rect is visible. 362 // content rect is visible.
362 const bool fully_visible = !clip_node->data.layers_are_clipped && 363 const bool fully_visible =
363 !clip_node->data.target_is_clipped; 364 !clip_node->layers_are_clipped && !clip_node->target_is_clipped;
364 365
365 if (fully_visible) { 366 if (fully_visible) {
366 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 367 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
367 continue; 368 continue;
368 } 369 }
369 370
370 int target_node_id = transform_tree.ContentTargetId(transform_node->id); 371 int target_node_id = transform_tree.ContentTargetId(transform_node->id);
371 372
372 // The clip node stores clip rect in its target space. If required, 373 // The clip node stores clip rect in its target space. If required,
373 // this clip rect should be mapped to the current layer's target space. 374 // this clip rect should be mapped to the current layer's target space.
374 gfx::RectF combined_clip_rect_in_target_space; 375 gfx::RectF combined_clip_rect_in_target_space;
375 376
376 if (clip_node->data.target_id != target_node_id) { 377 if (clip_node->target_id != target_node_id) {
377 // In this case, layer has a clip parent or scroll parent (or shares the 378 // In this case, layer has a clip parent or scroll parent (or shares the
378 // target with an ancestor layer that has clip parent) and the clip 379 // target with an ancestor layer that has clip parent) and the clip
379 // parent's target is different from the layer's target. As the layer's 380 // parent's target is different from the layer's target. As the layer's
380 // target has unclippped descendants, it is unclippped. 381 // target has unclippped descendants, it is unclippped.
381 if (!clip_node->data.layers_are_clipped) { 382 if (!clip_node->layers_are_clipped) {
382 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 383 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
383 continue; 384 continue;
384 } 385 }
385 386
386 // We use the clip node's clip_in_target_space (and not 387 // We use the clip node's clip_in_target_space (and not
387 // combined_clip_in_target_space) here because we want to clip 388 // combined_clip_in_target_space) here because we want to clip
388 // with respect to clip parent's local clip and not its combined clip as 389 // with respect to clip parent's local clip and not its combined clip as
389 // the combined clip has even the clip parent's target's clip baked into 390 // the combined clip has even the clip parent's target's clip baked into
390 // it and as our target is different, we don't want to use it in our 391 // it and as our target is different, we don't want to use it in our
391 // visible rect computation. 392 // visible rect computation.
392 if (!GetLayerClipRect(layer, clip_node, transform_tree, target_node_id, 393 if (!GetLayerClipRect(layer, clip_node, transform_tree, target_node_id,
393 &combined_clip_rect_in_target_space)) { 394 &combined_clip_rect_in_target_space)) {
394 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 395 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
395 continue; 396 continue;
396 } 397 }
397 } else { 398 } else {
398 if (clip_node->data.target_is_clipped) { 399 if (clip_node->target_is_clipped) {
399 combined_clip_rect_in_target_space = 400 combined_clip_rect_in_target_space =
400 clip_node->data.combined_clip_in_target_space; 401 clip_node->combined_clip_in_target_space;
401 } else { 402 } else {
402 combined_clip_rect_in_target_space = 403 combined_clip_rect_in_target_space = clip_node->clip_in_target_space;
403 clip_node->data.clip_in_target_space;
404 } 404 }
405 } 405 }
406 406
407 // The clip rect should be intersected with layer rect in target space. 407 // The clip rect should be intersected with layer rect in target space.
408 gfx::Transform content_to_target = 408 gfx::Transform content_to_target =
409 transform_tree.ToTarget(transform_node->id); 409 transform_tree.ToTarget(transform_node->id);
410 content_to_target.Translate(layer->offset_to_transform_parent().x(), 410 content_to_target.Translate(layer->offset_to_transform_parent().x(),
411 layer->offset_to_transform_parent().y()); 411 layer->offset_to_transform_parent().y());
412 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds); 412 gfx::Rect layer_content_rect = gfx::Rect(layer_bounds);
413 gfx::RectF layer_content_bounds_in_target_space = MathUtil::MapClippedRect( 413 gfx::RectF layer_content_bounds_in_target_space = MathUtil::MapClippedRect(
414 content_to_target, gfx::RectF(layer_content_rect)); 414 content_to_target, gfx::RectF(layer_content_rect));
415 // If the layer is fully contained within the clip, treat it as fully 415 // If the layer is fully contained within the clip, treat it as fully
416 // visible. 416 // visible.
417 if (!layer_content_bounds_in_target_space.IsEmpty() && 417 if (!layer_content_bounds_in_target_space.IsEmpty() &&
418 combined_clip_rect_in_target_space.Contains( 418 combined_clip_rect_in_target_space.Contains(
419 layer_content_bounds_in_target_space)) { 419 layer_content_bounds_in_target_space)) {
420 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 420 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
421 continue; 421 continue;
422 } 422 }
423 423
424 combined_clip_rect_in_target_space.Intersect( 424 combined_clip_rect_in_target_space.Intersect(
425 layer_content_bounds_in_target_space); 425 layer_content_bounds_in_target_space);
426 if (combined_clip_rect_in_target_space.IsEmpty()) { 426 if (combined_clip_rect_in_target_space.IsEmpty()) {
427 layer->set_visible_layer_rect(gfx::Rect()); 427 layer->set_visible_layer_rect(gfx::Rect());
428 continue; 428 continue;
429 } 429 }
430 430
431 gfx::Transform target_to_layer; 431 gfx::Transform target_to_layer;
432 if (transform_node->data.ancestors_are_invertible) { 432 if (transform_node->ancestors_are_invertible) {
433 target_to_layer = transform_tree.FromTarget(transform_node->id); 433 target_to_layer = transform_tree.FromTarget(transform_node->id);
434 } else { 434 } else {
435 if (!transform_tree.ComputeTransformWithSourceSublayerScale( 435 if (!transform_tree.ComputeTransformWithSourceSublayerScale(
436 target_node_id, transform_node->id, &target_to_layer)) { 436 target_node_id, transform_node->id, &target_to_layer)) {
437 // An animated singular transform may become non-singular during the 437 // An animated singular transform may become non-singular during the
438 // animation, so we still need to compute a visible rect. In this 438 // animation, so we still need to compute a visible rect. In this
439 // situation, we treat the entire layer as visible. 439 // situation, we treat the entire layer as visible.
440 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 440 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
441 continue; 441 continue;
442 } 442 }
443 } 443 }
444 444
445 gfx::Transform target_to_content; 445 gfx::Transform target_to_content;
446 target_to_content.Translate(-layer->offset_to_transform_parent().x(), 446 target_to_content.Translate(-layer->offset_to_transform_parent().x(),
447 -layer->offset_to_transform_parent().y()); 447 -layer->offset_to_transform_parent().y());
448 target_to_content.PreconcatTransform(target_to_layer); 448 target_to_content.PreconcatTransform(target_to_layer);
449 449
450 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 450 gfx::Rect visible_rect = gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
451 target_to_content, combined_clip_rect_in_target_space)); 451 target_to_content, combined_clip_rect_in_target_space));
452 visible_rect.Intersect(gfx::Rect(layer_bounds)); 452 visible_rect.Intersect(gfx::Rect(layer_bounds));
453 layer->set_visible_layer_rect(visible_rect); 453 layer->set_visible_layer_rect(visible_rect);
454 } 454 }
455 } 455 }
456 456
457 static bool HasSingularTransform(int transform_tree_index, 457 static bool HasSingularTransform(int transform_tree_index,
458 const TransformTree& tree) { 458 const TransformTree& tree) {
459 const TransformNode* node = tree.Node(transform_tree_index); 459 const TransformNode* node = tree.Node(transform_tree_index);
460 return !node->data.is_invertible || !node->data.ancestors_are_invertible; 460 return !node->is_invertible || !node->ancestors_are_invertible;
461 } 461 }
462 462
463 template <typename LayerType> 463 template <typename LayerType>
464 static int TransformTreeIndexForBackfaceVisibility(LayerType* layer, 464 static int TransformTreeIndexForBackfaceVisibility(LayerType* layer,
465 const TransformTree& tree) { 465 const TransformTree& tree) {
466 if (!layer->use_parent_backface_visibility()) 466 if (!layer->use_parent_backface_visibility())
467 return layer->transform_tree_index(); 467 return layer->transform_tree_index();
468 const TransformNode* node = tree.Node(layer->transform_tree_index()); 468 const TransformNode* node = tree.Node(layer->transform_tree_index());
469 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id; 469 return layer->id() == node->owner_id ? tree.parent(node)->id : node->id;
470 } 470 }
471 471
472 template <typename LayerType> 472 template <typename LayerType>
473 static bool IsLayerBackFaceVisible(LayerType* layer, 473 static bool IsLayerBackFaceVisible(LayerType* layer,
474 int transform_tree_index, 474 int transform_tree_index,
475 const TransformTree& tree) { 475 const TransformTree& tree) {
476 const TransformNode* node = tree.Node(transform_tree_index); 476 const TransformNode* node = tree.Node(transform_tree_index);
477 return layer->use_local_transform_for_backface_visibility() 477 return layer->use_local_transform_for_backface_visibility()
478 ? node->data.local.IsBackFaceVisible() 478 ? node->local.IsBackFaceVisible()
479 : tree.ToTarget(transform_tree_index).IsBackFaceVisible(); 479 : tree.ToTarget(transform_tree_index).IsBackFaceVisible();
480 } 480 }
481 481
482 static inline bool TransformToScreenIsKnown(Layer* layer, 482 static inline bool TransformToScreenIsKnown(Layer* layer,
483 int transform_tree_index, 483 int transform_tree_index,
484 const TransformTree& tree) { 484 const TransformTree& tree) {
485 const TransformNode* node = tree.Node(transform_tree_index); 485 const TransformNode* node = tree.Node(transform_tree_index);
486 return !node->data.to_screen_is_potentially_animated; 486 return !node->to_screen_is_potentially_animated;
487 } 487 }
488 488
489 static inline bool TransformToScreenIsKnown(LayerImpl* layer, 489 static inline bool TransformToScreenIsKnown(LayerImpl* layer,
490 int transform_tree_index, 490 int transform_tree_index,
491 const TransformTree& tree) { 491 const TransformTree& tree) {
492 return true; 492 return true;
493 } 493 }
494 494
495 template <typename LayerType> 495 template <typename LayerType>
496 static bool LayerNeedsUpdateInternal(LayerType* layer, 496 static bool LayerNeedsUpdateInternal(LayerType* layer,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 533
534 return true; 534 return true;
535 } 535 }
536 536
537 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, 537 void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl,
538 const TransformTree& transform_tree, 538 const TransformTree& transform_tree,
539 const EffectTree& effect_tree, 539 const EffectTree& effect_tree,
540 std::vector<LayerImpl*>* visible_layer_list) { 540 std::vector<LayerImpl*>* visible_layer_list) {
541 for (auto* layer_impl : *layer_tree_impl) { 541 for (auto* layer_impl : *layer_tree_impl) {
542 bool layer_is_drawn = 542 bool layer_is_drawn =
543 effect_tree.Node(layer_impl->effect_tree_index())->data.is_drawn; 543 effect_tree.Node(layer_impl->effect_tree_index())->is_drawn;
544 544
545 if (!IsRootLayer(layer_impl) && 545 if (!IsRootLayer(layer_impl) &&
546 LayerShouldBeSkipped(layer_impl, layer_is_drawn, transform_tree, 546 LayerShouldBeSkipped(layer_impl, layer_is_drawn, transform_tree,
547 effect_tree)) 547 effect_tree))
548 continue; 548 continue;
549 549
550 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, transform_tree)) 550 if (LayerNeedsUpdate(layer_impl, layer_is_drawn, transform_tree))
551 visible_layer_list->push_back(layer_impl); 551 visible_layer_list->push_back(layer_impl);
552 } 552 }
553 } 553 }
554 554
555 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree, 555 void UpdateRenderSurfaceForLayer(EffectTree* effect_tree,
556 bool non_root_surfaces_enabled, 556 bool non_root_surfaces_enabled,
557 LayerImpl* layer) { 557 LayerImpl* layer) {
558 if (!non_root_surfaces_enabled) { 558 if (!non_root_surfaces_enabled) {
559 layer->SetHasRenderSurface(IsRootLayer(layer)); 559 layer->SetHasRenderSurface(IsRootLayer(layer));
560 return; 560 return;
561 } 561 }
562 562
563 EffectNode* node = effect_tree->Node(layer->effect_tree_index()); 563 EffectNode* node = effect_tree->Node(layer->effect_tree_index());
564 564
565 if (node->owner_id == layer->id() && node->data.has_render_surface) 565 if (node->owner_id == layer->id() && node->has_render_surface)
566 layer->SetHasRenderSurface(true); 566 layer->SetHasRenderSurface(true);
567 else 567 else
568 layer->SetHasRenderSurface(false); 568 layer->SetHasRenderSurface(false);
569 } 569 }
570 } // namespace 570 } // namespace
571 571
572 template <typename LayerType> 572 template <typename LayerType>
573 static inline bool LayerShouldBeSkippedInternal( 573 static inline bool LayerShouldBeSkippedInternal(
574 LayerType* layer, 574 LayerType* layer,
575 bool layer_is_drawn, 575 bool layer_is_drawn,
576 const TransformTree& transform_tree, 576 const TransformTree& transform_tree,
577 const EffectTree& effect_tree) { 577 const EffectTree& effect_tree) {
578 const TransformNode* transform_node = 578 const TransformNode* transform_node =
579 transform_tree.Node(layer->transform_tree_index()); 579 transform_tree.Node(layer->transform_tree_index());
580 const EffectNode* effect_node = effect_tree.Node(layer->effect_tree_index()); 580 const EffectNode* effect_node = effect_tree.Node(layer->effect_tree_index());
581 581
582 if (effect_node->data.has_render_surface && 582 if (effect_node->has_render_surface &&
583 effect_node->data.num_copy_requests_in_subtree > 0) 583 effect_node->num_copy_requests_in_subtree > 0)
584 return false; 584 return false;
585 // If the layer transform is not invertible, it should be skipped. 585 // If the layer transform is not invertible, it should be skipped.
586 // TODO(ajuma): Correctly process subtrees with singular transform for the 586 // TODO(ajuma): Correctly process subtrees with singular transform for the
587 // case where we may animate to a non-singular transform and wish to 587 // case where we may animate to a non-singular transform and wish to
588 // pre-raster. 588 // pre-raster.
589 return !transform_node->data.node_and_ancestors_are_animated_or_invertible || 589 return !transform_node->node_and_ancestors_are_animated_or_invertible ||
590 effect_node->data.hidden_by_backface_visibility || 590 effect_node->hidden_by_backface_visibility || !effect_node->is_drawn;
591 !effect_node->data.is_drawn;
592 } 591 }
593 592
594 bool LayerShouldBeSkipped(LayerImpl* layer, 593 bool LayerShouldBeSkipped(LayerImpl* layer,
595 bool layer_is_drawn, 594 bool layer_is_drawn,
596 const TransformTree& transform_tree, 595 const TransformTree& transform_tree,
597 const EffectTree& effect_tree) { 596 const EffectTree& effect_tree) {
598 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree, 597 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree,
599 effect_tree); 598 effect_tree);
600 } 599 }
601 600
602 bool LayerShouldBeSkipped(Layer* layer, 601 bool LayerShouldBeSkipped(Layer* layer,
603 bool layer_is_drawn, 602 bool layer_is_drawn,
604 const TransformTree& transform_tree, 603 const TransformTree& transform_tree,
605 const EffectTree& effect_tree) { 604 const EffectTree& effect_tree) {
606 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree, 605 return LayerShouldBeSkippedInternal(layer, layer_is_drawn, transform_tree,
607 effect_tree); 606 effect_tree);
608 } 607 }
609 608
610 void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host, 609 void FindLayersThatNeedUpdates(LayerTreeHost* layer_tree_host,
611 const TransformTree& transform_tree, 610 const TransformTree& transform_tree,
612 const EffectTree& effect_tree, 611 const EffectTree& effect_tree,
613 LayerList* update_layer_list) { 612 LayerList* update_layer_list) {
614 for (auto* layer : *layer_tree_host) { 613 for (auto* layer : *layer_tree_host) {
615 bool layer_is_drawn = 614 bool layer_is_drawn =
616 effect_tree.Node(layer->effect_tree_index())->data.is_drawn; 615 effect_tree.Node(layer->effect_tree_index())->is_drawn;
617 616
618 if (!IsRootLayer(layer) && 617 if (!IsRootLayer(layer) &&
619 LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree, 618 LayerShouldBeSkipped(layer, layer_is_drawn, transform_tree,
620 effect_tree)) 619 effect_tree))
621 continue; 620 continue;
622 621
623 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) { 622 if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) {
624 update_layer_list->push_back(layer); 623 update_layer_list->push_back(layer);
625 } 624 }
626 625
(...skipping 17 matching lines...) Expand all
644 643
645 void ComputeClips(ClipTree* clip_tree, 644 void ComputeClips(ClipTree* clip_tree,
646 const TransformTree& transform_tree, 645 const TransformTree& transform_tree,
647 bool non_root_surfaces_enabled) { 646 bool non_root_surfaces_enabled) {
648 if (!clip_tree->needs_update()) 647 if (!clip_tree->needs_update())
649 return; 648 return;
650 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { 649 for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) {
651 ClipNode* clip_node = clip_tree->Node(i); 650 ClipNode* clip_node = clip_tree->Node(i);
652 651
653 if (clip_node->id == 1) { 652 if (clip_node->id == 1) {
654 ResetIfHasNanCoordinate(&clip_node->data.clip); 653 ResetIfHasNanCoordinate(&clip_node->clip);
655 clip_node->data.clip_in_target_space = clip_node->data.clip; 654 clip_node->clip_in_target_space = clip_node->clip;
656 clip_node->data.combined_clip_in_target_space = clip_node->data.clip; 655 clip_node->combined_clip_in_target_space = clip_node->clip;
657 continue; 656 continue;
658 } 657 }
659 const TransformNode* transform_node = 658 const TransformNode* transform_node =
660 transform_tree.Node(clip_node->data.transform_id); 659 transform_tree.Node(clip_node->transform_id);
661 ClipNode* parent_clip_node = clip_tree->parent(clip_node); 660 ClipNode* parent_clip_node = clip_tree->parent(clip_node);
662 661
663 gfx::Transform parent_to_current; 662 gfx::Transform parent_to_current;
664 const TransformNode* parent_target_transform_node = 663 const TransformNode* parent_target_transform_node =
665 transform_tree.Node(parent_clip_node->data.target_id); 664 transform_tree.Node(parent_clip_node->target_id);
666 bool success = true; 665 bool success = true;
667 666
668 // Clips must be combined in target space. We cannot, for example, combine 667 // Clips must be combined in target space. We cannot, for example, combine
669 // clips in the space of the child clip. The reason is non-affine 668 // clips in the space of the child clip. The reason is non-affine
670 // transforms. Say we have the following tree T->A->B->C, and B clips C, but 669 // transforms. Say we have the following tree T->A->B->C, and B clips C, but
671 // draw into target T. It may be the case that A applies a perspective 670 // draw into target T. It may be the case that A applies a perspective
672 // transform, and B and C are at different z positions. When projected into 671 // transform, and B and C are at different z positions. When projected into
673 // target space, the relative sizes and positions of B and C can shift. 672 // target space, the relative sizes and positions of B and C can shift.
674 // Since it's the relationship in target space that matters, that's where we 673 // Since it's the relationship in target space that matters, that's where we
675 // must combine clips. For each clip node, we save the clip rects in its 674 // must combine clips. For each clip node, we save the clip rects in its
676 // target space. So, we need to get the ancestor clip rect in the current 675 // target space. So, we need to get the ancestor clip rect in the current
677 // clip node's target space. 676 // clip node's target space.
678 gfx::RectF parent_combined_clip_in_target_space = 677 gfx::RectF parent_combined_clip_in_target_space =
679 parent_clip_node->data.combined_clip_in_target_space; 678 parent_clip_node->combined_clip_in_target_space;
680 gfx::RectF parent_clip_in_target_space = 679 gfx::RectF parent_clip_in_target_space =
681 parent_clip_node->data.clip_in_target_space; 680 parent_clip_node->clip_in_target_space;
682 if (parent_target_transform_node && 681 if (parent_target_transform_node &&
683 parent_target_transform_node->id != clip_node->data.target_id && 682 parent_target_transform_node->id != clip_node->target_id &&
684 non_root_surfaces_enabled) { 683 non_root_surfaces_enabled) {
685 success &= transform_tree.ComputeTransformWithDestinationSublayerScale( 684 success &= transform_tree.ComputeTransformWithDestinationSublayerScale(
686 parent_target_transform_node->id, clip_node->data.target_id, 685 parent_target_transform_node->id, clip_node->target_id,
687 &parent_to_current); 686 &parent_to_current);
688 if (parent_target_transform_node->data.sublayer_scale.x() > 0 && 687 if (parent_target_transform_node->sublayer_scale.x() > 0 &&
689 parent_target_transform_node->data.sublayer_scale.y() > 0) 688 parent_target_transform_node->sublayer_scale.y() > 0)
690 parent_to_current.Scale( 689 parent_to_current.Scale(
691 1.f / parent_target_transform_node->data.sublayer_scale.x(), 690 1.f / parent_target_transform_node->sublayer_scale.x(),
692 1.f / parent_target_transform_node->data.sublayer_scale.y()); 691 1.f / parent_target_transform_node->sublayer_scale.y());
693 // If we can't compute a transform, it's because we had to use the inverse 692 // If we can't compute a transform, it's because we had to use the inverse
694 // of a singular transform. We won't draw in this case, so there's no need 693 // of a singular transform. We won't draw in this case, so there's no need
695 // to compute clips. 694 // to compute clips.
696 if (!success) 695 if (!success)
697 continue; 696 continue;
698 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( 697 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect(
699 parent_to_current, 698 parent_to_current, parent_clip_node->combined_clip_in_target_space);
700 parent_clip_node->data.combined_clip_in_target_space);
701 parent_clip_in_target_space = MathUtil::ProjectClippedRect( 699 parent_clip_in_target_space = MathUtil::ProjectClippedRect(
702 parent_to_current, parent_clip_node->data.clip_in_target_space); 700 parent_to_current, parent_clip_node->clip_in_target_space);
703 } 701 }
704 // Only nodes affected by ancestor clips will have their clip adjusted due 702 // Only nodes affected by ancestor clips will have their clip adjusted due
705 // to intersecting with an ancestor clip. But, we still need to propagate 703 // to intersecting with an ancestor clip. But, we still need to propagate
706 // the combined clip to our children because if they are clipped, they may 704 // the combined clip to our children because if they are clipped, they may
707 // need to clip using our parent clip and if we don't propagate it here, 705 // need to clip using our parent clip and if we don't propagate it here,
708 // it will be lost. 706 // it will be lost.
709 if (clip_node->data.resets_clip && non_root_surfaces_enabled) { 707 if (clip_node->resets_clip && non_root_surfaces_enabled) {
710 if (clip_node->data.applies_local_clip) { 708 if (clip_node->applies_local_clip) {
711 clip_node->data.clip_in_target_space = MathUtil::MapClippedRect( 709 clip_node->clip_in_target_space = MathUtil::MapClippedRect(
712 transform_tree.ToTarget(clip_node->data.transform_id), 710 transform_tree.ToTarget(clip_node->transform_id), clip_node->clip);
713 clip_node->data.clip); 711 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space);
714 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space); 712 clip_node->combined_clip_in_target_space =
715 clip_node->data.combined_clip_in_target_space = 713 gfx::IntersectRects(clip_node->clip_in_target_space,
716 gfx::IntersectRects(clip_node->data.clip_in_target_space,
717 parent_combined_clip_in_target_space); 714 parent_combined_clip_in_target_space);
718 } else { 715 } else {
719 DCHECK(!clip_node->data.target_is_clipped); 716 DCHECK(!clip_node->target_is_clipped);
720 DCHECK(!clip_node->data.layers_are_clipped); 717 DCHECK(!clip_node->layers_are_clipped);
721 clip_node->data.combined_clip_in_target_space = 718 clip_node->combined_clip_in_target_space =
722 parent_combined_clip_in_target_space; 719 parent_combined_clip_in_target_space;
723 } 720 }
724 ResetIfHasNanCoordinate(&clip_node->data.combined_clip_in_target_space); 721 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space);
725 continue; 722 continue;
726 } 723 }
727 bool use_only_parent_clip = !clip_node->data.applies_local_clip; 724 bool use_only_parent_clip = !clip_node->applies_local_clip;
728 if (use_only_parent_clip) { 725 if (use_only_parent_clip) {
729 clip_node->data.combined_clip_in_target_space = 726 clip_node->combined_clip_in_target_space =
730 parent_combined_clip_in_target_space; 727 parent_combined_clip_in_target_space;
731 if (!non_root_surfaces_enabled) { 728 if (!non_root_surfaces_enabled) {
732 clip_node->data.clip_in_target_space = 729 clip_node->clip_in_target_space =
733 parent_clip_node->data.clip_in_target_space; 730 parent_clip_node->clip_in_target_space;
734 } else if (!clip_node->data.target_is_clipped) { 731 } else if (!clip_node->target_is_clipped) {
735 clip_node->data.clip_in_target_space = parent_clip_in_target_space; 732 clip_node->clip_in_target_space = parent_clip_in_target_space;
736 } else { 733 } else {
737 // Render Surface applies clip and the owning layer itself applies 734 // Render Surface applies clip and the owning layer itself applies
738 // no clip. So, clip_in_target_space is not used and hence we can set 735 // no clip. So, clip_in_target_space is not used and hence we can set
739 // it to an empty rect. 736 // it to an empty rect.
740 clip_node->data.clip_in_target_space = gfx::RectF(); 737 clip_node->clip_in_target_space = gfx::RectF();
741 } 738 }
742 } else { 739 } else {
743 gfx::Transform source_to_target; 740 gfx::Transform source_to_target;
744 741
745 if (!non_root_surfaces_enabled) { 742 if (!non_root_surfaces_enabled) {
746 source_to_target = 743 source_to_target = transform_tree.ToScreen(clip_node->transform_id);
747 transform_tree.ToScreen(clip_node->data.transform_id);
748 } else if (transform_tree.ContentTargetId(transform_node->id) == 744 } else if (transform_tree.ContentTargetId(transform_node->id) ==
749 clip_node->data.target_id) { 745 clip_node->target_id) {
750 source_to_target = 746 source_to_target = transform_tree.ToTarget(clip_node->transform_id);
751 transform_tree.ToTarget(clip_node->data.transform_id);
752 } else { 747 } else {
753 success = transform_tree.ComputeTransformWithDestinationSublayerScale( 748 success = transform_tree.ComputeTransformWithDestinationSublayerScale(
754 transform_node->id, clip_node->data.target_id, &source_to_target); 749 transform_node->id, clip_node->target_id, &source_to_target);
755 // source_to_target computation should be successful as target is an 750 // source_to_target computation should be successful as target is an
756 // ancestor of the transform node. 751 // ancestor of the transform node.
757 DCHECK(success); 752 DCHECK(success);
758 } 753 }
759 754
760 gfx::RectF source_clip_in_target_space = 755 gfx::RectF source_clip_in_target_space =
761 MathUtil::MapClippedRect(source_to_target, clip_node->data.clip); 756 MathUtil::MapClippedRect(source_to_target, clip_node->clip);
762 757
763 // With surfaces disabled, the only case where we use only the local clip 758 // With surfaces disabled, the only case where we use only the local clip
764 // for layer clipping is the case where no non-viewport ancestor node 759 // for layer clipping is the case where no non-viewport ancestor node
765 // applies a local clip. 760 // applies a local clip.
766 bool layer_clipping_uses_only_local_clip = 761 bool layer_clipping_uses_only_local_clip =
767 non_root_surfaces_enabled 762 non_root_surfaces_enabled
768 ? clip_node->data.layer_clipping_uses_only_local_clip 763 ? clip_node->layer_clipping_uses_only_local_clip
769 : !parent_clip_node->data 764 : !parent_clip_node->layers_are_clipped_when_surfaces_disabled;
770 .layers_are_clipped_when_surfaces_disabled;
771 if (!layer_clipping_uses_only_local_clip) { 765 if (!layer_clipping_uses_only_local_clip) {
772 clip_node->data.clip_in_target_space = gfx::IntersectRects( 766 clip_node->clip_in_target_space = gfx::IntersectRects(
773 parent_clip_in_target_space, source_clip_in_target_space); 767 parent_clip_in_target_space, source_clip_in_target_space);
774 } else { 768 } else {
775 clip_node->data.clip_in_target_space = source_clip_in_target_space; 769 clip_node->clip_in_target_space = source_clip_in_target_space;
776 } 770 }
777 771
778 clip_node->data.combined_clip_in_target_space = gfx::IntersectRects( 772 clip_node->combined_clip_in_target_space = gfx::IntersectRects(
779 parent_combined_clip_in_target_space, source_clip_in_target_space); 773 parent_combined_clip_in_target_space, source_clip_in_target_space);
780 } 774 }
781 ResetIfHasNanCoordinate(&clip_node->data.clip_in_target_space); 775 ResetIfHasNanCoordinate(&clip_node->clip_in_target_space);
782 ResetIfHasNanCoordinate(&clip_node->data.combined_clip_in_target_space); 776 ResetIfHasNanCoordinate(&clip_node->combined_clip_in_target_space);
783 } 777 }
784 clip_tree->set_needs_update(false); 778 clip_tree->set_needs_update(false);
785 } 779 }
786 780
787 void ComputeTransforms(TransformTree* transform_tree) { 781 void ComputeTransforms(TransformTree* transform_tree) {
788 if (!transform_tree->needs_update()) 782 if (!transform_tree->needs_update())
789 return; 783 return;
790 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i) 784 for (int i = 1; i < static_cast<int>(transform_tree->size()); ++i)
791 transform_tree->UpdateTransforms(i); 785 transform_tree->UpdateTransforms(i);
792 transform_tree->set_needs_update(false); 786 transform_tree->set_needs_update(false);
793 } 787 }
794 788
795 void UpdateRenderTarget(EffectTree* effect_tree, 789 void UpdateRenderTarget(EffectTree* effect_tree,
796 bool can_render_to_separate_surface) { 790 bool can_render_to_separate_surface) {
797 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) { 791 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) {
798 EffectNode* node = effect_tree->Node(i); 792 EffectNode* node = effect_tree->Node(i);
799 if (i == 1) { 793 if (i == 1) {
800 // Render target on the first effect node is root. 794 // Render target on the first effect node is root.
801 node->data.target_id = 0; 795 node->target_id = 0;
802 } else if (!can_render_to_separate_surface) { 796 } else if (!can_render_to_separate_surface) {
803 node->data.target_id = 1; 797 node->target_id = 1;
804 } else if (effect_tree->parent(node)->data.has_render_surface) { 798 } else if (effect_tree->parent(node)->has_render_surface) {
805 node->data.target_id = node->parent_id; 799 node->target_id = node->parent_id;
806 } else { 800 } else {
807 node->data.target_id = effect_tree->parent(node)->data.target_id; 801 node->target_id = effect_tree->parent(node)->target_id;
808 } 802 }
809 } 803 }
810 } 804 }
811 805
812 void ComputeEffects(EffectTree* effect_tree) { 806 void ComputeEffects(EffectTree* effect_tree) {
813 if (!effect_tree->needs_update()) 807 if (!effect_tree->needs_update())
814 return; 808 return;
815 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i) 809 for (int i = 1; i < static_cast<int>(effect_tree->size()); ++i)
816 effect_tree->UpdateEffects(i); 810 effect_tree->UpdateEffects(i);
817 effect_tree->set_needs_update(false); 811 effect_tree->set_needs_update(false);
818 } 812 }
819 813
820 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) { 814 static void ComputeClipsWithEffectTree(PropertyTrees* property_trees) {
821 EffectTree* effect_tree = &property_trees->effect_tree; 815 EffectTree* effect_tree = &property_trees->effect_tree;
822 const ClipTree* clip_tree = &property_trees->clip_tree; 816 const ClipTree* clip_tree = &property_trees->clip_tree;
823 const TransformTree* transform_tree = &property_trees->transform_tree; 817 const TransformTree* transform_tree = &property_trees->transform_tree;
824 EffectNode* root_effect_node = effect_tree->Node(1); 818 EffectNode* root_effect_node = effect_tree->Node(1);
825 const RenderSurfaceImpl* root_render_surface = 819 const RenderSurfaceImpl* root_render_surface =
826 root_effect_node->data.render_surface; 820 root_effect_node->render_surface;
827 gfx::Rect root_clip = gfx::ToEnclosingRect( 821 gfx::Rect root_clip =
828 clip_tree->Node(root_effect_node->data.clip_id)->data.clip); 822 gfx::ToEnclosingRect(clip_tree->Node(root_effect_node->clip_id)->clip);
829 if (root_render_surface->is_clipped()) 823 if (root_render_surface->is_clipped())
830 DCHECK(root_clip == root_render_surface->clip_rect()) 824 DCHECK(root_clip == root_render_surface->clip_rect())
831 << "clip on root render surface: " 825 << "clip on root render surface: "
832 << root_render_surface->clip_rect().ToString() 826 << root_render_surface->clip_rect().ToString()
833 << " v.s. root effect node's clip: " << root_clip.ToString(); 827 << " v.s. root effect node's clip: " << root_clip.ToString();
834 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { 828 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) {
835 EffectNode* effect_node = effect_tree->Node(i); 829 EffectNode* effect_node = effect_tree->Node(i);
836 const EffectNode* target_node = 830 const EffectNode* target_node = effect_tree->Node(effect_node->target_id);
837 effect_tree->Node(effect_node->data.target_id);
838 ConditionalClip accumulated_clip_rect = 831 ConditionalClip accumulated_clip_rect =
839 ComputeAccumulatedClip(*clip_tree, effect_node->data.clip_id, 832 ComputeAccumulatedClip(*clip_tree, effect_node->clip_id, *effect_tree,
840 *effect_tree, target_node->id, *transform_tree); 833 target_node->id, *transform_tree);
841 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; 834 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect;
842 const RenderSurfaceImpl* render_surface = effect_node->data.render_surface; 835 const RenderSurfaceImpl* render_surface = effect_node->render_surface;
843 if (render_surface && render_surface->is_clipped()) { 836 if (render_surface && render_surface->is_clipped()) {
844 DCHECK(gfx::ToEnclosingRect(accumulated_clip) == 837 DCHECK(gfx::ToEnclosingRect(accumulated_clip) ==
845 render_surface->clip_rect()) 838 render_surface->clip_rect())
846 << " render surface's clip rect: " 839 << " render surface's clip rect: "
847 << render_surface->clip_rect().ToString() 840 << render_surface->clip_rect().ToString()
848 << " v.s. accumulated clip: " 841 << " v.s. accumulated clip: "
849 << gfx::ToEnclosingRect(accumulated_clip).ToString(); 842 << gfx::ToEnclosingRect(accumulated_clip).ToString();
850 } 843 }
851 } 844 }
852 } 845 }
853 846
854 static void ComputeLayerClipRect(const PropertyTrees* property_trees, 847 static void ComputeLayerClipRect(const PropertyTrees* property_trees,
855 const LayerImpl* layer) { 848 const LayerImpl* layer) {
856 const EffectTree* effect_tree = &property_trees->effect_tree; 849 const EffectTree* effect_tree = &property_trees->effect_tree;
857 const ClipTree* clip_tree = &property_trees->clip_tree; 850 const ClipTree* clip_tree = &property_trees->clip_tree;
858 const TransformTree* transform_tree = &property_trees->transform_tree; 851 const TransformTree* transform_tree = &property_trees->transform_tree;
859 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index()); 852 const EffectNode* effect_node = effect_tree->Node(layer->effect_tree_index());
860 const EffectNode* target_node = 853 const EffectNode* target_node =
861 effect_node->data.has_render_surface 854 effect_node->has_render_surface
862 ? effect_node 855 ? effect_node
863 : effect_tree->Node(effect_node->data.target_id); 856 : effect_tree->Node(effect_node->target_id);
864 // TODO(weiliangc): When effect node has up to date render surface info on 857 // TODO(weiliangc): When effect node has up to date render surface info on
865 // compositor thread, no need to check for resourceless draw mode 858 // compositor thread, no need to check for resourceless draw mode
866 if (!property_trees->non_root_surfaces_enabled) { 859 if (!property_trees->non_root_surfaces_enabled) {
867 target_node = effect_tree->Node(1); 860 target_node = effect_tree->Node(1);
868 } 861 }
869 862
870 ConditionalClip accumulated_clip_rect = 863 ConditionalClip accumulated_clip_rect =
871 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree, 864 ComputeAccumulatedClip(*clip_tree, layer->clip_tree_index(), *effect_tree,
872 target_node->id, *transform_tree); 865 target_node->id, *transform_tree);
873 866
874 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; 867 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect;
875 868
876 if ((!property_trees->non_root_surfaces_enabled && 869 if ((!property_trees->non_root_surfaces_enabled &&
877 clip_tree->Node(layer->clip_tree_index()) 870 clip_tree->Node(layer->clip_tree_index())
878 ->data.layers_are_clipped_when_surfaces_disabled) || 871 ->layers_are_clipped_when_surfaces_disabled) ||
879 clip_tree->Node(layer->clip_tree_index())->data.layers_are_clipped) { 872 clip_tree->Node(layer->clip_tree_index())->layers_are_clipped) {
880 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip)) 873 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip))
881 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index() 874 << " layer: " << layer->id() << " clip id: " << layer->clip_tree_index()
882 << " layer clip: " << layer->clip_rect().ToString() << " v.s. " 875 << " layer clip: " << layer->clip_rect().ToString() << " v.s. "
883 << gfx::ToEnclosingRect(accumulated_clip).ToString() 876 << gfx::ToEnclosingRect(accumulated_clip).ToString()
884 << " and clip node clip: " 877 << " and clip node clip: "
885 << gfx::ToEnclosingRect(clip_tree->Node(layer->clip_tree_index()) 878 << gfx::ToEnclosingRect(
886 ->data.clip_in_target_space) 879 clip_tree->Node(layer->clip_tree_index())->clip_in_target_space)
887 .ToString(); 880 .ToString();
888 } 881 }
889 } 882 }
890 883
891 static int FindTargetTransformTreeIndexFromEffectTree( 884 static int FindTargetTransformTreeIndexFromEffectTree(
892 const EffectTree& effect_tree, 885 const EffectTree& effect_tree,
893 const int effect_tree_index) { 886 const int effect_tree_index) {
894 const EffectNode* node = effect_tree.Node(effect_tree_index); 887 const EffectNode* node = effect_tree.Node(effect_tree_index);
895 if (node->data.has_render_surface) 888 if (node->has_render_surface)
896 return node->data.transform_id; 889 return node->transform_id;
897 node = effect_tree.Node(node->data.target_id); 890 node = effect_tree.Node(node->target_id);
898 return node->data.transform_id; 891 return node->transform_id;
899 } 892 }
900 893
901 static void VerifyDrawTransformsMatch(LayerImpl* layer, 894 static void VerifyDrawTransformsMatch(LayerImpl* layer,
902 PropertyTrees* property_trees) { 895 PropertyTrees* property_trees) {
903 const int source_id = layer->transform_tree_index(); 896 const int source_id = layer->transform_tree_index();
904 int destination_id = FindTargetTransformTreeIndexFromEffectTree( 897 int destination_id = FindTargetTransformTreeIndexFromEffectTree(
905 property_trees->effect_tree, layer->effect_tree_index()); 898 property_trees->effect_tree, layer->effect_tree_index());
906 // TODO(jaydasika) : Remove this after sorting out how sublayer scale works 899 // TODO(jaydasika) : Remove this after sorting out how sublayer scale works
907 // for these ids. 900 // for these ids.
908 if (destination_id == 0 || destination_id == 1) 901 if (destination_id == 0 || destination_id == 1)
909 return; 902 return;
910 gfx::Transform draw_transform; 903 gfx::Transform draw_transform;
911 property_trees->transform_tree.ComputeTransform(source_id, destination_id, 904 property_trees->transform_tree.ComputeTransform(source_id, destination_id,
912 &draw_transform); 905 &draw_transform);
913 TransformNode* target_node = 906 TransformNode* target_node =
914 property_trees->transform_tree.Node(destination_id); 907 property_trees->transform_tree.Node(destination_id);
915 draw_transform.matrix().postScale(target_node->data.sublayer_scale.x(), 908 draw_transform.matrix().postScale(target_node->sublayer_scale.x(),
916 target_node->data.sublayer_scale.y(), 1.f); 909 target_node->sublayer_scale.y(), 1.f);
917 if (layer->should_flatten_transform_from_property_tree()) 910 if (layer->should_flatten_transform_from_property_tree())
918 draw_transform.FlattenTo2d(); 911 draw_transform.FlattenTo2d();
919 draw_transform.Translate(layer->offset_to_transform_parent().x(), 912 draw_transform.Translate(layer->offset_to_transform_parent().x(),
920 layer->offset_to_transform_parent().y()); 913 layer->offset_to_transform_parent().y());
921 DCHECK(draw_transform.ApproximatelyEqual( 914 DCHECK(draw_transform.ApproximatelyEqual(
922 DrawTransform(layer, property_trees->transform_tree))) 915 DrawTransform(layer, property_trees->transform_tree)))
923 << " layer: " << layer->id() << " source transform id: " << source_id 916 << " layer: " << layer->id() << " source transform id: " << source_id
924 << " destination transform id: " << destination_id 917 << " destination transform id: " << destination_id
925 << " draw transform from transform tree: " 918 << " draw transform from transform tree: "
926 << DrawTransform(layer, property_trees->transform_tree).ToString() 919 << DrawTransform(layer, property_trees->transform_tree).ToString()
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 void ComputeVisibleRects(LayerImpl* root_layer, 1021 void ComputeVisibleRects(LayerImpl* root_layer,
1029 PropertyTrees* property_trees, 1022 PropertyTrees* property_trees,
1030 bool can_render_to_separate_surface, 1023 bool can_render_to_separate_surface,
1031 LayerImplList* visible_layer_list) { 1024 LayerImplList* visible_layer_list) {
1032 for (auto* layer : *root_layer->layer_tree_impl()) { 1025 for (auto* layer : *root_layer->layer_tree_impl()) {
1033 UpdateRenderSurfaceForLayer(&property_trees->effect_tree, 1026 UpdateRenderSurfaceForLayer(&property_trees->effect_tree,
1034 can_render_to_separate_surface, layer); 1027 can_render_to_separate_surface, layer);
1035 EffectNode* node = 1028 EffectNode* node =
1036 property_trees->effect_tree.Node(layer->effect_tree_index()); 1029 property_trees->effect_tree.Node(layer->effect_tree_index());
1037 if (node->owner_id == layer->id()) 1030 if (node->owner_id == layer->id())
1038 node->data.render_surface = layer->render_surface(); 1031 node->render_surface = layer->render_surface();
1039 #if DCHECK_IS_ON() 1032 #if DCHECK_IS_ON()
1040 if (can_render_to_separate_surface) 1033 if (can_render_to_separate_surface)
1041 ValidateRenderSurfaceForLayer(layer); 1034 ValidateRenderSurfaceForLayer(layer);
1042 #endif 1035 #endif
1043 } 1036 }
1044 ComputeVisibleRectsInternal(root_layer, property_trees, 1037 ComputeVisibleRectsInternal(root_layer, property_trees,
1045 can_render_to_separate_surface, 1038 can_render_to_separate_surface,
1046 visible_layer_list); 1039 visible_layer_list);
1047 } 1040 }
1048 1041
(...skipping 18 matching lines...) Expand all
1067 if (!owns_non_root_surface) { 1060 if (!owns_non_root_surface) {
1068 // If you're not the root, or you don't own a surface, you need to apply 1061 // If you're not the root, or you don't own a surface, you need to apply
1069 // your local offset. 1062 // your local offset.
1070 xform = tree.ToTarget(layer->transform_tree_index()); 1063 xform = tree.ToTarget(layer->transform_tree_index());
1071 if (layer->should_flatten_transform_from_property_tree()) 1064 if (layer->should_flatten_transform_from_property_tree())
1072 xform.FlattenTo2d(); 1065 xform.FlattenTo2d();
1073 xform.Translate(layer->offset_to_transform_parent().x(), 1066 xform.Translate(layer->offset_to_transform_parent().x(),
1074 layer->offset_to_transform_parent().y()); 1067 layer->offset_to_transform_parent().y());
1075 } else { 1068 } else {
1076 // Surfaces need to apply their sublayer scale. 1069 // Surfaces need to apply their sublayer scale.
1077 xform.Scale(node->data.sublayer_scale.x(), node->data.sublayer_scale.y()); 1070 xform.Scale(node->sublayer_scale.x(), node->sublayer_scale.y());
1078 } 1071 }
1079 return xform; 1072 return xform;
1080 } 1073 }
1081 1074
1082 static void SetSurfaceDrawTransform(const TransformTree& tree, 1075 static void SetSurfaceDrawTransform(const TransformTree& tree,
1083 RenderSurfaceImpl* render_surface) { 1076 RenderSurfaceImpl* render_surface) {
1084 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex()); 1077 const TransformNode* node = tree.Node(render_surface->TransformTreeIndex());
1085 // The draw transform of root render surface is identity tranform. 1078 // The draw transform of root render surface is identity tranform.
1086 if (node->id == 1) { 1079 if (node->id == 1) {
1087 render_surface->SetDrawTransform(gfx::Transform()); 1080 render_surface->SetDrawTransform(gfx::Transform());
1088 return; 1081 return;
1089 } 1082 }
1090 1083
1091 gfx::Transform render_surface_transform; 1084 gfx::Transform render_surface_transform;
1092 const TransformNode* target_node = tree.Node(tree.TargetId(node->id)); 1085 const TransformNode* target_node = tree.Node(tree.TargetId(node->id));
1093 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id, 1086 tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id,
1094 &render_surface_transform); 1087 &render_surface_transform);
1095 if (node->data.sublayer_scale.x() != 0.0 && 1088 if (node->sublayer_scale.x() != 0.0 && node->sublayer_scale.y() != 0.0)
1096 node->data.sublayer_scale.y() != 0.0) 1089 render_surface_transform.Scale(1.0 / node->sublayer_scale.x(),
1097 render_surface_transform.Scale(1.0 / node->data.sublayer_scale.x(), 1090 1.0 / node->sublayer_scale.y());
1098 1.0 / node->data.sublayer_scale.y());
1099 render_surface->SetDrawTransform(render_surface_transform); 1091 render_surface->SetDrawTransform(render_surface_transform);
1100 } 1092 }
1101 1093
1102 static void SetSurfaceIsClipped(const ClipNode* clip_node, 1094 static void SetSurfaceIsClipped(const ClipNode* clip_node,
1103 RenderSurfaceImpl* render_surface) { 1095 RenderSurfaceImpl* render_surface) {
1104 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id) 1096 DCHECK(render_surface->OwningLayerId() == clip_node->owner_id)
1105 << "we now create clip node for every render surface"; 1097 << "we now create clip node for every render surface";
1106 1098
1107 render_surface->SetIsClipped(clip_node->data.target_is_clipped); 1099 render_surface->SetIsClipped(clip_node->target_is_clipped);
1108 } 1100 }
1109 1101
1110 static void SetSurfaceClipRect(const ClipNode* parent_clip_node, 1102 static void SetSurfaceClipRect(const ClipNode* parent_clip_node,
1111 const TransformTree& transform_tree, 1103 const TransformTree& transform_tree,
1112 RenderSurfaceImpl* render_surface) { 1104 RenderSurfaceImpl* render_surface) {
1113 if (!render_surface->is_clipped()) { 1105 if (!render_surface->is_clipped()) {
1114 render_surface->SetClipRect(gfx::Rect()); 1106 render_surface->SetClipRect(gfx::Rect());
1115 return; 1107 return;
1116 } 1108 }
1117 1109
1118 const TransformNode* transform_node = 1110 const TransformNode* transform_node =
1119 transform_tree.Node(render_surface->TransformTreeIndex()); 1111 transform_tree.Node(render_surface->TransformTreeIndex());
1120 if (transform_tree.TargetId(transform_node->id) == 1112 if (transform_tree.TargetId(transform_node->id) ==
1121 parent_clip_node->data.target_id) { 1113 parent_clip_node->target_id) {
1122 render_surface->SetClipRect( 1114 render_surface->SetClipRect(
1123 gfx::ToEnclosingRect(parent_clip_node->data.clip_in_target_space)); 1115 gfx::ToEnclosingRect(parent_clip_node->clip_in_target_space));
1124 return; 1116 return;
1125 } 1117 }
1126 1118
1127 // In this case, the clip child has reset the clip node for subtree and hence 1119 // In this case, the clip child has reset the clip node for subtree and hence
1128 // the parent clip node's clip rect is in clip parent's target space and not 1120 // the parent clip node's clip rect is in clip parent's target space and not
1129 // our target space. We need to transform it to our target space. 1121 // our target space. We need to transform it to our target space.
1130 gfx::Transform clip_parent_target_to_target; 1122 gfx::Transform clip_parent_target_to_target;
1131 const bool success = 1123 const bool success =
1132 transform_tree.ComputeTransformWithDestinationSublayerScale( 1124 transform_tree.ComputeTransformWithDestinationSublayerScale(
1133 parent_clip_node->data.target_id, 1125 parent_clip_node->target_id,
1134 transform_tree.TargetId(transform_node->id), 1126 transform_tree.TargetId(transform_node->id),
1135 &clip_parent_target_to_target); 1127 &clip_parent_target_to_target);
1136 1128
1137 if (!success) { 1129 if (!success) {
1138 render_surface->SetClipRect(gfx::Rect()); 1130 render_surface->SetClipRect(gfx::Rect());
1139 return; 1131 return;
1140 } 1132 }
1141 1133
1142 DCHECK_LT(parent_clip_node->data.target_id, 1134 DCHECK_LT(parent_clip_node->target_id,
1143 transform_tree.TargetId(transform_node->id)); 1135 transform_tree.TargetId(transform_node->id));
1144 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( 1136 render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect(
1145 clip_parent_target_to_target, 1137 clip_parent_target_to_target, parent_clip_node->clip_in_target_space)));
1146 parent_clip_node->data.clip_in_target_space)));
1147 } 1138 }
1148 1139
1149 template <typename LayerType> 1140 template <typename LayerType>
1150 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer, 1141 static gfx::Transform ScreenSpaceTransformInternal(LayerType* layer,
1151 const TransformTree& tree) { 1142 const TransformTree& tree) {
1152 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(), 1143 gfx::Transform xform(1, 0, 0, 1, layer->offset_to_transform_parent().x(),
1153 layer->offset_to_transform_parent().y()); 1144 layer->offset_to_transform_parent().y());
1154 gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index()); 1145 gfx::Transform ssxform = tree.ToScreen(layer->transform_tree_index());
1155 xform.ConcatTransform(ssxform); 1146 xform.ConcatTransform(ssxform);
1156 if (layer->should_flatten_transform_from_property_tree()) 1147 if (layer->should_flatten_transform_from_property_tree())
(...skipping 28 matching lines...) Expand all
1185 } 1176 }
1186 return draw_opacity; 1177 return draw_opacity;
1187 } 1178 }
1188 1179
1189 static void SetSurfaceDrawOpacity(const EffectTree& tree, 1180 static void SetSurfaceDrawOpacity(const EffectTree& tree,
1190 RenderSurfaceImpl* render_surface) { 1181 RenderSurfaceImpl* render_surface) {
1191 // Draw opacity of a surface is the product of opacities between the surface 1182 // Draw opacity of a surface is the product of opacities between the surface
1192 // (included) and its target surface (excluded). 1183 // (included) and its target surface (excluded).
1193 const EffectNode* node = tree.Node(render_surface->EffectTreeIndex()); 1184 const EffectNode* node = tree.Node(render_surface->EffectTreeIndex());
1194 float draw_opacity = tree.EffectiveOpacity(node); 1185 float draw_opacity = tree.EffectiveOpacity(node);
1195 for (node = tree.parent(node); node && !node->data.has_render_surface; 1186 for (node = tree.parent(node); node && !node->has_render_surface;
1196 node = tree.parent(node)) { 1187 node = tree.parent(node)) {
1197 draw_opacity *= tree.EffectiveOpacity(node); 1188 draw_opacity *= tree.EffectiveOpacity(node);
1198 } 1189 }
1199 render_surface->SetDrawOpacity(draw_opacity); 1190 render_surface->SetDrawOpacity(draw_opacity);
1200 } 1191 }
1201 1192
1202 static gfx::Rect LayerDrawableContentRect( 1193 static gfx::Rect LayerDrawableContentRect(
1203 const LayerImpl* layer, 1194 const LayerImpl* layer,
1204 const gfx::Rect& layer_bounds_in_target_space, 1195 const gfx::Rect& layer_bounds_in_target_space,
1205 const gfx::Rect& clip_rect) { 1196 const gfx::Rect& clip_rect) {
1206 if (layer->is_clipped()) 1197 if (layer->is_clipped())
1207 return IntersectRects(layer_bounds_in_target_space, clip_rect); 1198 return IntersectRects(layer_bounds_in_target_space, clip_rect);
1208 1199
1209 return layer_bounds_in_target_space; 1200 return layer_bounds_in_target_space;
1210 } 1201 }
1211 1202
1212 static gfx::Transform ReplicaToSurfaceTransform( 1203 static gfx::Transform ReplicaToSurfaceTransform(
1213 const RenderSurfaceImpl* render_surface, 1204 const RenderSurfaceImpl* render_surface,
1214 const TransformTree& tree) { 1205 const TransformTree& tree) {
1215 gfx::Transform replica_to_surface; 1206 gfx::Transform replica_to_surface;
1216 if (!render_surface->HasReplica()) 1207 if (!render_surface->HasReplica())
1217 return replica_to_surface; 1208 return replica_to_surface;
1218 const LayerImpl* replica_layer = render_surface->ReplicaLayer(); 1209 const LayerImpl* replica_layer = render_surface->ReplicaLayer();
1219 const TransformNode* surface_transform_node = 1210 const TransformNode* surface_transform_node =
1220 tree.Node(render_surface->TransformTreeIndex()); 1211 tree.Node(render_surface->TransformTreeIndex());
1221 replica_to_surface.Scale(surface_transform_node->data.sublayer_scale.x(), 1212 replica_to_surface.Scale(surface_transform_node->sublayer_scale.x(),
1222 surface_transform_node->data.sublayer_scale.y()); 1213 surface_transform_node->sublayer_scale.y());
1223 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(), 1214 replica_to_surface.Translate(replica_layer->offset_to_transform_parent().x(),
1224 replica_layer->offset_to_transform_parent().y()); 1215 replica_layer->offset_to_transform_parent().y());
1225 gfx::Transform replica_transform_node_to_surface; 1216 gfx::Transform replica_transform_node_to_surface;
1226 tree.ComputeTransform(replica_layer->transform_tree_index(), 1217 tree.ComputeTransform(replica_layer->transform_tree_index(),
1227 render_surface->TransformTreeIndex(), 1218 render_surface->TransformTreeIndex(),
1228 &replica_transform_node_to_surface); 1219 &replica_transform_node_to_surface);
1229 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface); 1220 replica_to_surface.PreconcatTransform(replica_transform_node_to_surface);
1230 if (surface_transform_node->data.sublayer_scale.x() != 0 && 1221 if (surface_transform_node->sublayer_scale.x() != 0 &&
1231 surface_transform_node->data.sublayer_scale.y() != 0) { 1222 surface_transform_node->sublayer_scale.y() != 0) {
1232 replica_to_surface.Scale( 1223 replica_to_surface.Scale(1.0 / surface_transform_node->sublayer_scale.x(),
1233 1.0 / surface_transform_node->data.sublayer_scale.x(), 1224 1.0 / surface_transform_node->sublayer_scale.y());
1234 1.0 / surface_transform_node->data.sublayer_scale.y());
1235 } 1225 }
1236 return replica_to_surface; 1226 return replica_to_surface;
1237 } 1227 }
1238 1228
1239 void ComputeLayerDrawProperties(LayerImpl* layer, 1229 void ComputeLayerDrawProperties(LayerImpl* layer,
1240 const PropertyTrees* property_trees) { 1230 const PropertyTrees* property_trees) {
1241 const TransformNode* transform_node = 1231 const TransformNode* transform_node =
1242 property_trees->transform_tree.Node(layer->transform_tree_index()); 1232 property_trees->transform_tree.Node(layer->transform_tree_index());
1243 const ClipNode* clip_node = 1233 const ClipNode* clip_node =
1244 property_trees->clip_tree.Node(layer->clip_tree_index()); 1234 property_trees->clip_tree.Node(layer->clip_tree_index());
1245 1235
1246 layer->draw_properties().screen_space_transform = 1236 layer->draw_properties().screen_space_transform =
1247 ScreenSpaceTransformInternal(layer, property_trees->transform_tree); 1237 ScreenSpaceTransformInternal(layer, property_trees->transform_tree);
1248 if (property_trees->non_root_surfaces_enabled) { 1238 if (property_trees->non_root_surfaces_enabled) {
1249 layer->draw_properties().target_space_transform = 1239 layer->draw_properties().target_space_transform =
1250 DrawTransform(layer, property_trees->transform_tree); 1240 DrawTransform(layer, property_trees->transform_tree);
1251 } else { 1241 } else {
1252 layer->draw_properties().target_space_transform = 1242 layer->draw_properties().target_space_transform =
1253 layer->draw_properties().screen_space_transform; 1243 layer->draw_properties().screen_space_transform;
1254 } 1244 }
1255 layer->draw_properties().screen_space_transform_is_animating = 1245 layer->draw_properties().screen_space_transform_is_animating =
1256 transform_node->data.to_screen_is_potentially_animated; 1246 transform_node->to_screen_is_potentially_animated;
1257 1247
1258 layer->draw_properties().opacity = 1248 layer->draw_properties().opacity =
1259 LayerDrawOpacity(layer, property_trees->effect_tree); 1249 LayerDrawOpacity(layer, property_trees->effect_tree);
1260 if (property_trees->non_root_surfaces_enabled) { 1250 if (property_trees->non_root_surfaces_enabled) {
1261 layer->draw_properties().is_clipped = clip_node->data.layers_are_clipped; 1251 layer->draw_properties().is_clipped = clip_node->layers_are_clipped;
1262 } else { 1252 } else {
1263 layer->draw_properties().is_clipped = 1253 layer->draw_properties().is_clipped =
1264 clip_node->data.layers_are_clipped_when_surfaces_disabled; 1254 clip_node->layers_are_clipped_when_surfaces_disabled;
1265 } 1255 }
1266 1256
1267 gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect( 1257 gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect(
1268 layer->draw_properties().target_space_transform, 1258 layer->draw_properties().target_space_transform,
1269 gfx::Rect(layer->bounds())); 1259 gfx::Rect(layer->bounds()));
1270 layer->draw_properties().drawable_content_rect = LayerDrawableContentRect( 1260 layer->draw_properties().drawable_content_rect = LayerDrawableContentRect(
1271 layer, bounds_in_target_space, layer->draw_properties().clip_rect); 1261 layer, bounds_in_target_space, layer->draw_properties().clip_rect);
1272 } 1262 }
1273 1263
1274 void ComputeMaskDrawProperties(LayerImpl* mask_layer, 1264 void ComputeMaskDrawProperties(LayerImpl* mask_layer,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 // TODO(enne): property trees can't ask the layer these things, but 1327 // TODO(enne): property trees can't ask the layer these things, but
1338 // the page scale layer should *just* be the page scale. 1328 // the page scale layer should *just* be the page scale.
1339 #if DCHECK_IS_ON() 1329 #if DCHECK_IS_ON()
1340 ValidatePageScaleLayer(page_scale_layer); 1330 ValidatePageScaleLayer(page_scale_layer);
1341 #endif 1331 #endif
1342 1332
1343 if (IsRootLayer(page_scale_layer)) { 1333 if (IsRootLayer(page_scale_layer)) {
1344 // When the page scale layer is also the root layer, the node should also 1334 // When the page scale layer is also the root layer, the node should also
1345 // store the combined scale factor and not just the page scale factor. 1335 // store the combined scale factor and not just the page scale factor.
1346 float post_local_scale_factor = page_scale_factor * device_scale_factor; 1336 float post_local_scale_factor = page_scale_factor * device_scale_factor;
1347 node->data.post_local_scale_factor = post_local_scale_factor; 1337 node->post_local_scale_factor = post_local_scale_factor;
1348 node->data.post_local = device_transform; 1338 node->post_local = device_transform;
1349 node->data.post_local.Scale(post_local_scale_factor, 1339 node->post_local.Scale(post_local_scale_factor, post_local_scale_factor);
1350 post_local_scale_factor);
1351 } else { 1340 } else {
1352 node->data.post_local_scale_factor = page_scale_factor; 1341 node->post_local_scale_factor = page_scale_factor;
1353 node->data.update_post_local_transform(gfx::PointF(), gfx::Point3F()); 1342 node->update_post_local_transform(gfx::PointF(), gfx::Point3F());
1354 } 1343 }
1355 node->data.needs_local_transform_update = true; 1344 node->needs_local_transform_update = true;
1356 property_trees->transform_tree.set_needs_update(true); 1345 property_trees->transform_tree.set_needs_update(true);
1357 } 1346 }
1358 1347
1359 void UpdatePageScaleFactor(PropertyTrees* property_trees, 1348 void UpdatePageScaleFactor(PropertyTrees* property_trees,
1360 const LayerImpl* page_scale_layer, 1349 const LayerImpl* page_scale_layer,
1361 float page_scale_factor, 1350 float page_scale_factor,
1362 float device_scale_factor, 1351 float device_scale_factor,
1363 const gfx::Transform device_transform) { 1352 const gfx::Transform device_transform) {
1364 UpdatePageScaleFactorInternal(property_trees, page_scale_layer, 1353 UpdatePageScaleFactorInternal(property_trees, page_scale_layer,
1365 page_scale_factor, device_scale_factor, 1354 page_scale_factor, device_scale_factor,
(...skipping 15 matching lines...) Expand all
1381 PropertyTrees* property_trees, 1370 PropertyTrees* property_trees,
1382 const LayerType* overscroll_elasticity_layer, 1371 const LayerType* overscroll_elasticity_layer,
1383 const gfx::Vector2dF& elastic_overscroll) { 1372 const gfx::Vector2dF& elastic_overscroll) {
1384 if (!overscroll_elasticity_layer) { 1373 if (!overscroll_elasticity_layer) {
1385 DCHECK(elastic_overscroll.IsZero()); 1374 DCHECK(elastic_overscroll.IsZero());
1386 return; 1375 return;
1387 } 1376 }
1388 1377
1389 TransformNode* node = property_trees->transform_tree.Node( 1378 TransformNode* node = property_trees->transform_tree.Node(
1390 overscroll_elasticity_layer->transform_tree_index()); 1379 overscroll_elasticity_layer->transform_tree_index());
1391 if (node->data.scroll_offset == gfx::ScrollOffset(elastic_overscroll)) 1380 if (node->scroll_offset == gfx::ScrollOffset(elastic_overscroll))
1392 return; 1381 return;
1393 1382
1394 node->data.scroll_offset = gfx::ScrollOffset(elastic_overscroll); 1383 node->scroll_offset = gfx::ScrollOffset(elastic_overscroll);
1395 node->data.needs_local_transform_update = true; 1384 node->needs_local_transform_update = true;
1396 property_trees->transform_tree.set_needs_update(true); 1385 property_trees->transform_tree.set_needs_update(true);
1397 } 1386 }
1398 1387
1399 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1388 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1400 const LayerImpl* overscroll_elasticity_layer, 1389 const LayerImpl* overscroll_elasticity_layer,
1401 const gfx::Vector2dF& elastic_overscroll) { 1390 const gfx::Vector2dF& elastic_overscroll) {
1402 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1391 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1403 elastic_overscroll); 1392 elastic_overscroll);
1404 } 1393 }
1405 1394
1406 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1395 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1407 const Layer* overscroll_elasticity_layer, 1396 const Layer* overscroll_elasticity_layer,
1408 const gfx::Vector2dF& elastic_overscroll) { 1397 const gfx::Vector2dF& elastic_overscroll) {
1409 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1398 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1410 elastic_overscroll); 1399 elastic_overscroll);
1411 } 1400 }
1412 1401
1413 } // namespace draw_property_utils 1402 } // namespace draw_property_utils
1414 1403
1415 } // namespace cc 1404 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/clip_node.cc ('k') | cc/trees/effect_node.h » ('j') | ui/gfx/transform.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698