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

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

Issue 2423483003: cc: Make visible rect computation aware of pixel-moving filters (Closed)
Patch Set: It's 2017 -- update copyright for new files Created 3 years, 11 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/clip_node.cc ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('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/draw_property_utils.h" 5 #include "cc/trees/draw_property_utils.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_local); 130 ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_local);
131 131
132 if (target_transform_id > local_transform_id) 132 if (target_transform_id > local_transform_id)
133 return ConditionalClip{true, // is_clipped. 133 return ConditionalClip{true, // is_clipped.
134 MathUtil::MapClippedRect(target_to_local, rect)}; 134 MathUtil::MapClippedRect(target_to_local, rect)};
135 135
136 return ConditionalClip{true, // is_clipped. 136 return ConditionalClip{true, // is_clipped.
137 MathUtil::ProjectClippedRect(target_to_local, rect)}; 137 MathUtil::ProjectClippedRect(target_to_local, rect)};
138 } 138 }
139 139
140 static ConditionalClip ConvertRectBetweenSurfaceSpaces(
141 gfx::RectF rect,
142 const PropertyTrees* property_trees,
143 int source_transform_id,
144 int source_effect_id,
145 int dest_transform_id,
146 int dest_effect_id) {
147 gfx::Transform source_to_dest;
148 bool success = property_trees->GetToTarget(source_transform_id,
149 dest_effect_id, &source_to_dest);
150 if (!success)
151 return ConditionalClip{false, gfx::RectF()};
152 const EffectTree& effect_tree = property_trees->effect_tree;
153 const EffectNode* source_effect_node = effect_tree.Node(source_effect_id);
154 ConcatInverseSurfaceContentsScale(source_effect_node, &source_to_dest);
155 if (source_transform_id > dest_transform_id) {
156 return ConditionalClip{true, // is_clipped
157 MathUtil::MapClippedRect(source_to_dest, rect)};
158 }
159 return ConditionalClip{true, // is_clipped
160 MathUtil::ProjectClippedRect(source_to_dest, rect)};
161 }
162
140 static ConditionalClip ComputeLocalRectInTargetSpace( 163 static ConditionalClip ComputeLocalRectInTargetSpace(
141 gfx::RectF rect, 164 gfx::RectF rect,
142 const PropertyTrees* property_trees, 165 const PropertyTrees* property_trees,
143 int current_transform_id, 166 int current_transform_id,
144 int target_transform_id, 167 int target_transform_id,
145 int target_effect_id) { 168 int target_effect_id) {
146 gfx::Transform current_to_target; 169 gfx::Transform current_to_target;
147 if (!property_trees->GetToTarget(current_transform_id, target_effect_id, 170 if (!property_trees->GetToTarget(current_transform_id, target_effect_id,
148 &current_to_target)) { 171 &current_to_target)) {
149 // If transform is not invertible, cannot apply clip. 172 // If transform is not invertible, cannot apply clip.
(...skipping 21 matching lines...) Expand all
171 gfx::RectF current_clip = clip_node->clip; 194 gfx::RectF current_clip = clip_node->clip;
172 gfx::Vector2dF surface_contents_scale = 195 gfx::Vector2dF surface_contents_scale =
173 effect_tree.Node(target_effect_id)->surface_contents_scale; 196 effect_tree.Node(target_effect_id)->surface_contents_scale;
174 // The viewport clip should not be scaled. 197 // The viewport clip should not be scaled.
175 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0 && 198 if (surface_contents_scale.x() > 0 && surface_contents_scale.y() > 0 &&
176 clip_node->transform_id != TransformTree::kRootNodeId) 199 clip_node->transform_id != TransformTree::kRootNodeId)
177 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y()); 200 current_clip.Scale(surface_contents_scale.x(), surface_contents_scale.y());
178 return ConditionalClip{true /* is_clipped */, current_clip}; 201 return ConditionalClip{true /* is_clipped */, current_clip};
179 } 202 }
180 203
204 static bool ApplyClipNodeToAccumulatedClip(const PropertyTrees* property_trees,
205 bool include_expanding_clips,
206 int target_id,
207 int target_transform_id,
208 const ClipNode* clip_node,
209 gfx::RectF* accumulated_clip) {
210 switch (clip_node->clip_type) {
211 case ClipNode::ClipType::APPLIES_LOCAL_CLIP: {
212 ConditionalClip current_clip = ComputeCurrentClip(
213 clip_node, property_trees, target_transform_id, target_id);
214
215 // If transform is not invertible, no clip will be applied.
216 if (!current_clip.is_clipped)
217 return false;
218
219 *accumulated_clip =
220 gfx::IntersectRects(*accumulated_clip, current_clip.clip_rect);
221 return true;
222 }
223 case ClipNode::ClipType::EXPANDS_CLIP: {
224 if (!include_expanding_clips)
225 return true;
226
227 // Bring the accumulated clip to the space of the expanding effect.
228 const EffectNode* expanding_effect_node =
229 property_trees->effect_tree.Node(
230 clip_node->clip_expander->target_effect_id());
231 ConditionalClip accumulated_clip_in_expanding_space =
232 ConvertRectBetweenSurfaceSpaces(
233 *accumulated_clip, property_trees, target_transform_id, target_id,
234 expanding_effect_node->transform_id, expanding_effect_node->id);
235 // If transform is not invertible, no clip will be applied.
236 if (!accumulated_clip_in_expanding_space.is_clipped)
237 return false;
238
239 // Do the expansion.
240 gfx::RectF expanded_clip_in_expanding_space =
241 gfx::RectF(clip_node->clip_expander->MapRectReverse(
242 gfx::ToEnclosingRect(
243 accumulated_clip_in_expanding_space.clip_rect),
244 property_trees));
245
246 // Put the expanded clip back into the original target space.
247 ConditionalClip expanded_clip_in_target_space =
248 ConvertRectBetweenSurfaceSpaces(
249 expanded_clip_in_expanding_space, property_trees,
250 expanding_effect_node->transform_id, expanding_effect_node->id,
251 target_transform_id, target_id);
252 // If transform is not invertible, no clip will be applied.
253 if (!expanded_clip_in_target_space.is_clipped)
254 return false;
255 *accumulated_clip = expanded_clip_in_target_space.clip_rect;
256 return true;
257 }
258 case ClipNode::ClipType::NONE:
259 return true;
260 }
261 NOTREACHED();
262 return true;
263 }
264
181 static ConditionalClip ComputeAccumulatedClip( 265 static ConditionalClip ComputeAccumulatedClip(
182 const PropertyTrees* property_trees, 266 const PropertyTrees* property_trees,
183 bool include_viewport_clip, 267 bool include_viewport_clip,
268 bool include_expanding_clips,
184 int local_clip_id, 269 int local_clip_id,
185 int target_id) { 270 int target_id) {
186 DCHECK(!include_viewport_clip || 271 DCHECK(!include_viewport_clip ||
187 target_id == EffectTree::kContentsRootNodeId); 272 target_id == EffectTree::kContentsRootNodeId);
188 const ClipTree& clip_tree = property_trees->clip_tree; 273 const ClipTree& clip_tree = property_trees->clip_tree;
189 const EffectTree& effect_tree = property_trees->effect_tree; 274 const EffectTree& effect_tree = property_trees->effect_tree;
190 275
191 const ClipNode* clip_node = clip_tree.Node(local_clip_id); 276 const ClipNode* clip_node = clip_tree.Node(local_clip_id);
192 const EffectNode* target_node = effect_tree.Node(target_id); 277 const EffectNode* target_node = effect_tree.Node(target_id);
193 int target_transform_id = target_node->transform_id; 278 int target_transform_id = target_node->transform_id;
194 bool is_clipped = false;
195 279
196 // Collect all the clips that need to be accumulated. 280 // Collect all the clips that need to be accumulated.
197 std::stack<const ClipNode*> parent_chain; 281 std::stack<const ClipNode*> parent_chain;
198 282
199 // If target is not direct ancestor of clip, this will find least common 283 // If target is not direct ancestor of clip, this will find least common
200 // ancestor between the target and the clip. 284 // ancestor between the target and the clip.
201 while (target_node->clip_id > clip_node->id || 285 while (target_node->clip_id > clip_node->id ||
202 target_node->has_unclipped_descendants) { 286 target_node->has_unclipped_descendants) {
203 target_node = effect_tree.Node(target_node->target_id); 287 target_node = effect_tree.Node(target_node->target_id);
204 } 288 }
205 289
206 // Collect clip nodes up to the least common ancestor. 290 // Collect clip nodes up to the least common ancestor.
207 while (target_node->clip_id < clip_node->id) { 291 while (target_node->clip_id < clip_node->id) {
208 parent_chain.push(clip_node); 292 parent_chain.push(clip_node);
209 clip_node = clip_tree.parent(clip_node); 293 clip_node = clip_tree.parent(clip_node);
210 } 294 }
211 DCHECK_EQ(target_node->clip_id, clip_node->id); 295 DCHECK_EQ(target_node->clip_id, clip_node->id);
212 296
213 if (!include_viewport_clip && parent_chain.size() == 0) { 297 if (!include_viewport_clip && parent_chain.size() == 0) {
214 // There aren't any clips to apply. 298 // There aren't any clips to apply.
215 return ConditionalClip{false, gfx::RectF()}; 299 return ConditionalClip{false, gfx::RectF()};
216 } 300 }
217 301
218 if (!include_viewport_clip) { 302 if (!include_viewport_clip) {
219 clip_node = parent_chain.top(); 303 clip_node = parent_chain.top();
220 parent_chain.pop(); 304 parent_chain.pop();
221 } 305 }
222 306
223 // TODO(weiliangc): If we don't create clip for render surface, we don't need 307 // Find the first clip in the chain that we need to apply.
224 // to check applies_local_clip.
225 while (clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP && 308 while (clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP &&
226 parent_chain.size() > 0) { 309 parent_chain.size() > 0) {
227 clip_node = parent_chain.top(); 310 clip_node = parent_chain.top();
228 parent_chain.pop(); 311 parent_chain.pop();
229 } 312 }
230 313
231 if (clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP) 314 if (clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP) {
232 // No clip node applying clip in between. 315 // No clip node applying clip in between.
233 return ConditionalClip{false, gfx::RectF()}; 316 return ConditionalClip{false, gfx::RectF()};
317 }
234 318
235 ConditionalClip current_clip = ComputeCurrentClip( 319 ConditionalClip current_clip = ComputeCurrentClip(
236 clip_node, property_trees, target_transform_id, target_id); 320 clip_node, property_trees, target_transform_id, target_id);
237 is_clipped = current_clip.is_clipped; 321
322 // If transform is not invertible, no clip will be applied.
323 if (!current_clip.is_clipped)
324 return ConditionalClip{false, gfx::RectF()};
238 gfx::RectF accumulated_clip = current_clip.clip_rect; 325 gfx::RectF accumulated_clip = current_clip.clip_rect;
239 326
240 while (parent_chain.size() > 0) { 327 while (parent_chain.size() > 0) {
241 clip_node = parent_chain.top(); 328 clip_node = parent_chain.top();
242 parent_chain.pop(); 329 parent_chain.pop();
243 if (clip_node->clip_type != ClipNode::ClipType::APPLIES_LOCAL_CLIP) { 330 bool success = ApplyClipNodeToAccumulatedClip(
244 continue; 331 property_trees, include_expanding_clips, target_id, target_transform_id,
245 } 332 clip_node, &accumulated_clip);
246 ConditionalClip current_clip = ComputeCurrentClip(
247 clip_node, property_trees, target_transform_id, target_id);
248 333
249 // If transform is not invertible, no clip will be applied. 334 // Failure to apply the clip means we encountered an uninvertible transform,
250 if (!current_clip.is_clipped) 335 // so no clip will be applied.
251 return ConditionalClip{false, gfx::RectF()}; 336 if (!success)
252 337 return ConditionalClip{false /* is_clipped */, gfx::RectF()};
253 is_clipped = true;
254 accumulated_clip =
255 gfx::IntersectRects(accumulated_clip, current_clip.clip_rect);
256 } 338 }
257 339
258 return ConditionalClip{ 340 return ConditionalClip{true /* is_clipped */, accumulated_clip.IsEmpty()
259 is_clipped, accumulated_clip.IsEmpty() ? gfx::RectF() : accumulated_clip}; 341 ? gfx::RectF()
342 : accumulated_clip};
260 } 343 }
261 344
262 static gfx::RectF ComputeAccumulatedClipInRootSpaceForVisibleRect( 345 static gfx::RectF ComputeAccumulatedClipInRootSpaceForVisibleRect(
263 const PropertyTrees* property_trees, 346 const PropertyTrees* property_trees,
264 int local_clip_id) { 347 int local_clip_id) {
265 const int root_effect_id = EffectTree::kContentsRootNodeId; 348 const int root_effect_id = EffectTree::kContentsRootNodeId;
266 bool include_viewport_clip = true; 349 bool include_viewport_clip = true;
350 bool include_expanding_clips = true;
267 ConditionalClip accumulated_clip = ComputeAccumulatedClip( 351 ConditionalClip accumulated_clip = ComputeAccumulatedClip(
268 property_trees, include_viewport_clip, local_clip_id, root_effect_id); 352 property_trees, include_viewport_clip, include_expanding_clips,
353 local_clip_id, root_effect_id);
269 DCHECK(accumulated_clip.is_clipped); 354 DCHECK(accumulated_clip.is_clipped);
270 return accumulated_clip.clip_rect; 355 return accumulated_clip.clip_rect;
271 } 356 }
272 357
273 void CalculateClipRects(const std::vector<LayerImpl*>& visible_layer_list, 358 void CalculateClipRects(const std::vector<LayerImpl*>& visible_layer_list,
274 const PropertyTrees* property_trees, 359 const PropertyTrees* property_trees,
275 bool non_root_surfaces_enabled) { 360 bool non_root_surfaces_enabled) {
276 const ClipTree& clip_tree = property_trees->clip_tree; 361 const ClipTree& clip_tree = property_trees->clip_tree;
277 for (auto& layer : visible_layer_list) { 362 for (auto& layer : visible_layer_list) {
278 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); 363 const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 const TransformTree& transform_tree = property_trees->transform_tree; 416 const TransformTree& transform_tree = property_trees->transform_tree;
332 const ClipTree& clip_tree = property_trees->clip_tree; 417 const ClipTree& clip_tree = property_trees->clip_tree;
333 for (auto& layer : visible_layer_list) { 418 for (auto& layer : visible_layer_list) {
334 gfx::Size layer_bounds = layer->bounds(); 419 gfx::Size layer_bounds = layer->bounds();
335 420
336 int effect_ancestor_with_copy_request = 421 int effect_ancestor_with_copy_request =
337 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index()); 422 effect_tree.ClosestAncestorWithCopyRequest(layer->effect_tree_index());
338 if (effect_ancestor_with_copy_request > 1) { 423 if (effect_ancestor_with_copy_request > 1) {
339 // Non root copy request. 424 // Non root copy request.
340 bool include_viewport_clip = false; 425 bool include_viewport_clip = false;
426 bool include_expanding_clips = true;
341 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip( 427 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip(
342 property_trees, include_viewport_clip, layer->clip_tree_index(), 428 property_trees, include_viewport_clip, include_expanding_clips,
343 effect_ancestor_with_copy_request); 429 layer->clip_tree_index(), effect_ancestor_with_copy_request);
344 if (!accumulated_clip_rect.is_clipped) { 430 if (!accumulated_clip_rect.is_clipped) {
345 layer->set_visible_layer_rect(gfx::Rect(layer_bounds)); 431 layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
346 continue; 432 continue;
347 } 433 }
348 434
349 gfx::RectF accumulated_clip_in_copy_request_space = 435 gfx::RectF accumulated_clip_in_copy_request_space =
350 accumulated_clip_rect.clip_rect; 436 accumulated_clip_rect.clip_rect;
351 437
352 const EffectNode* copy_request_effect_node = 438 const EffectNode* copy_request_effect_node =
353 effect_tree.Node(effect_ancestor_with_copy_request); 439 effect_tree.Node(effect_ancestor_with_copy_request);
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 effect_tree.Node(parent_clip_node->target_effect_id); 871 effect_tree.Node(parent_clip_node->target_effect_id);
786 ConcatInverseSurfaceContentsScale(parent_target_effect_node, 872 ConcatInverseSurfaceContentsScale(parent_target_effect_node,
787 &parent_to_current); 873 &parent_to_current);
788 // If we can't compute a transform, it's because we had to use the inverse 874 // If we can't compute a transform, it's because we had to use the inverse
789 // of a singular transform. We won't draw in this case, so there's no need 875 // of a singular transform. We won't draw in this case, so there's no need
790 // to compute clips. 876 // to compute clips.
791 if (!success) 877 if (!success)
792 continue; 878 continue;
793 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect( 879 parent_combined_clip_in_target_space = MathUtil::ProjectClippedRect(
794 parent_to_current, parent_clip_node->combined_clip_in_target_space); 880 parent_to_current, parent_clip_node->combined_clip_in_target_space);
881 if (clip_node->clip_type == ClipNode::ClipType::EXPANDS_CLIP) {
882 parent_combined_clip_in_target_space =
883 gfx::RectF(clip_node->clip_expander->MapRectReverse(
884 gfx::ToEnclosingRect(parent_combined_clip_in_target_space),
885 property_trees));
886 }
795 parent_clip_in_target_space = MathUtil::ProjectClippedRect( 887 parent_clip_in_target_space = MathUtil::ProjectClippedRect(
796 parent_to_current, parent_clip_node->clip_in_target_space); 888 parent_to_current, parent_clip_node->clip_in_target_space);
797 } 889 }
798 // Only nodes affected by ancestor clips will have their clip adjusted due 890 // Only nodes affected by ancestor clips will have their clip adjusted due
799 // to intersecting with an ancestor clip. But, we still need to propagate 891 // to intersecting with an ancestor clip. But, we still need to propagate
800 // the combined clip to our children because if they are clipped, they may 892 // the combined clip to our children because if they are clipped, they may
801 // need to clip using our parent clip and if we don't propagate it here, 893 // need to clip using our parent clip and if we don't propagate it here,
802 // it will be lost. 894 // it will be lost.
803 if (clip_node->resets_clip && non_root_surfaces_enabled) { 895 if (clip_node->resets_clip && non_root_surfaces_enabled) {
804 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { 896 if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) {
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
923 gfx::ToEnclosingRect(clip_tree->Node(root_effect_node->clip_id)->clip); 1015 gfx::ToEnclosingRect(clip_tree->Node(root_effect_node->clip_id)->clip);
924 if (root_render_surface->is_clipped()) 1016 if (root_render_surface->is_clipped())
925 DCHECK(root_clip == root_render_surface->clip_rect()) 1017 DCHECK(root_clip == root_render_surface->clip_rect())
926 << "clip on root render surface: " 1018 << "clip on root render surface: "
927 << root_render_surface->clip_rect().ToString() 1019 << root_render_surface->clip_rect().ToString()
928 << " v.s. root effect node's clip: " << root_clip.ToString(); 1020 << " v.s. root effect node's clip: " << root_clip.ToString();
929 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) { 1021 for (int i = 2; i < static_cast<int>(effect_tree->size()); ++i) {
930 EffectNode* effect_node = effect_tree->Node(i); 1022 EffectNode* effect_node = effect_tree->Node(i);
931 const EffectNode* target_node = effect_tree->Node(effect_node->target_id); 1023 const EffectNode* target_node = effect_tree->Node(effect_node->target_id);
932 bool include_viewport_clip = false; 1024 bool include_viewport_clip = false;
933 ConditionalClip accumulated_clip_rect = 1025 bool include_expanding_clips = false;
934 ComputeAccumulatedClip(property_trees, include_viewport_clip, 1026 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip(
935 effect_node->clip_id, target_node->id); 1027 property_trees, include_viewport_clip, include_expanding_clips,
1028 effect_node->clip_id, target_node->id);
936 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; 1029 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect;
937 const RenderSurfaceImpl* render_surface = effect_node->render_surface; 1030 const RenderSurfaceImpl* render_surface = effect_node->render_surface;
938 if (render_surface && render_surface->is_clipped()) { 1031 if (render_surface && render_surface->is_clipped()) {
939 DCHECK(gfx::ToEnclosingRect(accumulated_clip) == 1032 DCHECK(gfx::ToEnclosingRect(accumulated_clip) ==
940 render_surface->clip_rect()) 1033 render_surface->clip_rect())
941 << " render surface's clip rect: " 1034 << " render surface's clip rect: "
942 << render_surface->clip_rect().ToString() 1035 << render_surface->clip_rect().ToString()
943 << " v.s. accumulated clip: " 1036 << " v.s. accumulated clip: "
944 << gfx::ToEnclosingRect(accumulated_clip).ToString(); 1037 << gfx::ToEnclosingRect(accumulated_clip).ToString();
945 } 1038 }
(...skipping 10 matching lines...) Expand all
956 effect_node->has_render_surface 1049 effect_node->has_render_surface
957 ? effect_node 1050 ? effect_node
958 : effect_tree->Node(effect_node->target_id); 1051 : effect_tree->Node(effect_node->target_id);
959 // TODO(weiliangc): When effect node has up to date render surface info on 1052 // TODO(weiliangc): When effect node has up to date render surface info on
960 // compositor thread, no need to check for resourceless draw mode 1053 // compositor thread, no need to check for resourceless draw mode
961 if (!property_trees->non_root_surfaces_enabled) { 1054 if (!property_trees->non_root_surfaces_enabled) {
962 target_node = effect_tree->Node(1); 1055 target_node = effect_tree->Node(1);
963 } 1056 }
964 1057
965 bool include_viewport_clip = false; 1058 bool include_viewport_clip = false;
966 ConditionalClip accumulated_clip_rect = 1059 bool include_expanding_clips = false;
967 ComputeAccumulatedClip(property_trees, include_viewport_clip, 1060 ConditionalClip accumulated_clip_rect = ComputeAccumulatedClip(
968 layer->clip_tree_index(), target_node->id); 1061 property_trees, include_viewport_clip, include_expanding_clips,
1062 layer->clip_tree_index(), target_node->id);
969 1063
970 bool is_clipped_from_clip_tree = 1064 bool is_clipped_from_clip_tree =
971 property_trees->non_root_surfaces_enabled 1065 property_trees->non_root_surfaces_enabled
972 ? clip_node->layers_are_clipped 1066 ? clip_node->layers_are_clipped
973 : clip_node->layers_are_clipped_when_surfaces_disabled; 1067 : clip_node->layers_are_clipped_when_surfaces_disabled;
974 DCHECK_EQ(is_clipped_from_clip_tree, accumulated_clip_rect.is_clipped); 1068 DCHECK_EQ(is_clipped_from_clip_tree, accumulated_clip_rect.is_clipped);
975 1069
976 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect; 1070 gfx::RectF accumulated_clip = accumulated_clip_rect.clip_rect;
977 1071
978 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip)) 1072 DCHECK(layer->clip_rect() == gfx::ToEnclosingRect(accumulated_clip))
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 const LayerImpl* layer) { 1185 const LayerImpl* layer) {
1092 int effect_ancestor_with_copy_request = 1186 int effect_ancestor_with_copy_request =
1093 property_trees->effect_tree.ClosestAncestorWithCopyRequest( 1187 property_trees->effect_tree.ClosestAncestorWithCopyRequest(
1094 layer->effect_tree_index()); 1188 layer->effect_tree_index());
1095 bool non_root_copy_request = 1189 bool non_root_copy_request =
1096 effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId; 1190 effect_ancestor_with_copy_request > EffectTree::kContentsRootNodeId;
1097 gfx::Rect layer_content_rect = gfx::Rect(layer->bounds()); 1191 gfx::Rect layer_content_rect = gfx::Rect(layer->bounds());
1098 gfx::RectF accumulated_clip_in_root_space; 1192 gfx::RectF accumulated_clip_in_root_space;
1099 if (non_root_copy_request) { 1193 if (non_root_copy_request) {
1100 bool include_viewport_clip = false; 1194 bool include_viewport_clip = false;
1195 bool include_expanding_clips = true;
1101 ConditionalClip accumulated_clip = ComputeAccumulatedClip( 1196 ConditionalClip accumulated_clip = ComputeAccumulatedClip(
1102 property_trees, include_viewport_clip, layer->clip_tree_index(), 1197 property_trees, include_viewport_clip, include_expanding_clips,
1103 effect_ancestor_with_copy_request); 1198 layer->clip_tree_index(), effect_ancestor_with_copy_request);
1104 if (!accumulated_clip.is_clipped) 1199 if (!accumulated_clip.is_clipped)
1105 return layer_content_rect; 1200 return layer_content_rect;
1106 accumulated_clip_in_root_space = accumulated_clip.clip_rect; 1201 accumulated_clip_in_root_space = accumulated_clip.clip_rect;
1107 } else { 1202 } else {
1108 accumulated_clip_in_root_space = 1203 accumulated_clip_in_root_space =
1109 ComputeAccumulatedClipInRootSpaceForVisibleRect( 1204 ComputeAccumulatedClipInRootSpaceForVisibleRect(
1110 property_trees, layer->clip_tree_index()); 1205 property_trees, layer->clip_tree_index());
1111 } 1206 }
1112 1207
1113 const EffectNode* root_effect_node = 1208 const EffectNode* root_effect_node =
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 void UpdateElasticOverscroll(PropertyTrees* property_trees, 1557 void UpdateElasticOverscroll(PropertyTrees* property_trees,
1463 const Layer* overscroll_elasticity_layer, 1558 const Layer* overscroll_elasticity_layer,
1464 const gfx::Vector2dF& elastic_overscroll) { 1559 const gfx::Vector2dF& elastic_overscroll) {
1465 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer, 1560 UpdateElasticOverscrollInternal(property_trees, overscroll_elasticity_layer,
1466 elastic_overscroll); 1561 elastic_overscroll);
1467 } 1562 }
1468 1563
1469 } // namespace draw_property_utils 1564 } // namespace draw_property_utils
1470 1565
1471 } // namespace cc 1566 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/clip_node.cc ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698