aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gyp/tests.gypi1
-rw-r--r--include/core/SkShader.h4
-rw-r--r--src/core/SkPictureShader.cpp26
-rw-r--r--tests/PictureShaderTest.cpp26
4 files changed, 39 insertions, 18 deletions
diff --git a/gyp/tests.gypi b/gyp/tests.gypi
index 5c3ce94dc6..e6c6bb0e32 100644
--- a/gyp/tests.gypi
+++ b/gyp/tests.gypi
@@ -127,6 +127,7 @@
'../tests/PathTest.cpp',
'../tests/PathUtilsTest.cpp',
'../tests/PictureTest.cpp',
+ '../tests/PictureShaderTest.cpp',
'../tests/PictureUtilsTest.cpp',
'../tests/PixelRefTest.cpp',
'../tests/PointTest.cpp',
diff --git a/include/core/SkShader.h b/include/core/SkShader.h
index 076ecf5460..6566e691a4 100644
--- a/include/core/SkShader.h
+++ b/include/core/SkShader.h
@@ -349,7 +349,9 @@ public:
/** Call this to create a new shader that will draw with the specified picture.
*
* @param src The picture to use inside the shader (if not NULL, its ref count
- * is incremented).
+ * is incremented). The SkPicture must not be changed after
+ * successfully creating a picture shader.
+ * FIXME: src cannot be const due to SkCanvas::drawPicture
* @param tmx The tiling mode to use when sampling the bitmap in the x-direction.
* @param tmy The tiling mode to use when sampling the bitmap in the y-direction.
* @return Returns a new shader object. Note: this function never returns null.
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp
index 15df3a37a5..bf312851ab 100644
--- a/src/core/SkPictureShader.cpp
+++ b/src/core/SkPictureShader.cpp
@@ -19,28 +19,25 @@
#endif
SkPictureShader::SkPictureShader(SkPicture* picture, TileMode tmx, TileMode tmy)
- : fPicture(picture)
+ : fPicture(SkRef(picture))
, fTmx(tmx)
- , fTmy(tmy) {
- SkSafeRef(fPicture);
-}
+ , fTmy(tmy) { }
SkPictureShader::SkPictureShader(SkReadBuffer& buffer)
: INHERITED(buffer) {
fTmx = static_cast<SkShader::TileMode>(buffer.read32());
fTmy = static_cast<SkShader::TileMode>(buffer.read32());
- if (buffer.readBool()) {
- fPicture = SkPicture::CreateFromBuffer(buffer);
- } else {
- fPicture = NULL;
- }
+ fPicture = SkPicture::CreateFromBuffer(buffer);
}
SkPictureShader::~SkPictureShader() {
- SkSafeUnref(fPicture);
+ fPicture->unref();
}
SkPictureShader* SkPictureShader::Create(SkPicture* picture, TileMode tmx, TileMode tmy) {
+ if (!picture || 0 == picture->width() || 0 == picture->height()) {
+ return NULL;
+ }
return SkNEW_ARGS(SkPictureShader, (picture, tmx, tmy));
}
@@ -49,16 +46,11 @@ void SkPictureShader::flatten(SkWriteBuffer& buffer) const {
buffer.write32(fTmx);
buffer.write32(fTmy);
- buffer.writeBool(NULL != fPicture);
- if (fPicture) {
- fPicture->flatten(buffer);
- }
+ fPicture->flatten(buffer);
}
bool SkPictureShader::buildBitmapShader(const SkMatrix& matrix) const {
- if (!fPicture || (0 == fPicture->width() && 0 == fPicture->height())) {
- return false;
- }
+ SkASSERT(fPicture && fPicture->width() > 0 && fPicture->height() > 0);
SkMatrix m;
if (this->hasLocalMatrix()) {
diff --git a/tests/PictureShaderTest.cpp b/tests/PictureShaderTest.cpp
new file mode 100644
index 0000000000..17ef5b56be
--- /dev/null
+++ b/tests/PictureShaderTest.cpp
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#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.
+DEF_TEST(PictureShader_empty, reporter) {
+ SkShader* shader = SkShader::CreatePictureShader(NULL,
+ SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
+ REPORTER_ASSERT(reporter, NULL == shader);
+
+ SkPictureRecorder factory;
+ factory.beginRecording(0, 0, NULL, 0);
+ SkAutoTUnref<SkPicture> picture(factory.endRecording());
+ shader = SkShader::CreatePictureShader(picture.get(),
+ SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
+ REPORTER_ASSERT(reporter, NULL == shader);
+}