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

Side by Side Diff: cc/tiles/software_image_decode_cache_unittest.cc

Issue 2870753002: SW Image Decode Cache Low to Medium Quality for Downscale (Closed)
Patch Set: rebaseline 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
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/tiles/software_image_decode_cache.h" 5 #include "cc/tiles/software_image_decode_cache.h"
6 6
7 #include "cc/paint/draw_image.h" 7 #include "cc/paint/draw_image.h"
8 #include "cc/resources/resource_format.h" 8 #include "cc/resources/resource_format.h"
9 #include "cc/test/test_tile_task_runner.h" 9 #include "cc/test/test_tile_task_runner.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 49
50 return matrix; 50 return matrix;
51 } 51 }
52 52
53 PaintImage::Id s_paint_image_id = PaintImage::GetNextId(); 53 PaintImage::Id s_paint_image_id = PaintImage::GetNextId();
54 54
55 PaintImage CreatePaintImage(sk_sp<SkImage> image) { 55 PaintImage CreatePaintImage(sk_sp<SkImage> image) {
56 return PaintImage(s_paint_image_id, image); 56 return PaintImage(s_paint_image_id, image);
57 } 57 }
58 58
59 TEST(SoftwareImageDecodeCacheTest, ImageKeyLowQuality) { 59 TEST(SoftwareImageDecodeCacheTest, ImageKeyNoneQuality) {
60 sk_sp<SkImage> image = CreateImage(100, 100); 60 sk_sp<SkImage> image = CreateImage(100, 100);
61 bool is_decomposable = true; 61 bool is_decomposable = true;
62 SkFilterQuality qualities[] = {kNone_SkFilterQuality, kLow_SkFilterQuality}; 62 DrawImage draw_image(CreatePaintImage(image),
63 for (auto quality : qualities) { 63 SkIRect::MakeWH(image->width(), image->height()),
64 DrawImage draw_image( 64 kNone_SkFilterQuality,
65 CreatePaintImage(image), 65 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
66 SkIRect::MakeWH(image->width(), image->height()), quality, 66 DefaultColorSpace());
67 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
68 DefaultColorSpace());
69 67
70 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image); 68 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image);
71 EXPECT_EQ(image->uniqueID(), key.image_id()); 69 EXPECT_EQ(image->uniqueID(), key.image_id());
72 EXPECT_EQ(quality, key.filter_quality()); 70 EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality());
73 EXPECT_EQ(100, key.target_size().width()); 71 EXPECT_EQ(100, key.target_size().width());
74 EXPECT_EQ(100, key.target_size().height()); 72 EXPECT_EQ(100, key.target_size().height());
75 EXPECT_TRUE(key.can_use_original_size_decode()); 73 EXPECT_TRUE(key.can_use_original_size_decode());
76 // Since the original decode will be used, the locked_bytes is that of the 74 // Since the original decode will be used, the locked_bytes is that of the
77 // original image. 75 // original image.
78 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes()); 76 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
79 } 77 }
78
79 TEST(SoftwareImageDecodeCacheTest,
80 ImageKeyLowQualityIncreasedToMediumIfDownscale) {
81 sk_sp<SkImage> image = CreateImage(100, 100);
82 bool is_decomposable = true;
83 DrawImage draw_image(CreatePaintImage(image),
84 SkIRect::MakeWH(image->width(), image->height()),
85 kLow_SkFilterQuality,
86 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
87 DefaultColorSpace());
88
89 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image);
90 EXPECT_EQ(image->uniqueID(), key.image_id());
91 EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
92 EXPECT_EQ(100, key.target_size().width());
93 EXPECT_EQ(100, key.target_size().height());
94 EXPECT_FALSE(key.can_use_original_size_decode());
95 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
96 }
97
98 TEST(SoftwareImageDecodeCacheTest, ImageKeyLowQualityKeptLowIfUpscale) {
99 sk_sp<SkImage> image = CreateImage(100, 100);
100 bool is_decomposable = true;
101 DrawImage draw_image(CreatePaintImage(image),
102 SkIRect::MakeWH(image->width(), image->height()),
103 kLow_SkFilterQuality,
104 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
105 DefaultColorSpace());
106
107 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image);
108 EXPECT_EQ(image->uniqueID(), key.image_id());
109 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
110 EXPECT_EQ(100, key.target_size().width());
111 EXPECT_EQ(100, key.target_size().height());
112 EXPECT_TRUE(key.can_use_original_size_decode());
113 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
80 } 114 }
81 115
82 TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQuality) { 116 TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQuality) {
83 sk_sp<SkImage> image = CreateImage(100, 100); 117 sk_sp<SkImage> image = CreateImage(100, 100);
84 bool is_decomposable = true; 118 bool is_decomposable = true;
85 SkFilterQuality quality = kMedium_SkFilterQuality; 119 SkFilterQuality quality = kMedium_SkFilterQuality;
86 120
87 DrawImage draw_image( 121 DrawImage draw_image(
88 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), 122 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()),
89 quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), 123 quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable),
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); 519 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
486 EXPECT_EQ(100, key.target_size().width()); 520 EXPECT_EQ(100, key.target_size().width());
487 EXPECT_EQ(100, key.target_size().height()); 521 EXPECT_EQ(100, key.target_size().height());
488 EXPECT_TRUE(key.can_use_original_size_decode()); 522 EXPECT_TRUE(key.can_use_original_size_decode());
489 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes()); 523 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
490 } 524 }
491 525
492 TEST(SoftwareImageDecodeCacheTest, OriginalDecodesAreEqual) { 526 TEST(SoftwareImageDecodeCacheTest, OriginalDecodesAreEqual) {
493 sk_sp<SkImage> image = CreateImage(100, 100); 527 sk_sp<SkImage> image = CreateImage(100, 100);
494 bool is_decomposable = true; 528 bool is_decomposable = true;
495 SkFilterQuality quality = kLow_SkFilterQuality; 529 SkFilterQuality quality = kNone_SkFilterQuality;
496 530
497 DrawImage draw_image( 531 DrawImage draw_image(
498 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), 532 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()),
499 quality, CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable), 533 quality, CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable),
500 DefaultColorSpace()); 534 DefaultColorSpace());
501 535
502 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image); 536 auto key = ImageDecodeCacheKey::FromDrawImage(draw_image);
503 EXPECT_EQ(image->uniqueID(), key.image_id()); 537 EXPECT_EQ(image->uniqueID(), key.image_id());
504 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); 538 EXPECT_EQ(kNone_SkFilterQuality, key.filter_quality());
505 EXPECT_EQ(100, key.target_size().width()); 539 EXPECT_EQ(100, key.target_size().width());
506 EXPECT_EQ(100, key.target_size().height()); 540 EXPECT_EQ(100, key.target_size().height());
507 EXPECT_TRUE(key.can_use_original_size_decode()); 541 EXPECT_TRUE(key.can_use_original_size_decode());
508 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes()); 542 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
509 543
510 DrawImage another_draw_image( 544 DrawImage another_draw_image(
511 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), 545 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()),
512 quality, CreateMatrix(SkSize::Make(1.5f, 1.5), is_decomposable), 546 quality, CreateMatrix(SkSize::Make(1.5f, 1.5), is_decomposable),
513 DefaultColorSpace()); 547 DefaultColorSpace());
514 548
515 auto another_key = ImageDecodeCacheKey::FromDrawImage(another_draw_image); 549 auto another_key = ImageDecodeCacheKey::FromDrawImage(another_draw_image);
516 EXPECT_EQ(image->uniqueID(), another_key.image_id()); 550 EXPECT_EQ(image->uniqueID(), another_key.image_id());
517 EXPECT_EQ(kLow_SkFilterQuality, another_key.filter_quality()); 551 EXPECT_EQ(kNone_SkFilterQuality, another_key.filter_quality());
518 EXPECT_EQ(100, another_key.target_size().width()); 552 EXPECT_EQ(100, another_key.target_size().width());
519 EXPECT_EQ(100, another_key.target_size().height()); 553 EXPECT_EQ(100, another_key.target_size().height());
520 EXPECT_TRUE(another_key.can_use_original_size_decode()); 554 EXPECT_TRUE(another_key.can_use_original_size_decode());
521 EXPECT_EQ(100u * 100u * 4u, another_key.locked_bytes()); 555 EXPECT_EQ(100u * 100u * 4u, another_key.locked_bytes());
522 556
523 EXPECT_TRUE(key == another_key); 557 EXPECT_TRUE(key == another_key);
524 } 558 }
525 559
526 TEST(SoftwareImageDecodeCacheTest, ImageRectDoesNotContainSrcRect) { 560 TEST(SoftwareImageDecodeCacheTest, ImageRectDoesNotContainSrcRect) {
527 sk_sp<SkImage> image = CreateImage(100, 100); 561 sk_sp<SkImage> image = CreateImage(100, 100);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 kHigh_SkFilterQuality, 639 kHigh_SkFilterQuality,
606 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), 640 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
607 DefaultColorSpace()); 641 DefaultColorSpace());
608 scoped_refptr<TileTask> high_quality_task; 642 scoped_refptr<TileTask> high_quality_task;
609 bool need_unref = cache.GetTaskForImageAndRef(high_quality_draw_image, 643 bool need_unref = cache.GetTaskForImageAndRef(high_quality_draw_image,
610 ImageDecodeCache::TracingInfo(), 644 ImageDecodeCache::TracingInfo(),
611 &high_quality_task); 645 &high_quality_task);
612 EXPECT_TRUE(need_unref); 646 EXPECT_TRUE(need_unref);
613 EXPECT_TRUE(high_quality_task); 647 EXPECT_TRUE(high_quality_task);
614 648
615 DrawImage low_quality_draw_image( 649 DrawImage none_quality_draw_image(
616 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), 650 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()),
617 kLow_SkFilterQuality, 651 kNone_SkFilterQuality,
618 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), 652 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
619 DefaultColorSpace()); 653 DefaultColorSpace());
620 scoped_refptr<TileTask> low_quality_task; 654 scoped_refptr<TileTask> none_quality_task;
621 need_unref = cache.GetTaskForImageAndRef(low_quality_draw_image, 655 need_unref = cache.GetTaskForImageAndRef(none_quality_draw_image,
622 ImageDecodeCache::TracingInfo(), 656 ImageDecodeCache::TracingInfo(),
623 &low_quality_task); 657 &none_quality_task);
624 EXPECT_TRUE(need_unref); 658 EXPECT_TRUE(need_unref);
625 EXPECT_TRUE(low_quality_task); 659 EXPECT_TRUE(none_quality_task);
626 EXPECT_TRUE(high_quality_task.get() != low_quality_task.get()); 660 EXPECT_TRUE(high_quality_task.get() != none_quality_task.get());
627 661
628 TestTileTaskRunner::ProcessTask(high_quality_task.get()); 662 TestTileTaskRunner::ProcessTask(high_quality_task.get());
629 TestTileTaskRunner::ProcessTask(low_quality_task.get()); 663 TestTileTaskRunner::ProcessTask(none_quality_task.get());
630 664
631 cache.UnrefImage(high_quality_draw_image); 665 cache.UnrefImage(high_quality_draw_image);
632 cache.UnrefImage(low_quality_draw_image); 666 cache.UnrefImage(none_quality_draw_image);
633 } 667 }
634 668
635 TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentSize) { 669 TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentSize) {
636 TestSoftwareImageDecodeCache cache; 670 TestSoftwareImageDecodeCache cache;
637 sk_sp<SkImage> image = CreateImage(100, 100); 671 sk_sp<SkImage> image = CreateImage(100, 100);
638 bool is_decomposable = true; 672 bool is_decomposable = true;
639 SkFilterQuality quality = kHigh_SkFilterQuality; 673 SkFilterQuality quality = kHigh_SkFilterQuality;
640 674
641 DrawImage half_size_draw_image( 675 DrawImage half_size_draw_image(
642 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), 676 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()),
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
1236 1270
1237 TestTileTaskRunner::ProcessTask(task.get()); 1271 TestTileTaskRunner::ProcessTask(task.get());
1238 1272
1239 DecodedDrawImage decoded_draw_image = 1273 DecodedDrawImage decoded_draw_image =
1240 cache.GetDecodedImageForDraw(draw_image); 1274 cache.GetDecodedImageForDraw(draw_image);
1241 EXPECT_TRUE(decoded_draw_image.image()); 1275 EXPECT_TRUE(decoded_draw_image.image());
1242 // If we decoded the image and cached it, it would be stored in a different 1276 // If we decoded the image and cached it, it would be stored in a different
1243 // SkImage object. 1277 // SkImage object.
1244 EXPECT_TRUE(decoded_draw_image.image() != image); 1278 EXPECT_TRUE(decoded_draw_image.image() != image);
1245 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality()); 1279 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1246 EXPECT_TRUE(decoded_draw_image.is_scale_adjustment_identity()); 1280 // Low quality will be upgraded to medium and mip-mapped.
1281 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
1282 EXPECT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
1283 EXPECT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
1247 1284
1248 cache.DrawWithImageFinished(draw_image, decoded_draw_image); 1285 cache.DrawWithImageFinished(draw_image, decoded_draw_image);
1249 cache.UnrefImage(draw_image); 1286 cache.UnrefImage(draw_image);
1250 } 1287 }
1251 1288
1252 TEST(SoftwareImageDecodeCacheTest, NoneQualityScaledSubrectIsHandled) { 1289 TEST(SoftwareImageDecodeCacheTest, NoneQualityScaledSubrectIsHandled) {
1253 TestSoftwareImageDecodeCache cache; 1290 TestSoftwareImageDecodeCache cache;
1254 bool is_decomposable = true; 1291 bool is_decomposable = true;
1255 SkFilterQuality quality = kNone_SkFilterQuality; 1292 SkFilterQuality quality = kNone_SkFilterQuality;
1256 1293
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 EXPECT_EQ(10u, cache.GetNumCacheEntriesForTesting()); 1651 EXPECT_EQ(10u, cache.GetNumCacheEntriesForTesting());
1615 1652
1616 // Tell our cache to clear resources. 1653 // Tell our cache to clear resources.
1617 cache.ClearCache(); 1654 cache.ClearCache();
1618 1655
1619 EXPECT_EQ(0u, cache.GetNumCacheEntriesForTesting()); 1656 EXPECT_EQ(0u, cache.GetNumCacheEntriesForTesting());
1620 } 1657 }
1621 1658
1622 } // namespace 1659 } // namespace
1623 } // namespace cc 1660 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698