Chromium Code Reviews| Index: src/core/SkPictureShader.cpp |
| diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp |
| index 81f9242854576442f221cce7814261b10bb41817..b8f377b783b7bef19838992942fcc3ddc3bbbe2a 100644 |
| --- a/src/core/SkPictureShader.cpp |
| +++ b/src/core/SkPictureShader.cpp |
| @@ -110,58 +110,51 @@ SkShader* SkPictureShader::refBitmapShader(const SkMatrix& matrix) const { |
| return fCachedBitmapShader; |
| } |
| -SkShader* SkPictureShader::validInternal(const ContextRec& rec, SkMatrix* totalInverse) const { |
| - if (!this->INHERITED::validContext(rec, totalInverse)) { |
| - return NULL; |
| - } |
| +size_t SkPictureShader::contextSize() const { |
| + return sizeof(PictureShaderContext); |
| +} |
| +SkShader::Context* SkPictureShader::onCreateContext(const ContextRec& rec, void* storage) const { |
| SkAutoTUnref<SkShader> bitmapShader(this->refBitmapShader(*rec.fMatrix)); |
| - if (!bitmapShader || !bitmapShader->validContext(rec)) { |
| + if (NULL == bitmapShader.get()) { |
| return NULL; |
| } |
| - return bitmapShader.detach(); |
| -} |
| - |
| -bool SkPictureShader::validContext(const ContextRec& rec, SkMatrix* totalInverse) const { |
| - SkAutoTUnref<SkShader> shader(this->validInternal(rec, totalInverse)); |
| - return shader != NULL; |
| -} |
| - |
| -SkShader::Context* SkPictureShader::createContext(const ContextRec& rec, void* storage) const { |
| - SkAutoTUnref<SkShader> bitmapShader(this->validInternal(rec, NULL)); |
| - if (!bitmapShader) { |
| - return NULL; |
| + PictureShaderContext* ctx = SkNEW_PLACEMENT_ARGS(storage, PictureShaderContext, |
| + (*this, rec, bitmapShader.detach())); |
| + if (!ctx->isValid()) { |
|
scroggo
2014/05/05 14:01:19
Don't we have a general rule against creating an o
reed1
2014/05/05 15:10:01
Done.
|
| + ctx->~PictureShaderContext(); |
| + ctx = NULL; |
| } |
| - |
| - return SkNEW_PLACEMENT_ARGS(storage, PictureShaderContext, (*this, rec, bitmapShader.detach())); |
| + return ctx; |
| } |
| -size_t SkPictureShader::contextSize() const { |
| - return sizeof(PictureShaderContext); |
| -} |
| +///////////////////////////////////////////////////////////////////////////////////////// |
| SkPictureShader::PictureShaderContext::PictureShaderContext( |
| const SkPictureShader& shader, const ContextRec& rec, SkShader* bitmapShader) |
| : INHERITED(shader, rec) |
| - , fBitmapShader(bitmapShader) |
| + , fBitmapShader(SkRef(bitmapShader)) |
| { |
| - SkASSERT(fBitmapShader); |
| - fBitmapShaderContextStorage = sk_malloc_throw(fBitmapShader->contextSize()); |
| - fBitmapShaderContext = fBitmapShader->createContext(rec, fBitmapShaderContextStorage); |
| - SkASSERT(fBitmapShaderContext); |
| + fBitmapShaderContextStorage = sk_malloc_throw(bitmapShader->contextSize()); |
| + fBitmapShaderContext = bitmapShader->createContext(rec, fBitmapShaderContextStorage); |
| + //if fBitmapShaderContext is null, we are invalid |
| } |
| SkPictureShader::PictureShaderContext::~PictureShaderContext() { |
| - fBitmapShaderContext->~Context(); |
| + if (fBitmapShaderContext) { |
| + fBitmapShaderContext->~Context(); |
| + } |
| sk_free(fBitmapShaderContextStorage); |
| } |
| uint32_t SkPictureShader::PictureShaderContext::getFlags() const { |
| + SkASSERT(fBitmapShaderContext); |
| return fBitmapShaderContext->getFlags(); |
| } |
| SkShader::Context::ShadeProc SkPictureShader::PictureShaderContext::asAShadeProc(void** ctx) { |
| + SkASSERT(fBitmapShaderContext); |
| return fBitmapShaderContext->asAShadeProc(ctx); |
| } |