Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1624)

Side by Side Diff: cc/paint/discardable_image_map_unittest.cc

Issue 2842333003: cc: Update discardable image metadata generation to get PaintImages. (Closed)
Patch Set: win Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/paint/discardable_image_map.cc ('k') | cc/paint/discardable_image_store.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/paint/discardable_image_map.cc ('k') | cc/paint/discardable_image_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698