| 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/paint/discardable_image_map.h" | 5 #include "cc/paint/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/clip_display_item.h" |
| 15 #include "cc/paint/discardable_image_store.h" |
| 16 #include "cc/paint/paint_flags.h" |
| 17 #include "cc/paint/paint_recorder.h" |
| 14 #include "cc/test/fake_content_layer_client.h" | 18 #include "cc/test/fake_content_layer_client.h" |
| 15 #include "cc/test/fake_recording_source.h" | 19 #include "cc/test/fake_recording_source.h" |
| 16 #include "cc/test/skia_common.h" | 20 #include "cc/test/skia_common.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "third_party/skia/include/core/SkCanvas.h" | 22 #include "third_party/skia/include/core/SkCanvas.h" |
| 19 #include "third_party/skia/include/core/SkGraphics.h" | 23 #include "third_party/skia/include/core/SkGraphics.h" |
| 20 #include "third_party/skia/include/core/SkImageGenerator.h" | 24 #include "third_party/skia/include/core/SkImageGenerator.h" |
| 21 #include "third_party/skia/include/core/SkRefCnt.h" | 25 #include "third_party/skia/include/core/SkRefCnt.h" |
| 22 #include "ui/gfx/geometry/rect.h" | 26 #include "ui/gfx/geometry/rect.h" |
| 23 #include "ui/gfx/skia_util.h" | 27 #include "ui/gfx/skia_util.h" |
| 24 | 28 |
| 25 namespace cc { | 29 namespace cc { |
| 26 namespace { | 30 namespace { |
| 27 | 31 |
| 28 struct PositionScaleDrawImage { | 32 struct PositionScaleDrawImage { |
| 29 PositionScaleDrawImage(sk_sp<const SkImage> image, | 33 PositionScaleDrawImage(sk_sp<const SkImage> image, |
| 30 const gfx::Rect& image_rect, | 34 const gfx::Rect& image_rect, |
| 31 const SkSize& scale) | 35 const SkSize& scale) |
| 32 : image(std::move(image)), image_rect(image_rect), scale(scale) {} | 36 : image(std::move(image)), image_rect(image_rect), scale(scale) {} |
| 33 sk_sp<const SkImage> image; | 37 sk_sp<const SkImage> image; |
| 34 gfx::Rect image_rect; | 38 gfx::Rect image_rect; |
| 35 SkSize scale; | 39 SkSize scale; |
| 36 }; | 40 }; |
| 37 | 41 |
| 42 sk_sp<PaintRecord> CreateRecording( |
| 43 const sk_sp<const SkImage>& discardable_image, |
| 44 const gfx::Rect& visible_rect) { |
| 45 PaintRecorder recorder; |
| 46 PaintCanvas* canvas = |
| 47 recorder.beginRecording(visible_rect.width(), visible_rect.height()); |
| 48 canvas->drawImage( |
| 49 PaintImage(discardable_image, PaintImage::AnimationType::STATIC, |
| 50 PaintImage::CompletionState::DONE), |
| 51 0, 0, nullptr); |
| 52 sk_sp<PaintRecord> record = recorder.finishRecordingAsPicture(); |
| 53 return record; |
| 54 } |
| 55 |
| 38 } // namespace | 56 } // namespace |
| 39 | 57 |
| 40 class DiscardableImageMapTest : public testing::Test { | 58 class DiscardableImageMapTest : public testing::Test { |
| 41 public: | 59 public: |
| 42 std::vector<PositionScaleDrawImage> GetDiscardableImagesInRect( | 60 std::vector<PositionScaleDrawImage> GetDiscardableImagesInRect( |
| 43 const DiscardableImageMap& image_map, | 61 const DiscardableImageMap& image_map, |
| 44 const gfx::Rect& rect) { | 62 const gfx::Rect& rect) { |
| 45 std::vector<DrawImage> draw_images; | 63 std::vector<DrawImage> draw_images; |
| 46 // Choose a not-SRGB-and-not-invalid target color space to verify that it | 64 // Choose a not-SRGB-and-not-invalid target color space to verify that it |
| 47 // is passed correctly to the resulting DrawImages. | 65 // is passed correctly to the resulting DrawImages. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 content_layer_client.add_draw_image( | 122 content_layer_client.add_draw_image( |
| 105 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), | 123 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), |
| 106 flags); | 124 flags); |
| 107 } | 125 } |
| 108 } | 126 } |
| 109 } | 127 } |
| 110 | 128 |
| 111 scoped_refptr<DisplayItemList> display_list = | 129 scoped_refptr<DisplayItemList> display_list = |
| 112 content_layer_client.PaintContentsToDisplayList( | 130 content_layer_client.PaintContentsToDisplayList( |
| 113 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 131 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 132 display_list->GenerateDiscardableImagesMetadata(); |
| 114 | 133 |
| 115 DiscardableImageMap image_map; | 134 const DiscardableImageMap& image_map = |
| 116 { | 135 display_list->discardable_image_map_for_testing(); |
| 117 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 118 visible_rect.size()); | |
| 119 display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f); | |
| 120 } | |
| 121 | 136 |
| 122 for (int y = 0; y < 4; ++y) { | 137 for (int y = 0; y < 4; ++y) { |
| 123 for (int x = 0; x < 4; ++x) { | 138 for (int x = 0; x < 4; ++x) { |
| 124 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( | 139 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( |
| 125 image_map, gfx::Rect(x * 512, y * 512, 500, 500)); | 140 image_map, gfx::Rect(x * 512, y * 512, 500, 500)); |
| 126 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 141 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 127 if ((x + y) & 1) { | 142 if ((x + y) & 1) { |
| 128 EXPECT_EQ(1u, images.size()) << x << " " << y; | 143 EXPECT_EQ(1u, images.size()) << x << " " << y; |
| 129 EXPECT_TRUE(images[0].image == discardable_image[y][x]) | 144 EXPECT_TRUE(images[0].image == discardable_image[y][x]) |
| 130 << x << " " << y; | 145 << x << " " << y; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 content_layer_client.add_draw_image( | 206 content_layer_client.add_draw_image( |
| 192 discardable_image[y][x], | 207 discardable_image[y][x], |
| 193 gfx::Point(1024 + x * 512 + 6, y * 512 + 6), flags); | 208 gfx::Point(1024 + x * 512 + 6, y * 512 + 6), flags); |
| 194 } | 209 } |
| 195 } | 210 } |
| 196 } | 211 } |
| 197 | 212 |
| 198 scoped_refptr<DisplayItemList> display_list = | 213 scoped_refptr<DisplayItemList> display_list = |
| 199 content_layer_client.PaintContentsToDisplayList( | 214 content_layer_client.PaintContentsToDisplayList( |
| 200 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 215 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 216 display_list->GenerateDiscardableImagesMetadata(); |
| 201 | 217 |
| 202 DiscardableImageMap image_map; | 218 const DiscardableImageMap& image_map = |
| 203 { | 219 display_list->discardable_image_map_for_testing(); |
| 204 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 205 layer_size); | |
| 206 display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f); | |
| 207 } | |
| 208 | 220 |
| 209 for (int y = 0; y < 4; ++y) { | 221 for (int y = 0; y < 4; ++y) { |
| 210 for (int x = 0; x < 4; ++x) { | 222 for (int x = 0; x < 4; ++x) { |
| 211 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( | 223 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( |
| 212 image_map, gfx::Rect(1024 + x * 512, y * 512, 500, 500)); | 224 image_map, gfx::Rect(1024 + x * 512, y * 512, 500, 500)); |
| 213 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 225 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 214 if ((x + y) & 1) { | 226 if ((x + y) & 1) { |
| 215 EXPECT_EQ(1u, images.size()) << x << " " << y; | 227 EXPECT_EQ(1u, images.size()) << x << " " << y; |
| 216 EXPECT_TRUE(images[0].image == discardable_image[y][x]) | 228 EXPECT_TRUE(images[0].image == discardable_image[y][x]) |
| 217 << x << " " << y; | 229 << x << " " << y; |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 content_layer_client.add_draw_image( | 319 content_layer_client.add_draw_image( |
| 308 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), | 320 discardable_image[y][x], gfx::Point(x * 512 + 6, y * 512 + 6), |
| 309 flags); | 321 flags); |
| 310 } | 322 } |
| 311 } | 323 } |
| 312 } | 324 } |
| 313 | 325 |
| 314 scoped_refptr<DisplayItemList> display_list = | 326 scoped_refptr<DisplayItemList> display_list = |
| 315 content_layer_client.PaintContentsToDisplayList( | 327 content_layer_client.PaintContentsToDisplayList( |
| 316 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 328 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 329 display_list->GenerateDiscardableImagesMetadata(); |
| 317 | 330 |
| 318 DiscardableImageMap image_map; | 331 const DiscardableImageMap& image_map = |
| 319 { | 332 display_list->discardable_image_map_for_testing(); |
| 320 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 321 visible_rect.size()); | |
| 322 display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f); | |
| 323 } | |
| 324 | 333 |
| 325 for (int y = 0; y < 4; ++y) { | 334 for (int y = 0; y < 4; ++y) { |
| 326 for (int x = 0; x < 4; ++x) { | 335 for (int x = 0; x < 4; ++x) { |
| 327 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( | 336 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( |
| 328 image_map, gfx::Rect(x * 512 + 256, y * 512 + 256, 1, 1)); | 337 image_map, gfx::Rect(x * 512 + 256, y * 512 + 256, 1, 1)); |
| 329 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 338 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 330 if ((x + y) & 1) { | 339 if ((x + y) & 1) { |
| 331 EXPECT_EQ(1u, images.size()) << x << " " << y; | 340 EXPECT_EQ(1u, images.size()) << x << " " << y; |
| 332 EXPECT_TRUE(images[0].image == discardable_image[y][x]) | 341 EXPECT_TRUE(images[0].image == discardable_image[y][x]) |
| 333 << x << " " << y; | 342 << x << " " << y; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 349 | 358 |
| 350 sk_sp<SkImage> discardable_image = | 359 sk_sp<SkImage> discardable_image = |
| 351 CreateDiscardableImage(gfx::Size(1 << 25, 1 << 25)); | 360 CreateDiscardableImage(gfx::Size(1 << 25, 1 << 25)); |
| 352 PaintFlags flags; | 361 PaintFlags flags; |
| 353 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), | 362 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), |
| 354 flags); | 363 flags); |
| 355 | 364 |
| 356 scoped_refptr<DisplayItemList> display_list = | 365 scoped_refptr<DisplayItemList> display_list = |
| 357 content_layer_client.PaintContentsToDisplayList( | 366 content_layer_client.PaintContentsToDisplayList( |
| 358 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 367 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 368 display_list->GenerateDiscardableImagesMetadata(); |
| 359 | 369 |
| 360 DiscardableImageMap image_map; | 370 const DiscardableImageMap& image_map = |
| 361 { | 371 display_list->discardable_image_map_for_testing(); |
| 362 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 363 visible_rect.size()); | |
| 364 display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f); | |
| 365 } | |
| 366 std::vector<PositionScaleDrawImage> images = | 372 std::vector<PositionScaleDrawImage> images = |
| 367 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 373 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 368 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 374 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 369 EXPECT_EQ(1u, images.size()); | 375 EXPECT_EQ(1u, images.size()); |
| 370 EXPECT_TRUE(images[0].image == discardable_image); | 376 EXPECT_TRUE(images[0].image == discardable_image); |
| 371 EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), inset_rects[0]); | 377 EXPECT_EQ(gfx::Rect(0, 0, 2048, 2048), inset_rects[0]); |
| 372 EXPECT_EQ(images[0].image_rect, | 378 EXPECT_EQ(images[0].image_rect, |
| 373 image_map.GetRectForImage(images[0].image->uniqueID())); | 379 image_map.GetRectForImage(images[0].image->uniqueID())); |
| 374 } | 380 } |
| 375 | 381 |
| 376 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) { | 382 TEST_F(DiscardableImageMapTest, PaintDestroyedWhileImageIsDrawn) { |
| 377 gfx::Rect visible_rect(2048, 2048); | 383 gfx::Rect visible_rect(2048, 2048); |
| 378 FakeContentLayerClient content_layer_client; | 384 FakeContentLayerClient content_layer_client; |
| 379 content_layer_client.set_bounds(visible_rect.size()); | 385 content_layer_client.set_bounds(visible_rect.size()); |
| 380 | 386 |
| 381 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); | 387 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); |
| 388 sk_sp<PaintRecord> record = CreateRecording(discardable_image, visible_rect); |
| 382 | 389 |
| 383 DiscardableImageMap image_map; | 390 DiscardableImageMap image_map; |
| 384 { | 391 { |
| 385 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 392 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 386 visible_rect.size()); | 393 visible_rect.size()); |
| 394 DiscardableImageStore* image_store = generator.image_store(); |
| 387 { | 395 { |
| 388 std::unique_ptr<SkPaint> paint(new SkPaint()); | 396 std::unique_ptr<SkPaint> paint(new SkPaint()); |
| 389 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), | 397 image_store->GetNoDrawCanvas()->saveLayer(gfx::RectToSkRect(visible_rect), |
| 390 paint.get()); | 398 paint.get()); |
| 391 } | 399 } |
| 392 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); | 400 image_store->GatherDiscardableImages(record.get()); |
| 393 generator.canvas()->restore(); | 401 image_store->GetNoDrawCanvas()->restore(); |
| 394 } | 402 } |
| 395 | 403 |
| 396 std::vector<PositionScaleDrawImage> images = | 404 std::vector<PositionScaleDrawImage> images = |
| 397 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 405 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 398 EXPECT_EQ(1u, images.size()); | 406 EXPECT_EQ(1u, images.size()); |
| 399 EXPECT_TRUE(images[0].image == discardable_image); | 407 EXPECT_TRUE(images[0].image == discardable_image); |
| 400 } | 408 } |
| 401 | 409 |
| 402 TEST_F(DiscardableImageMapTest, NullPaintOnSaveLayer) { | 410 TEST_F(DiscardableImageMapTest, NullPaintOnSaveLayer) { |
| 403 gfx::Rect visible_rect(2048, 2048); | 411 gfx::Rect visible_rect(2048, 2048); |
| 404 FakeContentLayerClient content_layer_client; | 412 FakeContentLayerClient content_layer_client; |
| 405 content_layer_client.set_bounds(visible_rect.size()); | 413 content_layer_client.set_bounds(visible_rect.size()); |
| 406 | 414 |
| 407 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); | 415 sk_sp<SkImage> discardable_image = CreateDiscardableImage(gfx::Size(10, 10)); |
| 416 sk_sp<PaintRecord> record = CreateRecording(discardable_image, visible_rect); |
| 408 | 417 |
| 409 DiscardableImageMap image_map; | 418 DiscardableImageMap image_map; |
| 410 { | 419 { |
| 411 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | 420 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, |
| 412 visible_rect.size()); | 421 visible_rect.size()); |
| 422 DiscardableImageStore* image_store = generator.image_store(); |
| 413 SkPaint* null_paint = nullptr; | 423 SkPaint* null_paint = nullptr; |
| 414 generator.canvas()->saveLayer(gfx::RectToSkRect(visible_rect), null_paint); | 424 image_store->GetNoDrawCanvas()->saveLayer(gfx::RectToSkRect(visible_rect), |
| 415 generator.canvas()->drawImage(discardable_image, 0, 0, nullptr); | 425 null_paint); |
| 416 generator.canvas()->restore(); | 426 image_store->GatherDiscardableImages(record.get()); |
| 427 image_store->GetNoDrawCanvas()->restore(); |
| 417 } | 428 } |
| 418 | 429 |
| 419 std::vector<PositionScaleDrawImage> images = | 430 std::vector<PositionScaleDrawImage> images = |
| 420 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 431 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 421 EXPECT_EQ(1u, images.size()); | 432 EXPECT_EQ(1u, images.size()); |
| 422 EXPECT_TRUE(images[0].image == discardable_image); | 433 EXPECT_TRUE(images[0].image == discardable_image); |
| 423 } | 434 } |
| 424 | 435 |
| 425 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) { | 436 TEST_F(DiscardableImageMapTest, GetDiscardableImagesInRectMaxImage) { |
| 426 gfx::Rect visible_rect(2048, 2048); | 437 gfx::Rect visible_rect(2048, 2048); |
| 427 FakeContentLayerClient content_layer_client; | 438 FakeContentLayerClient content_layer_client; |
| 428 content_layer_client.set_bounds(visible_rect.size()); | 439 content_layer_client.set_bounds(visible_rect.size()); |
| 429 | 440 |
| 430 int dimension = std::numeric_limits<int>::max(); | 441 int dimension = std::numeric_limits<int>::max(); |
| 431 sk_sp<SkImage> discardable_image = | 442 sk_sp<SkImage> discardable_image = |
| 432 CreateDiscardableImage(gfx::Size(dimension, dimension)); | 443 CreateDiscardableImage(gfx::Size(dimension, dimension)); |
| 433 PaintFlags flags; | 444 PaintFlags flags; |
| 434 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42), | 445 content_layer_client.add_draw_image(discardable_image, gfx::Point(42, 42), |
| 435 flags); | 446 flags); |
| 436 | 447 |
| 437 scoped_refptr<DisplayItemList> display_list = | 448 scoped_refptr<DisplayItemList> display_list = |
| 438 content_layer_client.PaintContentsToDisplayList( | 449 content_layer_client.PaintContentsToDisplayList( |
| 439 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 450 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 451 display_list->GenerateDiscardableImagesMetadata(); |
| 440 | 452 |
| 441 DiscardableImageMap image_map; | 453 const DiscardableImageMap& image_map = |
| 442 { | 454 display_list->discardable_image_map_for_testing(); |
| 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<PositionScaleDrawImage> images = | 455 std::vector<PositionScaleDrawImage> images = |
| 448 GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1)); | 456 GetDiscardableImagesInRect(image_map, gfx::Rect(42, 42, 1, 1)); |
| 449 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 457 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 450 EXPECT_EQ(1u, images.size()); | 458 EXPECT_EQ(1u, images.size()); |
| 451 EXPECT_TRUE(images[0].image == discardable_image); | 459 EXPECT_TRUE(images[0].image == discardable_image); |
| 452 EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), inset_rects[0]); | 460 EXPECT_EQ(gfx::Rect(42, 42, 2006, 2006), inset_rects[0]); |
| 453 EXPECT_EQ(images[0].image_rect, | 461 EXPECT_EQ(images[0].image_rect, |
| 454 image_map.GetRectForImage(images[0].image->uniqueID())); | 462 image_map.GetRectForImage(images[0].image->uniqueID())); |
| 455 } | 463 } |
| 456 | 464 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 472 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), | 480 content_layer_client.add_draw_image(discardable_image, gfx::Point(0, 0), |
| 473 flags); | 481 flags); |
| 474 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0), | 482 content_layer_client.add_draw_image(discardable_image, gfx::Point(10000, 0), |
| 475 flags); | 483 flags); |
| 476 content_layer_client.add_draw_image(discardable_image, | 484 content_layer_client.add_draw_image(discardable_image, |
| 477 gfx::Point(-10000, 500), flags); | 485 gfx::Point(-10000, 500), flags); |
| 478 | 486 |
| 479 scoped_refptr<DisplayItemList> display_list = | 487 scoped_refptr<DisplayItemList> display_list = |
| 480 content_layer_client.PaintContentsToDisplayList( | 488 content_layer_client.PaintContentsToDisplayList( |
| 481 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 489 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 490 display_list->GenerateDiscardableImagesMetadata(); |
| 482 | 491 |
| 483 DiscardableImageMap image_map; | 492 const DiscardableImageMap& image_map = |
| 484 { | 493 display_list->discardable_image_map_for_testing(); |
| 485 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 486 visible_rect.size()); | |
| 487 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); | |
| 488 } | |
| 489 std::vector<PositionScaleDrawImage> images = | 494 std::vector<PositionScaleDrawImage> images = |
| 490 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 495 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 491 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 496 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 492 EXPECT_EQ(1u, images.size()); | 497 EXPECT_EQ(1u, images.size()); |
| 493 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), inset_rects[0]); | 498 EXPECT_EQ(gfx::Rect(0, 0, dimension, dimension), inset_rects[0]); |
| 494 | 499 |
| 495 images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1)); | 500 images = GetDiscardableImagesInRect(image_map, gfx::Rect(10000, 0, 1, 1)); |
| 496 inset_rects = InsetImageRects(images); | 501 inset_rects = InsetImageRects(images); |
| 497 EXPECT_EQ(2u, images.size()); | 502 EXPECT_EQ(2u, images.size()); |
| 498 EXPECT_EQ(gfx::Rect(10000, 0, dimension - 10000, dimension), inset_rects[1]); | 503 EXPECT_EQ(gfx::Rect(10000, 0, dimension - 10000, dimension), inset_rects[1]); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 527 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11), | 532 content_layer_client.add_draw_image(discardable_image, gfx::Point(-10, -11), |
| 528 flags); | 533 flags); |
| 529 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951), | 534 content_layer_client.add_draw_image(discardable_image, gfx::Point(950, 951), |
| 530 flags); | 535 flags); |
| 531 content_layer_client.add_draw_image(long_discardable_image, | 536 content_layer_client.add_draw_image(long_discardable_image, |
| 532 gfx::Point(-100, 500), flags); | 537 gfx::Point(-100, 500), flags); |
| 533 | 538 |
| 534 scoped_refptr<DisplayItemList> display_list = | 539 scoped_refptr<DisplayItemList> display_list = |
| 535 content_layer_client.PaintContentsToDisplayList( | 540 content_layer_client.PaintContentsToDisplayList( |
| 536 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 541 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 542 display_list->GenerateDiscardableImagesMetadata(); |
| 537 | 543 |
| 538 DiscardableImageMap image_map; | 544 const DiscardableImageMap& image_map = |
| 539 { | 545 display_list->discardable_image_map_for_testing(); |
| 540 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 541 visible_rect.size()); | |
| 542 display_list->Raster(generator.canvas(), nullptr, visible_rect, 1.f); | |
| 543 } | |
| 544 std::vector<PositionScaleDrawImage> images = | 546 std::vector<PositionScaleDrawImage> images = |
| 545 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); | 547 GetDiscardableImagesInRect(image_map, gfx::Rect(0, 0, 1, 1)); |
| 546 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 548 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 547 EXPECT_EQ(1u, images.size()); | 549 EXPECT_EQ(1u, images.size()); |
| 548 EXPECT_EQ(gfx::Rect(0, 0, 90, 89), inset_rects[0]); | 550 EXPECT_EQ(gfx::Rect(0, 0, 90, 89), inset_rects[0]); |
| 549 | 551 |
| 550 images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1)); | 552 images = GetDiscardableImagesInRect(image_map, gfx::Rect(999, 999, 1, 1)); |
| 551 inset_rects = InsetImageRects(images); | 553 inset_rects = InsetImageRects(images); |
| 552 EXPECT_EQ(1u, images.size()); | 554 EXPECT_EQ(1u, images.size()); |
| 553 EXPECT_EQ(gfx::Rect(950, 951, 50, 49), inset_rects[0]); | 555 EXPECT_EQ(gfx::Rect(950, 951, 50, 49), inset_rects[0]); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &scale)); | 602 SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, &scale)); |
| 601 content_layer_client.add_draw_rect( | 603 content_layer_client.add_draw_rect( |
| 602 gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500), flags); | 604 gfx::Rect(x * 512 + 6, y * 512 + 6, 500, 500), flags); |
| 603 } | 605 } |
| 604 } | 606 } |
| 605 } | 607 } |
| 606 | 608 |
| 607 scoped_refptr<DisplayItemList> display_list = | 609 scoped_refptr<DisplayItemList> display_list = |
| 608 content_layer_client.PaintContentsToDisplayList( | 610 content_layer_client.PaintContentsToDisplayList( |
| 609 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); | 611 ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); |
| 612 display_list->GenerateDiscardableImagesMetadata(); |
| 610 | 613 |
| 611 DiscardableImageMap image_map; | 614 const DiscardableImageMap& image_map = |
| 612 { | 615 display_list->discardable_image_map_for_testing(); |
| 613 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map, | |
| 614 visible_rect.size()); | |
| 615 display_list->Raster(generator.canvas(), nullptr, gfx::Rect(), 1.f); | |
| 616 } | |
| 617 | 616 |
| 618 for (int y = 0; y < 4; ++y) { | 617 for (int y = 0; y < 4; ++y) { |
| 619 for (int x = 0; x < 4; ++x) { | 618 for (int x = 0; x < 4; ++x) { |
| 620 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( | 619 std::vector<PositionScaleDrawImage> images = GetDiscardableImagesInRect( |
| 621 image_map, gfx::Rect(x * 512, y * 512, 500, 500)); | 620 image_map, gfx::Rect(x * 512, y * 512, 500, 500)); |
| 622 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); | 621 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 623 if ((x + y) & 1) { | 622 if ((x + y) & 1) { |
| 624 EXPECT_EQ(1u, images.size()) << x << " " << y; | 623 EXPECT_EQ(1u, images.size()) << x << " " << y; |
| 625 EXPECT_TRUE(images[0].image == discardable_image[y][x]) | 624 EXPECT_TRUE(images[0].image == discardable_image[y][x]) |
| 626 << x << " " << y; | 625 << x << " " << y; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 642 EXPECT_TRUE(images[0].image == discardable_image[1][2]); | 641 EXPECT_TRUE(images[0].image == discardable_image[1][2]); |
| 643 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 512 + 6, 500, 500), inset_rects[0]); | 642 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 512 + 6, 500, 500), inset_rects[0]); |
| 644 EXPECT_TRUE(images[1].image == discardable_image[2][1]); | 643 EXPECT_TRUE(images[1].image == discardable_image[2][1]); |
| 645 EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), inset_rects[1]); | 644 EXPECT_EQ(gfx::Rect(512 + 6, 2 * 512 + 6, 500, 500), inset_rects[1]); |
| 646 EXPECT_TRUE(images[2].image == discardable_image[2][3]); | 645 EXPECT_TRUE(images[2].image == discardable_image[2][3]); |
| 647 EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), inset_rects[2]); | 646 EXPECT_EQ(gfx::Rect(3 * 512 + 6, 2 * 512 + 6, 500, 500), inset_rects[2]); |
| 648 EXPECT_TRUE(images[3].image == discardable_image[3][2]); | 647 EXPECT_TRUE(images[3].image == discardable_image[3][2]); |
| 649 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), inset_rects[3]); | 648 EXPECT_EQ(gfx::Rect(2 * 512 + 6, 3 * 512 + 6, 500, 500), inset_rects[3]); |
| 650 } | 649 } |
| 651 | 650 |
| 651 TEST_F(DiscardableImageMapTest, ClipsImageRects) { |
| 652 gfx::Rect visible_rect(500, 500); |
| 653 |
| 654 sk_sp<const SkImage> discardable_image = |
| 655 CreateDiscardableImage(gfx::Size(500, 500)); |
| 656 sk_sp<PaintRecord> record = CreateRecording(discardable_image, visible_rect); |
| 657 |
| 658 scoped_refptr<DisplayItemList> display_list = new DisplayItemList; |
| 659 display_list->CreateAndAppendPairedBeginItem<ClipDisplayItem>( |
| 660 gfx::Rect(250, 250), std::vector<SkRRect>(), false); |
| 661 display_list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 662 gfx::Rect(500, 500), record); |
| 663 display_list->CreateAndAppendPairedEndItem<EndClipDisplayItem>(); |
| 664 display_list->Finalize(); |
| 665 display_list->GenerateDiscardableImagesMetadata(); |
| 666 |
| 667 const DiscardableImageMap& image_map = |
| 668 display_list->discardable_image_map_for_testing(); |
| 669 std::vector<PositionScaleDrawImage> images = |
| 670 GetDiscardableImagesInRect(image_map, visible_rect); |
| 671 std::vector<gfx::Rect> inset_rects = InsetImageRects(images); |
| 672 EXPECT_EQ(1u, images.size()); |
| 673 EXPECT_TRUE(images[0].image == discardable_image); |
| 674 EXPECT_EQ(gfx::Rect(250, 250), inset_rects[0]); |
| 675 } |
| 676 |
| 677 TEST_F(DiscardableImageMapTest, GathersDiscardableImagesFromNestedOps) { |
| 678 sk_sp<PaintRecord> internal_record = sk_make_sp<PaintRecord>(); |
| 679 sk_sp<SkImage> discardable_image = |
| 680 CreateDiscardableImage(gfx::Size(100, 100)); |
| 681 internal_record->push<DrawImageOp>( |
| 682 PaintImage(discardable_image, PaintImage::AnimationType::STATIC, |
| 683 PaintImage::CompletionState::DONE), |
| 684 0.f, 0.f, nullptr); |
| 685 |
| 686 sk_sp<PaintRecord> list_record = sk_make_sp<PaintRecord>(); |
| 687 sk_sp<SkImage> discardable_image2 = |
| 688 CreateDiscardableImage(gfx::Size(100, 100)); |
| 689 list_record->push<DrawImageOp>( |
| 690 PaintImage(discardable_image2, PaintImage::AnimationType::STATIC, |
| 691 PaintImage::CompletionState::DONE), |
| 692 100.f, 100.f, nullptr); |
| 693 scoped_refptr<DisplayItemList> display_list = new DisplayItemList; |
| 694 display_list->CreateAndAppendDrawingItem<DrawingDisplayItem>( |
| 695 gfx::Rect(100, 100, 100, 100), list_record); |
| 696 display_list->Finalize(); |
| 697 |
| 698 PaintOpBuffer buffer; |
| 699 buffer.push<DrawRecordOp>(internal_record); |
| 700 buffer.push<DrawDisplayItemListOp>(display_list); |
| 701 DiscardableImageMap image_map_; |
| 702 { |
| 703 DiscardableImageMap::ScopedMetadataGenerator generator(&image_map_, |
| 704 gfx::Size(200, 200)); |
| 705 generator.image_store()->GatherDiscardableImages(&buffer); |
| 706 } |
| 707 |
| 708 gfx::ColorSpace target_color_space; |
| 709 std::vector<DrawImage> images; |
| 710 image_map_.GetDiscardableImagesInRect(gfx::Rect(0, 0, 5, 95), 1.f, |
| 711 target_color_space, &images); |
| 712 EXPECT_EQ(1u, images.size()); |
| 713 EXPECT_TRUE(discardable_image == images[0].image()); |
| 714 |
| 715 images.clear(); |
| 716 image_map_.GetDiscardableImagesInRect(gfx::Rect(105, 105, 5, 95), 1.f, |
| 717 target_color_space, &images); |
| 718 EXPECT_EQ(1u, images.size()); |
| 719 EXPECT_TRUE(discardable_image2 == images[0].image()); |
| 720 } |
| 721 |
| 652 } // namespace cc | 722 } // namespace cc |
| OLD | NEW |