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

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

Issue 1839833003: Add medium image quality to software predecode. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing NOTREACHED since VC was warning on it. Removing unneeded braces. Created 4 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/tiles/software_image_decode_controller.cc ('k') | no next file » | 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/tiles/software_image_decode_controller.h" 5 #include "cc/tiles/software_image_decode_controller.h"
6 6
7 #include "cc/playback/draw_image.h" 7 #include "cc/playback/draw_image.h"
8 #include "cc/raster/tile_task.h" 8 #include "cc/raster/tile_task.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/skia/include/core/SkRefCnt.h" 10 #include "third_party/skia/include/core/SkRefCnt.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 bool is_decomposable = true; 56 bool is_decomposable = true;
57 SkFilterQuality quality = kMedium_SkFilterQuality; 57 SkFilterQuality quality = kMedium_SkFilterQuality;
58 58
59 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 59 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
60 quality, 60 quality,
61 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); 61 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable));
62 62
63 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); 63 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
64 EXPECT_EQ(image->uniqueID(), key.image_id()); 64 EXPECT_EQ(image->uniqueID(), key.image_id());
65 EXPECT_EQ(quality, key.filter_quality()); 65 EXPECT_EQ(quality, key.filter_quality());
66 EXPECT_EQ(50, key.target_size().width()); 66 EXPECT_EQ(100, key.target_size().width());
67 EXPECT_EQ(150, key.target_size().height()); 67 EXPECT_EQ(100, key.target_size().height());
68 EXPECT_FALSE(key.can_use_original_decode()); 68 EXPECT_FALSE(key.can_use_original_decode());
69 EXPECT_EQ(50u * 150u * 4u, key.locked_bytes()); 69 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
70 } 70 }
71 71
72 TEST(SoftwareImageDecodeControllerTest, 72 TEST(SoftwareImageDecodeControllerTest,
73 ImageKeyMediumQualityDropToLowIfEnlarging) { 73 ImageKeyMediumQualityDropToLowIfEnlarging) {
74 sk_sp<SkImage> image = CreateImage(100, 100); 74 sk_sp<SkImage> image = CreateImage(100, 100);
75 bool is_decomposable = true; 75 bool is_decomposable = true;
76 SkFilterQuality quality = kMedium_SkFilterQuality; 76 SkFilterQuality quality = kMedium_SkFilterQuality;
77 77
78 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 78 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
79 quality, 79 quality,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 157
158 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); 158 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
159 EXPECT_EQ(image->uniqueID(), key.image_id()); 159 EXPECT_EQ(image->uniqueID(), key.image_id());
160 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality()); 160 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
161 EXPECT_EQ(100, key.target_size().width()); 161 EXPECT_EQ(100, key.target_size().width());
162 EXPECT_EQ(100, key.target_size().height()); 162 EXPECT_EQ(100, key.target_size().height());
163 EXPECT_TRUE(key.can_use_original_decode()); 163 EXPECT_TRUE(key.can_use_original_decode());
164 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes()); 164 EXPECT_EQ(100u * 100u * 4u, key.locked_bytes());
165 } 165 }
166 166
167 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt1_5Scale) {
168 sk_sp<SkImage> image = CreateImage(500, 200);
169 bool is_decomposable = true;
170 SkFilterQuality quality = kMedium_SkFilterQuality;
171
172 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
173 quality,
174 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
175
176 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
177 EXPECT_EQ(image->uniqueID(), key.image_id());
178 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
179 EXPECT_EQ(500, key.target_size().width());
180 EXPECT_EQ(200, key.target_size().height());
181 EXPECT_TRUE(key.can_use_original_decode());
182 EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
183 }
184
185 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt1_0cale) {
186 sk_sp<SkImage> image = CreateImage(500, 200);
187 bool is_decomposable = true;
188 SkFilterQuality quality = kMedium_SkFilterQuality;
189
190 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
191 quality,
192 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable));
193
194 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
195 EXPECT_EQ(image->uniqueID(), key.image_id());
196 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
197 EXPECT_EQ(500, key.target_size().width());
198 EXPECT_EQ(200, key.target_size().height());
199 EXPECT_TRUE(key.can_use_original_decode());
200 EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
201 }
202
203 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_75Scale) {
204 sk_sp<SkImage> image = CreateImage(500, 200);
205 bool is_decomposable = true;
206 SkFilterQuality quality = kMedium_SkFilterQuality;
207
208 DrawImage draw_image(
209 image, SkIRect::MakeWH(image->width(), image->height()), quality,
210 CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable));
211
212 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
213 EXPECT_EQ(image->uniqueID(), key.image_id());
214 EXPECT_EQ(quality, key.filter_quality());
215 EXPECT_EQ(500, key.target_size().width());
216 EXPECT_EQ(200, key.target_size().height());
217 EXPECT_FALSE(key.can_use_original_decode());
218 EXPECT_EQ(500u * 200u * 4u, key.locked_bytes());
219 }
220
221 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_5Scale) {
222 sk_sp<SkImage> image = CreateImage(500, 200);
223 bool is_decomposable = true;
224 SkFilterQuality quality = kMedium_SkFilterQuality;
225
226 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
227 quality,
228 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
229
230 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
231 EXPECT_EQ(image->uniqueID(), key.image_id());
232 EXPECT_EQ(quality, key.filter_quality());
233 EXPECT_EQ(250, key.target_size().width());
234 EXPECT_EQ(100, key.target_size().height());
235 EXPECT_FALSE(key.can_use_original_decode());
236 EXPECT_EQ(250u * 100u * 4u, key.locked_bytes());
237 }
238
239 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_49Scale) {
240 sk_sp<SkImage> image = CreateImage(500, 200);
241 bool is_decomposable = true;
242 SkFilterQuality quality = kMedium_SkFilterQuality;
243
244 DrawImage draw_image(
245 image, SkIRect::MakeWH(image->width(), image->height()), quality,
246 CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
247
248 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
249 EXPECT_EQ(image->uniqueID(), key.image_id());
250 EXPECT_EQ(quality, key.filter_quality());
251 EXPECT_EQ(250, key.target_size().width());
252 EXPECT_EQ(100, key.target_size().height());
253 EXPECT_FALSE(key.can_use_original_decode());
254 EXPECT_EQ(250u * 100u * 4u, key.locked_bytes());
255 }
256
257 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_1Scale) {
258 sk_sp<SkImage> image = CreateImage(500, 200);
259 bool is_decomposable = true;
260 SkFilterQuality quality = kMedium_SkFilterQuality;
261
262 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
263 quality,
264 CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable));
265
266 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
267 EXPECT_EQ(image->uniqueID(), key.image_id());
268 EXPECT_EQ(quality, key.filter_quality());
269 EXPECT_EQ(62, key.target_size().width());
270 EXPECT_EQ(25, key.target_size().height());
271 EXPECT_FALSE(key.can_use_original_decode());
272 EXPECT_EQ(62u * 25u * 4u, key.locked_bytes());
273 }
274
275 TEST(SoftwareImageDecodeControllerTest, ImageKeyMediumQualityAt0_01Scale) {
276 sk_sp<SkImage> image = CreateImage(500, 200);
277 bool is_decomposable = true;
278 SkFilterQuality quality = kMedium_SkFilterQuality;
279
280 DrawImage draw_image(
281 image, SkIRect::MakeWH(image->width(), image->height()), quality,
282 CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable));
283
284 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
285 EXPECT_EQ(image->uniqueID(), key.image_id());
286 EXPECT_EQ(quality, key.filter_quality());
287 EXPECT_EQ(7, key.target_size().width());
288 EXPECT_EQ(3, key.target_size().height());
289 EXPECT_FALSE(key.can_use_original_decode());
290 EXPECT_EQ(7u * 3u * 4u, key.locked_bytes());
291 }
292
167 TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQuality) { 293 TEST(SoftwareImageDecodeControllerTest, ImageKeyHighQuality) {
168 sk_sp<SkImage> image = CreateImage(100, 100); 294 sk_sp<SkImage> image = CreateImage(100, 100);
169 bool is_decomposable = true; 295 bool is_decomposable = true;
170 SkFilterQuality quality = kHigh_SkFilterQuality; 296 SkFilterQuality quality = kHigh_SkFilterQuality;
171 297
172 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 298 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
173 quality, 299 quality,
174 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable)); 300 CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable));
175 301
176 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); 302 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
(...skipping 14 matching lines...) Expand all
191 317
192 // At least one dimension should scale down, so that medium quality doesn't 318 // At least one dimension should scale down, so that medium quality doesn't
193 // become low. 319 // become low.
194 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 320 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
195 quality, 321 quality,
196 CreateMatrix(SkSize::Make(0.9f, 2.f), is_decomposable)); 322 CreateMatrix(SkSize::Make(0.9f, 2.f), is_decomposable));
197 323
198 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image); 324 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
199 EXPECT_EQ(image->uniqueID(), key.image_id()); 325 EXPECT_EQ(image->uniqueID(), key.image_id());
200 EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality()); 326 EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
201 EXPECT_EQ(4100, key.target_size().width()); 327 EXPECT_EQ(4555, key.target_size().width());
202 EXPECT_EQ(4096, key.target_size().height()); 328 EXPECT_EQ(2048, key.target_size().height());
203 EXPECT_FALSE(key.can_use_original_decode()); 329 EXPECT_FALSE(key.can_use_original_decode());
204 EXPECT_EQ(4100u * 4096u * 4u, key.locked_bytes()); 330 EXPECT_EQ(4555u * 2048u * 4u, key.locked_bytes());
205 } 331 }
206 332
207 TEST(SoftwareImageDecodeControllerTest, 333 TEST(SoftwareImageDecodeControllerTest,
208 ImageKeyHighQualityDropToLowIfNotDecomposable) { 334 ImageKeyHighQualityDropToLowIfNotDecomposable) {
209 sk_sp<SkImage> image = CreateImage(100, 100); 335 sk_sp<SkImage> image = CreateImage(100, 100);
210 bool is_decomposable = false; 336 bool is_decomposable = false;
211 SkFilterQuality quality = kHigh_SkFilterQuality; 337 SkFilterQuality quality = kHigh_SkFilterQuality;
212 338
213 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 339 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
214 quality, 340 quality,
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 EXPECT_TRUE(high_quality_task); 522 EXPECT_TRUE(high_quality_task);
397 523
398 DrawImage medium_quality_draw_image( 524 DrawImage medium_quality_draw_image(
399 image, SkIRect::MakeWH(image->width(), image->height()), 525 image, SkIRect::MakeWH(image->width(), image->height()),
400 kMedium_SkFilterQuality, 526 kMedium_SkFilterQuality,
401 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 527 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
402 scoped_refptr<TileTask> medium_quality_task; 528 scoped_refptr<TileTask> medium_quality_task;
403 need_unref = controller.GetTaskForImageAndRef( 529 need_unref = controller.GetTaskForImageAndRef(
404 medium_quality_draw_image, ImageDecodeController::TracingInfo(), 530 medium_quality_draw_image, ImageDecodeController::TracingInfo(),
405 &medium_quality_task); 531 &medium_quality_task);
406 // Medium quality isn't handled by the controller, so it won't ref it. Note 532 EXPECT_TRUE(need_unref);
407 // that this will change when medium quality is handled and will need to be
408 // updated.
409 EXPECT_FALSE(need_unref);
410 EXPECT_TRUE(medium_quality_task); 533 EXPECT_TRUE(medium_quality_task);
411 EXPECT_TRUE(high_quality_task.get() != medium_quality_task.get()); 534 EXPECT_TRUE(high_quality_task.get() != medium_quality_task.get());
412 535
413 DrawImage low_quality_draw_image( 536 DrawImage low_quality_draw_image(
414 image, SkIRect::MakeWH(image->width(), image->height()), 537 image, SkIRect::MakeWH(image->width(), image->height()),
415 kLow_SkFilterQuality, 538 kLow_SkFilterQuality,
416 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 539 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
417 scoped_refptr<TileTask> low_quality_task; 540 scoped_refptr<TileTask> low_quality_task;
418 need_unref = controller.GetTaskForImageAndRef( 541 need_unref = controller.GetTaskForImageAndRef(
419 low_quality_draw_image, ImageDecodeController::TracingInfo(), 542 low_quality_draw_image, ImageDecodeController::TracingInfo(),
420 &low_quality_task); 543 &low_quality_task);
421 EXPECT_TRUE(need_unref); 544 EXPECT_TRUE(need_unref);
422 EXPECT_TRUE(low_quality_task); 545 EXPECT_TRUE(low_quality_task);
423 EXPECT_TRUE(high_quality_task.get() != low_quality_task.get()); 546 EXPECT_TRUE(high_quality_task.get() != low_quality_task.get());
424 EXPECT_TRUE(medium_quality_task.get() != low_quality_task.get()); 547 EXPECT_TRUE(medium_quality_task.get() != low_quality_task.get());
425 548
426 controller.UnrefImage(high_quality_draw_image); 549 controller.UnrefImage(high_quality_draw_image);
550 controller.UnrefImage(medium_quality_draw_image);
427 controller.UnrefImage(low_quality_draw_image); 551 controller.UnrefImage(low_quality_draw_image);
428 } 552 }
429 553
430 TEST(SoftwareImageDecodeControllerTest, GetTaskForImageSameImageDifferentSize) { 554 TEST(SoftwareImageDecodeControllerTest, GetTaskForImageSameImageDifferentSize) {
431 SoftwareImageDecodeController controller; 555 SoftwareImageDecodeController controller;
432 sk_sp<SkImage> image = CreateImage(100, 100); 556 sk_sp<SkImage> image = CreateImage(100, 100);
433 bool is_decomposable = true; 557 bool is_decomposable = true;
434 SkFilterQuality quality = kHigh_SkFilterQuality; 558 SkFilterQuality quality = kHigh_SkFilterQuality;
435 559
436 DrawImage half_size_draw_image( 560 DrawImage half_size_draw_image(
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 EXPECT_TRUE(decoded_draw_image.image()); 1143 EXPECT_TRUE(decoded_draw_image.image());
1020 // If we decoded the image and cached it, it would be stored in a different 1144 // If we decoded the image and cached it, it would be stored in a different
1021 // SkImage object. 1145 // SkImage object.
1022 EXPECT_TRUE(decoded_draw_image.image() != image); 1146 EXPECT_TRUE(decoded_draw_image.image() != image);
1023 EXPECT_EQ(kNone_SkFilterQuality, decoded_draw_image.filter_quality()); 1147 EXPECT_EQ(kNone_SkFilterQuality, decoded_draw_image.filter_quality());
1024 EXPECT_TRUE(decoded_draw_image.is_scale_adjustment_identity()); 1148 EXPECT_TRUE(decoded_draw_image.is_scale_adjustment_identity());
1025 1149
1026 controller.DrawWithImageFinished(draw_image, decoded_draw_image); 1150 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1027 controller.UnrefImage(draw_image); 1151 controller.UnrefImage(draw_image);
1028 } 1152 }
1153
1154 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt01_5ScaleIsHandled) {
1155 SoftwareImageDecodeController controller;
1156 bool is_decomposable = true;
1157 SkFilterQuality quality = kMedium_SkFilterQuality;
1158
1159 sk_sp<SkImage> image = CreateImage(500, 200);
1160 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1161 quality,
1162 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
1163
1164 scoped_refptr<TileTask> task;
1165 bool need_unref = controller.GetTaskForImageAndRef(
1166 draw_image, ImageDecodeController::TracingInfo(), &task);
1167 EXPECT_TRUE(task);
1168 EXPECT_TRUE(need_unref);
1169
1170 DecodedDrawImage decoded_draw_image =
1171 controller.GetDecodedImageForDraw(draw_image);
1172 EXPECT_TRUE(decoded_draw_image.image());
1173 // If we decoded the image and cached it, it would be stored in a different
1174 // SkImageObject.
1175 EXPECT_TRUE(decoded_draw_image.image() != image);
1176 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1177 EXPECT_EQ(500, decoded_draw_image.image()->width());
1178 EXPECT_EQ(200, decoded_draw_image.image()->height());
1179
1180 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1181 controller.UnrefImage(draw_image);
1182 }
1183
1184 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt1_0ScaleIsHandled) {
1185 SoftwareImageDecodeController controller;
1186 bool is_decomposable = true;
1187 SkFilterQuality quality = kMedium_SkFilterQuality;
1188
1189 sk_sp<SkImage> image = CreateImage(500, 200);
1190 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1191 quality,
1192 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable));
1193
1194 scoped_refptr<TileTask> task;
1195 bool need_unref = controller.GetTaskForImageAndRef(
1196 draw_image, ImageDecodeController::TracingInfo(), &task);
1197 EXPECT_TRUE(task);
1198 EXPECT_TRUE(need_unref);
1199
1200 DecodedDrawImage decoded_draw_image =
1201 controller.GetDecodedImageForDraw(draw_image);
1202 EXPECT_TRUE(decoded_draw_image.image());
1203 // If we decoded the image and cached it, it would be stored in a different
1204 // SkImageObject.
1205 EXPECT_TRUE(decoded_draw_image.image() != image);
1206 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1207 EXPECT_EQ(500, decoded_draw_image.image()->width());
1208 EXPECT_EQ(200, decoded_draw_image.image()->height());
1209
1210 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1211 controller.UnrefImage(draw_image);
1212 }
1213
1214 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_75ScaleIsHandled) {
1215 SoftwareImageDecodeController controller;
1216 bool is_decomposable = true;
1217 SkFilterQuality quality = kMedium_SkFilterQuality;
1218
1219 sk_sp<SkImage> image = CreateImage(500, 200);
1220 DrawImage draw_image(
1221 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1222 CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable));
1223
1224 scoped_refptr<TileTask> task;
1225 bool need_unref = controller.GetTaskForImageAndRef(
1226 draw_image, ImageDecodeController::TracingInfo(), &task);
1227 EXPECT_TRUE(task);
1228 EXPECT_TRUE(need_unref);
1229
1230 DecodedDrawImage decoded_draw_image =
1231 controller.GetDecodedImageForDraw(draw_image);
1232 EXPECT_TRUE(decoded_draw_image.image());
1233 // If we decoded the image and cached it, it would be stored in a different
1234 // SkImageObject.
1235 EXPECT_TRUE(decoded_draw_image.image() != image);
1236 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1237 EXPECT_EQ(500, decoded_draw_image.image()->width());
1238 EXPECT_EQ(200, decoded_draw_image.image()->height());
1239
1240 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1241 controller.UnrefImage(draw_image);
1242 }
1243
1244 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_5ScaleIsHandled) {
1245 SoftwareImageDecodeController controller;
1246 bool is_decomposable = true;
1247 SkFilterQuality quality = kMedium_SkFilterQuality;
1248
1249 sk_sp<SkImage> image = CreateImage(500, 200);
1250 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1251 quality,
1252 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
1253
1254 scoped_refptr<TileTask> task;
1255 bool need_unref = controller.GetTaskForImageAndRef(
1256 draw_image, ImageDecodeController::TracingInfo(), &task);
1257 EXPECT_TRUE(task);
1258 EXPECT_TRUE(need_unref);
1259
1260 DecodedDrawImage decoded_draw_image =
1261 controller.GetDecodedImageForDraw(draw_image);
1262 EXPECT_TRUE(decoded_draw_image.image());
1263 // If we decoded the image and cached it, it would be stored in a different
1264 // SkImageObject.
1265 EXPECT_TRUE(decoded_draw_image.image() != image);
1266 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1267 EXPECT_EQ(250, decoded_draw_image.image()->width());
1268 EXPECT_EQ(100, decoded_draw_image.image()->height());
1269
1270 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1271 controller.UnrefImage(draw_image);
1272 }
1273
1274 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_49ScaleIsHandled) {
1275 SoftwareImageDecodeController controller;
1276 bool is_decomposable = true;
1277 SkFilterQuality quality = kMedium_SkFilterQuality;
1278
1279 sk_sp<SkImage> image = CreateImage(500, 200);
1280 DrawImage draw_image(
1281 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1282 CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
1283
1284 scoped_refptr<TileTask> task;
1285 bool need_unref = controller.GetTaskForImageAndRef(
1286 draw_image, ImageDecodeController::TracingInfo(), &task);
1287 EXPECT_TRUE(task);
1288 EXPECT_TRUE(need_unref);
1289
1290 DecodedDrawImage decoded_draw_image =
1291 controller.GetDecodedImageForDraw(draw_image);
1292 EXPECT_TRUE(decoded_draw_image.image());
1293 // If we decoded the image and cached it, it would be stored in a different
1294 // SkImageObject.
1295 EXPECT_TRUE(decoded_draw_image.image() != image);
1296 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1297 EXPECT_EQ(250, decoded_draw_image.image()->width());
1298 EXPECT_EQ(100, decoded_draw_image.image()->height());
1299
1300 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1301 controller.UnrefImage(draw_image);
1302 }
1303
1304 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_1ScaleIsHandled) {
1305 SoftwareImageDecodeController controller;
1306 bool is_decomposable = true;
1307 SkFilterQuality quality = kMedium_SkFilterQuality;
1308
1309 sk_sp<SkImage> image = CreateImage(500, 200);
1310 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1311 quality,
1312 CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable));
1313
1314 scoped_refptr<TileTask> task;
1315 bool need_unref = controller.GetTaskForImageAndRef(
1316 draw_image, ImageDecodeController::TracingInfo(), &task);
1317 EXPECT_TRUE(task);
1318 EXPECT_TRUE(need_unref);
1319
1320 DecodedDrawImage decoded_draw_image =
1321 controller.GetDecodedImageForDraw(draw_image);
1322 EXPECT_TRUE(decoded_draw_image.image());
1323 // If we decoded the image and cached it, it would be stored in a different
1324 // SkImageObject.
1325 EXPECT_TRUE(decoded_draw_image.image() != image);
1326 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1327 EXPECT_EQ(62, decoded_draw_image.image()->width());
1328 EXPECT_EQ(25, decoded_draw_image.image()->height());
1329
1330 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1331 controller.UnrefImage(draw_image);
1332 }
1333
1334 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_01ScaleIsHandled) {
1335 SoftwareImageDecodeController controller;
1336 bool is_decomposable = true;
1337 SkFilterQuality quality = kMedium_SkFilterQuality;
1338
1339 sk_sp<SkImage> image = CreateImage(500, 200);
1340 DrawImage draw_image(
1341 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1342 CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable));
1343
1344 scoped_refptr<TileTask> task;
1345 bool need_unref = controller.GetTaskForImageAndRef(
1346 draw_image, ImageDecodeController::TracingInfo(), &task);
1347 EXPECT_TRUE(task);
1348 EXPECT_TRUE(need_unref);
1349
1350 DecodedDrawImage decoded_draw_image =
1351 controller.GetDecodedImageForDraw(draw_image);
1352 EXPECT_TRUE(decoded_draw_image.image());
1353 // If we decoded the image and cached it, it would be stored in a different
1354 // SkImageObject.
1355 EXPECT_TRUE(decoded_draw_image.image() != image);
1356 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
1357 EXPECT_EQ(7, decoded_draw_image.image()->width());
1358 EXPECT_EQ(3, decoded_draw_image.image()->height());
1359
1360 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1361 controller.UnrefImage(draw_image);
1362 }
1363
1364 TEST(SoftwareImageDecodeControllerTest, MediumQualityAt0_001ScaleIsHandled) {
1365 SoftwareImageDecodeController controller;
1366 bool is_decomposable = true;
1367 SkFilterQuality quality = kMedium_SkFilterQuality;
1368
1369 sk_sp<SkImage> image = CreateImage(500, 200);
1370 DrawImage draw_image(
1371 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1372 CreateMatrix(SkSize::Make(0.001f, 0.001f), is_decomposable));
1373
1374 scoped_refptr<TileTask> task;
1375 bool need_unref = controller.GetTaskForImageAndRef(
1376 draw_image, ImageDecodeController::TracingInfo(), &task);
1377 EXPECT_FALSE(task);
1378 EXPECT_FALSE(need_unref);
1379
1380 DecodedDrawImage decoded_draw_image =
1381 controller.GetDecodedImageForDraw(draw_image);
1382 EXPECT_FALSE(decoded_draw_image.image());
1383
1384 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
1385 }
1386
1387 TEST(SoftwareImageDecodeControllerTest,
1388 MediumQualityImagesAreTheSameAt0_5And0_49Scale) {
1389 SoftwareImageDecodeController controller;
1390 bool is_decomposable = true;
1391 SkFilterQuality quality = kMedium_SkFilterQuality;
1392
1393 sk_sp<SkImage> image = CreateImage(500, 200);
1394 DrawImage draw_image_50(
1395 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1396 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
1397 DrawImage draw_image_49(
1398 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1399 CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable));
1400
1401 scoped_refptr<TileTask> task_50;
1402 bool need_unref_50 = controller.GetTaskForImageAndRef(
1403 draw_image_50, ImageDecodeController::TracingInfo(), &task_50);
1404 EXPECT_TRUE(task_50);
1405 EXPECT_TRUE(need_unref_50);
1406 scoped_refptr<TileTask> task_49;
1407 bool need_unref_49 = controller.GetTaskForImageAndRef(
1408 draw_image_49, ImageDecodeController::TracingInfo(), &task_49);
1409 EXPECT_TRUE(task_49);
1410 EXPECT_TRUE(need_unref_49);
1411
1412 DecodedDrawImage decoded_draw_image_50 =
1413 controller.GetDecodedImageForDraw(draw_image_50);
1414 EXPECT_TRUE(decoded_draw_image_50.image());
1415 DecodedDrawImage decoded_draw_image_49 =
1416 controller.GetDecodedImageForDraw(draw_image_49);
1417 EXPECT_TRUE(decoded_draw_image_49.image());
1418 // If we decoded the image and cached it, it would be stored in a different
1419 // SkImageObject.
1420 EXPECT_TRUE(decoded_draw_image_50.image() != image);
1421 EXPECT_TRUE(decoded_draw_image_49.image() != image);
1422 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image_50.filter_quality());
1423 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image_49.filter_quality());
1424 EXPECT_EQ(250, decoded_draw_image_50.image()->width());
1425 EXPECT_EQ(250, decoded_draw_image_49.image()->width());
1426 EXPECT_EQ(100, decoded_draw_image_50.image()->height());
1427 EXPECT_EQ(100, decoded_draw_image_49.image()->height());
1428
1429 EXPECT_EQ(decoded_draw_image_50.image(), decoded_draw_image_49.image());
1430
1431 controller.DrawWithImageFinished(draw_image_50, decoded_draw_image_50);
1432 controller.UnrefImage(draw_image_50);
1433 controller.DrawWithImageFinished(draw_image_49, decoded_draw_image_49);
1434 controller.UnrefImage(draw_image_49);
1435 }
1436
1029 } // namespace 1437 } // namespace
1030 } // namespace cc 1438 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/software_image_decode_controller.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698