| Index: src/core/SkFilterShader.cpp
|
| diff --git a/src/core/SkFilterShader.cpp b/src/core/SkFilterShader.cpp
|
| index a10a7c9d77b0fb2bbcede4d71b3f5f81a1bbaab9..48c4b8b477314ba2fbf9a6e64a5859754c7023d7 100644
|
| --- a/src/core/SkFilterShader.cpp
|
| +++ b/src/core/SkFilterShader.cpp
|
| @@ -46,12 +46,13 @@
|
| 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 @@
|
| 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: (");
|
|
|