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

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

Issue 1144693002: cc: Move files out of cc/resources/. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: resources: android Created 5 years, 7 months 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_layer_tiling_set_unittest.cc ('k') | cc/resources/picture_pile.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <limits>
6 #include <set>
7
8 #include "cc/base/math_util.h"
9 #include "cc/resources/picture_layer_tiling.h"
10 #include "cc/resources/picture_layer_tiling_set.h"
11 #include "cc/test/fake_output_surface.h"
12 #include "cc/test/fake_output_surface_client.h"
13 #include "cc/test/fake_picture_layer_tiling_client.h"
14 #include "cc/test/fake_picture_pile_impl.h"
15 #include "cc/test/test_context_provider.h"
16 #include "cc/test/test_shared_bitmap_manager.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18 #include "ui/gfx/geometry/quad_f.h"
19 #include "ui/gfx/geometry/rect_conversions.h"
20 #include "ui/gfx/geometry/size_conversions.h"
21
22 namespace cc {
23 namespace {
24
25 static gfx::Rect ViewportInLayerSpace(
26 const gfx::Transform& transform,
27 const gfx::Size& device_viewport) {
28
29 gfx::Transform inverse;
30 if (!transform.GetInverse(&inverse))
31 return gfx::Rect();
32
33 gfx::RectF viewport_in_layer_space = MathUtil::ProjectClippedRect(
34 inverse, gfx::RectF(gfx::Point(0, 0), device_viewport));
35 return ToEnclosingRect(viewport_in_layer_space);
36 }
37
38 class TestablePictureLayerTiling : public PictureLayerTiling {
39 public:
40 using PictureLayerTiling::SetLiveTilesRect;
41 using PictureLayerTiling::TileAt;
42
43 static scoped_ptr<TestablePictureLayerTiling> Create(
44 WhichTree tree,
45 float contents_scale,
46 scoped_refptr<RasterSource> raster_source,
47 PictureLayerTilingClient* client,
48 const LayerTreeSettings& settings) {
49 return make_scoped_ptr(new TestablePictureLayerTiling(
50 tree, contents_scale, raster_source, client,
51 settings.tiling_interest_area_viewport_multiplier,
52 settings.skewport_target_time_in_seconds,
53 settings.skewport_extrapolation_limit_in_content_pixels));
54 }
55
56 gfx::Rect live_tiles_rect() const { return live_tiles_rect_; }
57
58 using PictureLayerTiling::ComputeSkewport;
59 using PictureLayerTiling::RemoveTileAt;
60
61 protected:
62 TestablePictureLayerTiling(WhichTree tree,
63 float contents_scale,
64 scoped_refptr<RasterSource> raster_source,
65 PictureLayerTilingClient* client,
66 float tiling_interest_area_viewport_multiplier,
67 float skewport_target_time,
68 int skewport_extrapolation_limit)
69 : PictureLayerTiling(tree,
70 contents_scale,
71 raster_source,
72 client,
73 tiling_interest_area_viewport_multiplier,
74 skewport_target_time,
75 skewport_extrapolation_limit) {}
76 };
77
78 class PictureLayerTilingIteratorTest : public testing::Test {
79 public:
80 PictureLayerTilingIteratorTest() {}
81 ~PictureLayerTilingIteratorTest() override {}
82
83 void Initialize(const gfx::Size& tile_size,
84 float contents_scale,
85 const gfx::Size& layer_bounds) {
86 client_.SetTileSize(tile_size);
87 scoped_refptr<FakePicturePileImpl> pile =
88 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
89 tiling_ = TestablePictureLayerTiling::Create(
90 PENDING_TREE, contents_scale, pile, &client_, LayerTreeSettings());
91 }
92
93 void InitializeActive(const gfx::Size& tile_size,
94 float contents_scale,
95 const gfx::Size& layer_bounds) {
96 client_.SetTileSize(tile_size);
97 scoped_refptr<FakePicturePileImpl> pile =
98 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
99 tiling_ = TestablePictureLayerTiling::Create(
100 ACTIVE_TREE, contents_scale, pile, &client_, LayerTreeSettings());
101 }
102
103 void SetLiveRectAndVerifyTiles(const gfx::Rect& live_tiles_rect) {
104 tiling_->SetLiveTilesRect(live_tiles_rect);
105
106 std::vector<Tile*> tiles = tiling_->AllTilesForTesting();
107 for (std::vector<Tile*>::iterator iter = tiles.begin();
108 iter != tiles.end();
109 ++iter) {
110 EXPECT_TRUE(live_tiles_rect.Intersects((*iter)->content_rect()));
111 }
112 }
113
114 void VerifyTilesExactlyCoverRect(
115 float rect_scale,
116 const gfx::Rect& request_rect,
117 const gfx::Rect& expect_rect) {
118 EXPECT_TRUE(request_rect.Contains(expect_rect));
119
120 // Iterators are not valid if this ratio is too large (i.e. the
121 // tiling is too high-res for a low-res destination rect.) This is an
122 // artifact of snapping geometry to integer coordinates and then mapping
123 // back to floating point texture coordinates.
124 float dest_to_contents_scale = tiling_->contents_scale() / rect_scale;
125 ASSERT_LE(dest_to_contents_scale, 2.0);
126
127 Region remaining = expect_rect;
128 for (PictureLayerTiling::CoverageIterator
129 iter(tiling_.get(), rect_scale, request_rect);
130 iter;
131 ++iter) {
132 // Geometry cannot overlap previous geometry at all
133 gfx::Rect geometry = iter.geometry_rect();
134 EXPECT_TRUE(expect_rect.Contains(geometry));
135 EXPECT_TRUE(remaining.Contains(geometry));
136 remaining.Subtract(geometry);
137
138 // Sanity check that texture coords are within the texture rect.
139 gfx::RectF texture_rect = iter.texture_rect();
140 EXPECT_GE(texture_rect.x(), 0);
141 EXPECT_GE(texture_rect.y(), 0);
142 EXPECT_LE(texture_rect.right(), client_.TileSize().width());
143 EXPECT_LE(texture_rect.bottom(), client_.TileSize().height());
144 }
145
146 // The entire rect must be filled by geometry from the tiling.
147 EXPECT_TRUE(remaining.IsEmpty());
148 }
149
150 void VerifyTilesExactlyCoverRect(float rect_scale, const gfx::Rect& rect) {
151 VerifyTilesExactlyCoverRect(rect_scale, rect, rect);
152 }
153
154 void VerifyTiles(
155 float rect_scale,
156 const gfx::Rect& rect,
157 base::Callback<void(Tile* tile,
158 const gfx::Rect& geometry_rect)> callback) {
159 VerifyTiles(tiling_.get(),
160 rect_scale,
161 rect,
162 callback);
163 }
164
165 void VerifyTiles(
166 PictureLayerTiling* tiling,
167 float rect_scale,
168 const gfx::Rect& rect,
169 base::Callback<void(Tile* tile,
170 const gfx::Rect& geometry_rect)> callback) {
171 Region remaining = rect;
172 for (PictureLayerTiling::CoverageIterator iter(tiling, rect_scale, rect);
173 iter;
174 ++iter) {
175 remaining.Subtract(iter.geometry_rect());
176 callback.Run(*iter, iter.geometry_rect());
177 }
178 EXPECT_TRUE(remaining.IsEmpty());
179 }
180
181 void VerifyTilesCoverNonContainedRect(float rect_scale,
182 const gfx::Rect& dest_rect) {
183 float dest_to_contents_scale = tiling_->contents_scale() / rect_scale;
184 gfx::Rect clamped_rect = gfx::ScaleToEnclosingRect(
185 gfx::Rect(tiling_->tiling_size()), 1.f / dest_to_contents_scale);
186 clamped_rect.Intersect(dest_rect);
187 VerifyTilesExactlyCoverRect(rect_scale, dest_rect, clamped_rect);
188 }
189
190 protected:
191 FakePictureLayerTilingClient client_;
192 scoped_ptr<TestablePictureLayerTiling> tiling_;
193
194 private:
195 DISALLOW_COPY_AND_ASSIGN(PictureLayerTilingIteratorTest);
196 };
197
198 TEST_F(PictureLayerTilingIteratorTest, ResizeDeletesTiles) {
199 // Verifies that a resize with invalidation for newly exposed pixels will
200 // deletes tiles that intersect that invalidation.
201 gfx::Size tile_size(100, 100);
202 gfx::Size original_layer_size(10, 10);
203 InitializeActive(tile_size, 1.f, original_layer_size);
204 SetLiveRectAndVerifyTiles(gfx::Rect(original_layer_size));
205
206 // Tiling only has one tile, since its total size is less than one.
207 EXPECT_TRUE(tiling_->TileAt(0, 0));
208
209 // Stop creating tiles so that any invalidations are left as holes.
210 gfx::Size new_layer_size(200, 200);
211 scoped_refptr<FakePicturePileImpl> pile =
212 FakePicturePileImpl::CreateEmptyPileWithDefaultTileSize(new_layer_size);
213
214 Region invalidation =
215 SubtractRegions(gfx::Rect(tile_size), gfx::Rect(original_layer_size));
216 tiling_->SetRasterSourceAndResize(pile);
217 EXPECT_TRUE(tiling_->TileAt(0, 0));
218 tiling_->Invalidate(invalidation);
219 EXPECT_FALSE(tiling_->TileAt(0, 0));
220 }
221
222 TEST_F(PictureLayerTilingIteratorTest, CreateMissingTilesStaysInsideLiveRect) {
223 // The tiling has three rows and columns.
224 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(250, 250));
225 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_x());
226 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_y());
227
228 // The live tiles rect is at the very edge of the right-most and
229 // bottom-most tiles. Their border pixels would still be inside the live
230 // tiles rect, but the tiles should not exist just for that.
231 int right = tiling_->TilingDataForTesting().TileBounds(2, 2).x();
232 int bottom = tiling_->TilingDataForTesting().TileBounds(2, 2).y();
233
234 SetLiveRectAndVerifyTiles(gfx::Rect(right, bottom));
235 EXPECT_FALSE(tiling_->TileAt(2, 0));
236 EXPECT_FALSE(tiling_->TileAt(2, 1));
237 EXPECT_FALSE(tiling_->TileAt(2, 2));
238 EXPECT_FALSE(tiling_->TileAt(1, 2));
239 EXPECT_FALSE(tiling_->TileAt(0, 2));
240
241 // Verify CreateMissingTilesInLiveTilesRect respects this.
242 tiling_->CreateMissingTilesInLiveTilesRect();
243 EXPECT_FALSE(tiling_->TileAt(2, 0));
244 EXPECT_FALSE(tiling_->TileAt(2, 1));
245 EXPECT_FALSE(tiling_->TileAt(2, 2));
246 EXPECT_FALSE(tiling_->TileAt(1, 2));
247 EXPECT_FALSE(tiling_->TileAt(0, 2));
248 }
249
250 TEST_F(PictureLayerTilingIteratorTest, ResizeTilingOverTileBorders) {
251 // The tiling has four rows and three columns.
252 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(250, 350));
253 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_x());
254 EXPECT_EQ(4, tiling_->TilingDataForTesting().num_tiles_y());
255
256 // The live tiles rect covers the whole tiling.
257 SetLiveRectAndVerifyTiles(gfx::Rect(250, 350));
258
259 // Tiles in the bottom row and right column exist.
260 EXPECT_TRUE(tiling_->TileAt(2, 0));
261 EXPECT_TRUE(tiling_->TileAt(2, 1));
262 EXPECT_TRUE(tiling_->TileAt(2, 2));
263 EXPECT_TRUE(tiling_->TileAt(2, 3));
264 EXPECT_TRUE(tiling_->TileAt(1, 3));
265 EXPECT_TRUE(tiling_->TileAt(0, 3));
266
267 int right = tiling_->TilingDataForTesting().TileBounds(2, 2).x();
268 int bottom = tiling_->TilingDataForTesting().TileBounds(2, 3).y();
269
270 // Shrink the tiling so that the last tile row/column is entirely in the
271 // border pixels of the interior tiles. That row/column is removed.
272 scoped_refptr<FakePicturePileImpl> pile =
273 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
274 gfx::Size(right + 1, bottom + 1));
275 tiling_->SetRasterSourceAndResize(pile);
276 EXPECT_EQ(2, tiling_->TilingDataForTesting().num_tiles_x());
277 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_y());
278
279 // The live tiles rect was clamped to the pile size.
280 EXPECT_EQ(gfx::Rect(right + 1, bottom + 1), tiling_->live_tiles_rect());
281
282 // Since the row/column is gone, the tiles should be gone too.
283 EXPECT_FALSE(tiling_->TileAt(2, 0));
284 EXPECT_FALSE(tiling_->TileAt(2, 1));
285 EXPECT_FALSE(tiling_->TileAt(2, 2));
286 EXPECT_FALSE(tiling_->TileAt(2, 3));
287 EXPECT_FALSE(tiling_->TileAt(1, 3));
288 EXPECT_FALSE(tiling_->TileAt(0, 3));
289
290 // Growing outside the current right/bottom tiles border pixels should create
291 // the tiles again, even though the live rect has not changed size.
292 pile = FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
293 gfx::Size(right + 2, bottom + 2));
294 tiling_->SetRasterSourceAndResize(pile);
295 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_x());
296 EXPECT_EQ(4, tiling_->TilingDataForTesting().num_tiles_y());
297
298 // Not changed.
299 EXPECT_EQ(gfx::Rect(right + 1, bottom + 1), tiling_->live_tiles_rect());
300
301 // The last row/column tiles are inside the live tiles rect.
302 EXPECT_TRUE(gfx::Rect(right + 1, bottom + 1).Intersects(
303 tiling_->TilingDataForTesting().TileBounds(2, 0)));
304 EXPECT_TRUE(gfx::Rect(right + 1, bottom + 1).Intersects(
305 tiling_->TilingDataForTesting().TileBounds(0, 3)));
306
307 EXPECT_TRUE(tiling_->TileAt(2, 0));
308 EXPECT_TRUE(tiling_->TileAt(2, 1));
309 EXPECT_TRUE(tiling_->TileAt(2, 2));
310 EXPECT_TRUE(tiling_->TileAt(2, 3));
311 EXPECT_TRUE(tiling_->TileAt(1, 3));
312 EXPECT_TRUE(tiling_->TileAt(0, 3));
313 }
314
315 TEST_F(PictureLayerTilingIteratorTest, ResizeLiveTileRectOverTileBorders) {
316 // The tiling has three rows and columns.
317 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(250, 350));
318 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_x());
319 EXPECT_EQ(4, tiling_->TilingDataForTesting().num_tiles_y());
320
321 // The live tiles rect covers the whole tiling.
322 SetLiveRectAndVerifyTiles(gfx::Rect(250, 350));
323
324 // Tiles in the bottom row and right column exist.
325 EXPECT_TRUE(tiling_->TileAt(2, 0));
326 EXPECT_TRUE(tiling_->TileAt(2, 1));
327 EXPECT_TRUE(tiling_->TileAt(2, 2));
328 EXPECT_TRUE(tiling_->TileAt(2, 3));
329 EXPECT_TRUE(tiling_->TileAt(1, 3));
330 EXPECT_TRUE(tiling_->TileAt(0, 3));
331
332 // Shrink the live tiles rect to the very edge of the right-most and
333 // bottom-most tiles. Their border pixels would still be inside the live
334 // tiles rect, but the tiles should not exist just for that.
335 int right = tiling_->TilingDataForTesting().TileBounds(2, 3).x();
336 int bottom = tiling_->TilingDataForTesting().TileBounds(2, 3).y();
337
338 SetLiveRectAndVerifyTiles(gfx::Rect(right, bottom));
339 EXPECT_FALSE(tiling_->TileAt(2, 0));
340 EXPECT_FALSE(tiling_->TileAt(2, 1));
341 EXPECT_FALSE(tiling_->TileAt(2, 2));
342 EXPECT_FALSE(tiling_->TileAt(2, 3));
343 EXPECT_FALSE(tiling_->TileAt(1, 3));
344 EXPECT_FALSE(tiling_->TileAt(0, 3));
345
346 // Including the bottom row and right column again, should create the tiles.
347 SetLiveRectAndVerifyTiles(gfx::Rect(right + 1, bottom + 1));
348 EXPECT_TRUE(tiling_->TileAt(2, 0));
349 EXPECT_TRUE(tiling_->TileAt(2, 1));
350 EXPECT_TRUE(tiling_->TileAt(2, 2));
351 EXPECT_TRUE(tiling_->TileAt(2, 3));
352 EXPECT_TRUE(tiling_->TileAt(1, 2));
353 EXPECT_TRUE(tiling_->TileAt(0, 2));
354
355 // Shrink the live tiles rect to the very edge of the left-most and
356 // top-most tiles. Their border pixels would still be inside the live
357 // tiles rect, but the tiles should not exist just for that.
358 int left = tiling_->TilingDataForTesting().TileBounds(0, 0).right();
359 int top = tiling_->TilingDataForTesting().TileBounds(0, 0).bottom();
360
361 SetLiveRectAndVerifyTiles(gfx::Rect(left, top, 250 - left, 350 - top));
362 EXPECT_FALSE(tiling_->TileAt(0, 3));
363 EXPECT_FALSE(tiling_->TileAt(0, 2));
364 EXPECT_FALSE(tiling_->TileAt(0, 1));
365 EXPECT_FALSE(tiling_->TileAt(0, 0));
366 EXPECT_FALSE(tiling_->TileAt(1, 0));
367 EXPECT_FALSE(tiling_->TileAt(2, 0));
368
369 // Including the top row and left column again, should create the tiles.
370 SetLiveRectAndVerifyTiles(
371 gfx::Rect(left - 1, top - 1, 250 - left, 350 - top));
372 EXPECT_TRUE(tiling_->TileAt(0, 3));
373 EXPECT_TRUE(tiling_->TileAt(0, 2));
374 EXPECT_TRUE(tiling_->TileAt(0, 1));
375 EXPECT_TRUE(tiling_->TileAt(0, 0));
376 EXPECT_TRUE(tiling_->TileAt(1, 0));
377 EXPECT_TRUE(tiling_->TileAt(2, 0));
378 }
379
380 TEST_F(PictureLayerTilingIteratorTest, ResizeLiveTileRectOverSameTiles) {
381 // The tiling has four rows and three columns.
382 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(250, 350));
383 EXPECT_EQ(3, tiling_->TilingDataForTesting().num_tiles_x());
384 EXPECT_EQ(4, tiling_->TilingDataForTesting().num_tiles_y());
385
386 // The live tiles rect covers the whole tiling.
387 SetLiveRectAndVerifyTiles(gfx::Rect(250, 350));
388
389 // All tiles exist.
390 for (int i = 0; i < 3; ++i) {
391 for (int j = 0; j < 4; ++j)
392 EXPECT_TRUE(tiling_->TileAt(i, j)) << i << "," << j;
393 }
394
395 // Shrink the live tiles rect, but still cover all the tiles.
396 SetLiveRectAndVerifyTiles(gfx::Rect(1, 1, 249, 349));
397
398 // All tiles still exist.
399 for (int i = 0; i < 3; ++i) {
400 for (int j = 0; j < 4; ++j)
401 EXPECT_TRUE(tiling_->TileAt(i, j)) << i << "," << j;
402 }
403
404 // Grow the live tiles rect, but still cover all the same tiles.
405 SetLiveRectAndVerifyTiles(gfx::Rect(0, 0, 250, 350));
406
407 // All tiles still exist.
408 for (int i = 0; i < 3; ++i) {
409 for (int j = 0; j < 4; ++j)
410 EXPECT_TRUE(tiling_->TileAt(i, j)) << i << "," << j;
411 }
412 }
413
414 TEST_F(PictureLayerTilingIteratorTest, ResizeOverBorderPixelsDeletesTiles) {
415 // Verifies that a resize with invalidation for newly exposed pixels will
416 // deletes tiles that intersect that invalidation.
417 gfx::Size tile_size(100, 100);
418 gfx::Size original_layer_size(99, 99);
419 InitializeActive(tile_size, 1.f, original_layer_size);
420 SetLiveRectAndVerifyTiles(gfx::Rect(original_layer_size));
421
422 // Tiling only has one tile, since its total size is less than one.
423 EXPECT_TRUE(tiling_->TileAt(0, 0));
424
425 // Stop creating tiles so that any invalidations are left as holes.
426 scoped_refptr<FakePicturePileImpl> pile =
427 FakePicturePileImpl::CreateEmptyPileWithDefaultTileSize(
428 gfx::Size(200, 200));
429 tiling_->SetRasterSourceAndResize(pile);
430
431 Region invalidation =
432 SubtractRegions(gfx::Rect(tile_size), gfx::Rect(original_layer_size));
433 EXPECT_TRUE(tiling_->TileAt(0, 0));
434 tiling_->Invalidate(invalidation);
435 EXPECT_FALSE(tiling_->TileAt(0, 0));
436
437 // The original tile was the same size after resize, but it would include new
438 // border pixels.
439 EXPECT_EQ(gfx::Rect(original_layer_size),
440 tiling_->TilingDataForTesting().TileBounds(0, 0));
441 }
442
443 TEST_F(PictureLayerTilingIteratorTest, LiveTilesExactlyCoverLiveTileRect) {
444 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(1099, 801));
445 SetLiveRectAndVerifyTiles(gfx::Rect(100, 100));
446 SetLiveRectAndVerifyTiles(gfx::Rect(101, 99));
447 SetLiveRectAndVerifyTiles(gfx::Rect(1099, 1));
448 SetLiveRectAndVerifyTiles(gfx::Rect(1, 801));
449 SetLiveRectAndVerifyTiles(gfx::Rect(1099, 1));
450 SetLiveRectAndVerifyTiles(gfx::Rect(201, 800));
451 }
452
453 TEST_F(PictureLayerTilingIteratorTest, IteratorCoversLayerBoundsNoScale) {
454 Initialize(gfx::Size(100, 100), 1.f, gfx::Size(1099, 801));
455 VerifyTilesExactlyCoverRect(1, gfx::Rect());
456 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1099, 801));
457 VerifyTilesExactlyCoverRect(1, gfx::Rect(52, 83, 789, 412));
458
459 // With borders, a size of 3x3 = 1 pixel of content.
460 Initialize(gfx::Size(3, 3), 1.f, gfx::Size(10, 10));
461 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1, 1));
462 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 2, 2));
463 VerifyTilesExactlyCoverRect(1, gfx::Rect(1, 1, 2, 2));
464 VerifyTilesExactlyCoverRect(1, gfx::Rect(3, 2, 5, 2));
465 }
466
467 TEST_F(PictureLayerTilingIteratorTest, IteratorCoversLayerBoundsTilingScale) {
468 Initialize(gfx::Size(200, 100), 2.0f, gfx::Size(1005, 2010));
469 VerifyTilesExactlyCoverRect(1, gfx::Rect());
470 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1005, 2010));
471 VerifyTilesExactlyCoverRect(1, gfx::Rect(50, 112, 512, 381));
472
473 Initialize(gfx::Size(3, 3), 2.0f, gfx::Size(10, 10));
474 VerifyTilesExactlyCoverRect(1, gfx::Rect());
475 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1, 1));
476 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 2, 2));
477 VerifyTilesExactlyCoverRect(1, gfx::Rect(1, 1, 2, 2));
478 VerifyTilesExactlyCoverRect(1, gfx::Rect(3, 2, 5, 2));
479
480 Initialize(gfx::Size(100, 200), 0.5f, gfx::Size(1005, 2010));
481 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1005, 2010));
482 VerifyTilesExactlyCoverRect(1, gfx::Rect(50, 112, 512, 381));
483
484 Initialize(gfx::Size(150, 250), 0.37f, gfx::Size(1005, 2010));
485 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1005, 2010));
486 VerifyTilesExactlyCoverRect(1, gfx::Rect(50, 112, 512, 381));
487
488 Initialize(gfx::Size(312, 123), 0.01f, gfx::Size(1005, 2010));
489 VerifyTilesExactlyCoverRect(1, gfx::Rect(0, 0, 1005, 2010));
490 VerifyTilesExactlyCoverRect(1, gfx::Rect(50, 112, 512, 381));
491 }
492
493 TEST_F(PictureLayerTilingIteratorTest, IteratorCoversLayerBoundsBothScale) {
494 Initialize(gfx::Size(50, 50), 4.0f, gfx::Size(800, 600));
495 VerifyTilesExactlyCoverRect(2.0f, gfx::Rect());
496 VerifyTilesExactlyCoverRect(2.0f, gfx::Rect(0, 0, 1600, 1200));
497 VerifyTilesExactlyCoverRect(2.0f, gfx::Rect(512, 365, 253, 182));
498
499 float scale = 6.7f;
500 gfx::Size bounds(800, 600);
501 gfx::Rect full_rect(gfx::ToCeiledSize(gfx::ScaleSize(bounds, scale)));
502 Initialize(gfx::Size(256, 512), 5.2f, bounds);
503 VerifyTilesExactlyCoverRect(scale, full_rect);
504 VerifyTilesExactlyCoverRect(scale, gfx::Rect(2014, 1579, 867, 1033));
505 }
506
507 TEST_F(PictureLayerTilingIteratorTest, IteratorEmptyRect) {
508 Initialize(gfx::Size(100, 100), 1.0f, gfx::Size(800, 600));
509
510 gfx::Rect empty;
511 PictureLayerTiling::CoverageIterator iter(tiling_.get(), 1.0f, empty);
512 EXPECT_FALSE(iter);
513 }
514
515 TEST_F(PictureLayerTilingIteratorTest, NonIntersectingRect) {
516 Initialize(gfx::Size(100, 100), 1.0f, gfx::Size(800, 600));
517 gfx::Rect non_intersecting(1000, 1000, 50, 50);
518 PictureLayerTiling::CoverageIterator iter(tiling_.get(), 1, non_intersecting);
519 EXPECT_FALSE(iter);
520 }
521
522 TEST_F(PictureLayerTilingIteratorTest, LayerEdgeTextureCoordinates) {
523 Initialize(gfx::Size(300, 300), 1.0f, gfx::Size(256, 256));
524 // All of these sizes are 256x256, scaled and ceiled.
525 VerifyTilesExactlyCoverRect(1.0f, gfx::Rect(0, 0, 256, 256));
526 VerifyTilesExactlyCoverRect(0.8f, gfx::Rect(0, 0, 205, 205));
527 VerifyTilesExactlyCoverRect(1.2f, gfx::Rect(0, 0, 308, 308));
528 }
529
530 TEST_F(PictureLayerTilingIteratorTest, NonContainedDestRect) {
531 Initialize(gfx::Size(100, 100), 1.0f, gfx::Size(400, 400));
532
533 // Too large in all dimensions
534 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, -1000, 2000, 2000));
535 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, -1000, 2000, 2000));
536 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, -1000, 2000, 2000));
537
538 // Partially covering content, but too large
539 VerifyTilesCoverNonContainedRect(1.0f, gfx::Rect(-1000, 100, 2000, 100));
540 VerifyTilesCoverNonContainedRect(1.5f, gfx::Rect(-1000, 100, 2000, 100));
541 VerifyTilesCoverNonContainedRect(0.5f, gfx::Rect(-1000, 100, 2000, 100));
542 }
543
544 TEST(PictureLayerTilingTest, SkewportLimits) {
545 FakePictureLayerTilingClient client;
546
547 gfx::Rect viewport(0, 0, 100, 100);
548 gfx::Size layer_bounds(200, 200);
549
550 client.SetTileSize(gfx::Size(100, 100));
551 LayerTreeSettings settings;
552 settings.skewport_extrapolation_limit_in_content_pixels = 75;
553
554 scoped_refptr<FakePicturePileImpl> pile =
555 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
556 scoped_ptr<TestablePictureLayerTiling> tiling =
557 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
558 settings);
559
560 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
561
562 // Move viewport down 50 pixels in 0.5 seconds.
563 gfx::Rect down_skewport =
564 tiling->ComputeSkewport(1.5, gfx::Rect(0, 50, 100, 100));
565
566 EXPECT_EQ(0, down_skewport.x());
567 EXPECT_EQ(50, down_skewport.y());
568 EXPECT_EQ(100, down_skewport.width());
569 EXPECT_EQ(175, down_skewport.height());
570 EXPECT_TRUE(down_skewport.Contains(gfx::Rect(0, 50, 100, 100)));
571
572 // Move viewport down 50 and right 10 pixels.
573 gfx::Rect down_right_skewport =
574 tiling->ComputeSkewport(1.5, gfx::Rect(10, 50, 100, 100));
575
576 EXPECT_EQ(10, down_right_skewport.x());
577 EXPECT_EQ(50, down_right_skewport.y());
578 EXPECT_EQ(120, down_right_skewport.width());
579 EXPECT_EQ(175, down_right_skewport.height());
580 EXPECT_TRUE(down_right_skewport.Contains(gfx::Rect(10, 50, 100, 100)));
581
582 // Move viewport left.
583 gfx::Rect left_skewport =
584 tiling->ComputeSkewport(1.5, gfx::Rect(-50, 0, 100, 100));
585
586 EXPECT_EQ(-125, left_skewport.x());
587 EXPECT_EQ(0, left_skewport.y());
588 EXPECT_EQ(175, left_skewport.width());
589 EXPECT_EQ(100, left_skewport.height());
590 EXPECT_TRUE(left_skewport.Contains(gfx::Rect(-50, 0, 100, 100)));
591
592 // Expand viewport.
593 gfx::Rect expand_skewport =
594 tiling->ComputeSkewport(1.5, gfx::Rect(-50, -50, 200, 200));
595
596 // x and y moved by -75 (-50 - 75 = -125).
597 // right side and bottom side moved by 75 [(350 - 125) - (200 - 50) = 75].
598 EXPECT_EQ(-125, expand_skewport.x());
599 EXPECT_EQ(-125, expand_skewport.y());
600 EXPECT_EQ(350, expand_skewport.width());
601 EXPECT_EQ(350, expand_skewport.height());
602 EXPECT_TRUE(expand_skewport.Contains(gfx::Rect(-50, -50, 200, 200)));
603
604 // Expand the viewport past the limit in all directions.
605 gfx::Rect big_expand_skewport =
606 tiling->ComputeSkewport(1.5, gfx::Rect(-500, -500, 1500, 1500));
607
608 EXPECT_EQ(-575, big_expand_skewport.x());
609 EXPECT_EQ(-575, big_expand_skewport.y());
610 EXPECT_EQ(1650, big_expand_skewport.width());
611 EXPECT_EQ(1650, big_expand_skewport.height());
612 EXPECT_TRUE(big_expand_skewport.Contains(gfx::Rect(-500, -500, 1500, 1500)));
613
614 // Shrink the skewport in all directions.
615 gfx::Rect shrink_viewport =
616 tiling->ComputeSkewport(1.5, gfx::Rect(0, 0, 100, 100));
617 EXPECT_EQ(0, shrink_viewport.x());
618 EXPECT_EQ(0, shrink_viewport.y());
619 EXPECT_EQ(100, shrink_viewport.width());
620 EXPECT_EQ(100, shrink_viewport.height());
621
622 // Move the skewport really far in one direction.
623 gfx::Rect move_skewport_far =
624 tiling->ComputeSkewport(1.5, gfx::Rect(0, 5000, 100, 100));
625 EXPECT_EQ(0, move_skewport_far.x());
626 EXPECT_EQ(5000, move_skewport_far.y());
627 EXPECT_EQ(100, move_skewport_far.width());
628 EXPECT_EQ(175, move_skewport_far.height());
629 EXPECT_TRUE(move_skewport_far.Contains(gfx::Rect(0, 5000, 100, 100)));
630 }
631
632 TEST(PictureLayerTilingTest, ComputeSkewport) {
633 FakePictureLayerTilingClient client;
634
635 gfx::Rect viewport(0, 0, 100, 100);
636 gfx::Size layer_bounds(200, 200);
637
638 client.SetTileSize(gfx::Size(100, 100));
639
640 scoped_refptr<FakePicturePileImpl> pile =
641 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
642 scoped_ptr<TestablePictureLayerTiling> tiling =
643 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
644 LayerTreeSettings());
645
646 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
647
648 // Move viewport down 50 pixels in 0.5 seconds.
649 gfx::Rect down_skewport =
650 tiling->ComputeSkewport(1.5, gfx::Rect(0, 50, 100, 100));
651
652 EXPECT_EQ(0, down_skewport.x());
653 EXPECT_EQ(50, down_skewport.y());
654 EXPECT_EQ(100, down_skewport.width());
655 EXPECT_EQ(200, down_skewport.height());
656
657 // Shrink viewport.
658 gfx::Rect shrink_skewport =
659 tiling->ComputeSkewport(1.5, gfx::Rect(25, 25, 50, 50));
660
661 EXPECT_EQ(25, shrink_skewport.x());
662 EXPECT_EQ(25, shrink_skewport.y());
663 EXPECT_EQ(50, shrink_skewport.width());
664 EXPECT_EQ(50, shrink_skewport.height());
665
666 // Move viewport down 50 and right 10 pixels.
667 gfx::Rect down_right_skewport =
668 tiling->ComputeSkewport(1.5, gfx::Rect(10, 50, 100, 100));
669
670 EXPECT_EQ(10, down_right_skewport.x());
671 EXPECT_EQ(50, down_right_skewport.y());
672 EXPECT_EQ(120, down_right_skewport.width());
673 EXPECT_EQ(200, down_right_skewport.height());
674
675 // Move viewport left.
676 gfx::Rect left_skewport =
677 tiling->ComputeSkewport(1.5, gfx::Rect(-20, 0, 100, 100));
678
679 EXPECT_EQ(-60, left_skewport.x());
680 EXPECT_EQ(0, left_skewport.y());
681 EXPECT_EQ(140, left_skewport.width());
682 EXPECT_EQ(100, left_skewport.height());
683
684 // Expand viewport in 0.2 seconds.
685 gfx::Rect expanded_skewport =
686 tiling->ComputeSkewport(1.2, gfx::Rect(-5, -5, 110, 110));
687
688 EXPECT_EQ(-30, expanded_skewport.x());
689 EXPECT_EQ(-30, expanded_skewport.y());
690 EXPECT_EQ(160, expanded_skewport.width());
691 EXPECT_EQ(160, expanded_skewport.height());
692 }
693
694 TEST(PictureLayerTilingTest, SkewportThroughUpdateTilePriorities) {
695 FakePictureLayerTilingClient client;
696
697 gfx::Rect viewport(0, 0, 100, 100);
698 gfx::Size layer_bounds(200, 200);
699
700 client.SetTileSize(gfx::Size(100, 100));
701
702 scoped_refptr<FakePicturePileImpl> pile =
703 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
704 scoped_ptr<TestablePictureLayerTiling> tiling =
705 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
706 LayerTreeSettings());
707
708 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
709
710 // Move viewport down 50 pixels in 0.5 seconds.
711 gfx::Rect viewport_50 = gfx::Rect(0, 50, 100, 100);
712 gfx::Rect skewport_50 = tiling->ComputeSkewport(1.5, viewport_50);
713
714 EXPECT_EQ(gfx::Rect(0, 50, 100, 200), skewport_50);
715 tiling->ComputeTilePriorityRects(viewport_50, 1.f, 1.5, Occlusion());
716
717 gfx::Rect viewport_100 = gfx::Rect(0, 100, 100, 100);
718 gfx::Rect skewport_100 = tiling->ComputeSkewport(2.0, viewport_100);
719
720 EXPECT_EQ(gfx::Rect(0, 100, 100, 200), skewport_100);
721 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 2.0, Occlusion());
722
723 // Advance time, but not the viewport.
724 gfx::Rect result = tiling->ComputeSkewport(2.5, viewport_100);
725 // Since the history did advance, we should still get a skewport but a smaller
726 // one.
727 EXPECT_EQ(gfx::Rect(0, 100, 100, 150), result);
728 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 2.5, Occlusion());
729
730 // Advance time again.
731 result = tiling->ComputeSkewport(3.0, viewport_100);
732 EXPECT_EQ(viewport_100, result);
733 tiling->ComputeTilePriorityRects(viewport_100, 1.f, 3.0, Occlusion());
734
735 // Ensure we have a skewport.
736 gfx::Rect viewport_150 = gfx::Rect(0, 150, 100, 100);
737 gfx::Rect skewport_150 = tiling->ComputeSkewport(3.5, viewport_150);
738 EXPECT_EQ(gfx::Rect(0, 150, 100, 150), skewport_150);
739 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
740
741 // Advance the viewport, but not the time.
742 gfx::Rect viewport_200 = gfx::Rect(0, 200, 100, 100);
743 gfx::Rect skewport_200 = tiling->ComputeSkewport(3.5, viewport_200);
744 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
745
746 // Ensure that continued calls with the same value, produce the same skewport.
747 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
748 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
749 tiling->ComputeTilePriorityRects(viewport_150, 1.f, 3.5, Occlusion());
750 EXPECT_EQ(gfx::Rect(0, 200, 100, 300), skewport_200);
751
752 tiling->ComputeTilePriorityRects(viewport_200, 1.f, 3.5, Occlusion());
753
754 // This should never happen, but advance the viewport yet again keeping the
755 // time the same.
756 gfx::Rect viewport_250 = gfx::Rect(0, 250, 100, 100);
757 gfx::Rect skewport_250 = tiling->ComputeSkewport(3.5, viewport_250);
758 EXPECT_EQ(viewport_250, skewport_250);
759 tiling->ComputeTilePriorityRects(viewport_250, 1.f, 3.5, Occlusion());
760 }
761
762 TEST(PictureLayerTilingTest, ViewportDistanceWithScale) {
763 FakePictureLayerTilingClient client;
764
765 gfx::Rect viewport(0, 0, 100, 100);
766 gfx::Size layer_bounds(1500, 1500);
767
768 client.SetTileSize(gfx::Size(10, 10));
769 LayerTreeSettings settings;
770 settings.tiling_interest_area_viewport_multiplier = 10000;
771
772 // Tiling at 0.25 scale: this should create 47x47 tiles of size 10x10.
773 // The reason is that each tile has a one pixel border, so tile at (1, 2)
774 // for instance begins at (8, 16) pixels. So tile at (46, 46) will begin at
775 // (368, 368) and extend to the end of 1500 * 0.25 = 375 edge of the
776 // tiling.
777 scoped_refptr<FakePicturePileImpl> pile =
778 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
779 scoped_ptr<TestablePictureLayerTiling> tiling =
780 TestablePictureLayerTiling::Create(ACTIVE_TREE, 0.25f, pile, &client,
781 settings);
782 gfx::Rect viewport_in_content_space =
783 gfx::ToEnclosedRect(gfx::ScaleRect(viewport, 0.25f));
784
785 tiling->ComputeTilePriorityRects(viewport, 1.f, 1.0, Occlusion());
786 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
787
788 // Compute the soon border.
789 float inset = PictureLayerTiling::CalculateSoonBorderDistance(
790 viewport_in_content_space, 1.0f / 0.25f);
791 gfx::Rect soon_rect_in_content_space = viewport_in_content_space;
792 soon_rect_in_content_space.Inset(-inset, -inset);
793
794 // Sanity checks.
795 for (int i = 0; i < 47; ++i) {
796 for (int j = 0; j < 47; ++j) {
797 EXPECT_TRUE(tiling->TileAt(i, j)) << "i: " << i << " j: " << j;
798 }
799 }
800 for (int i = 0; i < 47; ++i) {
801 EXPECT_FALSE(tiling->TileAt(i, 47)) << "i: " << i;
802 EXPECT_FALSE(tiling->TileAt(47, i)) << "i: " << i;
803 }
804
805 // No movement in the viewport implies that tiles will either be NOW
806 // or EVENTUALLY, with the exception of tiles that are between 0 and 312
807 // pixels away from the viewport, which will be in the SOON bin.
808 bool have_now = false;
809 bool have_eventually = false;
810 bool have_soon = false;
811 for (int i = 0; i < 47; ++i) {
812 for (int j = 0; j < 47; ++j) {
813 Tile* tile = tiling->TileAt(i, j);
814 PrioritizedTile prioritized_tile = prioritized_tiles[tile];
815 TilePriority priority = prioritized_tile.priority();
816
817 gfx::Rect tile_rect = tiling->TilingDataForTesting().TileBounds(i, j);
818 if (viewport_in_content_space.Intersects(tile_rect)) {
819 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
820 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
821 have_now = true;
822 } else if (soon_rect_in_content_space.Intersects(tile_rect)) {
823 EXPECT_EQ(TilePriority::SOON, priority.priority_bin);
824 have_soon = true;
825 } else {
826 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin);
827 EXPECT_GT(priority.distance_to_visible, 0.f);
828 have_eventually = true;
829 }
830 }
831 }
832
833 EXPECT_TRUE(have_now);
834 EXPECT_TRUE(have_soon);
835 EXPECT_TRUE(have_eventually);
836
837 // Spot check some distances.
838 // Tile at 5, 1 should begin at 41x9 in content space (without borders),
839 // so the distance to a viewport that ends at 25x25 in content space
840 // should be 17 (41 - 25 + 1). In layer space, then that should be
841 // 17 / 0.25 = 68 pixels.
842
843 // We can verify that the content rect (with borders) is one pixel off
844 // 41,9 8x8 on all sides.
845 EXPECT_EQ(tiling->TileAt(5, 1)->content_rect().ToString(), "40,8 10x10");
846
847 TilePriority priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
848 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
849
850 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
851 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
852
853 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
854 EXPECT_FLOAT_EQ(40.f, priority.distance_to_visible);
855
856 // Move the viewport down 40 pixels.
857 viewport = gfx::Rect(0, 40, 100, 100);
858 viewport_in_content_space =
859 gfx::ToEnclosedRect(gfx::ScaleRect(viewport, 0.25f));
860 gfx::Rect skewport = tiling->ComputeSkewport(2.0, viewport_in_content_space);
861
862 // Compute the soon border.
863 inset = PictureLayerTiling::CalculateSoonBorderDistance(
864 viewport_in_content_space, 1.0f / 0.25f);
865 soon_rect_in_content_space = viewport_in_content_space;
866 soon_rect_in_content_space.Inset(-inset, -inset);
867
868 EXPECT_EQ(0, skewport.x());
869 EXPECT_EQ(10, skewport.y());
870 EXPECT_EQ(25, skewport.width());
871 EXPECT_EQ(35, skewport.height());
872
873 tiling->ComputeTilePriorityRects(viewport, 1.f, 2.0, Occlusion());
874 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
875
876 have_now = false;
877 have_eventually = false;
878 have_soon = false;
879
880 // Viewport moved, so we expect to find some NOW tiles, some SOON tiles and
881 // some EVENTUALLY tiles.
882 for (int i = 0; i < 47; ++i) {
883 for (int j = 0; j < 47; ++j) {
884 Tile* tile = tiling->TileAt(i, j);
885 TilePriority priority = prioritized_tiles[tile].priority();
886
887 gfx::Rect tile_rect = tiling->TilingDataForTesting().TileBounds(i, j);
888 if (viewport_in_content_space.Intersects(tile_rect)) {
889 EXPECT_EQ(TilePriority::NOW, priority.priority_bin) << "i: " << i
890 << " j: " << j;
891 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible) << "i: " << i
892 << " j: " << j;
893 have_now = true;
894 } else if (skewport.Intersects(tile_rect) ||
895 soon_rect_in_content_space.Intersects(tile_rect)) {
896 EXPECT_EQ(TilePriority::SOON, priority.priority_bin) << "i: " << i
897 << " j: " << j;
898 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i
899 << " j: " << j;
900 have_soon = true;
901 } else {
902 EXPECT_EQ(TilePriority::EVENTUALLY, priority.priority_bin)
903 << "i: " << i << " j: " << j;
904 EXPECT_GT(priority.distance_to_visible, 0.f) << "i: " << i
905 << " j: " << j;
906 have_eventually = true;
907 }
908 }
909 }
910
911 EXPECT_TRUE(have_now);
912 EXPECT_TRUE(have_soon);
913 EXPECT_TRUE(have_eventually);
914
915 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
916 EXPECT_FLOAT_EQ(68.f, priority.distance_to_visible);
917
918 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
919 EXPECT_FLOAT_EQ(28.f, priority.distance_to_visible);
920
921 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
922 EXPECT_FLOAT_EQ(4.f, priority.distance_to_visible);
923
924 // Change the underlying layer scale.
925 tiling->ComputeTilePriorityRects(viewport, 2.0f, 3.0, Occlusion());
926 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
927
928 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
929 EXPECT_FLOAT_EQ(136.f, priority.distance_to_visible);
930
931 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
932 EXPECT_FLOAT_EQ(56.f, priority.distance_to_visible);
933
934 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
935 EXPECT_FLOAT_EQ(8.f, priority.distance_to_visible);
936
937 // Test additional scales.
938 tiling = TestablePictureLayerTiling::Create(ACTIVE_TREE, 0.2f, pile, &client,
939 LayerTreeSettings());
940 tiling->ComputeTilePriorityRects(viewport, 1.0f, 4.0, Occlusion());
941 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
942
943 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
944 EXPECT_FLOAT_EQ(110.f, priority.distance_to_visible);
945
946 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
947 EXPECT_FLOAT_EQ(70.f, priority.distance_to_visible);
948
949 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
950 EXPECT_FLOAT_EQ(60.f, priority.distance_to_visible);
951
952 tiling->ComputeTilePriorityRects(viewport, 0.5f, 5.0, Occlusion());
953 prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
954
955 priority = prioritized_tiles[tiling->TileAt(5, 1)].priority();
956 EXPECT_FLOAT_EQ(55.f, priority.distance_to_visible);
957
958 priority = prioritized_tiles[tiling->TileAt(2, 5)].priority();
959 EXPECT_FLOAT_EQ(35.f, priority.distance_to_visible);
960
961 priority = prioritized_tiles[tiling->TileAt(3, 4)].priority();
962 EXPECT_FLOAT_EQ(30.f, priority.distance_to_visible);
963 }
964
965 TEST(PictureLayerTilingTest, ExpandRectEqual) {
966 gfx::Rect in(40, 50, 100, 200);
967 gfx::Rect bounds(-1000, -1000, 10000, 10000);
968 int64 target_area = 100 * 200;
969 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
970 in, target_area, bounds, NULL);
971 EXPECT_EQ(in.ToString(), out.ToString());
972 }
973
974 TEST(PictureLayerTilingTest, ExpandRectSmaller) {
975 gfx::Rect in(40, 50, 100, 200);
976 gfx::Rect bounds(-1000, -1000, 10000, 10000);
977 int64 target_area = 100 * 100;
978 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
979 in, target_area, bounds, NULL);
980 EXPECT_EQ(out.bottom() - in.bottom(), in.y() - out.y());
981 EXPECT_EQ(out.right() - in.right(), in.x() - out.x());
982 EXPECT_EQ(out.width() - in.width(), out.height() - in.height());
983
984 // |in| represents the visible rect, and |out| represents the eventually rect.
985 // If the eventually rect doesn't contain the visible rect, we will start
986 // losing tiles.
987 EXPECT_TRUE(out.Contains(in));
988 EXPECT_TRUE(bounds.Contains(out));
989 }
990
991 TEST(PictureLayerTilingTest, ExpandRectUnbounded) {
992 gfx::Rect in(40, 50, 100, 200);
993 gfx::Rect bounds(-1000, -1000, 10000, 10000);
994 int64 target_area = 200 * 200;
995 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
996 in, target_area, bounds, NULL);
997 EXPECT_EQ(out.bottom() - in.bottom(), in.y() - out.y());
998 EXPECT_EQ(out.right() - in.right(), in.x() - out.x());
999 EXPECT_EQ(out.width() - in.width(), out.height() - in.height());
1000 EXPECT_NEAR(200 * 200, out.width() * out.height(), 100);
1001 EXPECT_TRUE(bounds.Contains(out));
1002 }
1003
1004 TEST(PictureLayerTilingTest, ExpandRectBoundedSmaller) {
1005 gfx::Rect in(40, 50, 100, 200);
1006 gfx::Rect bounds(50, 60, 40, 30);
1007 int64 target_area = 200 * 200;
1008 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1009 in, target_area, bounds, NULL);
1010 EXPECT_EQ(bounds.ToString(), out.ToString());
1011 }
1012
1013 TEST(PictureLayerTilingTest, ExpandRectBoundedEqual) {
1014 gfx::Rect in(40, 50, 100, 200);
1015 gfx::Rect bounds = in;
1016 int64 target_area = 200 * 200;
1017 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1018 in, target_area, bounds, NULL);
1019 EXPECT_EQ(bounds.ToString(), out.ToString());
1020 }
1021
1022 TEST(PictureLayerTilingTest, ExpandRectBoundedSmallerStretchVertical) {
1023 gfx::Rect in(40, 50, 100, 200);
1024 gfx::Rect bounds(45, 0, 90, 300);
1025 int64 target_area = 200 * 200;
1026 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1027 in, target_area, bounds, NULL);
1028 EXPECT_EQ(bounds.ToString(), out.ToString());
1029 }
1030
1031 TEST(PictureLayerTilingTest, ExpandRectBoundedEqualStretchVertical) {
1032 gfx::Rect in(40, 50, 100, 200);
1033 gfx::Rect bounds(40, 0, 100, 300);
1034 int64 target_area = 200 * 200;
1035 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1036 in, target_area, bounds, NULL);
1037 EXPECT_EQ(bounds.ToString(), out.ToString());
1038 }
1039
1040 TEST(PictureLayerTilingTest, ExpandRectBoundedSmallerStretchHorizontal) {
1041 gfx::Rect in(40, 50, 100, 200);
1042 gfx::Rect bounds(0, 55, 180, 190);
1043 int64 target_area = 200 * 200;
1044 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1045 in, target_area, bounds, NULL);
1046 EXPECT_EQ(bounds.ToString(), out.ToString());
1047 }
1048
1049 TEST(PictureLayerTilingTest, ExpandRectBoundedEqualStretchHorizontal) {
1050 gfx::Rect in(40, 50, 100, 200);
1051 gfx::Rect bounds(0, 50, 180, 200);
1052 int64 target_area = 200 * 200;
1053 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1054 in, target_area, bounds, NULL);
1055 EXPECT_EQ(bounds.ToString(), out.ToString());
1056 }
1057
1058 TEST(PictureLayerTilingTest, ExpandRectBoundedLeft) {
1059 gfx::Rect in(40, 50, 100, 200);
1060 gfx::Rect bounds(20, -1000, 10000, 10000);
1061 int64 target_area = 200 * 200;
1062 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1063 in, target_area, bounds, NULL);
1064 EXPECT_EQ(out.bottom() - in.bottom(), in.y() - out.y());
1065 EXPECT_EQ(out.bottom() - in.bottom(), out.right() - in.right());
1066 EXPECT_LE(out.width() * out.height(), target_area);
1067 EXPECT_GT(out.width() * out.height(),
1068 target_area - out.width() - out.height() * 2);
1069 EXPECT_TRUE(bounds.Contains(out));
1070 }
1071
1072 TEST(PictureLayerTilingTest, ExpandRectBoundedRight) {
1073 gfx::Rect in(40, 50, 100, 200);
1074 gfx::Rect bounds(-1000, -1000, 1000+120, 10000);
1075 int64 target_area = 200 * 200;
1076 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1077 in, target_area, bounds, NULL);
1078 EXPECT_EQ(out.bottom() - in.bottom(), in.y() - out.y());
1079 EXPECT_EQ(out.bottom() - in.bottom(), in.x() - out.x());
1080 EXPECT_LE(out.width() * out.height(), target_area);
1081 EXPECT_GT(out.width() * out.height(),
1082 target_area - out.width() - out.height() * 2);
1083 EXPECT_TRUE(bounds.Contains(out));
1084 }
1085
1086 TEST(PictureLayerTilingTest, ExpandRectBoundedTop) {
1087 gfx::Rect in(40, 50, 100, 200);
1088 gfx::Rect bounds(-1000, 30, 10000, 10000);
1089 int64 target_area = 200 * 200;
1090 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1091 in, target_area, bounds, NULL);
1092 EXPECT_EQ(out.right() - in.right(), in.x() - out.x());
1093 EXPECT_EQ(out.right() - in.right(), out.bottom() - in.bottom());
1094 EXPECT_LE(out.width() * out.height(), target_area);
1095 EXPECT_GT(out.width() * out.height(),
1096 target_area - out.width() * 2 - out.height());
1097 EXPECT_TRUE(bounds.Contains(out));
1098 }
1099
1100 TEST(PictureLayerTilingTest, ExpandRectBoundedBottom) {
1101 gfx::Rect in(40, 50, 100, 200);
1102 gfx::Rect bounds(-1000, -1000, 10000, 1000 + 220);
1103 int64 target_area = 200 * 200;
1104 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1105 in, target_area, bounds, NULL);
1106 EXPECT_EQ(out.right() - in.right(), in.x() - out.x());
1107 EXPECT_EQ(out.right() - in.right(), in.y() - out.y());
1108 EXPECT_LE(out.width() * out.height(), target_area);
1109 EXPECT_GT(out.width() * out.height(),
1110 target_area - out.width() * 2 - out.height());
1111 EXPECT_TRUE(bounds.Contains(out));
1112 }
1113
1114 TEST(PictureLayerTilingTest, ExpandRectSquishedHorizontally) {
1115 gfx::Rect in(40, 50, 100, 200);
1116 gfx::Rect bounds(0, -4000, 100+40+20, 100000);
1117 int64 target_area = 400 * 400;
1118 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1119 in, target_area, bounds, NULL);
1120 EXPECT_EQ(20, out.right() - in.right());
1121 EXPECT_EQ(40, in.x() - out.x());
1122 EXPECT_EQ(out.bottom() - in.bottom(), in.y() - out.y());
1123 EXPECT_LE(out.width() * out.height(), target_area);
1124 EXPECT_GT(out.width() * out.height(),
1125 target_area - out.width() * 2);
1126 EXPECT_TRUE(bounds.Contains(out));
1127 }
1128
1129 TEST(PictureLayerTilingTest, ExpandRectSquishedVertically) {
1130 gfx::Rect in(40, 50, 100, 200);
1131 gfx::Rect bounds(-4000, 0, 100000, 200+50+30);
1132 int64 target_area = 400 * 400;
1133 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1134 in, target_area, bounds, NULL);
1135 EXPECT_EQ(30, out.bottom() - in.bottom());
1136 EXPECT_EQ(50, in.y() - out.y());
1137 EXPECT_EQ(out.right() - in.right(), in.x() - out.x());
1138 EXPECT_LE(out.width() * out.height(), target_area);
1139 EXPECT_GT(out.width() * out.height(),
1140 target_area - out.height() * 2);
1141 EXPECT_TRUE(bounds.Contains(out));
1142 }
1143
1144 TEST(PictureLayerTilingTest, ExpandRectOutOfBoundsFarAway) {
1145 gfx::Rect in(400, 500, 100, 200);
1146 gfx::Rect bounds(0, 0, 10, 10);
1147 int64 target_area = 400 * 400;
1148 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1149 in, target_area, bounds, NULL);
1150 EXPECT_TRUE(out.IsEmpty());
1151 }
1152
1153 TEST(PictureLayerTilingTest, ExpandRectOutOfBoundsExpandedFullyCover) {
1154 gfx::Rect in(40, 50, 100, 100);
1155 gfx::Rect bounds(0, 0, 10, 10);
1156 int64 target_area = 400 * 400;
1157 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1158 in, target_area, bounds, NULL);
1159 EXPECT_EQ(bounds.ToString(), out.ToString());
1160 }
1161
1162 TEST(PictureLayerTilingTest, ExpandRectOutOfBoundsExpandedPartlyCover) {
1163 gfx::Rect in(600, 600, 100, 100);
1164 gfx::Rect bounds(0, 0, 500, 500);
1165 int64 target_area = 400 * 400;
1166 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1167 in, target_area, bounds, NULL);
1168 EXPECT_EQ(bounds.right(), out.right());
1169 EXPECT_EQ(bounds.bottom(), out.bottom());
1170 EXPECT_LE(out.width() * out.height(), target_area);
1171 EXPECT_GT(out.width() * out.height(),
1172 target_area - out.width() - out.height());
1173 EXPECT_TRUE(bounds.Contains(out));
1174 }
1175
1176 TEST(PictureLayerTilingTest, EmptyStartingRect) {
1177 // If a layer has a non-invertible transform, then the starting rect
1178 // for the layer would be empty.
1179 gfx::Rect in(40, 40, 0, 0);
1180 gfx::Rect bounds(0, 0, 10, 10);
1181 int64 target_area = 400 * 400;
1182 gfx::Rect out = PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy(
1183 in, target_area, bounds, NULL);
1184 EXPECT_TRUE(out.IsEmpty());
1185 }
1186
1187 static void TileExists(bool exists, Tile* tile,
1188 const gfx::Rect& geometry_rect) {
1189 EXPECT_EQ(exists, tile != NULL) << geometry_rect.ToString();
1190 }
1191
1192 TEST_F(PictureLayerTilingIteratorTest, TilesExist) {
1193 gfx::Size layer_bounds(1099, 801);
1194 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1195 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1196 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1197
1198 tiling_->ComputeTilePriorityRects(
1199 gfx::Rect(layer_bounds), // visible content rect
1200 1.f, // current contents scale
1201 1.0, // current frame time
1202 Occlusion());
1203 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1204
1205 // Make the viewport rect empty. All tiles are killed and become zombies.
1206 tiling_->ComputeTilePriorityRects(gfx::Rect(), // visible content rect
1207 1.f, // current contents scale
1208 2.0, // current frame time
1209 Occlusion());
1210 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1211 }
1212
1213 TEST_F(PictureLayerTilingIteratorTest, TilesExistGiantViewport) {
1214 gfx::Size layer_bounds(1099, 801);
1215 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1216 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1217 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1218
1219 gfx::Rect giant_rect(-10000000, -10000000, 1000000000, 1000000000);
1220
1221 tiling_->ComputeTilePriorityRects(
1222 gfx::Rect(layer_bounds), // visible content rect
1223 1.f, // current contents scale
1224 1.0, // current frame time
1225 Occlusion());
1226 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1227
1228 // If the visible content rect is empty, it should still have live tiles.
1229 tiling_->ComputeTilePriorityRects(giant_rect, // visible content rect
1230 1.f, // current contents scale
1231 2.0, // current frame time
1232 Occlusion());
1233 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1234 }
1235
1236 TEST_F(PictureLayerTilingIteratorTest, TilesExistOutsideViewport) {
1237 gfx::Size layer_bounds(1099, 801);
1238 Initialize(gfx::Size(100, 100), 1.f, layer_bounds);
1239 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1240 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1241
1242 // This rect does not intersect with the layer, as the layer is outside the
1243 // viewport.
1244 gfx::Rect viewport_rect(1100, 0, 1000, 1000);
1245 EXPECT_FALSE(viewport_rect.Intersects(gfx::Rect(layer_bounds)));
1246
1247 tiling_->ComputeTilePriorityRects(viewport_rect, // visible content rect
1248 1.f, // current contents scale
1249 1.0, // current frame time
1250 Occlusion());
1251 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, true));
1252 }
1253
1254 static void TilesIntersectingRectExist(const gfx::Rect& rect,
1255 bool intersect_exists,
1256 Tile* tile,
1257 const gfx::Rect& geometry_rect) {
1258 bool intersects = rect.Intersects(geometry_rect);
1259 bool expected_exists = intersect_exists ? intersects : !intersects;
1260 EXPECT_EQ(expected_exists, tile != NULL)
1261 << "Rects intersecting " << rect.ToString() << " should exist. "
1262 << "Current tile rect is " << geometry_rect.ToString();
1263 }
1264
1265 TEST_F(PictureLayerTilingIteratorTest,
1266 TilesExistLargeViewportAndLayerWithSmallVisibleArea) {
1267 gfx::Size layer_bounds(10000, 10000);
1268 client_.SetTileSize(gfx::Size(100, 100));
1269 LayerTreeSettings settings;
1270 settings.tiling_interest_area_viewport_multiplier = 1;
1271
1272 scoped_refptr<FakePicturePileImpl> pile =
1273 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(layer_bounds);
1274 tiling_ = TestablePictureLayerTiling::Create(PENDING_TREE, 1.f, pile,
1275 &client_, settings);
1276 VerifyTilesExactlyCoverRect(1.f, gfx::Rect(layer_bounds));
1277 VerifyTiles(1.f, gfx::Rect(layer_bounds), base::Bind(&TileExists, false));
1278
1279 gfx::Rect visible_rect(8000, 8000, 50, 50);
1280
1281 tiling_->ComputeTilePriorityRects(visible_rect, // visible content rect
1282 1.f, // current contents scale
1283 1.0, // current frame time
1284 Occlusion());
1285 VerifyTiles(1.f,
1286 gfx::Rect(layer_bounds),
1287 base::Bind(&TilesIntersectingRectExist, visible_rect, true));
1288 }
1289
1290 TEST(ComputeTilePriorityRectsTest, VisibleTiles) {
1291 // The TilePriority of visible tiles should have zero distance_to_visible
1292 // and time_to_visible.
1293 FakePictureLayerTilingClient client;
1294
1295 gfx::Size device_viewport(800, 600);
1296 gfx::Size last_layer_bounds(200, 200);
1297 gfx::Size current_layer_bounds(200, 200);
1298 float current_layer_contents_scale = 1.f;
1299 gfx::Transform current_screen_transform;
1300 double current_frame_time_in_seconds = 1.0;
1301
1302 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1303 current_screen_transform, device_viewport);
1304
1305 client.SetTileSize(gfx::Size(100, 100));
1306
1307 scoped_refptr<FakePicturePileImpl> pile =
1308 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1309 current_layer_bounds);
1310 scoped_ptr<TestablePictureLayerTiling> tiling =
1311 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1312 LayerTreeSettings());
1313
1314 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1315 current_layer_contents_scale,
1316 current_frame_time_in_seconds, Occlusion());
1317 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1318
1319 ASSERT_TRUE(tiling->TileAt(0, 0));
1320 ASSERT_TRUE(tiling->TileAt(0, 1));
1321 ASSERT_TRUE(tiling->TileAt(1, 0));
1322 ASSERT_TRUE(tiling->TileAt(1, 1));
1323
1324 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1325 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1326 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1327
1328 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1329 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1330 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1331
1332 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1333 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1334 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1335
1336 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1337 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1338 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1339 }
1340
1341 TEST(ComputeTilePriorityRectsTest, OffscreenTiles) {
1342 // The TilePriority of offscreen tiles (without movement) should have nonzero
1343 // distance_to_visible and infinite time_to_visible.
1344 FakePictureLayerTilingClient client;
1345
1346 gfx::Size device_viewport(800, 600);
1347 gfx::Size last_layer_bounds(200, 200);
1348 gfx::Size current_layer_bounds(200, 200);
1349 float current_layer_contents_scale = 1.f;
1350 gfx::Transform last_screen_transform;
1351 gfx::Transform current_screen_transform;
1352 double current_frame_time_in_seconds = 1.0;
1353
1354 current_screen_transform.Translate(850, 0);
1355 last_screen_transform = current_screen_transform;
1356
1357 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1358 current_screen_transform, device_viewport);
1359
1360 client.SetTileSize(gfx::Size(100, 100));
1361
1362 scoped_refptr<FakePicturePileImpl> pile =
1363 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1364 current_layer_bounds);
1365 scoped_ptr<TestablePictureLayerTiling> tiling =
1366 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1367 LayerTreeSettings());
1368
1369 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1370 current_layer_contents_scale,
1371 current_frame_time_in_seconds, Occlusion());
1372 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1373
1374 ASSERT_TRUE(tiling->TileAt(0, 0));
1375 ASSERT_TRUE(tiling->TileAt(0, 1));
1376 ASSERT_TRUE(tiling->TileAt(1, 0));
1377 ASSERT_TRUE(tiling->TileAt(1, 1));
1378
1379 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1380 EXPECT_GT(priority.distance_to_visible, 0.f);
1381 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1382
1383 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1384 EXPECT_GT(priority.distance_to_visible, 0.f);
1385 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1386
1387 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1388 EXPECT_GT(priority.distance_to_visible, 0.f);
1389 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1390
1391 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1392 EXPECT_GT(priority.distance_to_visible, 0.f);
1393 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1394
1395 // Furthermore, in this scenario tiles on the right hand side should have a
1396 // larger distance to visible.
1397 TilePriority left = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1398 TilePriority right = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1399 EXPECT_GT(right.distance_to_visible, left.distance_to_visible);
1400
1401 left = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1402 right = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1403 EXPECT_GT(right.distance_to_visible, left.distance_to_visible);
1404 }
1405
1406 TEST(ComputeTilePriorityRectsTest, PartiallyOffscreenLayer) {
1407 // Sanity check that a layer with some tiles visible and others offscreen has
1408 // correct TilePriorities for each tile.
1409 FakePictureLayerTilingClient client;
1410
1411 gfx::Size device_viewport(800, 600);
1412 gfx::Size last_layer_bounds(200, 200);
1413 gfx::Size current_layer_bounds(200, 200);
1414 float current_layer_contents_scale = 1.f;
1415 gfx::Transform last_screen_transform;
1416 gfx::Transform current_screen_transform;
1417 double current_frame_time_in_seconds = 1.0;
1418
1419 current_screen_transform.Translate(705, 505);
1420 last_screen_transform = current_screen_transform;
1421
1422 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1423 current_screen_transform, device_viewport);
1424
1425 client.SetTileSize(gfx::Size(100, 100));
1426
1427 scoped_refptr<FakePicturePileImpl> pile =
1428 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1429 current_layer_bounds);
1430 scoped_ptr<TestablePictureLayerTiling> tiling =
1431 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1432 LayerTreeSettings());
1433
1434 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1435 current_layer_contents_scale,
1436 current_frame_time_in_seconds, Occlusion());
1437 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1438
1439 ASSERT_TRUE(tiling->TileAt(0, 0));
1440 ASSERT_TRUE(tiling->TileAt(0, 1));
1441 ASSERT_TRUE(tiling->TileAt(1, 0));
1442 ASSERT_TRUE(tiling->TileAt(1, 1));
1443
1444 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1445 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1446 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1447
1448 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1449 EXPECT_GT(priority.distance_to_visible, 0.f);
1450 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1451
1452 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1453 EXPECT_GT(priority.distance_to_visible, 0.f);
1454 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1455
1456 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1457 EXPECT_GT(priority.distance_to_visible, 0.f);
1458 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1459 }
1460
1461 TEST(ComputeTilePriorityRectsTest, PartiallyOffscreenRotatedLayer) {
1462 // Each tile of a layer may be affected differently by a transform; Check
1463 // that ComputeTilePriorityRects correctly accounts for the transform between
1464 // layer space and screen space.
1465 FakePictureLayerTilingClient client;
1466
1467 gfx::Size device_viewport(800, 600);
1468 gfx::Size last_layer_bounds(200, 200);
1469 gfx::Size current_layer_bounds(200, 200);
1470 float current_layer_contents_scale = 1.f;
1471 gfx::Transform last_screen_transform;
1472 gfx::Transform current_screen_transform;
1473 double current_frame_time_in_seconds = 1.0;
1474
1475 // A diagonally rotated layer that is partially off the bottom of the screen.
1476 // In this configuration, only the top-left tile would be visible.
1477 current_screen_transform.Translate(600, 750);
1478 current_screen_transform.RotateAboutZAxis(45);
1479 last_screen_transform = current_screen_transform;
1480
1481 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1482 current_screen_transform, device_viewport);
1483
1484 client.SetTileSize(gfx::Size(100, 100));
1485
1486 scoped_refptr<FakePicturePileImpl> pile =
1487 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1488 current_layer_bounds);
1489 scoped_ptr<TestablePictureLayerTiling> tiling =
1490 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1491 LayerTreeSettings());
1492
1493 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1494 current_layer_contents_scale,
1495 current_frame_time_in_seconds, Occlusion());
1496 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1497
1498 ASSERT_TRUE(tiling->TileAt(0, 0));
1499 ASSERT_TRUE(tiling->TileAt(0, 1));
1500 ASSERT_TRUE(tiling->TileAt(1, 0));
1501 ASSERT_TRUE(tiling->TileAt(1, 1));
1502
1503 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1504 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1505 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1506
1507 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1508 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1509 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1510
1511 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1512 EXPECT_GT(priority.distance_to_visible, 0.f);
1513 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1514
1515 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1516 EXPECT_GT(priority.distance_to_visible, 0.f);
1517 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1518
1519 // Furthermore, in this scenario the bottom-right tile should have the larger
1520 // distance to visible.
1521 TilePriority top_left = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1522 TilePriority top_right = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1523 TilePriority bottom_right =
1524 prioritized_tiles[tiling->TileAt(1, 1)].priority();
1525 EXPECT_GT(top_right.distance_to_visible, top_left.distance_to_visible);
1526
1527 EXPECT_EQ(bottom_right.distance_to_visible, top_right.distance_to_visible);
1528 }
1529
1530 TEST(ComputeTilePriorityRectsTest, PerspectiveLayer) {
1531 // Perspective transforms need to take a different code path.
1532 // This test checks tile priorities of a perspective layer.
1533 FakePictureLayerTilingClient client;
1534
1535 gfx::Size device_viewport(800, 600);
1536 gfx::Rect visible_layer_rect(0, 0, 0, 0); // offscreen.
1537 gfx::Size last_layer_bounds(200, 200);
1538 gfx::Size current_layer_bounds(200, 200);
1539 float current_layer_contents_scale = 1.f;
1540 gfx::Transform last_screen_transform;
1541 gfx::Transform current_screen_transform;
1542 double current_frame_time_in_seconds = 1.0;
1543
1544 // A 3d perspective layer rotated about its Y axis, translated to almost
1545 // fully offscreen. The left side will appear closer (i.e. larger in 2d) than
1546 // the right side, so the top-left tile will technically be closer than the
1547 // top-right.
1548
1549 // Translate layer to offscreen
1550 current_screen_transform.Translate(400.0, 630.0);
1551 // Apply perspective about the center of the layer
1552 current_screen_transform.Translate(100.0, 100.0);
1553 current_screen_transform.ApplyPerspectiveDepth(100.0);
1554 current_screen_transform.RotateAboutYAxis(10.0);
1555 current_screen_transform.Translate(-100.0, -100.0);
1556 last_screen_transform = current_screen_transform;
1557
1558 // Sanity check that this transform wouldn't cause w<0 clipping.
1559 bool clipped;
1560 MathUtil::MapQuad(current_screen_transform,
1561 gfx::QuadF(gfx::RectF(0, 0, 200, 200)),
1562 &clipped);
1563 ASSERT_FALSE(clipped);
1564
1565 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1566 current_screen_transform, device_viewport);
1567
1568 client.SetTileSize(gfx::Size(100, 100));
1569
1570 scoped_refptr<FakePicturePileImpl> pile =
1571 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1572 current_layer_bounds);
1573 scoped_ptr<TestablePictureLayerTiling> tiling =
1574 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1575 LayerTreeSettings());
1576
1577 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1578 current_layer_contents_scale,
1579 current_frame_time_in_seconds, Occlusion());
1580 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1581
1582 ASSERT_TRUE(tiling->TileAt(0, 0));
1583 ASSERT_TRUE(tiling->TileAt(0, 1));
1584 ASSERT_TRUE(tiling->TileAt(1, 0));
1585 ASSERT_TRUE(tiling->TileAt(1, 1));
1586
1587 // All tiles will have a positive distance_to_visible
1588 // and an infinite time_to_visible.
1589 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1590 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1591 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1592
1593 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1594 EXPECT_GT(priority.distance_to_visible, 0.f);
1595 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1596
1597 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1598 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1599 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1600
1601 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1602 EXPECT_GT(priority.distance_to_visible, 0.f);
1603 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1604
1605 // Furthermore, in this scenario the top-left distance_to_visible
1606 // will be smallest, followed by top-right. The bottom layers
1607 // will of course be further than the top layers.
1608 TilePriority top_left = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1609 TilePriority top_right = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1610 TilePriority bottom_left = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1611 TilePriority bottom_right =
1612 prioritized_tiles[tiling->TileAt(1, 1)].priority();
1613
1614 EXPECT_GT(bottom_right.distance_to_visible, top_right.distance_to_visible);
1615
1616 EXPECT_GT(bottom_left.distance_to_visible, top_left.distance_to_visible);
1617 }
1618
1619 TEST(ComputeTilePriorityRectsTest, PerspectiveLayerClippedByW) {
1620 // Perspective transforms need to take a different code path.
1621 // This test checks tile priorities of a perspective layer.
1622 FakePictureLayerTilingClient client;
1623
1624 gfx::Size device_viewport(800, 600);
1625 gfx::Size last_layer_bounds(200, 200);
1626 gfx::Size current_layer_bounds(200, 200);
1627 float current_layer_contents_scale = 1.f;
1628 gfx::Transform last_screen_transform;
1629 gfx::Transform current_screen_transform;
1630 double current_frame_time_in_seconds = 1.0;
1631
1632 // A 3d perspective layer rotated about its Y axis, translated to almost
1633 // fully offscreen. The left side will appear closer (i.e. larger in 2d) than
1634 // the right side, so the top-left tile will technically be closer than the
1635 // top-right.
1636
1637 // Translate layer to offscreen
1638 current_screen_transform.Translate(400.0, 970.0);
1639 // Apply perspective and rotation about the center of the layer
1640 current_screen_transform.Translate(100.0, 100.0);
1641 current_screen_transform.ApplyPerspectiveDepth(10.0);
1642 current_screen_transform.RotateAboutYAxis(10.0);
1643 current_screen_transform.Translate(-100.0, -100.0);
1644 last_screen_transform = current_screen_transform;
1645
1646 // Sanity check that this transform does cause w<0 clipping for the left side
1647 // of the layer, but not the right side.
1648 bool clipped;
1649 MathUtil::MapQuad(current_screen_transform,
1650 gfx::QuadF(gfx::RectF(0, 0, 100, 200)),
1651 &clipped);
1652 ASSERT_TRUE(clipped);
1653
1654 MathUtil::MapQuad(current_screen_transform,
1655 gfx::QuadF(gfx::RectF(100, 0, 100, 200)),
1656 &clipped);
1657 ASSERT_FALSE(clipped);
1658
1659 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1660 current_screen_transform, device_viewport);
1661
1662 client.SetTileSize(gfx::Size(100, 100));
1663
1664 scoped_refptr<FakePicturePileImpl> pile =
1665 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1666 current_layer_bounds);
1667 scoped_ptr<TestablePictureLayerTiling> tiling =
1668 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1669 LayerTreeSettings());
1670
1671 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1672 current_layer_contents_scale,
1673 current_frame_time_in_seconds, Occlusion());
1674 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1675
1676 ASSERT_TRUE(tiling->TileAt(0, 0));
1677 ASSERT_TRUE(tiling->TileAt(0, 1));
1678 ASSERT_TRUE(tiling->TileAt(1, 0));
1679 ASSERT_TRUE(tiling->TileAt(1, 1));
1680
1681 // Left-side tiles will be clipped by the transform, so we have to assume
1682 // they are visible just in case.
1683 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1684 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1685 EXPECT_FLOAT_EQ(TilePriority::NOW, priority.priority_bin);
1686
1687 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1688 EXPECT_GT(priority.distance_to_visible, 0.f);
1689 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1690
1691 // Right-side tiles will have a positive distance_to_visible
1692 // and an infinite time_to_visible.
1693 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1694 EXPECT_FLOAT_EQ(priority.distance_to_visible, 0.f);
1695 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1696
1697 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1698 EXPECT_GT(priority.distance_to_visible, 0.f);
1699 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1700 }
1701
1702 TEST(ComputeTilePriorityRectsTest, BasicMotion) {
1703 // Test that time_to_visible is computed correctly when
1704 // there is some motion.
1705 FakePictureLayerTilingClient client;
1706
1707 gfx::Size device_viewport(800, 600);
1708 gfx::Rect visible_layer_rect(0, 0, 0, 0);
1709 gfx::Size last_layer_bounds(200, 200);
1710 gfx::Size current_layer_bounds(200, 200);
1711 float last_layer_contents_scale = 1.f;
1712 float current_layer_contents_scale = 1.f;
1713 gfx::Transform last_screen_transform;
1714 gfx::Transform current_screen_transform;
1715 double last_frame_time_in_seconds = 1.0;
1716 double current_frame_time_in_seconds = 2.0;
1717
1718 // Offscreen layer is coming closer to viewport at 1000 pixels per second.
1719 current_screen_transform.Translate(1800, 0);
1720 last_screen_transform.Translate(2800, 0);
1721
1722 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1723 current_screen_transform, device_viewport);
1724
1725 client.SetTileSize(gfx::Size(100, 100));
1726 LayerTreeSettings settings;
1727 settings.tiling_interest_area_viewport_multiplier = 10000;
1728
1729 scoped_refptr<FakePicturePileImpl> pile =
1730 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1731 current_layer_bounds);
1732 scoped_ptr<TestablePictureLayerTiling> tiling =
1733 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1734 settings);
1735
1736 // previous ("last") frame
1737 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1738 last_layer_contents_scale,
1739 last_frame_time_in_seconds, Occlusion());
1740
1741 // current frame
1742 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1743 current_layer_contents_scale,
1744 current_frame_time_in_seconds, Occlusion());
1745 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1746
1747 ASSERT_TRUE(tiling->TileAt(0, 0));
1748 ASSERT_TRUE(tiling->TileAt(0, 1));
1749 ASSERT_TRUE(tiling->TileAt(1, 0));
1750 ASSERT_TRUE(tiling->TileAt(1, 1));
1751
1752 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1753 EXPECT_GT(priority.distance_to_visible, 0.f);
1754 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1755
1756 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1757 EXPECT_GT(priority.distance_to_visible, 0.f);
1758 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1759
1760 // time_to_visible for the right hand side layers needs an extra 0.099
1761 // seconds because this tile is 99 pixels further away.
1762 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1763 EXPECT_GT(priority.distance_to_visible, 0.f);
1764 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1765
1766 priority = prioritized_tiles[tiling->TileAt(1, 1)].priority();
1767 EXPECT_GT(priority.distance_to_visible, 0.f);
1768 EXPECT_NE(TilePriority::NOW, priority.priority_bin);
1769 }
1770
1771 TEST(ComputeTilePriorityRectsTest, RotationMotion) {
1772 // Each tile of a layer may be affected differently by a transform; Check
1773 // that ComputeTilePriorityRects correctly accounts for the transform between
1774 // layer space and screen space.
1775
1776 FakePictureLayerTilingClient client;
1777 scoped_ptr<TestablePictureLayerTiling> tiling;
1778
1779 gfx::Size device_viewport(800, 600);
1780 gfx::Rect visible_layer_rect(0, 0, 0, 0); // offscren.
1781 gfx::Size last_layer_bounds(200, 200);
1782 gfx::Size current_layer_bounds(200, 200);
1783 float last_layer_contents_scale = 1.f;
1784 float current_layer_contents_scale = 1.f;
1785 gfx::Transform last_screen_transform;
1786 gfx::Transform current_screen_transform;
1787 double last_frame_time_in_seconds = 1.0;
1788 double current_frame_time_in_seconds = 2.0;
1789
1790 // Rotation motion is set up specifically so that:
1791 // - rotation occurs about the center of the layer
1792 // - the top-left tile becomes visible on rotation
1793 // - the top-right tile will have an infinite time_to_visible
1794 // because it is rotating away from viewport.
1795 // - bottom-left layer will have a positive non-zero time_to_visible
1796 // because it is rotating toward the viewport.
1797 current_screen_transform.Translate(400, 550);
1798 current_screen_transform.RotateAboutZAxis(45);
1799
1800 last_screen_transform.Translate(400, 550);
1801
1802 gfx::Rect viewport_in_layer_space = ViewportInLayerSpace(
1803 current_screen_transform, device_viewport);
1804
1805 client.SetTileSize(gfx::Size(100, 100));
1806
1807 scoped_refptr<FakePicturePileImpl> pile =
1808 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1809 current_layer_bounds);
1810 tiling = TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile, &client,
1811 LayerTreeSettings());
1812
1813 // previous ("last") frame
1814 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1815 last_layer_contents_scale,
1816 last_frame_time_in_seconds, Occlusion());
1817
1818 // current frame
1819 tiling->ComputeTilePriorityRects(viewport_in_layer_space,
1820 current_layer_contents_scale,
1821 current_frame_time_in_seconds, Occlusion());
1822 auto prioritized_tiles = tiling->UpdateAndGetAllPrioritizedTilesForTesting();
1823
1824 ASSERT_TRUE(tiling->TileAt(0, 0));
1825 ASSERT_TRUE(tiling->TileAt(0, 1));
1826 ASSERT_TRUE(tiling->TileAt(1, 0));
1827 ASSERT_TRUE(tiling->TileAt(1, 1));
1828
1829 TilePriority priority = prioritized_tiles[tiling->TileAt(0, 0)].priority();
1830 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1831 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1832
1833 priority = prioritized_tiles[tiling->TileAt(0, 1)].priority();
1834 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1835 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1836
1837 priority = prioritized_tiles[tiling->TileAt(1, 0)].priority();
1838 EXPECT_FLOAT_EQ(0.f, priority.distance_to_visible);
1839 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
1840 }
1841
1842 TEST(PictureLayerTilingTest, RecycledTilesCleared) {
1843 // This test performs the following:
1844 // Setup:
1845 // - Two tilings, one active one recycled with all tiles shared.
1846 // Procedure:
1847 // - Viewport moves somewhere far away and active tiling clears tiles.
1848 // - Viewport moves back and a new active tiling tile is created.
1849 // Result:
1850 // - Recycle tiling does _not_ have the tile in the same location (thus it
1851 // will be shared next time a pending tiling is created).
1852
1853 FakePictureLayerTilingClient active_client;
1854
1855 active_client.SetTileSize(gfx::Size(100, 100));
1856 LayerTreeSettings settings;
1857
1858 scoped_refptr<FakePicturePileImpl> pile =
1859 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1860 gfx::Size(10000, 10000));
1861 scoped_ptr<TestablePictureLayerTiling> active_tiling =
1862 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile,
1863 &active_client, settings);
1864 // Create all tiles on this tiling.
1865 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 1.0f,
1866 Occlusion());
1867
1868 FakePictureLayerTilingClient recycle_client;
1869 recycle_client.SetTileSize(gfx::Size(100, 100));
1870 recycle_client.set_twin_tiling(active_tiling.get());
1871
1872 pile = FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1873 gfx::Size(10000, 10000));
1874 scoped_ptr<TestablePictureLayerTiling> recycle_tiling =
1875 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, pile,
1876 &recycle_client, settings);
1877
1878 // Create all tiles on the second tiling. All tiles should be shared.
1879 recycle_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f,
1880 1.0f, Occlusion());
1881
1882 // Set the second tiling as recycled.
1883 active_client.set_twin_tiling(NULL);
1884 recycle_client.set_twin_tiling(NULL);
1885
1886 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1887 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1888
1889 // Move the viewport far away from the (0, 0) tile.
1890 active_tiling->ComputeTilePriorityRects(gfx::Rect(9000, 9000, 100, 100), 1.0f,
1891 2.0, Occlusion());
1892 // Ensure the tile was deleted.
1893 EXPECT_FALSE(active_tiling->TileAt(0, 0));
1894 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1895
1896 // Move the viewport back to (0, 0) tile.
1897 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 3.0,
1898 Occlusion());
1899
1900 // Ensure that we now have a tile here on both active.
1901 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1902 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1903 }
1904
1905 TEST(PictureLayerTilingTest, RecycledTilesClearedOnReset) {
1906 FakePictureLayerTilingClient active_client;
1907 active_client.SetTileSize(gfx::Size(100, 100));
1908
1909 scoped_refptr<FakePicturePileImpl> pile =
1910 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1911 gfx::Size(100, 100));
1912 scoped_ptr<TestablePictureLayerTiling> active_tiling =
1913 TestablePictureLayerTiling::Create(ACTIVE_TREE, 1.0f, pile,
1914 &active_client, LayerTreeSettings());
1915 // Create all tiles on this tiling.
1916 active_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f, 1.0f,
1917 Occlusion());
1918
1919 FakePictureLayerTilingClient recycle_client;
1920 recycle_client.SetTileSize(gfx::Size(100, 100));
1921 recycle_client.set_twin_tiling(active_tiling.get());
1922
1923 LayerTreeSettings settings;
1924
1925 pile = FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1926 gfx::Size(100, 100));
1927 scoped_ptr<TestablePictureLayerTiling> recycle_tiling =
1928 TestablePictureLayerTiling::Create(PENDING_TREE, 1.0f, pile,
1929 &recycle_client, settings);
1930
1931 // Create all tiles on the recycle tiling. All tiles should be shared.
1932 recycle_tiling->ComputeTilePriorityRects(gfx::Rect(0, 0, 100, 100), 1.0f,
1933 1.0f, Occlusion());
1934
1935 // Set the second tiling as recycled.
1936 active_client.set_twin_tiling(NULL);
1937 recycle_client.set_twin_tiling(NULL);
1938
1939 EXPECT_TRUE(active_tiling->TileAt(0, 0));
1940 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1941
1942 // Reset the active tiling. The recycle tiles should be released too.
1943 active_tiling->Reset();
1944 EXPECT_FALSE(active_tiling->TileAt(0, 0));
1945 EXPECT_FALSE(recycle_tiling->TileAt(0, 0));
1946 }
1947
1948 TEST_F(PictureLayerTilingIteratorTest, ResizeTilesAndUpdateToCurrent) {
1949 // The tiling has four rows and three columns.
1950 Initialize(gfx::Size(150, 100), 1.f, gfx::Size(250, 150));
1951 tiling_->CreateAllTilesForTesting();
1952 EXPECT_EQ(150, tiling_->TilingDataForTesting().max_texture_size().width());
1953 EXPECT_EQ(100, tiling_->TilingDataForTesting().max_texture_size().height());
1954 EXPECT_EQ(4u, tiling_->AllTilesForTesting().size());
1955
1956 client_.SetTileSize(gfx::Size(250, 200));
1957
1958 // Tile size in the tiling should still be 150x100.
1959 EXPECT_EQ(150, tiling_->TilingDataForTesting().max_texture_size().width());
1960 EXPECT_EQ(100, tiling_->TilingDataForTesting().max_texture_size().height());
1961
1962 // The layer's size isn't changed, but the tile size was.
1963 scoped_refptr<FakePicturePileImpl> pile =
1964 FakePicturePileImpl::CreateFilledPileWithDefaultTileSize(
1965 gfx::Size(250, 150));
1966 tiling_->SetRasterSourceAndResize(pile);
1967
1968 // Tile size in the tiling should be resized to 250x200.
1969 EXPECT_EQ(250, tiling_->TilingDataForTesting().max_texture_size().width());
1970 EXPECT_EQ(200, tiling_->TilingDataForTesting().max_texture_size().height());
1971 EXPECT_EQ(0u, tiling_->AllTilesForTesting().size());
1972 }
1973
1974 } // namespace
1975 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/picture_layer_tiling_set_unittest.cc ('k') | cc/resources/picture_pile.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698