| 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/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 122 |
| 123 Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { | 123 Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { |
| 124 Layer* layer = CreateLayer(LAYER_NOT_DRAWN); | 124 Layer* layer = CreateLayer(LAYER_NOT_DRAWN); |
| 125 layer->SetBounds(bounds); | 125 layer->SetBounds(bounds); |
| 126 return layer; | 126 return layer; |
| 127 } | 127 } |
| 128 | 128 |
| 129 void DrawTree(Layer* root) { | 129 void DrawTree(Layer* root) { |
| 130 GetCompositor()->SetRootLayer(root); | 130 GetCompositor()->SetRootLayer(root); |
| 131 GetCompositor()->ScheduleDraw(); | 131 GetCompositor()->ScheduleDraw(); |
| 132 WaitForDraw(); | 132 WaitForSwap(); |
| 133 } | 133 } |
| 134 | 134 |
| 135 void ReadPixels(SkBitmap* bitmap) { | 135 void ReadPixels(SkBitmap* bitmap) { |
| 136 ReadPixels(bitmap, gfx::Rect(GetCompositor()->size())); | 136 ReadPixels(bitmap, gfx::Rect(GetCompositor()->size())); |
| 137 } | 137 } |
| 138 | 138 |
| 139 void ReadPixels(SkBitmap* bitmap, gfx::Rect source_rect) { | 139 void ReadPixels(SkBitmap* bitmap, gfx::Rect source_rect) { |
| 140 scoped_refptr<ReadbackHolder> holder(new ReadbackHolder); | 140 scoped_refptr<ReadbackHolder> holder(new ReadbackHolder); |
| 141 scoped_ptr<cc::CopyOutputRequest> request = | 141 scoped_ptr<cc::CopyOutputRequest> request = |
| 142 cc::CopyOutputRequest::CreateBitmapRequest( | 142 cc::CopyOutputRequest::CreateBitmapRequest( |
| 143 base::Bind(&ReadbackHolder::OutputRequestCallback, holder)); | 143 base::Bind(&ReadbackHolder::OutputRequestCallback, holder)); |
| 144 request->set_area(source_rect); | 144 request->set_area(source_rect); |
| 145 | 145 |
| 146 GetCompositor()->root_layer()->RequestCopyOfOutput(request.Pass()); | 146 GetCompositor()->root_layer()->RequestCopyOfOutput(request.Pass()); |
| 147 | 147 |
| 148 // Wait for copy response. This needs to wait as the compositor could | 148 // Wait for copy response. This needs to wait as the compositor could |
| 149 // be in the middle of a draw right now, and the commit with the | 149 // be in the middle of a draw right now, and the commit with the |
| 150 // copy output request may not be done on the first draw. | 150 // copy output request may not be done on the first draw. |
| 151 for (int i = 0; i < 2; i++) { | 151 for (int i = 0; i < 2; i++) { |
| 152 GetCompositor()->ScheduleDraw(); | 152 GetCompositor()->ScheduleFullRedraw(); |
| 153 WaitForDraw(); | 153 WaitForDraw(); |
| 154 } | 154 } |
| 155 | 155 |
| 156 // Waits for the callback to finish run and return result. | 156 // Waits for the callback to finish run and return result. |
| 157 holder->WaitForReadback(); | 157 holder->WaitForReadback(); |
| 158 | 158 |
| 159 *bitmap = holder->result(); | 159 *bitmap = holder->result(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void WaitForDraw() { ui::DrawWaiterForTest::Wait(GetCompositor()); } | 162 void WaitForDraw() { |
| 163 ui::DrawWaiterForTest::WaitForCompositingStarted(GetCompositor()); |
| 164 } |
| 165 |
| 166 void WaitForSwap() { |
| 167 DrawWaiterForTest::WaitForCompositingEnded(GetCompositor()); |
| 168 } |
| 163 | 169 |
| 164 void WaitForCommit() { | 170 void WaitForCommit() { |
| 165 ui::DrawWaiterForTest::WaitForCommit(GetCompositor()); | 171 ui::DrawWaiterForTest::WaitForCommit(GetCompositor()); |
| 166 } | 172 } |
| 167 | 173 |
| 168 // Invalidates the entire contents of the layer. | 174 // Invalidates the entire contents of the layer. |
| 169 void SchedulePaintForLayer(Layer* layer) { | 175 void SchedulePaintForLayer(Layer* layer) { |
| 170 layer->SchedulePaint( | 176 layer->SchedulePaint( |
| 171 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 177 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| 172 } | 178 } |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 layer->SchedulePaint( | 450 layer->SchedulePaint( |
| 445 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 451 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| 446 } | 452 } |
| 447 | 453 |
| 448 // Invokes DrawTree on the compositor. | 454 // Invokes DrawTree on the compositor. |
| 449 void Draw() { | 455 void Draw() { |
| 450 compositor()->ScheduleDraw(); | 456 compositor()->ScheduleDraw(); |
| 451 WaitForDraw(); | 457 WaitForDraw(); |
| 452 } | 458 } |
| 453 | 459 |
| 454 void WaitForDraw() { DrawWaiterForTest::Wait(compositor()); } | 460 void WaitForDraw() { |
| 461 DrawWaiterForTest::WaitForCompositingStarted(compositor()); |
| 462 } |
| 455 | 463 |
| 456 void WaitForCommit() { | 464 void WaitForCommit() { |
| 457 DrawWaiterForTest::WaitForCommit(compositor()); | 465 DrawWaiterForTest::WaitForCommit(compositor()); |
| 458 } | 466 } |
| 459 | 467 |
| 460 private: | 468 private: |
| 461 scoped_ptr<TestCompositorHost> compositor_host_; | 469 scoped_ptr<TestCompositorHost> compositor_host_; |
| 462 | 470 |
| 463 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); | 471 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); |
| 464 }; | 472 }; |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 | 1028 |
| 1021 // ScheduleDraw without any visible change should cause a commit. | 1029 // ScheduleDraw without any visible change should cause a commit. |
| 1022 observer.Reset(); | 1030 observer.Reset(); |
| 1023 l1->ScheduleDraw(); | 1031 l1->ScheduleDraw(); |
| 1024 WaitForCommit(); | 1032 WaitForCommit(); |
| 1025 EXPECT_TRUE(observer.committed()); | 1033 EXPECT_TRUE(observer.committed()); |
| 1026 | 1034 |
| 1027 // Moving, but not resizing, a layer should alert the observers. | 1035 // Moving, but not resizing, a layer should alert the observers. |
| 1028 observer.Reset(); | 1036 observer.Reset(); |
| 1029 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); | 1037 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); |
| 1030 WaitForDraw(); | 1038 WaitForSwap(); |
| 1031 EXPECT_TRUE(observer.notified()); | 1039 EXPECT_TRUE(observer.notified()); |
| 1032 | 1040 |
| 1033 // So should resizing a layer. | 1041 // So should resizing a layer. |
| 1034 observer.Reset(); | 1042 observer.Reset(); |
| 1035 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); | 1043 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 1036 WaitForDraw(); | 1044 WaitForSwap(); |
| 1037 EXPECT_TRUE(observer.notified()); | 1045 EXPECT_TRUE(observer.notified()); |
| 1038 | 1046 |
| 1039 // Opacity changes should alert the observers. | 1047 // Opacity changes should alert the observers. |
| 1040 observer.Reset(); | 1048 observer.Reset(); |
| 1041 l2->SetOpacity(0.5f); | 1049 l2->SetOpacity(0.5f); |
| 1042 WaitForDraw(); | 1050 WaitForSwap(); |
| 1043 EXPECT_TRUE(observer.notified()); | 1051 EXPECT_TRUE(observer.notified()); |
| 1044 | 1052 |
| 1045 // So should setting the opacity back. | 1053 // So should setting the opacity back. |
| 1046 observer.Reset(); | 1054 observer.Reset(); |
| 1047 l2->SetOpacity(1.0f); | 1055 l2->SetOpacity(1.0f); |
| 1048 WaitForDraw(); | 1056 WaitForSwap(); |
| 1049 EXPECT_TRUE(observer.notified()); | 1057 EXPECT_TRUE(observer.notified()); |
| 1050 | 1058 |
| 1051 // Setting the transform of a layer should alert the observers. | 1059 // Setting the transform of a layer should alert the observers. |
| 1052 observer.Reset(); | 1060 observer.Reset(); |
| 1053 gfx::Transform transform; | 1061 gfx::Transform transform; |
| 1054 transform.Translate(200.0, 200.0); | 1062 transform.Translate(200.0, 200.0); |
| 1055 transform.Rotate(90.0); | 1063 transform.Rotate(90.0); |
| 1056 transform.Translate(-200.0, -200.0); | 1064 transform.Translate(-200.0, -200.0); |
| 1057 l2->SetTransform(transform); | 1065 l2->SetTransform(transform); |
| 1058 WaitForDraw(); | 1066 WaitForSwap(); |
| 1059 EXPECT_TRUE(observer.notified()); | 1067 EXPECT_TRUE(observer.notified()); |
| 1060 | 1068 |
| 1061 // A change resulting in an aborted swap buffer should alert the observer | 1069 // A change resulting in an aborted swap buffer should alert the observer |
| 1062 // and also signal an abort. | 1070 // and also signal an abort. |
| 1063 observer.Reset(); | 1071 observer.Reset(); |
| 1064 l2->SetOpacity(0.1f); | 1072 l2->SetOpacity(0.1f); |
| 1065 GetCompositor()->DidAbortSwapBuffers(); | 1073 GetCompositor()->DidAbortSwapBuffers(); |
| 1066 WaitForDraw(); | 1074 WaitForSwap(); |
| 1067 EXPECT_TRUE(observer.notified()); | 1075 EXPECT_TRUE(observer.notified()); |
| 1068 EXPECT_TRUE(observer.aborted()); | 1076 EXPECT_TRUE(observer.aborted()); |
| 1069 | 1077 |
| 1070 GetCompositor()->RemoveObserver(&observer); | 1078 GetCompositor()->RemoveObserver(&observer); |
| 1071 | 1079 |
| 1072 // Opacity changes should no longer alert the removed observer. | 1080 // Opacity changes should no longer alert the removed observer. |
| 1073 observer.Reset(); | 1081 observer.Reset(); |
| 1074 l2->SetOpacity(0.5f); | 1082 l2->SetOpacity(0.5f); |
| 1075 WaitForDraw(); | 1083 WaitForSwap(); |
| 1076 | 1084 |
| 1077 EXPECT_FALSE(observer.notified()); | 1085 EXPECT_FALSE(observer.notified()); |
| 1078 } | 1086 } |
| 1079 | 1087 |
| 1080 // Checks that modifying the hierarchy correctly affects final composite. | 1088 // Checks that modifying the hierarchy correctly affects final composite. |
| 1081 TEST_F(LayerWithRealCompositorTest, ModifyHierarchy) { | 1089 TEST_F(LayerWithRealCompositorTest, ModifyHierarchy) { |
| 1082 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); | 1090 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); |
| 1083 | 1091 |
| 1084 // l0 | 1092 // l0 |
| 1085 // +-l11 | 1093 // +-l11 |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1745 MakeFrameData(gfx::Size(10, 10)))); | 1753 MakeFrameData(gfx::Size(10, 10)))); |
| 1746 layer->SetShowDelegatedContent(frame_provider.get(), gfx::Size(10, 10)); | 1754 layer->SetShowDelegatedContent(frame_provider.get(), gfx::Size(10, 10)); |
| 1747 | 1755 |
| 1748 EXPECT_FALSE(delegate.delegated_frame_damage_called()); | 1756 EXPECT_FALSE(delegate.delegated_frame_damage_called()); |
| 1749 layer->OnDelegatedFrameDamage(damage_rect); | 1757 layer->OnDelegatedFrameDamage(damage_rect); |
| 1750 EXPECT_TRUE(delegate.delegated_frame_damage_called()); | 1758 EXPECT_TRUE(delegate.delegated_frame_damage_called()); |
| 1751 EXPECT_EQ(damage_rect, delegate.delegated_frame_damage_rect()); | 1759 EXPECT_EQ(damage_rect, delegate.delegated_frame_damage_rect()); |
| 1752 } | 1760 } |
| 1753 | 1761 |
| 1754 } // namespace ui | 1762 } // namespace ui |
| OLD | NEW |