aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2015-05-18 13:44:35 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-18 13:44:35 -0700
commitcfa90a1aaff2ffbb71a8597905607287856601e5 (patch)
tree12b15dce4ff841d56aeeae01f6e026c92efdaada
parent7be0ce0ab123bbad8ec22b67b8593f1bdd5179e0 (diff)
Empty picture shaders should draw nothing.
-rw-r--r--src/core/SkPictureShader.cpp8
-rw-r--r--src/core/SkPictureShader.h2
-rw-r--r--tests/PictureShaderTest.cpp30
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);
}