diff options
author | mtklein <mtklein@chromium.org> | 2015-05-18 13:44:35 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-18 13:44:35 -0700 |
commit | cfa90a1aaff2ffbb71a8597905607287856601e5 (patch) | |
tree | 12b15dce4ff841d56aeeae01f6e026c92efdaada | |
parent | 7be0ce0ab123bbad8ec22b67b8593f1bdd5179e0 (diff) |
Empty picture shaders should draw nothing.
BUG=skia:
Review URL: https://codereview.chromium.org/1142053004
-rw-r--r-- | src/core/SkPictureShader.cpp | 8 | ||||
-rw-r--r-- | src/core/SkPictureShader.h | 2 | ||||
-rw-r--r-- | tests/PictureShaderTest.cpp | 30 |
3 files changed, 28 insertions, 12 deletions
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp index c1c4755058..cb508d476b 100644 --- a/src/core/SkPictureShader.cpp +++ b/src/core/SkPictureShader.cpp @@ -114,10 +114,10 @@ SkPictureShader::~SkPictureShader() { fPicture->unref(); } -SkPictureShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx, TileMode tmy, +SkShader* SkPictureShader::Create(const SkPicture* picture, TileMode tmx, TileMode tmy, const SkMatrix* localMatrix, const SkRect* tile) { if (!picture || picture->cullRect().isEmpty() || (tile && tile->isEmpty())) { - return NULL; + return SkShader::CreateEmptyShader(); } return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy, localMatrix, tile)); } @@ -185,7 +185,7 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri SkISize tileSize = scaledSize.toRound(); if (tileSize.isEmpty()) { - return NULL; + return SkShader::CreateEmptyShader(); } // The actual scale, compensating for rounding & clamping. @@ -204,7 +204,7 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix, const SkMatri SkBitmap bm; bm.setInfo(SkImageInfo::MakeN32Premul(tileSize)); if (!cache_try_alloc_pixels(&bm)) { - return NULL; + return SkShader::CreateEmptyShader(); } bm.eraseColor(SK_ColorTRANSPARENT); diff --git a/src/core/SkPictureShader.h b/src/core/SkPictureShader.h index 3fa27b5a65..98b6d5f77d 100644 --- a/src/core/SkPictureShader.h +++ b/src/core/SkPictureShader.h @@ -21,7 +21,7 @@ class SkPicture; */ class SkPictureShader : public SkShader { public: - static SkPictureShader* Create(const SkPicture*, TileMode, TileMode, const SkMatrix*, + static SkShader* Create(const SkPicture*, TileMode, TileMode, const SkMatrix*, const SkRect*); virtual ~SkPictureShader(); diff --git a/tests/PictureShaderTest.cpp b/tests/PictureShaderTest.cpp index 8d933db600..113f4f86ee 100644 --- a/tests/PictureShaderTest.cpp +++ b/tests/PictureShaderTest.cpp @@ -5,22 +5,38 @@ * found in the LICENSE file. */ +#include "SkCanvas.h" #include "SkPicture.h" #include "SkPictureRecorder.h" #include "SkShader.h" #include "Test.h" // Test that attempting to create a picture shader with a NULL picture or -// empty picture returns NULL. +// empty picture returns a shader that draws nothing. DEF_TEST(PictureShader_empty, reporter) { - SkShader* shader = SkShader::CreatePictureShader(NULL, - SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, NULL, NULL); - REPORTER_ASSERT(reporter, NULL == shader); + SkPaint paint; + + SkBitmap bitmap; + bitmap.allocN32Pixels(1,1); + + SkCanvas canvas(bitmap); + canvas.clear(SK_ColorGREEN); + + SkShader* shader = SkShader::CreatePictureShader( + NULL, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, NULL, NULL); + paint.setShader(shader)->unref(); + + canvas.drawRect(SkRect::MakeWH(1,1), paint); + REPORTER_ASSERT(reporter, *bitmap.getAddr32(0,0) == SK_ColorGREEN); + SkPictureRecorder factory; factory.beginRecording(0, 0, NULL, 0); SkAutoTUnref<SkPicture> picture(factory.endRecording()); - shader = SkShader::CreatePictureShader(picture.get(), - SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, NULL, NULL); - REPORTER_ASSERT(reporter, NULL == shader); + shader = SkShader::CreatePictureShader( + picture.get(), SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, NULL, NULL); + paint.setShader(shader)->unref(); + + canvas.drawRect(SkRect::MakeWH(1,1), paint); + REPORTER_ASSERT(reporter, *bitmap.getAddr32(0,0) == SK_ColorGREEN); } |