2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
18 class ScreenCapturerHelperTest : public testing::Test {
20 ScreenCapturerHelper capturer_helper_;
23 TEST_F(ScreenCapturerHelperTest, ClearInvalidRegion) {
24 DesktopRegion region(DesktopRect::MakeXYWH(1, 2, 3, 4));
25 capturer_helper_.InvalidateRegion(region);
26 capturer_helper_.ClearInvalidRegion();
27 capturer_helper_.TakeInvalidRegion(®ion);
28 EXPECT_TRUE(region.is_empty());
31 TEST_F(ScreenCapturerHelperTest, InvalidateRegion) {
33 capturer_helper_.TakeInvalidRegion(®ion);
34 EXPECT_TRUE(region.is_empty());
36 region.SetRect(DesktopRect::MakeXYWH(1, 2, 3, 4));
37 capturer_helper_.InvalidateRegion(region);
38 capturer_helper_.TakeInvalidRegion(®ion);
39 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(1, 2, 3, 4)).Equals(region));
41 capturer_helper_.InvalidateRegion(
42 DesktopRegion(DesktopRect::MakeXYWH(1, 2, 3, 4)));
43 capturer_helper_.InvalidateRegion(
44 DesktopRegion(DesktopRect::MakeXYWH(4, 2, 3, 4)));
45 capturer_helper_.TakeInvalidRegion(®ion);
46 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(1, 2, 6, 4)).Equals(region));
49 TEST_F(ScreenCapturerHelperTest, InvalidateScreen) {
51 capturer_helper_.InvalidateScreen(DesktopSize(12, 34));
52 capturer_helper_.TakeInvalidRegion(®ion);
53 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeWH(12, 34)).Equals(region));
56 TEST_F(ScreenCapturerHelperTest, SizeMostRecent) {
57 EXPECT_TRUE(capturer_helper_.size_most_recent().is_empty());
58 capturer_helper_.set_size_most_recent(DesktopSize(12, 34));
60 DesktopSize(12, 34).equals(capturer_helper_.size_most_recent()));
63 TEST_F(ScreenCapturerHelperTest, SetLogGridSize) {
64 capturer_helper_.set_size_most_recent(DesktopSize(10, 10));
67 capturer_helper_.TakeInvalidRegion(®ion);
68 EXPECT_TRUE(DesktopRegion().Equals(region));
70 capturer_helper_.InvalidateRegion(
71 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
72 capturer_helper_.TakeInvalidRegion(®ion);
73 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
75 capturer_helper_.SetLogGridSize(-1);
76 capturer_helper_.InvalidateRegion(
77 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
78 capturer_helper_.TakeInvalidRegion(®ion);
79 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
81 capturer_helper_.SetLogGridSize(0);
82 capturer_helper_.InvalidateRegion(
83 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
84 capturer_helper_.TakeInvalidRegion(®ion);
85 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
87 capturer_helper_.SetLogGridSize(1);
88 capturer_helper_.InvalidateRegion(
89 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
90 capturer_helper_.TakeInvalidRegion(®ion);
92 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(6, 6, 2, 2)).Equals(region));
94 capturer_helper_.SetLogGridSize(2);
95 capturer_helper_.InvalidateRegion(
96 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
97 capturer_helper_.TakeInvalidRegion(®ion);
98 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(4, 4, 4, 4)).Equals(region));
100 capturer_helper_.SetLogGridSize(0);
101 capturer_helper_.InvalidateRegion(
102 DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
103 capturer_helper_.TakeInvalidRegion(®ion);
104 EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
107 void TestExpandRegionToGrid(const DesktopRegion& region, int log_grid_size,
108 const DesktopRegion& expanded_region_expected) {
109 DesktopRegion expanded_region1;
110 ScreenCapturerHelper::ExpandToGrid(region, log_grid_size, &expanded_region1);
111 EXPECT_TRUE(expanded_region_expected.Equals(expanded_region1));
113 DesktopRegion expanded_region2;
114 ScreenCapturerHelper::ExpandToGrid(expanded_region1, log_grid_size,
116 EXPECT_TRUE(expanded_region1.Equals(expanded_region2));
119 void TestExpandRectToGrid(int l, int t, int r, int b, int log_grid_size,
120 int lExpanded, int tExpanded,
121 int rExpanded, int bExpanded) {
122 TestExpandRegionToGrid(DesktopRegion(DesktopRect::MakeLTRB(l, t, r, b)),
124 DesktopRegion(DesktopRect::MakeLTRB(
125 lExpanded, tExpanded, rExpanded, bExpanded)));
128 TEST_F(ScreenCapturerHelperTest, ExpandToGrid) {
129 const int kLogGridSize = 4;
130 const int kGridSize = 1 << kLogGridSize;
131 for (int i = -2; i <= 2; i++) {
132 int x = i * kGridSize;
133 for (int j = -2; j <= 2; j++) {
134 int y = j * kGridSize;
135 TestExpandRectToGrid(x + 0, y + 0, x + 1, y + 1, kLogGridSize,
136 x + 0, y + 0, x + kGridSize, y + kGridSize);
137 TestExpandRectToGrid(x + 0, y + kGridSize - 1, x + 1, y + kGridSize,
139 x + 0, y + 0, x + kGridSize, y + kGridSize);
140 TestExpandRectToGrid(x + kGridSize - 1, y + kGridSize - 1,
141 x + kGridSize, y + kGridSize, kLogGridSize,
142 x + 0, y + 0, x + kGridSize, y + kGridSize);
143 TestExpandRectToGrid(x + kGridSize - 1, y + 0,
144 x + kGridSize, y + 1, kLogGridSize,
145 x + 0, y + 0, x + kGridSize, y + kGridSize);
146 TestExpandRectToGrid(x - 1, y + 0, x + 1, y + 1, kLogGridSize,
147 x - kGridSize, y + 0, x + kGridSize, y + kGridSize);
148 TestExpandRectToGrid(x - 1, y - 1, x + 1, y + 0, kLogGridSize,
149 x - kGridSize, y - kGridSize, x + kGridSize, y);
150 TestExpandRectToGrid(x + 0, y - 1, x + 1, y + 1, kLogGridSize,
151 x, y - kGridSize, x + kGridSize, y + kGridSize);
152 TestExpandRectToGrid(x - 1, y - 1, x + 0, y + 1, kLogGridSize,
153 x - kGridSize, y - kGridSize, x, y + kGridSize);
155 // Construct a region consisting of 3 pixels and verify that it's expanded
156 // properly to 3 squares that are kGridSize by kGridSize.
157 for (int q = 0; q < 4; ++q) {
158 DesktopRegion region;
159 DesktopRegion expanded_region_expected;
162 region.AddRect(DesktopRect::MakeXYWH(x - 1, y - 1, 1, 1));
163 expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
164 x - kGridSize, y - kGridSize, kGridSize, kGridSize));
167 region.AddRect(DesktopRect::MakeXYWH(x, y - 1, 1, 1));
168 expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
169 x, y - kGridSize, kGridSize, kGridSize));
172 region.AddRect(DesktopRect::MakeXYWH(x - 1, y, 1, 1));
173 expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
174 x - kGridSize, y, kGridSize, kGridSize));
177 region.AddRect(DesktopRect::MakeXYWH(x, y, 1, 1));
178 expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
179 x, y, kGridSize, kGridSize));
182 TestExpandRegionToGrid(region, kLogGridSize, expanded_region_expected);
188 } // namespace webrtc