OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/cancelable_callback.h" | 7 #include "base/cancelable_callback.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 } | 81 } |
82 | 82 |
83 private: | 83 private: |
84 SkColor color_; | 84 SkColor color_; |
85 }; | 85 }; |
86 | 86 |
87 const int kDrawWaitTimeOutMs = 1000; | 87 const int kDrawWaitTimeOutMs = 1000; |
88 | 88 |
89 class DrawWaiter : public ui::CompositorObserver { | 89 class DrawWaiter : public ui::CompositorObserver { |
90 public: | 90 public: |
91 DrawWaiter() {} | 91 DrawWaiter() : did_draw_(false) {} |
92 | 92 |
93 void Wait(ui::Compositor* compositor) { | 93 bool Wait(ui::Compositor* compositor) { |
| 94 did_draw_ = false; |
94 compositor->AddObserver(this); | 95 compositor->AddObserver(this); |
95 wait_run_loop_.reset(new base::RunLoop()); | 96 wait_run_loop_.reset(new base::RunLoop()); |
96 base::CancelableClosure timeout( | 97 base::CancelableClosure timeout( |
97 base::Bind(&DrawWaiter::TimedOutWhileWaiting, | 98 base::Bind(&DrawWaiter::TimedOutWhileWaiting, |
98 base::Unretained(this))); | 99 base::Unretained(this))); |
99 MessageLoop::current()->PostDelayedTask( | 100 MessageLoop::current()->PostDelayedTask( |
100 FROM_HERE, timeout.callback(), | 101 FROM_HERE, timeout.callback(), |
101 base::TimeDelta::FromMilliseconds(kDrawWaitTimeOutMs)); | 102 base::TimeDelta::FromMilliseconds(kDrawWaitTimeOutMs)); |
102 wait_run_loop_->Run(); | 103 wait_run_loop_->Run(); |
103 compositor->RemoveObserver(this); | 104 compositor->RemoveObserver(this); |
| 105 return did_draw_; |
104 } | 106 } |
105 | 107 |
106 private: | 108 private: |
107 void TimedOutWhileWaiting() { | 109 void TimedOutWhileWaiting() { |
108 LOG(ERROR) << "Timed out waiting for draw."; | 110 LOG(ERROR) << "Timed out waiting for draw."; |
109 wait_run_loop_->Quit(); | 111 wait_run_loop_->Quit(); |
110 } | 112 } |
111 | 113 |
112 // ui::CompositorObserver implementation. | 114 // ui::CompositorObserver implementation. |
113 virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE {} | 115 virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE {} |
114 virtual void OnCompositingStarted(Compositor* compositor, | 116 virtual void OnCompositingStarted(Compositor* compositor, |
115 base::TimeTicks start_time) OVERRIDE {} | 117 base::TimeTicks start_time) OVERRIDE {} |
116 virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE { | 118 virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE { |
| 119 did_draw_ = true; |
117 wait_run_loop_->Quit(); | 120 wait_run_loop_->Quit(); |
118 } | 121 } |
119 virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE {} | 122 virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE {} |
120 virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE {} | 123 virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE {} |
121 virtual void OnUpdateVSyncParameters(Compositor* compositor, | 124 virtual void OnUpdateVSyncParameters(Compositor* compositor, |
122 base::TimeTicks timebase, | 125 base::TimeTicks timebase, |
123 base::TimeDelta interval) OVERRIDE {} | 126 base::TimeDelta interval) OVERRIDE {} |
124 | 127 |
125 scoped_ptr<base::RunLoop> wait_run_loop_; | 128 scoped_ptr<base::RunLoop> wait_run_loop_; |
| 129 bool did_draw_; |
126 | 130 |
127 DISALLOW_COPY_AND_ASSIGN(DrawWaiter); | 131 DISALLOW_COPY_AND_ASSIGN(DrawWaiter); |
128 }; | 132 }; |
129 | 133 |
130 class LayerWithRealCompositorTest : public testing::Test { | 134 class LayerWithRealCompositorTest : public testing::Test { |
131 public: | 135 public: |
132 LayerWithRealCompositorTest() { | 136 LayerWithRealCompositorTest() { |
133 if (PathService::Get(gfx::DIR_TEST_DATA, &test_data_directory_)) { | 137 if (PathService::Get(gfx::DIR_TEST_DATA, &test_data_directory_)) { |
134 test_data_directory_ = test_data_directory_.AppendASCII("compositor"); | 138 test_data_directory_ = test_data_directory_.AppendASCII("compositor"); |
135 } else { | 139 } else { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 GetCompositor()->SetRootLayer(root); | 177 GetCompositor()->SetRootLayer(root); |
174 GetCompositor()->ScheduleDraw(); | 178 GetCompositor()->ScheduleDraw(); |
175 WaitForDraw(); | 179 WaitForDraw(); |
176 } | 180 } |
177 | 181 |
178 bool ReadPixels(SkBitmap* bitmap) { | 182 bool ReadPixels(SkBitmap* bitmap) { |
179 return GetCompositor()->ReadPixels(bitmap, | 183 return GetCompositor()->ReadPixels(bitmap, |
180 gfx::Rect(GetCompositor()->size())); | 184 gfx::Rect(GetCompositor()->size())); |
181 } | 185 } |
182 | 186 |
183 void WaitForDraw() { | 187 bool WaitForDraw() { |
184 DrawWaiter draw_waiter; | 188 DrawWaiter draw_waiter; |
185 draw_waiter.Wait(GetCompositor()); | 189 return draw_waiter.Wait(GetCompositor()); |
186 } | 190 } |
187 | 191 |
188 // Invalidates the entire contents of the layer. | 192 // Invalidates the entire contents of the layer. |
189 void SchedulePaintForLayer(Layer* layer) { | 193 void SchedulePaintForLayer(Layer* layer) { |
190 layer->SchedulePaint( | 194 layer->SchedulePaint( |
191 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 195 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
192 } | 196 } |
193 | 197 |
194 const base::FilePath& test_data_directory() const { | 198 const base::FilePath& test_data_directory() const { |
195 return test_data_directory_; | 199 return test_data_directory_; |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 | 422 |
419 l1->Add(l2.get()); | 423 l1->Add(l2.get()); |
420 l1->Add(l4.get()); | 424 l1->Add(l4.get()); |
421 l2->Add(l3.get()); | 425 l2->Add(l3.get()); |
422 | 426 |
423 DrawTree(l1.get()); | 427 DrawTree(l1.get()); |
424 } | 428 } |
425 | 429 |
426 class LayerWithDelegateTest : public testing::Test, public CompositorDelegate { | 430 class LayerWithDelegateTest : public testing::Test, public CompositorDelegate { |
427 public: | 431 public: |
428 LayerWithDelegateTest() : schedule_draw_invoked_(false) {} | 432 LayerWithDelegateTest() {} |
429 virtual ~LayerWithDelegateTest() {} | 433 virtual ~LayerWithDelegateTest() {} |
430 | 434 |
431 // Overridden from testing::Test: | 435 // Overridden from testing::Test: |
432 virtual void SetUp() OVERRIDE { | 436 virtual void SetUp() OVERRIDE { |
433 ui::SetupTestCompositor(); | 437 ui::SetupTestCompositor(); |
434 compositor_.reset(new Compositor( | 438 compositor_.reset(new Compositor(this, gfx::kNullAcceleratedWidget)); |
435 this, gfx::kNullAcceleratedWidget)); | |
436 compositor_->SetScaleAndSize(1.0f, gfx::Size(1000, 1000)); | 439 compositor_->SetScaleAndSize(1.0f, gfx::Size(1000, 1000)); |
437 } | 440 } |
438 | 441 |
439 virtual void TearDown() OVERRIDE { | 442 virtual void TearDown() OVERRIDE { |
440 } | 443 } |
441 | 444 |
442 Compositor* compositor() { return compositor_.get(); } | 445 Compositor* compositor() { return compositor_.get(); } |
443 | 446 |
444 virtual Layer* CreateLayer(LayerType type) { | 447 virtual Layer* CreateLayer(LayerType type) { |
445 return new Layer(type); | 448 return new Layer(type); |
446 } | 449 } |
447 | 450 |
448 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { | 451 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { |
449 Layer* layer = new ColoredLayer(color); | 452 Layer* layer = new ColoredLayer(color); |
450 layer->SetBounds(bounds); | 453 layer->SetBounds(bounds); |
451 return layer; | 454 return layer; |
452 } | 455 } |
453 | 456 |
454 virtual Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { | 457 virtual Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { |
455 Layer* layer = CreateLayer(LAYER_NOT_DRAWN); | 458 Layer* layer = CreateLayer(LAYER_NOT_DRAWN); |
456 layer->SetBounds(bounds); | 459 layer->SetBounds(bounds); |
457 return layer; | 460 return layer; |
458 } | 461 } |
459 | 462 |
460 void DrawTree(Layer* root) { | 463 void DrawTree(Layer* root) { |
461 compositor()->SetRootLayer(root); | 464 compositor()->SetRootLayer(root); |
462 compositor()->Draw(false); | 465 Draw(); |
463 } | 466 } |
464 | 467 |
465 // Invalidates the entire contents of the layer. | 468 // Invalidates the entire contents of the layer. |
466 void SchedulePaintForLayer(Layer* layer) { | 469 void SchedulePaintForLayer(Layer* layer) { |
467 layer->SchedulePaint( | 470 layer->SchedulePaint( |
468 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 471 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
469 } | 472 } |
470 | 473 |
471 // Invokes DrawTree on the compositor. | 474 // Invokes DrawTree on the compositor. |
472 void Draw() { | 475 void Draw() { |
473 compositor_->Draw(false); | 476 compositor()->ScheduleDraw(); |
| 477 WaitForDraw(); |
| 478 } |
| 479 |
| 480 bool WaitForDraw() { |
| 481 DrawWaiter draw_waiter; |
| 482 return draw_waiter.Wait(compositor()); |
474 } | 483 } |
475 | 484 |
476 // CompositorDelegate overrides. | 485 // CompositorDelegate overrides. |
477 virtual void ScheduleDraw() OVERRIDE { | 486 virtual void ScheduleDraw() OVERRIDE { |
478 schedule_draw_invoked_ = true; | 487 DCHECK(!ui::Compositor::WasInitializedWithThread()); |
| 488 if (compositor_) { |
| 489 MessageLoop::current()->PostTask( |
| 490 FROM_HERE, |
| 491 base::Bind(&Compositor::Draw, compositor_->AsWeakPtr(), false)); |
| 492 } |
479 } | 493 } |
480 | 494 |
481 protected: | |
482 // Set to true when ScheduleDraw (CompositorDelegate override) is invoked. | |
483 bool schedule_draw_invoked_; | |
484 | |
485 private: | 495 private: |
486 scoped_ptr<Compositor> compositor_; | 496 scoped_ptr<Compositor> compositor_; |
487 | 497 |
488 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); | 498 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); |
489 }; | 499 }; |
490 | 500 |
491 // L1 | 501 // L1 |
492 // +-- L2 | 502 // +-- L2 |
493 TEST_F(LayerWithDelegateTest, ConvertPointToLayer_Simple) { | 503 TEST_F(LayerWithDelegateTest, ConvertPointToLayer_Simple) { |
494 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, | 504 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 gfx::Point point2_in_l1_coords(5, 5); | 541 gfx::Point point2_in_l1_coords(5, 5); |
532 Layer::ConvertPointToLayer(l1.get(), l3.get(), &point2_in_l1_coords); | 542 Layer::ConvertPointToLayer(l1.get(), l3.get(), &point2_in_l1_coords); |
533 gfx::Point point2_in_l3_coords(-15, -15); | 543 gfx::Point point2_in_l3_coords(-15, -15); |
534 EXPECT_EQ(point2_in_l3_coords, point2_in_l1_coords); | 544 EXPECT_EQ(point2_in_l3_coords, point2_in_l1_coords); |
535 } | 545 } |
536 | 546 |
537 TEST_F(LayerWithRealCompositorTest, MAYBE_Delegate) { | 547 TEST_F(LayerWithRealCompositorTest, MAYBE_Delegate) { |
538 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorBLACK, | 548 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorBLACK, |
539 gfx::Rect(20, 20, 400, 400))); | 549 gfx::Rect(20, 20, 400, 400))); |
540 GetCompositor()->SetRootLayer(l1.get()); | 550 GetCompositor()->SetRootLayer(l1.get()); |
541 WaitForDraw(); | 551 EXPECT_TRUE(WaitForDraw()); |
542 | 552 |
543 TestLayerDelegate delegate; | 553 TestLayerDelegate delegate; |
544 l1->set_delegate(&delegate); | 554 l1->set_delegate(&delegate); |
545 delegate.AddColor(SK_ColorWHITE); | 555 delegate.AddColor(SK_ColorWHITE); |
546 delegate.AddColor(SK_ColorYELLOW); | 556 delegate.AddColor(SK_ColorYELLOW); |
547 delegate.AddColor(SK_ColorGREEN); | 557 delegate.AddColor(SK_ColorGREEN); |
548 | 558 |
549 l1->SchedulePaint(gfx::Rect(0, 0, 400, 400)); | 559 l1->SchedulePaint(gfx::Rect(0, 0, 400, 400)); |
550 WaitForDraw(); | 560 EXPECT_TRUE(WaitForDraw()); |
551 | 561 |
552 EXPECT_EQ(delegate.color_index(), 1); | 562 EXPECT_EQ(delegate.color_index(), 1); |
553 EXPECT_EQ(delegate.paint_size(), l1->bounds().size()); | 563 EXPECT_EQ(delegate.paint_size(), l1->bounds().size()); |
554 | 564 |
555 l1->SchedulePaint(gfx::Rect(10, 10, 200, 200)); | 565 l1->SchedulePaint(gfx::Rect(10, 10, 200, 200)); |
556 WaitForDraw(); | 566 EXPECT_TRUE(WaitForDraw()); |
557 EXPECT_EQ(delegate.color_index(), 2); | 567 EXPECT_EQ(delegate.color_index(), 2); |
558 EXPECT_EQ(delegate.paint_size(), gfx::Size(200, 200)); | 568 EXPECT_EQ(delegate.paint_size(), gfx::Size(200, 200)); |
559 | 569 |
560 l1->SchedulePaint(gfx::Rect(5, 5, 50, 50)); | 570 l1->SchedulePaint(gfx::Rect(5, 5, 50, 50)); |
561 WaitForDraw(); | 571 EXPECT_TRUE(WaitForDraw()); |
562 EXPECT_EQ(delegate.color_index(), 0); | 572 EXPECT_EQ(delegate.color_index(), 0); |
563 EXPECT_EQ(delegate.paint_size(), gfx::Size(50, 50)); | 573 EXPECT_EQ(delegate.paint_size(), gfx::Size(50, 50)); |
564 } | 574 } |
565 | 575 |
566 TEST_F(LayerWithRealCompositorTest, MAYBE_DrawTree) { | 576 TEST_F(LayerWithRealCompositorTest, MAYBE_DrawTree) { |
567 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, | 577 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, |
568 gfx::Rect(20, 20, 400, 400))); | 578 gfx::Rect(20, 20, 400, 400))); |
569 scoped_ptr<Layer> l2(CreateColorLayer(SK_ColorBLUE, | 579 scoped_ptr<Layer> l2(CreateColorLayer(SK_ColorBLUE, |
570 gfx::Rect(10, 10, 350, 350))); | 580 gfx::Rect(10, 10, 350, 350))); |
571 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, | 581 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, |
572 gfx::Rect(10, 10, 100, 100))); | 582 gfx::Rect(10, 10, 100, 100))); |
573 l1->Add(l2.get()); | 583 l1->Add(l2.get()); |
574 l2->Add(l3.get()); | 584 l2->Add(l3.get()); |
575 | 585 |
576 GetCompositor()->SetRootLayer(l1.get()); | 586 GetCompositor()->SetRootLayer(l1.get()); |
577 WaitForDraw(); | 587 EXPECT_TRUE(WaitForDraw()); |
578 | 588 |
579 DrawTreeLayerDelegate d1; | 589 DrawTreeLayerDelegate d1; |
580 l1->set_delegate(&d1); | 590 l1->set_delegate(&d1); |
581 DrawTreeLayerDelegate d2; | 591 DrawTreeLayerDelegate d2; |
582 l2->set_delegate(&d2); | 592 l2->set_delegate(&d2); |
583 DrawTreeLayerDelegate d3; | 593 DrawTreeLayerDelegate d3; |
584 l3->set_delegate(&d3); | 594 l3->set_delegate(&d3); |
585 | 595 |
586 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 596 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
587 WaitForDraw(); | 597 EXPECT_TRUE(WaitForDraw()); |
588 EXPECT_FALSE(d1.painted()); | 598 EXPECT_FALSE(d1.painted()); |
589 EXPECT_TRUE(d2.painted()); | 599 EXPECT_TRUE(d2.painted()); |
590 EXPECT_FALSE(d3.painted()); | 600 EXPECT_FALSE(d3.painted()); |
591 } | 601 } |
592 | 602 |
593 // Tests no-texture Layers. | 603 // Tests no-texture Layers. |
594 // Create this hierarchy: | 604 // Create this hierarchy: |
595 // L1 - red | 605 // L1 - red |
596 // +-- L2 - NO TEXTURE | 606 // +-- L2 - NO TEXTURE |
597 // | +-- L3 - yellow | 607 // | +-- L3 - yellow |
598 // +-- L4 - magenta | 608 // +-- L4 - magenta |
599 // | 609 // |
600 TEST_F(LayerWithRealCompositorTest, MAYBE_HierarchyNoTexture) { | 610 TEST_F(LayerWithRealCompositorTest, MAYBE_HierarchyNoTexture) { |
601 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, | 611 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, |
602 gfx::Rect(20, 20, 400, 400))); | 612 gfx::Rect(20, 20, 400, 400))); |
603 scoped_ptr<Layer> l2(CreateNoTextureLayer(gfx::Rect(10, 10, 350, 350))); | 613 scoped_ptr<Layer> l2(CreateNoTextureLayer(gfx::Rect(10, 10, 350, 350))); |
604 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, | 614 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, |
605 gfx::Rect(5, 5, 25, 25))); | 615 gfx::Rect(5, 5, 25, 25))); |
606 scoped_ptr<Layer> l4(CreateColorLayer(SK_ColorMAGENTA, | 616 scoped_ptr<Layer> l4(CreateColorLayer(SK_ColorMAGENTA, |
607 gfx::Rect(300, 300, 100, 100))); | 617 gfx::Rect(300, 300, 100, 100))); |
608 | 618 |
609 l1->Add(l2.get()); | 619 l1->Add(l2.get()); |
610 l1->Add(l4.get()); | 620 l1->Add(l4.get()); |
611 l2->Add(l3.get()); | 621 l2->Add(l3.get()); |
612 | 622 |
613 GetCompositor()->SetRootLayer(l1.get()); | 623 GetCompositor()->SetRootLayer(l1.get()); |
614 WaitForDraw(); | 624 EXPECT_TRUE(WaitForDraw()); |
615 | 625 |
616 DrawTreeLayerDelegate d2; | 626 DrawTreeLayerDelegate d2; |
617 l2->set_delegate(&d2); | 627 l2->set_delegate(&d2); |
618 DrawTreeLayerDelegate d3; | 628 DrawTreeLayerDelegate d3; |
619 l3->set_delegate(&d3); | 629 l3->set_delegate(&d3); |
620 | 630 |
621 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 631 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
622 l3->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 632 l3->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
623 WaitForDraw(); | 633 EXPECT_TRUE(WaitForDraw()); |
624 | 634 |
625 // |d2| should not have received a paint notification since it has no texture. | 635 // |d2| should not have received a paint notification since it has no texture. |
626 EXPECT_FALSE(d2.painted()); | 636 EXPECT_FALSE(d2.painted()); |
627 // |d3| should have received a paint notification. | 637 // |d3| should have received a paint notification. |
628 EXPECT_TRUE(d3.painted()); | 638 EXPECT_TRUE(d3.painted()); |
629 } | 639 } |
630 | 640 |
631 class LayerWithNullDelegateTest : public LayerWithDelegateTest { | 641 class LayerWithNullDelegateTest : public LayerWithDelegateTest { |
632 public: | 642 public: |
633 LayerWithNullDelegateTest() {} | 643 LayerWithNullDelegateTest() {} |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
781 EXPECT_EQ("2,3,1", GetLayerChildrenNames(*root.get())); | 791 EXPECT_EQ("2,3,1", GetLayerChildrenNames(*root.get())); |
782 } | 792 } |
783 | 793 |
784 // Verifies SetBounds triggers the appropriate painting/drawing. | 794 // Verifies SetBounds triggers the appropriate painting/drawing. |
785 TEST_F(LayerWithNullDelegateTest, SetBoundsSchedulesPaint) { | 795 TEST_F(LayerWithNullDelegateTest, SetBoundsSchedulesPaint) { |
786 scoped_ptr<Layer> l1(CreateTextureLayer(gfx::Rect(0, 0, 200, 200))); | 796 scoped_ptr<Layer> l1(CreateTextureLayer(gfx::Rect(0, 0, 200, 200))); |
787 compositor()->SetRootLayer(l1.get()); | 797 compositor()->SetRootLayer(l1.get()); |
788 | 798 |
789 Draw(); | 799 Draw(); |
790 | 800 |
791 schedule_draw_invoked_ = false; | |
792 l1->SetBounds(gfx::Rect(5, 5, 200, 200)); | 801 l1->SetBounds(gfx::Rect(5, 5, 200, 200)); |
793 | 802 |
794 // The CompositorDelegate (us) should have been told to draw for a move. | 803 // The CompositorDelegate (us) should have been told to draw for a move. |
795 EXPECT_TRUE(schedule_draw_invoked_); | 804 EXPECT_TRUE(WaitForDraw()); |
796 | 805 |
797 schedule_draw_invoked_ = false; | |
798 l1->SetBounds(gfx::Rect(5, 5, 100, 100)); | 806 l1->SetBounds(gfx::Rect(5, 5, 100, 100)); |
799 | 807 |
800 // The CompositorDelegate (us) should have been told to draw for a resize. | 808 // The CompositorDelegate (us) should have been told to draw for a resize. |
801 EXPECT_TRUE(schedule_draw_invoked_); | 809 EXPECT_TRUE(WaitForDraw()); |
802 } | 810 } |
803 | 811 |
804 // Checks that pixels are actually drawn to the screen with a read back. | 812 // Checks that pixels are actually drawn to the screen with a read back. |
805 // Currently disabled on all platforms, see http://crbug.com/148709. | 813 // Currently disabled on all platforms, see http://crbug.com/148709. |
806 TEST_F(LayerWithRealCompositorTest, MAYBE_DrawPixels) { | 814 TEST_F(LayerWithRealCompositorTest, MAYBE_DrawPixels) { |
807 scoped_ptr<Layer> layer(CreateColorLayer(SK_ColorRED, | 815 scoped_ptr<Layer> layer(CreateColorLayer(SK_ColorRED, |
808 gfx::Rect(0, 0, 500, 500))); | 816 gfx::Rect(0, 0, 500, 500))); |
809 scoped_ptr<Layer> layer2(CreateColorLayer(SK_ColorBLUE, | 817 scoped_ptr<Layer> layer2(CreateColorLayer(SK_ColorBLUE, |
810 gfx::Rect(0, 0, 500, 10))); | 818 gfx::Rect(0, 0, 500, 10))); |
811 | 819 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 GetCompositor()->AddObserver(&observer); | 880 GetCompositor()->AddObserver(&observer); |
873 | 881 |
874 // Explicitly called DrawTree should cause the observers to be notified. | 882 // Explicitly called DrawTree should cause the observers to be notified. |
875 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer. | 883 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer. |
876 DrawTree(l1.get()); | 884 DrawTree(l1.get()); |
877 EXPECT_TRUE(observer.notified()); | 885 EXPECT_TRUE(observer.notified()); |
878 | 886 |
879 // As should scheduling a draw and waiting. | 887 // As should scheduling a draw and waiting. |
880 observer.Reset(); | 888 observer.Reset(); |
881 l1->ScheduleDraw(); | 889 l1->ScheduleDraw(); |
882 WaitForDraw(); | 890 EXPECT_TRUE(WaitForDraw()); |
883 EXPECT_TRUE(observer.notified()); | 891 EXPECT_TRUE(observer.notified()); |
884 | 892 |
885 // Moving, but not resizing, a layer should alert the observers. | 893 // Moving, but not resizing, a layer should alert the observers. |
886 observer.Reset(); | 894 observer.Reset(); |
887 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); | 895 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); |
888 WaitForDraw(); | 896 EXPECT_TRUE(WaitForDraw()); |
889 EXPECT_TRUE(observer.notified()); | 897 EXPECT_TRUE(observer.notified()); |
890 | 898 |
891 // So should resizing a layer. | 899 // So should resizing a layer. |
892 observer.Reset(); | 900 observer.Reset(); |
893 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); | 901 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); |
894 WaitForDraw(); | 902 EXPECT_TRUE(WaitForDraw()); |
895 EXPECT_TRUE(observer.notified()); | 903 EXPECT_TRUE(observer.notified()); |
896 | 904 |
897 // Opacity changes should alert the observers. | 905 // Opacity changes should alert the observers. |
898 observer.Reset(); | 906 observer.Reset(); |
899 l2->SetOpacity(0.5f); | 907 l2->SetOpacity(0.5f); |
900 WaitForDraw(); | 908 EXPECT_TRUE(WaitForDraw()); |
901 EXPECT_TRUE(observer.notified()); | 909 EXPECT_TRUE(observer.notified()); |
902 | 910 |
903 // So should setting the opacity back. | 911 // So should setting the opacity back. |
904 observer.Reset(); | 912 observer.Reset(); |
905 l2->SetOpacity(1.0f); | 913 l2->SetOpacity(1.0f); |
906 WaitForDraw(); | 914 EXPECT_TRUE(WaitForDraw()); |
907 EXPECT_TRUE(observer.notified()); | 915 EXPECT_TRUE(observer.notified()); |
908 | 916 |
909 // Setting the transform of a layer should alert the observers. | 917 // Setting the transform of a layer should alert the observers. |
910 observer.Reset(); | 918 observer.Reset(); |
911 gfx::Transform transform; | 919 gfx::Transform transform; |
912 transform.Translate(200.0, 200.0); | 920 transform.Translate(200.0, 200.0); |
913 transform.Rotate(90.0); | 921 transform.Rotate(90.0); |
914 transform.Translate(-200.0, -200.0); | 922 transform.Translate(-200.0, -200.0); |
915 l2->SetTransform(transform); | 923 l2->SetTransform(transform); |
916 WaitForDraw(); | 924 EXPECT_TRUE(WaitForDraw()); |
917 EXPECT_TRUE(observer.notified()); | 925 EXPECT_TRUE(observer.notified()); |
918 | 926 |
919 // A change resulting in an aborted swap buffer should alert the observer | 927 // A change resulting in an aborted swap buffer should alert the observer |
920 // and also signal an abort. | 928 // and also signal an abort. |
921 observer.Reset(); | 929 observer.Reset(); |
922 l2->SetOpacity(0.1f); | 930 l2->SetOpacity(0.1f); |
923 GetCompositor()->OnSwapBuffersAborted(); | 931 GetCompositor()->OnSwapBuffersAborted(); |
924 WaitForDraw(); | 932 EXPECT_TRUE(WaitForDraw()); |
925 EXPECT_TRUE(observer.notified()); | 933 EXPECT_TRUE(observer.notified()); |
926 EXPECT_TRUE(observer.aborted()); | 934 EXPECT_TRUE(observer.aborted()); |
927 | 935 |
928 GetCompositor()->RemoveObserver(&observer); | 936 GetCompositor()->RemoveObserver(&observer); |
929 | 937 |
930 // Opacity changes should no longer alert the removed observer. | 938 // Opacity changes should no longer alert the removed observer. |
931 observer.Reset(); | 939 observer.Reset(); |
932 l2->SetOpacity(0.5f); | 940 l2->SetOpacity(0.5f); |
933 WaitForDraw(); | 941 EXPECT_TRUE(WaitForDraw()); |
934 | 942 |
935 EXPECT_FALSE(observer.notified()); | 943 EXPECT_FALSE(observer.notified()); |
936 } | 944 } |
937 | 945 |
938 // Checks that modifying the hierarchy correctly affects final composite. | 946 // Checks that modifying the hierarchy correctly affects final composite. |
939 TEST_F(LayerWithRealCompositorTest, MAYBE_ModifyHierarchy) { | 947 TEST_F(LayerWithRealCompositorTest, MAYBE_ModifyHierarchy) { |
940 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); | 948 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); |
941 | 949 |
942 // l0 | 950 // l0 |
943 // +-l11 | 951 // +-l11 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1082 gfx::Rect(0, 0, 500, 500))); | 1090 gfx::Rect(0, 0, 500, 500))); |
1083 SchedulePaintLayerDelegate child_delegate; | 1091 SchedulePaintLayerDelegate child_delegate; |
1084 scoped_ptr<Layer> child(CreateColorLayer(SK_ColorBLUE, | 1092 scoped_ptr<Layer> child(CreateColorLayer(SK_ColorBLUE, |
1085 gfx::Rect(0, 0, 200, 200))); | 1093 gfx::Rect(0, 0, 200, 200))); |
1086 child_delegate.set_layer(child.get()); | 1094 child_delegate.set_layer(child.get()); |
1087 | 1095 |
1088 root->Add(child.get()); | 1096 root->Add(child.get()); |
1089 | 1097 |
1090 SchedulePaintForLayer(root.get()); | 1098 SchedulePaintForLayer(root.get()); |
1091 DrawTree(root.get()); | 1099 DrawTree(root.get()); |
1092 schedule_draw_invoked_ = false; | |
1093 child->SchedulePaint(gfx::Rect(0, 0, 20, 20)); | 1100 child->SchedulePaint(gfx::Rect(0, 0, 20, 20)); |
1094 child_delegate.GetPaintCountAndClear(); | 1101 child_delegate.GetPaintCountAndClear(); |
1095 EXPECT_TRUE(schedule_draw_invoked_); | 1102 |
1096 schedule_draw_invoked_ = false; | |
1097 // Set a rect so that when OnPaintLayer() is invoked SchedulePaint is invoked | 1103 // Set a rect so that when OnPaintLayer() is invoked SchedulePaint is invoked |
1098 // again. | 1104 // again. |
1099 child_delegate.SetSchedulePaintRect(gfx::Rect(10, 10, 30, 30)); | 1105 child_delegate.SetSchedulePaintRect(gfx::Rect(10, 10, 30, 30)); |
1100 DrawTree(root.get()); | 1106 EXPECT_TRUE(WaitForDraw()); |
1101 // |child| should have been painted once. | 1107 // |child| should have been painted once. |
1102 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); | 1108 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); |
1103 // ScheduleDraw() should have been invoked. | 1109 |
1104 EXPECT_TRUE(schedule_draw_invoked_); | |
1105 // Because SchedulePaint() was invoked from OnPaintLayer() |child| should | 1110 // Because SchedulePaint() was invoked from OnPaintLayer() |child| should |
1106 // still need to be painted. | 1111 // still need to be painted. |
1107 DrawTree(root.get()); | 1112 EXPECT_TRUE(WaitForDraw()); |
1108 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); | 1113 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); |
1109 EXPECT_TRUE(child_delegate.last_clip_rect().Contains( | 1114 EXPECT_TRUE(child_delegate.last_clip_rect().Contains( |
1110 gfx::Rect(10, 10, 30, 30))); | 1115 gfx::Rect(10, 10, 30, 30))); |
1111 } | 1116 } |
1112 | 1117 |
1113 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleUpDown) { | 1118 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleUpDown) { |
1114 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, | 1119 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, |
1115 gfx::Rect(10, 20, 200, 220))); | 1120 gfx::Rect(10, 20, 200, 220))); |
1116 TestLayerDelegate root_delegate; | 1121 TestLayerDelegate root_delegate; |
1117 root_delegate.AddColor(SK_ColorWHITE); | 1122 root_delegate.AddColor(SK_ColorWHITE); |
1118 root->set_delegate(&root_delegate); | 1123 root->set_delegate(&root_delegate); |
1119 | 1124 |
1120 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, | 1125 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, |
1121 gfx::Rect(10, 20, 140, 180))); | 1126 gfx::Rect(10, 20, 140, 180))); |
1122 TestLayerDelegate l1_delegate; | 1127 TestLayerDelegate l1_delegate; |
1123 l1_delegate.AddColor(SK_ColorWHITE); | 1128 l1_delegate.AddColor(SK_ColorWHITE); |
1124 l1->set_delegate(&l1_delegate); | 1129 l1->set_delegate(&l1_delegate); |
1125 | 1130 |
1126 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); | 1131 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); |
1127 GetCompositor()->SetRootLayer(root.get()); | 1132 GetCompositor()->SetRootLayer(root.get()); |
1128 root->Add(l1.get()); | 1133 root->Add(l1.get()); |
1129 WaitForDraw(); | 1134 EXPECT_TRUE(WaitForDraw()); |
1130 | 1135 |
1131 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); | 1136 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); |
1132 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); | 1137 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); |
1133 gfx::Size size_in_pixel = root->cc_layer()->bounds(); | 1138 gfx::Size size_in_pixel = root->cc_layer()->bounds(); |
1134 EXPECT_EQ("200x220", size_in_pixel.ToString()); | 1139 EXPECT_EQ("200x220", size_in_pixel.ToString()); |
1135 size_in_pixel = l1->cc_layer()->bounds(); | 1140 size_in_pixel = l1->cc_layer()->bounds(); |
1136 EXPECT_EQ("140x180", size_in_pixel.ToString()); | 1141 EXPECT_EQ("140x180", size_in_pixel.ToString()); |
1137 // No scale change, so no scale notification. | 1142 // No scale change, so no scale notification. |
1138 EXPECT_EQ(0.0f, root_delegate.device_scale_factor()); | 1143 EXPECT_EQ(0.0f, root_delegate.device_scale_factor()); |
1139 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); | 1144 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); |
1140 | 1145 |
1141 EXPECT_EQ("200x220", root_delegate.paint_size().ToString()); | 1146 EXPECT_EQ("200x220", root_delegate.paint_size().ToString()); |
1142 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); | 1147 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); |
1143 | 1148 |
1144 // Scale up to 2.0. Changing scale doesn't change the bounds in DIP. | 1149 // Scale up to 2.0. Changing scale doesn't change the bounds in DIP. |
1145 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); | 1150 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); |
1146 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); | 1151 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); |
1147 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); | 1152 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); |
1148 // Pixel size must have been scaled up. | 1153 // Pixel size must have been scaled up. |
1149 size_in_pixel = root->cc_layer()->bounds(); | 1154 size_in_pixel = root->cc_layer()->bounds(); |
1150 EXPECT_EQ("400x440", size_in_pixel.ToString()); | 1155 EXPECT_EQ("400x440", size_in_pixel.ToString()); |
1151 size_in_pixel = l1->cc_layer()->bounds(); | 1156 size_in_pixel = l1->cc_layer()->bounds(); |
1152 EXPECT_EQ("280x360", size_in_pixel.ToString()); | 1157 EXPECT_EQ("280x360", size_in_pixel.ToString()); |
1153 // New scale factor must have been notified. | 1158 // New scale factor must have been notified. |
1154 EXPECT_EQ(2.0f, root_delegate.device_scale_factor()); | 1159 EXPECT_EQ(2.0f, root_delegate.device_scale_factor()); |
1155 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); | 1160 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); |
1156 | 1161 |
1157 // Canvas size must have been scaled down up. | 1162 // Canvas size must have been scaled down up. |
1158 WaitForDraw(); | 1163 EXPECT_TRUE(WaitForDraw()); |
1159 EXPECT_EQ("400x440", root_delegate.paint_size().ToString()); | 1164 EXPECT_EQ("400x440", root_delegate.paint_size().ToString()); |
1160 EXPECT_EQ("2.0 2.0", root_delegate.ToScaleString()); | 1165 EXPECT_EQ("2.0 2.0", root_delegate.ToScaleString()); |
1161 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); | 1166 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); |
1162 EXPECT_EQ("2.0 2.0", l1_delegate.ToScaleString()); | 1167 EXPECT_EQ("2.0 2.0", l1_delegate.ToScaleString()); |
1163 | 1168 |
1164 // Scale down back to 1.0f. | 1169 // Scale down back to 1.0f. |
1165 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); | 1170 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); |
1166 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); | 1171 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); |
1167 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); | 1172 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); |
1168 // Pixel size must have been scaled down. | 1173 // Pixel size must have been scaled down. |
1169 size_in_pixel = root->cc_layer()->bounds(); | 1174 size_in_pixel = root->cc_layer()->bounds(); |
1170 EXPECT_EQ("200x220", size_in_pixel.ToString()); | 1175 EXPECT_EQ("200x220", size_in_pixel.ToString()); |
1171 size_in_pixel = l1->cc_layer()->bounds(); | 1176 size_in_pixel = l1->cc_layer()->bounds(); |
1172 EXPECT_EQ("140x180", size_in_pixel.ToString()); | 1177 EXPECT_EQ("140x180", size_in_pixel.ToString()); |
1173 // New scale factor must have been notified. | 1178 // New scale factor must have been notified. |
1174 EXPECT_EQ(1.0f, root_delegate.device_scale_factor()); | 1179 EXPECT_EQ(1.0f, root_delegate.device_scale_factor()); |
1175 EXPECT_EQ(1.0f, l1_delegate.device_scale_factor()); | 1180 EXPECT_EQ(1.0f, l1_delegate.device_scale_factor()); |
1176 | 1181 |
1177 // Canvas size must have been scaled down too. | 1182 // Canvas size must have been scaled down too. |
1178 WaitForDraw(); | 1183 EXPECT_TRUE(WaitForDraw()); |
1179 EXPECT_EQ("200x220", root_delegate.paint_size().ToString()); | 1184 EXPECT_EQ("200x220", root_delegate.paint_size().ToString()); |
1180 EXPECT_EQ("1.0 1.0", root_delegate.ToScaleString()); | 1185 EXPECT_EQ("1.0 1.0", root_delegate.ToScaleString()); |
1181 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); | 1186 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); |
1182 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); | 1187 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); |
1183 | 1188 |
1184 root_delegate.reset(); | 1189 root_delegate.reset(); |
1185 l1_delegate.reset(); | 1190 l1_delegate.reset(); |
1186 // Just changing the size shouldn't notify the scale change nor | 1191 // Just changing the size shouldn't notify the scale change nor |
1187 // trigger repaint. | 1192 // trigger repaint. |
1188 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(1000, 1000)); | 1193 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(1000, 1000)); |
1189 // No scale change, so no scale notification. | 1194 // No scale change, so no scale notification. |
1190 EXPECT_EQ(0.0f, root_delegate.device_scale_factor()); | 1195 EXPECT_EQ(0.0f, root_delegate.device_scale_factor()); |
1191 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); | 1196 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); |
1192 WaitForDraw(); | 1197 EXPECT_TRUE(WaitForDraw()); |
1193 EXPECT_EQ("0x0", root_delegate.paint_size().ToString()); | 1198 EXPECT_EQ("0x0", root_delegate.paint_size().ToString()); |
1194 EXPECT_EQ("0.0 0.0", root_delegate.ToScaleString()); | 1199 EXPECT_EQ("0.0 0.0", root_delegate.ToScaleString()); |
1195 EXPECT_EQ("0x0", l1_delegate.paint_size().ToString()); | 1200 EXPECT_EQ("0x0", l1_delegate.paint_size().ToString()); |
1196 EXPECT_EQ("0.0 0.0", l1_delegate.ToScaleString()); | 1201 EXPECT_EQ("0.0 0.0", l1_delegate.ToScaleString()); |
1197 } | 1202 } |
1198 | 1203 |
1199 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleReparent) { | 1204 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleReparent) { |
1200 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, | 1205 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, |
1201 gfx::Rect(10, 20, 200, 220))); | 1206 gfx::Rect(10, 20, 200, 220))); |
1202 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, | 1207 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, |
1203 gfx::Rect(10, 20, 140, 180))); | 1208 gfx::Rect(10, 20, 140, 180))); |
1204 TestLayerDelegate l1_delegate; | 1209 TestLayerDelegate l1_delegate; |
1205 l1_delegate.AddColor(SK_ColorWHITE); | 1210 l1_delegate.AddColor(SK_ColorWHITE); |
1206 l1->set_delegate(&l1_delegate); | 1211 l1->set_delegate(&l1_delegate); |
1207 | 1212 |
1208 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); | 1213 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(500, 500)); |
1209 GetCompositor()->SetRootLayer(root.get()); | 1214 GetCompositor()->SetRootLayer(root.get()); |
1210 WaitForDraw(); | 1215 EXPECT_TRUE(WaitForDraw()); |
1211 | 1216 |
1212 root->Add(l1.get()); | 1217 root->Add(l1.get()); |
1213 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); | 1218 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); |
1214 gfx::Size size_in_pixel = l1->cc_layer()->bounds(); | 1219 gfx::Size size_in_pixel = l1->cc_layer()->bounds(); |
1215 EXPECT_EQ("140x180", size_in_pixel.ToString()); | 1220 EXPECT_EQ("140x180", size_in_pixel.ToString()); |
1216 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); | 1221 EXPECT_EQ(0.0f, l1_delegate.device_scale_factor()); |
1217 | 1222 |
1218 WaitForDraw(); | 1223 EXPECT_TRUE(WaitForDraw()); |
1219 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); | 1224 EXPECT_EQ("140x180", l1_delegate.paint_size().ToString()); |
1220 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); | 1225 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); |
1221 | 1226 |
1222 // Remove l1 from root and change the scale. | 1227 // Remove l1 from root and change the scale. |
1223 root->Remove(l1.get()); | 1228 root->Remove(l1.get()); |
1224 EXPECT_EQ(NULL, l1->parent()); | 1229 EXPECT_EQ(NULL, l1->parent()); |
1225 EXPECT_EQ(NULL, l1->GetCompositor()); | 1230 EXPECT_EQ(NULL, l1->GetCompositor()); |
1226 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); | 1231 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); |
1227 // Sanity check on root and l1. | 1232 // Sanity check on root and l1. |
1228 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); | 1233 EXPECT_EQ("10,20 200x220", root->bounds().ToString()); |
1229 size_in_pixel = l1->cc_layer()->bounds(); | 1234 size_in_pixel = l1->cc_layer()->bounds(); |
1230 EXPECT_EQ("140x180", size_in_pixel.ToString()); | 1235 EXPECT_EQ("140x180", size_in_pixel.ToString()); |
1231 | 1236 |
1232 | 1237 |
1233 root->Add(l1.get()); | 1238 root->Add(l1.get()); |
1234 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); | 1239 EXPECT_EQ("10,20 140x180", l1->bounds().ToString()); |
1235 size_in_pixel = l1->cc_layer()->bounds(); | 1240 size_in_pixel = l1->cc_layer()->bounds(); |
1236 EXPECT_EQ("280x360", size_in_pixel.ToString()); | 1241 EXPECT_EQ("280x360", size_in_pixel.ToString()); |
1237 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); | 1242 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); |
1238 WaitForDraw(); | 1243 EXPECT_TRUE(WaitForDraw()); |
1239 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); | 1244 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); |
1240 EXPECT_EQ("2.0 2.0", l1_delegate.ToScaleString()); | 1245 EXPECT_EQ("2.0 2.0", l1_delegate.ToScaleString()); |
1241 } | 1246 } |
1242 | 1247 |
1243 // Tests layer::set_scale_content(false). | 1248 // Tests layer::set_scale_content(false). |
1244 TEST_F(LayerWithRealCompositorTest, MAYBE_NoScaleCanvas) { | 1249 TEST_F(LayerWithRealCompositorTest, MAYBE_NoScaleCanvas) { |
1245 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, | 1250 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, |
1246 gfx::Rect(10, 20, 200, 220))); | 1251 gfx::Rect(10, 20, 200, 220))); |
1247 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, | 1252 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorWHITE, |
1248 gfx::Rect(10, 20, 140, 180))); | 1253 gfx::Rect(10, 20, 140, 180))); |
1249 l1->set_scale_content(false); | 1254 l1->set_scale_content(false); |
1250 root->Add(l1.get()); | 1255 root->Add(l1.get()); |
1251 TestLayerDelegate l1_delegate; | 1256 TestLayerDelegate l1_delegate; |
1252 l1_delegate.AddColor(SK_ColorWHITE); | 1257 l1_delegate.AddColor(SK_ColorWHITE); |
1253 l1->set_delegate(&l1_delegate); | 1258 l1->set_delegate(&l1_delegate); |
1254 | 1259 |
1255 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); | 1260 GetCompositor()->SetScaleAndSize(2.0f, gfx::Size(500, 500)); |
1256 GetCompositor()->SetRootLayer(root.get()); | 1261 GetCompositor()->SetRootLayer(root.get()); |
1257 // Scale factor change is notified regardless of scale_content flag. | 1262 // Scale factor change is notified regardless of scale_content flag. |
1258 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); | 1263 EXPECT_EQ(2.0f, l1_delegate.device_scale_factor()); |
1259 | 1264 |
1260 WaitForDraw(); | 1265 EXPECT_TRUE(WaitForDraw()); |
1261 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); | 1266 EXPECT_EQ("280x360", l1_delegate.paint_size().ToString()); |
1262 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); | 1267 EXPECT_EQ("1.0 1.0", l1_delegate.ToScaleString()); |
1263 } | 1268 } |
1264 | 1269 |
1265 // Verifies that when changing bounds on a layer that is invisible, and then | 1270 // Verifies that when changing bounds on a layer that is invisible, and then |
1266 // made visible, the right thing happens: | 1271 // made visible, the right thing happens: |
1267 // - if just a move, then no painting should happen. | 1272 // - if just a move, then no painting should happen. |
1268 // - if a resize, the layer should be repainted. | 1273 // - if a resize, the layer should be repainted. |
1269 TEST_F(LayerWithDelegateTest, SetBoundsWhenInvisible) { | 1274 TEST_F(LayerWithDelegateTest, SetBoundsWhenInvisible) { |
1270 scoped_ptr<Layer> root(CreateNoTextureLayer(gfx::Rect(0, 0, 1000, 1000))); | 1275 scoped_ptr<Layer> root(CreateNoTextureLayer(gfx::Rect(0, 0, 1000, 1000))); |
1271 | 1276 |
1272 scoped_ptr<Layer> child(CreateLayer(LAYER_TEXTURED)); | 1277 scoped_ptr<Layer> child(CreateLayer(LAYER_TEXTURED)); |
1273 child->SetBounds(gfx::Rect(0, 0, 500, 500)); | 1278 child->SetBounds(gfx::Rect(0, 0, 500, 500)); |
1274 DrawTreeLayerDelegate delegate; | 1279 DrawTreeLayerDelegate delegate; |
1275 child->set_delegate(&delegate); | 1280 child->set_delegate(&delegate); |
1276 root->Add(child.get()); | 1281 root->Add(child.get()); |
1277 | 1282 |
1278 // Paint once for initial damage. | 1283 // Paint once for initial damage. |
1279 child->SetVisible(true); | 1284 child->SetVisible(true); |
1280 DrawTree(root.get()); | 1285 DrawTree(root.get()); |
1281 | 1286 |
1282 // Reset into invisible state. | 1287 // Reset into invisible state. |
1283 child->SetVisible(false); | 1288 child->SetVisible(false); |
1284 DrawTree(root.get()); | 1289 DrawTree(root.get()); |
1285 schedule_draw_invoked_ = false; | |
1286 delegate.Reset(); | 1290 delegate.Reset(); |
1287 | 1291 |
1288 // Move layer. | 1292 // Move layer. |
1289 child->SetBounds(gfx::Rect(200, 200, 500, 500)); | 1293 child->SetBounds(gfx::Rect(200, 200, 500, 500)); |
1290 child->SetVisible(true); | 1294 child->SetVisible(true); |
1291 EXPECT_TRUE(schedule_draw_invoked_); | 1295 EXPECT_TRUE(WaitForDraw()); |
1292 DrawTree(root.get()); | 1296 DrawTree(root.get()); |
1293 EXPECT_FALSE(delegate.painted()); | 1297 EXPECT_FALSE(delegate.painted()); |
1294 | 1298 |
1295 // Reset into invisible state. | 1299 // Reset into invisible state. |
1296 child->SetVisible(false); | 1300 child->SetVisible(false); |
1297 DrawTree(root.get()); | 1301 DrawTree(root.get()); |
1298 schedule_draw_invoked_ = false; | |
1299 delegate.Reset(); | 1302 delegate.Reset(); |
1300 | 1303 |
1301 // Resize layer. | 1304 // Resize layer. |
1302 child->SetBounds(gfx::Rect(200, 200, 400, 400)); | 1305 child->SetBounds(gfx::Rect(200, 200, 400, 400)); |
1303 child->SetVisible(true); | 1306 child->SetVisible(true); |
1304 EXPECT_TRUE(schedule_draw_invoked_); | 1307 EXPECT_TRUE(WaitForDraw()); |
1305 DrawTree(root.get()); | 1308 DrawTree(root.get()); |
1306 EXPECT_TRUE(delegate.painted()); | 1309 EXPECT_TRUE(delegate.painted()); |
1307 } | 1310 } |
1308 | 1311 |
1309 static scoped_ptr<cc::DelegatedFrameData> MakeFrameData(gfx::Size size) { | 1312 static scoped_ptr<cc::DelegatedFrameData> MakeFrameData(gfx::Size size) { |
1310 scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); | 1313 scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); |
1311 scoped_ptr<cc::RenderPass> render_pass(cc::RenderPass::Create()); | 1314 scoped_ptr<cc::RenderPass> render_pass(cc::RenderPass::Create()); |
1312 render_pass->SetNew(cc::RenderPass::Id(1, 1), | 1315 render_pass->SetNew(cc::RenderPass::Id(1, 1), |
1313 gfx::Rect(size), | 1316 gfx::Rect(size), |
1314 gfx::RectF(), | 1317 gfx::RectF(), |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1421 l1->SetOpacity(0.5f); | 1424 l1->SetOpacity(0.5f); |
1422 | 1425 |
1423 // Change l1's cc::Layer. | 1426 // Change l1's cc::Layer. |
1424 l1->SwitchCCLayerForTest(); | 1427 l1->SwitchCCLayerForTest(); |
1425 | 1428 |
1426 // Ensure that the opacity animation completed. | 1429 // Ensure that the opacity animation completed. |
1427 EXPECT_FLOAT_EQ(l1->opacity(), 0.5f); | 1430 EXPECT_FLOAT_EQ(l1->opacity(), 0.5f); |
1428 } | 1431 } |
1429 | 1432 |
1430 } // namespace ui | 1433 } // namespace ui |
OLD | NEW |