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