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
3 // found in the LICENSE file.
5 #include "base/compiler_specific.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "cc/test/geometry_test_utils.h"
8 #include "skia/ext/pixel_ref_utils.h"
9 #include "skia/ext/refptr.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/skia/include/core/SkBitmap.h"
12 #include "third_party/skia/include/core/SkCanvas.h"
13 #include "third_party/skia/include/core/SkFlattenableBuffers.h"
14 #include "third_party/skia/include/core/SkPictureRecorder.h"
15 #include "third_party/skia/include/core/SkPixelRef.h"
16 #include "third_party/skia/include/core/SkPoint.h"
17 #include "third_party/skia/include/core/SkShader.h"
18 #include "third_party/skia/src/core/SkOrderedReadBuffer.h"
19 #include "ui/gfx/rect.h"
20 #include "ui/gfx/skia_util.h"
26 void CreateBitmap(gfx::Size size
, const char* uri
, SkBitmap
* bitmap
);
28 class TestDiscardableShader
: public SkShader
{
30 TestDiscardableShader() {
31 CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_
);
34 TestDiscardableShader(SkFlattenableReadBuffer
& flattenable_buffer
) {
35 SkOrderedReadBuffer
& buffer
=
36 static_cast<SkOrderedReadBuffer
&>(flattenable_buffer
);
37 SkReader32
* reader
= buffer
.getReader32();
40 uint32_t toSkip
= reader
->readU32();
43 CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_
);
46 virtual SkShader::BitmapType
asABitmap(SkBitmap
* bitmap
,
48 TileMode xy
[2]) const OVERRIDE
{
51 return SkShader::kDefault_BitmapType
;
54 // not indended to return an actual context. Just need to supply this.
55 virtual size_t contextSize() const OVERRIDE
{
56 return sizeof(SkShader::Context
);
59 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(TestDiscardableShader
);
65 void CreateBitmap(gfx::Size size
, const char* uri
, SkBitmap
* bitmap
) {
66 bitmap
->allocN32Pixels(size
.width(), size
.height());
67 bitmap
->pixelRef()->setImmutable();
68 bitmap
->pixelRef()->setURI(uri
);
71 SkCanvas
* StartRecording(SkPictureRecorder
* recorder
, gfx::Rect layer_rect
) {
73 recorder
->beginRecording(layer_rect
.width(), layer_rect
.height());
76 canvas
->translate(-layer_rect
.x(), -layer_rect
.y());
77 canvas
->clipRect(SkRect::MakeXYWH(
78 layer_rect
.x(), layer_rect
.y(), layer_rect
.width(), layer_rect
.height()));
83 SkPicture
* StopRecording(SkPictureRecorder
* recorder
, SkCanvas
* canvas
) {
85 return recorder
->endRecording();
90 TEST(PixelRefUtilsTest
, DrawPaint
) {
91 gfx::Rect
layer_rect(0, 0, 256, 256);
93 SkPictureRecorder recorder
;
94 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
96 TestDiscardableShader first_shader
;
98 first_paint
.setShader(&first_shader
);
100 TestDiscardableShader second_shader
;
101 SkPaint second_paint
;
102 second_paint
.setShader(&second_shader
);
104 TestDiscardableShader third_shader
;
106 third_paint
.setShader(&third_shader
);
108 canvas
->drawPaint(first_paint
);
109 canvas
->clipRect(SkRect::MakeXYWH(34, 45, 56, 67));
110 canvas
->drawPaint(second_paint
);
111 // Total clip is now (34, 45, 56, 55)
112 canvas
->clipRect(SkRect::MakeWH(100, 100));
113 canvas
->drawPaint(third_paint
);
115 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
117 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
118 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
120 EXPECT_EQ(3u, pixel_refs
.size());
121 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 256, 256),
122 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
123 EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 67),
124 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
125 EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 55),
126 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
129 TEST(PixelRefUtilsTest
, DrawPoints
) {
130 gfx::Rect
layer_rect(0, 0, 256, 256);
132 SkPictureRecorder recorder
;
133 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
135 TestDiscardableShader first_shader
;
137 first_paint
.setShader(&first_shader
);
139 TestDiscardableShader second_shader
;
140 SkPaint second_paint
;
141 second_paint
.setShader(&second_shader
);
143 TestDiscardableShader third_shader
;
145 third_paint
.setShader(&third_shader
);
148 points
[0].set(10, 10);
149 points
[1].set(100, 20);
150 points
[2].set(50, 100);
152 canvas
->drawPoints(SkCanvas::kPolygon_PointMode
, 3, points
, first_paint
);
156 canvas
->clipRect(SkRect::MakeWH(50, 50));
158 canvas
->drawPoints(SkCanvas::kPolygon_PointMode
, 3, points
, second_paint
);
162 points
[0].set(50, 55);
163 points
[1].set(50, 55);
164 points
[2].set(200, 200);
165 // (50, 55, 150, 145).
166 canvas
->drawPoints(SkCanvas::kPolygon_PointMode
, 3, points
, third_paint
);
168 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
170 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
171 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
173 EXPECT_EQ(3u, pixel_refs
.size());
174 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90),
175 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
176 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40),
177 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
178 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145),
179 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
182 TEST(PixelRefUtilsTest
, DrawRect
) {
183 gfx::Rect
layer_rect(0, 0, 256, 256);
185 SkPictureRecorder recorder
;
186 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
188 TestDiscardableShader first_shader
;
190 first_paint
.setShader(&first_shader
);
192 TestDiscardableShader second_shader
;
193 SkPaint second_paint
;
194 second_paint
.setShader(&second_shader
);
196 TestDiscardableShader third_shader
;
198 third_paint
.setShader(&third_shader
);
201 canvas
->drawRect(SkRect::MakeXYWH(10, 20, 30, 40), first_paint
);
205 canvas
->translate(5, 17);
207 canvas
->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint
);
211 canvas
->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
212 canvas
->translate(20, 20);
214 canvas
->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint
);
216 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
218 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
219 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
221 EXPECT_EQ(3u, pixel_refs
.size());
222 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40),
223 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
224 EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35),
225 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
226 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
227 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
230 TEST(PixelRefUtilsTest
, DrawRRect
) {
231 gfx::Rect
layer_rect(0, 0, 256, 256);
233 SkPictureRecorder recorder
;
234 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
236 TestDiscardableShader first_shader
;
238 first_paint
.setShader(&first_shader
);
240 TestDiscardableShader second_shader
;
241 SkPaint second_paint
;
242 second_paint
.setShader(&second_shader
);
244 TestDiscardableShader third_shader
;
246 third_paint
.setShader(&third_shader
);
249 rrect
.setRect(SkRect::MakeXYWH(10, 20, 30, 40));
252 canvas
->drawRRect(rrect
, first_paint
);
256 canvas
->translate(5, 17);
257 rrect
.setRect(SkRect::MakeXYWH(0, 33, 25, 35));
259 canvas
->drawRRect(rrect
, second_paint
);
263 canvas
->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
264 canvas
->translate(20, 20);
265 rrect
.setRect(SkRect::MakeXYWH(0, 0, 100, 100));
267 canvas
->drawRRect(rrect
, third_paint
);
269 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
271 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
272 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
274 EXPECT_EQ(3u, pixel_refs
.size());
275 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40),
276 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
277 EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35),
278 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
279 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
280 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
283 TEST(PixelRefUtilsTest
, DrawOval
) {
284 gfx::Rect
layer_rect(0, 0, 256, 256);
286 SkPictureRecorder recorder
;
287 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
289 TestDiscardableShader first_shader
;
291 first_paint
.setShader(&first_shader
);
293 TestDiscardableShader second_shader
;
294 SkPaint second_paint
;
295 second_paint
.setShader(&second_shader
);
297 TestDiscardableShader third_shader
;
299 third_paint
.setShader(&third_shader
);
303 canvas
->scale(2, 0.5);
305 canvas
->drawOval(SkRect::MakeXYWH(10, 20, 30, 40), first_paint
);
310 canvas
->translate(1, 2);
312 canvas
->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint
);
316 canvas
->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
317 canvas
->translate(20, 20);
319 canvas
->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint
);
321 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
323 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
324 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
326 EXPECT_EQ(3u, pixel_refs
.size());
327 EXPECT_FLOAT_RECT_EQ(gfx::RectF(20, 10, 60, 20),
328 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
329 EXPECT_FLOAT_RECT_EQ(gfx::RectF(1, 35, 25, 35),
330 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
331 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
332 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
335 TEST(PixelRefUtilsTest
, DrawPath
) {
336 gfx::Rect
layer_rect(0, 0, 256, 256);
338 SkPictureRecorder recorder
;
339 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
341 TestDiscardableShader first_shader
;
343 first_paint
.setShader(&first_shader
);
345 TestDiscardableShader second_shader
;
346 SkPaint second_paint
;
347 second_paint
.setShader(&second_shader
);
352 path
.lineTo(22, 101);
355 canvas
->drawPath(path
, first_paint
);
358 canvas
->clipRect(SkRect::MakeWH(50, 50));
361 canvas
->drawPath(path
, second_paint
);
365 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
367 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
368 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
370 EXPECT_EQ(2u, pixel_refs
.size());
371 EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 88),
372 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
373 EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 37),
374 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
377 TEST(PixelRefUtilsTest
, DrawBitmap
) {
378 gfx::Rect
layer_rect(0, 0, 256, 256);
380 SkPictureRecorder recorder
;
381 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
384 CreateBitmap(gfx::Size(50, 50), "discardable", &first
);
386 CreateBitmap(gfx::Size(50, 50), "discardable", &second
);
388 CreateBitmap(gfx::Size(50, 50), "discardable", &third
);
390 CreateBitmap(gfx::Size(50, 1), "discardable", &fourth
);
392 CreateBitmap(gfx::Size(10, 10), "discardable", &fifth
);
397 canvas
->drawBitmap(first
, 0, 0);
398 canvas
->translate(25, 0);
400 canvas
->drawBitmap(second
, 0, 0);
401 canvas
->translate(0, 50);
403 canvas
->drawBitmap(third
, 25, 0);
408 canvas
->translate(1, 0);
410 // At (1, 0), rotated 90 degrees
411 canvas
->drawBitmap(fourth
, 0, 0);
416 // At (0, 0), scaled by 5 and 6
417 canvas
->drawBitmap(fifth
, 0, 0);
419 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
421 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
422 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
424 EXPECT_EQ(5u, pixel_refs
.size());
425 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
426 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
427 EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50),
428 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
429 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50),
430 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
431 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 1, 50),
432 gfx::SkRectToRectF(pixel_refs
[3].pixel_ref_rect
));
433 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 60),
434 gfx::SkRectToRectF(pixel_refs
[4].pixel_ref_rect
));
438 TEST(PixelRefUtilsTest
, DrawBitmapRect
) {
439 gfx::Rect
layer_rect(0, 0, 256, 256);
441 SkPictureRecorder recorder
;
442 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
445 CreateBitmap(gfx::Size(50, 50), "discardable", &first
);
447 CreateBitmap(gfx::Size(50, 50), "discardable", &second
);
449 CreateBitmap(gfx::Size(50, 50), "discardable", &third
);
451 TestDiscardableShader first_shader
;
453 first_paint
.setShader(&first_shader
);
455 SkPaint non_discardable_paint
;
460 canvas
->drawBitmapRect(
461 first
, SkRect::MakeWH(100, 100), &non_discardable_paint
);
462 canvas
->translate(25, 0);
464 canvas
->drawBitmapRect(
465 second
, SkRect::MakeXYWH(50, 50, 10, 10), &non_discardable_paint
);
466 canvas
->translate(5, 50);
467 // (0, 30, 100, 100). One from bitmap, one from paint.
468 canvas
->drawBitmapRect(
469 third
, SkRect::MakeXYWH(-30, -20, 100, 100), &first_paint
);
473 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
475 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
476 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
478 EXPECT_EQ(4u, pixel_refs
.size());
479 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100),
480 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
481 EXPECT_FLOAT_RECT_EQ(gfx::RectF(75, 50, 10, 10),
482 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
483 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100),
484 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
485 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100),
486 gfx::SkRectToRectF(pixel_refs
[3].pixel_ref_rect
));
489 TEST(PixelRefUtilsTest
, DrawSprite
) {
490 gfx::Rect
layer_rect(0, 0, 256, 256);
492 SkPictureRecorder recorder
;
493 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
496 CreateBitmap(gfx::Size(50, 50), "discardable", &first
);
498 CreateBitmap(gfx::Size(50, 50), "discardable", &second
);
500 CreateBitmap(gfx::Size(50, 50), "discardable", &third
);
502 CreateBitmap(gfx::Size(50, 50), "discardable", &fourth
);
504 CreateBitmap(gfx::Size(50, 50), "discardable", &fifth
);
508 // Sprites aren't affected by the current matrix.
511 canvas
->drawSprite(first
, 0, 0);
512 canvas
->translate(25, 0);
514 canvas
->drawSprite(second
, 10, 0);
515 canvas
->translate(0, 50);
517 canvas
->drawSprite(third
, 25, 0);
524 canvas
->drawSprite(fourth
, 0, 0);
528 TestDiscardableShader first_shader
;
530 first_paint
.setShader(&first_shader
);
533 // (100, 100, 50, 50).
534 canvas
->drawSprite(fifth
, 100, 100, &first_paint
);
536 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
538 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
539 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
541 EXPECT_EQ(6u, pixel_refs
.size());
542 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
543 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
544 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 0, 50, 50),
545 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
546 EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50),
547 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));
548 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50),
549 gfx::SkRectToRectF(pixel_refs
[3].pixel_ref_rect
));
550 EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50),
551 gfx::SkRectToRectF(pixel_refs
[4].pixel_ref_rect
));
552 EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50),
553 gfx::SkRectToRectF(pixel_refs
[5].pixel_ref_rect
));
556 TEST(PixelRefUtilsTest
, DrawText
) {
557 gfx::Rect
layer_rect(0, 0, 256, 256);
559 SkPictureRecorder recorder
;
560 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
562 TestDiscardableShader first_shader
;
564 first_paint
.setShader(&first_shader
);
567 points
[0].set(10, 50);
568 points
[1].set(20, 50);
569 points
[2].set(30, 50);
570 points
[3].set(40, 50);
579 canvas
->drawText("text", 4, 50, 50, first_paint
);
580 canvas
->drawPosText("text", 4, points
, first_paint
);
581 canvas
->drawTextOnPath("text", 4, path
, NULL
, first_paint
);
583 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
585 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
586 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
588 EXPECT_EQ(3u, pixel_refs
.size());
591 TEST(PixelRefUtilsTest
, DrawVertices
) {
592 gfx::Rect
layer_rect(0, 0, 256, 256);
594 SkPictureRecorder recorder
;
595 SkCanvas
* canvas
= StartRecording(&recorder
, layer_rect
);
597 TestDiscardableShader first_shader
;
599 first_paint
.setShader(&first_shader
);
601 TestDiscardableShader second_shader
;
602 SkPaint second_paint
;
603 second_paint
.setShader(&second_shader
);
605 TestDiscardableShader third_shader
;
607 third_paint
.setShader(&third_shader
);
611 uint16_t indecies
[3] = {0, 1, 2};
612 points
[0].set(10, 10);
613 points
[1].set(100, 20);
614 points
[2].set(50, 100);
616 canvas
->drawVertices(SkCanvas::kTriangles_VertexMode
,
628 canvas
->clipRect(SkRect::MakeWH(50, 50));
630 canvas
->drawVertices(SkCanvas::kTriangles_VertexMode
,
642 points
[0].set(50, 55);
643 points
[1].set(50, 55);
644 points
[2].set(200, 200);
645 // (50, 55, 150, 145).
646 canvas
->drawVertices(SkCanvas::kTriangles_VertexMode
,
656 skia::RefPtr
<SkPicture
> picture
= skia::AdoptRef(StopRecording(&recorder
, canvas
));
658 std::vector
<skia::PixelRefUtils::PositionPixelRef
> pixel_refs
;
659 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture
.get(), &pixel_refs
);
661 EXPECT_EQ(3u, pixel_refs
.size());
662 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90),
663 gfx::SkRectToRectF(pixel_refs
[0].pixel_ref_rect
));
664 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40),
665 gfx::SkRectToRectF(pixel_refs
[1].pixel_ref_rect
));
666 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145),
667 gfx::SkRectToRectF(pixel_refs
[2].pixel_ref_rect
));