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

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

Issue 1418573002: cc: Add image decode control in the compositor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 11 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/image_decode_controller.cc ('k') | cc/tiles/tile_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "cc/tiles/image_decode_controller.h"
6
7 #include "cc/playback/draw_image.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace cc {
11 namespace {
12
13 skia::RefPtr<SkImage> CreateImage(int width, int height) {
14 SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
15 SkBitmap bitmap;
16 bitmap.allocPixels(info);
17 return skia::AdoptRef(SkImage::NewFromBitmap(bitmap));
18 }
19
20 TEST(ImageDecodeControllerTest, ImageKeyLowQuality) {
21 skia::RefPtr<SkImage> image = CreateImage(100, 100);
22 bool has_perspective = false;
23 bool is_decomposable = true;
24 SkFilterQuality qualities[] = {kNone_SkFilterQuality, kLow_SkFilterQuality};
25 for (auto quality : qualities) {
26 DrawImage draw_image(
27 image.get(), SkIRect::MakeWH(image->width(), image->height()),
28 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
29
30 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
31 EXPECT_EQ(image->uniqueID(), key.image_id());
32 EXPECT_EQ(quality, key.filter_quality());
33 EXPECT_EQ(50, key.target_size().width());
34 EXPECT_EQ(150, key.target_size().height());
35 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
36 }
37 }
38
39 TEST(ImageDecodeControllerTest, ImageKeyMediumQuality) {
40 skia::RefPtr<SkImage> image = CreateImage(100, 100);
41 bool has_perspective = false;
42 bool is_decomposable = true;
43 SkFilterQuality quality = kMedium_SkFilterQuality;
44
45 DrawImage draw_image(
46 image.get(), SkIRect::MakeWH(image->width(), image->height()),
47 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
48
49 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
50 EXPECT_EQ(image->uniqueID(), key.image_id());
51 EXPECT_EQ(quality, key.filter_quality());
52 EXPECT_EQ(50, key.target_size().width());
53 EXPECT_EQ(150, key.target_size().height());
54 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
55 }
56
57 TEST(ImageDecodeControllerTest, ImageKeyMediumQualityEvenWithPerspective) {
58 skia::RefPtr<SkImage> image = CreateImage(100, 100);
59 bool has_perspective = true;
60 bool is_decomposable = true;
61 SkFilterQuality quality = kMedium_SkFilterQuality;
62
63 DrawImage draw_image(
64 image.get(), SkIRect::MakeWH(image->width(), image->height()),
65 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
66
67 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
68 EXPECT_EQ(image->uniqueID(), key.image_id());
69 EXPECT_EQ(quality, key.filter_quality());
70 EXPECT_EQ(50, key.target_size().width());
71 EXPECT_EQ(150, key.target_size().height());
72 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
73 }
74
75 TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfEnlarging) {
76 skia::RefPtr<SkImage> image = CreateImage(100, 100);
77 bool has_perspective = false;
78 bool is_decomposable = true;
79 SkFilterQuality quality = kMedium_SkFilterQuality;
80
81 DrawImage draw_image(
82 image.get(), SkIRect::MakeWH(image->width(), image->height()),
83 SkSize::Make(1.5f, 1.5f), quality, has_perspective, is_decomposable);
84
85 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
86 EXPECT_EQ(image->uniqueID(), key.image_id());
87 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
88 EXPECT_EQ(150, key.target_size().width());
89 EXPECT_EQ(150, key.target_size().height());
90 EXPECT_EQ(150u * 150u * 4u, key.target_bytes());
91 }
92
93 TEST(ImageDecodeControllerTest, ImageKeyMediumQualityDropToLowIfIdentity) {
94 skia::RefPtr<SkImage> image = CreateImage(100, 100);
95 bool has_perspective = false;
96 bool is_decomposable = true;
97 SkFilterQuality quality = kMedium_SkFilterQuality;
98
99 DrawImage draw_image(
100 image.get(), SkIRect::MakeWH(image->width(), image->height()),
101 SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable);
102
103 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
104 EXPECT_EQ(image->uniqueID(), key.image_id());
105 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
106 EXPECT_EQ(100, key.target_size().width());
107 EXPECT_EQ(100, key.target_size().height());
108 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
109 }
110
111 TEST(ImageDecodeControllerTest,
112 ImageKeyMediumQualityDropToLowIfNearlyIdentity) {
113 skia::RefPtr<SkImage> image = CreateImage(100, 100);
114 bool has_perspective = false;
115 bool is_decomposable = true;
116 SkFilterQuality quality = kMedium_SkFilterQuality;
117
118 DrawImage draw_image(
119 image.get(), SkIRect::MakeWH(image->width(), image->height()),
120 SkSize::Make(1.001f, 1.001f), quality, has_perspective, is_decomposable);
121
122 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
123 EXPECT_EQ(image->uniqueID(), key.image_id());
124 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
125 EXPECT_EQ(100, key.target_size().width());
126 EXPECT_EQ(100, key.target_size().height());
127 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
128 }
129
130 TEST(ImageDecodeControllerTest,
131 ImageKeyMediumQualityDropToLowIfNearlyIdentity2) {
132 skia::RefPtr<SkImage> image = CreateImage(100, 100);
133 bool has_perspective = false;
134 bool is_decomposable = true;
135 SkFilterQuality quality = kMedium_SkFilterQuality;
136
137 DrawImage draw_image(
138 image.get(), SkIRect::MakeWH(image->width(), image->height()),
139 SkSize::Make(0.999f, 0.999f), quality, has_perspective, is_decomposable);
140
141 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
142 EXPECT_EQ(image->uniqueID(), key.image_id());
143 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
144 EXPECT_EQ(100, key.target_size().width());
145 EXPECT_EQ(100, key.target_size().height());
146 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
147 }
148
149 TEST(ImageDecodeControllerTest,
150 ImageKeyMediumQualityDropToLowIfNotDecomposable) {
151 skia::RefPtr<SkImage> image = CreateImage(100, 100);
152 bool has_perspective = false;
153 bool is_decomposable = false;
154 SkFilterQuality quality = kMedium_SkFilterQuality;
155
156 DrawImage draw_image(
157 image.get(), SkIRect::MakeWH(image->width(), image->height()),
158 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
159
160 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
161 EXPECT_EQ(image->uniqueID(), key.image_id());
162 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
163 EXPECT_EQ(50, key.target_size().width());
164 EXPECT_EQ(150, key.target_size().height());
165 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
166 }
167
168 TEST(ImageDecodeControllerTest, ImageKeyHighQuality) {
169 skia::RefPtr<SkImage> image = CreateImage(100, 100);
170 bool has_perspective = false;
171 bool is_decomposable = true;
172 SkFilterQuality quality = kHigh_SkFilterQuality;
173
174 DrawImage draw_image(
175 image.get(), SkIRect::MakeWH(image->width(), image->height()),
176 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
177
178 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
179 EXPECT_EQ(image->uniqueID(), key.image_id());
180 EXPECT_EQ(quality, key.filter_quality());
181 EXPECT_EQ(50, key.target_size().width());
182 EXPECT_EQ(150, key.target_size().height());
183 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
184 }
185
186 TEST(ImageDecodeControllerTest,
187 ImageKeyHighQualityDropToMediumWithPerspective) {
188 skia::RefPtr<SkImage> image = CreateImage(100, 100);
189 bool has_perspective = true;
190 bool is_decomposable = true;
191 SkFilterQuality quality = kHigh_SkFilterQuality;
192
193 DrawImage draw_image(
194 image.get(), SkIRect::MakeWH(image->width(), image->height()),
195 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
196
197 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
198 EXPECT_EQ(image->uniqueID(), key.image_id());
199 EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
200 EXPECT_EQ(50, key.target_size().width());
201 EXPECT_EQ(150, key.target_size().height());
202 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
203 }
204
205 TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToMediumIfTooLarge) {
206 // Just over 64MB when scaled.
207 skia::RefPtr<SkImage> image = CreateImage(4555, 2048);
208 bool has_perspective = false;
209 bool is_decomposable = true;
210 SkFilterQuality quality = kHigh_SkFilterQuality;
211
212 // At least one dimension should scale down, so that medium quality doesn't
213 // become low.
214 DrawImage draw_image(
215 image.get(), SkIRect::MakeWH(image->width(), image->height()),
216 SkSize::Make(0.9f, 2.f), quality, has_perspective, is_decomposable);
217
218 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
219 EXPECT_EQ(image->uniqueID(), key.image_id());
220 EXPECT_EQ(kMedium_SkFilterQuality, key.filter_quality());
221 EXPECT_EQ(4100, key.target_size().width());
222 EXPECT_EQ(4096, key.target_size().height());
223 EXPECT_EQ(4100u * 4096u * 4u, key.target_bytes());
224 }
225
226 TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNotDecomposable) {
227 skia::RefPtr<SkImage> image = CreateImage(100, 100);
228 bool has_perspective = false;
229 bool is_decomposable = false;
230 SkFilterQuality quality = kHigh_SkFilterQuality;
231
232 DrawImage draw_image(
233 image.get(), SkIRect::MakeWH(image->width(), image->height()),
234 SkSize::Make(0.5f, 1.5f), quality, has_perspective, is_decomposable);
235
236 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
237 EXPECT_EQ(image->uniqueID(), key.image_id());
238 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
239 EXPECT_EQ(50, key.target_size().width());
240 EXPECT_EQ(150, key.target_size().height());
241 EXPECT_EQ(50u * 150u * 4u, key.target_bytes());
242 }
243
244 TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfIdentity) {
245 skia::RefPtr<SkImage> image = CreateImage(100, 100);
246 bool has_perspective = false;
247 bool is_decomposable = true;
248 SkFilterQuality quality = kHigh_SkFilterQuality;
249
250 DrawImage draw_image(
251 image.get(), SkIRect::MakeWH(image->width(), image->height()),
252 SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable);
253
254 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
255 EXPECT_EQ(image->uniqueID(), key.image_id());
256 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
257 EXPECT_EQ(100, key.target_size().width());
258 EXPECT_EQ(100, key.target_size().height());
259 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
260 }
261
262 TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity) {
263 skia::RefPtr<SkImage> image = CreateImage(100, 100);
264 bool has_perspective = false;
265 bool is_decomposable = true;
266 SkFilterQuality quality = kHigh_SkFilterQuality;
267
268 DrawImage draw_image(
269 image.get(), SkIRect::MakeWH(image->width(), image->height()),
270 SkSize::Make(1.001f, 1.001f), quality, has_perspective, is_decomposable);
271
272 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
273 EXPECT_EQ(image->uniqueID(), key.image_id());
274 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
275 EXPECT_EQ(100, key.target_size().width());
276 EXPECT_EQ(100, key.target_size().height());
277 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
278 }
279
280 TEST(ImageDecodeControllerTest, ImageKeyHighQualityDropToLowIfNearlyIdentity2) {
281 skia::RefPtr<SkImage> image = CreateImage(100, 100);
282 bool has_perspective = false;
283 bool is_decomposable = true;
284 SkFilterQuality quality = kHigh_SkFilterQuality;
285
286 DrawImage draw_image(
287 image.get(), SkIRect::MakeWH(image->width(), image->height()),
288 SkSize::Make(0.999f, 0.999f), quality, has_perspective, is_decomposable);
289
290 auto key = ImageDecodeControllerKey::FromDrawImage(draw_image);
291 EXPECT_EQ(image->uniqueID(), key.image_id());
292 EXPECT_EQ(kLow_SkFilterQuality, key.filter_quality());
293 EXPECT_EQ(100, key.target_size().width());
294 EXPECT_EQ(100, key.target_size().height());
295 EXPECT_EQ(100u * 100u * 4u, key.target_bytes());
296 }
297
298 TEST(ImageDecodeControllerTest, GetTaskForImageSameImage) {
299 ImageDecodeController controller;
300 skia::RefPtr<SkImage> image = CreateImage(100, 100);
301 bool has_perspective = false;
302 bool is_decomposable = true;
303 SkFilterQuality quality = kHigh_SkFilterQuality;
304 uint64_t prepare_tiles_id = 1;
305
306 DrawImage draw_image(
307 image.get(), SkIRect::MakeWH(image->width(), image->height()),
308 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
309 scoped_refptr<ImageDecodeTask> task;
310 bool need_unref =
311 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
312 EXPECT_TRUE(need_unref);
313 EXPECT_TRUE(task);
314
315 DrawImage another_draw_image(
316 image.get(), SkIRect::MakeWH(image->width(), image->height()),
317 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
318 scoped_refptr<ImageDecodeTask> another_task;
319 need_unref = controller.GetTaskForImageAndRef(
320 another_draw_image, prepare_tiles_id, &another_task);
321 EXPECT_TRUE(need_unref);
322 EXPECT_TRUE(task.get() == another_task.get());
323
324 controller.UnrefImage(draw_image);
325 controller.UnrefImage(draw_image);
326 }
327
328 TEST(ImageDecodeControllerTest, GetTaskForImageSameImageDifferentQuality) {
329 ImageDecodeController controller;
330 skia::RefPtr<SkImage> image = CreateImage(100, 100);
331 bool has_perspective = false;
332 bool is_decomposable = true;
333 uint64_t prepare_tiles_id = 1;
334
335 DrawImage high_quality_draw_image(
336 image.get(), SkIRect::MakeWH(image->width(), image->height()),
337 SkSize::Make(0.5f, 0.5f), kHigh_SkFilterQuality, has_perspective,
338 is_decomposable);
339 scoped_refptr<ImageDecodeTask> high_quality_task;
340 bool need_unref = controller.GetTaskForImageAndRef(
341 high_quality_draw_image, prepare_tiles_id, &high_quality_task);
342 EXPECT_TRUE(need_unref);
343 EXPECT_TRUE(high_quality_task);
344
345 DrawImage medium_quality_draw_image(
346 image.get(), SkIRect::MakeWH(image->width(), image->height()),
347 SkSize::Make(0.5f, 0.5f), kMedium_SkFilterQuality, has_perspective,
348 is_decomposable);
349 scoped_refptr<ImageDecodeTask> medium_quality_task;
350 need_unref = controller.GetTaskForImageAndRef(
351 medium_quality_draw_image, prepare_tiles_id, &medium_quality_task);
352 // Medium quality isn't handled by the controller, so it won't ref it. Note
353 // that this will change when medium quality is handled and will need to be
354 // updated.
355 EXPECT_FALSE(need_unref);
356 EXPECT_TRUE(medium_quality_task);
357 EXPECT_TRUE(high_quality_task.get() != medium_quality_task.get());
358
359 DrawImage low_quality_draw_image(
360 image.get(), SkIRect::MakeWH(image->width(), image->height()),
361 SkSize::Make(0.5f, 0.5f), kLow_SkFilterQuality, has_perspective,
362 is_decomposable);
363 scoped_refptr<ImageDecodeTask> low_quality_task;
364 need_unref = controller.GetTaskForImageAndRef(
365 low_quality_draw_image, prepare_tiles_id, &low_quality_task);
366 // Note that when we pin the original decode, we might ref low quality images
367 // too, but we don't support that right now.
368 EXPECT_FALSE(need_unref);
369 EXPECT_TRUE(low_quality_task);
370 EXPECT_TRUE(high_quality_task.get() != low_quality_task.get());
371 EXPECT_TRUE(medium_quality_task.get() != low_quality_task.get());
372
373 controller.UnrefImage(high_quality_draw_image);
374 }
375
376 TEST(ImageDecodeControllerTest, GetTaskForImageSameImageDifferentSize) {
377 ImageDecodeController controller;
378 skia::RefPtr<SkImage> image = CreateImage(100, 100);
379 bool has_perspective = false;
380 bool is_decomposable = true;
381 uint64_t prepare_tiles_id = 1;
382 SkFilterQuality quality = kHigh_SkFilterQuality;
383
384 DrawImage half_size_draw_image(
385 image.get(), SkIRect::MakeWH(image->width(), image->height()),
386 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
387 scoped_refptr<ImageDecodeTask> half_size_task;
388 bool need_unref = controller.GetTaskForImageAndRef(
389 half_size_draw_image, prepare_tiles_id, &half_size_task);
390 EXPECT_TRUE(need_unref);
391 EXPECT_TRUE(half_size_task);
392
393 DrawImage quarter_size_draw_image(
394 image.get(), SkIRect::MakeWH(image->width(), image->height()),
395 SkSize::Make(0.25f, 0.25f), quality, has_perspective, is_decomposable);
396 scoped_refptr<ImageDecodeTask> quarter_size_task;
397 need_unref = controller.GetTaskForImageAndRef(
398 quarter_size_draw_image, prepare_tiles_id, &quarter_size_task);
399 EXPECT_TRUE(need_unref);
400 EXPECT_TRUE(quarter_size_task);
401 EXPECT_TRUE(half_size_task.get() != quarter_size_task.get());
402
403 controller.UnrefImage(half_size_draw_image);
404 controller.UnrefImage(quarter_size_draw_image);
405 }
406
407 TEST(ImageDecodeControllerTest, GetTaskForImageDifferentImage) {
408 ImageDecodeController controller;
409 bool has_perspective = false;
410 bool is_decomposable = true;
411 uint64_t prepare_tiles_id = 1;
412 SkFilterQuality quality = kHigh_SkFilterQuality;
413
414 skia::RefPtr<SkImage> first_image = CreateImage(100, 100);
415 DrawImage first_draw_image(
416 first_image.get(),
417 SkIRect::MakeWH(first_image->width(), first_image->height()),
418 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
419 scoped_refptr<ImageDecodeTask> first_task;
420 bool need_unref = controller.GetTaskForImageAndRef(
421 first_draw_image, prepare_tiles_id, &first_task);
422 EXPECT_TRUE(need_unref);
423 EXPECT_TRUE(first_task);
424
425 skia::RefPtr<SkImage> second_image = CreateImage(100, 100);
426 DrawImage second_draw_image(
427 second_image.get(),
428 SkIRect::MakeWH(second_image->width(), second_image->height()),
429 SkSize::Make(0.25f, 0.25f), quality, has_perspective, is_decomposable);
430 scoped_refptr<ImageDecodeTask> second_task;
431 need_unref = controller.GetTaskForImageAndRef(second_draw_image,
432 prepare_tiles_id, &second_task);
433 EXPECT_TRUE(need_unref);
434 EXPECT_TRUE(second_task);
435 EXPECT_TRUE(first_task.get() != second_task.get());
436
437 controller.UnrefImage(first_draw_image);
438 controller.UnrefImage(second_draw_image);
439 }
440
441 TEST(ImageDecodeControllerTest, GetTaskForImageAlreadyDecoded) {
442 ImageDecodeController controller;
443 bool has_perspective = false;
444 bool is_decomposable = true;
445 uint64_t prepare_tiles_id = 1;
446 SkFilterQuality quality = kHigh_SkFilterQuality;
447
448 skia::RefPtr<SkImage> image = CreateImage(100, 100);
449 DrawImage draw_image(
450 image.get(), SkIRect::MakeWH(image->width(), image->height()),
451 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
452 scoped_refptr<ImageDecodeTask> task;
453 bool need_unref =
454 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
455 EXPECT_TRUE(need_unref);
456 EXPECT_TRUE(task);
457
458 task->WillSchedule();
459 task->ScheduleOnOriginThread(nullptr);
460 task->DidSchedule();
461 task->RunOnWorkerThread();
462
463 scoped_refptr<ImageDecodeTask> another_task;
464 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
465 &another_task);
466 EXPECT_TRUE(need_unref);
467 EXPECT_FALSE(another_task);
468
469 task->WillComplete();
470 task->CompleteOnOriginThread(nullptr);
471 task->DidComplete();
472
473 controller.UnrefImage(draw_image);
474 controller.UnrefImage(draw_image);
475 }
476
477 TEST(ImageDecodeControllerTest, GetTaskForImageAlreadyPrerolled) {
478 ImageDecodeController controller;
479 bool has_perspective = false;
480 bool is_decomposable = true;
481 uint64_t prepare_tiles_id = 1;
482 SkFilterQuality quality = kLow_SkFilterQuality;
483
484 skia::RefPtr<SkImage> image = CreateImage(100, 100);
485 DrawImage draw_image(
486 image.get(), SkIRect::MakeWH(image->width(), image->height()),
487 SkSize::Make(1.f, 1.f), quality, has_perspective, is_decomposable);
488 scoped_refptr<ImageDecodeTask> task;
489 bool need_unref =
490 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
491 // We're not currently locking original scale or low quality images.
492 EXPECT_FALSE(need_unref);
493 EXPECT_TRUE(task);
494
495 task->WillSchedule();
496 task->ScheduleOnOriginThread(nullptr);
497 task->DidSchedule();
498 task->RunOnWorkerThread();
499
500 scoped_refptr<ImageDecodeTask> another_task;
501 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
502 &another_task);
503 EXPECT_FALSE(need_unref);
504 EXPECT_FALSE(another_task);
505
506 task->WillComplete();
507 task->CompleteOnOriginThread(nullptr);
508 task->DidComplete();
509
510 scoped_refptr<ImageDecodeTask> third_task;
511 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
512 &third_task);
513 EXPECT_FALSE(need_unref);
514 EXPECT_FALSE(third_task);
515 }
516
517 TEST(ImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) {
518 ImageDecodeController controller;
519 bool has_perspective = false;
520 bool is_decomposable = true;
521 uint64_t prepare_tiles_id = 1;
522 SkFilterQuality quality = kHigh_SkFilterQuality;
523
524 skia::RefPtr<SkImage> image = CreateImage(100, 100);
525 DrawImage draw_image(
526 image.get(), SkIRect::MakeWH(image->width(), image->height()),
527 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
528 scoped_refptr<ImageDecodeTask> task;
529 bool need_unref =
530 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
531 EXPECT_TRUE(need_unref);
532 EXPECT_TRUE(task);
533
534 task->WillSchedule();
535 task->ScheduleOnOriginThread(nullptr);
536 task->DidSchedule();
537
538 scoped_refptr<ImageDecodeTask> another_task;
539 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
540 &another_task);
541 EXPECT_TRUE(need_unref);
542 EXPECT_TRUE(another_task.get() == task.get());
543
544 // Didn't run the task, complete it (it was canceled).
545 task->WillComplete();
546 task->CompleteOnOriginThread(nullptr);
547 task->DidComplete();
548
549 // Fully cancel everything (so the raster would unref things).
550 controller.UnrefImage(draw_image);
551 controller.UnrefImage(draw_image);
552
553 // Here a new task is created.
554 scoped_refptr<ImageDecodeTask> third_task;
555 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
556 &third_task);
557 EXPECT_TRUE(need_unref);
558 EXPECT_TRUE(third_task);
559 EXPECT_FALSE(third_task.get() == task.get());
560
561 controller.UnrefImage(draw_image);
562 }
563
564 TEST(ImageDecodeControllerTest, GetTaskForImageCanceledWhileReffedGetsNewTask) {
565 ImageDecodeController controller;
566 bool has_perspective = false;
567 bool is_decomposable = true;
568 uint64_t prepare_tiles_id = 1;
569 SkFilterQuality quality = kHigh_SkFilterQuality;
570
571 skia::RefPtr<SkImage> image = CreateImage(100, 100);
572 DrawImage draw_image(
573 image.get(), SkIRect::MakeWH(image->width(), image->height()),
574 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
575 scoped_refptr<ImageDecodeTask> task;
576 bool need_unref =
577 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
578 EXPECT_TRUE(need_unref);
579 EXPECT_TRUE(task);
580
581 task->WillSchedule();
582 task->ScheduleOnOriginThread(nullptr);
583 task->DidSchedule();
584
585 scoped_refptr<ImageDecodeTask> another_task;
586 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
587 &another_task);
588 EXPECT_TRUE(need_unref);
589 EXPECT_TRUE(another_task.get() == task.get());
590
591 // Didn't run the task, complete it (it was canceled).
592 task->WillComplete();
593 task->CompleteOnOriginThread(nullptr);
594 task->DidComplete();
595
596 // Note that here, everything is reffed, but a new task is created. This is
597 // possible with repeated schedule/cancel operations.
598 scoped_refptr<ImageDecodeTask> third_task;
599 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id,
600 &third_task);
601 EXPECT_TRUE(need_unref);
602 EXPECT_TRUE(third_task);
603 EXPECT_FALSE(third_task.get() == task.get());
604
605 // 3 Unrefs!
606 controller.UnrefImage(draw_image);
607 controller.UnrefImage(draw_image);
608 controller.UnrefImage(draw_image);
609 }
610
611 TEST(ImageDecodeControllerTest, GetDecodedImageForDraw) {
612 ImageDecodeController controller;
613 bool has_perspective = false;
614 bool is_decomposable = true;
615 uint64_t prepare_tiles_id = 1;
616 SkFilterQuality quality = kHigh_SkFilterQuality;
617
618 skia::RefPtr<SkImage> image = CreateImage(100, 100);
619 DrawImage draw_image(
620 image.get(), SkIRect::MakeWH(image->width(), image->height()),
621 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
622 scoped_refptr<ImageDecodeTask> task;
623 bool need_unref =
624 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
625 EXPECT_TRUE(need_unref);
626 EXPECT_TRUE(task);
627
628 task->WillSchedule();
629 task->ScheduleOnOriginThread(nullptr);
630 task->DidSchedule();
631
632 task->RunOnWorkerThread();
633
634 task->WillComplete();
635 task->CompleteOnOriginThread(nullptr);
636 task->DidComplete();
637
638 DecodedDrawImage decoded_draw_image =
639 controller.GetDecodedImageForDraw(draw_image);
640 EXPECT_TRUE(decoded_draw_image.image());
641 EXPECT_EQ(50, decoded_draw_image.image()->width());
642 EXPECT_EQ(50, decoded_draw_image.image()->height());
643 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
644 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
645 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
646 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
647 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode());
648
649 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
650 controller.UnrefImage(draw_image);
651 }
652
653 TEST(ImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecode) {
654 ImageDecodeController controller;
655 bool has_perspective = false;
656 bool is_decomposable = true;
657 SkFilterQuality quality = kHigh_SkFilterQuality;
658
659 skia::RefPtr<SkImage> image = CreateImage(100, 100);
660 DrawImage draw_image(
661 image.get(), SkIRect::MakeWH(image->width(), image->height()),
662 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
663
664 DecodedDrawImage decoded_draw_image =
665 controller.GetDecodedImageForDraw(draw_image);
666 EXPECT_TRUE(decoded_draw_image.image());
667 EXPECT_EQ(50, decoded_draw_image.image()->width());
668 EXPECT_EQ(50, decoded_draw_image.image()->height());
669 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
670 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
671 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
672 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
673 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
674
675 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
676 }
677
678 TEST(ImageDecodeControllerTest,
679 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) {
680 ImageDecodeController controller;
681 bool has_perspective = false;
682 bool is_decomposable = true;
683 SkFilterQuality quality = kHigh_SkFilterQuality;
684
685 skia::RefPtr<SkImage> image = CreateImage(100, 100);
686 DrawImage draw_image(
687 image.get(), SkIRect::MakeWH(image->width(), image->height()),
688 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
689
690 DecodedDrawImage decoded_draw_image =
691 controller.GetDecodedImageForDraw(draw_image);
692 EXPECT_TRUE(decoded_draw_image.image());
693 EXPECT_EQ(50, decoded_draw_image.image()->width());
694 EXPECT_EQ(50, decoded_draw_image.image()->height());
695 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
696 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
697 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
698 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
699 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
700
701 DecodedDrawImage another_decoded_draw_image =
702 controller.GetDecodedImageForDraw(draw_image);
703 EXPECT_EQ(decoded_draw_image.image()->uniqueID(),
704 another_decoded_draw_image.image()->uniqueID());
705
706 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
707 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image);
708 }
709
710 TEST(ImageDecodeControllerTest,
711 GetDecodedImageForDrawAtRasterDecodeDoesNotPreventTasks) {
712 ImageDecodeController controller;
713 bool has_perspective = false;
714 bool is_decomposable = true;
715 uint64_t prepare_tiles_id = 1;
716 SkFilterQuality quality = kHigh_SkFilterQuality;
717
718 skia::RefPtr<SkImage> image = CreateImage(100, 100);
719 DrawImage draw_image(
720 image.get(), SkIRect::MakeWH(image->width(), image->height()),
721 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
722
723 DecodedDrawImage decoded_draw_image =
724 controller.GetDecodedImageForDraw(draw_image);
725 EXPECT_TRUE(decoded_draw_image.image());
726 EXPECT_EQ(50, decoded_draw_image.image()->width());
727 EXPECT_EQ(50, decoded_draw_image.image()->height());
728 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
729 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
730 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
731 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
732 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
733
734 scoped_refptr<ImageDecodeTask> task;
735 bool need_unref =
736 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
737 EXPECT_TRUE(need_unref);
738 EXPECT_TRUE(task);
739
740 task->WillSchedule();
741 task->ScheduleOnOriginThread(nullptr);
742 task->DidSchedule();
743
744 task->RunOnWorkerThread();
745
746 task->WillComplete();
747 task->CompleteOnOriginThread(nullptr);
748 task->DidComplete();
749
750 DecodedDrawImage another_decoded_draw_image =
751 controller.GetDecodedImageForDraw(draw_image);
752 // This should get the new decoded/locked image, not the one we're using at
753 // raster.
754 // TODO(vmpstr): We can possibly optimize this so that the decode simply moves
755 // the image to the right spot.
756 EXPECT_NE(decoded_draw_image.image()->uniqueID(),
757 another_decoded_draw_image.image()->uniqueID());
758 EXPECT_FALSE(another_decoded_draw_image.is_at_raster_decode());
759
760 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
761 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image);
762 controller.UnrefImage(draw_image);
763 }
764
765 TEST(ImageDecodeControllerTest,
766 GetDecodedImageForDrawAtRasterDecodeIsUsedForLockedCache) {
767 ImageDecodeController controller;
768 bool has_perspective = false;
769 bool is_decomposable = true;
770 uint64_t prepare_tiles_id = 1;
771 SkFilterQuality quality = kHigh_SkFilterQuality;
772
773 skia::RefPtr<SkImage> image = CreateImage(100, 100);
774 DrawImage draw_image(
775 image.get(), SkIRect::MakeWH(image->width(), image->height()),
776 SkSize::Make(0.5f, 0.5f), quality, has_perspective, is_decomposable);
777
778 DecodedDrawImage decoded_draw_image =
779 controller.GetDecodedImageForDraw(draw_image);
780 EXPECT_TRUE(decoded_draw_image.image());
781 EXPECT_EQ(50, decoded_draw_image.image()->width());
782 EXPECT_EQ(50, decoded_draw_image.image()->height());
783 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().width());
784 EXPECT_FLOAT_EQ(0.5f, decoded_draw_image.scale_adjustment().height());
785 EXPECT_EQ(kLow_SkFilterQuality, decoded_draw_image.filter_quality());
786 EXPECT_FALSE(decoded_draw_image.is_scale_adjustment_identity());
787 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
788
789 scoped_refptr<ImageDecodeTask> task;
790 bool need_unref =
791 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task);
792 EXPECT_TRUE(need_unref);
793 EXPECT_TRUE(task);
794
795 task->WillSchedule();
796 task->ScheduleOnOriginThread(nullptr);
797 task->DidSchedule();
798
799 // If we finish the draw here, then we will use it for the locked decode
800 // instead of decoding again.
801 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
802
803 task->RunOnWorkerThread();
804
805 task->WillComplete();
806 task->CompleteOnOriginThread(nullptr);
807 task->DidComplete();
808
809 DecodedDrawImage another_decoded_draw_image =
810 controller.GetDecodedImageForDraw(draw_image);
811 // This should get the decoded/locked image which we originally decoded at
812 // raster time, since it's now in the locked cache.
813 EXPECT_EQ(decoded_draw_image.image()->uniqueID(),
814 another_decoded_draw_image.image()->uniqueID());
815 EXPECT_FALSE(another_decoded_draw_image.is_at_raster_decode());
816
817 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image);
818 controller.UnrefImage(draw_image);
819 }
820
821 } // namespace
822 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/image_decode_controller.cc ('k') | cc/tiles/tile_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698