Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(347)

Side by Side Diff: cc/resources/picture_pile_unittest.cc

Issue 723343002: Update from https://crrev.com/304121 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/picture_pile_impl.cc ('k') | cc/resources/raster_source.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <map> 5 #include <map>
6 #include <utility> 6 #include <utility>
7 7
8 #include "cc/resources/picture_pile.h" 8 #include "cc/resources/picture_pile.h"
9 #include "cc/test/fake_content_layer_client.h" 9 #include "cc/test/fake_content_layer_client.h"
10 #include "cc/test/fake_rendering_stats_instrumentation.h" 10 #include "cc/test/fake_picture_pile.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/gfx/geometry/rect_conversions.h" 12 #include "ui/gfx/geometry/rect_conversions.h"
13 #include "ui/gfx/geometry/size_conversions.h" 13 #include "ui/gfx/geometry/size_conversions.h"
14 14
15 namespace cc { 15 namespace cc {
16 namespace { 16 namespace {
17 17
18 class TestPicturePile : public PicturePile {
19 public:
20 ~TestPicturePile() override {}
21
22 using PicturePile::buffer_pixels;
23 using PicturePile::CanRasterSlowTileCheck;
24 using PicturePile::Clear;
25
26 PictureMap& picture_map() { return picture_map_; }
27 const gfx::Rect& recorded_viewport() const { return recorded_viewport_; }
28
29 bool CanRasterLayerRect(const gfx::Rect& layer_rect) {
30 return CanRaster(1.f, layer_rect);
31 }
32
33 typedef PicturePile::PictureInfo PictureInfo;
34 typedef PicturePile::PictureMapKey PictureMapKey;
35 typedef PicturePile::PictureMap PictureMap;
36 };
37
38 class PicturePileTestBase { 18 class PicturePileTestBase {
39 public: 19 public:
40 PicturePileTestBase() 20 PicturePileTestBase()
41 : background_color_(SK_ColorBLUE), 21 : background_color_(SK_ColorBLUE),
42 min_scale_(0.125), 22 min_scale_(0.125),
43 frame_number_(0), 23 frame_number_(0),
44 contents_opaque_(false) {} 24 contents_opaque_(false) {}
45 25
46 void InitializeData() { 26 void InitializeData() {
47 pile_.SetTileGridSize(gfx::Size(1000, 1000)); 27 pile_.SetTileGridSize(gfx::Size(1000, 1000));
48 pile_.SetMinContentsScale(min_scale_); 28 pile_.SetMinContentsScale(min_scale_);
49 client_ = FakeContentLayerClient(); 29 client_ = FakeContentLayerClient();
50 SetTilingSize(pile_.tiling().max_texture_size()); 30 SetTilingSize(pile_.tiling().max_texture_size());
51 } 31 }
52 32
53 void SetTilingSize(const gfx::Size& tiling_size) { 33 void SetTilingSize(const gfx::Size& tiling_size) {
54 Region invalidation; 34 Region invalidation;
55 gfx::Rect viewport_rect(tiling_size); 35 gfx::Rect viewport_rect(tiling_size);
56 UpdateAndExpandInvalidation(&invalidation, tiling_size, viewport_rect); 36 UpdateAndExpandInvalidation(&invalidation, tiling_size, viewport_rect);
57 } 37 }
58 38
59 gfx::Size tiling_size() const { return pile_.tiling_size(); } 39 gfx::Size tiling_size() const { return pile_.GetSize(); }
60 gfx::Rect tiling_rect() const { return gfx::Rect(pile_.tiling_size()); } 40 gfx::Rect tiling_rect() const { return gfx::Rect(pile_.GetSize()); }
61 41
62 bool UpdateAndExpandInvalidation(Region* invalidation, 42 bool UpdateAndExpandInvalidation(Region* invalidation,
63 const gfx::Size& layer_size, 43 const gfx::Size& layer_size,
64 const gfx::Rect& visible_layer_rect) { 44 const gfx::Rect& visible_layer_rect) {
65 frame_number_++; 45 frame_number_++;
66 return pile_.UpdateAndExpandInvalidation(&client_, 46 return pile_.UpdateAndExpandInvalidation(
67 invalidation, 47 &client_, invalidation, background_color_, contents_opaque_, false,
68 background_color_, 48 layer_size, visible_layer_rect, frame_number_,
69 contents_opaque_, 49 Picture::RECORD_NORMALLY);
70 false,
71 layer_size,
72 visible_layer_rect,
73 frame_number_,
74 Picture::RECORD_NORMALLY,
75 &stats_instrumentation_);
76 } 50 }
77 51
78 bool UpdateWholePile() { 52 bool UpdateWholePile() {
79 Region invalidation = tiling_rect(); 53 Region invalidation = tiling_rect();
80 bool result = UpdateAndExpandInvalidation( 54 bool result = UpdateAndExpandInvalidation(&invalidation, tiling_size(),
81 &invalidation, tiling_size(), tiling_rect()); 55 tiling_rect());
82 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString()); 56 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString());
83 return result; 57 return result;
84 } 58 }
85 59
86 FakeContentLayerClient client_; 60 FakeContentLayerClient client_;
87 FakeRenderingStatsInstrumentation stats_instrumentation_; 61 FakePicturePile pile_;
88 TestPicturePile pile_;
89 SkColor background_color_; 62 SkColor background_color_;
90 float min_scale_; 63 float min_scale_;
91 int frame_number_; 64 int frame_number_;
92 bool contents_opaque_; 65 bool contents_opaque_;
93 }; 66 };
94 67
95 class PicturePileTest : public PicturePileTestBase, public testing::Test { 68 class PicturePileTest : public PicturePileTestBase, public testing::Test {
96 public: 69 public:
97 virtual void SetUp() override { InitializeData(); } 70 virtual void SetUp() override { InitializeData(); }
98 }; 71 };
99 72
100 TEST_F(PicturePileTest, InvalidationOnTileBorderOutsideInterestRect) { 73 TEST_F(PicturePileTest, InvalidationOnTileBorderOutsideInterestRect) {
101 // Don't expand the interest rect past what we invalidate. 74 // Don't expand the interest rect past what we invalidate.
102 pile_.SetPixelRecordDistanceForTesting(0); 75 pile_.SetPixelRecordDistance(0);
103 76
104 gfx::Size tile_size(100, 100); 77 gfx::Size tile_size(100, 100);
105 pile_.tiling().SetMaxTextureSize(tile_size); 78 pile_.tiling().SetMaxTextureSize(tile_size);
106 79
107 gfx::Size pile_size(400, 400); 80 gfx::Size pile_size(400, 400);
108 SetTilingSize(pile_size); 81 SetTilingSize(pile_size);
109 82
110 // We have multiple tiles. 83 // We have multiple tiles.
111 EXPECT_GT(pile_.tiling().num_tiles_x(), 2); 84 EXPECT_GT(pile_.tiling().num_tiles_x(), 2);
112 EXPECT_GT(pile_.tiling().num_tiles_y(), 2); 85 EXPECT_GT(pile_.tiling().num_tiles_y(), 2);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 148
176 TEST_F(PicturePileTest, SmallInvalidateInflated) { 149 TEST_F(PicturePileTest, SmallInvalidateInflated) {
177 // Invalidate something inside a tile. 150 // Invalidate something inside a tile.
178 Region invalidate_rect(gfx::Rect(50, 50, 1, 1)); 151 Region invalidate_rect(gfx::Rect(50, 50, 1, 1));
179 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect()); 152 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
180 EXPECT_EQ(gfx::Rect(50, 50, 1, 1).ToString(), invalidate_rect.ToString()); 153 EXPECT_EQ(gfx::Rect(50, 50, 1, 1).ToString(), invalidate_rect.ToString());
181 154
182 EXPECT_EQ(1, pile_.tiling().num_tiles_x()); 155 EXPECT_EQ(1, pile_.tiling().num_tiles_x());
183 EXPECT_EQ(1, pile_.tiling().num_tiles_y()); 156 EXPECT_EQ(1, pile_.tiling().num_tiles_y());
184 157
185 TestPicturePile::PictureInfo& picture_info = 158 FakePicturePile::PictureInfo& picture_info =
186 pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second; 159 pile_.picture_map().find(FakePicturePile::PictureMapKey(0, 0))->second;
187 // We should have a picture. 160 // We should have a picture.
188 EXPECT_TRUE(!!picture_info.GetPicture()); 161 EXPECT_TRUE(!!picture_info.GetPicture());
189 gfx::Rect picture_rect = gfx::ScaleToEnclosedRect( 162 gfx::Rect picture_rect = gfx::ScaleToEnclosedRect(
190 picture_info.GetPicture()->LayerRect(), min_scale_); 163 picture_info.GetPicture()->LayerRect(), min_scale_);
191 164
192 // The the picture should be large enough that scaling it never makes a rect 165 // The the picture should be large enough that scaling it never makes a rect
193 // smaller than 1 px wide or tall. 166 // smaller than 1 px wide or tall.
194 EXPECT_FALSE(picture_rect.IsEmpty()) << "Picture rect " << 167 EXPECT_FALSE(picture_rect.IsEmpty()) << "Picture rect " <<
195 picture_rect.ToString(); 168 picture_rect.ToString();
196 } 169 }
197 170
198 TEST_F(PicturePileTest, LargeInvalidateInflated) { 171 TEST_F(PicturePileTest, LargeInvalidateInflated) {
199 // Invalidate something inside a tile. 172 // Invalidate something inside a tile.
200 Region invalidate_rect(gfx::Rect(50, 50, 100, 100)); 173 Region invalidate_rect(gfx::Rect(50, 50, 100, 100));
201 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect()); 174 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
202 EXPECT_EQ(gfx::Rect(50, 50, 100, 100).ToString(), invalidate_rect.ToString()); 175 EXPECT_EQ(gfx::Rect(50, 50, 100, 100).ToString(), invalidate_rect.ToString());
203 176
204 EXPECT_EQ(1, pile_.tiling().num_tiles_x()); 177 EXPECT_EQ(1, pile_.tiling().num_tiles_x());
205 EXPECT_EQ(1, pile_.tiling().num_tiles_y()); 178 EXPECT_EQ(1, pile_.tiling().num_tiles_y());
206 179
207 TestPicturePile::PictureInfo& picture_info = 180 FakePicturePile::PictureInfo& picture_info =
208 pile_.picture_map().find(TestPicturePile::PictureMapKey(0, 0))->second; 181 pile_.picture_map().find(FakePicturePile::PictureMapKey(0, 0))->second;
209 EXPECT_TRUE(!!picture_info.GetPicture()); 182 EXPECT_TRUE(!!picture_info.GetPicture());
210 183
211 int expected_inflation = pile_.buffer_pixels(); 184 int expected_inflation = pile_.buffer_pixels();
212 185
213 const Picture* base_picture = picture_info.GetPicture(); 186 const Picture* base_picture = picture_info.GetPicture();
214 gfx::Rect base_picture_rect(pile_.tiling_size()); 187 gfx::Rect base_picture_rect(tiling_size());
215 base_picture_rect.Inset(-expected_inflation, -expected_inflation); 188 base_picture_rect.Inset(-expected_inflation, -expected_inflation);
216 EXPECT_EQ(base_picture_rect.ToString(), 189 EXPECT_EQ(base_picture_rect.ToString(),
217 base_picture->LayerRect().ToString()); 190 base_picture->LayerRect().ToString());
218 } 191 }
219 192
220 TEST_F(PicturePileTest, InvalidateOnTileBoundaryInflated) { 193 TEST_F(PicturePileTest, InvalidateOnTileBoundaryInflated) {
221 gfx::Size new_tiling_size = 194 gfx::Size new_tiling_size =
222 gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 2.f)); 195 gfx::ToCeiledSize(gfx::ScaleSize(tiling_size(), 2.f));
223 // This creates initial pictures. 196 // This creates initial pictures.
224 SetTilingSize(new_tiling_size); 197 SetTilingSize(new_tiling_size);
225 198
226 // Due to border pixels, we should have 3 tiles. 199 // Due to border pixels, we should have 3 tiles.
227 EXPECT_EQ(3, pile_.tiling().num_tiles_x()); 200 EXPECT_EQ(3, pile_.tiling().num_tiles_x());
228 EXPECT_EQ(3, pile_.tiling().num_tiles_y()); 201 EXPECT_EQ(3, pile_.tiling().num_tiles_y());
229 202
230 // We should have 1/.125 - 1 = 7 border pixels. 203 // We should have 1/.125 - 1 = 7 border pixels.
231 EXPECT_EQ(7, pile_.buffer_pixels()); 204 EXPECT_EQ(7, pile_.buffer_pixels());
232 EXPECT_EQ(7, pile_.tiling().border_texels()); 205 EXPECT_EQ(7, pile_.tiling().border_texels());
233 206
234 // Invalidate everything to have a non zero invalidation frequency. 207 // Invalidate everything to have a non zero invalidation frequency.
235 UpdateWholePile(); 208 UpdateWholePile();
236 209
237 // Invalidate something just over a tile boundary by a single pixel. 210 // Invalidate something just over a tile boundary by a single pixel.
238 // This will invalidate the tile (1, 1), as well as 1 row of pixels in (1, 0). 211 // This will invalidate the tile (1, 1), as well as 1 row of pixels in (1, 0).
239 Region invalidate_rect( 212 Region invalidate_rect(
240 gfx::Rect(pile_.tiling().TileBoundsWithBorder(0, 0).right(), 213 gfx::Rect(pile_.tiling().TileBoundsWithBorder(0, 0).right(),
241 pile_.tiling().TileBoundsWithBorder(0, 0).bottom() - 1, 214 pile_.tiling().TileBoundsWithBorder(0, 0).bottom() - 1,
242 50, 215 50,
243 50)); 216 50));
244 Region expected_invalidation = invalidate_rect; 217 Region expected_invalidation = invalidate_rect;
245 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect()); 218 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect());
246 EXPECT_EQ(expected_invalidation.ToString(), invalidate_rect.ToString()); 219 EXPECT_EQ(expected_invalidation.ToString(), invalidate_rect.ToString());
247 220
248 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 221 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
249 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 222 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
250 TestPicturePile::PictureInfo& picture_info = 223 FakePicturePile::PictureInfo& picture_info =
251 pile_.picture_map() 224 pile_.picture_map()
252 .find(TestPicturePile::PictureMapKey(i, j)) 225 .find(FakePicturePile::PictureMapKey(i, j))
253 ->second; 226 ->second;
254 227
255 // Expect (1, 1) and (1, 0) to be invalidated once more 228 // Expect (1, 1) and (1, 0) to be invalidated once more
256 // than the rest of the tiles. 229 // than the rest of the tiles.
257 if (i == 1 && (j == 0 || j == 1)) { 230 if (i == 1 && (j == 0 || j == 1)) {
258 EXPECT_FLOAT_EQ( 231 EXPECT_FLOAT_EQ(
259 2.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, 232 2.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
260 picture_info.GetInvalidationFrequencyForTesting()); 233 picture_info.GetInvalidationFrequencyForTesting());
261 } else { 234 } else {
262 EXPECT_FLOAT_EQ( 235 EXPECT_FLOAT_EQ(
263 1.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, 236 1.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
264 picture_info.GetInvalidationFrequencyForTesting()); 237 picture_info.GetInvalidationFrequencyForTesting());
265 } 238 }
266 } 239 }
267 } 240 }
268 } 241 }
269 242
270 TEST_F(PicturePileTest, InvalidateOnFullLayer) { 243 TEST_F(PicturePileTest, InvalidateOnFullLayer) {
271 UpdateWholePile(); 244 UpdateWholePile();
272 245
273 // Everything was invalidated once so far. 246 // Everything was invalidated once so far.
274 for (auto& it : pile_.picture_map()) { 247 for (auto& it : pile_.picture_map()) {
275 EXPECT_FLOAT_EQ( 248 EXPECT_FLOAT_EQ(
276 1.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, 249 1.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
277 it.second.GetInvalidationFrequencyForTesting()); 250 it.second.GetInvalidationFrequencyForTesting());
278 } 251 }
279 252
280 // Invalidate everything, 253 // Invalidate everything,
281 Region invalidation = tiling_rect(); 254 Region invalidation = tiling_rect();
282 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect()); 255 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
283 256
284 // Everything was invalidated again. 257 // Everything was invalidated again.
285 for (auto& it : pile_.picture_map()) { 258 for (auto& it : pile_.picture_map()) {
286 EXPECT_FLOAT_EQ( 259 EXPECT_FLOAT_EQ(
287 2.0f / TestPicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED, 260 2.0f / FakePicturePile::PictureInfo::INVALIDATION_FRAMES_TRACKED,
288 it.second.GetInvalidationFrequencyForTesting()); 261 it.second.GetInvalidationFrequencyForTesting());
289 } 262 }
290 } 263 }
291 264
292 TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) { 265 TEST_F(PicturePileTest, StopRecordingOffscreenInvalidations) {
293 gfx::Size new_tiling_size = 266 gfx::Size new_tiling_size =
294 gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 4.f)); 267 gfx::ToCeiledSize(gfx::ScaleSize(tiling_size(), 4.f));
295 SetTilingSize(new_tiling_size); 268 SetTilingSize(new_tiling_size);
296 269
297 gfx::Rect viewport(tiling_size().width(), 1); 270 gfx::Rect viewport(tiling_size().width(), 1);
298 271
299 // Update the whole pile until the invalidation frequency is high. 272 // Update the whole pile until the invalidation frequency is high.
300 for (int frame = 0; frame < 33; ++frame) { 273 for (int frame = 0; frame < 33; ++frame) {
301 UpdateWholePile(); 274 UpdateWholePile();
302 } 275 }
303 276
304 // Make sure we have a high invalidation frequency. 277 // Make sure we have a high invalidation frequency.
305 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 278 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
306 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 279 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
307 TestPicturePile::PictureInfo& picture_info = 280 FakePicturePile::PictureInfo& picture_info =
308 pile_.picture_map() 281 pile_.picture_map()
309 .find(TestPicturePile::PictureMapKey(i, j)) 282 .find(FakePicturePile::PictureMapKey(i, j))
310 ->second; 283 ->second;
311 EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting()) 284 EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting())
312 << "i " << i << " j " << j; 285 << "i " << i << " j " << j;
313 } 286 }
314 } 287 }
315 288
316 // Update once more with a small viewport. 289 // Update once more with a small viewport.
317 Region invalidation(tiling_rect()); 290 Region invalidation(tiling_rect());
318 UpdateAndExpandInvalidation(&invalidation, tiling_size(), viewport); 291 UpdateAndExpandInvalidation(&invalidation, tiling_size(), viewport);
319 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString()); 292 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString());
320 293
321 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 294 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
322 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 295 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
323 TestPicturePile::PictureInfo& picture_info = 296 FakePicturePile::PictureInfo& picture_info =
324 pile_.picture_map() 297 pile_.picture_map()
325 .find(TestPicturePile::PictureMapKey(i, j)) 298 .find(FakePicturePile::PictureMapKey(i, j))
326 ->second; 299 ->second;
327 EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting()); 300 EXPECT_FLOAT_EQ(1.0f, picture_info.GetInvalidationFrequencyForTesting());
328 301
329 // If the y far enough away we expect to find no picture (no re-recording 302 // If the y far enough away we expect to find no picture (no re-recording
330 // happened). For close y, the picture should change. 303 // happened). For close y, the picture should change.
331 if (j >= 2) 304 if (j >= 2)
332 EXPECT_FALSE(picture_info.GetPicture()) << "i " << i << " j " << j; 305 EXPECT_FALSE(picture_info.GetPicture()) << "i " << i << " j " << j;
333 else 306 else
334 EXPECT_TRUE(picture_info.GetPicture()) << "i " << i << " j " << j; 307 EXPECT_TRUE(picture_info.GetPicture()) << "i " << i << " j " << j;
335 } 308 }
336 } 309 }
337 310
338 // Update a partial tile that doesn't get recorded. We should expand the 311 // Update a partial tile that doesn't get recorded. We should expand the
339 // invalidation to the entire tiles that overlap it. 312 // invalidation to the entire tiles that overlap it.
340 Region small_invalidation = 313 Region small_invalidation =
341 gfx::Rect(pile_.tiling().TileBounds(3, 4).x(), 314 gfx::Rect(pile_.tiling().TileBounds(3, 4).x(),
342 pile_.tiling().TileBounds(3, 4).y() + 10, 315 pile_.tiling().TileBounds(3, 4).y() + 10,
343 1, 316 1,
344 1); 317 1);
345 UpdateAndExpandInvalidation(&small_invalidation, tiling_size(), viewport); 318 UpdateAndExpandInvalidation(&small_invalidation, tiling_size(), viewport);
346 EXPECT_TRUE(small_invalidation.Contains(gfx::UnionRects( 319 EXPECT_TRUE(small_invalidation.Contains(gfx::UnionRects(
347 pile_.tiling().TileBounds(2, 4), pile_.tiling().TileBounds(3, 4)))) 320 pile_.tiling().TileBounds(2, 4), pile_.tiling().TileBounds(3, 4))))
348 << small_invalidation.ToString(); 321 << small_invalidation.ToString();
349 322
350 // Now update with no invalidation and full viewport 323 // Now update with no invalidation and full viewport
351 Region empty_invalidation; 324 Region empty_invalidation;
352 UpdateAndExpandInvalidation( 325 UpdateAndExpandInvalidation(&empty_invalidation, tiling_size(),
353 &empty_invalidation, tiling_size(), tiling_rect()); 326 tiling_rect());
354 EXPECT_EQ(Region().ToString(), empty_invalidation.ToString()); 327 EXPECT_EQ(Region().ToString(), empty_invalidation.ToString());
355 328
356 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 329 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
357 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 330 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
358 TestPicturePile::PictureInfo& picture_info = 331 FakePicturePile::PictureInfo& picture_info =
359 pile_.picture_map() 332 pile_.picture_map()
360 .find(TestPicturePile::PictureMapKey(i, j)) 333 .find(FakePicturePile::PictureMapKey(i, j))
361 ->second; 334 ->second;
362 // Expect the invalidation frequency to be less than 1, since we just 335 // Expect the invalidation frequency to be less than 1, since we just
363 // updated with no invalidations. 336 // updated with no invalidations.
364 EXPECT_LT(picture_info.GetInvalidationFrequencyForTesting(), 1.f); 337 EXPECT_LT(picture_info.GetInvalidationFrequencyForTesting(), 1.f);
365 338
366 // We expect that there are pictures everywhere now. 339 // We expect that there are pictures everywhere now.
367 EXPECT_TRUE(picture_info.GetPicture()) << "i " << i << " j " << j; 340 EXPECT_TRUE(picture_info.GetPicture()) << "i " << i << " j " << j;
368 } 341 }
369 } 342 }
370 } 343 }
(...skipping 10 matching lines...) Expand all
381 EXPECT_FALSE(pile_.CanRasterLayerRect(rect)); 354 EXPECT_FALSE(pile_.CanRasterLayerRect(rect));
382 EXPECT_FALSE(pile_.CanRasterSlowTileCheck(rect)); 355 EXPECT_FALSE(pile_.CanRasterSlowTileCheck(rect));
383 } 356 }
384 357
385 TEST_F(PicturePileTest, FrequentInvalidationCanRaster) { 358 TEST_F(PicturePileTest, FrequentInvalidationCanRaster) {
386 // This test makes sure that if part of the page is frequently invalidated 359 // This test makes sure that if part of the page is frequently invalidated
387 // and doesn't get re-recorded, then CanRaster is not true for any 360 // and doesn't get re-recorded, then CanRaster is not true for any
388 // tiles touching it, but is true for adjacent tiles, even if it 361 // tiles touching it, but is true for adjacent tiles, even if it
389 // overlaps on borders (edge case). 362 // overlaps on borders (edge case).
390 gfx::Size new_tiling_size = 363 gfx::Size new_tiling_size =
391 gfx::ToCeiledSize(gfx::ScaleSize(pile_.tiling_size(), 4.f)); 364 gfx::ToCeiledSize(gfx::ScaleSize(tiling_size(), 4.f));
392 SetTilingSize(new_tiling_size); 365 SetTilingSize(new_tiling_size);
393 366
394 gfx::Rect tile01_borders = pile_.tiling().TileBoundsWithBorder(0, 1); 367 gfx::Rect tile01_borders = pile_.tiling().TileBoundsWithBorder(0, 1);
395 gfx::Rect tile02_borders = pile_.tiling().TileBoundsWithBorder(0, 2); 368 gfx::Rect tile02_borders = pile_.tiling().TileBoundsWithBorder(0, 2);
396 gfx::Rect tile01_noborders = pile_.tiling().TileBounds(0, 1); 369 gfx::Rect tile01_noborders = pile_.tiling().TileBounds(0, 1);
397 gfx::Rect tile02_noborders = pile_.tiling().TileBounds(0, 2); 370 gfx::Rect tile02_noborders = pile_.tiling().TileBounds(0, 2);
398 371
399 // Sanity check these two tiles are overlapping with borders, since this is 372 // Sanity check these two tiles are overlapping with borders, since this is
400 // what the test is trying to repro. 373 // what the test is trying to repro.
401 EXPECT_TRUE(tile01_borders.Intersects(tile02_borders)); 374 EXPECT_TRUE(tile01_borders.Intersects(tile02_borders));
(...skipping 13 matching lines...) Expand all
415 } 388 }
416 389
417 // Update once more with a small viewport. 390 // Update once more with a small viewport.
418 gfx::Rect viewport(tiling_size().width(), 1); 391 gfx::Rect viewport(tiling_size().width(), 1);
419 Region invalidation(tiling_rect()); 392 Region invalidation(tiling_rect());
420 UpdateAndExpandInvalidation(&invalidation, tiling_size(), viewport); 393 UpdateAndExpandInvalidation(&invalidation, tiling_size(), viewport);
421 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString()); 394 EXPECT_EQ(tiling_rect().ToString(), invalidation.ToString());
422 395
423 // Sanity check some pictures exist and others don't. 396 // Sanity check some pictures exist and others don't.
424 EXPECT_TRUE(pile_.picture_map() 397 EXPECT_TRUE(pile_.picture_map()
425 .find(TestPicturePile::PictureMapKey(0, 1)) 398 .find(FakePicturePile::PictureMapKey(0, 1))
426 ->second.GetPicture()); 399 ->second.GetPicture());
427 EXPECT_FALSE(pile_.picture_map() 400 EXPECT_FALSE(pile_.picture_map()
428 .find(TestPicturePile::PictureMapKey(0, 2)) 401 .find(FakePicturePile::PictureMapKey(0, 2))
429 ->second.GetPicture()); 402 ->second.GetPicture());
430 403
431 EXPECT_TRUE(pile_.CanRasterLayerRect(tile01_noborders)); 404 EXPECT_TRUE(pile_.CanRasterLayerRect(tile01_noborders));
432 EXPECT_TRUE(pile_.CanRasterSlowTileCheck(tile01_noborders)); 405 EXPECT_TRUE(pile_.CanRasterSlowTileCheck(tile01_noborders));
433 EXPECT_FALSE(pile_.CanRasterLayerRect(tile02_noborders)); 406 EXPECT_FALSE(pile_.CanRasterLayerRect(tile02_noborders));
434 EXPECT_FALSE(pile_.CanRasterSlowTileCheck(tile02_noborders)); 407 EXPECT_FALSE(pile_.CanRasterSlowTileCheck(tile02_noborders));
435 } 408 }
436 409
437 TEST_F(PicturePileTest, NoInvalidationValidViewport) { 410 TEST_F(PicturePileTest, NoInvalidationValidViewport) {
438 // This test validates that the recorded_viewport cache of full tiles 411 // This test validates that the recorded_viewport cache of full tiles
439 // is still valid for some use cases. If it's not, it's a performance 412 // is still valid for some use cases. If it's not, it's a performance
440 // issue because CanRaster checks will go down the slow path. 413 // issue because CanRaster checks will go down the slow path.
441 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty()); 414 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
442 415
443 // No invalidation, same viewport. 416 // No invalidation, same viewport.
444 Region invalidation; 417 Region invalidation;
445 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect()); 418 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
446 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty()); 419 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
447 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 420 EXPECT_EQ(Region().ToString(), invalidation.ToString());
448 421
449 // Partial invalidation, same viewport. 422 // Partial invalidation, same viewport.
450 invalidation = gfx::Rect(0, 0, 1, 1); 423 invalidation = gfx::Rect(0, 0, 1, 1);
451 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect()); 424 UpdateAndExpandInvalidation(&invalidation, tiling_size(), tiling_rect());
452 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty()); 425 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
453 EXPECT_EQ(gfx::Rect(0, 0, 1, 1).ToString(), invalidation.ToString()); 426 EXPECT_EQ(gfx::Rect(0, 0, 1, 1).ToString(), invalidation.ToString());
454 427
455 // No invalidation, changing viewport. 428 // No invalidation, changing viewport.
456 invalidation = Region(); 429 invalidation = Region();
457 UpdateAndExpandInvalidation( 430 UpdateAndExpandInvalidation(&invalidation, tiling_size(),
458 &invalidation, tiling_size(), gfx::Rect(5, 5, 5, 5)); 431 gfx::Rect(5, 5, 5, 5));
459 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty()); 432 EXPECT_TRUE(!pile_.recorded_viewport().IsEmpty());
460 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 433 EXPECT_EQ(Region().ToString(), invalidation.ToString());
461 } 434 }
462 435
463 TEST_F(PicturePileTest, BigFullLayerInvalidation) { 436 TEST_F(PicturePileTest, BigFullLayerInvalidation) {
464 gfx::Size huge_layer_size(100000000, 100000000); 437 gfx::Size huge_layer_size(100000000, 100000000);
465 gfx::Rect viewport(300000, 400000, 5000, 6000); 438 gfx::Rect viewport(300000, 400000, 5000, 6000);
466 439
467 // Resize the pile. 440 // Resize the pile.
468 Region invalidation; 441 Region invalidation;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 Region expected_invalidation; 570 Region expected_invalidation;
598 571
599 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); 572 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
600 SetTilingSize(base_tiling_size); 573 SetTilingSize(base_tiling_size);
601 574
602 // We should have a recording for every tile. 575 // We should have a recording for every tile.
603 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 576 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
604 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 577 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
605 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 578 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
606 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 579 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
607 TestPicturePile::PictureMapKey key(i, j); 580 FakePicturePile::PictureMapKey key(i, j);
608 TestPicturePile::PictureMap& map = pile_.picture_map(); 581 FakePicturePile::PictureMap& map = pile_.picture_map();
609 TestPicturePile::PictureMap::iterator it = map.find(key); 582 FakePicturePile::PictureMap::iterator it = map.find(key);
610 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 583 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
611 } 584 }
612 } 585 }
613 586
614 UpdateAndExpandInvalidation( 587 UpdateAndExpandInvalidation(
615 &invalidation, 588 &invalidation,
616 grow_down_tiling_size, 589 grow_down_tiling_size,
617 CornerSinglePixelRect(corner, grow_down_tiling_size)); 590 CornerSinglePixelRect(corner, grow_down_tiling_size));
618 591
619 // We should have lost the recordings in the bottom row. 592 // We should have lost all of the recordings in the bottom row as none of them
593 // are in the current interest rect (which is either the above or below it).
620 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 594 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
621 EXPECT_EQ(8, pile_.tiling().num_tiles_y()); 595 EXPECT_EQ(8, pile_.tiling().num_tiles_y());
622 for (int i = 0; i < 6; ++i) { 596 for (int i = 0; i < 6; ++i) {
623 for (int j = 0; j < 6; ++j) { 597 for (int j = 0; j < 6; ++j) {
624 TestPicturePile::PictureMapKey key(i, j); 598 FakePicturePile::PictureMapKey key(i, j);
625 TestPicturePile::PictureMap& map = pile_.picture_map(); 599 FakePicturePile::PictureMap& map = pile_.picture_map();
626 TestPicturePile::PictureMap::iterator it = map.find(key); 600 FakePicturePile::PictureMap::iterator it = map.find(key);
627 EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture()); 601 EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture());
628 } 602 }
629 } 603 }
630 604
631 // We invalidated all new pixels in the recording. 605 // We invalidated all new pixels in the recording.
632 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size), 606 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
633 gfx::Rect(base_tiling_size)); 607 gfx::Rect(base_tiling_size));
634 // But the new pixels don't cover the whole bottom row. 608 // But the new pixels don't cover the whole bottom row.
635 gfx::Rect bottom_row = gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 609 gfx::Rect bottom_row = gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
636 pile_.tiling().TileBounds(5, 5)); 610 pile_.tiling().TileBounds(5, 5));
637 EXPECT_FALSE(expected_invalidation.Contains(bottom_row)); 611 EXPECT_FALSE(expected_invalidation.Contains(bottom_row));
638 // We invalidated the entire old bottom row. 612 // We invalidated the entire old bottom row.
639 expected_invalidation.Union(bottom_row); 613 expected_invalidation.Union(bottom_row);
640 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 614 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
641 invalidation.Clear(); 615 invalidation.Clear();
642 616
643 UpdateWholePile(); 617 UpdateWholePile();
644 UpdateAndExpandInvalidation(&invalidation, 618 UpdateAndExpandInvalidation(&invalidation,
645 base_tiling_size, 619 base_tiling_size,
646 CornerSinglePixelRect(corner, base_tiling_size)); 620 CornerSinglePixelRect(corner, base_tiling_size));
647 621
648 // We should have lost the recordings that are now outside the tiling only. 622 // When shrinking, we should have lost all the recordings in the bottom row
623 // not touching the interest rect.
649 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 624 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
650 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 625 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
651 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 626 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
652 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 627 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
653 TestPicturePile::PictureMapKey key(i, j); 628 FakePicturePile::PictureMapKey key(i, j);
654 TestPicturePile::PictureMap& map = pile_.picture_map(); 629 FakePicturePile::PictureMap& map = pile_.picture_map();
655 TestPicturePile::PictureMap::iterator it = map.find(key); 630 FakePicturePile::PictureMap::iterator it = map.find(key);
656 EXPECT_EQ(j < 6, it != map.end() && it->second.GetPicture()); 631 bool expect_tile;
632 switch (corner) {
633 case TOP_LEFT:
634 case TOP_RIGHT:
635 expect_tile = j < 5;
636 break;
637 case BOTTOM_LEFT:
638 // The interest rect in the bottom left tile means we'll record it.
639 expect_tile = j < 5 || (j == 5 && i == 0);
640 break;
641 case BOTTOM_RIGHT:
642 // The interest rect in the bottom right tile means we'll record it.
643 expect_tile = j < 5 || (j == 5 && i == 5);
644 break;
645 }
646 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
657 } 647 }
658 } 648 }
659 649
660 // No invalidation when shrinking. 650 // When shrinking, the previously exposed region is invalidated.
661 expected_invalidation.Clear(); 651 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
652 gfx::Rect(base_tiling_size));
653 // The whole bottom row of tiles (except any with the interest rect) are
654 // dropped.
655 gfx::Rect bottom_row_minus_existing_corner = gfx::UnionRects(
656 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5));
657 switch (corner) {
658 case TOP_LEFT:
659 case TOP_RIGHT:
660 // No tiles are kept in the changed region because it doesn't
661 // intersect with the interest rect.
662 break;
663 case BOTTOM_LEFT:
664 bottom_row_minus_existing_corner.Subtract(
665 pile_.tiling().TileBounds(0, 5));
666 break;
667 case BOTTOM_RIGHT:
668 bottom_row_minus_existing_corner.Subtract(
669 pile_.tiling().TileBounds(5, 5));
670 break;
671 }
672
673 expected_invalidation.Union(bottom_row_minus_existing_corner);
662 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 674 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
663 invalidation.Clear(); 675 invalidation.Clear();
664 676
665 UpdateWholePile(); 677 UpdateWholePile();
666 UpdateAndExpandInvalidation( 678 UpdateAndExpandInvalidation(
667 &invalidation, 679 &invalidation,
668 grow_right_tiling_size, 680 grow_right_tiling_size,
669 CornerSinglePixelRect(corner, grow_right_tiling_size)); 681 CornerSinglePixelRect(corner, grow_right_tiling_size));
670 682
671 // We should have lost the recordings in the right column. 683 // We should have lost all of the recordings in the right column as none of
684 // them are in the current interest rect (which is either entirely left or
685 // right of it).
672 EXPECT_EQ(8, pile_.tiling().num_tiles_x()); 686 EXPECT_EQ(8, pile_.tiling().num_tiles_x());
673 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 687 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
674 for (int i = 0; i < 6; ++i) { 688 for (int i = 0; i < 6; ++i) {
675 for (int j = 0; j < 6; ++j) { 689 for (int j = 0; j < 6; ++j) {
676 TestPicturePile::PictureMapKey key(i, j); 690 FakePicturePile::PictureMapKey key(i, j);
677 TestPicturePile::PictureMap& map = pile_.picture_map(); 691 FakePicturePile::PictureMap& map = pile_.picture_map();
678 TestPicturePile::PictureMap::iterator it = map.find(key); 692 FakePicturePile::PictureMap::iterator it = map.find(key);
679 EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture()); 693 EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture());
680 } 694 }
681 } 695 }
682 696
683 // We invalidated all new pixels in the recording. 697 // We invalidated all new pixels in the recording.
684 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size), 698 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
685 gfx::Rect(base_tiling_size)); 699 gfx::Rect(base_tiling_size));
686 // But the new pixels don't cover the whole right_column. 700 // But the new pixels don't cover the whole right_column.
687 gfx::Rect right_column = gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 701 gfx::Rect right_column = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
688 pile_.tiling().TileBounds(5, 5)); 702 pile_.tiling().TileBounds(5, 5));
689 EXPECT_FALSE(expected_invalidation.Contains(right_column)); 703 EXPECT_FALSE(expected_invalidation.Contains(right_column));
690 // We invalidated the entire old right column. 704 // We invalidated the entire old right column.
691 expected_invalidation.Union(right_column); 705 expected_invalidation.Union(right_column);
692 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 706 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
693 invalidation.Clear(); 707 invalidation.Clear();
694 708
695 UpdateWholePile(); 709 UpdateWholePile();
696 UpdateAndExpandInvalidation(&invalidation, 710 UpdateAndExpandInvalidation(&invalidation,
697 base_tiling_size, 711 base_tiling_size,
698 CornerSinglePixelRect(corner, base_tiling_size)); 712 CornerSinglePixelRect(corner, base_tiling_size));
699 713
700 // We should have lost the recordings that are now outside the tiling only. 714 // When shrinking, we should have lost all the recordings in the right column
715 // not touching the interest rect.
701 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 716 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
702 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 717 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
703 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 718 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
704 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 719 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
705 TestPicturePile::PictureMapKey key(i, j); 720 FakePicturePile::PictureMapKey key(i, j);
706 TestPicturePile::PictureMap& map = pile_.picture_map(); 721 FakePicturePile::PictureMap& map = pile_.picture_map();
707 TestPicturePile::PictureMap::iterator it = map.find(key); 722 FakePicturePile::PictureMap::iterator it = map.find(key);
708 EXPECT_EQ(i < 6, it != map.end() && it->second.GetPicture()); 723 bool expect_tile;
724 switch (corner) {
725 case TOP_LEFT:
726 case BOTTOM_LEFT:
727 // No tiles are kept in the changed region because it doesn't
728 // intersect with the interest rect.
729 expect_tile = i < 5;
730 break;
731 case TOP_RIGHT:
732 // The interest rect in the top right tile means we'll record it.
733 expect_tile = i < 5 || (j == 0 && i == 5);
734 break;
735 case BOTTOM_RIGHT:
736 // The interest rect in the bottom right tile means we'll record it.
737 expect_tile = i < 5 || (j == 5 && i == 5);
738 break;
739 }
740 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
709 } 741 }
710 } 742 }
711 743
712 // No invalidation when shrinking. 744 // When shrinking, the previously exposed region is invalidated.
713 expected_invalidation.Clear(); 745 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
746 gfx::Rect(base_tiling_size));
747 // The whole right column of tiles (except for ones with the interest rect)
748 // are dropped.
749 gfx::Rect right_column_minus_existing_corner = gfx::UnionRects(
750 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 5));
751 switch (corner) {
752 case TOP_LEFT:
753 case BOTTOM_LEFT:
754 break;
755 case TOP_RIGHT:
756 right_column_minus_existing_corner.Subtract(
757 pile_.tiling().TileBounds(5, 0));
758 break;
759 case BOTTOM_RIGHT:
760 right_column_minus_existing_corner.Subtract(
761 pile_.tiling().TileBounds(5, 5));
762 break;
763 }
764 expected_invalidation.Union(right_column_minus_existing_corner);
714 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 765 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
715 invalidation.Clear(); 766 invalidation.Clear();
716 767
717 UpdateWholePile(); 768 UpdateWholePile();
718 UpdateAndExpandInvalidation( 769 UpdateAndExpandInvalidation(
719 &invalidation, 770 &invalidation,
720 grow_both_tiling_size, 771 grow_both_tiling_size,
721 CornerSinglePixelRect(corner, grow_both_tiling_size)); 772 CornerSinglePixelRect(corner, grow_both_tiling_size));
722 773
723 // We should have lost the recordings in the right column and bottom row. 774 // We should have lost the recordings in the right column and bottom row.
724 EXPECT_EQ(8, pile_.tiling().num_tiles_x()); 775 EXPECT_EQ(8, pile_.tiling().num_tiles_x());
725 EXPECT_EQ(8, pile_.tiling().num_tiles_y()); 776 EXPECT_EQ(8, pile_.tiling().num_tiles_y());
726 for (int i = 0; i < 6; ++i) { 777 for (int i = 0; i < 6; ++i) {
727 for (int j = 0; j < 6; ++j) { 778 for (int j = 0; j < 6; ++j) {
728 TestPicturePile::PictureMapKey key(i, j); 779 FakePicturePile::PictureMapKey key(i, j);
729 TestPicturePile::PictureMap& map = pile_.picture_map(); 780 FakePicturePile::PictureMap& map = pile_.picture_map();
730 TestPicturePile::PictureMap::iterator it = map.find(key); 781 FakePicturePile::PictureMap::iterator it = map.find(key);
731 EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture()); 782 EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture());
732 } 783 }
733 } 784 }
734 785
735 // We invalidated all new pixels in the recording. 786 // We invalidated all new pixels in the recording.
736 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size), 787 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
737 gfx::Rect(base_tiling_size)); 788 gfx::Rect(base_tiling_size));
738 // But the new pixels don't cover the whole right_column. 789 // But the new pixels don't cover the whole right column or bottom row.
739 Region right_column_and_bottom_row = 790 Region right_column_and_bottom_row =
740 UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 791 UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
741 pile_.tiling().TileBounds(5, 5)), 792 pile_.tiling().TileBounds(5, 5)),
742 gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 793 gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
743 pile_.tiling().TileBounds(5, 5))); 794 pile_.tiling().TileBounds(5, 5)));
744 EXPECT_FALSE(expected_invalidation.Contains(right_column_and_bottom_row)); 795 EXPECT_FALSE(expected_invalidation.Contains(right_column_and_bottom_row));
745 // We invalidated the entire old right column and the old bottom row. 796 // We invalidated the entire old right column and the old bottom row.
746 expected_invalidation.Union(right_column_and_bottom_row); 797 expected_invalidation.Union(right_column_and_bottom_row);
747 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 798 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
748 invalidation.Clear(); 799 invalidation.Clear();
749 800
750 UpdateWholePile(); 801 UpdateWholePile();
751 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect()); 802 UpdateAndExpandInvalidation(&invalidation, base_tiling_size,
803 CornerSinglePixelRect(corner, base_tiling_size));
752 804
753 // We should have lost the recordings that are now outside the tiling only. 805 // We should have lost the recordings in the right column and bottom row,
806 // except where it intersects the interest rect.
754 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 807 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
755 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 808 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
756 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 809 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
757 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 810 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
758 TestPicturePile::PictureMapKey key(i, j); 811 FakePicturePile::PictureMapKey key(i, j);
759 TestPicturePile::PictureMap& map = pile_.picture_map(); 812 FakePicturePile::PictureMap& map = pile_.picture_map();
760 TestPicturePile::PictureMap::iterator it = map.find(key); 813 FakePicturePile::PictureMap::iterator it = map.find(key);
761 EXPECT_EQ(i < 6 && j < 6, it != map.end() && it->second.GetPicture()); 814 bool expect_tile;
815 switch (corner) {
816 case TOP_LEFT:
817 expect_tile = i < 5 && j < 5;
818 break;
819 case TOP_RIGHT:
820 // The interest rect in the top right tile means we'll record it.
821 expect_tile = (i < 5 && j < 5) || (j == 0 && i == 5);
822 break;
823 case BOTTOM_LEFT:
824 // The interest rect in the bottom left tile means we'll record it.
825 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 0);
826 break;
827 case BOTTOM_RIGHT:
828 // The interest rect in the bottom right tile means we'll record it.
829 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 5);
830 break;
831 }
832 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture())
833 << i << "," << j;
762 } 834 }
763 } 835 }
764 836
765 // No invalidation when shrinking. 837 // We invalidated all previous pixels in the recording.
766 expected_invalidation.Clear(); 838 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
839 gfx::Rect(base_tiling_size));
840 // The whole right column and bottom row of tiles (except for ones with the
841 // interest rect) are dropped.
842 Region right_column_and_bottom_row_minus_existing_corner =
843 right_column_and_bottom_row;
844 switch (corner) {
845 case TOP_LEFT:
846 break;
847 case BOTTOM_LEFT:
848 right_column_and_bottom_row_minus_existing_corner.Subtract(
849 pile_.tiling().TileBounds(0, 5));
850 break;
851 case TOP_RIGHT:
852 right_column_and_bottom_row_minus_existing_corner.Subtract(
853 pile_.tiling().TileBounds(5, 0));
854 break;
855 case BOTTOM_RIGHT:
856 right_column_and_bottom_row_minus_existing_corner.Subtract(
857 pile_.tiling().TileBounds(5, 5));
858 break;
859 }
860 expected_invalidation.Union(
861 right_column_and_bottom_row_minus_existing_corner);
767 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 862 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
768 invalidation.Clear(); 863 invalidation.Clear();
769 } 864 }
770 865
771 TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { 866 TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) {
772 Corner corner = GetParam(); 867 Corner corner = GetParam();
773 868
774 // This size chosen to be larger than the interest rect size, which is 869 // This size chosen to be larger than the interest rect size, which is
775 // at least kPixelDistanceToRecord * 2 in each dimension. 870 // at least kPixelDistanceToRecord * 2 in each dimension.
776 int tile_size = 100000; 871 int tile_size = 100000;
(...skipping 12 matching lines...) Expand all
789 Region expected_invalidation; 884 Region expected_invalidation;
790 885
791 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); 886 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
792 SetTilingSize(base_tiling_size); 887 SetTilingSize(base_tiling_size);
793 888
794 // We should have a recording for every tile. 889 // We should have a recording for every tile.
795 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 890 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
796 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 891 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
797 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 892 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
798 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 893 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
799 TestPicturePile::PictureMapKey key(i, j); 894 FakePicturePile::PictureMapKey key(i, j);
800 TestPicturePile::PictureMap& map = pile_.picture_map(); 895 FakePicturePile::PictureMap& map = pile_.picture_map();
801 TestPicturePile::PictureMap::iterator it = map.find(key); 896 FakePicturePile::PictureMap::iterator it = map.find(key);
802 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 897 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
803 } 898 }
804 } 899 }
805 900
806 UpdateAndExpandInvalidation( 901 // In this test (unlike the large resize test), as all growing and shrinking
807 &invalidation, 902 // happens within tiles, the resulting invalidation is symmetrical, so use
808 grow_down_tiling_size, 903 // this enum to repeat the test both ways.
809 CornerSinglePixelRect(corner, grow_down_tiling_size)); 904 enum ChangeDirection { GROW, SHRINK, LAST_DIRECTION = SHRINK };
810 905
811 // We should have lost the recordings in the bottom row that do not intersect 906 // Grow downward.
812 // the interest rect. 907 for (int dir = 0; dir <= LAST_DIRECTION; ++dir) {
813 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 908 gfx::Size new_tiling_size =
814 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 909 dir == GROW ? grow_down_tiling_size : base_tiling_size;
815 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 910 UpdateWholePile();
816 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 911 UpdateAndExpandInvalidation(&invalidation, new_tiling_size,
817 TestPicturePile::PictureMapKey key(i, j); 912 CornerSinglePixelRect(corner, new_tiling_size));
818 TestPicturePile::PictureMap& map = pile_.picture_map(); 913
819 TestPicturePile::PictureMap::iterator it = map.find(key); 914 // We should have lost the recordings in the bottom row that do not
820 bool expect_tile; 915 // intersect the interest rect.
916 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
917 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
918 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
919 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
920 FakePicturePile::PictureMapKey key(i, j);
921 FakePicturePile::PictureMap& map = pile_.picture_map();
922 FakePicturePile::PictureMap::iterator it = map.find(key);
923 bool expect_tile;
924 switch (corner) {
925 case TOP_LEFT:
926 case TOP_RIGHT:
927 expect_tile = j < 5;
928 break;
929 case BOTTOM_LEFT:
930 // The interest rect in the bottom left tile means we'll record it.
931 expect_tile = j < 5 || (j == 5 && i == 0);
932 break;
933 case BOTTOM_RIGHT:
934 // The interest rect in the bottom right tile means we'll record it.
935 expect_tile = j < 5 || (j == 5 && i == 5);
936 break;
937 }
938 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
939 }
940 }
941
942 // We invalidated the bottom row outside the new interest rect. The tile
943 // that insects the interest rect in invalidated only on its newly
944 // exposed or previously exposed pixels.
945 if (dir == GROW) {
946 // Only calculate the expected invalidation while growing, as the tile
947 // bounds post-growing is the newly exposed / previously exposed sizes.
948 // Post-shrinking, the tile bounds are smaller, so can't be used.
821 switch (corner) { 949 switch (corner) {
822 case TOP_LEFT: 950 case TOP_LEFT:
823 case TOP_RIGHT: 951 case TOP_RIGHT:
824 expect_tile = j < 5; 952 expected_invalidation = gfx::UnionRects(
953 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5));
825 break; 954 break;
826 case BOTTOM_LEFT: 955 case BOTTOM_LEFT:
827 // The interest rect in the bottom left tile means we'll record it. 956 expected_invalidation = gfx::UnionRects(
828 expect_tile = j < 5 || (j == 5 && i == 0); 957 pile_.tiling().TileBounds(1, 5), pile_.tiling().TileBounds(5, 5));
958 expected_invalidation.Union(SubtractRects(
959 pile_.tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
829 break; 960 break;
830 case BOTTOM_RIGHT: 961 case BOTTOM_RIGHT:
831 // The interest rect in the bottom right tile means we'll record it. 962 expected_invalidation = gfx::UnionRects(
832 expect_tile = j < 5 || (j == 5 && i == 5); 963 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(4, 5));
833 break; 964 expected_invalidation.Union(SubtractRects(
834 } 965 pile_.tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
835 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()); 966 break;
836 } 967 }
837 } 968 }
838 969 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
839 // We invalidated the bottom row outside the new interest rect. The tile that 970 invalidation.Clear();
840 // insects the interest rect in invalidated only on its new pixels. 971 }
841 switch (corner) { 972
842 case TOP_LEFT: 973 // Grow right.
843 case TOP_RIGHT: 974 for (int dir = 0; dir <= LAST_DIRECTION; ++dir) {
844 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 975 gfx::Size new_tiling_size =
845 pile_.tiling().TileBounds(5, 5)); 976 dir == GROW ? grow_right_tiling_size : base_tiling_size;
846 break; 977 UpdateWholePile();
847 case BOTTOM_LEFT: 978 UpdateAndExpandInvalidation(&invalidation, new_tiling_size,
848 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(1, 5), 979 CornerSinglePixelRect(corner, new_tiling_size));
849 pile_.tiling().TileBounds(5, 5)); 980
850 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(0, 5), 981 // We should have lost the recordings in the right column.
851 gfx::Rect(base_tiling_size))); 982 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
852 break; 983 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
853 case BOTTOM_RIGHT: 984 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
854 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 985 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
855 pile_.tiling().TileBounds(4, 5)); 986 FakePicturePile::PictureMapKey key(i, j);
856 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 5), 987 FakePicturePile::PictureMap& map = pile_.picture_map();
857 gfx::Rect(base_tiling_size))); 988 FakePicturePile::PictureMap::iterator it = map.find(key);
858 break; 989 bool expect_tile;
859 } 990 switch (corner) {
860 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 991 case TOP_LEFT:
861 invalidation.Clear(); 992 case BOTTOM_LEFT:
862 993 expect_tile = i < 5;
863 UpdateWholePile(); 994 break;
864 UpdateAndExpandInvalidation(&invalidation, 995 case TOP_RIGHT:
865 base_tiling_size, 996 // The interest rect in the top right tile means we'll record it.
866 CornerSinglePixelRect(corner, base_tiling_size)); 997 expect_tile = i < 5 || (j == 0 && i == 5);
867 998 break;
868 // We should have lost nothing. 999 case BOTTOM_RIGHT:
869 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1000 // The interest rect in the bottom right tile means we'll record it.
870 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1001 expect_tile = i < 5 || (j == 5 && i == 5);
871 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1002 break;
872 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1003 }
873 TestPicturePile::PictureMapKey key(i, j); 1004 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture());
874 TestPicturePile::PictureMap& map = pile_.picture_map(); 1005 }
875 TestPicturePile::PictureMap::iterator it = map.find(key); 1006 }
876 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1007
877 } 1008 // We invalidated the right column outside the new interest rect. The tile
878 } 1009 // that insects the interest rect in invalidated only on its new or
879 1010 // previously exposed pixels.
880 // We invalidated nothing. 1011 if (dir == GROW) {
881 expected_invalidation.Clear(); 1012 // Calculate the expected invalidation the first time through the loop.
882 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
883 invalidation.Clear();
884
885 UpdateWholePile();
886 UpdateAndExpandInvalidation(
887 &invalidation,
888 grow_right_tiling_size,
889 CornerSinglePixelRect(corner, grow_right_tiling_size));
890
891 // We should have lost the recordings in the right column.
892 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
893 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
894 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
895 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
896 TestPicturePile::PictureMapKey key(i, j);
897 TestPicturePile::PictureMap& map = pile_.picture_map();
898 TestPicturePile::PictureMap::iterator it = map.find(key);
899 bool expect_tile;
900 switch (corner) { 1013 switch (corner) {
901 case TOP_LEFT: 1014 case TOP_LEFT:
902 case BOTTOM_LEFT: 1015 case BOTTOM_LEFT:
903 expect_tile = i < 5; 1016 expected_invalidation = gfx::UnionRects(
1017 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 5));
904 break; 1018 break;
905 case TOP_RIGHT: 1019 case TOP_RIGHT:
906 // The interest rect in the top right tile means we'll record it. 1020 expected_invalidation = gfx::UnionRects(
907 expect_tile = i < 5 || (j == 0 && i == 5); 1021 pile_.tiling().TileBounds(5, 1), pile_.tiling().TileBounds(5, 5));
1022 expected_invalidation.Union(SubtractRects(
1023 pile_.tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
908 break; 1024 break;
909 case BOTTOM_RIGHT: 1025 case BOTTOM_RIGHT:
910 // The interest rect in the bottom right tile means we'll record it. 1026 expected_invalidation = gfx::UnionRects(
911 expect_tile = i < 5 || (j == 5 && i == 5); 1027 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 4));
912 break; 1028 expected_invalidation.Union(SubtractRects(
913 } 1029 pile_.tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
914 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()); 1030 break;
915 } 1031 }
916 } 1032 }
917 1033 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
918 // We invalidated the right column outside the new interest rect. The tile 1034 invalidation.Clear();
919 // that insects the interest rect in invalidated only on its new pixels. 1035 }
920 switch (corner) { 1036
921 case TOP_LEFT: 1037 // Grow both.
922 case BOTTOM_LEFT: 1038 for (int dir = 0; dir <= LAST_DIRECTION; ++dir) {
923 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 1039 gfx::Size new_tiling_size =
924 pile_.tiling().TileBounds(5, 5)); 1040 dir == GROW ? grow_both_tiling_size : base_tiling_size;
925 break; 1041 UpdateWholePile();
926 case TOP_RIGHT: 1042 UpdateAndExpandInvalidation(&invalidation, new_tiling_size,
927 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 1), 1043 CornerSinglePixelRect(corner, new_tiling_size));
928 pile_.tiling().TileBounds(5, 5)); 1044
929 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 0), 1045 // We should have lost the recordings in the right column and bottom row.
930 gfx::Rect(base_tiling_size))); 1046 // The tile that insects the interest rect in invalidated only on its new
931 break; 1047 // or previously exposed pixels.
932 case BOTTOM_RIGHT: 1048 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
933 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 1049 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
934 pile_.tiling().TileBounds(5, 4)); 1050 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
935 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 5), 1051 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
936 gfx::Rect(base_tiling_size))); 1052 FakePicturePile::PictureMapKey key(i, j);
937 break; 1053 FakePicturePile::PictureMap& map = pile_.picture_map();
938 } 1054 FakePicturePile::PictureMap::iterator it = map.find(key);
939 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1055 bool expect_tile;
940 invalidation.Clear(); 1056 switch (corner) {
941 1057 case TOP_LEFT:
942 UpdateWholePile(); 1058 expect_tile = i < 5 && j < 5;
943 UpdateAndExpandInvalidation(&invalidation, 1059 break;
944 base_tiling_size, 1060 case TOP_RIGHT:
945 CornerSinglePixelRect(corner, base_tiling_size)); 1061 // The interest rect in the top right tile means we'll record it.
946 1062 expect_tile = (i < 5 && j < 5) || (j == 0 && i == 5);
947 // We should have lost nothing. 1063 break;
948 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1064 case BOTTOM_LEFT:
949 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1065 // The interest rect in the bottom left tile means we'll record it.
950 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1066 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 0);
951 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1067 break;
952 TestPicturePile::PictureMapKey key(i, j); 1068 case BOTTOM_RIGHT:
953 TestPicturePile::PictureMap& map = pile_.picture_map(); 1069 // The interest rect in the bottom right tile means we'll record it.
954 TestPicturePile::PictureMap::iterator it = map.find(key); 1070 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 5);
955 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1071 break;
956 } 1072 }
957 } 1073 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture())
958 1074 << i << "," << j;
959 // We invalidated nothing. 1075 }
960 expected_invalidation.Clear(); 1076 }
961 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1077
962 invalidation.Clear(); 1078 // We invalidated the right column and the bottom row outside the new
963 1079 // interest rect. The tile that insects the interest rect in invalidated
964 UpdateWholePile(); 1080 // only on its new or previous exposed pixels.
965 UpdateAndExpandInvalidation( 1081 if (dir == GROW) {
966 &invalidation, 1082 // Calculate the expected invalidation the first time through the loop.
967 grow_both_tiling_size,
968 CornerSinglePixelRect(corner, grow_both_tiling_size));
969
970 // We should have lost the recordings in the right column and bottom row. The
971 // tile that insects the interest rect in invalidated only on its new pixels.
972 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
973 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
974 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
975 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
976 TestPicturePile::PictureMapKey key(i, j);
977 TestPicturePile::PictureMap& map = pile_.picture_map();
978 TestPicturePile::PictureMap::iterator it = map.find(key);
979 bool expect_tile;
980 switch (corner) { 1083 switch (corner) {
981 case TOP_LEFT: 1084 case TOP_LEFT:
982 expect_tile = i < 5 && j < 5; 1085 expected_invalidation = gfx::UnionRects(
1086 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 5));
1087 expected_invalidation.Union(
1088 gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
1089 pile_.tiling().TileBounds(5, 5)));
983 break; 1090 break;
984 case TOP_RIGHT: 1091 case TOP_RIGHT:
985 // The interest rect in the top right tile means we'll record it. 1092 expected_invalidation = gfx::UnionRects(
986 expect_tile = (i < 5 && j < 5) || (j == 0 && i == 5); 1093 pile_.tiling().TileBounds(5, 1), pile_.tiling().TileBounds(5, 5));
1094 expected_invalidation.Union(
1095 gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
1096 pile_.tiling().TileBounds(5, 5)));
1097 expected_invalidation.Union(SubtractRects(
1098 pile_.tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size)));
987 break; 1099 break;
988 case BOTTOM_LEFT: 1100 case BOTTOM_LEFT:
989 // The interest rect in the bottom left tile means we'll record it. 1101 expected_invalidation = gfx::UnionRects(
990 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 0); 1102 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 5));
1103 expected_invalidation.Union(
1104 gfx::UnionRects(pile_.tiling().TileBounds(1, 5),
1105 pile_.tiling().TileBounds(5, 5)));
1106 expected_invalidation.Union(SubtractRects(
1107 pile_.tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size)));
991 break; 1108 break;
992 case BOTTOM_RIGHT: 1109 case BOTTOM_RIGHT:
993 // The interest rect in the bottom right tile means we'll record it. 1110 expected_invalidation = gfx::UnionRects(
994 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 5); 1111 pile_.tiling().TileBounds(5, 0), pile_.tiling().TileBounds(5, 4));
995 break; 1112 expected_invalidation.Union(
996 } 1113 gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
997 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()) 1114 pile_.tiling().TileBounds(4, 5)));
998 << i << "," << j; 1115 expected_invalidation.Union(SubtractRegions(
999 } 1116 pile_.tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
1000 } 1117 break;
1001 1118 }
1002 // We invalidated the right column and the bottom row outside the new interest 1119 }
1003 // rect. The tile that insects the interest rect in invalidated only on its 1120 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1004 // new pixels. 1121 invalidation.Clear();
1005 switch (corner) { 1122 }
1006 case TOP_LEFT:
1007 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
1008 pile_.tiling().TileBounds(5, 5));
1009 expected_invalidation.Union(gfx::UnionRects(
1010 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5)));
1011 break;
1012 case TOP_RIGHT:
1013 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 1),
1014 pile_.tiling().TileBounds(5, 5));
1015 expected_invalidation.Union(gfx::UnionRects(
1016 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(5, 5)));
1017 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(5, 0),
1018 gfx::Rect(base_tiling_size)));
1019 break;
1020 case BOTTOM_LEFT:
1021 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
1022 pile_.tiling().TileBounds(5, 5));
1023 expected_invalidation.Union(gfx::UnionRects(
1024 pile_.tiling().TileBounds(1, 5), pile_.tiling().TileBounds(5, 5)));
1025 expected_invalidation.Union(SubtractRects(pile_.tiling().TileBounds(0, 5),
1026 gfx::Rect(base_tiling_size)));
1027 break;
1028 case BOTTOM_RIGHT:
1029 expected_invalidation = gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
1030 pile_.tiling().TileBounds(5, 4));
1031 expected_invalidation.Union(gfx::UnionRects(
1032 pile_.tiling().TileBounds(0, 5), pile_.tiling().TileBounds(4, 5)));
1033 expected_invalidation.Union(SubtractRegions(
1034 pile_.tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size)));
1035 break;
1036 }
1037 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1038 invalidation.Clear();
1039
1040 UpdateWholePile();
1041 UpdateAndExpandInvalidation(&invalidation,
1042 base_tiling_size,
1043 CornerSinglePixelRect(corner, base_tiling_size));
1044
1045 // We should have lost nothing.
1046 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1047 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1048 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1049 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1050 TestPicturePile::PictureMapKey key(i, j);
1051 TestPicturePile::PictureMap& map = pile_.picture_map();
1052 TestPicturePile::PictureMap::iterator it = map.find(key);
1053 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1054 }
1055 }
1056
1057 // We invalidated nothing.
1058 expected_invalidation.Clear();
1059 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1060 invalidation.Clear();
1061 } 1123 }
1062 1124
1063 INSTANTIATE_TEST_CASE_P( 1125 INSTANTIATE_TEST_CASE_P(
1064 PicturePileResizeCornerTests, 1126 PicturePileResizeCornerTests,
1065 PicturePileResizeCornerTest, 1127 PicturePileResizeCornerTest,
1066 ::testing::Values(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT)); 1128 ::testing::Values(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT));
1067 1129
1068 TEST_F(PicturePileTest, ResizePileInsideInterestRect) { 1130 TEST_F(PicturePileTest, ResizePileInsideInterestRect) {
1069 // This size chosen to be small enough that all the rects below fit inside the 1131 // This size chosen to be small enough that all the rects below fit inside the
1070 // the interest rect, so they are smaller than kPixelDistanceToRecord in each 1132 // the interest rect, so they are smaller than kPixelDistanceToRecord in each
1071 // dimension. 1133 // dimension.
1072 int tile_size = 100; 1134 int tile_size = 100;
1073 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); 1135 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size);
1074 gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size); 1136 gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size);
1075 gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size); 1137 gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size);
1076 gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size); 1138 gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size);
1077 1139
1078 Region invalidation; 1140 Region invalidation;
1079 Region expected_invalidation; 1141 Region expected_invalidation;
1080 1142
1081 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); 1143 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
1082 SetTilingSize(base_tiling_size); 1144 SetTilingSize(base_tiling_size);
1083 1145
1084 // We should have a recording for every tile. 1146 // We should have a recording for every tile.
1085 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1147 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1086 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1148 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1087 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1149 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1088 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1150 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1089 TestPicturePile::PictureMapKey key(i, j); 1151 FakePicturePile::PictureMapKey key(i, j);
1090 TestPicturePile::PictureMap& map = pile_.picture_map(); 1152 FakePicturePile::PictureMap& map = pile_.picture_map();
1091 TestPicturePile::PictureMap::iterator it = map.find(key); 1153 FakePicturePile::PictureMap::iterator it = map.find(key);
1092 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1154 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1093 } 1155 }
1094 } 1156 }
1095 1157
1096 UpdateAndExpandInvalidation( 1158 UpdateAndExpandInvalidation(
1097 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1)); 1159 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
1098 1160
1099 // We should have a recording for every tile. 1161 // We should have a recording for every tile.
1100 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1162 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1101 EXPECT_EQ(8, pile_.tiling().num_tiles_y()); 1163 EXPECT_EQ(8, pile_.tiling().num_tiles_y());
1102 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1164 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1103 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1165 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1104 TestPicturePile::PictureMapKey key(i, j); 1166 FakePicturePile::PictureMapKey key(i, j);
1105 TestPicturePile::PictureMap& map = pile_.picture_map(); 1167 FakePicturePile::PictureMap& map = pile_.picture_map();
1106 TestPicturePile::PictureMap::iterator it = map.find(key); 1168 FakePicturePile::PictureMap::iterator it = map.find(key);
1107 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1169 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1108 } 1170 }
1109 } 1171 }
1110 1172
1111 // We invalidated the newly exposed pixels on the bottom row of tiles. 1173 // We invalidated the newly exposed pixels on the bottom row of tiles.
1112 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size), 1174 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
1113 gfx::Rect(base_tiling_size)); 1175 gfx::Rect(base_tiling_size));
1114 Region bottom_row_new_pixels = 1176 Region bottom_row_new_pixels =
1115 SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 1177 SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
1116 pile_.tiling().TileBounds(5, 5)), 1178 pile_.tiling().TileBounds(5, 5)),
1117 gfx::Rect(base_tiling_size)); 1179 gfx::Rect(base_tiling_size));
1118 EXPECT_TRUE(expected_invalidation.Contains(bottom_row_new_pixels)); 1180 EXPECT_TRUE(expected_invalidation.Contains(bottom_row_new_pixels));
1119 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1181 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1120 invalidation.Clear(); 1182 invalidation.Clear();
1121 1183
1122 UpdateWholePile(); 1184 UpdateWholePile();
1123 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); 1185 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
1124 1186
1125 // We should have a recording for every tile. 1187 // We should have a recording for every tile.
1126 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1188 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1127 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1189 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1128 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1190 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1129 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1191 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1130 TestPicturePile::PictureMapKey key(i, j); 1192 FakePicturePile::PictureMapKey key(i, j);
1131 TestPicturePile::PictureMap& map = pile_.picture_map(); 1193 FakePicturePile::PictureMap& map = pile_.picture_map();
1132 TestPicturePile::PictureMap::iterator it = map.find(key); 1194 FakePicturePile::PictureMap::iterator it = map.find(key);
1133 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1195 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1134 } 1196 }
1135 } 1197 }
1136 1198
1137 // No invalidation when shrinking. 1199 // We invalidated the previously exposed pixels on the bottom row of tiles.
1138 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1200 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
1201 gfx::Rect(base_tiling_size));
1202 EXPECT_TRUE(expected_invalidation.Contains(bottom_row_new_pixels));
1203 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1139 invalidation.Clear(); 1204 invalidation.Clear();
1140 1205
1141 UpdateWholePile(); 1206 UpdateWholePile();
1142 UpdateAndExpandInvalidation( 1207 UpdateAndExpandInvalidation(
1143 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1)); 1208 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
1144 1209
1145 // We should have a recording for every tile. 1210 // We should have a recording for every tile.
1146 EXPECT_EQ(8, pile_.tiling().num_tiles_x()); 1211 EXPECT_EQ(8, pile_.tiling().num_tiles_x());
1147 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1212 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1148 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1213 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1149 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1214 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1150 TestPicturePile::PictureMapKey key(i, j); 1215 FakePicturePile::PictureMapKey key(i, j);
1151 TestPicturePile::PictureMap& map = pile_.picture_map(); 1216 FakePicturePile::PictureMap& map = pile_.picture_map();
1152 TestPicturePile::PictureMap::iterator it = map.find(key); 1217 FakePicturePile::PictureMap::iterator it = map.find(key);
1153 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1218 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1154 } 1219 }
1155 } 1220 }
1156 1221
1157 // We invalidated the newly exposed pixels on the right column of tiles. 1222 // We invalidated the newly exposed pixels on the right column of tiles.
1158 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size), 1223 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
1159 gfx::Rect(base_tiling_size)); 1224 gfx::Rect(base_tiling_size));
1160 Region right_column_new_pixels = 1225 Region right_column_new_pixels =
1161 SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 1226 SubtractRegions(gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
1162 pile_.tiling().TileBounds(5, 5)), 1227 pile_.tiling().TileBounds(5, 5)),
1163 gfx::Rect(base_tiling_size)); 1228 gfx::Rect(base_tiling_size));
1164 EXPECT_TRUE(expected_invalidation.Contains(right_column_new_pixels)); 1229 EXPECT_TRUE(expected_invalidation.Contains(right_column_new_pixels));
1165 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1230 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1166 invalidation.Clear(); 1231 invalidation.Clear();
1167 1232
1168 UpdateWholePile(); 1233 UpdateWholePile();
1169 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); 1234 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
1170 1235
1171 // We should have lost the recordings that are now outside the tiling only. 1236 // We should have lost the recordings that are now outside the tiling only.
1172 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1237 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1173 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1238 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1174 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1239 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1175 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1240 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1176 TestPicturePile::PictureMapKey key(i, j); 1241 FakePicturePile::PictureMapKey key(i, j);
1177 TestPicturePile::PictureMap& map = pile_.picture_map(); 1242 FakePicturePile::PictureMap& map = pile_.picture_map();
1178 TestPicturePile::PictureMap::iterator it = map.find(key); 1243 FakePicturePile::PictureMap::iterator it = map.find(key);
1179 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1244 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1180 } 1245 }
1181 } 1246 }
1182 1247
1183 // No invalidation when shrinking. 1248 // We invalidated the previously exposed pixels on the right column of tiles.
1184 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1249 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
1250 gfx::Rect(base_tiling_size));
1251 EXPECT_TRUE(expected_invalidation.Contains(right_column_new_pixels));
1252 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1185 invalidation.Clear(); 1253 invalidation.Clear();
1186 1254
1187 UpdateWholePile(); 1255 UpdateWholePile();
1188 UpdateAndExpandInvalidation( 1256 UpdateAndExpandInvalidation(
1189 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1)); 1257 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
1190 1258
1191 // We should have a recording for every tile. 1259 // We should have a recording for every tile.
1192 EXPECT_EQ(8, pile_.tiling().num_tiles_x()); 1260 EXPECT_EQ(8, pile_.tiling().num_tiles_x());
1193 EXPECT_EQ(8, pile_.tiling().num_tiles_y()); 1261 EXPECT_EQ(8, pile_.tiling().num_tiles_y());
1194 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1262 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1195 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1263 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1196 TestPicturePile::PictureMapKey key(i, j); 1264 FakePicturePile::PictureMapKey key(i, j);
1197 TestPicturePile::PictureMap& map = pile_.picture_map(); 1265 FakePicturePile::PictureMap& map = pile_.picture_map();
1198 TestPicturePile::PictureMap::iterator it = map.find(key); 1266 FakePicturePile::PictureMap::iterator it = map.find(key);
1199 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1267 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1200 } 1268 }
1201 } 1269 }
1202 1270
1203 // We invalidated the newly exposed pixels on the bottom row and right column 1271 // We invalidated the newly exposed pixels on the bottom row and right column
1204 // of tiles. 1272 // of tiles.
1205 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size), 1273 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
1206 gfx::Rect(base_tiling_size)); 1274 gfx::Rect(base_tiling_size));
1207 Region bottom_row_and_right_column_new_pixels = SubtractRegions( 1275 Region bottom_row_and_right_column_new_pixels = SubtractRegions(
1208 UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5), 1276 UnionRegions(gfx::UnionRects(pile_.tiling().TileBounds(0, 5),
1209 pile_.tiling().TileBounds(5, 5)), 1277 pile_.tiling().TileBounds(5, 5)),
1210 gfx::UnionRects(pile_.tiling().TileBounds(5, 0), 1278 gfx::UnionRects(pile_.tiling().TileBounds(5, 0),
1211 pile_.tiling().TileBounds(5, 5))), 1279 pile_.tiling().TileBounds(5, 5))),
1212 gfx::Rect(base_tiling_size)); 1280 gfx::Rect(base_tiling_size));
1213 EXPECT_TRUE( 1281 EXPECT_TRUE(
1214 expected_invalidation.Contains(bottom_row_and_right_column_new_pixels)); 1282 expected_invalidation.Contains(bottom_row_and_right_column_new_pixels));
1215 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1283 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1216 invalidation.Clear(); 1284 invalidation.Clear();
1217 1285
1218 UpdateWholePile(); 1286 UpdateWholePile();
1219 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect()); 1287 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect());
1220 1288
1221 // We should have lost the recordings that are now outside the tiling only. 1289 // We should have lost the recordings that are now outside the tiling only.
1222 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1290 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1223 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1291 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1224 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1292 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1225 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1293 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1226 TestPicturePile::PictureMapKey key(i, j); 1294 FakePicturePile::PictureMapKey key(i, j);
1227 TestPicturePile::PictureMap& map = pile_.picture_map(); 1295 FakePicturePile::PictureMap& map = pile_.picture_map();
1228 TestPicturePile::PictureMap::iterator it = map.find(key); 1296 FakePicturePile::PictureMap::iterator it = map.find(key);
1229 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1297 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1230 } 1298 }
1231 } 1299 }
1232 1300
1233 // No invalidation when shrinking. 1301 // We invalidated the previously exposed pixels on the bottom row and right
1234 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1302 // column of tiles.
1303 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
1304 gfx::Rect(base_tiling_size));
1305 EXPECT_TRUE(
1306 expected_invalidation.Contains(bottom_row_and_right_column_new_pixels));
1307 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1235 invalidation.Clear(); 1308 invalidation.Clear();
1236 } 1309 }
1237 1310
1238 TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) { 1311 TEST_F(PicturePileTest, SmallResizePileInsideInterestRect) {
1239 // This size chosen to be small enough that all the rects below fit inside the 1312 // This size chosen to be small enough that all the rects below fit inside the
1240 // the interest rect, so they are smaller than kPixelDistanceToRecord in each 1313 // the interest rect, so they are smaller than kPixelDistanceToRecord in each
1241 // dimension. 1314 // dimension.
1242 int tile_size = 100; 1315 int tile_size = 100;
1243 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); 1316 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size);
1244 gfx::Size grow_down_tiling_size(5 * tile_size, 5 * tile_size + 5); 1317 gfx::Size grow_down_tiling_size(5 * tile_size, 5 * tile_size + 5);
1245 gfx::Size grow_right_tiling_size(5 * tile_size + 5, 5 * tile_size); 1318 gfx::Size grow_right_tiling_size(5 * tile_size + 5, 5 * tile_size);
1246 gfx::Size grow_both_tiling_size(5 * tile_size + 5, 5 * tile_size + 5); 1319 gfx::Size grow_both_tiling_size(5 * tile_size + 5, 5 * tile_size + 5);
1247 1320
1248 Region invalidation; 1321 Region invalidation;
1249 Region expected_invalidation; 1322 Region expected_invalidation;
1250 1323
1251 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); 1324 pile_.tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size));
1252 SetTilingSize(base_tiling_size); 1325 SetTilingSize(base_tiling_size);
1253 1326
1254 // We should have a recording for every tile. 1327 // We should have a recording for every tile.
1255 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1328 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1256 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1329 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1257 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1330 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1258 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1331 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1259 TestPicturePile::PictureMapKey key(i, j); 1332 FakePicturePile::PictureMapKey key(i, j);
1260 TestPicturePile::PictureMap& map = pile_.picture_map(); 1333 FakePicturePile::PictureMap& map = pile_.picture_map();
1261 TestPicturePile::PictureMap::iterator it = map.find(key); 1334 FakePicturePile::PictureMap::iterator it = map.find(key);
1262 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1335 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1263 } 1336 }
1264 } 1337 }
1265 1338
1266 UpdateAndExpandInvalidation( 1339 UpdateAndExpandInvalidation(
1267 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1)); 1340 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1));
1268 1341
1269 // We should have a recording for every tile. 1342 // We should have a recording for every tile.
1270 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1343 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1271 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1344 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1272 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1345 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1273 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1346 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1274 TestPicturePile::PictureMapKey key(i, j); 1347 FakePicturePile::PictureMapKey key(i, j);
1275 TestPicturePile::PictureMap& map = pile_.picture_map(); 1348 FakePicturePile::PictureMap& map = pile_.picture_map();
1276 TestPicturePile::PictureMap::iterator it = map.find(key); 1349 FakePicturePile::PictureMap::iterator it = map.find(key);
1277 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1350 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1278 } 1351 }
1279 } 1352 }
1280 1353
1281 // We invalidated the newly exposed pixels. 1354 // We invalidated the newly exposed pixels.
1282 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size), 1355 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
1283 gfx::Rect(base_tiling_size)); 1356 gfx::Rect(base_tiling_size));
1284 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1357 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1285 invalidation.Clear(); 1358 invalidation.Clear();
1286 1359
1287 UpdateWholePile(); 1360 UpdateWholePile();
1288 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); 1361 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
1289 1362
1290 // We should have a recording for every tile. 1363 // We should have a recording for every tile.
1291 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1364 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1292 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1365 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1293 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1366 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1294 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1367 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1295 TestPicturePile::PictureMapKey key(i, j); 1368 FakePicturePile::PictureMapKey key(i, j);
1296 TestPicturePile::PictureMap& map = pile_.picture_map(); 1369 FakePicturePile::PictureMap& map = pile_.picture_map();
1297 TestPicturePile::PictureMap::iterator it = map.find(key); 1370 FakePicturePile::PictureMap::iterator it = map.find(key);
1298 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1371 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1299 } 1372 }
1300 } 1373 }
1301 1374
1302 // No invalidation when shrinking. 1375 // We invalidated the previously exposed pixels.
1303 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1376 expected_invalidation = SubtractRegions(gfx::Rect(grow_down_tiling_size),
1377 gfx::Rect(base_tiling_size));
1378 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1304 invalidation.Clear(); 1379 invalidation.Clear();
1305 1380
1306 UpdateWholePile(); 1381 UpdateWholePile();
1307 UpdateAndExpandInvalidation( 1382 UpdateAndExpandInvalidation(
1308 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1)); 1383 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1));
1309 1384
1310 // We should have a recording for every tile. 1385 // We should have a recording for every tile.
1311 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1386 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1312 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1387 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1313 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1388 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1314 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1389 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1315 TestPicturePile::PictureMapKey key(i, j); 1390 FakePicturePile::PictureMapKey key(i, j);
1316 TestPicturePile::PictureMap& map = pile_.picture_map(); 1391 FakePicturePile::PictureMap& map = pile_.picture_map();
1317 TestPicturePile::PictureMap::iterator it = map.find(key); 1392 FakePicturePile::PictureMap::iterator it = map.find(key);
1318 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1393 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1319 } 1394 }
1320 } 1395 }
1321 1396
1322 // We invalidated the newly exposed pixels. 1397 // We invalidated the newly exposed pixels.
1323 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size), 1398 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
1324 gfx::Rect(base_tiling_size)); 1399 gfx::Rect(base_tiling_size));
1325 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1400 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1326 invalidation.Clear(); 1401 invalidation.Clear();
1327 1402
1328 UpdateWholePile(); 1403 UpdateWholePile();
1329 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); 1404 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1));
1330 1405
1331 // We should have lost the recordings that are now outside the tiling only. 1406 // We should have lost the recordings that are now outside the tiling only.
1332 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1407 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1333 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1408 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1334 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1409 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1335 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1410 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1336 TestPicturePile::PictureMapKey key(i, j); 1411 FakePicturePile::PictureMapKey key(i, j);
1337 TestPicturePile::PictureMap& map = pile_.picture_map(); 1412 FakePicturePile::PictureMap& map = pile_.picture_map();
1338 TestPicturePile::PictureMap::iterator it = map.find(key); 1413 FakePicturePile::PictureMap::iterator it = map.find(key);
1339 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1414 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1340 } 1415 }
1341 } 1416 }
1342 1417
1343 // No invalidation when shrinking. 1418 // We invalidated the previously exposed pixels.
1344 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1419 expected_invalidation = SubtractRegions(gfx::Rect(grow_right_tiling_size),
1420 gfx::Rect(base_tiling_size));
1421 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1345 invalidation.Clear(); 1422 invalidation.Clear();
1346 1423
1347 UpdateWholePile(); 1424 UpdateWholePile();
1348 UpdateAndExpandInvalidation( 1425 UpdateAndExpandInvalidation(
1349 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1)); 1426 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1));
1350 1427
1351 // We should have a recording for every tile. 1428 // We should have a recording for every tile.
1352 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1429 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1353 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1430 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1354 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1431 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1355 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1432 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1356 TestPicturePile::PictureMapKey key(i, j); 1433 FakePicturePile::PictureMapKey key(i, j);
1357 TestPicturePile::PictureMap& map = pile_.picture_map(); 1434 FakePicturePile::PictureMap& map = pile_.picture_map();
1358 TestPicturePile::PictureMap::iterator it = map.find(key); 1435 FakePicturePile::PictureMap::iterator it = map.find(key);
1359 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1436 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1360 } 1437 }
1361 } 1438 }
1362 1439
1363 // We invalidated the newly exposed pixels. 1440 // We invalidated the newly exposed pixels.
1364 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size), 1441 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
1365 gfx::Rect(base_tiling_size)); 1442 gfx::Rect(base_tiling_size));
1366 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); 1443 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1367 invalidation.Clear(); 1444 invalidation.Clear();
1368 1445
1369 UpdateWholePile(); 1446 UpdateWholePile();
1370 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect()); 1447 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect());
1371 1448
1372 // We should have lost the recordings that are now outside the tiling only. 1449 // We should have lost the recordings that are now outside the tiling only.
1373 EXPECT_EQ(6, pile_.tiling().num_tiles_x()); 1450 EXPECT_EQ(6, pile_.tiling().num_tiles_x());
1374 EXPECT_EQ(6, pile_.tiling().num_tiles_y()); 1451 EXPECT_EQ(6, pile_.tiling().num_tiles_y());
1375 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) { 1452 for (int i = 0; i < pile_.tiling().num_tiles_x(); ++i) {
1376 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) { 1453 for (int j = 0; j < pile_.tiling().num_tiles_y(); ++j) {
1377 TestPicturePile::PictureMapKey key(i, j); 1454 FakePicturePile::PictureMapKey key(i, j);
1378 TestPicturePile::PictureMap& map = pile_.picture_map(); 1455 FakePicturePile::PictureMap& map = pile_.picture_map();
1379 TestPicturePile::PictureMap::iterator it = map.find(key); 1456 FakePicturePile::PictureMap::iterator it = map.find(key);
1380 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); 1457 EXPECT_TRUE(it != map.end() && it->second.GetPicture());
1381 } 1458 }
1382 } 1459 }
1383 1460
1384 // No invalidation when shrinking. 1461 // We invalidated the previously exposed pixels.
1385 EXPECT_EQ(Region().ToString(), invalidation.ToString()); 1462 expected_invalidation = SubtractRegions(gfx::Rect(grow_both_tiling_size),
1463 gfx::Rect(base_tiling_size));
1464 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString());
1386 invalidation.Clear(); 1465 invalidation.Clear();
1387 } 1466 }
1388 1467
1389 TEST_F(PicturePileTest, SolidRectangleIsSolid) { 1468 TEST_F(PicturePileTest, SolidRectangleIsSolid) {
1390 // If the client has no contents, the solid state will be true. 1469 // If the client has no contents, the solid state will be true.
1391 Region invalidation1(tiling_rect()); 1470 Region invalidation1(tiling_rect());
1392 UpdateAndExpandInvalidation(&invalidation1, tiling_size(), tiling_rect()); 1471 UpdateAndExpandInvalidation(&invalidation1, tiling_size(), tiling_rect());
1393 EXPECT_TRUE(pile_.is_solid_color()); 1472 EXPECT_TRUE(pile_.is_solid_color());
1394 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), pile_.solid_color()); 1473 EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), pile_.solid_color());
1395 1474
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1451 gfx::Rect smallRect = visible_rect; 1530 gfx::Rect smallRect = visible_rect;
1452 smallRect.Inset(10, 10, 10, 10); 1531 smallRect.Inset(10, 10, 10, 10);
1453 client_.add_draw_rect(smallRect, paint); 1532 client_.add_draw_rect(smallRect, paint);
1454 Region invalidation(visible_rect); 1533 Region invalidation(visible_rect);
1455 UpdateAndExpandInvalidation(&invalidation, tiling_size, visible_rect); 1534 UpdateAndExpandInvalidation(&invalidation, tiling_size, visible_rect);
1456 EXPECT_FALSE(pile_.is_solid_color()); 1535 EXPECT_FALSE(pile_.is_solid_color());
1457 } 1536 }
1458 1537
1459 TEST_F(PicturePileTest, SetEmptyBounds) { 1538 TEST_F(PicturePileTest, SetEmptyBounds) {
1460 EXPECT_TRUE(pile_.is_solid_color()); 1539 EXPECT_TRUE(pile_.is_solid_color());
1461 EXPECT_FALSE(pile_.tiling_size().IsEmpty()); 1540 EXPECT_FALSE(pile_.GetSize().IsEmpty());
1462 EXPECT_FALSE(pile_.picture_map().empty()); 1541 EXPECT_FALSE(pile_.picture_map().empty());
1463 EXPECT_TRUE(pile_.HasRecordings()); 1542 EXPECT_TRUE(pile_.HasRecordings());
1464 pile_.SetEmptyBounds(); 1543 pile_.SetEmptyBounds();
1465 EXPECT_FALSE(pile_.is_solid_color()); 1544 EXPECT_FALSE(pile_.is_solid_color());
1466 EXPECT_TRUE(pile_.tiling_size().IsEmpty()); 1545 EXPECT_TRUE(pile_.GetSize().IsEmpty());
1467 EXPECT_TRUE(pile_.picture_map().empty()); 1546 EXPECT_TRUE(pile_.picture_map().empty());
1468 EXPECT_FALSE(pile_.HasRecordings()); 1547 EXPECT_FALSE(pile_.HasRecordings());
1469 } 1548 }
1470 1549
1471 } // namespace 1550 } // namespace
1472 } // namespace cc 1551 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/picture_pile_impl.cc ('k') | cc/resources/raster_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698