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. 4 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/SkPictureRecorder.h" 14 #include "third_party/skia/include/core/SkPixelRef.h" 15 #include "third_party/skia/include/core/SkPoint.h" 16 #include "third_party/skia/include/core/SkShader.h" 17 #include "third_party/skia/src/core/SkOrderedReadBuffer.h" 18 #include "ui/gfx/rect.h" 19 #include "ui/gfx/skia_util.h" 20 21 namespace skia { 22 23 namespace { 24 25 void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap); 26 27 class TestDiscardableShader : public SkShader { 28 public: 29 TestDiscardableShader() { 30 CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_); 31 } 32 33 TestDiscardableShader(SkReadBuffer& buffer) { 34 CreateBitmap(gfx::Size(50, 50), "discardable", &bitmap_); 35 } 36 37 virtual SkShader::BitmapType asABitmap(SkBitmap* bitmap, 38 SkMatrix* matrix, 39 TileMode xy[2]) const OVERRIDE { 40 if (bitmap) 41 *bitmap = bitmap_; 42 return SkShader::kDefault_BitmapType; 43 } 44 45 // not indended to return an actual context. Just need to supply this. 46 virtual size_t contextSize() const OVERRIDE { 47 return sizeof(SkShader::Context); 48 } 49 50 virtual void flatten(SkWriteBuffer&) const OVERRIDE {} 51 52 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(TestDiscardableShader); 53 54 private: 55 SkBitmap bitmap_; 56 }; 57 58 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING 59 SkFlattenable* TestDiscardableShader::CreateProc(SkReadBuffer&) { 60 return new TestDiscardableShader; 61 } 62 #endif 63 64 void CreateBitmap(gfx::Size size, const char* uri, SkBitmap* bitmap) { 65 bitmap->allocN32Pixels(size.width(), size.height()); 66 bitmap->pixelRef()->setImmutable(); 67 bitmap->pixelRef()->setURI(uri); 68 } 69 70 SkCanvas* StartRecording(SkPictureRecorder* recorder, gfx::Rect layer_rect) { 71 SkCanvas* canvas = 72 recorder->beginRecording(layer_rect.width(), layer_rect.height()); 73 74 canvas->save(); 75 canvas->translate(-layer_rect.x(), -layer_rect.y()); 76 canvas->clipRect(SkRect::MakeXYWH( 77 layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height())); 78 79 return canvas; 80 } 81 82 SkPicture* StopRecording(SkPictureRecorder* recorder, SkCanvas* canvas) { 83 canvas->restore(); 84 return recorder->endRecording(); 85 } 86 87 } // namespace 88 89 TEST(PixelRefUtilsTest, DrawPaint) { 90 gfx::Rect layer_rect(0, 0, 256, 256); 91 92 SkPictureRecorder recorder; 93 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 94 95 TestDiscardableShader first_shader; 96 SkPaint first_paint; 97 first_paint.setShader(&first_shader); 98 99 TestDiscardableShader second_shader; 100 SkPaint second_paint; 101 second_paint.setShader(&second_shader); 102 103 TestDiscardableShader third_shader; 104 SkPaint third_paint; 105 third_paint.setShader(&third_shader); 106 107 canvas->drawPaint(first_paint); 108 canvas->clipRect(SkRect::MakeXYWH(34, 45, 56, 67)); 109 canvas->drawPaint(second_paint); 110 // Total clip is now (34, 45, 56, 55) 111 canvas->clipRect(SkRect::MakeWH(100, 100)); 112 canvas->drawPaint(third_paint); 113 114 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 115 116 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 117 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 118 119 EXPECT_EQ(3u, pixel_refs.size()); 120 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 256, 256), 121 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 122 EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 67), 123 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 124 EXPECT_FLOAT_RECT_EQ(gfx::RectF(34, 45, 56, 55), 125 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 126 } 127 128 TEST(PixelRefUtilsTest, DrawPoints) { 129 gfx::Rect layer_rect(0, 0, 256, 256); 130 131 SkPictureRecorder recorder; 132 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 133 134 TestDiscardableShader first_shader; 135 SkPaint first_paint; 136 first_paint.setShader(&first_shader); 137 138 TestDiscardableShader second_shader; 139 SkPaint second_paint; 140 second_paint.setShader(&second_shader); 141 142 TestDiscardableShader third_shader; 143 SkPaint third_paint; 144 third_paint.setShader(&third_shader); 145 146 SkPoint points[3]; 147 points[0].set(10, 10); 148 points[1].set(100, 20); 149 points[2].set(50, 100); 150 // (10, 10, 90, 90). 151 canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, first_paint); 152 153 canvas->save(); 154 155 canvas->clipRect(SkRect::MakeWH(50, 50)); 156 // (10, 10, 40, 40). 157 canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, second_paint); 158 159 canvas->restore(); 160 161 points[0].set(50, 55); 162 points[1].set(50, 55); 163 points[2].set(200, 200); 164 // (50, 55, 150, 145). 165 canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, third_paint); 166 167 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 168 169 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 170 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 171 172 EXPECT_EQ(3u, pixel_refs.size()); 173 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90), 174 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 175 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40), 176 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 177 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145), 178 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 179 } 180 181 TEST(PixelRefUtilsTest, DrawRect) { 182 gfx::Rect layer_rect(0, 0, 256, 256); 183 184 SkPictureRecorder recorder; 185 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 186 187 TestDiscardableShader first_shader; 188 SkPaint first_paint; 189 first_paint.setShader(&first_shader); 190 191 TestDiscardableShader second_shader; 192 SkPaint second_paint; 193 second_paint.setShader(&second_shader); 194 195 TestDiscardableShader third_shader; 196 SkPaint third_paint; 197 third_paint.setShader(&third_shader); 198 199 // (10, 20, 30, 40). 200 canvas->drawRect(SkRect::MakeXYWH(10, 20, 30, 40), first_paint); 201 202 canvas->save(); 203 204 canvas->translate(5, 17); 205 // (5, 50, 25, 35) 206 canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint); 207 208 canvas->restore(); 209 210 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50)); 211 canvas->translate(20, 20); 212 // (50, 50, 50, 50) 213 canvas->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint); 214 215 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 216 217 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 218 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 219 220 EXPECT_EQ(3u, pixel_refs.size()); 221 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40), 222 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 223 EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35), 224 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 225 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50), 226 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 227 } 228 229 TEST(PixelRefUtilsTest, DrawRRect) { 230 gfx::Rect layer_rect(0, 0, 256, 256); 231 232 SkPictureRecorder recorder; 233 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 234 235 TestDiscardableShader first_shader; 236 SkPaint first_paint; 237 first_paint.setShader(&first_shader); 238 239 TestDiscardableShader second_shader; 240 SkPaint second_paint; 241 second_paint.setShader(&second_shader); 242 243 TestDiscardableShader third_shader; 244 SkPaint third_paint; 245 third_paint.setShader(&third_shader); 246 247 SkRRect rrect; 248 rrect.setRect(SkRect::MakeXYWH(10, 20, 30, 40)); 249 250 // (10, 20, 30, 40). 251 canvas->drawRRect(rrect, first_paint); 252 253 canvas->save(); 254 255 canvas->translate(5, 17); 256 rrect.setRect(SkRect::MakeXYWH(0, 33, 25, 35)); 257 // (5, 50, 25, 35) 258 canvas->drawRRect(rrect, second_paint); 259 260 canvas->restore(); 261 262 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50)); 263 canvas->translate(20, 20); 264 rrect.setRect(SkRect::MakeXYWH(0, 0, 100, 100)); 265 // (50, 50, 50, 50) 266 canvas->drawRRect(rrect, third_paint); 267 268 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 269 270 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 271 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 272 273 EXPECT_EQ(3u, pixel_refs.size()); 274 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 20, 30, 40), 275 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 276 EXPECT_FLOAT_RECT_EQ(gfx::RectF(5, 50, 25, 35), 277 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 278 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50), 279 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 280 } 281 282 TEST(PixelRefUtilsTest, DrawOval) { 283 gfx::Rect layer_rect(0, 0, 256, 256); 284 285 SkPictureRecorder recorder; 286 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 287 288 TestDiscardableShader first_shader; 289 SkPaint first_paint; 290 first_paint.setShader(&first_shader); 291 292 TestDiscardableShader second_shader; 293 SkPaint second_paint; 294 second_paint.setShader(&second_shader); 295 296 TestDiscardableShader third_shader; 297 SkPaint third_paint; 298 third_paint.setShader(&third_shader); 299 300 canvas->save(); 301 302 canvas->scale(2, 0.5); 303 // (20, 10, 60, 20). 304 canvas->drawOval(SkRect::MakeXYWH(10, 20, 30, 40), first_paint); 305 306 canvas->restore(); 307 canvas->save(); 308 309 canvas->translate(1, 2); 310 // (1, 35, 25, 35) 311 canvas->drawRect(SkRect::MakeXYWH(0, 33, 25, 35), second_paint); 312 313 canvas->restore(); 314 315 canvas->clipRect(SkRect::MakeXYWH(50, 50, 50, 50)); 316 canvas->translate(20, 20); 317 // (50, 50, 50, 50) 318 canvas->drawRect(SkRect::MakeXYWH(0, 0, 100, 100), third_paint); 319 320 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 321 322 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 323 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 324 325 EXPECT_EQ(3u, pixel_refs.size()); 326 EXPECT_FLOAT_RECT_EQ(gfx::RectF(20, 10, 60, 20), 327 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 328 EXPECT_FLOAT_RECT_EQ(gfx::RectF(1, 35, 25, 35), 329 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 330 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50), 331 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 332 } 333 334 TEST(PixelRefUtilsTest, DrawPath) { 335 gfx::Rect layer_rect(0, 0, 256, 256); 336 337 SkPictureRecorder recorder; 338 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 339 340 TestDiscardableShader first_shader; 341 SkPaint first_paint; 342 first_paint.setShader(&first_shader); 343 344 TestDiscardableShader second_shader; 345 SkPaint second_paint; 346 second_paint.setShader(&second_shader); 347 348 SkPath path; 349 path.moveTo(12, 13); 350 path.lineTo(50, 50); 351 path.lineTo(22, 101); 352 353 // (12, 13, 38, 88). 354 canvas->drawPath(path, first_paint); 355 356 canvas->save(); 357 canvas->clipRect(SkRect::MakeWH(50, 50)); 358 359 // (12, 13, 38, 37). 360 canvas->drawPath(path, second_paint); 361 362 canvas->restore(); 363 364 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 365 366 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 367 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 368 369 EXPECT_EQ(2u, pixel_refs.size()); 370 EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 88), 371 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 372 EXPECT_FLOAT_RECT_EQ(gfx::RectF(12, 13, 38, 37), 373 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 374 } 375 376 TEST(PixelRefUtilsTest, DrawBitmap) { 377 gfx::Rect layer_rect(0, 0, 256, 256); 378 379 SkPictureRecorder recorder; 380 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 381 382 SkBitmap first; 383 CreateBitmap(gfx::Size(50, 50), "discardable", &first); 384 SkBitmap second; 385 CreateBitmap(gfx::Size(50, 50), "discardable", &second); 386 SkBitmap third; 387 CreateBitmap(gfx::Size(50, 50), "discardable", &third); 388 SkBitmap fourth; 389 CreateBitmap(gfx::Size(50, 1), "discardable", &fourth); 390 SkBitmap fifth; 391 CreateBitmap(gfx::Size(10, 10), "discardable", &fifth); 392 393 canvas->save(); 394 395 // At (0, 0). 396 canvas->drawBitmap(first, 0, 0); 397 canvas->translate(25, 0); 398 // At (25, 0). 399 canvas->drawBitmap(second, 0, 0); 400 canvas->translate(0, 50); 401 // At (50, 50). 402 canvas->drawBitmap(third, 25, 0); 403 404 canvas->restore(); 405 canvas->save(); 406 407 canvas->translate(1, 0); 408 canvas->rotate(90); 409 // At (1, 0), rotated 90 degrees 410 canvas->drawBitmap(fourth, 0, 0); 411 412 canvas->restore(); 413 414 canvas->scale(5, 6); 415 // At (0, 0), scaled by 5 and 6 416 canvas->drawBitmap(fifth, 0, 0); 417 418 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 419 420 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 421 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 422 423 EXPECT_EQ(5u, pixel_refs.size()); 424 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50), 425 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 426 EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50), 427 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 428 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 50, 50, 50), 429 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 430 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 1, 50), 431 gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect)); 432 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 60), 433 gfx::SkRectToRectF(pixel_refs[4].pixel_ref_rect)); 434 435 } 436 437 TEST(PixelRefUtilsTest, DrawBitmapRect) { 438 gfx::Rect layer_rect(0, 0, 256, 256); 439 440 SkPictureRecorder recorder; 441 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 442 443 SkBitmap first; 444 CreateBitmap(gfx::Size(50, 50), "discardable", &first); 445 SkBitmap second; 446 CreateBitmap(gfx::Size(50, 50), "discardable", &second); 447 SkBitmap third; 448 CreateBitmap(gfx::Size(50, 50), "discardable", &third); 449 450 TestDiscardableShader first_shader; 451 SkPaint first_paint; 452 first_paint.setShader(&first_shader); 453 454 SkPaint non_discardable_paint; 455 456 canvas->save(); 457 458 // (0, 0, 100, 100). 459 canvas->drawBitmapRect( 460 first, SkRect::MakeWH(100, 100), &non_discardable_paint); 461 canvas->translate(25, 0); 462 // (75, 50, 10, 10). 463 canvas->drawBitmapRect( 464 second, SkRect::MakeXYWH(50, 50, 10, 10), &non_discardable_paint); 465 canvas->translate(5, 50); 466 // (0, 30, 100, 100). One from bitmap, one from paint. 467 canvas->drawBitmapRect( 468 third, SkRect::MakeXYWH(-30, -20, 100, 100), &first_paint); 469 470 canvas->restore(); 471 472 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 473 474 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 475 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 476 477 EXPECT_EQ(4u, pixel_refs.size()); 478 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100), 479 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 480 EXPECT_FLOAT_RECT_EQ(gfx::RectF(75, 50, 10, 10), 481 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 482 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100), 483 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 484 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 30, 100, 100), 485 gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect)); 486 } 487 488 TEST(PixelRefUtilsTest, DrawSprite) { 489 gfx::Rect layer_rect(0, 0, 256, 256); 490 491 SkPictureRecorder recorder; 492 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 493 494 SkBitmap first; 495 CreateBitmap(gfx::Size(50, 50), "discardable", &first); 496 SkBitmap second; 497 CreateBitmap(gfx::Size(50, 50), "discardable", &second); 498 SkBitmap third; 499 CreateBitmap(gfx::Size(50, 50), "discardable", &third); 500 SkBitmap fourth; 501 CreateBitmap(gfx::Size(50, 50), "discardable", &fourth); 502 SkBitmap fifth; 503 CreateBitmap(gfx::Size(50, 50), "discardable", &fifth); 504 505 canvas->save(); 506 507 // Sprites aren't affected by the current matrix. 508 509 // (0, 0, 50, 50). 510 canvas->drawSprite(first, 0, 0); 511 canvas->translate(25, 0); 512 // (10, 0, 50, 50). 513 canvas->drawSprite(second, 10, 0); 514 canvas->translate(0, 50); 515 // (25, 0, 50, 50). 516 canvas->drawSprite(third, 25, 0); 517 518 canvas->restore(); 519 canvas->save(); 520 521 canvas->rotate(90); 522 // (0, 0, 50, 50). 523 canvas->drawSprite(fourth, 0, 0); 524 525 canvas->restore(); 526 527 TestDiscardableShader first_shader; 528 SkPaint first_paint; 529 first_paint.setShader(&first_shader); 530 531 canvas->scale(5, 6); 532 // (100, 100, 50, 50). 533 canvas->drawSprite(fifth, 100, 100, &first_paint); 534 535 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 536 537 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 538 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 539 540 EXPECT_EQ(6u, pixel_refs.size()); 541 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50), 542 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 543 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 0, 50, 50), 544 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 545 EXPECT_FLOAT_RECT_EQ(gfx::RectF(25, 0, 50, 50), 546 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 547 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 50, 50), 548 gfx::SkRectToRectF(pixel_refs[3].pixel_ref_rect)); 549 EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50), 550 gfx::SkRectToRectF(pixel_refs[4].pixel_ref_rect)); 551 EXPECT_FLOAT_RECT_EQ(gfx::RectF(100, 100, 50, 50), 552 gfx::SkRectToRectF(pixel_refs[5].pixel_ref_rect)); 553 } 554 555 TEST(PixelRefUtilsTest, DrawText) { 556 gfx::Rect layer_rect(0, 0, 256, 256); 557 558 SkPictureRecorder recorder; 559 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 560 561 TestDiscardableShader first_shader; 562 SkPaint first_paint; 563 first_paint.setShader(&first_shader); 564 565 SkPoint points[4]; 566 points[0].set(10, 50); 567 points[1].set(20, 50); 568 points[2].set(30, 50); 569 points[3].set(40, 50); 570 571 SkPath path; 572 path.moveTo(10, 50); 573 path.lineTo(20, 50); 574 path.lineTo(30, 50); 575 path.lineTo(40, 50); 576 path.lineTo(50, 50); 577 578 canvas->drawText("text", 4, 50, 50, first_paint); 579 canvas->drawPosText("text", 4, points, first_paint); 580 canvas->drawTextOnPath("text", 4, path, NULL, first_paint); 581 582 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 583 584 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 585 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 586 587 EXPECT_EQ(3u, pixel_refs.size()); 588 } 589 590 TEST(PixelRefUtilsTest, DrawVertices) { 591 gfx::Rect layer_rect(0, 0, 256, 256); 592 593 SkPictureRecorder recorder; 594 SkCanvas* canvas = StartRecording(&recorder, layer_rect); 595 596 TestDiscardableShader first_shader; 597 SkPaint first_paint; 598 first_paint.setShader(&first_shader); 599 600 TestDiscardableShader second_shader; 601 SkPaint second_paint; 602 second_paint.setShader(&second_shader); 603 604 TestDiscardableShader third_shader; 605 SkPaint third_paint; 606 third_paint.setShader(&third_shader); 607 608 SkPoint points[3]; 609 SkColor colors[3]; 610 uint16_t indecies[3] = {0, 1, 2}; 611 points[0].set(10, 10); 612 points[1].set(100, 20); 613 points[2].set(50, 100); 614 // (10, 10, 90, 90). 615 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, 616 3, 617 points, 618 points, 619 colors, 620 NULL, 621 indecies, 622 3, 623 first_paint); 624 625 canvas->save(); 626 627 canvas->clipRect(SkRect::MakeWH(50, 50)); 628 // (10, 10, 40, 40). 629 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, 630 3, 631 points, 632 points, 633 colors, 634 NULL, 635 indecies, 636 3, 637 second_paint); 638 639 canvas->restore(); 640 641 points[0].set(50, 55); 642 points[1].set(50, 55); 643 points[2].set(200, 200); 644 // (50, 55, 150, 145). 645 canvas->drawVertices(SkCanvas::kTriangles_VertexMode, 646 3, 647 points, 648 points, 649 colors, 650 NULL, 651 indecies, 652 3, 653 third_paint); 654 655 skia::RefPtr<SkPicture> picture = skia::AdoptRef(StopRecording(&recorder, canvas)); 656 657 std::vector<skia::PixelRefUtils::PositionPixelRef> pixel_refs; 658 skia::PixelRefUtils::GatherDiscardablePixelRefs(picture.get(), &pixel_refs); 659 660 EXPECT_EQ(3u, pixel_refs.size()); 661 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 90, 90), 662 gfx::SkRectToRectF(pixel_refs[0].pixel_ref_rect)); 663 EXPECT_FLOAT_RECT_EQ(gfx::RectF(10, 10, 40, 40), 664 gfx::SkRectToRectF(pixel_refs[1].pixel_ref_rect)); 665 EXPECT_FLOAT_RECT_EQ(gfx::RectF(50, 55, 150, 145), 666 gfx::SkRectToRectF(pixel_refs[2].pixel_ref_rect)); 667 } 668 669 } // namespace skia 670