1 2/* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#include "SkColorFilter.h" 11#include "SkShader.h" 12#include "SkUnPreMultiply.h" 13 14bool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) { 15 return false; 16} 17 18bool SkColorFilter::asColorMatrix(SkScalar matrix[20]) { 19 return false; 20} 21 22bool SkColorFilter::asComponentTable(SkBitmap*) { 23 return false; 24} 25 26void SkColorFilter::filterSpan16(const uint16_t s[], int count, uint16_t d[]) { 27 SkASSERT(this->getFlags() & SkColorFilter::kHasFilter16_Flag); 28 SkDEBUGFAIL("missing implementation of SkColorFilter::filterSpan16"); 29 30 if (d != s) { 31 memcpy(d, s, count * sizeof(uint16_t)); 32 } 33} 34 35SkColor SkColorFilter::filterColor(SkColor c) { 36 SkPMColor dst, src = SkPreMultiplyColor(c); 37 this->filterSpan(&src, 1, &dst); 38 return SkUnPreMultiply::PMColorToColor(dst); 39} 40 41/////////////////////////////////////////////////////////////////////////////// 42 43SkFilterShader::SkFilterShader(SkShader* shader, SkColorFilter* filter) { 44 fShader = shader; shader->ref(); 45 fFilter = filter; filter->ref(); 46} 47 48SkFilterShader::SkFilterShader(SkFlattenableReadBuffer& buffer) : 49 INHERITED(buffer) { 50 fShader = static_cast<SkShader*>(buffer.readFlattenable()); 51 fFilter = static_cast<SkColorFilter*>(buffer.readFlattenable()); 52} 53 54SkFilterShader::~SkFilterShader() { 55 fFilter->unref(); 56 fShader->unref(); 57} 58 59void SkFilterShader::beginSession() { 60 this->INHERITED::beginSession(); 61 fShader->beginSession(); 62} 63 64void SkFilterShader::endSession() { 65 fShader->endSession(); 66 this->INHERITED::endSession(); 67} 68 69void SkFilterShader::flatten(SkFlattenableWriteBuffer& buffer) { 70 this->INHERITED::flatten(buffer); 71 buffer.writeFlattenable(fShader); 72 buffer.writeFlattenable(fFilter); 73} 74 75uint32_t SkFilterShader::getFlags() { 76 uint32_t shaderF = fShader->getFlags(); 77 uint32_t filterF = fFilter->getFlags(); 78 79 // if the filter doesn't support 16bit, clear the matching bit in the shader 80 if (!(filterF & SkColorFilter::kHasFilter16_Flag)) { 81 shaderF &= ~SkShader::kHasSpan16_Flag; 82 } 83 // if the filter might change alpha, clear the opaque flag in the shader 84 if (!(filterF & SkColorFilter::kAlphaUnchanged_Flag)) { 85 shaderF &= ~(SkShader::kOpaqueAlpha_Flag | SkShader::kHasSpan16_Flag); 86 } 87 return shaderF; 88} 89 90bool SkFilterShader::setContext(const SkBitmap& device, 91 const SkPaint& paint, 92 const SkMatrix& matrix) { 93 return this->INHERITED::setContext(device, paint, matrix) && 94 fShader->setContext(device, paint, matrix); 95} 96 97void SkFilterShader::shadeSpan(int x, int y, SkPMColor result[], int count) { 98 fShader->shadeSpan(x, y, result, count); 99 fFilter->filterSpan(result, count, result); 100} 101 102void SkFilterShader::shadeSpan16(int x, int y, uint16_t result[], int count) { 103 SkASSERT(fShader->getFlags() & SkShader::kHasSpan16_Flag); 104 SkASSERT(fFilter->getFlags() & SkColorFilter::kHasFilter16_Flag); 105 106 fShader->shadeSpan16(x, y, result, count); 107 fFilter->filterSpan16(result, count, result); 108} 109 110