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

Side by Side Diff: cc/playback/display_item_list_unittest.cc

Issue 1869753003: Replace many skia::RefPtr with sk_sp<> in cc/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Florin's nits 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/playback/display_item_list.cc ('k') | cc/playback/filter_display_item.cc » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/playback/display_item_list.h" 5 #include "cc/playback/display_item_list.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "cc/output/filter_operation.h" 12 #include "cc/output/filter_operation.h"
13 #include "cc/output/filter_operations.h" 13 #include "cc/output/filter_operations.h"
14 #include "cc/playback/clip_display_item.h" 14 #include "cc/playback/clip_display_item.h"
15 #include "cc/playback/clip_path_display_item.h" 15 #include "cc/playback/clip_path_display_item.h"
16 #include "cc/playback/compositing_display_item.h" 16 #include "cc/playback/compositing_display_item.h"
17 #include "cc/playback/display_item_list_settings.h" 17 #include "cc/playback/display_item_list_settings.h"
18 #include "cc/playback/drawing_display_item.h" 18 #include "cc/playback/drawing_display_item.h"
19 #include "cc/playback/filter_display_item.h" 19 #include "cc/playback/filter_display_item.h"
20 #include "cc/playback/float_clip_display_item.h" 20 #include "cc/playback/float_clip_display_item.h"
21 #include "cc/playback/transform_display_item.h" 21 #include "cc/playback/transform_display_item.h"
22 #include "cc/proto/display_item.pb.h" 22 #include "cc/proto/display_item.pb.h"
23 #include "cc/test/fake_image_serialization_processor.h" 23 #include "cc/test/fake_image_serialization_processor.h"
24 #include "cc/test/skia_common.h" 24 #include "cc/test/skia_common.h"
25 #include "skia/ext/refptr.h"
26 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
27 #include "third_party/skia/include/core/SkBitmap.h" 26 #include "third_party/skia/include/core/SkBitmap.h"
28 #include "third_party/skia/include/core/SkCanvas.h" 27 #include "third_party/skia/include/core/SkCanvas.h"
29 #include "third_party/skia/include/core/SkColor.h" 28 #include "third_party/skia/include/core/SkColor.h"
30 #include "third_party/skia/include/core/SkPictureRecorder.h" 29 #include "third_party/skia/include/core/SkPictureRecorder.h"
31 #include "third_party/skia/include/core/SkSurface.h" 30 #include "third_party/skia/include/core/SkSurface.h"
32 #include "third_party/skia/include/core/SkXfermode.h" 31 #include "third_party/skia/include/core/SkXfermode.h"
33 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" 32 #include "third_party/skia/include/effects/SkColorMatrixFilter.h"
34 #include "third_party/skia/include/effects/SkImageSource.h" 33 #include "third_party/skia/include/effects/SkImageSource.h"
35 #include "third_party/skia/include/utils/SkPictureUtils.h" 34 #include "third_party/skia/include/utils/SkPictureUtils.h"
36 #include "ui/gfx/geometry/rect.h" 35 #include "ui/gfx/geometry/rect.h"
37 #include "ui/gfx/geometry/rect_conversions.h" 36 #include "ui/gfx/geometry/rect_conversions.h"
38 #include "ui/gfx/skia_util.h" 37 #include "ui/gfx/skia_util.h"
39 38
40 namespace cc { 39 namespace cc {
41 40
42 namespace { 41 namespace {
43 42
44 const gfx::Rect kVisualRect(0, 0, 42, 42); 43 const gfx::Rect kVisualRect(0, 0, 42, 42);
45 44
46 void AppendFirstSerializationTestPicture(scoped_refptr<DisplayItemList> list, 45 void AppendFirstSerializationTestPicture(scoped_refptr<DisplayItemList> list,
47 const gfx::Size& layer_size) { 46 const gfx::Size& layer_size) {
48 gfx::PointF offset(2.f, 3.f); 47 gfx::PointF offset(2.f, 3.f);
49 SkPictureRecorder recorder; 48 SkPictureRecorder recorder;
50 skia::RefPtr<SkCanvas> canvas; 49 sk_sp<SkCanvas> canvas;
51 50
52 SkPaint red_paint; 51 SkPaint red_paint;
53 red_paint.setColor(SK_ColorRED); 52 red_paint.setColor(SK_ColorRED);
54 53
55 canvas = skia::SharePtr(recorder.beginRecording(SkRect::MakeXYWH( 54 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH(
56 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); 55 offset.x(), offset.y(), layer_size.width(), layer_size.height())));
57 canvas->translate(offset.x(), offset.y()); 56 canvas->translate(offset.x(), offset.y());
58 canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); 57 canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint);
59 list->CreateAndAppendItem<DrawingDisplayItem>( 58 list->CreateAndAppendItem<DrawingDisplayItem>(
60 kVisualRect, recorder.finishRecordingAsPicture()); 59 kVisualRect, recorder.finishRecordingAsPicture());
61 } 60 }
62 61
63 void AppendSecondSerializationTestPicture(scoped_refptr<DisplayItemList> list, 62 void AppendSecondSerializationTestPicture(scoped_refptr<DisplayItemList> list,
64 const gfx::Size& layer_size) { 63 const gfx::Size& layer_size) {
65 gfx::PointF offset(2.f, 2.f); 64 gfx::PointF offset(2.f, 2.f);
66 SkPictureRecorder recorder; 65 SkPictureRecorder recorder;
67 skia::RefPtr<SkCanvas> canvas; 66 sk_sp<SkCanvas> canvas;
68 67
69 SkPaint blue_paint; 68 SkPaint blue_paint;
70 blue_paint.setColor(SK_ColorBLUE); 69 blue_paint.setColor(SK_ColorBLUE);
71 70
72 canvas = skia::SharePtr(recorder.beginRecording(SkRect::MakeXYWH( 71 canvas = sk_ref_sp(recorder.beginRecording(SkRect::MakeXYWH(
73 offset.x(), offset.y(), layer_size.width(), layer_size.height()))); 72 offset.x(), offset.y(), layer_size.width(), layer_size.height())));
74 canvas->translate(offset.x(), offset.y()); 73 canvas->translate(offset.x(), offset.y());
75 canvas->drawRectCoords(3.f, 3.f, 7.f, 7.f, blue_paint); 74 canvas->drawRectCoords(3.f, 3.f, 7.f, 7.f, blue_paint);
76 list->CreateAndAppendItem<DrawingDisplayItem>( 75 list->CreateAndAppendItem<DrawingDisplayItem>(
77 kVisualRect, recorder.finishRecordingAsPicture()); 76 kVisualRect, recorder.finishRecordingAsPicture());
78 } 77 }
79 78
80 void ValidateDisplayItemListSerialization(const gfx::Size& layer_size, 79 void ValidateDisplayItemListSerialization(const gfx::Size& layer_size,
81 scoped_refptr<DisplayItemList> list) { 80 scoped_refptr<DisplayItemList> list) {
82 list->Finalize(); 81 list->Finalize();
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 248
250 // Build the EndTransformDisplayItem. 249 // Build the EndTransformDisplayItem.
251 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); 250 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect);
252 251
253 ValidateDisplayItemListSerialization(layer_size, list); 252 ValidateDisplayItemListSerialization(layer_size, list);
254 } 253 }
255 254
256 TEST(DisplayItemListTest, SingleDrawingItem) { 255 TEST(DisplayItemListTest, SingleDrawingItem) {
257 gfx::Rect layer_rect(100, 100); 256 gfx::Rect layer_rect(100, 100);
258 SkPictureRecorder recorder; 257 SkPictureRecorder recorder;
259 skia::RefPtr<SkCanvas> canvas; 258 sk_sp<SkCanvas> canvas;
260 SkPaint blue_paint; 259 SkPaint blue_paint;
261 blue_paint.setColor(SK_ColorBLUE); 260 blue_paint.setColor(SK_ColorBLUE);
262 SkPaint red_paint; 261 SkPaint red_paint;
263 red_paint.setColor(SK_ColorRED); 262 red_paint.setColor(SK_ColorRED);
264 unsigned char pixels[4 * 100 * 100] = {0}; 263 unsigned char pixels[4 * 100 * 100] = {0};
265 DisplayItemListSettings settings; 264 DisplayItemListSettings settings;
266 scoped_refptr<DisplayItemList> list = 265 scoped_refptr<DisplayItemList> list =
267 DisplayItemList::Create(layer_rect, settings); 266 DisplayItemList::Create(layer_rect, settings);
268 267
269 gfx::PointF offset(8.f, 9.f); 268 gfx::PointF offset(8.f, 9.f);
270 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size())); 269 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size()));
271 canvas = skia::SharePtr( 270 canvas =
272 recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); 271 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect)));
273 canvas->translate(offset.x(), offset.y()); 272 canvas->translate(offset.x(), offset.y());
274 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); 273 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
275 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); 274 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
276 list->CreateAndAppendItem<DrawingDisplayItem>( 275 list->CreateAndAppendItem<DrawingDisplayItem>(
277 kVisualRect, recorder.finishRecordingAsPicture()); 276 kVisualRect, recorder.finishRecordingAsPicture());
278 list->Finalize(); 277 list->Finalize();
279 DrawDisplayList(pixels, layer_rect, list); 278 DrawDisplayList(pixels, layer_rect, list);
280 279
281 SkBitmap expected_bitmap; 280 SkBitmap expected_bitmap;
282 unsigned char expected_pixels[4 * 100 * 100] = {0}; 281 unsigned char expected_pixels[4 * 100 * 100] = {0};
283 SkImageInfo info = 282 SkImageInfo info =
284 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); 283 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
285 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); 284 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes());
286 SkCanvas expected_canvas(expected_bitmap); 285 SkCanvas expected_canvas(expected_bitmap);
287 expected_canvas.clipRect(gfx::RectToSkRect(layer_rect)); 286 expected_canvas.clipRect(gfx::RectToSkRect(layer_rect));
288 expected_canvas.drawRectCoords(0.f + offset.x(), 0.f + offset.y(), 287 expected_canvas.drawRectCoords(0.f + offset.x(), 0.f + offset.y(),
289 60.f + offset.x(), 60.f + offset.y(), 288 60.f + offset.x(), 60.f + offset.y(),
290 red_paint); 289 red_paint);
291 expected_canvas.drawRectCoords(50.f + offset.x(), 50.f + offset.y(), 290 expected_canvas.drawRectCoords(50.f + offset.x(), 50.f + offset.y(),
292 75.f + offset.x(), 75.f + offset.y(), 291 75.f + offset.x(), 75.f + offset.y(),
293 blue_paint); 292 blue_paint);
294 293
295 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); 294 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
296 } 295 }
297 296
298 TEST(DisplayItemListTest, ClipItem) { 297 TEST(DisplayItemListTest, ClipItem) {
299 gfx::Rect layer_rect(100, 100); 298 gfx::Rect layer_rect(100, 100);
300 SkPictureRecorder recorder; 299 SkPictureRecorder recorder;
301 skia::RefPtr<SkCanvas> canvas; 300 sk_sp<SkCanvas> canvas;
302 SkPaint blue_paint; 301 SkPaint blue_paint;
303 blue_paint.setColor(SK_ColorBLUE); 302 blue_paint.setColor(SK_ColorBLUE);
304 SkPaint red_paint; 303 SkPaint red_paint;
305 red_paint.setColor(SK_ColorRED); 304 red_paint.setColor(SK_ColorRED);
306 unsigned char pixels[4 * 100 * 100] = {0}; 305 unsigned char pixels[4 * 100 * 100] = {0};
307 DisplayItemListSettings settings; 306 DisplayItemListSettings settings;
308 settings.use_cached_picture = true; 307 settings.use_cached_picture = true;
309 scoped_refptr<DisplayItemList> list = 308 scoped_refptr<DisplayItemList> list =
310 DisplayItemList::Create(layer_rect, settings); 309 DisplayItemList::Create(layer_rect, settings);
311 310
312 gfx::PointF first_offset(8.f, 9.f); 311 gfx::PointF first_offset(8.f, 9.f);
313 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); 312 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size()));
314 canvas = skia::SharePtr( 313 canvas = sk_ref_sp(
315 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); 314 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect)));
316 canvas->translate(first_offset.x(), first_offset.y()); 315 canvas->translate(first_offset.x(), first_offset.y());
317 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); 316 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
318 list->CreateAndAppendItem<DrawingDisplayItem>( 317 list->CreateAndAppendItem<DrawingDisplayItem>(
319 kVisualRect, recorder.finishRecordingAsPicture()); 318 kVisualRect, recorder.finishRecordingAsPicture());
320 319
321 gfx::Rect clip_rect(60, 60, 10, 10); 320 gfx::Rect clip_rect(60, 60, 10, 10);
322 list->CreateAndAppendItem<ClipDisplayItem>(kVisualRect, clip_rect, 321 list->CreateAndAppendItem<ClipDisplayItem>(kVisualRect, clip_rect,
323 std::vector<SkRRect>()); 322 std::vector<SkRRect>());
324 323
325 gfx::PointF second_offset(2.f, 3.f); 324 gfx::PointF second_offset(2.f, 3.f);
326 gfx::RectF second_recording_rect(second_offset, 325 gfx::RectF second_recording_rect(second_offset,
327 gfx::SizeF(layer_rect.size())); 326 gfx::SizeF(layer_rect.size()));
328 canvas = skia::SharePtr( 327 canvas = sk_ref_sp(
329 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); 328 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect)));
330 canvas->translate(second_offset.x(), second_offset.y()); 329 canvas->translate(second_offset.x(), second_offset.y());
331 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); 330 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
332 list->CreateAndAppendItem<DrawingDisplayItem>( 331 list->CreateAndAppendItem<DrawingDisplayItem>(
333 kVisualRect, recorder.finishRecordingAsPicture()); 332 kVisualRect, recorder.finishRecordingAsPicture());
334 333
335 list->CreateAndAppendItem<EndClipDisplayItem>(kVisualRect); 334 list->CreateAndAppendItem<EndClipDisplayItem>(kVisualRect);
336 list->Finalize(); 335 list->Finalize();
337 336
338 DrawDisplayList(pixels, layer_rect, list); 337 DrawDisplayList(pixels, layer_rect, list);
(...skipping 12 matching lines...) Expand all
351 expected_canvas.drawRectCoords( 350 expected_canvas.drawRectCoords(
352 50.f + second_offset.x(), 50.f + second_offset.y(), 351 50.f + second_offset.x(), 50.f + second_offset.y(),
353 75.f + second_offset.x(), 75.f + second_offset.y(), blue_paint); 352 75.f + second_offset.x(), 75.f + second_offset.y(), blue_paint);
354 353
355 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); 354 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
356 } 355 }
357 356
358 TEST(DisplayItemListTest, TransformItem) { 357 TEST(DisplayItemListTest, TransformItem) {
359 gfx::Rect layer_rect(100, 100); 358 gfx::Rect layer_rect(100, 100);
360 SkPictureRecorder recorder; 359 SkPictureRecorder recorder;
361 skia::RefPtr<SkCanvas> canvas; 360 sk_sp<SkCanvas> canvas;
362 SkPaint blue_paint; 361 SkPaint blue_paint;
363 blue_paint.setColor(SK_ColorBLUE); 362 blue_paint.setColor(SK_ColorBLUE);
364 SkPaint red_paint; 363 SkPaint red_paint;
365 red_paint.setColor(SK_ColorRED); 364 red_paint.setColor(SK_ColorRED);
366 unsigned char pixels[4 * 100 * 100] = {0}; 365 unsigned char pixels[4 * 100 * 100] = {0};
367 DisplayItemListSettings settings; 366 DisplayItemListSettings settings;
368 settings.use_cached_picture = true; 367 settings.use_cached_picture = true;
369 scoped_refptr<DisplayItemList> list = 368 scoped_refptr<DisplayItemList> list =
370 DisplayItemList::Create(layer_rect, settings); 369 DisplayItemList::Create(layer_rect, settings);
371 370
372 gfx::PointF first_offset(8.f, 9.f); 371 gfx::PointF first_offset(8.f, 9.f);
373 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size())); 372 gfx::RectF first_recording_rect(first_offset, gfx::SizeF(layer_rect.size()));
374 canvas = skia::SharePtr( 373 canvas = sk_ref_sp(
375 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect))); 374 recorder.beginRecording(gfx::RectFToSkRect(first_recording_rect)));
376 canvas->translate(first_offset.x(), first_offset.y()); 375 canvas->translate(first_offset.x(), first_offset.y());
377 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); 376 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
378 list->CreateAndAppendItem<DrawingDisplayItem>( 377 list->CreateAndAppendItem<DrawingDisplayItem>(
379 kVisualRect, recorder.finishRecordingAsPicture()); 378 kVisualRect, recorder.finishRecordingAsPicture());
380 379
381 gfx::Transform transform; 380 gfx::Transform transform;
382 transform.Rotate(45.0); 381 transform.Rotate(45.0);
383 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform); 382 list->CreateAndAppendItem<TransformDisplayItem>(kVisualRect, transform);
384 383
385 gfx::PointF second_offset(2.f, 3.f); 384 gfx::PointF second_offset(2.f, 3.f);
386 gfx::RectF second_recording_rect(second_offset, 385 gfx::RectF second_recording_rect(second_offset,
387 gfx::SizeF(layer_rect.size())); 386 gfx::SizeF(layer_rect.size()));
388 canvas = skia::SharePtr( 387 canvas = sk_ref_sp(
389 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect))); 388 recorder.beginRecording(gfx::RectFToSkRect(second_recording_rect)));
390 canvas->translate(second_offset.x(), second_offset.y()); 389 canvas->translate(second_offset.x(), second_offset.y());
391 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); 390 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
392 list->CreateAndAppendItem<DrawingDisplayItem>( 391 list->CreateAndAppendItem<DrawingDisplayItem>(
393 kVisualRect, recorder.finishRecordingAsPicture()); 392 kVisualRect, recorder.finishRecordingAsPicture());
394 393
395 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect); 394 list->CreateAndAppendItem<EndTransformDisplayItem>(kVisualRect);
396 list->Finalize(); 395 list->Finalize();
397 396
398 DrawDisplayList(pixels, layer_rect, list); 397 DrawDisplayList(pixels, layer_rect, list);
(...skipping 21 matching lines...) Expand all
420 FilterOperations filters; 419 FilterOperations filters;
421 unsigned char pixels[4 * 100 * 100] = {0}; 420 unsigned char pixels[4 * 100 * 100] = {0};
422 DisplayItemListSettings settings; 421 DisplayItemListSettings settings;
423 settings.use_cached_picture = true; 422 settings.use_cached_picture = true;
424 scoped_refptr<DisplayItemList> list = 423 scoped_refptr<DisplayItemList> list =
425 DisplayItemList::Create(layer_rect, settings); 424 DisplayItemList::Create(layer_rect, settings);
426 425
427 sk_sp<SkSurface> source_surface = SkSurface::MakeRasterN32Premul(50, 50); 426 sk_sp<SkSurface> source_surface = SkSurface::MakeRasterN32Premul(50, 50);
428 SkCanvas* source_canvas = source_surface->getCanvas(); 427 SkCanvas* source_canvas = source_surface->getCanvas();
429 source_canvas->clear(SkColorSetRGB(128, 128, 128)); 428 source_canvas->clear(SkColorSetRGB(128, 128, 128));
430 skia::RefPtr<SkImage> source_image = 429 sk_sp<SkImage> source_image = source_surface->makeImageSnapshot();
431 skia::AdoptRef(source_surface->newImageSnapshot());
432 430
433 // For most SkImageFilters, the |dst| bounds computed by computeFastBounds are 431 // For most SkImageFilters, the |dst| bounds computed by computeFastBounds are
434 // dependent on the provided |src| bounds. This means, for example, that 432 // dependent on the provided |src| bounds. This means, for example, that
435 // translating |src| results in a corresponding translation of |dst|. But this 433 // translating |src| results in a corresponding translation of |dst|. But this
436 // is not the case for all SkImageFilters; for some of them (e.g. 434 // is not the case for all SkImageFilters; for some of them (e.g.
437 // SkImageSource), the computation of |dst| in computeFastBounds doesn't 435 // SkImageSource), the computation of |dst| in computeFastBounds doesn't
438 // involve |src| at all. Incorrectly assuming such a relationship (e.g. by 436 // involve |src| at all. Incorrectly assuming such a relationship (e.g. by
439 // translating |dst| after it is computed by computeFastBounds, rather than 437 // translating |dst| after it is computed by computeFastBounds, rather than
440 // translating |src| before it provided to computedFastBounds) can cause 438 // translating |src| before it provided to computedFastBounds) can cause
441 // incorrect clipping of filter output. To test for this, we include an 439 // incorrect clipping of filter output. To test for this, we include an
442 // SkImageSource filter in |filters|. Here, |src| is |filter_bounds|, defined 440 // SkImageSource filter in |filters|. Here, |src| is |filter_bounds|, defined
443 // below. 441 // below.
444 skia::RefPtr<SkImageFilter> image_filter = 442 sk_sp<SkImageFilter> image_filter = SkImageSource::Make(source_image);
445 skia::AdoptRef(SkImageSource::Create(source_image.get()));
446 filters.Append(FilterOperation::CreateReferenceFilter(image_filter)); 443 filters.Append(FilterOperation::CreateReferenceFilter(image_filter));
447 filters.Append(FilterOperation::CreateBrightnessFilter(0.5f)); 444 filters.Append(FilterOperation::CreateBrightnessFilter(0.5f));
448 gfx::RectF filter_bounds(10.f, 10.f, 50.f, 50.f); 445 gfx::RectF filter_bounds(10.f, 10.f, 50.f, 50.f);
449 list->CreateAndAppendItem<FilterDisplayItem>(kVisualRect, filters, 446 list->CreateAndAppendItem<FilterDisplayItem>(kVisualRect, filters,
450 filter_bounds); 447 filter_bounds);
451 list->CreateAndAppendItem<EndFilterDisplayItem>(kVisualRect); 448 list->CreateAndAppendItem<EndFilterDisplayItem>(kVisualRect);
452 list->Finalize(); 449 list->Finalize();
453 450
454 DrawDisplayList(pixels, layer_rect, list); 451 DrawDisplayList(pixels, layer_rect, list);
455 452
456 SkBitmap expected_bitmap; 453 SkBitmap expected_bitmap;
457 unsigned char expected_pixels[4 * 100 * 100] = {0}; 454 unsigned char expected_pixels[4 * 100 * 100] = {0};
458 SkPaint paint; 455 SkPaint paint;
459 paint.setColor(SkColorSetRGB(64, 64, 64)); 456 paint.setColor(SkColorSetRGB(64, 64, 64));
460 SkImageInfo info = 457 SkImageInfo info =
461 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height()); 458 SkImageInfo::MakeN32Premul(layer_rect.width(), layer_rect.height());
462 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes()); 459 expected_bitmap.installPixels(info, expected_pixels, info.minRowBytes());
463 SkCanvas expected_canvas(expected_bitmap); 460 SkCanvas expected_canvas(expected_bitmap);
464 expected_canvas.drawRect(RectFToSkRect(filter_bounds), paint); 461 expected_canvas.drawRect(RectFToSkRect(filter_bounds), paint);
465 462
466 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); 463 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
467 } 464 }
468 465
469 TEST(DisplayItemListTest, CompactingItems) { 466 TEST(DisplayItemListTest, CompactingItems) {
470 gfx::Rect layer_rect(100, 100); 467 gfx::Rect layer_rect(100, 100);
471 SkPictureRecorder recorder; 468 SkPictureRecorder recorder;
472 skia::RefPtr<SkCanvas> canvas; 469 sk_sp<SkCanvas> canvas;
473 SkPaint blue_paint; 470 SkPaint blue_paint;
474 blue_paint.setColor(SK_ColorBLUE); 471 blue_paint.setColor(SK_ColorBLUE);
475 SkPaint red_paint; 472 SkPaint red_paint;
476 red_paint.setColor(SK_ColorRED); 473 red_paint.setColor(SK_ColorRED);
477 unsigned char pixels[4 * 100 * 100] = {0}; 474 unsigned char pixels[4 * 100 * 100] = {0};
478 475
479 gfx::PointF offset(8.f, 9.f); 476 gfx::PointF offset(8.f, 9.f);
480 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size())); 477 gfx::RectF recording_rect(offset, gfx::SizeF(layer_rect.size()));
481 478
482 DisplayItemListSettings no_caching_settings; 479 DisplayItemListSettings no_caching_settings;
483 no_caching_settings.use_cached_picture = false; 480 no_caching_settings.use_cached_picture = false;
484 scoped_refptr<DisplayItemList> list_without_caching = 481 scoped_refptr<DisplayItemList> list_without_caching =
485 DisplayItemList::Create(layer_rect, no_caching_settings); 482 DisplayItemList::Create(layer_rect, no_caching_settings);
486 483
487 canvas = skia::SharePtr( 484 canvas =
488 recorder.beginRecording(gfx::RectFToSkRect(recording_rect))); 485 sk_ref_sp(recorder.beginRecording(gfx::RectFToSkRect(recording_rect)));
489 canvas->translate(offset.x(), offset.y()); 486 canvas->translate(offset.x(), offset.y());
490 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); 487 canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint);
491 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); 488 canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint);
492 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); 489 sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
493 list_without_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, 490 list_without_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect,
494 picture); 491 picture);
495 list_without_caching->Finalize(); 492 list_without_caching->Finalize();
496 DrawDisplayList(pixels, layer_rect, list_without_caching); 493 DrawDisplayList(pixels, layer_rect, list_without_caching);
497 494
498 unsigned char expected_pixels[4 * 100 * 100] = {0}; 495 unsigned char expected_pixels[4 * 100 * 100] = {0};
499 DisplayItemListSettings caching_settings; 496 DisplayItemListSettings caching_settings;
500 caching_settings.use_cached_picture = true; 497 caching_settings.use_cached_picture = true;
501 scoped_refptr<DisplayItemList> list_with_caching = 498 scoped_refptr<DisplayItemList> list_with_caching =
502 DisplayItemList::Create(layer_rect, caching_settings); 499 DisplayItemList::Create(layer_rect, caching_settings);
503 list_with_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, 500 list_with_caching->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect,
504 picture); 501 picture);
505 list_with_caching->Finalize(); 502 list_with_caching->Finalize();
506 DrawDisplayList(expected_pixels, layer_rect, list_with_caching); 503 DrawDisplayList(expected_pixels, layer_rect, list_with_caching);
507 504
508 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100)); 505 EXPECT_EQ(0, memcmp(pixels, expected_pixels, 4 * 100 * 100));
509 } 506 }
510 507
511 TEST(DisplayItemListTest, IsSuitableForGpuRasterizationWithCachedPicture) { 508 TEST(DisplayItemListTest, IsSuitableForGpuRasterizationWithCachedPicture) {
512 gfx::Rect layer_rect(1000, 1000); 509 gfx::Rect layer_rect(1000, 1000);
513 SkPictureRecorder recorder; 510 SkPictureRecorder recorder;
514 skia::RefPtr<SkCanvas> canvas; 511 sk_sp<SkCanvas> canvas;
515 512
516 DisplayItemListSettings settings; 513 DisplayItemListSettings settings;
517 settings.use_cached_picture = true; 514 settings.use_cached_picture = true;
518 scoped_refptr<DisplayItemList> list = 515 scoped_refptr<DisplayItemList> list =
519 DisplayItemList::Create(layer_rect, settings); 516 DisplayItemList::Create(layer_rect, settings);
520 canvas = 517 canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
521 skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
522 518
523 SkPath path; 519 SkPath path;
524 path.moveTo(0, 0); 520 path.moveTo(0, 0);
525 path.lineTo(0, 100); 521 path.lineTo(0, 100);
526 path.lineTo(50, 50); 522 path.lineTo(50, 50);
527 path.lineTo(100, 100); 523 path.lineTo(100, 100);
528 path.lineTo(100, 0); 524 path.lineTo(100, 0);
529 path.close(); 525 path.close();
530 526
531 SkPaint paint; 527 SkPaint paint;
532 paint.setAntiAlias(true); 528 paint.setAntiAlias(true);
533 canvas->drawPath(path, paint); 529 canvas->drawPath(path, paint);
534 530
535 sk_sp<SkPicture> suitable_picture = recorder.finishRecordingAsPicture(); 531 sk_sp<SkPicture> suitable_picture = recorder.finishRecordingAsPicture();
536 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, suitable_picture); 532 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, suitable_picture);
537 list->Finalize(); 533 list->Finalize();
538 534
539 // A single DrawingDisplayItem with a large AA concave path shouldn't trigger 535 // A single DrawingDisplayItem with a large AA concave path shouldn't trigger
540 // a veto. 536 // a veto.
541 EXPECT_TRUE(list->IsSuitableForGpuRasterization()); 537 EXPECT_TRUE(list->IsSuitableForGpuRasterization());
542 538
543 // Now check the RasterIntoCanvas path. 539 // Now check the RasterIntoCanvas path.
544 list = DisplayItemList::Create(layer_rect, settings); 540 list = DisplayItemList::Create(layer_rect, settings);
545 DrawingDisplayItem suitable_item(suitable_picture); 541 DrawingDisplayItem suitable_item(suitable_picture);
546 list->RasterIntoCanvas(suitable_item); 542 list->RasterIntoCanvas(suitable_item);
547 list->Finalize(); 543 list->Finalize();
548 EXPECT_TRUE(list->IsSuitableForGpuRasterization()); 544 EXPECT_TRUE(list->IsSuitableForGpuRasterization());
549 545
550 list = DisplayItemList::Create(layer_rect, settings); 546 list = DisplayItemList::Create(layer_rect, settings);
551 canvas = 547 canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
552 skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
553 for (int i = 0; i < 10; ++i) 548 for (int i = 0; i < 10; ++i)
554 canvas->drawPath(path, paint); 549 canvas->drawPath(path, paint);
555 sk_sp<SkPicture> unsuitable_picture = recorder.finishRecordingAsPicture(); 550 sk_sp<SkPicture> unsuitable_picture = recorder.finishRecordingAsPicture();
556 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect, 551 list->CreateAndAppendItem<DrawingDisplayItem>(kVisualRect,
557 unsuitable_picture); 552 unsuitable_picture);
558 list->Finalize(); 553 list->Finalize();
559 554
560 // A single DrawingDisplayItem with several large AA concave paths should 555 // A single DrawingDisplayItem with several large AA concave paths should
561 // trigger a veto. 556 // trigger a veto.
562 EXPECT_FALSE(list->IsSuitableForGpuRasterization()); 557 EXPECT_FALSE(list->IsSuitableForGpuRasterization());
563 558
564 // Now check the RasterIntoCanvas path. 559 // Now check the RasterIntoCanvas path.
565 list = DisplayItemList::Create(layer_rect, settings); 560 list = DisplayItemList::Create(layer_rect, settings);
566 DrawingDisplayItem unsuitable_item(unsuitable_picture); 561 DrawingDisplayItem unsuitable_item(unsuitable_picture);
567 list->RasterIntoCanvas(unsuitable_item); 562 list->RasterIntoCanvas(unsuitable_item);
568 list->Finalize(); 563 list->Finalize();
569 EXPECT_FALSE(list->IsSuitableForGpuRasterization()); 564 EXPECT_FALSE(list->IsSuitableForGpuRasterization());
570 } 565 }
571 566
572 TEST(DisplayItemListTest, IsSuitableForGpuRasterizationWithoutCachedPicture) { 567 TEST(DisplayItemListTest, IsSuitableForGpuRasterizationWithoutCachedPicture) {
573 gfx::Rect layer_rect(1000, 1000); 568 gfx::Rect layer_rect(1000, 1000);
574 SkPictureRecorder recorder; 569 SkPictureRecorder recorder;
575 skia::RefPtr<SkCanvas> canvas; 570 sk_sp<SkCanvas> canvas;
576 skia::RefPtr<SkPicture> picture; 571 sk_sp<SkPicture> picture;
577 572
578 DisplayItemListSettings settings; 573 DisplayItemListSettings settings;
579 settings.use_cached_picture = false; 574 settings.use_cached_picture = false;
580 scoped_refptr<DisplayItemList> list = 575 scoped_refptr<DisplayItemList> list =
581 DisplayItemList::Create(layer_rect, settings); 576 DisplayItemList::Create(layer_rect, settings);
582 canvas = 577 canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
583 skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
584 578
585 SkPath path; 579 SkPath path;
586 path.moveTo(0, 0); 580 path.moveTo(0, 0);
587 path.lineTo(0, 100); 581 path.lineTo(0, 100);
588 path.lineTo(50, 50); 582 path.lineTo(50, 50);
589 path.lineTo(100, 100); 583 path.lineTo(100, 100);
590 path.lineTo(100, 0); 584 path.lineTo(100, 0);
591 path.close(); 585 path.close();
592 586
593 SkPaint paint; 587 SkPaint paint;
594 paint.setAntiAlias(true); 588 paint.setAntiAlias(true);
595 canvas->drawPath(path, paint); 589 canvas->drawPath(path, paint);
596 590
597 list->CreateAndAppendItem<DrawingDisplayItem>( 591 list->CreateAndAppendItem<DrawingDisplayItem>(
598 kVisualRect, recorder.finishRecordingAsPicture()); 592 kVisualRect, recorder.finishRecordingAsPicture());
599 list->Finalize(); 593 list->Finalize();
600 594
601 // A single DrawingDisplayItem with a large AA concave path shouldn't trigger 595 // A single DrawingDisplayItem with a large AA concave path shouldn't trigger
602 // a veto. 596 // a veto.
603 EXPECT_TRUE(list->IsSuitableForGpuRasterization()); 597 EXPECT_TRUE(list->IsSuitableForGpuRasterization());
604 598
605 list = DisplayItemList::Create(layer_rect, settings); 599 list = DisplayItemList::Create(layer_rect, settings);
606 canvas = 600 canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
607 skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
608 for (int i = 0; i < 10; ++i) 601 for (int i = 0; i < 10; ++i)
609 canvas->drawPath(path, paint); 602 canvas->drawPath(path, paint);
610 list->CreateAndAppendItem<DrawingDisplayItem>( 603 list->CreateAndAppendItem<DrawingDisplayItem>(
611 kVisualRect, recorder.finishRecordingAsPicture()); 604 kVisualRect, recorder.finishRecordingAsPicture());
612 list->Finalize(); 605 list->Finalize();
613 606
614 // A single DrawingDisplayItem with several large AA concave paths should 607 // A single DrawingDisplayItem with several large AA concave paths should
615 // trigger a veto. 608 // trigger a veto.
616 EXPECT_FALSE(list->IsSuitableForGpuRasterization()); 609 EXPECT_FALSE(list->IsSuitableForGpuRasterization());
617 610
618 list = DisplayItemList::Create(layer_rect, settings); 611 list = DisplayItemList::Create(layer_rect, settings);
619 for (int i = 0; i < 10; ++i) { 612 for (int i = 0; i < 10; ++i) {
620 canvas = 613 canvas = sk_ref_sp(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
621 skia::SharePtr(recorder.beginRecording(gfx::RectToSkRect(layer_rect)));
622 canvas->drawPath(path, paint); 614 canvas->drawPath(path, paint);
623 list->CreateAndAppendItem<DrawingDisplayItem>( 615 list->CreateAndAppendItem<DrawingDisplayItem>(
624 kVisualRect, recorder.finishRecordingAsPicture()); 616 kVisualRect, recorder.finishRecordingAsPicture());
625 } 617 }
626 list->Finalize(); 618 list->Finalize();
627 619
628 // Without a cached picture, having several DrawingDisplayItems that each 620 // Without a cached picture, having several DrawingDisplayItems that each
629 // contain a single large AA concave will not trigger a veto, since each item 621 // contain a single large AA concave will not trigger a veto, since each item
630 // is individually suitable for GPU rasterization. 622 // is individually suitable for GPU rasterization.
631 EXPECT_TRUE(list->IsSuitableForGpuRasterization()); 623 EXPECT_TRUE(list->IsSuitableForGpuRasterization());
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 745
754 value = list->AsValue(false)->ToString(); 746 value = list->AsValue(false)->ToString();
755 EXPECT_EQ(value.find("\"items\":"), std::string::npos); 747 EXPECT_EQ(value.find("\"items\":"), std::string::npos);
756 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos); 748 EXPECT_NE(value.find("\"layer_rect\":[0,0,0,0]"), std::string::npos);
757 // There should be no skp64 entry present as the items aren't included and the 749 // There should be no skp64 entry present as the items aren't included and the
758 // layer rect is empty. 750 // layer rect is empty.
759 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos); 751 EXPECT_EQ(value.find("\"skp64\":"), std::string::npos);
760 } 752 }
761 753
762 } // namespace cc 754 } // namespace cc
OLDNEW
« no previous file with comments | « cc/playback/display_item_list.cc ('k') | cc/playback/filter_display_item.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698