diff options
author | 2014-05-05 18:39:18 +0000 | |
---|---|---|
committer | 2014-05-05 18:39:18 +0000 | |
commit | ce56d965069c1649afe14319cb239e6ad670682a (patch) | |
tree | c9d656d7eeb1cc623fb7f0e0c32725ee11cf4bf5 /src/core/SkComposeShader.cpp | |
parent | 58e428729b8819c35092684034983973ed43ebb2 (diff) |
Remove SkShader virtual method validContext
patch from issue 267923005
BUG=skia:
R=scroggo@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/261773005
git-svn-id: http://skia.googlecode.com/svn/trunk@14573 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkComposeShader.cpp')
-rw-r--r-- | src/core/SkComposeShader.cpp | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/src/core/SkComposeShader.cpp b/src/core/SkComposeShader.cpp index 28511e3e8b..7a7dce66a0 100644 --- a/src/core/SkComposeShader.cpp +++ b/src/core/SkComposeShader.cpp @@ -73,33 +73,13 @@ void SkComposeShader::flatten(SkWriteBuffer& buffer) const { buffer.writeFlattenable(fMode); } -/* We call validContext/createContext on our two worker shaders. - However, we always let them see opaque alpha, and if the paint - really is translucent, then we apply that after the fact. - - */ -bool SkComposeShader::validContext(const ContextRec& rec, SkMatrix* totalInverse) const { - if (!this->INHERITED::validContext(rec, totalInverse)) { - return false; +template <typename T> void safe_call_destructor(T* obj) { + if (obj) { + obj->~T(); } - - // we preconcat our localMatrix (if any) with the device matrix - // before calling our sub-shaders - - SkMatrix tmpM; - tmpM.setConcat(*rec.fMatrix, this->getLocalMatrix()); - - ContextRec newRec(rec); - newRec.fMatrix = &tmpM; - - return fShaderA->validContext(newRec) && fShaderB->validContext(newRec); } -SkShader::Context* SkComposeShader::createContext(const ContextRec& rec, void* storage) const { - if (!this->validContext(rec)) { - return NULL; - } - +SkShader::Context* SkComposeShader::onCreateContext(const ContextRec& rec, void* storage) const { char* aStorage = (char*) storage + sizeof(ComposeShaderContext); char* bStorage = aStorage + fShaderA->contextSize(); @@ -120,11 +100,11 @@ SkShader::Context* SkComposeShader::createContext(const ContextRec& rec, void* s SkShader::Context* contextA = fShaderA->createContext(newRec, aStorage); SkShader::Context* contextB = fShaderB->createContext(newRec, bStorage); - - // Both functions must succeed; otherwise validContext should have returned - // false. - SkASSERT(contextA); - SkASSERT(contextB); + if (!contextA || !contextB) { + safe_call_destructor(contextA); + safe_call_destructor(contextB); + return NULL; + } return SkNEW_PLACEMENT_ARGS(storage, ComposeShaderContext, (*this, rec, contextA, contextB)); } |