SkColorFilter.cpp revision 43c50c8c77df82c5cffb55cae2d386e59802b88f
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* libs/graphics/sgl/SkColorFilter.cpp
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Copyright 2006, The Android Open Source Project
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Licensed under the Apache License, Version 2.0 (the "License");
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** you may not use this file except in compliance with the License.
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** You may obtain a copy of the License at
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**     http://www.apache.org/licenses/LICENSE-2.0
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com**
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** Unless required by applicable law or agreed to in writing, software
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** distributed under the License is distributed on an "AS IS" BASIS,
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** See the License for the specific language governing permissions and
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com** limitations under the License.
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2143c50c8c77df82c5cffb55cae2d386e59802b88freed@google.combool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) {
2243c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com    return false;
2343c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com}
2443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkColorFilter::filterSpan16(const uint16_t s[], int count, uint16_t d[])
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(this->getFlags() & SkColorFilter::kHasFilter16_Flag);
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(!"missing implementation of SkColorFilter::filterSpan16");
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (d != s)
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        memcpy(d, s, count * sizeof(uint16_t));
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFilterShader::SkFilterShader(SkShader* shader, SkColorFilter* filter)
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader = shader;   shader->ref();
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFilter = filter;   filter->ref();
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFilterShader::SkFilterShader(SkFlattenableReadBuffer& buffer) :
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    INHERITED(buffer)
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader = static_cast<SkShader*>(buffer.readFlattenable());
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFilter = static_cast<SkColorFilter*>(buffer.readFlattenable());
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFilterShader::~SkFilterShader()
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFilter->unref();
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader->unref();
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFilterShader::beginSession()
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->INHERITED::beginSession();
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader->beginSession();
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFilterShader::endSession()
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader->endSession();
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->INHERITED::endSession();
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFilterShader::flatten(SkFlattenableWriteBuffer& buffer)
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->INHERITED::flatten(buffer);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    buffer.writeFlattenable(fShader);
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    buffer.writeFlattenable(fFilter);
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comuint32_t SkFilterShader::getFlags()
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t shaderF = fShader->getFlags();
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t filterF = fFilter->getFlags();
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // if the filter doesn't support 16bit, clear the matching bit in the shader
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!(filterF & SkColorFilter::kHasFilter16_Flag))
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        shaderF &= ~SkShader::kHasSpan16_Flag;
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // if the filter might change alpha, clear the opaque flag in the shader
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!(filterF & SkColorFilter::kAlphaUnchanged_Flag))
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        shaderF &= ~(SkShader::kOpaqueAlpha_Flag | SkShader::kHasSpan16_Flag);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return shaderF;
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkFilterShader::setContext(const SkBitmap& device,
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                const SkPaint& paint,
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                const SkMatrix& matrix)
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return  this->INHERITED::setContext(device, paint, matrix) &&
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            fShader->setContext(device, paint, matrix);
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFilterShader::shadeSpan(int x, int y, SkPMColor result[], int count)
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader->shadeSpan(x, y, result, count);
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFilter->filterSpan(result, count, result);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFilterShader::shadeSpan16(int x, int y, uint16_t result[], int count)
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(fShader->getFlags() & SkShader::kHasSpan16_Flag);
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(fFilter->getFlags() & SkColorFilter::kHasFilter16_Flag);
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fShader->shadeSpan16(x, y, result, count);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFilter->filterSpan16(result, count, result);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
113