ozone: fix HDPMLegacy - do the PF after overlays, also clear old overlays
[chromium-blink-merge.git] / ui / ozone / platform / dri / dri_window_delegate_impl_unittest.cc
blob6b3a02b6c00540c0b0903041109d55bfd12581e0
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include <vector>
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/skia/include/core/SkCanvas.h"
11 #include "third_party/skia/include/core/SkColor.h"
12 #include "third_party/skia/include/core/SkImageInfo.h"
13 #include "ui/ozone/platform/dri/dri_buffer.h"
14 #include "ui/ozone/platform/dri/dri_surface.h"
15 #include "ui/ozone/platform/dri/dri_surface_factory.h"
16 #include "ui/ozone/platform/dri/dri_window_delegate_impl.h"
17 #include "ui/ozone/platform/dri/dri_window_delegate_manager.h"
18 #include "ui/ozone/platform/dri/hardware_display_controller.h"
19 #include "ui/ozone/platform/dri/screen_manager.h"
20 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
21 #include "ui/ozone/public/surface_ozone_canvas.h"
23 namespace {
25 // Mode of size 6x4.
26 const drmModeModeInfo kDefaultMode =
27 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
29 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1;
30 const uint32_t kDefaultCrtc = 1;
31 const uint32_t kDefaultConnector = 2;
33 class MockScreenManager : public ui::ScreenManager {
34 public:
35 MockScreenManager(ui::DriWrapper* dri,
36 ui::ScanoutBufferGenerator* buffer_generator)
37 : ScreenManager(dri, buffer_generator), dri_(dri) {}
38 ~MockScreenManager() override {}
40 // Normally we'd use DRM to figure out the controller configuration. But we
41 // can't use DRM in unit tests, so we just create a fake configuration.
42 void ForceInitializationOfPrimaryDisplay() override {
43 ConfigureDisplayController(kDefaultCrtc, kDefaultConnector, gfx::Point(),
44 kDefaultMode);
47 private:
48 ui::DriWrapper* dri_; // Not owned.
50 DISALLOW_COPY_AND_ASSIGN(MockScreenManager);
53 } // namespace
55 class DriWindowDelegateImplTest : public testing::Test {
56 public:
57 DriWindowDelegateImplTest() {}
59 void SetUp() override;
60 void TearDown() override;
62 protected:
63 scoped_ptr<base::MessageLoop> message_loop_;
64 scoped_ptr<ui::MockDriWrapper> dri_;
65 scoped_ptr<ui::DriBufferGenerator> buffer_generator_;
66 scoped_ptr<MockScreenManager> screen_manager_;
67 scoped_ptr<ui::DriWindowDelegateManager> window_delegate_manager_;
69 private:
70 DISALLOW_COPY_AND_ASSIGN(DriWindowDelegateImplTest);
73 void DriWindowDelegateImplTest::SetUp() {
74 message_loop_.reset(new base::MessageLoopForUI);
75 dri_.reset(new ui::MockDriWrapper(3));
76 buffer_generator_.reset(new ui::DriBufferGenerator());
77 screen_manager_.reset(
78 new MockScreenManager(dri_.get(), buffer_generator_.get()));
79 window_delegate_manager_.reset(new ui::DriWindowDelegateManager());
81 scoped_ptr<ui::DriWindowDelegate> window_delegate(
82 new ui::DriWindowDelegateImpl(kDefaultWidgetHandle, dri_.get(),
83 window_delegate_manager_.get(),
84 screen_manager_.get()));
85 window_delegate->Initialize();
86 window_delegate_manager_->AddWindowDelegate(kDefaultWidgetHandle,
87 window_delegate.Pass());
90 void DriWindowDelegateImplTest::TearDown() {
91 scoped_ptr<ui::DriWindowDelegate> delegate =
92 window_delegate_manager_->RemoveWindowDelegate(kDefaultWidgetHandle);
93 delegate->Shutdown();
94 message_loop_.reset();
97 TEST_F(DriWindowDelegateImplTest, SetCursorImage) {
98 SkBitmap image;
99 SkImageInfo info =
100 SkImageInfo::Make(6, 4, kN32_SkColorType, kPremul_SkAlphaType);
101 image.allocPixels(info);
102 image.eraseColor(SK_ColorWHITE);
104 std::vector<SkBitmap> cursor_bitmaps;
105 cursor_bitmaps.push_back(image);
106 window_delegate_manager_->GetWindowDelegate(kDefaultWidgetHandle)
107 ->SetCursor(cursor_bitmaps, gfx::Point(4, 2), 0);
109 SkBitmap cursor;
110 // Buffers 0 and 1 are the cursor buffers.
111 cursor.setInfo(dri_->buffers()[1]->getCanvas()->imageInfo());
112 EXPECT_TRUE(dri_->buffers()[1]->getCanvas()->readPixels(&cursor, 0, 0));
114 // Check that the frontbuffer is displaying the right image as set above.
115 for (int i = 0; i < cursor.height(); ++i) {
116 for (int j = 0; j < cursor.width(); ++j) {
117 if (j < info.width() && i < info.height())
118 EXPECT_EQ(SK_ColorWHITE, cursor.getColor(j, i));
119 else
120 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
121 cursor.getColor(j, i));