Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "base/compiler_specific.h" | 5 #include "base/compiler_specific.h" |
| 6 #include "skia/ext/analysis_canvas.h" | 6 #include "skia/ext/analysis_canvas.h" |
| 7 | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "third_party/skia/include/core/SkShader.h" | |
| 9 | 9 |
| 10 namespace { | 10 namespace { |
| 11 | 11 |
| 12 void solidColorFill(skia::AnalysisCanvas& canvas) { | 12 void solidColorFill(skia::AnalysisCanvas& canvas) { |
| 13 canvas.clear(SkColorSetARGB(255, 255, 255, 255)); | 13 canvas.clear(SkColorSetARGB(255, 255, 255, 255)); |
| 14 } | 14 } |
| 15 | 15 |
| 16 void transparentFill(skia::AnalysisCanvas& canvas) { | 16 void transparentFill(skia::AnalysisCanvas& canvas) { |
| 17 canvas.clear(SkColorSetARGB(0, 0, 0, 0)); | 17 canvas.clear(SkColorSetARGB(0, 0, 0, 0)); |
| 18 } | 18 } |
| 19 | 19 |
| 20 } // namespace | 20 } // namespace |
| 21 namespace skia { | 21 namespace skia { |
| 22 | 22 |
| 23 class TestPixelRef : public SkPixelRef { | |
| 24 public: | |
| 25 // Pure virtual implementation. | |
| 26 SkFlattenable::Factory getFactory() { return NULL; } | |
| 27 void* onLockPixels(SkColorTable**) { return NULL; } | |
| 28 void onUnlockPixels() {} | |
| 29 }; | |
| 30 | |
| 31 class TestLazyPixelRef : public LazyPixelRef { | |
| 32 public: | |
| 33 // Pure virtual implementation. | |
| 34 SkFlattenable::Factory getFactory() { return NULL; } | |
| 35 void* onLockPixels(SkColorTable**) { return NULL; } | |
| 36 void onUnlockPixels() {} | |
| 37 bool PrepareToDecode(const PrepareParams& params) { return true; } | |
| 38 void Decode() {} | |
| 39 }; | |
| 40 | |
| 41 class TestShader : public SkShader { | |
| 42 public: | |
| 43 TestShader(SkBitmap* bitmap) | |
| 44 : bitmap_(bitmap) { | |
| 45 } | |
| 46 | |
| 47 SkShader::BitmapType asABitmap(SkBitmap* bitmap, SkMatrix*, TileMode xy[2]) co nst { | |
|
Sami
2013/03/18 12:14:33
Nit: line length.
| |
| 48 *bitmap = *bitmap_; | |
| 49 return SkShader::kDefault_BitmapType; | |
| 50 } | |
| 51 | |
| 52 // Pure virtual implementation. | |
| 53 void shadeSpan(int x, int y, SkPMColor[], int count) {} | |
| 54 SkFlattenable::Factory getFactory() { return NULL; } | |
| 55 | |
| 56 private: | |
| 57 | |
| 58 SkBitmap* bitmap_; | |
| 59 }; | |
| 60 | |
| 23 TEST(AnalysisCanvasTest, EmptyCanvas) { | 61 TEST(AnalysisCanvasTest, EmptyCanvas) { |
| 24 SkBitmap emptyBitmap; | 62 SkBitmap emptyBitmap; |
| 25 emptyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | 63 emptyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); |
| 26 skia::AnalysisDevice device(emptyBitmap); | 64 skia::AnalysisDevice device(emptyBitmap); |
| 27 skia::AnalysisCanvas canvas(&device); | 65 skia::AnalysisCanvas canvas(&device); |
| 28 | 66 |
| 29 SkColor color; | 67 SkColor color; |
| 30 EXPECT_FALSE(canvas.getColorIfSolid(&color)); | 68 EXPECT_FALSE(canvas.getColorIfSolid(&color)); |
| 31 EXPECT_FALSE(canvas.isTransparent()); | 69 EXPECT_FALSE(canvas.isTransparent()); |
| 32 EXPECT_TRUE(canvas.isCheap()); | 70 EXPECT_TRUE(canvas.isCheap()); |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 303 | 341 |
| 304 transparentFill(canvas); | 342 transparentFill(canvas); |
| 305 EXPECT_FALSE(canvas.getColorIfSolid(&outputColor)); | 343 EXPECT_FALSE(canvas.getColorIfSolid(&outputColor)); |
| 306 EXPECT_TRUE(canvas.isTransparent()); | 344 EXPECT_TRUE(canvas.isTransparent()); |
| 307 | 345 |
| 308 solidColorFill(canvas); | 346 solidColorFill(canvas); |
| 309 EXPECT_TRUE(canvas.getColorIfSolid(&outputColor)); | 347 EXPECT_TRUE(canvas.getColorIfSolid(&outputColor)); |
| 310 EXPECT_FALSE(canvas.isTransparent()); | 348 EXPECT_FALSE(canvas.isTransparent()); |
| 311 } | 349 } |
| 312 | 350 |
| 351 TEST(AnalysisCanvasTest, LazyPixelRefs) { | |
| 352 // Set up two lazy and two non-lazy pixel refs and the corresponding bitmaps. | |
| 353 TestLazyPixelRef firstLazyPixelRef; | |
| 354 firstLazyPixelRef.setURI("lazy"); | |
| 355 TestLazyPixelRef secondLazyPixelRef; | |
| 356 secondLazyPixelRef.setURI("lazy"); | |
| 357 | |
| 358 TestPixelRef firstNonLazyPixelRef; | |
| 359 TestPixelRef secondNonLazyPixelRef; | |
| 360 secondNonLazyPixelRef.setURI("notsolazy"); | |
| 361 | |
| 362 SkBitmap firstLazyBitmap; | |
| 363 firstLazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 364 firstLazyBitmap.setPixelRef(&firstLazyPixelRef); | |
| 365 SkBitmap secondLazyBitmap; | |
| 366 secondLazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 367 secondLazyBitmap.setPixelRef(&secondLazyPixelRef); | |
| 368 | |
| 369 SkBitmap firstNonLazyBitmap; | |
| 370 firstNonLazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 371 SkBitmap secondNonLazyBitmap; | |
| 372 secondNonLazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 373 secondNonLazyBitmap.setPixelRef(&secondNonLazyPixelRef); | |
| 374 | |
| 375 // The testcase starts here. | |
| 376 SkBitmap emptyBitmap; | |
| 377 emptyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 378 skia::AnalysisDevice device(emptyBitmap); | |
| 379 skia::AnalysisCanvas canvas(&device); | |
| 380 | |
| 381 // This should be the first ref. | |
| 382 canvas.drawBitmap(firstLazyBitmap, 0, 0); | |
| 383 // The following will be ignored (non-lazy). | |
| 384 canvas.drawBitmap(firstNonLazyBitmap, 0, 0); | |
| 385 canvas.drawBitmap(firstNonLazyBitmap, 0, 0); | |
| 386 canvas.drawBitmap(secondNonLazyBitmap, 0, 0); | |
| 387 canvas.drawBitmap(secondNonLazyBitmap, 0, 0); | |
| 388 // This one will be ignored (already exists). | |
| 389 canvas.drawBitmap(firstLazyBitmap, 0, 0); | |
| 390 // This should be the second ref. | |
| 391 canvas.drawBitmap(secondLazyBitmap, 0, 0); | |
| 392 | |
| 393 std::list<skia::LazyPixelRef*> pixelRefs; | |
| 394 canvas.consumeLazyPixelRefs(pixelRefs); | |
| 395 | |
| 396 // We expect to get only lazy pixel refs and only unique results. | |
| 397 EXPECT_EQ(pixelRefs.size(), 2u); | |
| 398 if (!pixelRefs.empty()) { | |
| 399 EXPECT_EQ(pixelRefs.front(), static_cast<LazyPixelRef*>(&firstLazyPixelRef)) ; | |
|
Sami
2013/03/18 12:14:33
Nit: line length.
| |
| 400 EXPECT_EQ(pixelRefs.back(), static_cast<LazyPixelRef*>(&secondLazyPixelRef)) ; | |
| 401 } | |
| 402 } | |
| 403 | |
| 404 TEST(AnalysisCanvasTest, PixelRefsFromPaint) { | |
| 405 TestLazyPixelRef lazyPixelRef; | |
| 406 lazyPixelRef.setURI("lazy"); | |
| 407 | |
| 408 TestPixelRef nonLazyPixelRef; | |
| 409 nonLazyPixelRef.setURI("notsolazy"); | |
| 410 | |
| 411 SkBitmap lazyBitmap; | |
| 412 lazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 413 lazyBitmap.setPixelRef(&lazyPixelRef); | |
| 414 | |
| 415 SkBitmap nonLazyBitmap; | |
| 416 nonLazyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 417 nonLazyBitmap.setPixelRef(&nonLazyPixelRef); | |
| 418 | |
| 419 TestShader lazyShader(&lazyBitmap); | |
| 420 TestShader nonLazyShader(&nonLazyBitmap); | |
| 421 | |
| 422 SkPaint lazyPaint; | |
| 423 lazyPaint.setShader(&lazyShader); | |
| 424 SkPaint nonLazyPaint; | |
| 425 nonLazyPaint.setShader(&nonLazyShader); | |
| 426 | |
| 427 SkBitmap emptyBitmap; | |
| 428 emptyBitmap.setConfig(SkBitmap::kNo_Config, 255, 255); | |
| 429 skia::AnalysisDevice device(emptyBitmap); | |
| 430 skia::AnalysisCanvas canvas(&device); | |
| 431 | |
| 432 canvas.drawRect(SkRect::MakeWH(255, 255), lazyPaint); | |
| 433 canvas.drawRect(SkRect::MakeWH(255, 255), lazyPaint); | |
| 434 canvas.drawRect(SkRect::MakeWH(255, 255), lazyPaint); | |
| 435 canvas.drawRect(SkRect::MakeWH(255, 255), nonLazyPaint); | |
| 436 canvas.drawRect(SkRect::MakeWH(255, 255), nonLazyPaint); | |
| 437 canvas.drawRect(SkRect::MakeWH(255, 255), nonLazyPaint); | |
| 438 | |
| 439 std::list<skia::LazyPixelRef*> pixelRefs; | |
| 440 canvas.consumeLazyPixelRefs(pixelRefs); | |
| 441 | |
| 442 // We expect to get only lazy pixel refs and only unique results. | |
| 443 EXPECT_EQ(pixelRefs.size(), 1u); | |
| 444 if (!pixelRefs.empty()) { | |
| 445 EXPECT_EQ(pixelRefs.front(), static_cast<LazyPixelRef*>(&lazyPixelRef)); | |
| 446 } | |
| 447 } | |
| 448 | |
| 313 } // namespace skia | 449 } // namespace skia |
| OLD | NEW |