blob: 58961913c8e4148396f50c8fd4a682804407164f [file] [log] [blame]
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +00001/*
2 * Copyright 2013 Google Inc.
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 "SkFilterShader.h"
9
10#include "SkColorFilter.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000011#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000013#include "SkShader.h"
14#include "SkString.h"
15
16SkFilterShader::SkFilterShader(SkShader* shader, SkColorFilter* filter) {
17 fShader = shader;
18 shader->ref();
19
20 fFilter = filter;
21 filter->ref();
22}
23
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000024SkFilterShader::SkFilterShader(SkReadBuffer& buffer)
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000025 : INHERITED(buffer) {
reed@google.com35348222013-10-16 13:05:06 +000026 fShader = buffer.readShader();
27 fFilter = buffer.readColorFilter();
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000028}
29
30SkFilterShader::~SkFilterShader() {
31 fFilter->unref();
32 fShader->unref();
33}
34
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000035void SkFilterShader::flatten(SkWriteBuffer& buffer) const {
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000036 this->INHERITED::flatten(buffer);
37 buffer.writeFlattenable(fShader);
38 buffer.writeFlattenable(fFilter);
39}
40
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000041uint32_t SkFilterShader::getFlags() {
42 uint32_t shaderF = fShader->getFlags();
43 uint32_t filterF = fFilter->getFlags();
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000044
45 // if the filter doesn't support 16bit, clear the matching bit in the shader
46 if (!(filterF & SkColorFilter::kHasFilter16_Flag)) {
47 shaderF &= ~SkShader::kHasSpan16_Flag;
48 }
49 // if the filter might change alpha, clear the opaque flag in the shader
50 if (!(filterF & SkColorFilter::kAlphaUnchanged_Flag)) {
51 shaderF &= ~(SkShader::kOpaqueAlpha_Flag | SkShader::kHasSpan16_Flag);
52 }
53 return shaderF;
54}
55
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000056bool SkFilterShader::setContext(const SkBitmap& device,
57 const SkPaint& paint,
58 const SkMatrix& matrix) {
59 // we need to keep the setContext/endContext calls balanced. If we return
60 // false, our endContext() will not be called.
61
62 if (!this->INHERITED::setContext(device, paint, matrix)) {
63 return false;
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000064 }
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000065 if (!fShader->setContext(device, paint, matrix)) {
66 this->INHERITED::endContext();
67 return false;
68 }
69 return true;
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000070}
71
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000072void SkFilterShader::endContext() {
73 fShader->endContext();
74 this->INHERITED::endContext();
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000075}
76
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000077void SkFilterShader::shadeSpan(int x, int y, SkPMColor result[], int count) {
78 fShader->shadeSpan(x, y, result, count);
79 fFilter->filterSpan(result, count, result);
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000080}
81
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000082void SkFilterShader::shadeSpan16(int x, int y, uint16_t result[], int count) {
83 SkASSERT(fShader->getFlags() & SkShader::kHasSpan16_Flag);
84 SkASSERT(fFilter->getFlags() & SkColorFilter::kHasFilter16_Flag);
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000085
commit-bot@chromium.org6e5671d2014-04-23 16:16:55 +000086 fShader->shadeSpan16(x, y, result, count);
87 fFilter->filterSpan16(result, count, result);
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000088}
89
commit-bot@chromium.org0f10f7b2014-03-13 18:02:17 +000090#ifndef SK_IGNORE_TO_STRING
tfarina@chromium.org883fe7f2013-07-16 13:05:27 +000091void SkFilterShader::toString(SkString* str) const {
92 str->append("SkFilterShader: (");
93
94 str->append("Shader: ");
95 fShader->toString(str);
96 str->append(" Filter: ");
97 // TODO: add "fFilter->toString(str);" once SkColorFilter::toString is added
98
99 this->INHERITED::toString(str);
100
101 str->append(")");
102}
103#endif