| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/occlusion_tracker.h" | 5 #include "cc/trees/occlusion_tracker.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "cc/base/math_util.h" | 11 #include "cc/base/math_util.h" |
| 12 #include "cc/base/region.h" | 12 #include "cc/base/region.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/layers/render_surface_impl.h" | 15 #include "cc/layers/render_surface_impl.h" |
| 16 #include "cc/trees/layer_tree_impl.h" |
| 16 #include "ui/gfx/geometry/quad_f.h" | 17 #include "ui/gfx/geometry/quad_f.h" |
| 17 #include "ui/gfx/geometry/rect_conversions.h" | 18 #include "ui/gfx/geometry/rect_conversions.h" |
| 18 | 19 |
| 19 namespace cc { | 20 namespace cc { |
| 20 | 21 |
| 21 OcclusionTracker::OcclusionTracker(const gfx::Rect& screen_space_clip_rect) | 22 OcclusionTracker::OcclusionTracker(const gfx::Rect& screen_space_clip_rect) |
| 22 : screen_space_clip_rect_(screen_space_clip_rect) { | 23 : screen_space_clip_rect_(screen_space_clip_rect) { |
| 23 } | 24 } |
| 24 | 25 |
| 25 OcclusionTracker::~OcclusionTracker() { | 26 OcclusionTracker::~OcclusionTracker() { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 new_occlusion_immune_ancestor && | 135 new_occlusion_immune_ancestor && |
| 135 new_occlusion_immune_ancestor != old_occlusion_immune_ancestor; | 136 new_occlusion_immune_ancestor != old_occlusion_immune_ancestor; |
| 136 | 137 |
| 137 gfx::Transform inverse_new_target_screen_space_transform( | 138 gfx::Transform inverse_new_target_screen_space_transform( |
| 138 // Note carefully, not used if screen space transform is uninvertible. | 139 // Note carefully, not used if screen space transform is uninvertible. |
| 139 gfx::Transform::kSkipInitialization); | 140 gfx::Transform::kSkipInitialization); |
| 140 bool have_transform_from_screen_to_new_target = | 141 bool have_transform_from_screen_to_new_target = |
| 141 new_target->render_surface()->screen_space_transform().GetInverse( | 142 new_target->render_surface()->screen_space_transform().GetInverse( |
| 142 &inverse_new_target_screen_space_transform); | 143 &inverse_new_target_screen_space_transform); |
| 143 | 144 |
| 144 bool entering_root_target = new_target->parent() == NULL; | 145 bool entering_root_target = |
| 146 new_target->layer_tree_impl()->IsRootLayer(new_target); |
| 145 | 147 |
| 146 bool copy_outside_occlusion_forward = | 148 bool copy_outside_occlusion_forward = |
| 147 stack_.size() > 1 && | 149 stack_.size() > 1 && |
| 148 !entering_unoccluded_subtree && | 150 !entering_unoccluded_subtree && |
| 149 have_transform_from_screen_to_new_target && | 151 have_transform_from_screen_to_new_target && |
| 150 !entering_root_target; | 152 !entering_root_target; |
| 151 if (!copy_outside_occlusion_forward) | 153 if (!copy_outside_occlusion_forward) |
| 152 return; | 154 return; |
| 153 | 155 |
| 154 size_t last_index = stack_.size() - 1; | 156 size_t last_index = stack_.size() - 1; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 old_surface->content_rect()); | 288 old_surface->content_rect()); |
| 287 } | 289 } |
| 288 } | 290 } |
| 289 | 291 |
| 290 if (surface_will_be_at_top_after_pop) { | 292 if (surface_will_be_at_top_after_pop) { |
| 291 // Merge the top of the stack down. | 293 // Merge the top of the stack down. |
| 292 stack_[last_index - 1].occlusion_from_inside_target.Union( | 294 stack_[last_index - 1].occlusion_from_inside_target.Union( |
| 293 old_occlusion_from_inside_target_in_new_target); | 295 old_occlusion_from_inside_target_in_new_target); |
| 294 // TODO(danakj): Strictly this should subtract the inside target occlusion | 296 // TODO(danakj): Strictly this should subtract the inside target occlusion |
| 295 // before union. | 297 // before union. |
| 296 if (new_target->parent()) { | 298 if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) { |
| 297 stack_[last_index - 1].occlusion_from_outside_target.Union( | 299 stack_[last_index - 1].occlusion_from_outside_target.Union( |
| 298 old_occlusion_from_outside_target_in_new_target); | 300 old_occlusion_from_outside_target_in_new_target); |
| 299 } | 301 } |
| 300 stack_.pop_back(); | 302 stack_.pop_back(); |
| 301 } else { | 303 } else { |
| 302 // Replace the top of the stack with the new pushed surface. | 304 // Replace the top of the stack with the new pushed surface. |
| 303 stack_.back().target = new_target; | 305 stack_.back().target = new_target; |
| 304 stack_.back().occlusion_from_inside_target = | 306 stack_.back().occlusion_from_inside_target = |
| 305 old_occlusion_from_inside_target_in_new_target; | 307 old_occlusion_from_inside_target_in_new_target; |
| 306 if (new_target->parent()) { | 308 if (!new_target->layer_tree_impl()->IsRootLayer(new_target)) { |
| 307 stack_.back().occlusion_from_outside_target = | 309 stack_.back().occlusion_from_outside_target = |
| 308 old_occlusion_from_outside_target_in_new_target; | 310 old_occlusion_from_outside_target_in_new_target; |
| 309 } else { | 311 } else { |
| 310 stack_.back().occlusion_from_outside_target.Clear(); | 312 stack_.back().occlusion_from_outside_target.Clear(); |
| 311 } | 313 } |
| 312 } | 314 } |
| 313 | 315 |
| 314 if (!old_target->background_filters().HasFilterThatMovesPixels()) | 316 if (!old_target->background_filters().HasFilterThatMovesPixels()) |
| 315 return; | 317 return; |
| 316 | 318 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 draw_transform, opaque_layer_region.GetRect(i)); | 380 draw_transform, opaque_layer_region.GetRect(i)); |
| 379 transformed_rect.Intersect(clip_rect_in_target); | 381 transformed_rect.Intersect(clip_rect_in_target); |
| 380 if (transformed_rect.width() < minimum_tracking_size_.width() && | 382 if (transformed_rect.width() < minimum_tracking_size_.width() && |
| 381 transformed_rect.height() < minimum_tracking_size_.height()) | 383 transformed_rect.height() < minimum_tracking_size_.height()) |
| 382 continue; | 384 continue; |
| 383 stack_.back().occlusion_from_inside_target.Union(transformed_rect); | 385 stack_.back().occlusion_from_inside_target.Union(transformed_rect); |
| 384 } | 386 } |
| 385 } | 387 } |
| 386 | 388 |
| 387 Region OcclusionTracker::ComputeVisibleRegionInScreen() const { | 389 Region OcclusionTracker::ComputeVisibleRegionInScreen() const { |
| 388 DCHECK(!stack_.back().target->parent()); | 390 DCHECK(stack_.back().target->layer_tree_impl()->IsRootLayer( |
| 391 stack_.back().target)); |
| 389 const SimpleEnclosedRegion& occluded = | 392 const SimpleEnclosedRegion& occluded = |
| 390 stack_.back().occlusion_from_inside_target; | 393 stack_.back().occlusion_from_inside_target; |
| 391 Region visible_region(screen_space_clip_rect_); | 394 Region visible_region(screen_space_clip_rect_); |
| 392 for (size_t i = 0; i < occluded.GetRegionComplexity(); ++i) | 395 for (size_t i = 0; i < occluded.GetRegionComplexity(); ++i) |
| 393 visible_region.Subtract(occluded.GetRect(i)); | 396 visible_region.Subtract(occluded.GetRect(i)); |
| 394 return visible_region; | 397 return visible_region; |
| 395 } | 398 } |
| 396 | 399 |
| 397 } // namespace cc | 400 } // namespace cc |
| OLD | NEW |