| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/playback/discardable_image_map.h" | 5 #include "cc/playback/discardable_image_map.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 DiscardableImageMap image_map; | 301 DiscardableImageMap image_map; |
| 302 { | 302 { |
| 303 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 303 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 304 visible_rect.size()); | 304 visible_rect.size()); |
| 305 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); | 305 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); |
| 306 } | 306 } |
| 307 std::vector<PositionDrawImage> images = | 307 std::vector<PositionDrawImage> images = |
| 308 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 308 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 309 EXPECT_EQ(1u, images.size()); | 309 EXPECT_EQ(1u, images.size()); |
| 310 EXPECT_TRUE(images[0].image == discardable_image); | 310 EXPECT_TRUE(images[0].image == discardable_image); |
| 311 EXPECT_EQ(gfx::Rect(0, 0, 1 << 25, 1 << 25), images[0].image_rect); | 311 EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), images[0].image_rect); |
| 312 } | 312 } |
| 313 | 313 |
| 314 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) { | 314 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) { |
| 315 gfx::Rect visible_rect(2048, 2048); | 315 gfx::Rect visible_rect(2048, 2048); |
| 316 FakeContentLayerClient content_layer_client; | 316 FakeContentLayerClient content_layer_client; |
| 317 content_layer_client.set_bounds(visible_rect.size()); | 317 content_layer_client.set_bounds(visible_rect.size()); |
| 318 | 318 |
| 319 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); | 319 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); |
| 320 | 320 |
| 321 DiscardableImageMap image_map; | 321 DiscardableImageMap image_map; |
| 322 { | 322 { |
| 323 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 323 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 324 visible_rect.size()); | 324 visible_rect.size()); |
| 325 { | 325 { |
| 326 std::unique_ptr<SkPaint> paint(new SkPaint()); | 326 std::unique_ptr<SkPaint> paint(new SkPaint()); |
| 327 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), | 327 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), |
| 328 paint.get()); | 328 paint.get()); |
| 329 } | 329 } |
| 330 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); | 330 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); |
| 331 generator.canvas()->restore(); | 331 generator.canvas()->restore(); |
| 332 } | 332 } |
| 333 | 333 |
| 334 std::vector<PositionDrawImage> images = | 334 std::vector<PositionDrawImage> images = |
| 335 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 335 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 336 EXPECT_EQ(1u, images.size()); | 336 EXPECT_EQ(1u, images.size()); |
| 337 EXPECT_TRUE(images[0].image == discardable_image); | 337 EXPECT_TRUE(images[0].image == discardable_image); |
| 338 } | 338 } |
| 339 | 339 |
| 340 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) { |
| 341 gfx::Rect visible_rect(2048, 2048); |
| 342 FakeContentLayerClient content_layer_client; |
| 343 content_layer_client.set_bounds(visible_rect.size()); |
| 344 |
| 345 int dimension = std::numeric_limits<int>::max(); |
| 346 sk_sp<SkImage> discardable_image = |
| 347 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 348 SkPaint paint; |
| 349 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42), |
| 350 paint); |
| 351 |
| 352 scoped_refptr<DisplayItemList> display_list = |
| 353 content_layer_client.PaintContentsToDisplayList( |
| 354 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 355 |
| 356 DiscardableImageMap image_map; |
| 357 { |
| 358 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 359 visible_rect.size()); |
| 360 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); |
| 361 } |
| 362 std::vector<PositionDrawImage> images = |
| 363 GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1)); |
| 364 EXPECT_EQ(1u, images.size()); |
| 365 EXPECT_TRUE(images[0].image == discardable_image); |
| 366 EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), images[0].image_rect); |
| 367 } |
| 368 |
| 369 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImageMaxLayer) { |
| 370 // At large values of integer x, x != static_cast<int>(static_cast<float>(x)). |
| 371 // So, make sure the dimension can be converted back and forth for the |
| 372 // purposes of the unittest. Also, at near max int values, Skia seems to skip |
| 373 // some draw calls, so we subtract 64 since we only care about "really large" |
| 374 // values, not necessarily max int values. |
| 375 int dimension = static_cast<int>( |
| 376 static_cast<float>(std::numeric_limits<int>::max() - 64)); |
| 377 gfx::Rect visible_rect(dimension, dimension); |
| 378 FakeContentLayerClient content_layer_client; |
| 379 content_layer_client.set_bounds(visible_rect.size()); |
| 380 |
| 381 sk_sp<SkImage> discardable_image = |
| 382 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 383 SkPaint paint; |
| 384 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), |
| 385 paint); |
| 386 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0), |
| 387 paint); |
| 388 content_layer_client.add_draw_image(discardable_image, |
| 389 gfx::Point(-10000, 500), paint); |
| 390 |
| 391 scoped_refptr<DisplayItemList> display_list = |
| 392 content_layer_client.PaintContentsToDisplayList( |
| 393 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 394 |
| 395 DiscardableImageMap image_map; |
| 396 { |
| 397 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 398 visible_rect.size()); |
| 399 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); |
| 400 } |
| 401 std::vector<PositionDrawImage> images = |
| 402 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 403 EXPECT_EQ(1u, images.size()); |
| 404 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect); |
| 405 |
| 406 images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1)); |
| 407 EXPECT_EQ(2u, images.size()); |
| 408 int expected10k = static_cast<int>(static_cast<float>(dimension - 10000)); |
| 409 int expected500 = static_cast<int>(static_cast<float>(dimension - 500)); |
| 410 EXPECT_EQ(gfx::Rect(10000, 0, expected10k, dimension), images[1].image_rect); |
| 411 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect); |
| 412 |
| 413 images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1)); |
| 414 EXPECT_EQ(2u, images.size()); |
| 415 EXPECT_EQ(gfx::Rect(0, 500, expected10k, expected500), images[1].image_rect); |
| 416 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), images[0].image_rect); |
| 417 } |
| 418 |
| 419 TEST_F(DiscardableImageMapTest, GetDiscardableImagesRectInBounds) { |
| 420 gfx::Rect visible_rect(1000, 1000); |
| 421 FakeContentLayerClient content_layer_client; |
| 422 content_layer_client.set_bounds(visible_rect.size()); |
| 423 |
| 424 sk_sp<SkImage> discardable_image = |
| 425 CreateDiscardableImage(gfx::Size(100, 100)); |
| 426 sk_sp<SkImage> long_discardable_image = |
| 427 CreateDiscardableImage(gfx::Size(10000, 100)); |
| 428 |
| 429 SkPaint paint; |
| 430 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11), |
| 431 paint); |
| 432 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951), |
| 433 paint); |
| 434 content_layer_client.add_draw_image(long_discardable_image, |
| 435 gfx::Point(-100, 500), paint); |
| 436 |
| 437 scoped_refptr<DisplayItemList> display_list = |
| 438 content_layer_client.PaintContentsToDisplayList( |
| 439 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 440 |
| 441 DiscardableImageMap image_map; |
| 442 { |
| 443 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 444 visible_rect.size()); |
| 445 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); |
| 446 } |
| 447 std::vector<PositionDrawImage> images = |
| 448 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 449 EXPECT_EQ(1u, images.size()); |
| 450 EXPECT_EQ(gfx::Rect(0, 0, 90, 89), images[0].image_rect); |
| 451 |
| 452 images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1)); |
| 453 EXPECT_EQ(1u, images.size()); |
| 454 EXPECT_EQ(gfx::Rect(950, 951, 50, 49), images[0].image_rect); |
| 455 |
| 456 images = GetDiscardableImagesInRect(image_map, gfx::Rect(0, 500, 1, 1)); |
| 457 EXPECT_EQ(1u, images.size()); |
| 458 EXPECT_EQ(gfx::Rect(0, 500, 1000, 100), images[0].image_rect); |
| 459 } |
| 460 |
| 340 } // namespace cc | 461 } // namespace cc |
| OLD | NEW |