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