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