diff options
-rw-r--r-- | gyp/tests.gypi | 1 | ||||
-rw-r--r-- | include/core/SkShader.h | 4 | ||||
-rw-r--r-- | src/core/SkPictureShader.cpp | 26 | ||||
-rw-r--r-- | tests/PictureShaderTest.cpp | 26 |
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); +} |