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