OLD | NEW |
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_rendering_stats_instrumentation.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 } | 29 } |
30 | 30 |
31 typedef PicturePile::PictureInfo PictureInfo; | 31 typedef PicturePile::PictureInfo PictureInfo; |
32 typedef PicturePile::PictureMapKey PictureMapKey; | 32 typedef PicturePile::PictureMapKey PictureMapKey; |
33 typedef PicturePile::PictureMap PictureMap; | 33 typedef PicturePile::PictureMap PictureMap; |
34 | 34 |
35 protected: | 35 protected: |
36 virtual ~TestPicturePile() {} | 36 virtual ~TestPicturePile() {} |
37 }; | 37 }; |
38 | 38 |
39 class PicturePileTest : public testing::Test { | 39 class PicturePileTestBase { |
40 public: | 40 public: |
41 PicturePileTest() | 41 PicturePileTestBase() |
42 : pile_(new TestPicturePile()), | 42 : pile_(new TestPicturePile()), |
43 background_color_(SK_ColorBLUE), | 43 background_color_(SK_ColorBLUE), |
44 min_scale_(0.125), | 44 min_scale_(0.125), |
45 frame_number_(0), | 45 frame_number_(0), |
46 contents_opaque_(false) { | 46 contents_opaque_(false) { |
47 pile_->SetTileGridSize(gfx::Size(1000, 1000)); | 47 pile_->SetTileGridSize(gfx::Size(1000, 1000)); |
48 pile_->SetMinContentsScale(min_scale_); | 48 pile_->SetMinContentsScale(min_scale_); |
49 SetTilingSize(pile_->tiling().max_texture_size()); | 49 SetTilingSize(pile_->tiling().max_texture_size()); |
50 } | 50 } |
51 | 51 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 | 84 |
85 FakeContentLayerClient client_; | 85 FakeContentLayerClient client_; |
86 FakeRenderingStatsInstrumentation stats_instrumentation_; | 86 FakeRenderingStatsInstrumentation stats_instrumentation_; |
87 scoped_refptr<TestPicturePile> pile_; | 87 scoped_refptr<TestPicturePile> pile_; |
88 SkColor background_color_; | 88 SkColor background_color_; |
89 float min_scale_; | 89 float min_scale_; |
90 int frame_number_; | 90 int frame_number_; |
91 bool contents_opaque_; | 91 bool contents_opaque_; |
92 }; | 92 }; |
93 | 93 |
| 94 class PicturePileTest : public PicturePileTestBase, public testing::Test {}; |
| 95 |
94 TEST_F(PicturePileTest, SmallInvalidateInflated) { | 96 TEST_F(PicturePileTest, SmallInvalidateInflated) { |
95 // Invalidate something inside a tile. | 97 // Invalidate something inside a tile. |
96 Region invalidate_rect(gfx::Rect(50, 50, 1, 1)); | 98 Region invalidate_rect(gfx::Rect(50, 50, 1, 1)); |
97 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect()); | 99 UpdateAndExpandInvalidation(&invalidate_rect, tiling_size(), tiling_rect()); |
98 EXPECT_EQ(gfx::Rect(50, 50, 1, 1).ToString(), invalidate_rect.ToString()); | 100 EXPECT_EQ(gfx::Rect(50, 50, 1, 1).ToString(), invalidate_rect.ToString()); |
99 | 101 |
100 EXPECT_EQ(1, pile_->tiling().num_tiles_x()); | 102 EXPECT_EQ(1, pile_->tiling().num_tiles_x()); |
101 EXPECT_EQ(1, pile_->tiling().num_tiles_y()); | 103 EXPECT_EQ(1, pile_->tiling().num_tiles_y()); |
102 | 104 |
103 TestPicturePile::PictureInfo& picture_info = | 105 TestPicturePile::PictureInfo& picture_info = |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 recorded_over_tiles.right(), recorded_over_tiles.y(), 30, 30); | 379 recorded_over_tiles.right(), recorded_over_tiles.y(), 30, 30); |
378 invalidation = invalidation_outside; | 380 invalidation = invalidation_outside; |
379 UpdateAndExpandInvalidation(&invalidation, huge_layer_size, viewport); | 381 UpdateAndExpandInvalidation(&invalidation, huge_layer_size, viewport); |
380 gfx::Rect expanded_recorded_viewport = | 382 gfx::Rect expanded_recorded_viewport = |
381 pile_->tiling().ExpandRectToTileBounds(pile_->recorded_viewport()); | 383 pile_->tiling().ExpandRectToTileBounds(pile_->recorded_viewport()); |
382 Region expected_invalidation = | 384 Region expected_invalidation = |
383 pile_->tiling().ExpandRectToTileBounds(invalidation_outside); | 385 pile_->tiling().ExpandRectToTileBounds(invalidation_outside); |
384 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 386 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
385 } | 387 } |
386 | 388 |
387 TEST_F(PicturePileTest, ResizePileOutsideInterestRect) { | 389 enum Corner { |
| 390 TOP_LEFT, |
| 391 TOP_RIGHT, |
| 392 BOTTOM_LEFT, |
| 393 BOTTOM_RIGHT, |
| 394 }; |
| 395 |
| 396 class PicturePileResizeCornerTest : public PicturePileTestBase, |
| 397 public testing::TestWithParam<Corner> { |
| 398 protected: |
| 399 static gfx::Rect CornerSinglePixelRect(Corner corner, const gfx::Size& s) { |
| 400 switch (corner) { |
| 401 case TOP_LEFT: |
| 402 return gfx::Rect(0, 0, 1, 1); |
| 403 case TOP_RIGHT: |
| 404 return gfx::Rect(s.width() - 1, 0, 1, 1); |
| 405 case BOTTOM_LEFT: |
| 406 return gfx::Rect(0, s.height() - 1, 1, 1); |
| 407 case BOTTOM_RIGHT: |
| 408 return gfx::Rect(s.width() - 1, s.height() - 1, 1, 1); |
| 409 } |
| 410 NOTREACHED(); |
| 411 return gfx::Rect(); |
| 412 } |
| 413 }; |
| 414 |
| 415 TEST_P(PicturePileResizeCornerTest, ResizePileOutsideInterestRect) { |
| 416 Corner corner = GetParam(); |
| 417 |
388 // This size chosen to be larger than the interest rect size, which is | 418 // This size chosen to be larger than the interest rect size, which is |
389 // at least kPixelDistanceToRecord * 2 in each dimension. | 419 // at least kPixelDistanceToRecord * 2 in each dimension. |
390 int tile_size = 100000; | 420 int tile_size = 100000; |
391 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); | 421 // The small number subtracted keeps the last tile in each axis larger than |
392 gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size); | 422 // the interest rect also. |
393 gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size); | 423 int offset = -100; |
394 gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size); | 424 gfx::Size base_tiling_size(6 * tile_size + offset, 6 * tile_size + offset); |
| 425 gfx::Size grow_down_tiling_size(6 * tile_size + offset, |
| 426 8 * tile_size + offset); |
| 427 gfx::Size grow_right_tiling_size(8 * tile_size + offset, |
| 428 6 * tile_size + offset); |
| 429 gfx::Size grow_both_tiling_size(8 * tile_size + offset, |
| 430 8 * tile_size + offset); |
395 | 431 |
396 Region invalidation; | 432 Region invalidation; |
397 Region expected_invalidation; | 433 Region expected_invalidation; |
398 | 434 |
399 pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); | 435 pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); |
400 SetTilingSize(base_tiling_size); | 436 SetTilingSize(base_tiling_size); |
401 | 437 |
402 // We should have a recording for every tile. | 438 // We should have a recording for every tile. |
403 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 439 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
404 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 440 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
405 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 441 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
406 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 442 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
407 TestPicturePile::PictureMapKey key(i, j); | 443 TestPicturePile::PictureMapKey key(i, j); |
408 TestPicturePile::PictureMap& map = pile_->picture_map(); | 444 TestPicturePile::PictureMap& map = pile_->picture_map(); |
409 TestPicturePile::PictureMap::iterator it = map.find(key); | 445 TestPicturePile::PictureMap::iterator it = map.find(key); |
410 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); | 446 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); |
411 } | 447 } |
412 } | 448 } |
413 | 449 |
414 UpdateAndExpandInvalidation( | 450 UpdateAndExpandInvalidation( |
415 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1)); | 451 &invalidation, |
| 452 grow_down_tiling_size, |
| 453 CornerSinglePixelRect(corner, grow_down_tiling_size)); |
416 | 454 |
417 // We should have lost the recordings in the bottom row. | 455 // We should have lost the recordings in the bottom row. |
418 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 456 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
419 EXPECT_EQ(8, pile_->tiling().num_tiles_y()); | 457 EXPECT_EQ(8, pile_->tiling().num_tiles_y()); |
420 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 458 for (int i = 0; i < 6; ++i) { |
421 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 459 for (int j = 0; j < 6; ++j) { |
422 TestPicturePile::PictureMapKey key(i, j); | 460 TestPicturePile::PictureMapKey key(i, j); |
423 TestPicturePile::PictureMap& map = pile_->picture_map(); | 461 TestPicturePile::PictureMap& map = pile_->picture_map(); |
424 TestPicturePile::PictureMap::iterator it = map.find(key); | 462 TestPicturePile::PictureMap::iterator it = map.find(key); |
425 EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture()); | 463 EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture()); |
426 } | 464 } |
427 } | 465 } |
428 | 466 |
429 // We invalidated the old bottom row. | 467 // We invalidated the old bottom row. |
430 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5), | 468 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5), |
431 pile_->tiling().TileBounds(5, 5)); | 469 pile_->tiling().TileBounds(5, 5)); |
432 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 470 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
433 invalidation.Clear(); | 471 invalidation.Clear(); |
434 | 472 |
435 UpdateWholePile(); | 473 UpdateWholePile(); |
436 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); | 474 UpdateAndExpandInvalidation(&invalidation, |
| 475 base_tiling_size, |
| 476 CornerSinglePixelRect(corner, base_tiling_size)); |
437 | 477 |
438 // We should have lost the recordings that are now outside the tiling only. | 478 // We should have lost the recordings that are now outside the tiling only. |
439 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 479 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
440 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 480 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
441 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 481 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
442 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 482 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
443 TestPicturePile::PictureMapKey key(i, j); | 483 TestPicturePile::PictureMapKey key(i, j); |
444 TestPicturePile::PictureMap& map = pile_->picture_map(); | 484 TestPicturePile::PictureMap& map = pile_->picture_map(); |
445 TestPicturePile::PictureMap::iterator it = map.find(key); | 485 TestPicturePile::PictureMap::iterator it = map.find(key); |
446 EXPECT_EQ(j < 6, it != map.end() && it->second.GetPicture()); | 486 EXPECT_EQ(j < 6, it != map.end() && it->second.GetPicture()); |
447 } | 487 } |
448 } | 488 } |
449 | 489 |
450 // No invalidation when shrinking. | 490 // No invalidation when shrinking. |
451 expected_invalidation.Clear(); | 491 expected_invalidation.Clear(); |
452 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 492 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
453 invalidation.Clear(); | 493 invalidation.Clear(); |
454 | 494 |
455 UpdateWholePile(); | 495 UpdateWholePile(); |
456 UpdateAndExpandInvalidation( | 496 UpdateAndExpandInvalidation( |
457 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1)); | 497 &invalidation, |
| 498 grow_right_tiling_size, |
| 499 CornerSinglePixelRect(corner, grow_right_tiling_size)); |
458 | 500 |
459 // We should have lost the recordings in the right column. | 501 // We should have lost the recordings in the right column. |
460 EXPECT_EQ(8, pile_->tiling().num_tiles_x()); | 502 EXPECT_EQ(8, pile_->tiling().num_tiles_x()); |
461 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 503 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
462 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 504 for (int i = 0; i < 6; ++i) { |
463 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 505 for (int j = 0; j < 6; ++j) { |
464 TestPicturePile::PictureMapKey key(i, j); | 506 TestPicturePile::PictureMapKey key(i, j); |
465 TestPicturePile::PictureMap& map = pile_->picture_map(); | 507 TestPicturePile::PictureMap& map = pile_->picture_map(); |
466 TestPicturePile::PictureMap::iterator it = map.find(key); | 508 TestPicturePile::PictureMap::iterator it = map.find(key); |
467 EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture()); | 509 EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture()); |
468 } | 510 } |
469 } | 511 } |
470 | 512 |
471 // We invalidated the old right column. | 513 // We invalidated the old right column. |
472 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), | 514 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
473 pile_->tiling().TileBounds(5, 5)); | 515 pile_->tiling().TileBounds(5, 5)); |
474 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 516 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
475 invalidation.Clear(); | 517 invalidation.Clear(); |
476 | 518 |
477 UpdateWholePile(); | 519 UpdateWholePile(); |
478 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); | 520 UpdateAndExpandInvalidation(&invalidation, |
| 521 base_tiling_size, |
| 522 CornerSinglePixelRect(corner, base_tiling_size)); |
479 | 523 |
480 // We should have lost the recordings that are now outside the tiling only. | 524 // We should have lost the recordings that are now outside the tiling only. |
481 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 525 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
482 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 526 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
483 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 527 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
484 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 528 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
485 TestPicturePile::PictureMapKey key(i, j); | 529 TestPicturePile::PictureMapKey key(i, j); |
486 TestPicturePile::PictureMap& map = pile_->picture_map(); | 530 TestPicturePile::PictureMap& map = pile_->picture_map(); |
487 TestPicturePile::PictureMap::iterator it = map.find(key); | 531 TestPicturePile::PictureMap::iterator it = map.find(key); |
488 EXPECT_EQ(i < 6, it != map.end() && it->second.GetPicture()); | 532 EXPECT_EQ(i < 6, it != map.end() && it->second.GetPicture()); |
489 } | 533 } |
490 } | 534 } |
491 | 535 |
492 // No invalidation when shrinking. | 536 // No invalidation when shrinking. |
493 expected_invalidation.Clear(); | 537 expected_invalidation.Clear(); |
494 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 538 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
495 invalidation.Clear(); | 539 invalidation.Clear(); |
496 | 540 |
497 UpdateWholePile(); | 541 UpdateWholePile(); |
498 UpdateAndExpandInvalidation( | 542 UpdateAndExpandInvalidation( |
499 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1)); | 543 &invalidation, |
| 544 grow_both_tiling_size, |
| 545 CornerSinglePixelRect(corner, grow_both_tiling_size)); |
500 | 546 |
501 // We should have lost the recordings in the right column and bottom row. | 547 // We should have lost the recordings in the right column and bottom row. |
502 EXPECT_EQ(8, pile_->tiling().num_tiles_x()); | 548 EXPECT_EQ(8, pile_->tiling().num_tiles_x()); |
503 EXPECT_EQ(8, pile_->tiling().num_tiles_y()); | 549 EXPECT_EQ(8, pile_->tiling().num_tiles_y()); |
504 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 550 for (int i = 0; i < 6; ++i) { |
505 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 551 for (int j = 0; j < 6; ++j) { |
506 TestPicturePile::PictureMapKey key(i, j); | 552 TestPicturePile::PictureMapKey key(i, j); |
507 TestPicturePile::PictureMap& map = pile_->picture_map(); | 553 TestPicturePile::PictureMap& map = pile_->picture_map(); |
508 TestPicturePile::PictureMap::iterator it = map.find(key); | 554 TestPicturePile::PictureMap::iterator it = map.find(key); |
509 EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture()); | 555 EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture()); |
510 } | 556 } |
511 } | 557 } |
512 | 558 |
513 // We invalidated the old right column and the old bottom row. | 559 // We invalidated the old right column and the old bottom row. |
514 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), | 560 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
515 pile_->tiling().TileBounds(5, 5)); | 561 pile_->tiling().TileBounds(5, 5)); |
(...skipping 16 matching lines...) Expand all Loading... |
532 EXPECT_EQ(i < 6 && j < 6, it != map.end() && it->second.GetPicture()); | 578 EXPECT_EQ(i < 6 && j < 6, it != map.end() && it->second.GetPicture()); |
533 } | 579 } |
534 } | 580 } |
535 | 581 |
536 // No invalidation when shrinking. | 582 // No invalidation when shrinking. |
537 expected_invalidation.Clear(); | 583 expected_invalidation.Clear(); |
538 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 584 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
539 invalidation.Clear(); | 585 invalidation.Clear(); |
540 } | 586 } |
541 | 587 |
542 TEST_F(PicturePileTest, SmallResizePileOutsideInterestRect) { | 588 TEST_P(PicturePileResizeCornerTest, SmallResizePileOutsideInterestRect) { |
| 589 Corner corner = GetParam(); |
| 590 |
543 // This size chosen to be larger than the interest rect size, which is | 591 // This size chosen to be larger than the interest rect size, which is |
544 // at least kPixelDistanceToRecord * 2 in each dimension. | 592 // at least kPixelDistanceToRecord * 2 in each dimension. |
545 int tile_size = 100000; | 593 int tile_size = 100000; |
546 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); | 594 // The small number subtracted keeps the last tile in each axis larger than |
547 gfx::Size grow_down_tiling_size(5 * tile_size, 5 * tile_size + 5); | 595 // the interest rect also. |
548 gfx::Size grow_right_tiling_size(5 * tile_size + 5, 5 * tile_size); | 596 int offset = -100; |
549 gfx::Size grow_both_tiling_size(5 * tile_size + 5, 5 * tile_size + 5); | 597 gfx::Size base_tiling_size(6 * tile_size + offset, 6 * tile_size + offset); |
| 598 gfx::Size grow_down_tiling_size(6 * tile_size + offset, |
| 599 6 * tile_size + offset + 5); |
| 600 gfx::Size grow_right_tiling_size(6 * tile_size + offset + 5, |
| 601 6 * tile_size + offset); |
| 602 gfx::Size grow_both_tiling_size(6 * tile_size + offset + 5, |
| 603 6 * tile_size + offset + 5); |
550 | 604 |
551 Region invalidation; | 605 Region invalidation; |
552 Region expected_invalidation; | 606 Region expected_invalidation; |
553 | 607 |
554 pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); | 608 pile_->tiling().SetMaxTextureSize(gfx::Size(tile_size, tile_size)); |
555 SetTilingSize(base_tiling_size); | 609 SetTilingSize(base_tiling_size); |
556 | 610 |
557 // We should have a recording for every tile. | 611 // We should have a recording for every tile. |
558 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 612 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
559 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 613 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
560 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 614 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
561 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 615 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
562 TestPicturePile::PictureMapKey key(i, j); | 616 TestPicturePile::PictureMapKey key(i, j); |
563 TestPicturePile::PictureMap& map = pile_->picture_map(); | 617 TestPicturePile::PictureMap& map = pile_->picture_map(); |
564 TestPicturePile::PictureMap::iterator it = map.find(key); | 618 TestPicturePile::PictureMap::iterator it = map.find(key); |
565 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); | 619 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); |
566 } | 620 } |
567 } | 621 } |
568 | 622 |
569 UpdateAndExpandInvalidation( | 623 UpdateAndExpandInvalidation( |
570 &invalidation, grow_down_tiling_size, gfx::Rect(1, 1)); | 624 &invalidation, |
| 625 grow_down_tiling_size, |
| 626 CornerSinglePixelRect(corner, grow_down_tiling_size)); |
571 | 627 |
572 // We should have lost the recordings in the bottom row. | 628 // We should have lost the recordings in the bottom row that do not intersect |
| 629 // the interest rect. |
573 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 630 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
574 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 631 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
575 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 632 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
576 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 633 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
577 TestPicturePile::PictureMapKey key(i, j); | 634 TestPicturePile::PictureMapKey key(i, j); |
578 TestPicturePile::PictureMap& map = pile_->picture_map(); | 635 TestPicturePile::PictureMap& map = pile_->picture_map(); |
579 TestPicturePile::PictureMap::iterator it = map.find(key); | 636 TestPicturePile::PictureMap::iterator it = map.find(key); |
580 EXPECT_EQ(j < 5, it != map.end() && it->second.GetPicture()); | 637 bool expect_tile; |
| 638 switch (corner) { |
| 639 case TOP_LEFT: |
| 640 case TOP_RIGHT: |
| 641 expect_tile = j < 5; |
| 642 break; |
| 643 case BOTTOM_LEFT: |
| 644 // The interest rect in the bottom left tile means we'll record it. |
| 645 expect_tile = j < 5 || (j == 5 && i == 0); |
| 646 break; |
| 647 case BOTTOM_RIGHT: |
| 648 // The interest rect in the bottom right tile means we'll record it. |
| 649 expect_tile = j < 5 || (j == 5 && i == 5); |
| 650 break; |
| 651 } |
| 652 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()); |
581 } | 653 } |
582 } | 654 } |
583 | 655 |
584 // We invalidated the bottom row. | 656 // We invalidated the bottom row outside the new interest rect. The tile that |
585 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5), | 657 // insects the interest rect in invalidated only on its new pixels. |
586 pile_->tiling().TileBounds(5, 5)); | 658 switch (corner) { |
| 659 case TOP_LEFT: |
| 660 case TOP_RIGHT: |
| 661 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5), |
| 662 pile_->tiling().TileBounds(5, 5)); |
| 663 break; |
| 664 case BOTTOM_LEFT: |
| 665 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(1, 5), |
| 666 pile_->tiling().TileBounds(5, 5)); |
| 667 expected_invalidation.Union(SubtractRects( |
| 668 pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size))); |
| 669 break; |
| 670 case BOTTOM_RIGHT: |
| 671 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(0, 5), |
| 672 pile_->tiling().TileBounds(4, 5)); |
| 673 expected_invalidation.Union(SubtractRects( |
| 674 pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size))); |
| 675 break; |
| 676 } |
587 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 677 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
588 invalidation.Clear(); | 678 invalidation.Clear(); |
589 | 679 |
590 UpdateWholePile(); | 680 UpdateWholePile(); |
591 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); | 681 UpdateAndExpandInvalidation(&invalidation, |
| 682 base_tiling_size, |
| 683 CornerSinglePixelRect(corner, base_tiling_size)); |
592 | 684 |
593 // We should have lost nothing. | 685 // We should have lost nothing. |
594 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 686 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
595 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 687 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
596 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 688 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
597 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 689 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
598 TestPicturePile::PictureMapKey key(i, j); | 690 TestPicturePile::PictureMapKey key(i, j); |
599 TestPicturePile::PictureMap& map = pile_->picture_map(); | 691 TestPicturePile::PictureMap& map = pile_->picture_map(); |
600 TestPicturePile::PictureMap::iterator it = map.find(key); | 692 TestPicturePile::PictureMap::iterator it = map.find(key); |
601 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); | 693 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); |
602 } | 694 } |
603 } | 695 } |
604 | 696 |
605 // We invalidated nothing. | 697 // We invalidated nothing. |
606 expected_invalidation.Clear(); | 698 expected_invalidation.Clear(); |
607 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 699 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
608 invalidation.Clear(); | 700 invalidation.Clear(); |
609 | 701 |
610 UpdateWholePile(); | 702 UpdateWholePile(); |
611 UpdateAndExpandInvalidation( | 703 UpdateAndExpandInvalidation( |
612 &invalidation, grow_right_tiling_size, gfx::Rect(1, 1)); | 704 &invalidation, |
| 705 grow_right_tiling_size, |
| 706 CornerSinglePixelRect(corner, grow_right_tiling_size)); |
613 | 707 |
614 // We should have lost the recordings in the right column. | 708 // We should have lost the recordings in the right column. |
615 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 709 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
616 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 710 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
617 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 711 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
618 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 712 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
619 TestPicturePile::PictureMapKey key(i, j); | 713 TestPicturePile::PictureMapKey key(i, j); |
620 TestPicturePile::PictureMap& map = pile_->picture_map(); | 714 TestPicturePile::PictureMap& map = pile_->picture_map(); |
621 TestPicturePile::PictureMap::iterator it = map.find(key); | 715 TestPicturePile::PictureMap::iterator it = map.find(key); |
622 EXPECT_EQ(i < 5, it != map.end() && it->second.GetPicture()); | 716 bool expect_tile; |
| 717 switch (corner) { |
| 718 case TOP_LEFT: |
| 719 case BOTTOM_LEFT: |
| 720 expect_tile = i < 5; |
| 721 break; |
| 722 case TOP_RIGHT: |
| 723 // The interest rect in the top right tile means we'll record it. |
| 724 expect_tile = i < 5 || (j == 0 && i == 5); |
| 725 break; |
| 726 case BOTTOM_RIGHT: |
| 727 // The interest rect in the bottom right tile means we'll record it. |
| 728 expect_tile = i < 5 || (j == 5 && i == 5); |
| 729 break; |
| 730 } |
| 731 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()); |
623 } | 732 } |
624 } | 733 } |
625 | 734 |
626 // We invalidated the right column. | 735 // We invalidated the right column outside the new interest rect. The tile |
627 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), | 736 // that insects the interest rect in invalidated only on its new pixels. |
628 pile_->tiling().TileBounds(5, 5)); | 737 switch (corner) { |
| 738 case TOP_LEFT: |
| 739 case BOTTOM_LEFT: |
| 740 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
| 741 pile_->tiling().TileBounds(5, 5)); |
| 742 break; |
| 743 case TOP_RIGHT: |
| 744 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1), |
| 745 pile_->tiling().TileBounds(5, 5)); |
| 746 expected_invalidation.Union(SubtractRects( |
| 747 pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size))); |
| 748 break; |
| 749 case BOTTOM_RIGHT: |
| 750 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
| 751 pile_->tiling().TileBounds(5, 4)); |
| 752 expected_invalidation.Union(SubtractRects( |
| 753 pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size))); |
| 754 break; |
| 755 } |
629 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 756 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
630 invalidation.Clear(); | 757 invalidation.Clear(); |
631 | 758 |
632 UpdateWholePile(); | 759 UpdateWholePile(); |
633 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); | 760 UpdateAndExpandInvalidation(&invalidation, |
| 761 base_tiling_size, |
| 762 CornerSinglePixelRect(corner, base_tiling_size)); |
634 | 763 |
635 // We should have lost nothing. | 764 // We should have lost nothing. |
636 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 765 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
637 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 766 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
638 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 767 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
639 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 768 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
640 TestPicturePile::PictureMapKey key(i, j); | 769 TestPicturePile::PictureMapKey key(i, j); |
641 TestPicturePile::PictureMap& map = pile_->picture_map(); | 770 TestPicturePile::PictureMap& map = pile_->picture_map(); |
642 TestPicturePile::PictureMap::iterator it = map.find(key); | 771 TestPicturePile::PictureMap::iterator it = map.find(key); |
643 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); | 772 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); |
644 } | 773 } |
645 } | 774 } |
646 | 775 |
647 // We invalidated nothing. | 776 // We invalidated nothing. |
648 expected_invalidation.Clear(); | 777 expected_invalidation.Clear(); |
649 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 778 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
650 invalidation.Clear(); | 779 invalidation.Clear(); |
651 | 780 |
652 UpdateWholePile(); | 781 UpdateWholePile(); |
653 UpdateAndExpandInvalidation( | 782 UpdateAndExpandInvalidation( |
654 &invalidation, grow_both_tiling_size, gfx::Rect(1, 1)); | 783 &invalidation, |
| 784 grow_both_tiling_size, |
| 785 CornerSinglePixelRect(corner, grow_both_tiling_size)); |
655 | 786 |
656 // We should have lost the recordings in the right column and bottom row. | 787 // We should have lost the recordings in the right column and bottom row. The |
| 788 // tile that insects the interest rect in invalidated only on its new pixels. |
657 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 789 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
658 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 790 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
659 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 791 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
660 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 792 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
661 TestPicturePile::PictureMapKey key(i, j); | 793 TestPicturePile::PictureMapKey key(i, j); |
662 TestPicturePile::PictureMap& map = pile_->picture_map(); | 794 TestPicturePile::PictureMap& map = pile_->picture_map(); |
663 TestPicturePile::PictureMap::iterator it = map.find(key); | 795 TestPicturePile::PictureMap::iterator it = map.find(key); |
664 EXPECT_EQ(i < 5 && j < 5, it != map.end() && it->second.GetPicture()); | 796 bool expect_tile; |
| 797 switch (corner) { |
| 798 case TOP_LEFT: |
| 799 expect_tile = i < 5 && j < 5; |
| 800 break; |
| 801 case TOP_RIGHT: |
| 802 // The interest rect in the top right tile means we'll record it. |
| 803 expect_tile = (i < 5 && j < 5) || (j == 0 && i == 5); |
| 804 break; |
| 805 case BOTTOM_LEFT: |
| 806 // The interest rect in the bottom left tile means we'll record it. |
| 807 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 0); |
| 808 break; |
| 809 case BOTTOM_RIGHT: |
| 810 // The interest rect in the bottom right tile means we'll record it. |
| 811 expect_tile = (i < 5 && j < 5) || (j == 5 && i == 5); |
| 812 break; |
| 813 } |
| 814 EXPECT_EQ(expect_tile, it != map.end() && it->second.GetPicture()) |
| 815 << i << "," << j; |
665 } | 816 } |
666 } | 817 } |
667 | 818 |
668 // We invalidated the right column and the bottom row. | 819 // We invalidated the right column and the bottom row outside the new interest |
669 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), | 820 // rect. The tile that insects the interest rect in invalidated only on its |
670 pile_->tiling().TileBounds(5, 5)); | 821 // new pixels. |
671 expected_invalidation.Union(gfx::UnionRects( | 822 switch (corner) { |
672 pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5))); | 823 case TOP_LEFT: |
| 824 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
| 825 pile_->tiling().TileBounds(5, 5)); |
| 826 expected_invalidation.Union(gfx::UnionRects( |
| 827 pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5))); |
| 828 break; |
| 829 case TOP_RIGHT: |
| 830 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 1), |
| 831 pile_->tiling().TileBounds(5, 5)); |
| 832 expected_invalidation.Union(gfx::UnionRects( |
| 833 pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(5, 5))); |
| 834 expected_invalidation.Union(SubtractRects( |
| 835 pile_->tiling().TileBounds(5, 0), gfx::Rect(base_tiling_size))); |
| 836 break; |
| 837 case BOTTOM_LEFT: |
| 838 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
| 839 pile_->tiling().TileBounds(5, 5)); |
| 840 expected_invalidation.Union(gfx::UnionRects( |
| 841 pile_->tiling().TileBounds(1, 5), pile_->tiling().TileBounds(5, 5))); |
| 842 expected_invalidation.Union(SubtractRects( |
| 843 pile_->tiling().TileBounds(0, 5), gfx::Rect(base_tiling_size))); |
| 844 break; |
| 845 case BOTTOM_RIGHT: |
| 846 expected_invalidation = gfx::UnionRects(pile_->tiling().TileBounds(5, 0), |
| 847 pile_->tiling().TileBounds(5, 4)); |
| 848 expected_invalidation.Union(gfx::UnionRects( |
| 849 pile_->tiling().TileBounds(0, 5), pile_->tiling().TileBounds(4, 5))); |
| 850 expected_invalidation.Union(SubtractRegions( |
| 851 pile_->tiling().TileBounds(5, 5), gfx::Rect(base_tiling_size))); |
| 852 break; |
| 853 } |
673 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 854 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
674 invalidation.Clear(); | 855 invalidation.Clear(); |
675 | 856 |
676 UpdateWholePile(); | 857 UpdateWholePile(); |
677 UpdateAndExpandInvalidation(&invalidation, base_tiling_size, gfx::Rect(1, 1)); | 858 UpdateAndExpandInvalidation(&invalidation, |
| 859 base_tiling_size, |
| 860 CornerSinglePixelRect(corner, base_tiling_size)); |
678 | 861 |
679 // We should have lost nothing. | 862 // We should have lost nothing. |
680 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); | 863 EXPECT_EQ(6, pile_->tiling().num_tiles_x()); |
681 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); | 864 EXPECT_EQ(6, pile_->tiling().num_tiles_y()); |
682 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { | 865 for (int i = 0; i < pile_->tiling().num_tiles_x(); ++i) { |
683 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { | 866 for (int j = 0; j < pile_->tiling().num_tiles_y(); ++j) { |
684 TestPicturePile::PictureMapKey key(i, j); | 867 TestPicturePile::PictureMapKey key(i, j); |
685 TestPicturePile::PictureMap& map = pile_->picture_map(); | 868 TestPicturePile::PictureMap& map = pile_->picture_map(); |
686 TestPicturePile::PictureMap::iterator it = map.find(key); | 869 TestPicturePile::PictureMap::iterator it = map.find(key); |
687 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); | 870 EXPECT_TRUE(it != map.end() && it->second.GetPicture()); |
688 } | 871 } |
689 } | 872 } |
690 | 873 |
691 // We invalidated nothing. | 874 // We invalidated nothing. |
692 expected_invalidation.Clear(); | 875 expected_invalidation.Clear(); |
693 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); | 876 EXPECT_EQ(expected_invalidation.ToString(), invalidation.ToString()); |
694 invalidation.Clear(); | 877 invalidation.Clear(); |
695 } | 878 } |
696 | 879 |
| 880 INSTANTIATE_TEST_CASE_P( |
| 881 PicturePileResizeCornerTests, |
| 882 PicturePileResizeCornerTest, |
| 883 ::testing::Values(TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT)); |
| 884 |
697 TEST_F(PicturePileTest, ResizePileInsideInterestRect) { | 885 TEST_F(PicturePileTest, ResizePileInsideInterestRect) { |
698 // This size chosen to be small enough that all the rects below fit inside the | 886 // This size chosen to be small enough that all the rects below fit inside the |
699 // the interest rect, so they are smaller than kPixelDistanceToRecord in each | 887 // the interest rect, so they are smaller than kPixelDistanceToRecord in each |
700 // dimension. | 888 // dimension. |
701 int tile_size = 100; | 889 int tile_size = 100; |
702 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); | 890 gfx::Size base_tiling_size(5 * tile_size, 5 * tile_size); |
703 gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size); | 891 gfx::Size grow_down_tiling_size(5 * tile_size, 7 * tile_size); |
704 gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size); | 892 gfx::Size grow_right_tiling_size(7 * tile_size, 5 * tile_size); |
705 gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size); | 893 gfx::Size grow_both_tiling_size(7 * tile_size, 7 * tile_size); |
706 | 894 |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 } | 1186 } |
999 } | 1187 } |
1000 | 1188 |
1001 // No invalidation when shrinking. | 1189 // No invalidation when shrinking. |
1002 EXPECT_EQ(Region().ToString(), invalidation.ToString()); | 1190 EXPECT_EQ(Region().ToString(), invalidation.ToString()); |
1003 invalidation.Clear(); | 1191 invalidation.Clear(); |
1004 } | 1192 } |
1005 | 1193 |
1006 } // namespace | 1194 } // namespace |
1007 } // namespace cc | 1195 } // namespace cc |
OLD | NEW |