diff options
Diffstat (limited to 'src/core/SkFilterShader.cpp')
-rw-r--r-- | src/core/SkFilterShader.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/core/SkFilterShader.cpp b/src/core/SkFilterShader.cpp index a10a7c9d77..48c4b8b477 100644 --- a/src/core/SkFilterShader.cpp +++ b/src/core/SkFilterShader.cpp @@ -46,12 +46,13 @@ uint32_t SkFilterShader::FilterShaderContext::getFlags() const { uint32_t shaderF = fShaderContext->getFlags(); uint32_t filterF = filterShader.fFilter->getFlags(); - // filters don't support 16bit, so clear the matching bit in the shader - shaderF &= ~SkShader::kHasSpan16_Flag; - + // if the filter doesn't support 16bit, clear the matching bit in the shader + if (!(filterF & SkColorFilter::kHasFilter16_Flag)) { + shaderF &= ~SkShader::kHasSpan16_Flag; + } // if the filter might change alpha, clear the opaque flag in the shader if (!(filterF & SkColorFilter::kAlphaUnchanged_Flag)) { - shaderF &= ~SkShader::kOpaqueAlpha_Flag; + shaderF &= ~(SkShader::kOpaqueAlpha_Flag | SkShader::kHasSpan16_Flag); } return shaderF; } @@ -86,6 +87,16 @@ void SkFilterShader::FilterShaderContext::shadeSpan(int x, int y, SkPMColor resu filterShader.fFilter->filterSpan(result, count, result); } +void SkFilterShader::FilterShaderContext::shadeSpan16(int x, int y, uint16_t result[], int count) { + const SkFilterShader& filterShader = static_cast<const SkFilterShader&>(fShader); + + SkASSERT(fShaderContext->getFlags() & SkShader::kHasSpan16_Flag); + SkASSERT(filterShader.fFilter->getFlags() & SkColorFilter::kHasFilter16_Flag); + + fShaderContext->shadeSpan16(x, y, result, count); + filterShader.fFilter->filterSpan16(result, count, result); +} + #ifndef SK_IGNORE_TO_STRING void SkFilterShader::toString(SkString* str) const { str->append("SkFilterShader: ("); |