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