| 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 |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "cc/base/region.h" | 13 #include "cc/base/region.h" |
| 14 #include "cc/paint/paint_canvas.h" |
| 14 #include "cc/test/fake_content_layer_client.h" | 15 #include "cc/test/fake_content_layer_client.h" |
| 15 #include "cc/test/fake_recording_source.h" | 16 #include "cc/test/fake_recording_source.h" |
| 16 #include "cc/test/skia_common.h" | 17 #include "cc/test/skia_common.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "third_party/skia/include/core/SkCanvas.h" | |
| 19 #include "third_party/skia/include/core/SkGraphics.h" | 19 #include "third_party/skia/include/core/SkGraphics.h" |
| 20 #include "third_party/skia/include/core/SkImageGenerator.h" | 20 #include "third_party/skia/include/core/SkImageGenerator.h" |
| 21 #include "third_party/skia/include/core/SkRefCnt.h" | 21 #include "third_party/skia/include/core/SkRefCnt.h" |
| 22 #include "ui/gfx/geometry/rect.h" | 22 #include "ui/gfx/geometry/rect.h" |
| 23 #include "ui/gfx/skia_util.h" | 23 #include "ui/gfx/skia_util.h" |
| 24 | 24 |
| 25 namespace cc { | 25 namespace cc { |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 struct PositionScaleDrawImage { | 28 struct PositionScaleDrawImage { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 // |---|---|---|---| | 75 // |---|---|---|---| |
| 76 // | | x | | x | | 76 // | | x | | x | |
| 77 // |---|---|---|---| | 77 // |---|---|---|---| |
| 78 // | x | | x | | | 78 // | x | | x | | |
| 79 // |---|---|---|---| | 79 // |---|---|---|---| |
| 80 sk_sp<SkImage> discardable_image[4][4]; | 80 sk_sp<SkImage> discardable_image[4][4]; |
| 81 for (int y = 0; y < 4; ++y) { | 81 for (int y = 0; y < 4; ++y) { |
| 82 for (int x = 0; x < 4; ++x) { | 82 for (int x = 0; x < 4; ++x) { |
| 83 if ((x + y) & 1) { | 83 if ((x + y) & 1) { |
| 84 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); | 84 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); |
| 85 SkPaint paint; | 85 PaintFlags paint; |
| 86 content_layer_client.add_draw_image( | 86 content_layer_client.add_draw_image( |
| 87 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), | 87 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), |
| 88 paint); | 88 paint); |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 | 92 |
| 93 scoped_refptr<DisplayItemList> display_list = | 93 scoped_refptr<DisplayItemList> display_list = |
| 94 content_layer_client.PaintContentsToDisplayList( | 94 content_layer_client.PaintContentsToDisplayList( |
| 95 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 95 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 // |---|---|---|---| | 148 // |---|---|---|---| |
| 149 // | | x | | x | | 149 // | | x | | x | |
| 150 // |---|---|---|---| | 150 // |---|---|---|---| |
| 151 // | x | | x | | | 151 // | x | | x | | |
| 152 // |---|---|---|---| | 152 // |---|---|---|---| |
| 153 sk_sp<SkImage> discardable_image[4][4]; | 153 sk_sp<SkImage> discardable_image[4][4]; |
| 154 for (int y = 0; y < 4; ++y) { | 154 for (int y = 0; y < 4; ++y) { |
| 155 for (int x = 0; x < 4; ++x) { | 155 for (int x = 0; x < 4; ++x) { |
| 156 if ((x + y) & 1) { | 156 if ((x + y) & 1) { |
| 157 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); | 157 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); |
| 158 SkPaint paint; | 158 PaintFlags paint; |
| 159 content_layer_client.add_draw_image( | 159 content_layer_client.add_draw_image( |
| 160 discardable_image[y][x], | 160 discardable_image[y][x], |
| 161 gfx::Point(1024 + x * 512 + 6, y * 512 + 6), paint); | 161 gfx::Point(1024 + x * 512 + 6, y * 512 + 6), paint); |
| 162 } | 162 } |
| 163 } | 163 } |
| 164 } | 164 } |
| 165 | 165 |
| 166 scoped_refptr<DisplayItemList> display_list = | 166 scoped_refptr<DisplayItemList> display_list = |
| 167 content_layer_client.PaintContentsToDisplayList( | 167 content_layer_client.PaintContentsToDisplayList( |
| 168 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 168 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 // |---|---|---|---| | 244 // |---|---|---|---| |
| 245 // | | x | | x | | 245 // | | x | | x | |
| 246 // |---|---|---|---| | 246 // |---|---|---|---| |
| 247 // | x | | x | | | 247 // | x | | x | | |
| 248 // |---|---|---|---| | 248 // |---|---|---|---| |
| 249 sk_sp<SkImage> discardable_image[4][4]; | 249 sk_sp<SkImage> discardable_image[4][4]; |
| 250 for (int y = 0; y < 4; ++y) { | 250 for (int y = 0; y < 4; ++y) { |
| 251 for (int x = 0; x < 4; ++x) { | 251 for (int x = 0; x < 4; ++x) { |
| 252 if ((x + y) & 1) { | 252 if ((x + y) & 1) { |
| 253 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); | 253 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); |
| 254 SkPaint paint; | 254 PaintFlags paint; |
| 255 content_layer_client.add_draw_image( | 255 content_layer_client.add_draw_image( |
| 256 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), | 256 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), |
| 257 paint); | 257 paint); |
| 258 } | 258 } |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 | 261 |
| 262 scoped_refptr<DisplayItemList> display_list = | 262 scoped_refptr<DisplayItemList> display_list = |
| 263 content_layer_client.PaintContentsToDisplayList( | 263 content_layer_client.PaintContentsToDisplayList( |
| 264 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 264 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 | 289 |
| 290 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMassiveImage) { | 290 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMassiveImage) { |
| 291 gfx::Rect visible_rect(2048, 2048); | 291 gfx::Rect visible_rect(2048, 2048); |
| 292 FakeContentLayerClient content_layer_client; | 292 FakeContentLayerClient content_layer_client; |
| 293 content_layer_client.set_bounds(visible_rect.size()); | 293 content_layer_client.set_bounds(visible_rect.size()); |
| 294 | 294 |
| 295 sk_sp<SkImage> discardable_image = | 295 sk_sp<SkImage> discardable_image = |
| 296 CreateDiscardableImage(gfx::Size(1 << 25, 1 << 25)); | 296 CreateDiscardableImage(gfx::Size(1 << 25, 1 << 25)); |
| 297 SkPaint paint; | 297 PaintFlags paint; |
| 298 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), | 298 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), |
| 299 paint); | 299 paint); |
| 300 | 300 |
| 301 scoped_refptr<DisplayItemList> display_list = | 301 scoped_refptr<DisplayItemList> display_list = |
| 302 content_layer_client.PaintContentsToDisplayList( | 302 content_layer_client.PaintContentsToDisplayList( |
| 303 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 303 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 304 | 304 |
| 305 DiscardableImageMap image_map; | 305 DiscardableImageMap image_map; |
| 306 { | 306 { |
| 307 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 307 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 320 FakeContentLayerClient content_layer_client; | 320 FakeContentLayerClient content_layer_client; |
| 321 content_layer_client.set_bounds(visible_rect.size()); | 321 content_layer_client.set_bounds(visible_rect.size()); |
| 322 | 322 |
| 323 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); | 323 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); |
| 324 | 324 |
| 325 DiscardableImageMap image_map; | 325 DiscardableImageMap image_map; |
| 326 { | 326 { |
| 327 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 327 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 328 visible_rect.size()); | 328 visible_rect.size()); |
| 329 { | 329 { |
| 330 std::unique_ptr<SkPaint> paint(new SkPaint()); | 330 std::unique_ptr<PaintFlags> paint(new PaintFlags()); |
| 331 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), | 331 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), |
| 332 paint.get()); | 332 paint.get()); |
| 333 } | 333 } |
| 334 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); | 334 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); |
| 335 generator.canvas()->restore(); | 335 generator.canvas()->restore(); |
| 336 } | 336 } |
| 337 | 337 |
| 338 std::vector<PositionScaleDrawImage> images = | 338 std::vector<PositionScaleDrawImage> images = |
| 339 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 339 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 340 EXPECT_EQ(1u, images.size()); | 340 EXPECT_EQ(1u, images.size()); |
| 341 EXPECT_TRUE(images[0].image == discardable_image); | 341 EXPECT_TRUE(images[0].image == discardable_image); |
| 342 } | 342 } |
| 343 | 343 |
| 344 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) { | 344 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) { |
| 345 gfx::Rect visible_rect(2048, 2048); | 345 gfx::Rect visible_rect(2048, 2048); |
| 346 FakeContentLayerClient content_layer_client; | 346 FakeContentLayerClient content_layer_client; |
| 347 content_layer_client.set_bounds(visible_rect.size()); | 347 content_layer_client.set_bounds(visible_rect.size()); |
| 348 | 348 |
| 349 int dimension = std::numeric_limits<int>::max(); | 349 int dimension = std::numeric_limits<int>::max(); |
| 350 sk_sp<SkImage> discardable_image = | 350 sk_sp<SkImage> discardable_image = |
| 351 CreateDiscardableImage(gfx::Size(dimension, dimension)); | 351 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 352 SkPaint paint; | 352 PaintFlags paint; |
| 353 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42), | 353 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42), |
| 354 paint); | 354 paint); |
| 355 | 355 |
| 356 scoped_refptr<DisplayItemList> display_list = | 356 scoped_refptr<DisplayItemList> display_list = |
| 357 content_layer_client.PaintContentsToDisplayList( | 357 content_layer_client.PaintContentsToDisplayList( |
| 358 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 358 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 359 | 359 |
| 360 DiscardableImageMap image_map; | 360 DiscardableImageMap image_map; |
| 361 { | 361 { |
| 362 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 362 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 377 // some draw calls, so we subtract 64 since we only care about "really large" | 377 // some draw calls, so we subtract 64 since we only care about "really large" |
| 378 // values, not necessarily max int values. | 378 // values, not necessarily max int values. |
| 379 int dimension = static_cast<int>( | 379 int dimension = static_cast<int>( |
| 380 static_cast<float>(std::numeric_limits<int>::max() - 64)); | 380 static_cast<float>(std::numeric_limits<int>::max() - 64)); |
| 381 gfx::Rect visible_rect(dimension, dimension); | 381 gfx::Rect visible_rect(dimension, dimension); |
| 382 FakeContentLayerClient content_layer_client; | 382 FakeContentLayerClient content_layer_client; |
| 383 content_layer_client.set_bounds(visible_rect.size()); | 383 content_layer_client.set_bounds(visible_rect.size()); |
| 384 | 384 |
| 385 sk_sp<SkImage> discardable_image = | 385 sk_sp<SkImage> discardable_image = |
| 386 CreateDiscardableImage(gfx::Size(dimension, dimension)); | 386 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 387 SkPaint paint; | 387 PaintFlags paint; |
| 388 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), | 388 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), |
| 389 paint); | 389 paint); |
| 390 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0), | 390 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0), |
| 391 paint); | 391 paint); |
| 392 content_layer_client.add_draw_image(discardable_image, | 392 content_layer_client.add_draw_image(discardable_image, |
| 393 gfx::Point(-10000, 500), paint); | 393 gfx::Point(-10000, 500), paint); |
| 394 | 394 |
| 395 scoped_refptr<DisplayItemList> display_list = | 395 scoped_refptr<DisplayItemList> display_list = |
| 396 content_layer_client.PaintContentsToDisplayList( | 396 content_layer_client.PaintContentsToDisplayList( |
| 397 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 397 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 428 TEST_F(DiscardableImageMapTest, GetDiscardableImagesRectInBounds) { | 428 TEST_F(DiscardableImageMapTest, GetDiscardableImagesRectInBounds) { |
| 429 gfx::Rect visible_rect(1000, 1000); | 429 gfx::Rect visible_rect(1000, 1000); |
| 430 FakeContentLayerClient content_layer_client; | 430 FakeContentLayerClient content_layer_client; |
| 431 content_layer_client.set_bounds(visible_rect.size()); | 431 content_layer_client.set_bounds(visible_rect.size()); |
| 432 | 432 |
| 433 sk_sp<SkImage> discardable_image = | 433 sk_sp<SkImage> discardable_image = |
| 434 CreateDiscardableImage(gfx::Size(100, 100)); | 434 CreateDiscardableImage(gfx::Size(100, 100)); |
| 435 sk_sp<SkImage> long_discardable_image = | 435 sk_sp<SkImage> long_discardable_image = |
| 436 CreateDiscardableImage(gfx::Size(10000, 100)); | 436 CreateDiscardableImage(gfx::Size(10000, 100)); |
| 437 | 437 |
| 438 SkPaint paint; | 438 PaintFlags paint; |
| 439 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11), | 439 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11), |
| 440 paint); | 440 paint); |
| 441 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951), | 441 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951), |
| 442 paint); | 442 paint); |
| 443 content_layer_client.add_draw_image(long_discardable_image, | 443 content_layer_client.add_draw_image(long_discardable_image, |
| 444 gfx::Point(-100, 500), paint); | 444 gfx::Point(-100, 500), paint); |
| 445 | 445 |
| 446 scoped_refptr<DisplayItemList> display_list = | 446 scoped_refptr<DisplayItemList> display_list = |
| 447 content_layer_client.PaintContentsToDisplayList( | 447 content_layer_client.PaintContentsToDisplayList( |
| 448 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 448 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 // | | x | | x | | 481 // | | x | | x | |
| 482 // |---|---|---|---| | 482 // |---|---|---|---| |
| 483 // | x | | x | | | 483 // | x | | x | | |
| 484 // |---|---|---|---| | 484 // |---|---|---|---| |
| 485 sk_sp<SkImage> discardable_image[4][4]; | 485 sk_sp<SkImage> discardable_image[4][4]; |
| 486 for (int y = 0; y < 4; ++y) { | 486 for (int y = 0; y < 4; ++y) { |
| 487 for (int x = 0; x < 4; ++x) { | 487 for (int x = 0; x < 4; ++x) { |
| 488 if ((x + y) & 1) { | 488 if ((x + y) & 1) { |
| 489 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); | 489 discardable_image[y][x] = CreateDiscardableImage(gfx::Size(500, 500)); |
| 490 SkMatrix scale = SkMatrix::MakeScale(x * 0.5f, y * 0.5f); | 490 SkMatrix scale = SkMatrix::MakeScale(x * 0.5f, y * 0.5f); |
| 491 SkPaint paint; | 491 PaintFlags paint; |
| 492 paint.setShader(discardable_image[y][x]->makeShader( | 492 paint.setShader(discardable_image[y][x]->makeShader( |
| 493 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &scale)); | 493 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &scale)); |
| 494 content_layer_client.add_draw_rect( | 494 content_layer_client.add_draw_rect( |
| 495 gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500), paint); | 495 gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500), paint); |
| 496 } | 496 } |
| 497 } | 497 } |
| 498 } | 498 } |
| 499 | 499 |
| 500 scoped_refptr<DisplayItemList> display_list = | 500 scoped_refptr<DisplayItemList> display_list = |
| 501 content_layer_client.PaintContentsToDisplayList( | 501 content_layer_client.PaintContentsToDisplayList( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), images[1].image_rect); | 536 EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), images[1].image_rect); |
| 537 EXPECT_TRUE(images[2].image == discardable_image[2][3]); | 537 EXPECT_TRUE(images[2].image == discardable_image[2][3]); |
| 538 EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), | 538 EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), |
| 539 images[2].image_rect); | 539 images[2].image_rect); |
| 540 EXPECT_TRUE(images[3].image == discardable_image[3][2]); | 540 EXPECT_TRUE(images[3].image == discardable_image[3][2]); |
| 541 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), | 541 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), |
| 542 images[3].image_rect); | 542 images[3].image_rect); |
| 543 } | 543 } |
| 544 | 544 |
| 545 } // namespace cc | 545 } // namespace cc |
| OLD | NEW |