SkColorFilter.cpp revision cff10b21a9934afc540d121b493b204335829589
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h" 98b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h" 105bd055c0386499f2dc8c66173a7534b75af602bfreed#include "SkString.h" 11db873d8677a2d4ecfe38a794a5d868301bdeeabereed#include "SkWriteBuffer.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 13bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.combool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) const { 1443c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com return false; 1543c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com} 1643c50c8c77df82c5cffb55cae2d386e59802b88freed@google.com 17bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.combool SkColorFilter::asColorMatrix(SkScalar matrix[20]) const { 18e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org return false; 19e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org} 20e5ff3cefe007d092daf9d0bc2b03f9ff87b2c34esenorblanco@chromium.org 21b2ad101313cfba9c06a3a4dc06531766bcbec73bbsalomon@google.combool SkColorFilter::asComponentTable(SkBitmap*) const { 227191840eec5ac3b5f5814e4df3cf18264b0b0a4dreed@google.com return false; 237191840eec5ac3b5f5814e4df3cf18264b0b0a4dreed@google.com} 247191840eec5ac3b5f5814e4df3cf18264b0b0a4dreed@google.com 25bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.comvoid SkColorFilter::filterSpan16(const uint16_t s[], int count, uint16_t d[]) const { 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(this->getFlags() & SkColorFilter::kHasFilter16_Flag); 270c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com SkDEBUGFAIL("missing implementation of SkColorFilter::filterSpan16"); 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 29feb8cc870df055099c6fcdfebdd6c1486bd91b27reed@google.com if (d != s) { 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com memcpy(d, s, count * sizeof(uint16_t)); 31feb8cc870df055099c6fcdfebdd6c1486bd91b27reed@google.com } 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 34bada64428a52b4fc1f31a0a1982c2301ec57601creed@google.comSkColor SkColorFilter::filterColor(SkColor c) const { 356b7aee387d3b4b2df5894b51fa1c0baf649c6540reed@google.com SkPMColor dst, src = SkPreMultiplyColor(c); 366b7aee387d3b4b2df5894b51fa1c0baf649c6540reed@google.com this->filterSpan(&src, 1, &dst); 376b7aee387d3b4b2df5894b51fa1c0baf649c6540reed@google.com return SkUnPreMultiply::PMColorToColor(dst); 386b7aee387d3b4b2df5894b51fa1c0baf649c6540reed@google.com} 396b7aee387d3b4b2df5894b51fa1c0baf649c6540reed@google.com 40db873d8677a2d4ecfe38a794a5d868301bdeeabereed/////////////////////////////////////////////////////////////////////////////////////////////////// 41db873d8677a2d4ecfe38a794a5d868301bdeeabereed 42db873d8677a2d4ecfe38a794a5d868301bdeeabereedclass SkComposeColorFilter : public SkColorFilter { 43db873d8677a2d4ecfe38a794a5d868301bdeeabereedpublic: 44db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkComposeColorFilter(SkColorFilter* outer, SkColorFilter* inner) 45db873d8677a2d4ecfe38a794a5d868301bdeeabereed : fOuter(SkRef(outer)) 46db873d8677a2d4ecfe38a794a5d868301bdeeabereed , fInner(SkRef(inner)) 47db873d8677a2d4ecfe38a794a5d868301bdeeabereed {} 48db873d8677a2d4ecfe38a794a5d868301bdeeabereed 49db873d8677a2d4ecfe38a794a5d868301bdeeabereed uint32_t getFlags() const SK_OVERRIDE { 50db873d8677a2d4ecfe38a794a5d868301bdeeabereed // Can only claim alphaunchanged and 16bit support if both our proxys do. 51db873d8677a2d4ecfe38a794a5d868301bdeeabereed return fOuter->getFlags() & fInner->getFlags(); 52db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 53db873d8677a2d4ecfe38a794a5d868301bdeeabereed 54db873d8677a2d4ecfe38a794a5d868301bdeeabereed void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const SK_OVERRIDE { 55db873d8677a2d4ecfe38a794a5d868301bdeeabereed fInner->filterSpan(shader, count, result); 56db873d8677a2d4ecfe38a794a5d868301bdeeabereed fOuter->filterSpan(result, count, result); 57db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 58db873d8677a2d4ecfe38a794a5d868301bdeeabereed 59db873d8677a2d4ecfe38a794a5d868301bdeeabereed void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) const SK_OVERRIDE { 60db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkASSERT(this->getFlags() & kHasFilter16_Flag); 61db873d8677a2d4ecfe38a794a5d868301bdeeabereed fInner->filterSpan16(shader, count, result); 62db873d8677a2d4ecfe38a794a5d868301bdeeabereed fOuter->filterSpan16(result, count, result); 63db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 64db873d8677a2d4ecfe38a794a5d868301bdeeabereed 65db873d8677a2d4ecfe38a794a5d868301bdeeabereed#ifndef SK_IGNORE_TO_STRING 66db873d8677a2d4ecfe38a794a5d868301bdeeabereed void toString(SkString* str) const SK_OVERRIDE { 67db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkString outerS, innerS; 68db873d8677a2d4ecfe38a794a5d868301bdeeabereed fOuter->toString(&outerS); 69db873d8677a2d4ecfe38a794a5d868301bdeeabereed fInner->toString(&innerS); 70db873d8677a2d4ecfe38a794a5d868301bdeeabereed str->appendf("SkComposeColorFilter: outer(%s) inner(%s)", outerS.c_str(), innerS.c_str()); 71db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 72db873d8677a2d4ecfe38a794a5d868301bdeeabereed#endif 73db873d8677a2d4ecfe38a794a5d868301bdeeabereed 74db873d8677a2d4ecfe38a794a5d868301bdeeabereed#if SK_SUPPORT_GPU 75cff10b21a9934afc540d121b493b204335829589reed bool asFragmentProcessors(GrContext* context, 76cff10b21a9934afc540d121b493b204335829589reed SkTDArray<GrFragmentProcessor*>* array) const SK_OVERRIDE { 77cff10b21a9934afc540d121b493b204335829589reed bool hasFrags = fInner->asFragmentProcessors(context, array); 78cff10b21a9934afc540d121b493b204335829589reed hasFrags |= fOuter->asFragmentProcessors(context, array); 79cff10b21a9934afc540d121b493b204335829589reed return hasFrags; 80cff10b21a9934afc540d121b493b204335829589reed } 81db873d8677a2d4ecfe38a794a5d868301bdeeabereed#endif 82db873d8677a2d4ecfe38a794a5d868301bdeeabereed 83db873d8677a2d4ecfe38a794a5d868301bdeeabereed SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeColorFilter) 84db873d8677a2d4ecfe38a794a5d868301bdeeabereed 85db873d8677a2d4ecfe38a794a5d868301bdeeabereedprotected: 86db873d8677a2d4ecfe38a794a5d868301bdeeabereed void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE { 87db873d8677a2d4ecfe38a794a5d868301bdeeabereed buffer.writeFlattenable(fOuter); 88db873d8677a2d4ecfe38a794a5d868301bdeeabereed buffer.writeFlattenable(fInner); 89db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 90db873d8677a2d4ecfe38a794a5d868301bdeeabereed 91db873d8677a2d4ecfe38a794a5d868301bdeeabereedprivate: 92db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkAutoTUnref<SkColorFilter> fOuter; 93db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkAutoTUnref<SkColorFilter> fInner; 94db873d8677a2d4ecfe38a794a5d868301bdeeabereed 95db873d8677a2d4ecfe38a794a5d868301bdeeabereed friend class SkColorFilter; 96db873d8677a2d4ecfe38a794a5d868301bdeeabereed 97db873d8677a2d4ecfe38a794a5d868301bdeeabereed typedef SkColorFilter INHERITED; 98db873d8677a2d4ecfe38a794a5d868301bdeeabereed}; 99db873d8677a2d4ecfe38a794a5d868301bdeeabereed 100db873d8677a2d4ecfe38a794a5d868301bdeeabereedSkFlattenable* SkComposeColorFilter::CreateProc(SkReadBuffer& buffer) { 101db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkAutoTUnref<SkColorFilter> outer(buffer.readColorFilter()); 102db873d8677a2d4ecfe38a794a5d868301bdeeabereed SkAutoTUnref<SkColorFilter> inner(buffer.readColorFilter()); 103db873d8677a2d4ecfe38a794a5d868301bdeeabereed return CreateComposeFilter(outer, inner); 104db873d8677a2d4ecfe38a794a5d868301bdeeabereed} 105db873d8677a2d4ecfe38a794a5d868301bdeeabereed 1068a8d841d485ff36b64d838575eb3735c1ddcf929reed/////////////////////////////////////////////////////////////////////////////////////////////////// 1078a8d841d485ff36b64d838575eb3735c1ddcf929reed 108db873d8677a2d4ecfe38a794a5d868301bdeeabereedSkColorFilter* SkColorFilter::CreateComposeFilter(SkColorFilter* outer, SkColorFilter* inner) { 109db873d8677a2d4ecfe38a794a5d868301bdeeabereed if (!outer) { 110db873d8677a2d4ecfe38a794a5d868301bdeeabereed return SkSafeRef(inner); 111db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 112db873d8677a2d4ecfe38a794a5d868301bdeeabereed if (!inner) { 113db873d8677a2d4ecfe38a794a5d868301bdeeabereed return SkSafeRef(outer); 114db873d8677a2d4ecfe38a794a5d868301bdeeabereed } 1158a8d841d485ff36b64d838575eb3735c1ddcf929reed 1168a8d841d485ff36b64d838575eb3735c1ddcf929reed // Give the subclass a shot at a more optimal composition... 1178a8d841d485ff36b64d838575eb3735c1ddcf929reed SkColorFilter* composition = outer->newComposed(inner); 1188a8d841d485ff36b64d838575eb3735c1ddcf929reed if (NULL == composition) { 1198a8d841d485ff36b64d838575eb3735c1ddcf929reed composition = SkNEW_ARGS(SkComposeColorFilter, (outer, inner)); 1208a8d841d485ff36b64d838575eb3735c1ddcf929reed } 1218a8d841d485ff36b64d838575eb3735c1ddcf929reed return composition; 122db873d8677a2d4ecfe38a794a5d868301bdeeabereed} 123db873d8677a2d4ecfe38a794a5d868301bdeeabereed 124db873d8677a2d4ecfe38a794a5d868301bdeeabereedSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) 125db873d8677a2d4ecfe38a794a5d868301bdeeabereedSK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposeColorFilter) 126db873d8677a2d4ecfe38a794a5d868301bdeeabereedSK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 127db873d8677a2d4ecfe38a794a5d868301bdeeabereed 128