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

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

Issue 202523002: cc: Replace Region with SimpleEnclosedRegion for occlusion tracking (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: simpleregion: . Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « cc/trees/occlusion_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "cc/animation/layer_animation_controller.h" 7 #include "cc/animation/layer_animation_controller.h"
8 #include "cc/base/math_util.h" 8 #include "cc/base/math_util.h"
9 #include "cc/layers/layer.h" 9 #include "cc/layers/layer.h"
10 #include "cc/layers/layer_impl.h" 10 #include "cc/layers/layer_impl.h"
(...skipping 15 matching lines...) Expand all
26 26
27 namespace cc { 27 namespace cc {
28 namespace { 28 namespace {
29 29
30 class TestContentLayer : public Layer { 30 class TestContentLayer : public Layer {
31 public: 31 public:
32 TestContentLayer() : Layer(), override_opaque_contents_rect_(false) { 32 TestContentLayer() : Layer(), override_opaque_contents_rect_(false) {
33 SetIsDrawable(true); 33 SetIsDrawable(true);
34 } 34 }
35 35
36 virtual Region VisibleContentOpaqueRegion() const OVERRIDE { 36 virtual SimpleEnclosedRegion VisibleContentOpaqueRegion() const OVERRIDE {
37 if (override_opaque_contents_rect_) 37 if (override_opaque_contents_rect_) {
38 return gfx::IntersectRects(opaque_contents_rect_, visible_content_rect()); 38 return SimpleEnclosedRegion(
39 gfx::IntersectRects(opaque_contents_rect_, visible_content_rect()));
40 }
39 return Layer::VisibleContentOpaqueRegion(); 41 return Layer::VisibleContentOpaqueRegion();
40 } 42 }
41 void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) { 43 void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) {
42 override_opaque_contents_rect_ = true; 44 override_opaque_contents_rect_ = true;
43 opaque_contents_rect_ = opaque_contents_rect; 45 opaque_contents_rect_ = opaque_contents_rect;
44 } 46 }
45 47
46 private: 48 private:
47 virtual ~TestContentLayer() {} 49 virtual ~TestContentLayer() {}
48 50
49 bool override_opaque_contents_rect_; 51 bool override_opaque_contents_rect_;
50 gfx::Rect opaque_contents_rect_; 52 gfx::Rect opaque_contents_rect_;
51 }; 53 };
52 54
53 class TestContentLayerImpl : public LayerImpl { 55 class TestContentLayerImpl : public LayerImpl {
54 public: 56 public:
55 TestContentLayerImpl(LayerTreeImpl* tree_impl, int id) 57 TestContentLayerImpl(LayerTreeImpl* tree_impl, int id)
56 : LayerImpl(tree_impl, id), override_opaque_contents_rect_(false) { 58 : LayerImpl(tree_impl, id), override_opaque_contents_rect_(false) {
57 SetDrawsContent(true); 59 SetDrawsContent(true);
58 } 60 }
59 61
60 virtual Region VisibleContentOpaqueRegion() const OVERRIDE { 62 virtual SimpleEnclosedRegion VisibleContentOpaqueRegion() const OVERRIDE {
61 if (override_opaque_contents_rect_) 63 if (override_opaque_contents_rect_) {
62 return gfx::IntersectRects(opaque_contents_rect_, visible_content_rect()); 64 return SimpleEnclosedRegion(
65 gfx::IntersectRects(opaque_contents_rect_, visible_content_rect()));
66 }
63 return LayerImpl::VisibleContentOpaqueRegion(); 67 return LayerImpl::VisibleContentOpaqueRegion();
64 } 68 }
65 void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) { 69 void SetOpaqueContentsRect(const gfx::Rect& opaque_contents_rect) {
66 override_opaque_contents_rect_ = true; 70 override_opaque_contents_rect_ = true;
67 opaque_contents_rect_ = opaque_contents_rect; 71 opaque_contents_rect_ = opaque_contents_rect;
68 } 72 }
69 73
70 private: 74 private:
71 bool override_opaque_contents_rect_; 75 bool override_opaque_contents_rect_;
72 gfx::Rect opaque_contents_rect_; 76 gfx::Rect opaque_contents_rect_;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 176
173 int OcclusionTrackerTestImplThreadTypes::next_layer_impl_id = 1; 177 int OcclusionTrackerTestImplThreadTypes::next_layer_impl_id = 1;
174 178
175 template <typename Types> class OcclusionTrackerTest : public testing::Test { 179 template <typename Types> class OcclusionTrackerTest : public testing::Test {
176 protected: 180 protected:
177 explicit OcclusionTrackerTest(bool opaque_layers) 181 explicit OcclusionTrackerTest(bool opaque_layers)
178 : opaque_layers_(opaque_layers), host_(FakeLayerTreeHost::Create()) {} 182 : opaque_layers_(opaque_layers), host_(FakeLayerTreeHost::Create()) {}
179 183
180 virtual void RunMyTest() = 0; 184 virtual void RunMyTest() = 0;
181 185
182 virtual void TearDown() { 186 virtual void TearDown() { DestroyLayers(); }
183 Types::DestroyLayer(&root_);
184 render_surface_layer_list_.reset();
185 render_surface_layer_list_impl_.clear();
186 replica_layers_.clear();
187 mask_layers_.clear();
188 }
189 187
190 typename Types::HostType* GetHost(); 188 typename Types::HostType* GetHost();
191 189
192 typename Types::ContentLayerType* CreateRoot(const gfx::Transform& transform, 190 typename Types::ContentLayerType* CreateRoot(const gfx::Transform& transform,
193 const gfx::PointF& position, 191 const gfx::PointF& position,
194 const gfx::Size& bounds) { 192 const gfx::Size& bounds) {
195 typename Types::ContentLayerPtrType layer( 193 typename Types::ContentLayerPtrType layer(
196 Types::CreateContentLayer(GetHost())); 194 Types::CreateContentLayer(GetHost()));
197 typename Types::ContentLayerType* layer_ptr = layer.get(); 195 typename Types::ContentLayerType* layer_ptr = layer.get();
198 SetProperties(layer_ptr, transform, position, bounds); 196 SetProperties(layer_ptr, transform, position, bounds);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 const gfx::Transform& transform, 278 const gfx::Transform& transform,
281 const gfx::PointF& position, 279 const gfx::PointF& position,
282 const gfx::Size& bounds, 280 const gfx::Size& bounds,
283 bool opaque) { 281 bool opaque) {
284 typename Types::ContentLayerType* layer = 282 typename Types::ContentLayerType* layer =
285 CreateDrawingLayer(parent, transform, position, bounds, opaque); 283 CreateDrawingLayer(parent, transform, position, bounds, opaque);
286 layer->SetForceRenderSurface(true); 284 layer->SetForceRenderSurface(true);
287 return layer; 285 return layer;
288 } 286 }
289 287
288 void DestroyLayers() {
289 Types::DestroyLayer(&root_);
290 render_surface_layer_list_.reset();
291 render_surface_layer_list_impl_.clear();
292 replica_layers_.clear();
293 mask_layers_.clear();
294 ResetLayerIterator();
295 }
290 296
291 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {} 297 void CopyOutputCallback(scoped_ptr<CopyOutputResult> result) {}
292 298
293 void AddCopyRequest(Layer* layer) { 299 void AddCopyRequest(Layer* layer) {
294 layer->RequestCopyOfOutput( 300 layer->RequestCopyOfOutput(
295 CopyOutputRequest::CreateBitmapRequest(base::Bind( 301 CopyOutputRequest::CreateBitmapRequest(base::Bind(
296 &OcclusionTrackerTest<Types>::CopyOutputCallback, 302 &OcclusionTrackerTest<Types>::CopyOutputCallback,
297 base::Unretained(this)))); 303 base::Unretained(this))));
298 } 304 }
299 305
(...skipping 29 matching lines...) Expand all
329 root, root->bounds(), render_surface_layer_list_.get()); 335 root, root->bounds(), render_surface_layer_list_.get());
330 inputs.can_adjust_raster_scales = true; 336 inputs.can_adjust_raster_scales = true;
331 LayerTreeHostCommon::CalculateDrawProperties(&inputs); 337 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
332 338
333 layer_iterator_ = layer_iterator_begin_ = 339 layer_iterator_ = layer_iterator_begin_ =
334 Types::TestLayerIterator::Begin(render_surface_layer_list_.get()); 340 Types::TestLayerIterator::Begin(render_surface_layer_list_.get());
335 } 341 }
336 342
337 void EnterLayer(typename Types::LayerType* layer, 343 void EnterLayer(typename Types::LayerType* layer,
338 typename Types::OcclusionTrackerType* occlusion) { 344 typename Types::OcclusionTrackerType* occlusion) {
339 ASSERT_EQ(layer, *layer_iterator_); 345 ASSERT_EQ(*layer_iterator_, layer);
340 ASSERT_TRUE(layer_iterator_.represents_itself()); 346 ASSERT_TRUE(layer_iterator_.represents_itself());
341 occlusion->EnterLayer(layer_iterator_); 347 occlusion->EnterLayer(layer_iterator_);
342 } 348 }
343 349
344 void LeaveLayer(typename Types::LayerType* layer, 350 void LeaveLayer(typename Types::LayerType* layer,
345 typename Types::OcclusionTrackerType* occlusion) { 351 typename Types::OcclusionTrackerType* occlusion) {
346 ASSERT_EQ(layer, *layer_iterator_); 352 ASSERT_EQ(*layer_iterator_, layer);
347 ASSERT_TRUE(layer_iterator_.represents_itself()); 353 ASSERT_TRUE(layer_iterator_.represents_itself());
348 occlusion->LeaveLayer(layer_iterator_); 354 occlusion->LeaveLayer(layer_iterator_);
349 ++layer_iterator_; 355 ++layer_iterator_;
350 } 356 }
351 357
352 void VisitLayer(typename Types::LayerType* layer, 358 void VisitLayer(typename Types::LayerType* layer,
353 typename Types::OcclusionTrackerType* occlusion) { 359 typename Types::OcclusionTrackerType* occlusion) {
354 EnterLayer(layer, occlusion); 360 EnterLayer(layer, occlusion);
355 LeaveLayer(layer, occlusion); 361 LeaveLayer(layer, occlusion);
356 } 362 }
357 363
358 void EnterContributingSurface( 364 void EnterContributingSurface(
359 typename Types::LayerType* layer, 365 typename Types::LayerType* layer,
360 typename Types::OcclusionTrackerType* occlusion) { 366 typename Types::OcclusionTrackerType* occlusion) {
361 ASSERT_EQ(layer, *layer_iterator_); 367 ASSERT_EQ(*layer_iterator_, layer);
362 ASSERT_TRUE(layer_iterator_.represents_target_render_surface()); 368 ASSERT_TRUE(layer_iterator_.represents_target_render_surface());
363 occlusion->EnterLayer(layer_iterator_); 369 occlusion->EnterLayer(layer_iterator_);
364 occlusion->LeaveLayer(layer_iterator_); 370 occlusion->LeaveLayer(layer_iterator_);
365 ++layer_iterator_; 371 ++layer_iterator_;
366 ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface()); 372 ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface());
367 occlusion->EnterLayer(layer_iterator_); 373 occlusion->EnterLayer(layer_iterator_);
368 } 374 }
369 375
370 void LeaveContributingSurface( 376 void LeaveContributingSurface(
371 typename Types::LayerType* layer, 377 typename Types::LayerType* layer,
372 typename Types::OcclusionTrackerType* occlusion) { 378 typename Types::OcclusionTrackerType* occlusion) {
373 ASSERT_EQ(layer, *layer_iterator_); 379 ASSERT_EQ(*layer_iterator_, layer);
374 ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface()); 380 ASSERT_TRUE(layer_iterator_.represents_contributing_render_surface());
375 occlusion->LeaveLayer(layer_iterator_); 381 occlusion->LeaveLayer(layer_iterator_);
376 ++layer_iterator_; 382 ++layer_iterator_;
377 } 383 }
378 384
379 void VisitContributingSurface( 385 void VisitContributingSurface(
380 typename Types::LayerType* layer, 386 typename Types::LayerType* layer,
381 typename Types::OcclusionTrackerType* occlusion) { 387 typename Types::OcclusionTrackerType* occlusion) {
382 EnterContributingSurface(layer, occlusion); 388 EnterContributingSurface(layer, occlusion);
383 LeaveContributingSurface(layer, occlusion); 389 LeaveContributingSurface(layer, occlusion);
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 gfx::Rect(0, 0, 1000, 1000)); 543 gfx::Rect(0, 0, 1000, 1000));
538 544
539 this->VisitLayer(layer, &occlusion); 545 this->VisitLayer(layer, &occlusion);
540 this->EnterLayer(parent, &occlusion); 546 this->EnterLayer(parent, &occlusion);
541 547
542 EXPECT_EQ(gfx::Rect().ToString(), 548 EXPECT_EQ(gfx::Rect().ToString(),
543 occlusion.occlusion_from_outside_target().ToString()); 549 occlusion.occlusion_from_outside_target().ToString());
544 EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), 550 EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(),
545 occlusion.occlusion_from_inside_target().ToString()); 551 occlusion.occlusion_from_inside_target().ToString());
546 552
547 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 30, 70, 70)));
548 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 30, 70, 70)));
549 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 29, 70, 70)));
550 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(31, 30, 69, 70)));
551 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 31, 70, 69)));
552
553 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 553 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
554 parent, gfx::Rect(30, 30, 70, 70)).IsEmpty()); 554 parent, gfx::Rect(30, 30, 70, 70)).IsEmpty());
555 EXPECT_RECT_EQ(gfx::Rect(29, 30, 1, 70), 555 EXPECT_EQ(gfx::Rect(29, 30, 1, 70),
556 occlusion.UnoccludedLayerContentRect( 556 occlusion.UnoccludedLayerContentRect(parent,
557 parent, gfx::Rect(29, 30, 70, 70))); 557 gfx::Rect(29, 30, 70, 70)));
558 EXPECT_RECT_EQ(gfx::Rect(29, 29, 70, 70), 558 EXPECT_EQ(gfx::Rect(29, 29, 70, 70),
559 occlusion.UnoccludedLayerContentRect( 559 occlusion.UnoccludedLayerContentRect(parent,
560 parent, gfx::Rect(29, 29, 70, 70))); 560 gfx::Rect(29, 29, 70, 70)));
561 EXPECT_RECT_EQ(gfx::Rect(30, 29, 70, 1), 561 EXPECT_EQ(gfx::Rect(30, 29, 70, 1),
562 occlusion.UnoccludedLayerContentRect( 562 occlusion.UnoccludedLayerContentRect(parent,
563 parent, gfx::Rect(30, 29, 70, 70))); 563 gfx::Rect(30, 29, 70, 70)));
564 EXPECT_RECT_EQ(gfx::Rect(31, 29, 69, 1), 564 EXPECT_EQ(gfx::Rect(31, 29, 69, 1),
565 occlusion.UnoccludedLayerContentRect( 565 occlusion.UnoccludedLayerContentRect(parent,
566 parent, gfx::Rect(31, 29, 69, 70))); 566 gfx::Rect(31, 29, 69, 70)));
567 EXPECT_RECT_EQ(gfx::Rect(), 567 EXPECT_EQ(gfx::Rect(),
568 occlusion.UnoccludedLayerContentRect( 568 occlusion.UnoccludedLayerContentRect(parent,
569 parent, gfx::Rect(31, 30, 69, 70))); 569 gfx::Rect(31, 30, 69, 70)));
570 EXPECT_RECT_EQ(gfx::Rect(), 570 EXPECT_EQ(gfx::Rect(),
571 occlusion.UnoccludedLayerContentRect( 571 occlusion.UnoccludedLayerContentRect(parent,
572 parent, gfx::Rect(31, 31, 69, 69))); 572 gfx::Rect(31, 31, 69, 69)));
573 EXPECT_RECT_EQ(gfx::Rect(), 573 EXPECT_EQ(gfx::Rect(),
574 occlusion.UnoccludedLayerContentRect( 574 occlusion.UnoccludedLayerContentRect(parent,
575 parent, gfx::Rect(30, 31, 70, 69))); 575 gfx::Rect(30, 31, 70, 69)));
576 EXPECT_RECT_EQ(gfx::Rect(29, 31, 1, 69), 576 EXPECT_EQ(gfx::Rect(29, 31, 1, 69),
577 occlusion.UnoccludedLayerContentRect( 577 occlusion.UnoccludedLayerContentRect(parent,
578 parent, gfx::Rect(29, 31, 70, 69))); 578 gfx::Rect(29, 31, 70, 69)));
579 } 579 }
580 }; 580 };
581 581
582 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestIdentityTransforms); 582 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestIdentityTransforms);
583 583
584 template <class Types> 584 template <class Types>
585 class OcclusionTrackerTestQuadsMismatchLayer 585 class OcclusionTrackerTestQuadsMismatchLayer
586 : public OcclusionTrackerTest<Types> { 586 : public OcclusionTrackerTest<Types> {
587 protected: 587 protected:
588 explicit OcclusionTrackerTestQuadsMismatchLayer(bool opaque_layers) 588 explicit OcclusionTrackerTestQuadsMismatchLayer(bool opaque_layers)
(...skipping 23 matching lines...) Expand all
612 612
613 // This checks cases where the quads don't match their "containing" 613 // This checks cases where the quads don't match their "containing"
614 // layers, e.g. in terms of transforms or clip rect. This is typical for 614 // layers, e.g. in terms of transforms or clip rect. This is typical for
615 // DelegatedRendererLayer. 615 // DelegatedRendererLayer.
616 616
617 gfx::Transform quad_transform; 617 gfx::Transform quad_transform;
618 quad_transform.Translate(30.0, 30.0); 618 quad_transform.Translate(30.0, 30.0);
619 619
620 EXPECT_TRUE(occlusion.UnoccludedContentRect(gfx::Rect(0, 0, 10, 10), 620 EXPECT_TRUE(occlusion.UnoccludedContentRect(gfx::Rect(0, 0, 10, 10),
621 quad_transform).IsEmpty()); 621 quad_transform).IsEmpty());
622 EXPECT_RECT_EQ(gfx::Rect(40, 40, 10, 10), 622 EXPECT_EQ(gfx::Rect(40, 40, 10, 10),
623 occlusion.UnoccludedContentRect(gfx::Rect(40, 40, 10, 10), 623 occlusion.UnoccludedContentRect(gfx::Rect(40, 40, 10, 10),
624 quad_transform)); 624 quad_transform));
625 EXPECT_RECT_EQ(gfx::Rect(40, 30, 5, 10), 625 EXPECT_EQ(gfx::Rect(40, 30, 5, 10),
626 occlusion.UnoccludedContentRect(gfx::Rect(35, 30, 10, 10), 626 occlusion.UnoccludedContentRect(gfx::Rect(35, 30, 10, 10),
627 quad_transform)); 627 quad_transform));
628 } 628 }
629 }; 629 };
630 630
631 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestQuadsMismatchLayer); 631 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestQuadsMismatchLayer);
632 632
633 template <class Types> 633 template <class Types>
634 class OcclusionTrackerTestRotatedChild : public OcclusionTrackerTest<Types> { 634 class OcclusionTrackerTestRotatedChild : public OcclusionTrackerTest<Types> {
635 protected: 635 protected:
636 explicit OcclusionTrackerTestRotatedChild(bool opaque_layers) 636 explicit OcclusionTrackerTestRotatedChild(bool opaque_layers)
637 : OcclusionTrackerTest<Types>(opaque_layers) {} 637 : OcclusionTrackerTest<Types>(opaque_layers) {}
(...skipping 20 matching lines...) Expand all
658 gfx::Rect(0, 0, 1000, 1000)); 658 gfx::Rect(0, 0, 1000, 1000));
659 659
660 this->VisitLayer(layer, &occlusion); 660 this->VisitLayer(layer, &occlusion);
661 this->EnterLayer(parent, &occlusion); 661 this->EnterLayer(parent, &occlusion);
662 662
663 EXPECT_EQ(gfx::Rect().ToString(), 663 EXPECT_EQ(gfx::Rect().ToString(),
664 occlusion.occlusion_from_outside_target().ToString()); 664 occlusion.occlusion_from_outside_target().ToString());
665 EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(), 665 EXPECT_EQ(gfx::Rect(30, 30, 70, 70).ToString(),
666 occlusion.occlusion_from_inside_target().ToString()); 666 occlusion.occlusion_from_inside_target().ToString());
667 667
668 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 30, 70, 70)));
669 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 30, 70, 70)));
670 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 29, 70, 70)));
671 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(31, 30, 69, 70)));
672 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 31, 70, 69)));
673
674 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 668 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
675 parent, gfx::Rect(30, 30, 70, 70)).IsEmpty()); 669 parent, gfx::Rect(30, 30, 70, 70)).IsEmpty());
676 EXPECT_RECT_EQ(gfx::Rect(29, 30, 1, 70), 670 EXPECT_EQ(gfx::Rect(29, 30, 1, 70),
677 occlusion.UnoccludedLayerContentRect( 671 occlusion.UnoccludedLayerContentRect(parent,
678 parent, gfx::Rect(29, 30, 69, 70))); 672 gfx::Rect(29, 30, 69, 70)));
679 EXPECT_RECT_EQ(gfx::Rect(29, 29, 70, 70), 673 EXPECT_EQ(gfx::Rect(29, 29, 70, 70),
680 occlusion.UnoccludedLayerContentRect( 674 occlusion.UnoccludedLayerContentRect(parent,
681 parent, gfx::Rect(29, 29, 70, 70))); 675 gfx::Rect(29, 29, 70, 70)));
682 EXPECT_RECT_EQ(gfx::Rect(30, 29, 70, 1), 676 EXPECT_EQ(gfx::Rect(30, 29, 70, 1),
683 occlusion.UnoccludedLayerContentRect( 677 occlusion.UnoccludedLayerContentRect(parent,
684 parent, gfx::Rect(30, 29, 70, 70))); 678 gfx::Rect(30, 29, 70, 70)));
685 EXPECT_RECT_EQ(gfx::Rect(31, 29, 69, 1), 679 EXPECT_EQ(gfx::Rect(31, 29, 69, 1),
686 occlusion.UnoccludedLayerContentRect( 680 occlusion.UnoccludedLayerContentRect(parent,
687 parent, gfx::Rect(31, 29, 69, 70))); 681 gfx::Rect(31, 29, 69, 70)));
688 EXPECT_RECT_EQ(gfx::Rect(), 682 EXPECT_EQ(gfx::Rect(),
689 occlusion.UnoccludedLayerContentRect( 683 occlusion.UnoccludedLayerContentRect(parent,
690 parent, gfx::Rect(31, 30, 69, 70))); 684 gfx::Rect(31, 30, 69, 70)));
691 EXPECT_RECT_EQ(gfx::Rect(), 685 EXPECT_EQ(gfx::Rect(),
692 occlusion.UnoccludedLayerContentRect( 686 occlusion.UnoccludedLayerContentRect(parent,
693 parent, gfx::Rect(31, 31, 69, 69))); 687 gfx::Rect(31, 31, 69, 69)));
694 EXPECT_RECT_EQ(gfx::Rect(), 688 EXPECT_EQ(gfx::Rect(),
695 occlusion.UnoccludedLayerContentRect( 689 occlusion.UnoccludedLayerContentRect(parent,
696 parent, gfx::Rect(30, 31, 70, 69))); 690 gfx::Rect(30, 31, 70, 69)));
697 EXPECT_RECT_EQ(gfx::Rect(29, 31, 1, 69), 691 EXPECT_EQ(gfx::Rect(29, 31, 1, 69),
698 occlusion.UnoccludedLayerContentRect( 692 occlusion.UnoccludedLayerContentRect(parent,
699 parent, gfx::Rect(29, 31, 70, 69))); 693 gfx::Rect(29, 31, 70, 69)));
700 } 694 }
701 }; 695 };
702 696
703 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestRotatedChild); 697 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestRotatedChild);
704 698
705 template <class Types> 699 template <class Types>
706 class OcclusionTrackerTestTranslatedChild : public OcclusionTrackerTest<Types> { 700 class OcclusionTrackerTestTranslatedChild : public OcclusionTrackerTest<Types> {
707 protected: 701 protected:
708 explicit OcclusionTrackerTestTranslatedChild(bool opaque_layers) 702 explicit OcclusionTrackerTestTranslatedChild(bool opaque_layers)
709 : OcclusionTrackerTest<Types>(opaque_layers) {} 703 : OcclusionTrackerTest<Types>(opaque_layers) {}
(...skipping 18 matching lines...) Expand all
728 gfx::Rect(0, 0, 1000, 1000)); 722 gfx::Rect(0, 0, 1000, 1000));
729 723
730 this->VisitLayer(layer, &occlusion); 724 this->VisitLayer(layer, &occlusion);
731 this->EnterLayer(parent, &occlusion); 725 this->EnterLayer(parent, &occlusion);
732 726
733 EXPECT_EQ(gfx::Rect().ToString(), 727 EXPECT_EQ(gfx::Rect().ToString(),
734 occlusion.occlusion_from_outside_target().ToString()); 728 occlusion.occlusion_from_outside_target().ToString());
735 EXPECT_EQ(gfx::Rect(50, 50, 50, 50).ToString(), 729 EXPECT_EQ(gfx::Rect(50, 50, 50, 50).ToString(),
736 occlusion.occlusion_from_inside_target().ToString()); 730 occlusion.occlusion_from_inside_target().ToString());
737 731
738 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(50, 50, 50, 50)));
739 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(49, 50, 50, 50)));
740 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(50, 49, 50, 50)));
741 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(51, 50, 49, 50)));
742 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(50, 51, 50, 49)));
743
744 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 732 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
745 parent, gfx::Rect(50, 50, 50, 50)).IsEmpty()); 733 parent, gfx::Rect(50, 50, 50, 50)).IsEmpty());
746 EXPECT_RECT_EQ(gfx::Rect(49, 50, 1, 50), 734 EXPECT_EQ(gfx::Rect(49, 50, 1, 50),
747 occlusion.UnoccludedLayerContentRect( 735 occlusion.UnoccludedLayerContentRect(parent,
748 parent, gfx::Rect(49, 50, 50, 50))); 736 gfx::Rect(49, 50, 50, 50)));
749 EXPECT_RECT_EQ(gfx::Rect(49, 49, 50, 50), 737 EXPECT_EQ(gfx::Rect(49, 49, 50, 50),
750 occlusion.UnoccludedLayerContentRect( 738 occlusion.UnoccludedLayerContentRect(parent,
751 parent, gfx::Rect(49, 49, 50, 50))); 739 gfx::Rect(49, 49, 50, 50)));
752 EXPECT_RECT_EQ(gfx::Rect(50, 49, 50, 1), 740 EXPECT_EQ(gfx::Rect(50, 49, 50, 1),
753 occlusion.UnoccludedLayerContentRect( 741 occlusion.UnoccludedLayerContentRect(parent,
754 parent, gfx::Rect(50, 49, 50, 50))); 742 gfx::Rect(50, 49, 50, 50)));
755 EXPECT_RECT_EQ(gfx::Rect(51, 49, 49, 1), 743 EXPECT_EQ(gfx::Rect(51, 49, 49, 1),
756 occlusion.UnoccludedLayerContentRect( 744 occlusion.UnoccludedLayerContentRect(parent,
757 parent, gfx::Rect(51, 49, 49, 50))); 745 gfx::Rect(51, 49, 49, 50)));
758 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 746 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
759 parent, gfx::Rect(51, 50, 49, 50)).IsEmpty()); 747 parent, gfx::Rect(51, 50, 49, 50)).IsEmpty());
760 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 748 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
761 parent, gfx::Rect(51, 51, 49, 49)).IsEmpty()); 749 parent, gfx::Rect(51, 51, 49, 49)).IsEmpty());
762 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 750 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
763 parent, gfx::Rect(50, 51, 50, 49)).IsEmpty()); 751 parent, gfx::Rect(50, 51, 50, 49)).IsEmpty());
764 EXPECT_RECT_EQ(gfx::Rect(49, 51, 1, 49), 752 EXPECT_EQ(gfx::Rect(49, 51, 1, 49),
765 occlusion.UnoccludedLayerContentRect( 753 occlusion.UnoccludedLayerContentRect(parent,
766 parent, gfx::Rect(49, 51, 50, 49))); 754 gfx::Rect(49, 51, 50, 49)));
767 } 755 }
768 }; 756 };
769 757
770 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestTranslatedChild); 758 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestTranslatedChild);
771 759
772 template <class Types> 760 template <class Types>
773 class OcclusionTrackerTestChildInRotatedChild 761 class OcclusionTrackerTestChildInRotatedChild
774 : public OcclusionTrackerTest<Types> { 762 : public OcclusionTrackerTest<Types> {
775 protected: 763 protected:
776 explicit OcclusionTrackerTestChildInRotatedChild(bool opaque_layers) 764 explicit OcclusionTrackerTestChildInRotatedChild(bool opaque_layers)
(...skipping 30 matching lines...) Expand all
807 occlusion.occlusion_from_inside_target().ToString()); 795 occlusion.occlusion_from_inside_target().ToString());
808 796
809 this->LeaveContributingSurface(child, &occlusion); 797 this->LeaveContributingSurface(child, &occlusion);
810 this->EnterLayer(parent, &occlusion); 798 this->EnterLayer(parent, &occlusion);
811 799
812 EXPECT_EQ(gfx::Rect().ToString(), 800 EXPECT_EQ(gfx::Rect().ToString(),
813 occlusion.occlusion_from_outside_target().ToString()); 801 occlusion.occlusion_from_outside_target().ToString());
814 EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(), 802 EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(),
815 occlusion.occlusion_from_inside_target().ToString()); 803 occlusion.occlusion_from_inside_target().ToString());
816 804
817 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 40, 70, 60)));
818 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 40, 70, 60)));
819 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 39, 70, 60)));
820 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(31, 40, 69, 60)));
821 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 41, 70, 59)));
822
823 /* Justification for the above occlusion from |layer|: 805 /* Justification for the above occlusion from |layer|:
824 100 806 100
825 +---------------------+ 807 +---------------------+
826 | | 808 | |
827 | 30 | rotate(90) 809 | 30 | rotate(90)
828 | 30 + ---------------------------------+ 810 | 30 + ---------------------------------+
829 100 | | 10 | | ==> 811 100 | | 10 | | ==>
830 | |10+---------------------------------+ 812 | |10+---------------------------------+
831 | | | | | | 813 | | | | | |
832 | | | | | | 814 | | | | | |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 gfx::Rect(0, 0, 1000, 1000)); 887 gfx::Rect(0, 0, 1000, 1000));
906 888
907 this->VisitLayer(occluder, &occlusion); 889 this->VisitLayer(occluder, &occlusion);
908 this->EnterLayer(layer2, &occlusion); 890 this->EnterLayer(layer2, &occlusion);
909 891
910 EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(), 892 EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(),
911 occlusion.occlusion_from_outside_target().ToString()); 893 occlusion.occlusion_from_outside_target().ToString());
912 EXPECT_EQ(gfx::Rect().ToString(), 894 EXPECT_EQ(gfx::Rect().ToString(),
913 occlusion.occlusion_from_inside_target().ToString()); 895 occlusion.occlusion_from_inside_target().ToString());
914 896
915 EXPECT_RECT_EQ( 897 EXPECT_EQ(
916 gfx::Rect(0, 0, 25, 25), 898 gfx::Rect(0, 0, 25, 25),
917 occlusion.UnoccludedLayerContentRect(layer2, gfx::Rect(0, 0, 25, 25))); 899 occlusion.UnoccludedLayerContentRect(layer2, gfx::Rect(0, 0, 25, 25)));
918 EXPECT_RECT_EQ(gfx::Rect(10, 25, 15, 25), 900 EXPECT_EQ(gfx::Rect(10, 25, 15, 25),
919 occlusion.UnoccludedLayerContentRect( 901 occlusion.UnoccludedLayerContentRect(layer2,
920 layer2, gfx::Rect(10, 25, 25, 25))); 902 gfx::Rect(10, 25, 25, 25)));
921 EXPECT_RECT_EQ(gfx::Rect(25, 10, 25, 15), 903 EXPECT_EQ(gfx::Rect(25, 10, 25, 15),
922 occlusion.UnoccludedLayerContentRect( 904 occlusion.UnoccludedLayerContentRect(layer2,
923 layer2, gfx::Rect(25, 10, 25, 25))); 905 gfx::Rect(25, 10, 25, 25)));
924 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 906 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
925 layer2, gfx::Rect(25, 25, 25, 25)).IsEmpty()); 907 layer2, gfx::Rect(25, 25, 25, 25)).IsEmpty());
926 } 908 }
927 }; 909 };
928 910
929 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestScaledRenderSurface); 911 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestScaledRenderSurface);
930 912
931 template <class Types> 913 template <class Types>
932 class OcclusionTrackerTestVisitTargetTwoTimes 914 class OcclusionTrackerTestVisitTargetTwoTimes
933 : public OcclusionTrackerTest<Types> { 915 : public OcclusionTrackerTest<Types> {
934 protected: 916 protected:
935 explicit OcclusionTrackerTestVisitTargetTwoTimes(bool opaque_layers) 917 explicit OcclusionTrackerTestVisitTargetTwoTimes(bool opaque_layers)
936 : OcclusionTrackerTest<Types>(opaque_layers) {} 918 : OcclusionTrackerTest<Types>(opaque_layers) {}
937 void RunMyTest() { 919 void RunMyTest() {
938 gfx::Transform child_transform;
939 child_transform.Translate(250.0, 250.0);
940 child_transform.Rotate(90.0);
941 child_transform.Translate(-250.0, -250.0);
942
943 typename Types::ContentLayerType* root = this->CreateRoot( 920 typename Types::ContentLayerType* root = this->CreateRoot(
944 this->identity_matrix, gfx::PointF(), gfx::Size(200, 200)); 921 this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
945 typename Types::ContentLayerType* parent = this->CreateDrawingLayer( 922 typename Types::LayerType* surface = this->CreateSurface(
946 root, this->identity_matrix, gfx::PointF(), gfx::Size(100, 100), true); 923 root, this->identity_matrix, gfx::PointF(30.f, 30.f), gfx::Size());
947 parent->SetMasksToBounds(true); 924 typename Types::ContentLayerType* surface_child =
948 typename Types::LayerType* child = this->CreateSurface( 925 this->CreateDrawingLayer(surface,
949 parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(500, 500));
950 child->SetMasksToBounds(true);
951 typename Types::ContentLayerType* layer =
952 this->CreateDrawingLayer(child,
953 this->identity_matrix, 926 this->identity_matrix,
954 gfx::PointF(10.f, 10.f), 927 gfx::PointF(10.f, 10.f),
955 gfx::Size(500, 500), 928 gfx::Size(50, 50),
956 true); 929 true);
957 // |child2| makes |parent|'s surface get considered by OcclusionTracker 930 // |top_layer| makes |root|'s surface get considered by OcclusionTracker
958 // first, instead of |child|'s. This exercises different code in 931 // first, instead of |surface|'s. This exercises different code in
959 // LeaveToRenderTarget, as the target surface has already been seen. 932 // LeaveToRenderTarget, as the target surface has already been seen when
960 typename Types::ContentLayerType* child2 = 933 // leaving |surface| later.
961 this->CreateDrawingLayer(parent, 934 typename Types::ContentLayerType* top_layer =
935 this->CreateDrawingLayer(root,
962 this->identity_matrix, 936 this->identity_matrix,
963 gfx::PointF(30.f, 30.f), 937 gfx::PointF(40.f, 90.f),
964 gfx::Size(60, 20), 938 gfx::Size(50, 20),
965 true); 939 true);
966 this->CalcDrawEtc(root); 940 this->CalcDrawEtc(root);
967 941
968 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 942 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
969 gfx::Rect(0, 0, 1000, 1000)); 943 gfx::Rect(0, 0, 1000, 1000));
970 944
971 this->VisitLayer(child2, &occlusion); 945 this->VisitLayer(top_layer, &occlusion);
972 946
973 EXPECT_EQ(gfx::Rect().ToString(), 947 EXPECT_EQ(gfx::Rect().ToString(),
974 occlusion.occlusion_from_outside_target().ToString()); 948 occlusion.occlusion_from_outside_target().ToString());
975 EXPECT_EQ(gfx::Rect(30, 30, 60, 20).ToString(), 949 EXPECT_EQ(gfx::Rect(40, 90, 50, 20).ToString(),
976 occlusion.occlusion_from_inside_target().ToString()); 950 occlusion.occlusion_from_inside_target().ToString());
977 951
978 this->VisitLayer(layer, &occlusion); 952 this->VisitLayer(surface_child, &occlusion);
979 953
980 EXPECT_EQ(gfx::Rect(0, 440, 20, 60).ToString(), 954 EXPECT_EQ(gfx::Rect(10, 60, 50, 20).ToString(),
981 occlusion.occlusion_from_outside_target().ToString()); 955 occlusion.occlusion_from_outside_target().ToString());
982 EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(), 956 EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(),
983 occlusion.occlusion_from_inside_target().ToString()); 957 occlusion.occlusion_from_inside_target().ToString());
984 958
985 this->EnterContributingSurface(child, &occlusion); 959 this->EnterContributingSurface(surface, &occlusion);
986 960
987 EXPECT_EQ(gfx::Rect(0, 440, 20, 60).ToString(), 961 EXPECT_EQ(gfx::Rect(10, 60, 50, 20).ToString(),
988 occlusion.occlusion_from_outside_target().ToString()); 962 occlusion.occlusion_from_outside_target().ToString());
989 EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(), 963 EXPECT_EQ(gfx::Rect(10, 10, 50, 50).ToString(),
990 occlusion.occlusion_from_inside_target().ToString()); 964 occlusion.occlusion_from_inside_target().ToString());
991 965
992 // Occlusion in |child2| should get merged with the |child| surface we are 966 // Occlusion from |top_layer| already in the root target should get merged
993 // leaving now. 967 // with the occlusion from the |surface| we are leaving now.
994 this->LeaveContributingSurface(child, &occlusion); 968 this->LeaveContributingSurface(surface, &occlusion);
995 this->EnterLayer(parent, &occlusion); 969 this->EnterLayer(root, &occlusion);
996 970
997 EXPECT_EQ(gfx::Rect().ToString(), 971 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
998 occlusion.occlusion_from_outside_target().ToString()); 972 EXPECT_EQ(gfx::Rect(40, 40, 50, 70).ToString(),
999 EXPECT_EQ(UnionRegions(gfx::Rect(30, 30, 60, 10), gfx::Rect(30, 40, 70, 60))
1000 .ToString(),
1001 occlusion.occlusion_from_inside_target().ToString()); 973 occlusion.occlusion_from_inside_target().ToString());
1002
1003 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 30, 70, 70)));
1004 EXPECT_RECT_EQ(gfx::Rect(90, 30, 10, 10),
1005 occlusion.UnoccludedLayerContentRect(
1006 parent, gfx::Rect(30, 30, 70, 70)));
1007
1008 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 30, 60, 10)));
1009 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 30, 60, 10)));
1010 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 29, 60, 10)));
1011 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(31, 30, 60, 10)));
1012 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 31, 60, 10)));
1013
1014 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 40, 70, 60)));
1015 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 40, 70, 60)));
1016 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 39, 70, 60)));
1017
1018 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
1019 parent, gfx::Rect(30, 30, 60, 10)).IsEmpty());
1020 EXPECT_RECT_EQ(gfx::Rect(29, 30, 1, 10),
1021 occlusion.UnoccludedLayerContentRect(
1022 parent, gfx::Rect(29, 30, 60, 10)));
1023 EXPECT_RECT_EQ(gfx::Rect(30, 29, 60, 1),
1024 occlusion.UnoccludedLayerContentRect(
1025 parent, gfx::Rect(30, 29, 60, 10)));
1026 EXPECT_RECT_EQ(gfx::Rect(90, 30, 1, 10),
1027 occlusion.UnoccludedLayerContentRect(
1028 parent, gfx::Rect(31, 30, 60, 10)));
1029 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
1030 parent, gfx::Rect(30, 31, 60, 10)).IsEmpty());
1031
1032 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
1033 parent, gfx::Rect(30, 40, 70, 60)).IsEmpty());
1034 EXPECT_RECT_EQ(gfx::Rect(29, 40, 1, 60),
1035 occlusion.UnoccludedLayerContentRect(
1036 parent, gfx::Rect(29, 40, 70, 60)));
1037 // This rect is mostly occluded by |child2|.
1038 EXPECT_RECT_EQ(gfx::Rect(90, 39, 10, 1),
1039 occlusion.UnoccludedLayerContentRect(
1040 parent, gfx::Rect(30, 39, 70, 60)));
1041 // This rect extends past top/right ends of |child2|.
1042 EXPECT_RECT_EQ(gfx::Rect(30, 29, 70, 11),
1043 occlusion.UnoccludedLayerContentRect(
1044 parent, gfx::Rect(30, 29, 70, 70)));
1045 // This rect extends past left/right ends of |child2|.
1046 EXPECT_RECT_EQ(gfx::Rect(20, 39, 80, 60),
1047 occlusion.UnoccludedLayerContentRect(
1048 parent, gfx::Rect(20, 39, 80, 60)));
1049 EXPECT_RECT_EQ(gfx::Rect(),
1050 occlusion.UnoccludedLayerContentRect(
1051 parent, gfx::Rect(31, 40, 69, 60)));
1052 EXPECT_RECT_EQ(gfx::Rect(),
1053 occlusion.UnoccludedLayerContentRect(
1054 parent, gfx::Rect(30, 41, 70, 59)));
1055
1056 /* Justification for the above occlusion from |layer|:
1057 100
1058 +---------------------+
1059 | |
1060 | 30 | rotate(90)
1061 | 30 + ------------+--------------------+
1062 100 | | 10 | | | ==>
1063 | |10+----------|----------------------+
1064 | + ------------+ | | |
1065 | | | | | |
1066 | | | | | |
1067 +----|--|-------------+ | |
1068 | | | |
1069 | | | |
1070 | | | |500
1071 | | | |
1072 | | | |
1073 | | | |
1074 | | | |
1075 +--|-------------------------------+ |
1076 | |
1077 +---------------------------------+
1078 500
1079
1080
1081 +---------------------+
1082 | |30 Visible region of |layer|: /////
1083 | 30 60 | |child2|: \\\\\
1084 | 30 +------------+--------------------+
1085 | |\\\\\\\\\\\\| |10 |
1086 | +--|\\\\\\\\\\\\|-----------------+ |
1087 | | +------------+//| 420 | |
1088 | | |///////////////|60 | |
1089 | | |///////////////| | |
1090 +--|--|---------------+ | |
1091 20|10| 70 | |
1092 | | | |
1093 | | | |
1094 | | | |
1095 | | | |
1096 | | | |
1097 | | |10|
1098 | +------------------------------|--+
1099 | 490 |
1100 +---------------------------------+
1101 500
1102 */
1103 } 974 }
1104 }; 975 };
1105 976
1106 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestVisitTargetTwoTimes); 977 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestVisitTargetTwoTimes);
1107 978
1108 template <class Types> 979 template <class Types>
1109 class OcclusionTrackerTestSurfaceRotatedOffAxis 980 class OcclusionTrackerTestSurfaceRotatedOffAxis
1110 : public OcclusionTrackerTest<Types> { 981 : public OcclusionTrackerTest<Types> {
1111 protected: 982 protected:
1112 explicit OcclusionTrackerTestSurfaceRotatedOffAxis(bool opaque_layers) 983 explicit OcclusionTrackerTestSurfaceRotatedOffAxis(bool opaque_layers)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 occlusion.occlusion_from_inside_target().ToString()); 1017 occlusion.occlusion_from_inside_target().ToString());
1147 1018
1148 this->LeaveContributingSurface(child, &occlusion); 1019 this->LeaveContributingSurface(child, &occlusion);
1149 this->EnterLayer(parent, &occlusion); 1020 this->EnterLayer(parent, &occlusion);
1150 1021
1151 EXPECT_EQ(gfx::Rect().ToString(), 1022 EXPECT_EQ(gfx::Rect().ToString(),
1152 occlusion.occlusion_from_outside_target().ToString()); 1023 occlusion.occlusion_from_outside_target().ToString());
1153 EXPECT_EQ(gfx::Rect().ToString(), 1024 EXPECT_EQ(gfx::Rect().ToString(),
1154 occlusion.occlusion_from_inside_target().ToString()); 1025 occlusion.occlusion_from_inside_target().ToString());
1155 1026
1156 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(75, 55, 1, 1))); 1027 EXPECT_EQ(
1157 EXPECT_RECT_EQ(
1158 gfx::Rect(75, 55, 1, 1), 1028 gfx::Rect(75, 55, 1, 1),
1159 occlusion.UnoccludedLayerContentRect(parent, gfx::Rect(75, 55, 1, 1))); 1029 occlusion.UnoccludedLayerContentRect(parent, gfx::Rect(75, 55, 1, 1)));
1160 } 1030 }
1161 }; 1031 };
1162 1032
1163 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceRotatedOffAxis); 1033 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceRotatedOffAxis);
1164 1034
1165 template <class Types> 1035 template <class Types>
1166 class OcclusionTrackerTestSurfaceWithTwoOpaqueChildren 1036 class OcclusionTrackerTestSurfaceWithTwoOpaqueChildren
1167 : public OcclusionTrackerTest<Types> { 1037 : public OcclusionTrackerTest<Types> {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1206 this->VisitLayer(layer2, &occlusion); 1076 this->VisitLayer(layer2, &occlusion);
1207 this->VisitLayer(layer1, &occlusion); 1077 this->VisitLayer(layer1, &occlusion);
1208 this->VisitLayer(child, &occlusion); 1078 this->VisitLayer(child, &occlusion);
1209 this->EnterContributingSurface(child, &occlusion); 1079 this->EnterContributingSurface(child, &occlusion);
1210 1080
1211 EXPECT_EQ(gfx::Rect().ToString(), 1081 EXPECT_EQ(gfx::Rect().ToString(),
1212 occlusion.occlusion_from_outside_target().ToString()); 1082 occlusion.occlusion_from_outside_target().ToString());
1213 EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(), 1083 EXPECT_EQ(gfx::Rect(10, 430, 60, 70).ToString(),
1214 occlusion.occlusion_from_inside_target().ToString()); 1084 occlusion.occlusion_from_inside_target().ToString());
1215 1085
1216 EXPECT_TRUE(occlusion.OccludedLayer(child, gfx::Rect(10, 430, 60, 70)));
1217 EXPECT_FALSE(occlusion.OccludedLayer(child, gfx::Rect(9, 430, 60, 70)));
1218 EXPECT_TRUE(occlusion.OccludedLayer(child, gfx::Rect(11, 430, 59, 70)));
1219 EXPECT_TRUE(occlusion.OccludedLayer(child, gfx::Rect(10, 431, 60, 69)));
1220
1221 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 1086 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
1222 child, gfx::Rect(10, 430, 60, 70)).IsEmpty()); 1087 child, gfx::Rect(10, 430, 60, 70)).IsEmpty());
1223 EXPECT_RECT_EQ( 1088 EXPECT_EQ(
1224 gfx::Rect(9, 430, 1, 70), 1089 gfx::Rect(9, 430, 1, 70),
1225 occlusion.UnoccludedLayerContentRect(child, gfx::Rect(9, 430, 60, 70))); 1090 occlusion.UnoccludedLayerContentRect(child, gfx::Rect(9, 430, 60, 70)));
1226 EXPECT_RECT_EQ(gfx::Rect(), 1091 EXPECT_EQ(gfx::Rect(),
1227 occlusion.UnoccludedLayerContentRect( 1092 occlusion.UnoccludedLayerContentRect(child,
1228 child, gfx::Rect(11, 430, 59, 70))); 1093 gfx::Rect(11, 430, 59, 70)));
1229 EXPECT_RECT_EQ(gfx::Rect(), 1094 EXPECT_EQ(gfx::Rect(),
1230 occlusion.UnoccludedLayerContentRect( 1095 occlusion.UnoccludedLayerContentRect(child,
1231 child, gfx::Rect(10, 431, 60, 69))); 1096 gfx::Rect(10, 431, 60, 69)));
1232 1097
1233 this->LeaveContributingSurface(child, &occlusion); 1098 this->LeaveContributingSurface(child, &occlusion);
1234 this->EnterLayer(parent, &occlusion); 1099 this->EnterLayer(parent, &occlusion);
1235 1100
1236 EXPECT_EQ(gfx::Rect().ToString(), 1101 EXPECT_EQ(gfx::Rect().ToString(),
1237 occlusion.occlusion_from_outside_target().ToString()); 1102 occlusion.occlusion_from_outside_target().ToString());
1238 EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(), 1103 EXPECT_EQ(gfx::Rect(30, 40, 70, 60).ToString(),
1239 occlusion.occlusion_from_inside_target().ToString()); 1104 occlusion.occlusion_from_inside_target().ToString());
1240 1105
1241 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 40, 70, 60)));
1242 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 40, 70, 60)));
1243 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 39, 70, 60)));
1244
1245 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect( 1106 EXPECT_TRUE(occlusion.UnoccludedLayerContentRect(
1246 parent, gfx::Rect(30, 40, 70, 60)).IsEmpty()); 1107 parent, gfx::Rect(30, 40, 70, 60)).IsEmpty());
1247 EXPECT_RECT_EQ(gfx::Rect(29, 40, 1, 60), 1108 EXPECT_EQ(gfx::Rect(29, 40, 1, 60),
1248 occlusion.UnoccludedLayerContentRect( 1109 occlusion.UnoccludedLayerContentRect(parent,
1249 parent, gfx::Rect(29, 40, 70, 60))); 1110 gfx::Rect(29, 40, 70, 60)));
1250 EXPECT_RECT_EQ(gfx::Rect(30, 39, 70, 1), 1111 EXPECT_EQ(gfx::Rect(30, 39, 70, 1),
1251 occlusion.UnoccludedLayerContentRect( 1112 occlusion.UnoccludedLayerContentRect(parent,
1252 parent, gfx::Rect(30, 39, 70, 60))); 1113 gfx::Rect(30, 39, 70, 60)));
1253 EXPECT_RECT_EQ(gfx::Rect(), 1114 EXPECT_EQ(gfx::Rect(),
1254 occlusion.UnoccludedLayerContentRect( 1115 occlusion.UnoccludedLayerContentRect(parent,
1255 parent, gfx::Rect(31, 40, 69, 60))); 1116 gfx::Rect(31, 40, 69, 60)));
1256 EXPECT_RECT_EQ(gfx::Rect(), 1117 EXPECT_EQ(gfx::Rect(),
1257 occlusion.UnoccludedLayerContentRect( 1118 occlusion.UnoccludedLayerContentRect(parent,
1258 parent, gfx::Rect(30, 41, 70, 59))); 1119 gfx::Rect(30, 41, 70, 59)));
1259 1120
1260 /* Justification for the above occlusion from |layer1| and |layer2|: 1121 /* Justification for the above occlusion from |layer1| and |layer2|:
1261 1122
1262 +---------------------+ 1123 +---------------------+
1263 | |30 Visible region of |layer1|: ///// 1124 | |30 Visible region of |layer1|: /////
1264 | | Visible region of |layer2|: \\\\\ 1125 | | Visible region of |layer2|: \\\\\
1265 | +---------------------------------+ 1126 | +---------------------------------+
1266 | | |10 | 1127 | | |10 |
1267 | +---------------+-----------------+ | 1128 | +---------------+-----------------+ |
1268 | | |\\\\\\\\\\\\|//| 420 | | 1129 | | |\\\\\\\\\\\\|//| 420 | |
(...skipping 17 matching lines...) Expand all
1286 1147
1287 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithTwoOpaqueChildren); 1148 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithTwoOpaqueChildren);
1288 1149
1289 template <class Types> 1150 template <class Types>
1290 class OcclusionTrackerTestOverlappingSurfaceSiblings 1151 class OcclusionTrackerTestOverlappingSurfaceSiblings
1291 : public OcclusionTrackerTest<Types> { 1152 : public OcclusionTrackerTest<Types> {
1292 protected: 1153 protected:
1293 explicit OcclusionTrackerTestOverlappingSurfaceSiblings(bool opaque_layers) 1154 explicit OcclusionTrackerTestOverlappingSurfaceSiblings(bool opaque_layers)
1294 : OcclusionTrackerTest<Types>(opaque_layers) {} 1155 : OcclusionTrackerTest<Types>(opaque_layers) {}
1295 void RunMyTest() { 1156 void RunMyTest() {
1296 gfx::Transform child_transform;
1297 child_transform.Translate(250.0, 250.0);
1298 child_transform.Rotate(90.0);
1299 child_transform.Translate(-250.0, -250.0);
1300
1301 typename Types::ContentLayerType* parent = this->CreateRoot( 1157 typename Types::ContentLayerType* parent = this->CreateRoot(
1302 this->identity_matrix, gfx::PointF(), gfx::Size(100, 100)); 1158 this->identity_matrix, gfx::PointF(), gfx::Size(100, 100));
1303 parent->SetMasksToBounds(true); 1159 parent->SetMasksToBounds(true);
1304 typename Types::LayerType* child1 = this->CreateSurface( 1160 typename Types::LayerType* child1 = this->CreateSurface(
1305 parent, child_transform, gfx::PointF(30.f, 30.f), gfx::Size(10, 10)); 1161 parent, this->identity_matrix, gfx::PointF(10.f, 0.f), gfx::Size());
1306 typename Types::LayerType* child2 = this->CreateSurface( 1162 typename Types::LayerType* child2 = this->CreateSurface(
1307 parent, child_transform, gfx::PointF(20.f, 40.f), gfx::Size(10, 10)); 1163 parent, this->identity_matrix, gfx::PointF(30.f, 0.f), gfx::Size());
1308 typename Types::ContentLayerType* layer1 = 1164 typename Types::ContentLayerType* layer1 = this->CreateDrawingLayer(
1309 this->CreateDrawingLayer(child1, 1165 child1, this->identity_matrix, gfx::PointF(), gfx::Size(40, 50), true);
1310 this->identity_matrix,
1311 gfx::PointF(-10.f, -10.f),
1312 gfx::Size(510, 510),
1313 true);
1314 typename Types::ContentLayerType* layer2 = 1166 typename Types::ContentLayerType* layer2 =
1315 this->CreateDrawingLayer(child2, 1167 this->CreateDrawingLayer(child2,
1316 this->identity_matrix, 1168 this->identity_matrix,
1317 gfx::PointF(-10.f, -10.f), 1169 gfx::PointF(10.f, 0.f),
1318 gfx::Size(510, 510), 1170 gfx::Size(40, 50),
1319 true); 1171 true);
1320 this->CalcDrawEtc(parent); 1172 this->CalcDrawEtc(parent);
1321 1173
1322 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1174 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1323 gfx::Rect(0, 0, 1000, 1000)); 1175 gfx::Rect(0, 0, 1000, 1000));
1324 1176
1325 this->VisitLayer(layer2, &occlusion); 1177 this->VisitLayer(layer2, &occlusion);
1326 this->EnterContributingSurface(child2, &occlusion); 1178 this->EnterContributingSurface(child2, &occlusion);
1327 1179
1180 // layer2's occlusion.
1328 EXPECT_EQ(gfx::Rect().ToString(), 1181 EXPECT_EQ(gfx::Rect().ToString(),
1329 occlusion.occlusion_from_outside_target().ToString()); 1182 occlusion.occlusion_from_outside_target().ToString());
1330 EXPECT_EQ(gfx::Rect(-10, 420, 70, 80).ToString(), 1183 EXPECT_EQ(gfx::Rect(10, 0, 40, 50).ToString(),
1331 occlusion.occlusion_from_inside_target().ToString()); 1184 occlusion.occlusion_from_inside_target().ToString());
1332 1185
1333 // There is nothing above child2's surface in the z-order.
1334 EXPECT_RECT_EQ(gfx::Rect(-10, 420, 70, 80),
1335 occlusion.UnoccludedSurfaceContentRect(
1336 child2, false, gfx::Rect(-10, 420, 70, 80)));
1337
1338 this->LeaveContributingSurface(child2, &occlusion); 1186 this->LeaveContributingSurface(child2, &occlusion);
1339 this->VisitLayer(layer1, &occlusion); 1187 this->VisitLayer(layer1, &occlusion);
1340 this->EnterContributingSurface(child1, &occlusion); 1188 this->EnterContributingSurface(child1, &occlusion);
1341 1189
1342 EXPECT_EQ(gfx::Rect(0, 430, 70, 80).ToString(), 1190 // layer2's occlusion in the target space of layer1.
1191 EXPECT_EQ(gfx::Rect(30, 0, 40, 50).ToString(),
1343 occlusion.occlusion_from_outside_target().ToString()); 1192 occlusion.occlusion_from_outside_target().ToString());
1344 EXPECT_EQ(gfx::Rect(-10, 430, 80, 70).ToString(), 1193 // layer1's occlusion.
1194 EXPECT_EQ(gfx::Rect(0, 0, 40, 50).ToString(),
1345 occlusion.occlusion_from_inside_target().ToString()); 1195 occlusion.occlusion_from_inside_target().ToString());
1346 1196
1347 // child2's contents will occlude child1 below it.
1348 EXPECT_RECT_EQ(gfx::Rect(-10, 430, 10, 70),
1349 occlusion.UnoccludedSurfaceContentRect(
1350 child1, false, gfx::Rect(-10, 430, 80, 70)));
1351
1352 this->LeaveContributingSurface(child1, &occlusion); 1197 this->LeaveContributingSurface(child1, &occlusion);
1353 this->EnterLayer(parent, &occlusion); 1198 this->EnterLayer(parent, &occlusion);
1354 1199
1355 EXPECT_EQ(gfx::Rect().ToString(), 1200 // The occlusion from from layer1 and layer2 is merged.
1356 occlusion.occlusion_from_outside_target().ToString()); 1201 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
1357 EXPECT_EQ(UnionRegions(gfx::Rect(30, 20, 70, 10), gfx::Rect(20, 30, 80, 70)) 1202 EXPECT_EQ(gfx::Rect(10, 0, 70, 50).ToString(),
1358 .ToString(),
1359 occlusion.occlusion_from_inside_target().ToString()); 1203 occlusion.occlusion_from_inside_target().ToString());
1360
1361 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(20, 20, 80, 80)));
1362
1363 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(30, 20, 70, 80)));
1364 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(29, 20, 70, 80)));
1365 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(30, 19, 70, 80)));
1366
1367 EXPECT_TRUE(occlusion.OccludedLayer(parent, gfx::Rect(20, 30, 80, 70)));
1368 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(19, 30, 80, 70)));
1369 EXPECT_FALSE(occlusion.OccludedLayer(parent, gfx::Rect(20, 29, 80, 70)));
1370
1371 /* Justification for the above occlusion:
1372 100
1373 +---------------------+
1374 | 20 | layer1
1375 | 30+ ---------------------------------+
1376 100 | 30| | layer2 |
1377 |20+----------------------------------+ |
1378 | | | | | |
1379 | | | | | |
1380 | | | | | |
1381 +--|-|----------------+ | |
1382 | | | | 510
1383 | | | |
1384 | | | |
1385 | | | |
1386 | | | |
1387 | | | |
1388 | | | |
1389 | +--------------------------------|-+
1390 | |
1391 +----------------------------------+
1392 510
1393 */
1394 } 1204 }
1395 }; 1205 };
1396 1206
1397 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestOverlappingSurfaceSiblings); 1207 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestOverlappingSurfaceSiblings);
1398 1208
1399 template <class Types> 1209 template <class Types>
1400 class OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms 1210 class OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms
1401 : public OcclusionTrackerTest<Types> { 1211 : public OcclusionTrackerTest<Types> {
1402 protected: 1212 protected:
1403 explicit OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms( 1213 explicit OcclusionTrackerTestOverlappingSurfaceSiblingsWithTwoTransforms(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1447 1257
1448 EXPECT_EQ(gfx::Rect().ToString(), 1258 EXPECT_EQ(gfx::Rect().ToString(),
1449 occlusion.occlusion_from_outside_target().ToString()); 1259 occlusion.occlusion_from_outside_target().ToString());
1450 EXPECT_EQ(gfx::Rect(-10, 420, 70, 80).ToString(), 1260 EXPECT_EQ(gfx::Rect(-10, 420, 70, 80).ToString(),
1451 occlusion.occlusion_from_inside_target().ToString()); 1261 occlusion.occlusion_from_inside_target().ToString());
1452 1262
1453 this->LeaveLayer(child2, &occlusion); 1263 this->LeaveLayer(child2, &occlusion);
1454 this->EnterContributingSurface(child2, &occlusion); 1264 this->EnterContributingSurface(child2, &occlusion);
1455 1265
1456 // There is nothing above child2's surface in the z-order. 1266 // There is nothing above child2's surface in the z-order.
1457 EXPECT_RECT_EQ(gfx::Rect(-10, 420, 70, 80), 1267 EXPECT_EQ(gfx::Rect(-10, 420, 70, 80),
1458 occlusion.UnoccludedSurfaceContentRect( 1268 occlusion.UnoccludedSurfaceContentRect(
1459 child2, false, gfx::Rect(-10, 420, 70, 80))); 1269 child2, false, gfx::Rect(-10, 420, 70, 80)));
1460 1270
1461 this->LeaveContributingSurface(child2, &occlusion); 1271 this->LeaveContributingSurface(child2, &occlusion);
1462 this->VisitLayer(layer1, &occlusion); 1272 this->VisitLayer(layer1, &occlusion);
1463 this->EnterContributingSurface(child1, &occlusion); 1273 this->EnterContributingSurface(child1, &occlusion);
1464 1274
1465 EXPECT_EQ(gfx::Rect(420, -10, 70, 80).ToString(), 1275 EXPECT_EQ(gfx::Rect(420, -10, 70, 80).ToString(),
1466 occlusion.occlusion_from_outside_target().ToString()); 1276 occlusion.occlusion_from_outside_target().ToString());
1467 EXPECT_EQ(gfx::Rect(420, -20, 80, 90).ToString(), 1277 EXPECT_EQ(gfx::Rect(420, -20, 80, 90).ToString(),
1468 occlusion.occlusion_from_inside_target().ToString()); 1278 occlusion.occlusion_from_inside_target().ToString());
1469 1279
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1613 1423
1614 template <class Types> 1424 template <class Types>
1615 class OcclusionTrackerTestReplicaDoesOcclude 1425 class OcclusionTrackerTestReplicaDoesOcclude
1616 : public OcclusionTrackerTest<Types> { 1426 : public OcclusionTrackerTest<Types> {
1617 protected: 1427 protected:
1618 explicit OcclusionTrackerTestReplicaDoesOcclude(bool opaque_layers) 1428 explicit OcclusionTrackerTestReplicaDoesOcclude(bool opaque_layers)
1619 : OcclusionTrackerTest<Types>(opaque_layers) {} 1429 : OcclusionTrackerTest<Types>(opaque_layers) {}
1620 void RunMyTest() { 1430 void RunMyTest() {
1621 typename Types::ContentLayerType* parent = this->CreateRoot( 1431 typename Types::ContentLayerType* parent = this->CreateRoot(
1622 this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); 1432 this->identity_matrix, gfx::PointF(), gfx::Size(100, 200));
1623 typename Types::LayerType* surface = 1433 typename Types::LayerType* surface = this->CreateDrawingSurface(
1624 this->CreateDrawingSurface(parent, 1434 parent, this->identity_matrix, gfx::PointF(), gfx::Size(50, 50), true);
1625 this->identity_matrix,
1626 gfx::PointF(0.f, 100.f),
1627 gfx::Size(50, 50),
1628 true);
1629 this->CreateReplicaLayer( 1435 this->CreateReplicaLayer(
1630 surface, this->identity_matrix, gfx::PointF(50.f, 50.f), gfx::Size()); 1436 surface, this->identity_matrix, gfx::PointF(0.f, 50.f), gfx::Size());
1631 this->CalcDrawEtc(parent); 1437 this->CalcDrawEtc(parent);
1632 1438
1633 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1439 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1634 gfx::Rect(0, 0, 1000, 1000)); 1440 gfx::Rect(0, 0, 1000, 1000));
1635 1441
1636 this->VisitLayer(surface, &occlusion); 1442 this->VisitLayer(surface, &occlusion);
1637 1443
1638 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), 1444 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(),
1639 occlusion.occlusion_from_inside_target().ToString()); 1445 occlusion.occlusion_from_inside_target().ToString());
1640 1446
1641 this->VisitContributingSurface(surface, &occlusion); 1447 this->VisitContributingSurface(surface, &occlusion);
1642 this->EnterLayer(parent, &occlusion); 1448 this->EnterLayer(parent, &occlusion);
1643 1449
1644 // The surface and replica should both be occluding the parent. 1450 // The surface and replica should both be occluding the parent.
1645 EXPECT_EQ( 1451 EXPECT_EQ(gfx::Rect(50, 100).ToString(),
1646 UnionRegions(gfx::Rect(0, 100, 50, 50), 1452 occlusion.occlusion_from_inside_target().ToString());
1647 gfx::Rect(50, 150, 50, 50)).ToString(),
1648 occlusion.occlusion_from_inside_target().ToString());
1649 } 1453 }
1650 }; 1454 };
1651 1455
1652 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaDoesOcclude); 1456 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaDoesOcclude);
1653 1457
1654 template <class Types> 1458 template <class Types>
1655 class OcclusionTrackerTestReplicaWithClipping 1459 class OcclusionTrackerTestReplicaWithClipping
1656 : public OcclusionTrackerTest<Types> { 1460 : public OcclusionTrackerTest<Types> {
1657 protected: 1461 protected:
1658 explicit OcclusionTrackerTestReplicaWithClipping(bool opaque_layers) 1462 explicit OcclusionTrackerTestReplicaWithClipping(bool opaque_layers)
1659 : OcclusionTrackerTest<Types>(opaque_layers) {} 1463 : OcclusionTrackerTest<Types>(opaque_layers) {}
1660 void RunMyTest() { 1464 void RunMyTest() {
1661 typename Types::ContentLayerType* parent = this->CreateRoot( 1465 typename Types::ContentLayerType* parent = this->CreateRoot(
1662 this->identity_matrix, gfx::PointF(), gfx::Size(100, 170)); 1466 this->identity_matrix, gfx::PointF(), gfx::Size(100, 170));
1663 parent->SetMasksToBounds(true); 1467 parent->SetMasksToBounds(true);
1664 typename Types::LayerType* surface = 1468 typename Types::LayerType* surface =
1665 this->CreateDrawingSurface(parent, 1469 this->CreateDrawingSurface(parent,
1666 this->identity_matrix, 1470 this->identity_matrix,
1667 gfx::PointF(0.f, 100.f), 1471 gfx::PointF(0.f, 100.f),
1668 gfx::Size(50, 50), 1472 gfx::Size(50, 50),
1669 true); 1473 true);
1670 this->CreateReplicaLayer( 1474 this->CreateReplicaLayer(
1671 surface, this->identity_matrix, gfx::PointF(50.f, 50.f), gfx::Size()); 1475 surface, this->identity_matrix, gfx::PointF(0.f, 50.f), gfx::Size());
1672 this->CalcDrawEtc(parent); 1476 this->CalcDrawEtc(parent);
1673 1477
1674 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1478 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1675 gfx::Rect(0, 0, 1000, 1000)); 1479 gfx::Rect(0, 0, 1000, 1000));
1676 1480
1677 this->VisitLayer(surface, &occlusion); 1481 this->VisitLayer(surface, &occlusion);
1678 1482
1483 // The surface layer's occlusion in its own space.
1679 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), 1484 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(),
1680 occlusion.occlusion_from_inside_target().ToString()); 1485 occlusion.occlusion_from_inside_target().ToString());
1486 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
1681 1487
1682 this->VisitContributingSurface(surface, &occlusion); 1488 this->VisitContributingSurface(surface, &occlusion);
1683 this->EnterLayer(parent, &occlusion); 1489 this->EnterLayer(parent, &occlusion);
1684 1490
1685 // The surface and replica should both be occluding the parent. 1491 // The surface and replica should both be occluding the parent, the
1686 EXPECT_EQ( 1492 // replica's occlusion is clipped by the parent.
1687 UnionRegions(gfx::Rect(0, 100, 50, 50), 1493 EXPECT_EQ(gfx::Rect(0, 100, 50, 70).ToString(),
1688 gfx::Rect(50, 150, 50, 20)).ToString(), 1494 occlusion.occlusion_from_inside_target().ToString());
1689 occlusion.occlusion_from_inside_target().ToString()); 1495 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
1690 } 1496 }
1691 }; 1497 };
1692 1498
1693 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaWithClipping); 1499 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaWithClipping);
1694 1500
1695 template <class Types> 1501 template <class Types>
1696 class OcclusionTrackerTestReplicaWithMask : public OcclusionTrackerTest<Types> { 1502 class OcclusionTrackerTestReplicaWithMask : public OcclusionTrackerTest<Types> {
1697 protected: 1503 protected:
1698 explicit OcclusionTrackerTestReplicaWithMask(bool opaque_layers) 1504 explicit OcclusionTrackerTestReplicaWithMask(bool opaque_layers)
1699 : OcclusionTrackerTest<Types>(opaque_layers) {} 1505 : OcclusionTrackerTest<Types>(opaque_layers) {}
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1745 this->identity_matrix, 1551 this->identity_matrix,
1746 gfx::PointF(), 1552 gfx::PointF(),
1747 gfx::Size(200, 200), 1553 gfx::Size(200, 200),
1748 false); 1554 false);
1749 this->CalcDrawEtc(parent); 1555 this->CalcDrawEtc(parent);
1750 1556
1751 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1557 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1752 gfx::Rect(0, 0, 1000, 1000)); 1558 gfx::Rect(0, 0, 1000, 1000));
1753 this->EnterLayer(layer, &occlusion); 1559 this->EnterLayer(layer, &occlusion);
1754 1560
1755 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100))); 1561 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
1756 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(100, 0, 100, 100))); 1562 EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty());
1757 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 100, 100, 100)));
1758 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(100, 100, 100, 100)));
1759 1563
1760 this->LeaveLayer(layer, &occlusion); 1564 this->LeaveLayer(layer, &occlusion);
1761 this->VisitContributingSurface(layer, &occlusion); 1565 this->VisitContributingSurface(layer, &occlusion);
1762 this->EnterLayer(parent, &occlusion); 1566 this->EnterLayer(parent, &occlusion);
1763 1567
1764 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty()); 1568 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
1569 EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty());
1765 } 1570 }
1766 }; 1571 };
1767 1572
1768 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionEmpty); 1573 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionEmpty);
1769 1574
1770 template <class Types> 1575 template <class Types>
1771 class OcclusionTrackerTestOpaqueContentsRegionNonEmpty 1576 class OcclusionTrackerTestOpaqueContentsRegionNonEmpty
1772 : public OcclusionTrackerTest<Types> { 1577 : public OcclusionTrackerTest<Types> {
1773 protected: 1578 protected:
1774 explicit OcclusionTrackerTestOpaqueContentsRegionNonEmpty(bool opaque_layers) 1579 explicit OcclusionTrackerTestOpaqueContentsRegionNonEmpty(bool opaque_layers)
(...skipping 12 matching lines...) Expand all
1787 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1592 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1788 gfx::Rect(0, 0, 1000, 1000)); 1593 gfx::Rect(0, 0, 1000, 1000));
1789 layer->SetOpaqueContentsRect(gfx::Rect(0, 0, 100, 100)); 1594 layer->SetOpaqueContentsRect(gfx::Rect(0, 0, 100, 100));
1790 1595
1791 this->ResetLayerIterator(); 1596 this->ResetLayerIterator();
1792 this->VisitLayer(layer, &occlusion); 1597 this->VisitLayer(layer, &occlusion);
1793 this->EnterLayer(parent, &occlusion); 1598 this->EnterLayer(parent, &occlusion);
1794 1599
1795 EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(), 1600 EXPECT_EQ(gfx::Rect(100, 100, 100, 100).ToString(),
1796 occlusion.occlusion_from_inside_target().ToString()); 1601 occlusion.occlusion_from_inside_target().ToString());
1797
1798 EXPECT_FALSE(
1799 occlusion.OccludedLayer(parent, gfx::Rect(0, 100, 100, 100)));
1800 EXPECT_TRUE(
1801 occlusion.OccludedLayer(parent, gfx::Rect(100, 100, 100, 100)));
1802 EXPECT_FALSE(
1803 occlusion.OccludedLayer(parent, gfx::Rect(200, 200, 100, 100)));
1804 } 1602 }
1805 { 1603 {
1806 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1604 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1807 gfx::Rect(0, 0, 1000, 1000)); 1605 gfx::Rect(0, 0, 1000, 1000));
1808 layer->SetOpaqueContentsRect(gfx::Rect(20, 20, 180, 180)); 1606 layer->SetOpaqueContentsRect(gfx::Rect(20, 20, 180, 180));
1809 1607
1810 this->ResetLayerIterator(); 1608 this->ResetLayerIterator();
1811 this->VisitLayer(layer, &occlusion); 1609 this->VisitLayer(layer, &occlusion);
1812 this->EnterLayer(parent, &occlusion); 1610 this->EnterLayer(parent, &occlusion);
1813 1611
1814 EXPECT_EQ(gfx::Rect(120, 120, 180, 180).ToString(), 1612 EXPECT_EQ(gfx::Rect(120, 120, 180, 180).ToString(),
1815 occlusion.occlusion_from_inside_target().ToString()); 1613 occlusion.occlusion_from_inside_target().ToString());
1816
1817 EXPECT_FALSE(
1818 occlusion.OccludedLayer(parent, gfx::Rect(0, 100, 100, 100)));
1819 EXPECT_FALSE(
1820 occlusion.OccludedLayer(parent, gfx::Rect(100, 100, 100, 100)));
1821 EXPECT_TRUE(
1822 occlusion.OccludedLayer(parent, gfx::Rect(200, 200, 100, 100)));
1823 } 1614 }
1824 { 1615 {
1825 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1616 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1826 gfx::Rect(0, 0, 1000, 1000)); 1617 gfx::Rect(0, 0, 1000, 1000));
1827 layer->SetOpaqueContentsRect(gfx::Rect(150, 150, 100, 100)); 1618 layer->SetOpaqueContentsRect(gfx::Rect(150, 150, 100, 100));
1828 1619
1829 this->ResetLayerIterator(); 1620 this->ResetLayerIterator();
1830 this->VisitLayer(layer, &occlusion); 1621 this->VisitLayer(layer, &occlusion);
1831 this->EnterLayer(parent, &occlusion); 1622 this->EnterLayer(parent, &occlusion);
1832 1623
1833 EXPECT_EQ(gfx::Rect(250, 250, 50, 50).ToString(), 1624 EXPECT_EQ(gfx::Rect(250, 250, 50, 50).ToString(),
1834 occlusion.occlusion_from_inside_target().ToString()); 1625 occlusion.occlusion_from_inside_target().ToString());
1835
1836 EXPECT_FALSE(
1837 occlusion.OccludedLayer(parent, gfx::Rect(0, 100, 100, 100)));
1838 EXPECT_FALSE(
1839 occlusion.OccludedLayer(parent, gfx::Rect(100, 100, 100, 100)));
1840 EXPECT_FALSE(
1841 occlusion.OccludedLayer(parent, gfx::Rect(200, 200, 100, 100)));
1842 } 1626 }
1843 } 1627 }
1844 }; 1628 };
1845 1629
1846 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionNonEmpty); 1630 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTestOpaqueContentsRegionNonEmpty);
1847 1631
1848 template <class Types> 1632 template <class Types>
1849 class OcclusionTrackerTest3dTransform : public OcclusionTrackerTest<Types> { 1633 class OcclusionTrackerTest3dTransform : public OcclusionTrackerTest<Types> {
1850 protected: 1634 protected:
1851 explicit OcclusionTrackerTest3dTransform(bool opaque_layers) 1635 explicit OcclusionTrackerTest3dTransform(bool opaque_layers)
(...skipping 13 matching lines...) Expand all
1865 gfx::Size(200, 200), 1649 gfx::Size(200, 200),
1866 true); 1650 true);
1867 this->CalcDrawEtc(parent); 1651 this->CalcDrawEtc(parent);
1868 1652
1869 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1653 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1870 gfx::Rect(0, 0, 1000, 1000)); 1654 gfx::Rect(0, 0, 1000, 1000));
1871 this->EnterLayer(layer, &occlusion); 1655 this->EnterLayer(layer, &occlusion);
1872 1656
1873 // The layer is rotated in 3d but without preserving 3d, so it only gets 1657 // The layer is rotated in 3d but without preserving 3d, so it only gets
1874 // resized. 1658 // resized.
1875 EXPECT_RECT_EQ( 1659 EXPECT_EQ(
1876 gfx::Rect(0, 0, 200, 200), 1660 gfx::Rect(0, 0, 200, 200),
1877 occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 200, 200))); 1661 occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 200, 200)));
1878 } 1662 }
1879 }; 1663 };
1880 1664
1881 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTest3dTransform); 1665 MAIN_AND_IMPL_THREAD_TEST(OcclusionTrackerTest3dTransform);
1882 1666
1883 template <class Types> 1667 template <class Types>
1884 class OcclusionTrackerTestUnsorted3dLayers 1668 class OcclusionTrackerTestUnsorted3dLayers
1885 : public OcclusionTrackerTest<Types> { 1669 : public OcclusionTrackerTest<Types> {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 container->Set3dSortingContextId(1); 1743 container->Set3dSortingContextId(1);
1960 layer->Set3dSortingContextId(1); 1744 layer->Set3dSortingContextId(1);
1961 layer->SetShouldFlattenTransform(false); 1745 layer->SetShouldFlattenTransform(false);
1962 1746
1963 this->CalcDrawEtc(parent); 1747 this->CalcDrawEtc(parent);
1964 1748
1965 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 1749 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
1966 gfx::Rect(0, 0, 1000, 1000)); 1750 gfx::Rect(0, 0, 1000, 1000));
1967 this->EnterLayer(layer, &occlusion); 1751 this->EnterLayer(layer, &occlusion);
1968 1752
1969 EXPECT_RECT_EQ( 1753 EXPECT_EQ(
1970 gfx::Rect(0, 0, 200, 200), 1754 gfx::Rect(0, 0, 200, 200),
1971 occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 200, 200))); 1755 occlusion.UnoccludedLayerContentRect(layer, gfx::Rect(0, 0, 200, 200)));
1972 } 1756 }
1973 }; 1757 };
1974 1758
1975 // This test requires accumulating occlusion of 3d layers, which are skipped by 1759 // This test requires accumulating occlusion of 3d layers, which are skipped by
1976 // the occlusion tracker on the main thread. So this test should run on the impl 1760 // the occlusion tracker on the main thread. So this test should run on the impl
1977 // thread. 1761 // thread.
1978 IMPL_THREAD_TEST(OcclusionTrackerTestPerspectiveTransform); 1762 IMPL_THREAD_TEST(OcclusionTrackerTestPerspectiveTransform);
1979 template <class Types> 1763 template <class Types>
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
2188 occlusion.UnoccludedLayerContentRect( 1972 occlusion.UnoccludedLayerContentRect(
2189 parent2, gfx::Rect(0, 0, 300, 300)).ToString()); 1973 parent2, gfx::Rect(0, 0, 300, 300)).ToString());
2190 this->LeaveLayer(parent2, &occlusion); 1974 this->LeaveLayer(parent2, &occlusion);
2191 1975
2192 this->VisitLayer(surface_child2, &occlusion); 1976 this->VisitLayer(surface_child2, &occlusion);
2193 this->EnterLayer(surface_child, &occlusion); 1977 this->EnterLayer(surface_child, &occlusion);
2194 EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), 1978 EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(),
2195 occlusion.occlusion_from_inside_target().ToString()); 1979 occlusion.occlusion_from_inside_target().ToString());
2196 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 1980 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2197 occlusion.occlusion_from_outside_target().ToString()); 1981 occlusion.occlusion_from_outside_target().ToString());
2198 EXPECT_RECT_EQ(gfx::Rect(100, 0, 100, 300), 1982 EXPECT_EQ(gfx::Rect(100, 0, 100, 300),
2199 occlusion.UnoccludedLayerContentRect( 1983 occlusion.UnoccludedLayerContentRect(surface_child,
2200 surface_child, gfx::Rect(0, 0, 200, 300))); 1984 gfx::Rect(0, 0, 200, 300)));
2201 this->LeaveLayer(surface_child, &occlusion); 1985 this->LeaveLayer(surface_child, &occlusion);
2202 this->EnterLayer(surface, &occlusion); 1986 this->EnterLayer(surface, &occlusion);
2203 EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(), 1987 EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(),
2204 occlusion.occlusion_from_inside_target().ToString()); 1988 occlusion.occlusion_from_inside_target().ToString());
2205 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 1989 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2206 occlusion.occlusion_from_outside_target().ToString()); 1990 occlusion.occlusion_from_outside_target().ToString());
2207 EXPECT_RECT_EQ(gfx::Rect(200, 0, 50, 300), 1991 EXPECT_EQ(gfx::Rect(200, 0, 50, 300),
2208 occlusion.UnoccludedLayerContentRect( 1992 occlusion.UnoccludedLayerContentRect(surface,
2209 surface, gfx::Rect(0, 0, 300, 300))); 1993 gfx::Rect(0, 0, 300, 300)));
2210 this->LeaveLayer(surface, &occlusion); 1994 this->LeaveLayer(surface, &occlusion);
2211 1995
2212 this->EnterContributingSurface(surface, &occlusion); 1996 this->EnterContributingSurface(surface, &occlusion);
2213 // Occlusion within the surface is lost when leaving the animating surface. 1997 // Occlusion within the surface is lost when leaving the animating surface.
2214 EXPECT_EQ(gfx::Rect().ToString(), 1998 EXPECT_EQ(gfx::Rect().ToString(),
2215 occlusion.occlusion_from_inside_target().ToString()); 1999 occlusion.occlusion_from_inside_target().ToString());
2216 EXPECT_EQ(gfx::Rect().ToString(), 2000 EXPECT_EQ(gfx::Rect().ToString(),
2217 occlusion.occlusion_from_outside_target().ToString()); 2001 occlusion.occlusion_from_outside_target().ToString());
2218 EXPECT_RECT_EQ(gfx::Rect(0, 0, 250, 300), 2002 EXPECT_EQ(gfx::Rect(0, 0, 250, 300),
2219 occlusion.UnoccludedSurfaceContentRect( 2003 occlusion.UnoccludedSurfaceContentRect(
2220 surface, false, gfx::Rect(0, 0, 300, 300))); 2004 surface, false, gfx::Rect(0, 0, 300, 300)));
2221 this->LeaveContributingSurface(surface, &occlusion); 2005 this->LeaveContributingSurface(surface, &occlusion);
2222 2006
2223 // Occlusion from outside the animating surface still exists. 2007 // Occlusion from outside the animating surface still exists.
2224 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 2008 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2225 occlusion.occlusion_from_inside_target().ToString()); 2009 occlusion.occlusion_from_inside_target().ToString());
2226 EXPECT_EQ(gfx::Rect().ToString(), 2010 EXPECT_EQ(gfx::Rect().ToString(),
2227 occlusion.occlusion_from_outside_target().ToString()); 2011 occlusion.occlusion_from_outside_target().ToString());
2228 2012
2229 this->VisitLayer(layer, &occlusion); 2013 this->VisitLayer(layer, &occlusion);
2230 this->EnterLayer(parent, &occlusion); 2014 this->EnterLayer(parent, &occlusion);
2231 2015
2232 // Occlusion is not added for the animating |layer|. 2016 // Occlusion is not added for the animating |layer|.
2233 EXPECT_RECT_EQ(gfx::Rect(0, 0, 250, 300), 2017 EXPECT_EQ(gfx::Rect(0, 0, 250, 300),
2234 occlusion.UnoccludedLayerContentRect( 2018 occlusion.UnoccludedLayerContentRect(parent,
2235 parent, gfx::Rect(0, 0, 300, 300))); 2019 gfx::Rect(0, 0, 300, 300)));
2236 } 2020 }
2237 }; 2021 };
2238 2022
2239 MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity1OnMainThread); 2023 MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity1OnMainThread);
2240 2024
2241 template <class Types> 2025 template <class Types>
2242 class OcclusionTrackerTestAnimationOpacity0OnMainThread 2026 class OcclusionTrackerTestAnimationOpacity0OnMainThread
2243 : public OcclusionTrackerTest<Types> { 2027 : public OcclusionTrackerTest<Types> {
2244 protected: 2028 protected:
2245 explicit OcclusionTrackerTestAnimationOpacity0OnMainThread(bool opaque_layers) 2029 explicit OcclusionTrackerTestAnimationOpacity0OnMainThread(bool opaque_layers)
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2297 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 2081 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
2298 gfx::Rect(0, 0, 1000, 1000)); 2082 gfx::Rect(0, 0, 1000, 1000));
2299 2083
2300 this->VisitLayer(topmost, &occlusion); 2084 this->VisitLayer(topmost, &occlusion);
2301 this->EnterLayer(parent2, &occlusion); 2085 this->EnterLayer(parent2, &occlusion);
2302 // This occlusion will affect all surfaces. 2086 // This occlusion will affect all surfaces.
2303 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 2087 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2304 occlusion.occlusion_from_inside_target().ToString()); 2088 occlusion.occlusion_from_inside_target().ToString());
2305 EXPECT_EQ(gfx::Rect().ToString(), 2089 EXPECT_EQ(gfx::Rect().ToString(),
2306 occlusion.occlusion_from_outside_target().ToString()); 2090 occlusion.occlusion_from_outside_target().ToString());
2307 EXPECT_RECT_EQ(gfx::Rect(0, 0, 250, 300), 2091 EXPECT_EQ(gfx::Rect(0, 0, 250, 300),
2308 occlusion.UnoccludedLayerContentRect( 2092 occlusion.UnoccludedLayerContentRect(parent,
2309 parent, gfx::Rect(0, 0, 300, 300))); 2093 gfx::Rect(0, 0, 300, 300)));
2310 this->LeaveLayer(parent2, &occlusion); 2094 this->LeaveLayer(parent2, &occlusion);
2311 2095
2312 this->VisitLayer(surface_child2, &occlusion); 2096 this->VisitLayer(surface_child2, &occlusion);
2313 this->EnterLayer(surface_child, &occlusion); 2097 this->EnterLayer(surface_child, &occlusion);
2314 EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(), 2098 EXPECT_EQ(gfx::Rect(0, 0, 100, 300).ToString(),
2315 occlusion.occlusion_from_inside_target().ToString()); 2099 occlusion.occlusion_from_inside_target().ToString());
2316 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 2100 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2317 occlusion.occlusion_from_outside_target().ToString()); 2101 occlusion.occlusion_from_outside_target().ToString());
2318 EXPECT_RECT_EQ(gfx::Rect(100, 0, 100, 300), 2102 EXPECT_EQ(gfx::Rect(100, 0, 100, 300),
2319 occlusion.UnoccludedLayerContentRect( 2103 occlusion.UnoccludedLayerContentRect(surface_child,
2320 surface_child, gfx::Rect(0, 0, 200, 300))); 2104 gfx::Rect(0, 0, 200, 300)));
2321 this->LeaveLayer(surface_child, &occlusion); 2105 this->LeaveLayer(surface_child, &occlusion);
2322 this->EnterLayer(surface, &occlusion); 2106 this->EnterLayer(surface, &occlusion);
2323 EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(), 2107 EXPECT_EQ(gfx::Rect(0, 0, 200, 300).ToString(),
2324 occlusion.occlusion_from_inside_target().ToString()); 2108 occlusion.occlusion_from_inside_target().ToString());
2325 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 2109 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2326 occlusion.occlusion_from_outside_target().ToString()); 2110 occlusion.occlusion_from_outside_target().ToString());
2327 EXPECT_RECT_EQ(gfx::Rect(200, 0, 50, 300), 2111 EXPECT_EQ(gfx::Rect(200, 0, 50, 300),
2328 occlusion.UnoccludedLayerContentRect( 2112 occlusion.UnoccludedLayerContentRect(surface,
2329 surface, gfx::Rect(0, 0, 300, 300))); 2113 gfx::Rect(0, 0, 300, 300)));
2330 this->LeaveLayer(surface, &occlusion); 2114 this->LeaveLayer(surface, &occlusion);
2331 2115
2332 this->EnterContributingSurface(surface, &occlusion); 2116 this->EnterContributingSurface(surface, &occlusion);
2333 // Occlusion within the surface is lost when leaving the animating surface. 2117 // Occlusion within the surface is lost when leaving the animating surface.
2334 EXPECT_EQ(gfx::Rect().ToString(), 2118 EXPECT_EQ(gfx::Rect().ToString(),
2335 occlusion.occlusion_from_inside_target().ToString()); 2119 occlusion.occlusion_from_inside_target().ToString());
2336 EXPECT_EQ(gfx::Rect().ToString(), 2120 EXPECT_EQ(gfx::Rect().ToString(),
2337 occlusion.occlusion_from_outside_target().ToString()); 2121 occlusion.occlusion_from_outside_target().ToString());
2338 EXPECT_RECT_EQ(gfx::Rect(0, 0, 250, 300), 2122 EXPECT_EQ(gfx::Rect(0, 0, 250, 300),
2339 occlusion.UnoccludedSurfaceContentRect( 2123 occlusion.UnoccludedSurfaceContentRect(
2340 surface, false, gfx::Rect(0, 0, 300, 300))); 2124 surface, false, gfx::Rect(0, 0, 300, 300)));
2341 this->LeaveContributingSurface(surface, &occlusion); 2125 this->LeaveContributingSurface(surface, &occlusion);
2342 2126
2343 // Occlusion from outside the animating surface still exists. 2127 // Occlusion from outside the animating surface still exists.
2344 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(), 2128 EXPECT_EQ(gfx::Rect(250, 0, 50, 300).ToString(),
2345 occlusion.occlusion_from_inside_target().ToString()); 2129 occlusion.occlusion_from_inside_target().ToString());
2346 EXPECT_EQ(gfx::Rect().ToString(), 2130 EXPECT_EQ(gfx::Rect().ToString(),
2347 occlusion.occlusion_from_outside_target().ToString()); 2131 occlusion.occlusion_from_outside_target().ToString());
2348 2132
2349 this->VisitLayer(layer, &occlusion); 2133 this->VisitLayer(layer, &occlusion);
2350 this->EnterLayer(parent, &occlusion); 2134 this->EnterLayer(parent, &occlusion);
2351 2135
2352 // Occlusion is not added for the animating |layer|. 2136 // Occlusion is not added for the animating |layer|.
2353 EXPECT_RECT_EQ(gfx::Rect(0, 0, 250, 300), 2137 EXPECT_EQ(gfx::Rect(0, 0, 250, 300),
2354 occlusion.UnoccludedLayerContentRect( 2138 occlusion.UnoccludedLayerContentRect(parent,
2355 parent, gfx::Rect(0, 0, 300, 300))); 2139 gfx::Rect(0, 0, 300, 300)));
2356 } 2140 }
2357 }; 2141 };
2358 2142
2359 MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity0OnMainThread); 2143 MAIN_THREAD_TEST(OcclusionTrackerTestAnimationOpacity0OnMainThread);
2360 2144
2361 template <class Types> 2145 template <class Types>
2362 class OcclusionTrackerTestAnimationTranslateOnMainThread 2146 class OcclusionTrackerTestAnimationTranslateOnMainThread
2363 : public OcclusionTrackerTest<Types> { 2147 : public OcclusionTrackerTest<Types> {
2364 protected: 2148 protected:
2365 explicit OcclusionTrackerTestAnimationTranslateOnMainThread( 2149 explicit OcclusionTrackerTestAnimationTranslateOnMainThread(
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2520 2304
2521 this->VisitLayer(surface2, &occlusion); 2305 this->VisitLayer(surface2, &occlusion);
2522 this->VisitContributingSurface(surface2, &occlusion); 2306 this->VisitContributingSurface(surface2, &occlusion);
2523 2307
2524 EXPECT_EQ(gfx::Rect().ToString(), 2308 EXPECT_EQ(gfx::Rect().ToString(),
2525 occlusion.occlusion_from_outside_target().ToString()); 2309 occlusion.occlusion_from_outside_target().ToString());
2526 EXPECT_EQ(gfx::Rect(50, 50, 200, 200).ToString(), 2310 EXPECT_EQ(gfx::Rect(50, 50, 200, 200).ToString(),
2527 occlusion.occlusion_from_inside_target().ToString()); 2311 occlusion.occlusion_from_inside_target().ToString());
2528 2312
2529 // Clear any stored occlusion. 2313 // Clear any stored occlusion.
2530 occlusion.set_occlusion_from_outside_target(Region()); 2314 occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion());
2531 occlusion.set_occlusion_from_inside_target(Region()); 2315 occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion());
2532 2316
2533 this->VisitLayer(surface, &occlusion); 2317 this->VisitLayer(surface, &occlusion);
2534 this->VisitContributingSurface(surface, &occlusion); 2318 this->VisitContributingSurface(surface, &occlusion);
2535 2319
2536 EXPECT_EQ(gfx::Rect().ToString(), 2320 EXPECT_EQ(gfx::Rect().ToString(),
2537 occlusion.occlusion_from_outside_target().ToString()); 2321 occlusion.occlusion_from_outside_target().ToString());
2538 EXPECT_EQ(gfx::Rect(0, 0, 400, 400).ToString(), 2322 EXPECT_EQ(gfx::Rect(0, 0, 400, 400).ToString(),
2539 occlusion.occlusion_from_inside_target().ToString()); 2323 occlusion.occlusion_from_inside_target().ToString());
2540 } 2324 }
2541 }; 2325 };
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2620 2404
2621 // Render target with replica ignores occlusion from outside. 2405 // Render target with replica ignores occlusion from outside.
2622 EXPECT_EQ(gfx::Rect().ToString(), 2406 EXPECT_EQ(gfx::Rect().ToString(),
2623 occlusion.occlusion_from_outside_target().ToString()); 2407 occlusion.occlusion_from_outside_target().ToString());
2624 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), 2408 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
2625 occlusion.occlusion_from_inside_target().ToString()); 2409 occlusion.occlusion_from_inside_target().ToString());
2626 2410
2627 this->EnterContributingSurface(surface, &occlusion); 2411 this->EnterContributingSurface(surface, &occlusion);
2628 2412
2629 // Surface is not occluded so it shouldn't think it is. 2413 // Surface is not occluded so it shouldn't think it is.
2630 EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 100), 2414 EXPECT_EQ(gfx::Rect(0, 0, 100, 100),
2631 occlusion.UnoccludedSurfaceContentRect( 2415 occlusion.UnoccludedSurfaceContentRect(
2632 surface, false, gfx::Rect(0, 0, 100, 100))); 2416 surface, false, gfx::Rect(0, 0, 100, 100)));
2633 } 2417 }
2634 }; 2418 };
2635 2419
2636 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaOccluded); 2420 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestReplicaOccluded);
2637 2421
2638 template <class Types> 2422 template <class Types>
2639 class OcclusionTrackerTestSurfaceWithReplicaUnoccluded 2423 class OcclusionTrackerTestSurfaceWithReplicaUnoccluded
2640 : public OcclusionTrackerTest<Types> { 2424 : public OcclusionTrackerTest<Types> {
2641 protected: 2425 protected:
2642 explicit OcclusionTrackerTestSurfaceWithReplicaUnoccluded(bool opaque_layers) 2426 explicit OcclusionTrackerTestSurfaceWithReplicaUnoccluded(bool opaque_layers)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2677 2461
2678 // Render target with replica ignores occlusion from outside. 2462 // Render target with replica ignores occlusion from outside.
2679 EXPECT_EQ(gfx::Rect().ToString(), 2463 EXPECT_EQ(gfx::Rect().ToString(),
2680 occlusion.occlusion_from_outside_target().ToString()); 2464 occlusion.occlusion_from_outside_target().ToString());
2681 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), 2465 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
2682 occlusion.occlusion_from_inside_target().ToString()); 2466 occlusion.occlusion_from_inside_target().ToString());
2683 2467
2684 this->EnterContributingSurface(surface, &occlusion); 2468 this->EnterContributingSurface(surface, &occlusion);
2685 2469
2686 // Surface is occluded, but only the top 10px of the replica. 2470 // Surface is occluded, but only the top 10px of the replica.
2687 EXPECT_RECT_EQ(gfx::Rect(0, 0, 0, 0), 2471 EXPECT_EQ(gfx::Rect(0, 0, 0, 0),
2688 occlusion.UnoccludedSurfaceContentRect( 2472 occlusion.UnoccludedSurfaceContentRect(
2689 surface, false, gfx::Rect(0, 0, 100, 100))); 2473 surface, false, gfx::Rect(0, 0, 100, 100)));
2690 EXPECT_RECT_EQ(gfx::Rect(0, 10, 100, 90), 2474 EXPECT_EQ(gfx::Rect(0, 10, 100, 90),
2691 occlusion.UnoccludedSurfaceContentRect( 2475 occlusion.UnoccludedSurfaceContentRect(
2692 surface, true, gfx::Rect(0, 0, 100, 100))); 2476 surface, true, gfx::Rect(0, 0, 100, 100)));
2693 } 2477 }
2694 }; 2478 };
2695 2479
2696 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithReplicaUnoccluded); 2480 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceWithReplicaUnoccluded);
2697 2481
2698 template <class Types> 2482 template <class Types>
2699 class OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently 2483 class OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently
2700 : public OcclusionTrackerTest<Types> { 2484 : public OcclusionTrackerTest<Types> {
2701 protected: 2485 protected:
2702 explicit OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently( 2486 explicit OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently(
2703 bool opaque_layers) 2487 bool opaque_layers)
2704 : OcclusionTrackerTest<Types>(opaque_layers) {} 2488 : OcclusionTrackerTest<Types>(opaque_layers) {}
2705 void RunMyTest() { 2489 void RunMyTest() {
2706 typename Types::ContentLayerType* parent = this->CreateRoot( 2490 typename Types::ContentLayerType* parent = this->CreateRoot(
2707 this->identity_matrix, gfx::PointF(), gfx::Size(100, 200)); 2491 this->identity_matrix, gfx::PointF(), gfx::Size(200, 100));
2708 typename Types::LayerType* surface = 2492 typename Types::LayerType* surface =
2709 this->CreateDrawingSurface(parent, 2493 this->CreateDrawingSurface(parent,
2710 this->identity_matrix, 2494 this->identity_matrix,
2711 gfx::PointF(), 2495 gfx::PointF(),
2712 gfx::Size(100, 100), 2496 gfx::Size(100, 100),
2713 true); 2497 true);
2714 this->CreateReplicaLayer(surface, 2498 this->CreateReplicaLayer(surface,
2715 this->identity_matrix, 2499 this->identity_matrix,
2716 gfx::PointF(0.f, 100.f), 2500 gfx::PointF(100.f, 0.f),
2717 gfx::Size(100, 100)); 2501 gfx::Size(100, 100));
2718 typename Types::LayerType* over_surface = this->CreateDrawingLayer( 2502 typename Types::LayerType* over_surface =
2719 parent, this->identity_matrix, gfx::PointF(), gfx::Size(40, 100), true); 2503 this->CreateDrawingLayer(parent,
2504 this->identity_matrix,
2505 gfx::PointF(60.f, 0.f),
2506 gfx::Size(40, 100),
2507 true);
2720 typename Types::LayerType* over_replica = 2508 typename Types::LayerType* over_replica =
2721 this->CreateDrawingLayer(parent, 2509 this->CreateDrawingLayer(parent,
2722 this->identity_matrix, 2510 this->identity_matrix,
2723 gfx::PointF(0.f, 100.f), 2511 gfx::PointF(100.f, 0.f),
2724 gfx::Size(50, 100), 2512 gfx::Size(50, 100),
2725 true); 2513 true);
2726 this->CalcDrawEtc(parent); 2514 this->CalcDrawEtc(parent);
2727 2515
2728 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 2516 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
2729 gfx::Rect(0, 0, 1000, 1000)); 2517 gfx::Rect(0, 0, 1000, 1000));
2730 2518
2731 // These occlude the surface and replica differently, so we can test each 2519 // These occlude the surface and replica differently, so we can test each
2732 // one. 2520 // one.
2733 this->VisitLayer(over_replica, &occlusion); 2521 this->VisitLayer(over_replica, &occlusion);
2734 this->VisitLayer(over_surface, &occlusion); 2522 this->VisitLayer(over_surface, &occlusion);
2735 2523
2736 EXPECT_EQ(gfx::Rect().ToString(), 2524 EXPECT_EQ(gfx::Rect().ToString(),
2737 occlusion.occlusion_from_outside_target().ToString()); 2525 occlusion.occlusion_from_outside_target().ToString());
2738 EXPECT_EQ(UnionRegions(gfx::Rect(0, 0, 40, 100), gfx::Rect(0, 100, 50, 100)) 2526 EXPECT_EQ(gfx::Rect(60, 0, 90, 100).ToString(),
2739 .ToString(),
2740 occlusion.occlusion_from_inside_target().ToString()); 2527 occlusion.occlusion_from_inside_target().ToString());
2741 2528
2742 this->VisitLayer(surface, &occlusion); 2529 this->VisitLayer(surface, &occlusion);
2743 2530
2744 // Render target with replica ignores occlusion from outside. 2531 // Render target with replica ignores occlusion from outside.
2745 EXPECT_EQ(gfx::Rect().ToString(), 2532 EXPECT_EQ(gfx::Rect().ToString(),
2746 occlusion.occlusion_from_outside_target().ToString()); 2533 occlusion.occlusion_from_outside_target().ToString());
2747 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), 2534 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(),
2748 occlusion.occlusion_from_inside_target().ToString()); 2535 occlusion.occlusion_from_inside_target().ToString());
2749 2536
2750 this->EnterContributingSurface(surface, &occlusion); 2537 this->EnterContributingSurface(surface, &occlusion);
2751 2538
2752 // Surface and replica are occluded different amounts. 2539 // Surface and replica are occluded different amounts.
2753 EXPECT_RECT_EQ(gfx::Rect(40, 0, 60, 100), 2540 EXPECT_EQ(gfx::Rect(0, 0, 60, 100),
2754 occlusion.UnoccludedSurfaceContentRect( 2541 occlusion.UnoccludedSurfaceContentRect(
2755 surface, false, gfx::Rect(0, 0, 100, 100))); 2542 surface, false, gfx::Rect(0, 0, 100, 100)));
2756 EXPECT_RECT_EQ(gfx::Rect(50, 0, 50, 100), 2543 EXPECT_EQ(gfx::Rect(50, 0, 50, 100),
2757 occlusion.UnoccludedSurfaceContentRect( 2544 occlusion.UnoccludedSurfaceContentRect(
2758 surface, true, gfx::Rect(0, 0, 100, 100))); 2545 surface, true, gfx::Rect(0, 0, 100, 100)));
2759 } 2546 }
2760 }; 2547 };
2761 2548
2762 ALL_OCCLUSIONTRACKER_TEST( 2549 ALL_OCCLUSIONTRACKER_TEST(
2763 OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently); 2550 OcclusionTrackerTestSurfaceAndReplicaOccludedDifferently);
2764 2551
2765 template <class Types> 2552 template <class Types>
2766 class OcclusionTrackerTestSurfaceChildOfSurface 2553 class OcclusionTrackerTestSurfaceChildOfSurface
2767 : public OcclusionTrackerTest<Types> { 2554 : public OcclusionTrackerTest<Types> {
2768 protected: 2555 protected:
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2814 // The root layer always has a clip rect. So the parent of |surface| has a 2601 // The root layer always has a clip rect. So the parent of |surface| has a
2815 // clip rect. However, the owning layer for |surface| does not mask to 2602 // clip rect. However, the owning layer for |surface| does not mask to
2816 // bounds, so it doesn't have a clip rect of its own. Thus the parent of 2603 // bounds, so it doesn't have a clip rect of its own. Thus the parent of
2817 // |surface_child| exercises different code paths as its parent does not 2604 // |surface_child| exercises different code paths as its parent does not
2818 // have a clip rect. 2605 // have a clip rect.
2819 2606
2820 this->EnterContributingSurface(surface_child, &occlusion); 2607 this->EnterContributingSurface(surface_child, &occlusion);
2821 // The surface_child's parent does not have a clip rect as it owns a render 2608 // The surface_child's parent does not have a clip rect as it owns a render
2822 // surface. Make sure the unoccluded rect does not get clipped away 2609 // surface. Make sure the unoccluded rect does not get clipped away
2823 // inappropriately. 2610 // inappropriately.
2824 EXPECT_RECT_EQ(gfx::Rect(0, 40, 100, 10), 2611 EXPECT_EQ(gfx::Rect(0, 40, 100, 10),
2825 occlusion.UnoccludedSurfaceContentRect( 2612 occlusion.UnoccludedSurfaceContentRect(
2826 surface_child, false, gfx::Rect(0, 0, 100, 50))); 2613 surface_child, false, gfx::Rect(0, 0, 100, 50)));
2827 this->LeaveContributingSurface(surface_child, &occlusion); 2614 this->LeaveContributingSurface(surface_child, &occlusion);
2828 2615
2829 // When the surface_child's occlusion is transformed up to its parent, make 2616 // When the surface_child's occlusion is transformed up to its parent, make
2830 // sure it is not clipped away inappropriately also. 2617 // sure it is not clipped away inappropriately also.
2831 this->EnterLayer(surface, &occlusion); 2618 this->EnterLayer(surface, &occlusion);
2832 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), 2619 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(),
2833 occlusion.occlusion_from_outside_target().ToString()); 2620 occlusion.occlusion_from_outside_target().ToString());
2834 EXPECT_EQ(gfx::Rect(0, 10, 100, 50).ToString(), 2621 EXPECT_EQ(gfx::Rect(0, 10, 100, 50).ToString(),
2835 occlusion.occlusion_from_inside_target().ToString()); 2622 occlusion.occlusion_from_inside_target().ToString());
2836 this->LeaveLayer(surface, &occlusion); 2623 this->LeaveLayer(surface, &occlusion);
2837 2624
2838 this->EnterContributingSurface(surface, &occlusion); 2625 this->EnterContributingSurface(surface, &occlusion);
2839 // The surface's parent does have a clip rect as it is the root layer. 2626 // The surface's parent does have a clip rect as it is the root layer.
2840 EXPECT_RECT_EQ(gfx::Rect(0, 50, 100, 50), 2627 EXPECT_EQ(gfx::Rect(0, 50, 100, 50),
2841 occlusion.UnoccludedSurfaceContentRect( 2628 occlusion.UnoccludedSurfaceContentRect(
2842 surface, false, gfx::Rect(0, 0, 100, 100))); 2629 surface, false, gfx::Rect(0, 0, 100, 100)));
2843 } 2630 }
2844 }; 2631 };
2845 2632
2846 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceChildOfSurface); 2633 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestSurfaceChildOfSurface);
2847 2634
2848 template <class Types> 2635 template <class Types>
2849 class OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter 2636 class OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter
2850 : public OcclusionTrackerTest<Types> { 2637 : public OcclusionTrackerTest<Types> {
2851 protected: 2638 protected:
2852 explicit OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter( 2639 explicit OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter(
2853 bool opaque_layers) 2640 bool opaque_layers)
2854 : OcclusionTrackerTest<Types>(opaque_layers) {} 2641 : OcclusionTrackerTest<Types>(opaque_layers) {}
2855 void RunMyTest() { 2642 void RunMyTest() {
2856 gfx::Transform scale_by_half; 2643 gfx::Transform scale_by_half;
2857 scale_by_half.Scale(0.5, 0.5); 2644 scale_by_half.Scale(0.5, 0.5);
2858 2645
2859 // Make a 50x50 filtered surface that is completely surrounded by opaque
2860 // layers which are above it in the z-order. The surface is scaled to test
2861 // that the pixel moving is done in the target space, where the background
2862 // filter is applied.
2863 typename Types::ContentLayerType* parent = this->CreateRoot(
2864 this->identity_matrix, gfx::PointF(), gfx::Size(200, 150));
2865 typename Types::LayerType* filtered_surface =
2866 this->CreateDrawingLayer(parent,
2867 scale_by_half,
2868 gfx::PointF(50.f, 50.f),
2869 gfx::Size(100, 100),
2870 false);
2871 typename Types::LayerType* occluding_layer1 = this->CreateDrawingLayer(
2872 parent, this->identity_matrix, gfx::PointF(), gfx::Size(200, 50), true);
2873 typename Types::LayerType* occluding_layer2 =
2874 this->CreateDrawingLayer(parent,
2875 this->identity_matrix,
2876 gfx::PointF(0.f, 100.f),
2877 gfx::Size(200, 50),
2878 true);
2879 typename Types::LayerType* occluding_layer3 =
2880 this->CreateDrawingLayer(parent,
2881 this->identity_matrix,
2882 gfx::PointF(0.f, 50.f),
2883 gfx::Size(50, 50),
2884 true);
2885 typename Types::LayerType* occluding_layer4 =
2886 this->CreateDrawingLayer(parent,
2887 this->identity_matrix,
2888 gfx::PointF(100.f, 50.f),
2889 gfx::Size(100, 50),
2890 true);
2891
2892 // Filters make the layer own a surface.
2893 FilterOperations filters; 2646 FilterOperations filters;
2894 filters.Append(FilterOperation::CreateBlurFilter(10.f)); 2647 filters.Append(FilterOperation::CreateBlurFilter(10.f));
2895 filtered_surface->SetBackgroundFilters(filters);
2896 2648
2897 // Save the distance of influence for the blur effect. 2649 // Save the distance of influence for the blur effect.
2898 int outset_top, outset_right, outset_bottom, outset_left; 2650 int outset_top, outset_right, outset_bottom, outset_left;
2899 filters.GetOutsets( 2651 filters.GetOutsets(
2900 &outset_top, &outset_right, &outset_bottom, &outset_left); 2652 &outset_top, &outset_right, &outset_bottom, &outset_left);
2901 2653
2902 this->CalcDrawEtc(parent); 2654 enum Direction {
2655 LEFT,
2656 RIGHT,
2657 TOP,
2658 BOTTOM,
2659 LAST_DIRECTION = BOTTOM,
2660 };
2903 2661
2904 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 2662 for (int i = 0; i <= LAST_DIRECTION; ++i) {
2905 gfx::Rect(0, 0, 1000, 1000)); 2663 SCOPED_TRACE(i);
2906 2664
2907 // These layers occlude pixels directly beside the filtered_surface. Because 2665 // Make a 50x50 filtered surface that is adjacent to occluding layers
2908 // filtered surface blends pixels in a radius, it will need to see some of 2666 // which are above it in the z-order in various configurations. The
2909 // the pixels (up to radius far) underneath the occluding layers. 2667 // surface is scaled to test that the pixel moving is done in the target
2910 this->VisitLayer(occluding_layer4, &occlusion); 2668 // space, where the background filter is applied.
2911 this->VisitLayer(occluding_layer3, &occlusion); 2669 typename Types::ContentLayerType* parent = this->CreateRoot(
2912 this->VisitLayer(occluding_layer2, &occlusion); 2670 this->identity_matrix, gfx::PointF(), gfx::Size(200, 200));
2913 this->VisitLayer(occluding_layer1, &occlusion); 2671 typename Types::LayerType* filtered_surface =
2672 this->CreateDrawingLayer(parent,
2673 scale_by_half,
2674 gfx::PointF(50.f, 50.f),
2675 gfx::Size(100, 100),
2676 false);
2677 filtered_surface->SetBackgroundFilters(filters);
2914 2678
2915 Region expected_occlusion; 2679 gfx::Rect occlusion_rect;
2916 expected_occlusion.Union(gfx::Rect(0, 0, 200, 50)); 2680 switch (i) {
2917 expected_occlusion.Union(gfx::Rect(0, 50, 50, 50)); 2681 case LEFT:
2918 expected_occlusion.Union(gfx::Rect(100, 50, 100, 50)); 2682 occlusion_rect = gfx::Rect(0, 0, 50, 200);
2919 expected_occlusion.Union(gfx::Rect(0, 100, 200, 50)); 2683 break;
2684 case RIGHT:
2685 occlusion_rect = gfx::Rect(100, 0, 50, 200);
2686 break;
2687 case TOP:
2688 occlusion_rect = gfx::Rect(0, 0, 200, 50);
2689 break;
2690 case BOTTOM:
2691 occlusion_rect = gfx::Rect(0, 100, 200, 50);
2692 break;
2693 }
2920 2694
2921 EXPECT_EQ(expected_occlusion.ToString(), 2695 typename Types::LayerType* occluding_layer =
2922 occlusion.occlusion_from_inside_target().ToString()); 2696 this->CreateDrawingLayer(parent,
2923 EXPECT_EQ(gfx::Rect().ToString(), 2697 this->identity_matrix,
2924 occlusion.occlusion_from_outside_target().ToString()); 2698 occlusion_rect.origin(),
2699 occlusion_rect.size(),
2700 true);
2701 this->CalcDrawEtc(parent);
2925 2702
2926 this->VisitLayer(filtered_surface, &occlusion); 2703 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
2704 gfx::Rect(0, 0, 200, 200));
2927 2705
2928 // The filtered layer does not occlude. 2706 // This layer occludes pixels directly beside the filtered_surface.
2929 Region expected_occlusion_outside_surface; 2707 // Because filtered surface blends pixels in a radius, it will need to see
2930 expected_occlusion_outside_surface.Union(gfx::Rect(-50, -50, 200, 50)); 2708 // some of the pixels (up to radius far) underneath the occluding layers.
2931 expected_occlusion_outside_surface.Union(gfx::Rect(-50, 0, 50, 50)); 2709 this->VisitLayer(occluding_layer, &occlusion);
2932 expected_occlusion_outside_surface.Union(gfx::Rect(50, 0, 100, 50));
2933 expected_occlusion_outside_surface.Union(gfx::Rect(-50, 50, 200, 50));
2934 2710
2935 EXPECT_EQ(expected_occlusion_outside_surface.ToString(), 2711 EXPECT_EQ(occlusion_rect.ToString(),
2936 occlusion.occlusion_from_outside_target().ToString()); 2712 occlusion.occlusion_from_inside_target().ToString());
2937 EXPECT_EQ(gfx::Rect().ToString(), 2713 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
2938 occlusion.occlusion_from_inside_target().ToString());
2939 2714
2940 // The surface has a background blur, so it needs pixels that are currently 2715 this->VisitLayer(filtered_surface, &occlusion);
2941 // considered occluded in order to be drawn. So the pixels it needs should
2942 // be removed some the occluded area so that when we get to the parent they
2943 // are drawn.
2944 this->VisitContributingSurface(filtered_surface, &occlusion);
2945 2716
2946 this->EnterLayer(parent, &occlusion); 2717 // The occlusion is used fully inside the surface.
2718 gfx::Rect occlusion_inside_surface =
2719 occlusion_rect - gfx::Vector2d(50, 50);
2720 EXPECT_TRUE(occlusion.occlusion_from_inside_target().IsEmpty());
2721 EXPECT_EQ(occlusion_inside_surface.ToString(),
2722 occlusion.occlusion_from_outside_target().ToString());
2947 2723
2948 Region expected_blurred_occlusion; 2724 // The surface has a background blur, so it needs pixels that are
2949 expected_blurred_occlusion.Union(gfx::Rect(0, 0, 200, 50 - outset_top)); 2725 // currently considered occluded in order to be drawn. So the pixels it
2950 expected_blurred_occlusion.Union(gfx::Rect( 2726 // needs should be removed some the occluded area so that when we get to
2951 0, 50 - outset_top, 50 - outset_left, 50 + outset_top + outset_bottom)); 2727 // the parent they are drawn.
2952 expected_blurred_occlusion.Union( 2728 this->VisitContributingSurface(filtered_surface, &occlusion);
2953 gfx::Rect(100 + outset_right, 2729 this->EnterLayer(parent, &occlusion);
2954 50 - outset_top,
2955 100 - outset_right,
2956 50 + outset_top + outset_bottom));
2957 expected_blurred_occlusion.Union(
2958 gfx::Rect(0, 100 + outset_bottom, 200, 50 - outset_bottom));
2959 2730
2960 EXPECT_EQ(expected_blurred_occlusion.ToString(), 2731 gfx::Rect expected_occlusion = occlusion_rect;
2961 occlusion.occlusion_from_inside_target().ToString()); 2732 switch (i) {
2962 EXPECT_EQ(gfx::Rect().ToString(), 2733 case LEFT:
2963 occlusion.occlusion_from_outside_target().ToString()); 2734 expected_occlusion.Inset(0, 0, outset_right, 0);
2735 break;
2736 case RIGHT:
2737 expected_occlusion.Inset(outset_right, 0, 0, 0);
2738 break;
2739 case TOP:
2740 expected_occlusion.Inset(0, 0, 0, outset_right);
2741 break;
2742 case BOTTOM:
2743 expected_occlusion.Inset(0, outset_right, 0, 0);
2744 break;
2745 }
2964 2746
2965 gfx::Rect outset_rect; 2747 EXPECT_EQ(expected_occlusion.ToString(),
2966 gfx::Rect test_rect; 2748 occlusion.occlusion_from_inside_target().ToString());
2749 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
2967 2750
2968 // Nothing in the blur outsets for the filtered_surface is occluded. 2751 this->DestroyLayers();
2969 outset_rect = gfx::Rect(50 - outset_left, 2752 }
2970 50 - outset_top,
2971 50 + outset_left + outset_right,
2972 50 + outset_top + outset_bottom);
2973 test_rect = outset_rect;
2974 EXPECT_EQ(
2975 outset_rect.ToString(),
2976 occlusion.UnoccludedLayerContentRect(parent, test_rect).ToString());
2977
2978 // Stuff outside the blur outsets is still occluded though.
2979 test_rect = outset_rect;
2980 test_rect.Inset(0, 0, -1, 0);
2981 EXPECT_EQ(
2982 outset_rect.ToString(),
2983 occlusion.UnoccludedLayerContentRect(parent, test_rect).ToString());
2984 test_rect = outset_rect;
2985 test_rect.Inset(0, 0, 0, -1);
2986 EXPECT_EQ(
2987 outset_rect.ToString(),
2988 occlusion.UnoccludedLayerContentRect(parent, test_rect).ToString());
2989 test_rect = outset_rect;
2990 test_rect.Inset(-1, 0, 0, 0);
2991 EXPECT_EQ(
2992 outset_rect.ToString(),
2993 occlusion.UnoccludedLayerContentRect(parent, test_rect).ToString());
2994 test_rect = outset_rect;
2995 test_rect.Inset(0, -1, 0, 0);
2996 EXPECT_EQ(
2997 outset_rect.ToString(),
2998 occlusion.UnoccludedLayerContentRect(parent, test_rect).ToString());
2999 } 2753 }
3000 }; 2754 };
3001 2755
3002 ALL_OCCLUSIONTRACKER_TEST( 2756 ALL_OCCLUSIONTRACKER_TEST(
3003 OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter); 2757 OcclusionTrackerTestDontOccludePixelsNeededForBackgroundFilter);
3004 2758
3005 template <class Types> 2759 template <class Types>
3006 class OcclusionTrackerTestTwoBackgroundFiltersReduceOcclusionTwice 2760 class OcclusionTrackerTestTwoBackgroundFiltersReduceOcclusionTwice
3007 : public OcclusionTrackerTest<Types> { 2761 : public OcclusionTrackerTest<Types> {
3008 protected: 2762 protected:
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
3126 2880
3127 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion( 2881 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
3128 gfx::Rect(0, 0, 1000, 1000)); 2882 gfx::Rect(0, 0, 1000, 1000));
3129 2883
3130 // The surface has a background blur, so it blurs non-opaque pixels below 2884 // The surface has a background blur, so it blurs non-opaque pixels below
3131 // it. 2885 // it.
3132 this->VisitLayer(filtered_surface, &occlusion); 2886 this->VisitLayer(filtered_surface, &occlusion);
3133 this->VisitContributingSurface(filtered_surface, &occlusion); 2887 this->VisitContributingSurface(filtered_surface, &occlusion);
3134 2888
3135 this->VisitLayer(behind_replica_layer, &occlusion); 2889 this->VisitLayer(behind_replica_layer, &occlusion);
2890
2891 // The layers behind the surface are not blurred, and their occlusion does
2892 // not change, until we leave the surface. So it should not be modified by
2893 // the filter here.
2894 gfx::Rect occlusion_behind_replica = gfx::Rect(210, 60, 30, 30);
2895 EXPECT_EQ(occlusion_behind_replica.ToString(),
2896 occlusion.occlusion_from_inside_target().ToString());
2897 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
2898
2899 // Clear the occlusion so the |behind_surface_layer| can add its occlusion
2900 // without existing occlusion interfering.
2901 occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion());
2902
3136 this->VisitLayer(behind_surface_layer, &occlusion); 2903 this->VisitLayer(behind_surface_layer, &occlusion);
3137 2904
3138 // The layers behind the surface are not blurred, and their occlusion does 2905 // The layers behind the surface are not blurred, and their occlusion does
3139 // not change, until we leave the surface. So it should not be modified by 2906 // not change, until we leave the surface. So it should not be modified by
3140 // the filter here. 2907 // the filter here.
3141 gfx::Rect occlusion_behind_surface = gfx::Rect(60, 60, 30, 30); 2908 gfx::Rect occlusion_behind_surface = gfx::Rect(60, 60, 30, 30);
3142 gfx::Rect occlusion_behind_replica = gfx::Rect(210, 60, 30, 30); 2909 EXPECT_EQ(occlusion_behind_surface.ToString(),
3143
3144 Region expected_opaque_bounds =
3145 UnionRegions(occlusion_behind_surface, occlusion_behind_replica);
3146 EXPECT_EQ(expected_opaque_bounds.ToString(),
3147 occlusion.occlusion_from_inside_target().ToString()); 2910 occlusion.occlusion_from_inside_target().ToString());
3148 2911 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
3149 EXPECT_EQ(gfx::Rect().ToString(),
3150 occlusion.occlusion_from_outside_target().ToString());
3151 } 2912 }
3152 }; 2913 };
3153 2914
3154 ALL_OCCLUSIONTRACKER_TEST( 2915 ALL_OCCLUSIONTRACKER_TEST(
3155 OcclusionTrackerTestDontReduceOcclusionBelowBackgroundFilter); 2916 OcclusionTrackerTestDontReduceOcclusionBelowBackgroundFilter);
3156 2917
3157 template <class Types> 2918 template <class Types>
3158 class OcclusionTrackerTestDontReduceOcclusionIfBackgroundFilterIsOccluded 2919 class OcclusionTrackerTestDontReduceOcclusionIfBackgroundFilterIsOccluded
3159 : public OcclusionTrackerTest<Types> { 2920 : public OcclusionTrackerTest<Types> {
3160 protected: 2921 protected:
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
3311 // it will not touch occlusion_beside____ since that is not beside the 3072 // it will not touch occlusion_beside____ since that is not beside the
3312 // unoccluded part of the surface, even though it is beside the occluded 3073 // unoccluded part of the surface, even though it is beside the occluded
3313 // part of the surface. 3074 // part of the surface.
3314 gfx::Rect occlusion_above_surface = 3075 gfx::Rect occlusion_above_surface =
3315 gfx::Rect(70 + outset_right, 50, 30 - outset_right, 50); 3076 gfx::Rect(70 + outset_right, 50, 30 - outset_right, 50);
3316 gfx::Rect occlusion_above_replica = 3077 gfx::Rect occlusion_above_replica =
3317 gfx::Rect(200, 50, 30 - outset_left, 50); 3078 gfx::Rect(200, 50, 30 - outset_left, 50);
3318 gfx::Rect occlusion_beside_surface = gfx::Rect(90, 40, 10, 10); 3079 gfx::Rect occlusion_beside_surface = gfx::Rect(90, 40, 10, 10);
3319 gfx::Rect occlusion_beside_replica = gfx::Rect(200, 40, 10, 10); 3080 gfx::Rect occlusion_beside_replica = gfx::Rect(200, 40, 10, 10);
3320 3081
3321 Region expected_occlusion; 3082 SimpleEnclosedRegion expected_occlusion;
3083 expected_occlusion.Union(occlusion_beside_replica);
3084 expected_occlusion.Union(occlusion_beside_surface);
3085 expected_occlusion.Union(occlusion_above_replica);
3322 expected_occlusion.Union(occlusion_above_surface); 3086 expected_occlusion.Union(occlusion_above_surface);
3323 expected_occlusion.Union(occlusion_above_replica);
3324 expected_occlusion.Union(occlusion_beside_surface);
3325 expected_occlusion.Union(occlusion_beside_replica);
3326 3087
3327 ASSERT_EQ(expected_occlusion.ToString(), 3088 EXPECT_EQ(expected_occlusion.ToString(),
3328 occlusion.occlusion_from_inside_target().ToString()); 3089 occlusion.occlusion_from_inside_target().ToString());
3329 EXPECT_EQ(gfx::Rect().ToString(), 3090 EXPECT_TRUE(occlusion.occlusion_from_outside_target().IsEmpty());
3330 occlusion.occlusion_from_outside_target().ToString());
3331 3091
3332 Region::Iterator expected_rects(expected_occlusion); 3092 const SimpleEnclosedRegion& actual_occlusion =
3333 Region::Iterator target_surface_rects( 3093 occlusion.occlusion_from_inside_target();
3334 occlusion.occlusion_from_inside_target()); 3094 for (size_t i = 0; i < expected_occlusion.GetRegionComplexity(); ++i) {
3335 for (; expected_rects.has_rect(); 3095 ASSERT_LT(i, actual_occlusion.GetRegionComplexity());
3336 expected_rects.next(), target_surface_rects.next()) { 3096 EXPECT_EQ(expected_occlusion.GetRect(i), actual_occlusion.GetRect(i));
3337 ASSERT_TRUE(target_surface_rects.has_rect());
3338 EXPECT_EQ(expected_rects.rect(), target_surface_rects.rect());
3339 } 3097 }
3340 } 3098 }
3341 }; 3099 };
3342 3100
3343 ALL_OCCLUSIONTRACKER_TEST( 3101 ALL_OCCLUSIONTRACKER_TEST(
3344 OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded); 3102 OcclusionTrackerTestReduceOcclusionWhenBackgroundFilterIsPartiallyOccluded);
3345 3103
3346 template <class Types> 3104 template <class Types>
3347 class OcclusionTrackerTestMinimumTrackingSize 3105 class OcclusionTrackerTestMinimumTrackingSize
3348 : public OcclusionTrackerTest<Types> { 3106 : public OcclusionTrackerTest<Types> {
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
3554 // The occlusion from the copy should be dropped since it is hidden. 3312 // The occlusion from the copy should be dropped since it is hidden.
3555 EXPECT_EQ(gfx::Rect().ToString(), 3313 EXPECT_EQ(gfx::Rect().ToString(),
3556 occlusion.occlusion_from_outside_target().ToString()); 3314 occlusion.occlusion_from_outside_target().ToString());
3557 EXPECT_EQ(gfx::Rect().ToString(), 3315 EXPECT_EQ(gfx::Rect().ToString(),
3558 occlusion.occlusion_from_inside_target().ToString()); 3316 occlusion.occlusion_from_inside_target().ToString());
3559 } 3317 }
3560 }; 3318 };
3561 3319
3562 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestHiddenCopyRequestDoesNotOcclude) 3320 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestHiddenCopyRequestDoesNotOcclude)
3563 3321
3322 template <class Types>
3323 class OcclusionTrackerTestOccludedLayer : public OcclusionTrackerTest<Types> {
3324 protected:
3325 explicit OcclusionTrackerTestOccludedLayer(bool opaque_layers)
3326 : OcclusionTrackerTest<Types>(opaque_layers) {}
3327 void RunMyTest() {
3328 gfx::Transform translate;
3329 translate.Translate(10.0, 20.0);
3330 typename Types::ContentLayerType* root = this->CreateRoot(
3331 this->identity_matrix, gfx::Point(), gfx::Size(200, 200));
3332 typename Types::LayerType* surface = this->CreateSurface(
3333 root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200));
3334 typename Types::LayerType* layer = this->CreateDrawingLayer(
3335 surface, translate, gfx::Point(), gfx::Size(200, 200), false);
3336 typename Types::ContentLayerType* outside_layer = this->CreateDrawingLayer(
3337 root, this->identity_matrix, gfx::Point(), gfx::Size(200, 200), false);
3338 this->CalcDrawEtc(root);
3339
3340 TestOcclusionTrackerWithClip<typename Types::LayerType> occlusion(
3341 gfx::Rect(0, 0, 200, 200));
3342 this->VisitLayer(outside_layer, &occlusion);
3343 this->EnterLayer(layer, &occlusion);
3344
3345 // No occlusion, is not occluded.
3346 occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion());
3347 occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion());
3348 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(100, 100)));
3349
3350 // Partial occlusion from outside, is not occluded.
3351 occlusion.set_occlusion_from_outside_target(
3352 SimpleEnclosedRegion(50, 50, 100, 100));
3353 occlusion.set_occlusion_from_inside_target(SimpleEnclosedRegion());
3354 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100)));
3355 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100)));
3356 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100)));
3357 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100)));
3358 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100)));
3359 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100)));
3360 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100)));
3361 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100)));
3362
3363 // Full occlusion from outside, is occluded.
3364 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100)));
3365 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10)));
3366 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10)));
3367 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50)));
3368
3369 // Partial occlusion from inside, is not occluded.
3370 occlusion.set_occlusion_from_outside_target(SimpleEnclosedRegion());
3371 occlusion.set_occlusion_from_inside_target(
3372 SimpleEnclosedRegion(50, 50, 100, 100));
3373 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100)));
3374 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100)));
3375 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100)));
3376 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100)));
3377 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100)));
3378 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100)));
3379 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100)));
3380 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100)));
3381
3382 // Full occlusion from inside, is occluded.
3383 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100)));
3384 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10)));
3385 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10)));
3386 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50)));
3387
3388 // Partial occlusion from both, is not occluded.
3389 occlusion.set_occlusion_from_outside_target(
3390 SimpleEnclosedRegion(50, 50, 100, 50));
3391 occlusion.set_occlusion_from_inside_target(
3392 SimpleEnclosedRegion(50, 100, 100, 50));
3393 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 100, 100)));
3394 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 30, 100, 100)));
3395 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 0, 100, 100)));
3396 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(40, 80, 100, 100)));
3397 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 0, 80, 100)));
3398 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 80, 100, 100)));
3399 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(0, 80, 100, 100)));
3400 EXPECT_FALSE(occlusion.OccludedLayer(layer, gfx::Rect(90, 0, 100, 100)));
3401
3402 // Full occlusion from both, is occluded.
3403 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 100, 100)));
3404 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(40, 30, 10, 10)));
3405 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(130, 120, 10, 10)));
3406 EXPECT_TRUE(occlusion.OccludedLayer(layer, gfx::Rect(80, 70, 50, 50)));
3407 }
3408 };
3409
3410 ALL_OCCLUSIONTRACKER_TEST(OcclusionTrackerTestOccludedLayer)
3411
3564 } // namespace 3412 } // namespace
3565 } // namespace cc 3413 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/occlusion_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698