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

Unified Diff: cc/tiles/image_decode_controller_unittest.cc

Issue 1682803003: cc: ImageDecodes: handle low quality filters. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: remove old code Created 4 years, 10 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 side-by-side diff with in-line comments
Download patch
« cc/tiles/image_decode_controller.cc ('K') | « cc/tiles/image_decode_controller.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/image_decode_controller_unittest.cc
diff --git a/cc/tiles/image_decode_controller_unittest.cc b/cc/tiles/image_decode_controller_unittest.cc
index 4ecaf4446f3e7775d493568f2294d7201e0615ba..9c67a65d489a7ba5c936f0d80bc250d72cbebc70 100644
--- a/cc/tiles/image_decode_controller_unittest.cc
+++ b/cc/tiles/image_decode_controller_unittest.cc
@@ -32,7 +32,10 @@ TEST(ImageDecodeControllerTest, ImageKeyLowQuality) {
EXPECT_EQ(quality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ // Since the original decode will be used, the locked_bytes is that of the
+ // original image.
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
}
@@ -51,7 +54,8 @@ TEST(ImageDecodeControllerTest, ImageKeyMediumQuality) {
EXPECT_EQ(quality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_FALSE(key.can_use_original_decode());
+ EXPECT_EQ(50u * 150u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyMediumQualityEvenWithPerspective) {
@@ -69,7 +73,8 @@ TEST(ImageDecodeControllerTest, ImageKeyMediumQualityEvenWithPerspective) {
EXPECT_EQ(quality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_FALSE(key.can_use_original_decode());
+ EXPECT_EQ(50u * 150u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfEnlarging) {
@@ -87,7 +92,8 @@ TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfEnlarging) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(150, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(150u * 150u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfIdentity) {
@@ -105,7 +111,8 @@ TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfIdentity) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest,
@@ -124,7 +131,8 @@ TEST(ImageDecodeControllerTest,
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest,
@@ -143,7 +151,8 @@ TEST(ImageDecodeControllerTest,
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest,
@@ -162,7 +171,8 @@ TEST(ImageDecodeControllerTest,
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQuality) {
@@ -180,7 +190,8 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQuality) {
EXPECT_EQ(quality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_FALSE(key.can_use_original_decode());
+ EXPECT_EQ(50u * 150u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest,
@@ -199,7 +210,8 @@ TEST(ImageDecodeControllerTest,
EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_FALSE(key.can_use_original_decode());
+ EXPECT_EQ(50u * 150u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToMediumIfTooLarge) {
@@ -220,7 +232,8 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToMediumIfTooLarge) {
EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
EXPECT_EQ(4100, key.target_size().width());
EXPECT_EQ(4096, key.target_size().height());
- EXPECT_EQ(4100u * 4096u * 4u, key.target_bytes());
+ EXPECT_FALSE(key.can_use_original_decode());
+ EXPECT_EQ(4100u * 4096u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNotDecomposable) {
@@ -238,7 +251,8 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNotDecomposable) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(50, key.target_size().width());
EXPECT_EQ(150, key.target_size().height());
- EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfIdentity) {
@@ -256,7 +270,8 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfIdentity) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity) {
@@ -274,7 +289,8 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
}
TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity2) {
@@ -292,7 +308,42 @@ TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity2) {
EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
EXPECT_EQ(100, key.target_size().width());
EXPECT_EQ(100, key.target_size().height());
- EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
+}
+
+TEST(ImageDecodeControllerTest, OriginalDecodesAreEqual) {
+ skia::RefPtr<SkImage> image = CreateImage(100, 100);
+ bool has_perspective = false;
+ bool is_decomposable = true;
+ SkFilterQuality quality = kLow_SkFilterQuality;
+
+ DrawImage draw_image(
+ image.get(), SkIRect::MakeWH(image->width(), image->height()),
+ SkSize::Make(0.5f, 0.5), quality, has_perspective, is_decomposable);
+
+ auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
+ EXPECT_EQ(image->uniqueID(), key.image_id());
+ EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
+ EXPECT_EQ(50, key.target_size().width());
+ EXPECT_EQ(50, key.target_size().height());
+ EXPECT_TRUE(key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
+
+ DrawImage another_draw_image(
+ image.get(), SkIRect::MakeWH(image->width(), image->height()),
+ SkSize::Make(1.5f, 1.5), quality, has_perspective, is_decomposable);
+
+ auto another_key =
+ ImageDecodeControllerKey::FromDrawImage(another_draw_image);
+ EXPECT_EQ(image->uniqueID(), another_key.image_id());
+ EXPECT_EQ(kLow_SkFilterQuality, another_key.filter_quality());
+ EXPECT_EQ(150, another_key.target_size().width());
+ EXPECT_EQ(150, another_key.target_size().height());
+ EXPECT_TRUE(another_key.can_use_original_decode());
+ EXPECT_EQ(100u * 100u * 4u, another_key.locked_bytes());
+
+ EXPECT_TRUE(key == another_key);
}
TEST(ImageDecodeControllerTest, GetTaskForImageSameImage) {
@@ -363,14 +414,13 @@ TEST(ImageDecodeControllerTest, GetTaskForImageSameImageDifferentQuality) {
scoped_refptr<ImageDecodeTask> low_quality_task;
need_unref = controller.GetTaskForImageAndRef(
low_quality_draw_image, prepare_tiles_id, &low_quality_task);
- // Note that when we pin the original decode, we might ref low quality images
- // too, but we don't support that right now.
- EXPECT_FALSE(need_unref);
+ EXPECT_TRUE(need_unref);
EXPECT_TRUE(low_quality_task);
EXPECT_TRUE(high_quality_task.get() != low_quality_task.get());
EXPECT_TRUE(medium_quality_task.get() != low_quality_task.get());
controller.UnrefImage(high_quality_draw_image);
+ controller.UnrefImage(low_quality_draw_image);
}
TEST(ImageDecodeControllerTest, GetTaskForImageSameImageDifferentSize) {
@@ -488,8 +538,7 @@ TEST(ImageDecodeControllerTest, GetTaskForImageAlreadyPrerolled) {
scoped_refptr<ImageDecodeTask> task;
bool need_unref =
controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
- // We're not currently locking original scale or low quality images.
- EXPECT_FALSE(need_unref);
+ EXPECT_TRUE(need_unref);
EXPECT_TRUE(task);
task->WillSchedule();
@@ -500,7 +549,7 @@ TEST(ImageDecodeControllerTest, GetTaskForImageAlreadyPrerolled) {
scoped_refptr<ImageDecodeTask> another_task;
need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
&another_task);
- EXPECT_FALSE(need_unref);
+ EXPECT_TRUE(need_unref);
EXPECT_FALSE(another_task);
task->WillComplete();
@@ -510,8 +559,12 @@ TEST(ImageDecodeControllerTest, GetTaskForImageAlreadyPrerolled) {
scoped_refptr<ImageDecodeTask> third_task;
need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
&third_task);
- EXPECT_FALSE(need_unref);
+ EXPECT_TRUE(need_unref);
EXPECT_FALSE(third_task);
+
+ controller.UnrefImage(draw_image);
+ controller.UnrefImage(draw_image);
+ controller.UnrefImage(draw_image);
}
TEST(ImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) {
@@ -843,5 +896,34 @@ TEST(ImageDecodeControllerTest, ZeroSizedImagesAreSkipped) {
controller.DrawWithImageFinished(draw_image, decoded_draw_image);
}
+TEST(ImageDecodeControllerTest, LowQualityFilterIsHandled) {
+ ImageDecodeController controller;
+ bool has_perspective = false;
+ bool is_decomposable = true;
+ uint64_t prepare_tiles_id = 1;
+ SkFilterQuality quality = kLow_SkFilterQuality;
+
+ skia::RefPtr<SkImage> image = CreateImage(100, 100);
+ DrawImage draw_image(
+ image.get(), SkIRect::MakeWH(image->width(), image->height()),
+ SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable);
+
+ scoped_refptr<ImageDecodeTask> task;
+ bool need_unref =
+ controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
+ EXPECT_TRUE(task);
+ EXPECT_TRUE(need_unref);
+
+ DecodedDrawImage decoded_draw_image =
+ controller.GetDecodedImageForDraw(draw_image);
+ EXPECT_TRUE(decoded_draw_image.image());
+ // If we decoded the image and cached it, it would be stored in a different
+ // SkImage object.
+ EXPECT_TRUE(decoded_draw_image.image() != image.get());
+
+ controller.DrawWithImageFinished(draw_image, decoded_draw_image);
+ controller.UnrefImage(draw_image);
+}
+
} // namespace
} // namespace cc
« cc/tiles/image_decode_controller.cc ('K') | « cc/tiles/image_decode_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698