| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 #include "ui/gfx/canvas_skia.h" | 9 #include "ui/gfx/canvas_skia.h" |
| 10 #include "ui/gfx/compositor/compositor_observer.h" | 10 #include "ui/gfx/compositor/compositor_observer.h" |
| 11 #include "ui/gfx/compositor/layer.h" | 11 #include "ui/gfx/compositor/layer.h" |
| 12 #include "ui/gfx/compositor/test_compositor.h" | 12 #include "ui/gfx/compositor/test_compositor.h" |
| 13 #include "ui/gfx/compositor/test_compositor_host.h" | 13 #include "ui/gfx/compositor/test_compositor_host.h" |
| 14 | 14 |
| 15 namespace ui { | 15 namespace ui { |
| 16 | 16 |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 // There are three test classes in here that configure the Compositor and | 19 // There are three test classes in here that configure the Compositor and |
| 20 // Layer's slightly differently: | 20 // Layer's slightly differently: |
| 21 // - LayerWithNullDelegateTest uses TestCompositor and NullLayerDelegate as the | 21 // - LayerWithNullDelegateTest uses TestCompositor and NullLayerDelegate as the |
| 22 // LayerDelegate. This is typically the base class you want to use. | 22 // LayerDelegate. This is typically the base class you want to use. |
| 23 // - LayerWithDelegateTest uses TestCompositor and does not set a LayerDelegate | 23 // - LayerWithDelegateTest uses TestCompositor and does not set a LayerDelegate |
| 24 // on the delegates. | 24 // on the delegates. |
| 25 // - LayerWithRealCompositorTest when a real compositor is required for testing. | 25 // - LayerWithRealCompositorTest when a real compositor is required for testing. |
| 26 // - Slow because they bring up a window and run the real compositor. This | 26 // - Slow because they bring up a window and run the real compositor. This |
| 27 // is typically not what you want. | 27 // is typically not what you want. |
| 28 | |
| 29 class ColoredLayer : public Layer, public LayerDelegate { | |
| 30 public: | |
| 31 ColoredLayer(Compositor* compositor, SkColor color) | |
| 32 : Layer(compositor, Layer::LAYER_HAS_TEXTURE), | |
| 33 color_(color) { | |
| 34 set_delegate(this); | |
| 35 } | |
| 36 | |
| 37 virtual ~ColoredLayer() { } | |
| 38 | |
| 39 // Overridden from LayerDelegate: | |
| 40 virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE { | |
| 41 canvas->GetSkCanvas()->drawColor(color_); | |
| 42 } | |
| 43 | |
| 44 private: | |
| 45 SkColor color_; | |
| 46 }; | |
| 47 | |
| 48 class LayerWithRealCompositorTest : public testing::Test { | 28 class LayerWithRealCompositorTest : public testing::Test { |
| 49 public: | 29 public: |
| 50 LayerWithRealCompositorTest() {} | 30 LayerWithRealCompositorTest() {} |
| 51 virtual ~LayerWithRealCompositorTest() {} | 31 virtual ~LayerWithRealCompositorTest() {} |
| 52 | 32 |
| 53 // Overridden from testing::Test: | 33 // Overridden from testing::Test: |
| 54 virtual void SetUp() OVERRIDE { | 34 virtual void SetUp() OVERRIDE { |
| 55 const gfx::Rect host_bounds(10, 10, 500, 500); | 35 const gfx::Rect host_bounds(10, 10, 500, 500); |
| 56 window_.reset(TestCompositorHost::Create(host_bounds)); | 36 window_.reset(TestCompositorHost::Create(host_bounds)); |
| 57 window_->Show(); | 37 window_->Show(); |
| 58 } | 38 } |
| 59 | 39 |
| 60 virtual void TearDown() OVERRIDE { | 40 virtual void TearDown() OVERRIDE { |
| 61 } | 41 } |
| 62 | 42 |
| 63 Compositor* GetCompositor() { | 43 Compositor* GetCompositor() { |
| 64 return window_->GetCompositor(); | 44 return window_->GetCompositor(); |
| 65 } | 45 } |
| 66 | 46 |
| 67 Layer* CreateLayer(Layer::LayerType type) { | 47 Layer* CreateLayer(Layer::LayerType type) { |
| 68 return new Layer(GetCompositor(), type); | 48 return new Layer(GetCompositor(), type); |
| 69 } | 49 } |
| 70 | 50 |
| 71 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { | 51 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { |
| 72 Layer* layer = new ColoredLayer(GetCompositor(), color); | 52 Layer* layer = CreateLayer(Layer::LAYER_HAS_TEXTURE); |
| 73 layer->SetBounds(bounds); | 53 layer->SetBounds(bounds); |
| 54 PaintColorToLayer(layer, color); |
| 74 return layer; | 55 return layer; |
| 75 } | 56 } |
| 76 | 57 |
| 77 Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { | 58 Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { |
| 78 Layer* layer = CreateLayer(Layer::LAYER_HAS_NO_TEXTURE); | 59 Layer* layer = CreateLayer(Layer::LAYER_HAS_NO_TEXTURE); |
| 79 layer->SetBounds(bounds); | 60 layer->SetBounds(bounds); |
| 80 return layer; | 61 return layer; |
| 81 } | 62 } |
| 82 | 63 |
| 83 gfx::Canvas* CreateCanvasForLayer(const Layer* layer) { | 64 gfx::Canvas* CreateCanvasForLayer(const Layer* layer) { |
| 84 return gfx::Canvas::CreateCanvas(layer->bounds().width(), | 65 return gfx::Canvas::CreateCanvas(layer->bounds().width(), |
| 85 layer->bounds().height(), | 66 layer->bounds().height(), |
| 86 false); | 67 false); |
| 87 } | 68 } |
| 88 | 69 |
| 70 void PaintColorToLayer(Layer* layer, SkColor color) { |
| 71 scoped_ptr<gfx::Canvas> canvas(CreateCanvasForLayer(layer)); |
| 72 canvas->FillRectInt(color, 0, 0, layer->bounds().width(), |
| 73 layer->bounds().height()); |
| 74 layer->SetCanvas(*canvas->GetSkCanvas(), layer->bounds().origin()); |
| 75 } |
| 76 |
| 89 void DrawTree(Layer* root) { | 77 void DrawTree(Layer* root) { |
| 90 GetCompositor()->SetRootLayer(root); | 78 GetCompositor()->SetRootLayer(root); |
| 91 GetCompositor()->Draw(false); | 79 GetCompositor()->Draw(false); |
| 92 } | 80 } |
| 93 | 81 |
| 94 void RunPendingMessages() { | 82 void RunPendingMessages() { |
| 95 MessageLoopForUI::current()->RunAllPending(); | 83 MessageLoopForUI::current()->RunAllPending(); |
| 96 } | 84 } |
| 97 | 85 |
| 98 // Invalidates the entire contents of the layer. | 86 // Invalidates the entire contents of the layer. |
| 99 void SchedulePaintForLayer(Layer* layer) { | 87 void SchedulePaintForLayer(Layer* layer) { |
| 100 layer->SchedulePaint( | 88 layer->SchedulePaint( |
| 101 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 89 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| 102 } | 90 } |
| 103 | 91 |
| 104 private: | 92 private: |
| 93 MessageLoopForUI message_loop_; |
| 105 scoped_ptr<TestCompositorHost> window_; | 94 scoped_ptr<TestCompositorHost> window_; |
| 106 | 95 |
| 107 DISALLOW_COPY_AND_ASSIGN(LayerWithRealCompositorTest); | 96 DISALLOW_COPY_AND_ASSIGN(LayerWithRealCompositorTest); |
| 108 }; | 97 }; |
| 109 | 98 |
| 110 // LayerDelegate that paints colors to the layer. | 99 // LayerDelegate that paints colors to the layer. |
| 111 class TestLayerDelegate : public LayerDelegate { | 100 class TestLayerDelegate : public LayerDelegate { |
| 112 public: | 101 public: |
| 113 explicit TestLayerDelegate() : color_index_(0) {} | 102 explicit TestLayerDelegate(Layer* owner) : owner_(owner), color_index_(0) {} |
| 114 virtual ~TestLayerDelegate() {} | 103 virtual ~TestLayerDelegate() {} |
| 115 | 104 |
| 116 void AddColor(SkColor color) { | 105 void AddColor(SkColor color) { |
| 117 colors_.push_back(color); | 106 colors_.push_back(color); |
| 118 } | 107 } |
| 119 | 108 |
| 120 gfx::Size paint_size() const { return paint_size_; } | 109 gfx::Size paint_size() const { return paint_size_; } |
| 121 int color_index() const { return color_index_; } | 110 int color_index() const { return color_index_; } |
| 122 | 111 |
| 123 // Overridden from LayerDelegate: | 112 // Overridden from LayerDelegate: |
| 124 virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE { | 113 virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE { |
| 125 SkBitmap contents = canvas->AsCanvasSkia()->ExtractBitmap(); | 114 SkBitmap contents = canvas->AsCanvasSkia()->ExtractBitmap(); |
| 126 paint_size_ = gfx::Size(contents.width(), contents.height()); | 115 paint_size_ = gfx::Size(contents.width(), contents.height()); |
| 127 canvas->FillRectInt(colors_.at(color_index_), 0, 0, | 116 canvas->FillRectInt(colors_.at(color_index_), 0, 0, |
| 128 contents.width(), | 117 contents.width(), |
| 129 contents.height()); | 118 contents.height()); |
| 130 color_index_ = (color_index_ + 1) % static_cast<int>(colors_.size()); | 119 color_index_ = (color_index_ + 1) % static_cast<int>(colors_.size()); |
| 131 } | 120 } |
| 132 | 121 |
| 133 private: | 122 private: |
| 123 Layer* owner_; |
| 134 std::vector<SkColor> colors_; | 124 std::vector<SkColor> colors_; |
| 135 int color_index_; | 125 int color_index_; |
| 136 gfx::Size paint_size_; | 126 gfx::Size paint_size_; |
| 137 | 127 |
| 138 DISALLOW_COPY_AND_ASSIGN(TestLayerDelegate); | 128 DISALLOW_COPY_AND_ASSIGN(TestLayerDelegate); |
| 139 }; | 129 }; |
| 140 | 130 |
| 141 // LayerDelegate that verifies that a layer was asked to update its canvas. | 131 // LayerDelegate that verifies that a layer was asked to update its canvas. |
| 142 class DrawTreeLayerDelegate : public LayerDelegate { | 132 class DrawTreeLayerDelegate : public LayerDelegate { |
| 143 public: | 133 public: |
| (...skipping 29 matching lines...) Expand all Loading... |
| 173 } | 163 } |
| 174 | 164 |
| 175 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); | 165 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); |
| 176 }; | 166 }; |
| 177 | 167 |
| 178 } | 168 } |
| 179 | 169 |
| 180 #if defined(OS_WIN) | 170 #if defined(OS_WIN) |
| 181 // These are disabled on windows as they don't run correctly on the buildbot. | 171 // These are disabled on windows as they don't run correctly on the buildbot. |
| 182 // Reenable once we move to the real compositor. | 172 // Reenable once we move to the real compositor. |
| 183 #define MAYBE_Delegate DISABLED_Delegate | |
| 184 #define MAYBE_Draw DISABLED_Draw | 173 #define MAYBE_Draw DISABLED_Draw |
| 185 #define MAYBE_DrawTree DISABLED_DrawTree | |
| 186 #define MAYBE_Hierarchy DISABLED_Hierarchy | 174 #define MAYBE_Hierarchy DISABLED_Hierarchy |
| 187 #define MAYBE_HierarchyNoTexture DISABLED_HierarchyNoTexture | |
| 188 #else | 175 #else |
| 189 #define MAYBE_Delegate Delegate | |
| 190 #define MAYBE_Draw Draw | 176 #define MAYBE_Draw Draw |
| 191 #define MAYBE_DrawTree DrawTree | |
| 192 #define MAYBE_Hierarchy Hierarchy | 177 #define MAYBE_Hierarchy Hierarchy |
| 193 #define MAYBE_HierarchyNoTexture HierarchyNoTexture | |
| 194 #endif | 178 #endif |
| 195 | 179 |
| 196 TEST_F(LayerWithRealCompositorTest, MAYBE_Draw) { | 180 TEST_F(LayerWithRealCompositorTest, MAYBE_Draw) { |
| 197 scoped_ptr<Layer> layer(CreateColorLayer(SK_ColorRED, | 181 scoped_ptr<Layer> layer(CreateColorLayer(SK_ColorRED, |
| 198 gfx::Rect(20, 20, 50, 50))); | 182 gfx::Rect(20, 20, 50, 50))); |
| 199 DrawTree(layer.get()); | 183 DrawTree(layer.get()); |
| 200 } | 184 } |
| 201 | 185 |
| 202 // Create this hierarchy: | 186 // Create this hierarchy: |
| 203 // L1 - red | 187 // L1 - red |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 virtual void TearDown() OVERRIDE { | 219 virtual void TearDown() OVERRIDE { |
| 236 } | 220 } |
| 237 | 221 |
| 238 Compositor* compositor() { return compositor_.get(); } | 222 Compositor* compositor() { return compositor_.get(); } |
| 239 | 223 |
| 240 virtual Layer* CreateLayer(Layer::LayerType type) { | 224 virtual Layer* CreateLayer(Layer::LayerType type) { |
| 241 return new Layer(compositor(), type); | 225 return new Layer(compositor(), type); |
| 242 } | 226 } |
| 243 | 227 |
| 244 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { | 228 Layer* CreateColorLayer(SkColor color, const gfx::Rect& bounds) { |
| 245 Layer* layer = new ColoredLayer(compositor(), color); | 229 Layer* layer = CreateLayer(Layer::LAYER_HAS_TEXTURE); |
| 246 layer->SetBounds(bounds); | 230 layer->SetBounds(bounds); |
| 231 PaintColorToLayer(layer, color); |
| 247 return layer; | 232 return layer; |
| 248 } | 233 } |
| 249 | 234 |
| 250 virtual Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { | 235 virtual Layer* CreateNoTextureLayer(const gfx::Rect& bounds) { |
| 251 Layer* layer = CreateLayer(Layer::LAYER_HAS_NO_TEXTURE); | 236 Layer* layer = CreateLayer(Layer::LAYER_HAS_NO_TEXTURE); |
| 252 layer->SetBounds(bounds); | 237 layer->SetBounds(bounds); |
| 253 return layer; | 238 return layer; |
| 254 } | 239 } |
| 255 | 240 |
| 256 gfx::Canvas* CreateCanvasForLayer(const Layer* layer) { | 241 gfx::Canvas* CreateCanvasForLayer(const Layer* layer) { |
| 257 return gfx::Canvas::CreateCanvas(layer->bounds().width(), | 242 return gfx::Canvas::CreateCanvas(layer->bounds().width(), |
| 258 layer->bounds().height(), | 243 layer->bounds().height(), |
| 259 false); | 244 false); |
| 260 } | 245 } |
| 261 | 246 |
| 247 void PaintColorToLayer(Layer* layer, SkColor color) { |
| 248 scoped_ptr<gfx::Canvas> canvas(CreateCanvasForLayer(layer)); |
| 249 canvas->FillRectInt(color, 0, 0, layer->bounds().width(), |
| 250 layer->bounds().height()); |
| 251 layer->SetCanvas(*canvas->GetSkCanvas(), layer->bounds().origin()); |
| 252 } |
| 253 |
| 262 void DrawTree(Layer* root) { | 254 void DrawTree(Layer* root) { |
| 263 compositor()->SetRootLayer(root); | 255 compositor()->SetRootLayer(root); |
| 264 compositor()->Draw(false); | 256 compositor()->Draw(false); |
| 265 } | 257 } |
| 266 | 258 |
| 267 // Invalidates the entire contents of the layer. | 259 // Invalidates the entire contents of the layer. |
| 268 void SchedulePaintForLayer(Layer* layer) { | 260 void SchedulePaintForLayer(Layer* layer) { |
| 269 layer->SchedulePaint( | 261 layer->SchedulePaint( |
| 270 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); | 262 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); |
| 271 } | 263 } |
| 272 | 264 |
| 273 // Invokes DrawTree on the compositor. | 265 // Invokes DrawTree on the compositor. |
| 274 void Draw() { | 266 void Draw() { |
| 275 compositor_->Draw(false); | 267 compositor_->root_layer()->DrawTree(); |
| 276 } | 268 } |
| 277 | 269 |
| 278 private: | 270 private: |
| 279 scoped_refptr<TestCompositor> compositor_; | 271 scoped_refptr<TestCompositor> compositor_; |
| 280 | 272 |
| 281 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); | 273 DISALLOW_COPY_AND_ASSIGN(LayerWithDelegateTest); |
| 282 }; | 274 }; |
| 283 | 275 |
| 284 // L1 | 276 // L1 |
| 285 // +-- L2 | 277 // +-- L2 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 Layer::ConvertPointToLayer(l3.get(), l1.get(), &point1_in_l3_coords); | 312 Layer::ConvertPointToLayer(l3.get(), l1.get(), &point1_in_l3_coords); |
| 321 gfx::Point point1_in_l1_coords(25, 25); | 313 gfx::Point point1_in_l1_coords(25, 25); |
| 322 EXPECT_EQ(point1_in_l1_coords, point1_in_l3_coords); | 314 EXPECT_EQ(point1_in_l1_coords, point1_in_l3_coords); |
| 323 | 315 |
| 324 gfx::Point point2_in_l1_coords(5, 5); | 316 gfx::Point point2_in_l1_coords(5, 5); |
| 325 Layer::ConvertPointToLayer(l1.get(), l3.get(), &point2_in_l1_coords); | 317 Layer::ConvertPointToLayer(l1.get(), l3.get(), &point2_in_l1_coords); |
| 326 gfx::Point point2_in_l3_coords(-15, -15); | 318 gfx::Point point2_in_l3_coords(-15, -15); |
| 327 EXPECT_EQ(point2_in_l3_coords, point2_in_l1_coords); | 319 EXPECT_EQ(point2_in_l3_coords, point2_in_l1_coords); |
| 328 } | 320 } |
| 329 | 321 |
| 330 TEST_F(LayerWithRealCompositorTest, MAYBE_Delegate) { | 322 TEST_F(LayerWithDelegateTest, Delegate) { |
| 331 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorBLACK, | 323 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorBLACK, |
| 332 gfx::Rect(20, 20, 400, 400))); | 324 gfx::Rect(20, 20, 400, 400))); |
| 333 GetCompositor()->SetRootLayer(l1.get()); | 325 TestLayerDelegate delegate(l1.get()); |
| 334 RunPendingMessages(); | |
| 335 | |
| 336 TestLayerDelegate delegate; | |
| 337 l1->set_delegate(&delegate); | 326 l1->set_delegate(&delegate); |
| 338 delegate.AddColor(SK_ColorWHITE); | 327 delegate.AddColor(SK_ColorWHITE); |
| 339 delegate.AddColor(SK_ColorYELLOW); | 328 delegate.AddColor(SK_ColorYELLOW); |
| 340 delegate.AddColor(SK_ColorGREEN); | 329 delegate.AddColor(SK_ColorGREEN); |
| 341 | 330 |
| 331 compositor()->SetRootLayer(l1.get()); |
| 332 |
| 342 l1->SchedulePaint(gfx::Rect(0, 0, 400, 400)); | 333 l1->SchedulePaint(gfx::Rect(0, 0, 400, 400)); |
| 343 RunPendingMessages(); | 334 Draw(); |
| 344 EXPECT_EQ(delegate.color_index(), 1); | 335 EXPECT_EQ(delegate.color_index(), 1); |
| 345 EXPECT_EQ(delegate.paint_size(), l1->bounds().size()); | 336 EXPECT_EQ(delegate.paint_size(), l1->bounds().size()); |
| 346 | 337 |
| 347 l1->SchedulePaint(gfx::Rect(10, 10, 200, 200)); | 338 l1->SchedulePaint(gfx::Rect(10, 10, 200, 200)); |
| 348 RunPendingMessages(); | 339 Draw(); |
| 349 EXPECT_EQ(delegate.color_index(), 2); | 340 EXPECT_EQ(delegate.color_index(), 2); |
| 350 EXPECT_EQ(delegate.paint_size(), gfx::Size(200, 200)); | 341 EXPECT_EQ(delegate.paint_size(), gfx::Size(200, 200)); |
| 351 | 342 |
| 352 l1->SchedulePaint(gfx::Rect(5, 5, 50, 50)); | 343 l1->SchedulePaint(gfx::Rect(5, 5, 50, 50)); |
| 353 RunPendingMessages(); | 344 Draw(); |
| 354 EXPECT_EQ(delegate.color_index(), 0); | 345 EXPECT_EQ(delegate.color_index(), 0); |
| 355 EXPECT_EQ(delegate.paint_size(), gfx::Size(50, 50)); | 346 EXPECT_EQ(delegate.paint_size(), gfx::Size(50, 50)); |
| 356 } | 347 } |
| 357 | 348 |
| 358 TEST_F(LayerWithRealCompositorTest, MAYBE_DrawTree) { | 349 TEST_F(LayerWithDelegateTest, DrawTree) { |
| 359 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, | 350 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, |
| 360 gfx::Rect(20, 20, 400, 400))); | 351 gfx::Rect(20, 20, 400, 400))); |
| 361 scoped_ptr<Layer> l2(CreateColorLayer(SK_ColorBLUE, | 352 scoped_ptr<Layer> l2(CreateColorLayer(SK_ColorBLUE, |
| 362 gfx::Rect(10, 10, 350, 350))); | 353 gfx::Rect(10, 10, 350, 350))); |
| 363 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, | 354 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, |
| 364 gfx::Rect(10, 10, 100, 100))); | 355 gfx::Rect(10, 10, 100, 100))); |
| 365 l1->Add(l2.get()); | 356 l1->Add(l2.get()); |
| 366 l2->Add(l3.get()); | 357 l2->Add(l3.get()); |
| 367 | 358 |
| 368 GetCompositor()->SetRootLayer(l1.get()); | |
| 369 RunPendingMessages(); | |
| 370 | |
| 371 DrawTreeLayerDelegate d1; | 359 DrawTreeLayerDelegate d1; |
| 372 l1->set_delegate(&d1); | 360 l1->set_delegate(&d1); |
| 373 DrawTreeLayerDelegate d2; | 361 DrawTreeLayerDelegate d2; |
| 374 l2->set_delegate(&d2); | 362 l2->set_delegate(&d2); |
| 375 DrawTreeLayerDelegate d3; | 363 DrawTreeLayerDelegate d3; |
| 376 l3->set_delegate(&d3); | 364 l3->set_delegate(&d3); |
| 377 | 365 |
| 366 compositor()->SetRootLayer(l1.get()); |
| 367 |
| 378 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 368 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
| 379 RunPendingMessages(); | 369 Draw(); |
| 380 EXPECT_FALSE(d1.painted()); | 370 EXPECT_FALSE(d1.painted()); |
| 381 EXPECT_TRUE(d2.painted()); | 371 EXPECT_TRUE(d2.painted()); |
| 382 EXPECT_FALSE(d3.painted()); | 372 EXPECT_FALSE(d3.painted()); |
| 383 } | 373 } |
| 384 | 374 |
| 385 // Tests no-texture Layers. | 375 // Tests no-texture Layers. |
| 386 // Create this hierarchy: | 376 // Create this hierarchy: |
| 387 // L1 - red | 377 // L1 - red |
| 388 // +-- L2 - NO TEXTURE | 378 // +-- L2 - NO TEXTURE |
| 389 // | +-- L3 - yellow | 379 // | +-- L3 - yellow |
| 390 // +-- L4 - magenta | 380 // +-- L4 - magenta |
| 391 // | 381 // |
| 392 TEST_F(LayerWithRealCompositorTest, MAYBE_HierarchyNoTexture) { | 382 TEST_F(LayerWithDelegateTest, HierarchyNoTexture) { |
| 393 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, | 383 scoped_ptr<Layer> l1(CreateColorLayer(SK_ColorRED, |
| 394 gfx::Rect(20, 20, 400, 400))); | 384 gfx::Rect(20, 20, 400, 400))); |
| 395 scoped_ptr<Layer> l2(CreateNoTextureLayer(gfx::Rect(10, 10, 350, 350))); | 385 scoped_ptr<Layer> l2(CreateNoTextureLayer(gfx::Rect(10, 10, 350, 350))); |
| 396 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, | 386 scoped_ptr<Layer> l3(CreateColorLayer(SK_ColorYELLOW, |
| 397 gfx::Rect(5, 5, 25, 25))); | 387 gfx::Rect(5, 5, 25, 25))); |
| 398 scoped_ptr<Layer> l4(CreateColorLayer(SK_ColorMAGENTA, | 388 scoped_ptr<Layer> l4(CreateColorLayer(SK_ColorMAGENTA, |
| 399 gfx::Rect(300, 300, 100, 100))); | 389 gfx::Rect(300, 300, 100, 100))); |
| 400 | 390 |
| 401 l1->Add(l2.get()); | 391 l1->Add(l2.get()); |
| 402 l1->Add(l4.get()); | 392 l1->Add(l4.get()); |
| 403 l2->Add(l3.get()); | 393 l2->Add(l3.get()); |
| 404 | 394 |
| 405 GetCompositor()->SetRootLayer(l1.get()); | |
| 406 RunPendingMessages(); | |
| 407 | |
| 408 DrawTreeLayerDelegate d2; | 395 DrawTreeLayerDelegate d2; |
| 409 l2->set_delegate(&d2); | 396 l2->set_delegate(&d2); |
| 410 DrawTreeLayerDelegate d3; | 397 DrawTreeLayerDelegate d3; |
| 411 l3->set_delegate(&d3); | 398 l3->set_delegate(&d3); |
| 412 | 399 |
| 400 compositor()->SetRootLayer(l1.get()); |
| 401 |
| 413 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 402 l2->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
| 414 l3->SchedulePaint(gfx::Rect(5, 5, 5, 5)); | 403 l3->SchedulePaint(gfx::Rect(5, 5, 5, 5)); |
| 415 RunPendingMessages(); | 404 Draw(); |
| 416 | 405 |
| 417 // |d2| should not have received a paint notification since it has no texture. | 406 // |d2| should not have received a paint notification since it has no texture. |
| 418 EXPECT_FALSE(d2.painted()); | 407 EXPECT_FALSE(d2.painted()); |
| 419 // |d3| should have received a paint notification. | 408 // |d3| should have received a paint notification. |
| 420 EXPECT_TRUE(d3.painted()); | 409 EXPECT_TRUE(d3.painted()); |
| 421 } | 410 } |
| 422 | 411 |
| 423 class LayerWithNullDelegateTest : public LayerWithDelegateTest { | 412 class LayerWithNullDelegateTest : public LayerWithDelegateTest { |
| 424 public: | 413 public: |
| 425 LayerWithNullDelegateTest() {} | 414 LayerWithNullDelegateTest() {} |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 scoped_ptr<Layer> parent(CreateNoTextureLayer(gfx::Rect(0, 0, 400, 400))); | 459 scoped_ptr<Layer> parent(CreateNoTextureLayer(gfx::Rect(0, 0, 400, 400))); |
| 471 scoped_ptr<Layer> child(CreateNoTextureLayer(gfx::Rect(50, 50, 100, 100))); | 460 scoped_ptr<Layer> child(CreateNoTextureLayer(gfx::Rect(50, 50, 100, 100))); |
| 472 parent->Add(child.get()); | 461 parent->Add(child.get()); |
| 473 | 462 |
| 474 compositor()->SetRootLayer(parent.get()); | 463 compositor()->SetRootLayer(parent.get()); |
| 475 Draw(); | 464 Draw(); |
| 476 EXPECT_TRUE(child->texture() == NULL); | 465 EXPECT_TRUE(child->texture() == NULL); |
| 477 EXPECT_TRUE(parent->texture() == NULL); | 466 EXPECT_TRUE(parent->texture() == NULL); |
| 478 } | 467 } |
| 479 | 468 |
| 480 // With the webkit compositor, we don't explicitly textures for layers, making | |
| 481 // tests that check that we do fail. | |
| 482 #if defined(USE_WEBKIT_COMPOSITOR) | |
| 483 #define WEBKIT_COMPOSITOR_FAILS(X) FAILS_ ## X | |
| 484 #else | |
| 485 #define WEBKIT_COMPOSITOR_FAILS(X) X | |
| 486 #endif | |
| 487 | |
| 488 // Verifies that a layer does not have a texture when the hole is the size | 469 // Verifies that a layer does not have a texture when the hole is the size |
| 489 // of the parent layer. | 470 // of the parent layer. |
| 490 TEST_F(LayerWithNullDelegateTest, | 471 TEST_F(LayerWithNullDelegateTest, LayerNoTextureHoleSizeOfLayer) { |
| 491 WEBKIT_COMPOSITOR_FAILS(LayerNoTextureHoleSizeOfLayer)) { | |
| 492 scoped_ptr<Layer> parent(CreateTextureRootLayer(gfx::Rect(0, 0, 400, 400))); | 472 scoped_ptr<Layer> parent(CreateTextureRootLayer(gfx::Rect(0, 0, 400, 400))); |
| 493 scoped_ptr<Layer> child(CreateTextureLayer(gfx::Rect(50, 50, 100, 100))); | 473 scoped_ptr<Layer> child(CreateTextureLayer(gfx::Rect(50, 50, 100, 100))); |
| 494 parent->Add(child.get()); | 474 parent->Add(child.get()); |
| 495 | 475 |
| 496 Draw(); | 476 Draw(); |
| 497 EXPECT_EQ(gfx::Rect(50, 50, 100, 100), parent->hole_rect()); | 477 EXPECT_EQ(gfx::Rect(50, 50, 100, 100), parent->hole_rect()); |
| 498 EXPECT_TRUE(parent->texture() != NULL); | 478 EXPECT_TRUE(parent->texture() != NULL); |
| 499 | 479 |
| 500 child->SetBounds(gfx::Rect(0, 0, 400, 400)); | 480 child->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 501 Draw(); | 481 Draw(); |
| 502 EXPECT_TRUE(parent->texture() == NULL); | 482 EXPECT_TRUE(parent->texture() == NULL); |
| 503 } | 483 } |
| 504 | 484 |
| 505 // Verifies that a layer which has opacity == 0 does not have a texture. | 485 // Verifies that a layer which has opacity == 0 does not have a texture. |
| 506 TEST_F(LayerWithNullDelegateTest, | 486 TEST_F(LayerWithNullDelegateTest, LayerNoTextureTransparent) { |
| 507 WEBKIT_COMPOSITOR_FAILS(LayerNoTextureTransparent)) { | |
| 508 scoped_ptr<Layer> parent(CreateTextureRootLayer(gfx::Rect(0, 0, 400, 400))); | 487 scoped_ptr<Layer> parent(CreateTextureRootLayer(gfx::Rect(0, 0, 400, 400))); |
| 509 scoped_ptr<Layer> child(CreateTextureLayer(gfx::Rect(50, 50, 100, 100))); | 488 scoped_ptr<Layer> child(CreateTextureLayer(gfx::Rect(50, 50, 100, 100))); |
| 510 parent->Add(child.get()); | 489 parent->Add(child.get()); |
| 511 | 490 |
| 512 parent->SetOpacity(0.0f); | 491 parent->SetOpacity(0.0f); |
| 513 child->SetOpacity(0.0f); | 492 child->SetOpacity(0.0f); |
| 514 Draw(); | 493 Draw(); |
| 515 EXPECT_TRUE(parent->texture() == NULL); | 494 EXPECT_TRUE(parent->texture() == NULL); |
| 516 EXPECT_TRUE(child->texture() == NULL); | 495 EXPECT_TRUE(child->texture() == NULL); |
| 517 | 496 |
| 518 parent->SetOpacity(1.0f); | 497 parent->SetOpacity(1.0f); |
| 519 Draw(); | 498 Draw(); |
| 520 EXPECT_TRUE(parent->texture() != NULL); | 499 EXPECT_TRUE(parent->texture() != NULL); |
| 521 EXPECT_TRUE(child->texture() == NULL); | 500 EXPECT_TRUE(child->texture() == NULL); |
| 522 | 501 |
| 523 child->SetOpacity(1.0f); | 502 child->SetOpacity(1.0f); |
| 524 Draw(); | 503 Draw(); |
| 525 EXPECT_TRUE(parent->texture() != NULL); | 504 EXPECT_TRUE(parent->texture() != NULL); |
| 526 EXPECT_TRUE(child->texture() != NULL); | 505 EXPECT_TRUE(child->texture() != NULL); |
| 527 } | 506 } |
| 528 | 507 |
| 529 // Verifies that no texture is created for a layer with empty bounds. | 508 // Verifies that no texture is created for a layer with empty bounds. |
| 530 TEST_F(LayerWithNullDelegateTest, | 509 TEST_F(LayerWithNullDelegateTest, LayerTextureNonEmptySchedulePaint) { |
| 531 WEBKIT_COMPOSITOR_FAILS(LayerTextureNonEmptySchedulePaint)) { | |
| 532 scoped_ptr<Layer> layer(CreateTextureRootLayer(gfx::Rect(0, 0, 0, 0))); | 510 scoped_ptr<Layer> layer(CreateTextureRootLayer(gfx::Rect(0, 0, 0, 0))); |
| 533 Draw(); | 511 Draw(); |
| 534 EXPECT_TRUE(layer->texture() == NULL); | 512 EXPECT_TRUE(layer->texture() == NULL); |
| 535 | 513 |
| 536 layer->SetBounds(gfx::Rect(0, 0, 400, 400)); | 514 layer->SetBounds(gfx::Rect(0, 0, 400, 400)); |
| 537 Draw(); | 515 Draw(); |
| 538 EXPECT_TRUE(layer->texture() != NULL); | 516 EXPECT_TRUE(layer->texture() != NULL); |
| 539 } | 517 } |
| 540 | 518 |
| 541 // Verifies that when there are many potential holes, the largest one is picked. | 519 // Verifies that when there are many potential holes, the largest one is picked. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 604 EXPECT_EQ(target_rect, parent->hole_rect()); | 582 EXPECT_EQ(target_rect, parent->hole_rect()); |
| 605 } | 583 } |
| 606 } | 584 } |
| 607 | 585 |
| 608 // Create this hierarchy: | 586 // Create this hierarchy: |
| 609 // L1 (no texture) | 587 // L1 (no texture) |
| 610 // +- L11 (texture) | 588 // +- L11 (texture) |
| 611 // +- L12 (no texture) (added after L1 is already set as root-layer) | 589 // +- L12 (no texture) (added after L1 is already set as root-layer) |
| 612 // +- L121 (texture) | 590 // +- L121 (texture) |
| 613 // +- L122 (texture) | 591 // +- L122 (texture) |
| 614 TEST_F(LayerWithNullDelegateTest, WEBKIT_COMPOSITOR_FAILS(NoCompositor)) { | 592 TEST_F(LayerWithNullDelegateTest, NoCompositor) { |
| 615 scoped_ptr<Layer> l1(CreateLayer(Layer::LAYER_HAS_NO_TEXTURE)); | 593 scoped_ptr<Layer> l1(CreateLayer(Layer::LAYER_HAS_NO_TEXTURE)); |
| 616 scoped_ptr<Layer> l11(CreateLayer(Layer::LAYER_HAS_TEXTURE)); | 594 scoped_ptr<Layer> l11(CreateLayer(Layer::LAYER_HAS_TEXTURE)); |
| 617 scoped_ptr<Layer> l12(CreateLayer(Layer::LAYER_HAS_NO_TEXTURE)); | 595 scoped_ptr<Layer> l12(CreateLayer(Layer::LAYER_HAS_NO_TEXTURE)); |
| 618 scoped_ptr<Layer> l121(CreateLayer(Layer::LAYER_HAS_TEXTURE)); | 596 scoped_ptr<Layer> l121(CreateLayer(Layer::LAYER_HAS_TEXTURE)); |
| 619 scoped_ptr<Layer> l122(CreateLayer(Layer::LAYER_HAS_TEXTURE)); | 597 scoped_ptr<Layer> l122(CreateLayer(Layer::LAYER_HAS_TEXTURE)); |
| 620 | 598 |
| 621 EXPECT_EQ(NULL, l1->texture()); | 599 EXPECT_EQ(NULL, l1->texture()); |
| 622 EXPECT_EQ(NULL, l11->texture()); | 600 EXPECT_EQ(NULL, l11->texture()); |
| 623 EXPECT_EQ(NULL, l12->texture()); | 601 EXPECT_EQ(NULL, l12->texture()); |
| 624 EXPECT_EQ(NULL, l121->texture()); | 602 EXPECT_EQ(NULL, l121->texture()); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 EXPECT_FALSE(l2->IsDrawn()); | 675 EXPECT_FALSE(l2->IsDrawn()); |
| 698 EXPECT_FALSE(l3->IsDrawn()); | 676 EXPECT_FALSE(l3->IsDrawn()); |
| 699 | 677 |
| 700 l1->SetVisible(true); | 678 l1->SetVisible(true); |
| 701 EXPECT_TRUE(l1->IsDrawn()); | 679 EXPECT_TRUE(l1->IsDrawn()); |
| 702 EXPECT_TRUE(l2->IsDrawn()); | 680 EXPECT_TRUE(l2->IsDrawn()); |
| 703 EXPECT_FALSE(l3->IsDrawn()); | 681 EXPECT_FALSE(l3->IsDrawn()); |
| 704 } | 682 } |
| 705 | 683 |
| 706 } // namespace ui | 684 } // namespace ui |
| OLD | NEW |