Probably broke Win7 Tests (dbg)(6). http://build.chromium.org/p/chromium.win/builders...
[chromium-blink-merge.git] / skia / ext / pixel_ref_utils_unittest.cc
blobbddbe657934d7f5e5a5f6c01193ef148594d72eb
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"
22 namespace skia {
24 namespace {
26 void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap);
28 class TestDiscardableShader : public SkShader {
29 public:
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();
39 reader->skip(-4);
40 uint32_t toSkip = reader->readU32();
41 reader->skip(toSkip);
43 CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_);
46 virtual SkShader::BitmapType asABitmap(SkBitmap* bitmap,
47 SkMatrix* matrix,
48 TileMode xy[2]) const OVERRIDE {
49 if (bitmap)
50 *bitmap = bitmap_;
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);
61 private:
62 SkBitmap bitmap_;
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) {
72 SkCanvas* canvas =
73 recorder->beginRecording(layer_rect.width(), layer_rect.height());
75 canvas->save();
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()));
80 return canvas;
83 SkPicture* StopRecording(SkPictureRecorder* recorder, SkCanvas* canvas) {
84 canvas->restore();
85 return recorder->endRecording();
88 } // namespace
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;
97 SkPaint first_paint;
98 first_paint.setShader(&first_shader);
100 TestDiscardableShader second_shader;
101 SkPaint second_paint;
102 second_paint.setShader(&second_shader);
104 TestDiscardableShader third_shader;
105 SkPaint third_paint;
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;
136 SkPaint first_paint;
137 first_paint.setShader(&first_shader);
139 TestDiscardableShader second_shader;
140 SkPaint second_paint;
141 second_paint.setShader(&second_shader);
143 TestDiscardableShader third_shader;
144 SkPaint third_paint;
145 third_paint.setShader(&third_shader);
147 SkPoint points[3];
148 points[0].set(10, 10);
149 points[1].set(100, 20);
150 points[2].set(50, 100);
151 // (10, 10, 90, 90).
152 canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, first_paint);
154 canvas->save();
156 canvas->clipRect(SkRect::MakeWH(50, 50));
157 // (10, 10, 40, 40).
158 canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, second_paint);
160 canvas->restore();
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;
189 SkPaint first_paint;
190 first_paint.setShader(&first_shader);
192 TestDiscardableShader second_shader;
193 SkPaint second_paint;
194 second_paint.setShader(&second_shader);
196 TestDiscardableShader third_shader;
197 SkPaint third_paint;
198 third_paint.setShader(&third_shader);
200 // (10, 20, 30, 40).
201 canvas->drawRect(SkRect::MakeXYWH(10, 20, 30, 40), first_paint);
203 canvas->save();
205 canvas->translate(5, 17);
206 // (5, 50, 25, 35)
207 canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint);
209 canvas->restore();
211 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
212 canvas->translate(20, 20);
213 // (50, 50, 50, 50)
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;
237 SkPaint first_paint;
238 first_paint.setShader(&first_shader);
240 TestDiscardableShader second_shader;
241 SkPaint second_paint;
242 second_paint.setShader(&second_shader);
244 TestDiscardableShader third_shader;
245 SkPaint third_paint;
246 third_paint.setShader(&third_shader);
248 SkRRect rrect;
249 rrect.setRect(SkRect::MakeXYWH(10, 20, 30, 40));
251 // (10, 20, 30, 40).
252 canvas->drawRRect(rrect, first_paint);
254 canvas->save();
256 canvas->translate(5, 17);
257 rrect.setRect(SkRect::MakeXYWH(0, 33, 25, 35));
258 // (5, 50, 25, 35)
259 canvas->drawRRect(rrect, second_paint);
261 canvas->restore();
263 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
264 canvas->translate(20, 20);
265 rrect.setRect(SkRect::MakeXYWH(0, 0, 100, 100));
266 // (50, 50, 50, 50)
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;
290 SkPaint first_paint;
291 first_paint.setShader(&first_shader);
293 TestDiscardableShader second_shader;
294 SkPaint second_paint;
295 second_paint.setShader(&second_shader);
297 TestDiscardableShader third_shader;
298 SkPaint third_paint;
299 third_paint.setShader(&third_shader);
301 canvas->save();
303 canvas->scale(2, 0.5);
304 // (20, 10, 60, 20).
305 canvas->drawOval(SkRect::MakeXYWH(10, 20, 30, 40), first_paint);
307 canvas->restore();
308 canvas->save();
310 canvas->translate(1, 2);
311 // (1, 35, 25, 35)
312 canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint);
314 canvas->restore();
316 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50));
317 canvas->translate(20, 20);
318 // (50, 50, 50, 50)
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;
342 SkPaint first_paint;
343 first_paint.setShader(&first_shader);
345 TestDiscardableShader second_shader;
346 SkPaint second_paint;
347 second_paint.setShader(&second_shader);
349 SkPath path;
350 path.moveTo(12, 13);
351 path.lineTo(50, 50);
352 path.lineTo(22, 101);
354 // (12, 13, 38, 88).
355 canvas->drawPath(path, first_paint);
357 canvas->save();
358 canvas->clipRect(SkRect::MakeWH(50, 50));
360 // (12, 13, 38, 37).
361 canvas->drawPath(path, second_paint);
363 canvas->restore();
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);
383 SkBitmap first;
384 CreateBitmap(gfx::Size(50, 50), "discardable", &first);
385 SkBitmap second;
386 CreateBitmap(gfx::Size(50, 50), "discardable", &second);
387 SkBitmap third;
388 CreateBitmap(gfx::Size(50, 50), "discardable", &third);
389 SkBitmap fourth;
390 CreateBitmap(gfx::Size(50, 1), "discardable", &fourth);
391 SkBitmap fifth;
392 CreateBitmap(gfx::Size(10, 10), "discardable", &fifth);
394 canvas->save();
396 // At (0, 0).
397 canvas->drawBitmap(first, 0, 0);
398 canvas->translate(25, 0);
399 // At (25, 0).
400 canvas->drawBitmap(second, 0, 0);
401 canvas->translate(0, 50);
402 // At (50, 50).
403 canvas->drawBitmap(third, 25, 0);
405 canvas->restore();
406 canvas->save();
408 canvas->translate(1, 0);
409 canvas->rotate(90);
410 // At (1, 0), rotated 90 degrees
411 canvas->drawBitmap(fourth, 0, 0);
413 canvas->restore();
415 canvas->scale(5, 6);
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);
444 SkBitmap first;
445 CreateBitmap(gfx::Size(50, 50), "discardable", &first);
446 SkBitmap second;
447 CreateBitmap(gfx::Size(50, 50), "discardable", &second);
448 SkBitmap third;
449 CreateBitmap(gfx::Size(50, 50), "discardable", &third);
451 TestDiscardableShader first_shader;
452 SkPaint first_paint;
453 first_paint.setShader(&first_shader);
455 SkPaint non_discardable_paint;
457 canvas->save();
459 // (0, 0, 100, 100).
460 canvas->drawBitmapRect(
461 first, SkRect::MakeWH(100, 100), &non_discardable_paint);
462 canvas->translate(25, 0);
463 // (75, 50, 10, 10).
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);
471 canvas->restore();
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);
495 SkBitmap first;
496 CreateBitmap(gfx::Size(50, 50), "discardable", &first);
497 SkBitmap second;
498 CreateBitmap(gfx::Size(50, 50), "discardable", &second);
499 SkBitmap third;
500 CreateBitmap(gfx::Size(50, 50), "discardable", &third);
501 SkBitmap fourth;
502 CreateBitmap(gfx::Size(50, 50), "discardable", &fourth);
503 SkBitmap fifth;
504 CreateBitmap(gfx::Size(50, 50), "discardable", &fifth);
506 canvas->save();
508 // Sprites aren't affected by the current matrix.
510 // (0, 0, 50, 50).
511 canvas->drawSprite(first, 0, 0);
512 canvas->translate(25, 0);
513 // (10, 0, 50, 50).
514 canvas->drawSprite(second, 10, 0);
515 canvas->translate(0, 50);
516 // (25, 0, 50, 50).
517 canvas->drawSprite(third, 25, 0);
519 canvas->restore();
520 canvas->save();
522 canvas->rotate(90);
523 // (0, 0, 50, 50).
524 canvas->drawSprite(fourth, 0, 0);
526 canvas->restore();
528 TestDiscardableShader first_shader;
529 SkPaint first_paint;
530 first_paint.setShader(&first_shader);
532 canvas->scale(5, 6);
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;
563 SkPaint first_paint;
564 first_paint.setShader(&first_shader);
566 SkPoint points[4];
567 points[0].set(10, 50);
568 points[1].set(20, 50);
569 points[2].set(30, 50);
570 points[3].set(40, 50);
572 SkPath path;
573 path.moveTo(10, 50);
574 path.lineTo(20, 50);
575 path.lineTo(30, 50);
576 path.lineTo(40, 50);
577 path.lineTo(50, 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;
598 SkPaint first_paint;
599 first_paint.setShader(&first_shader);
601 TestDiscardableShader second_shader;
602 SkPaint second_paint;
603 second_paint.setShader(&second_shader);
605 TestDiscardableShader third_shader;
606 SkPaint third_paint;
607 third_paint.setShader(&third_shader);
609 SkPoint points[3];
610 SkColor colors[3];
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);
615 // (10, 10, 90, 90).
616 canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
618 points,
619 points,
620 colors,
621 NULL,
622 indecies,
624 first_paint);
626 canvas->save();
628 canvas->clipRect(SkRect::MakeWH(50, 50));
629 // (10, 10, 40, 40).
630 canvas->drawVertices(SkCanvas::kTriangles_VertexMode,
632 points,
633 points,
634 colors,
635 NULL,
636 indecies,
638 second_paint);
640 canvas->restore();
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,
648 points,
649 points,
650 colors,
651 NULL,
652 indecies,
654 third_paint);
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));
670 } // namespace skia