SkColorFilter.cpp revision cff10b21a9934afc540d121b493b204335829589
1/* 2 * Copyright 2006 The Android Open Source Project 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 "SkColorFilter.h" 9#include "SkReadBuffer.h" 10#include "SkString.h" 11#include "SkWriteBuffer.h" 12 13bool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) const { 14 return false; 15} 16 17bool SkColorFilter::asColorMatrix(SkScalar matrix[20]) const { 18 return false; 19} 20 21bool SkColorFilter::asComponentTable(SkBitmap*) const { 22 return false; 23} 24 25void SkColorFilter::filterSpan16(const uint16_t s[], int count, uint16_t d[]) const { 26 SkASSERT(this->getFlags() & SkColorFilter::kHasFilter16_Flag); 27 SkDEBUGFAIL("missing implementation of SkColorFilter::filterSpan16"); 28 29 if (d != s) { 30 memcpy(d, s, count * sizeof(uint16_t)); 31 } 32} 33 34SkColor SkColorFilter::filterColor(SkColor c) const { 35 SkPMColor dst, src = SkPreMultiplyColor(c); 36 this->filterSpan(&src, 1, &dst); 37 return SkUnPreMultiply::PMColorToColor(dst); 38} 39 40/////////////////////////////////////////////////////////////////////////////////////////////////// 41 42class SkComposeColorFilter : public SkColorFilter { 43public: 44 SkComposeColorFilter(SkColorFilter* outer, SkColorFilter* inner) 45 : fOuter(SkRef(outer)) 46 , fInner(SkRef(inner)) 47 {} 48 49 uint32_t getFlags() const SK_OVERRIDE { 50 // Can only claim alphaunchanged and 16bit support if both our proxys do. 51 return fOuter->getFlags() & fInner->getFlags(); 52 } 53 54 void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const SK_OVERRIDE { 55 fInner->filterSpan(shader, count, result); 56 fOuter->filterSpan(result, count, result); 57 } 58 59 void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) const SK_OVERRIDE { 60 SkASSERT(this->getFlags() & kHasFilter16_Flag); 61 fInner->filterSpan16(shader, count, result); 62 fOuter->filterSpan16(result, count, result); 63 } 64 65#ifndef SK_IGNORE_TO_STRING 66 void toString(SkString* str) const SK_OVERRIDE { 67 SkString outerS, innerS; 68 fOuter->toString(&outerS); 69 fInner->toString(&innerS); 70 str->appendf("SkComposeColorFilter: outer(%s) inner(%s)", outerS.c_str(), innerS.c_str()); 71 } 72#endif 73 74#if SK_SUPPORT_GPU 75 bool asFragmentProcessors(GrContext* context, 76 SkTDArray<GrFragmentProcessor*>* array) const SK_OVERRIDE { 77 bool hasFrags = fInner->asFragmentProcessors(context, array); 78 hasFrags |= fOuter->asFragmentProcessors(context, array); 79 return hasFrags; 80 } 81#endif 82 83 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeColorFilter) 84 85protected: 86 void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE { 87 buffer.writeFlattenable(fOuter); 88 buffer.writeFlattenable(fInner); 89 } 90 91private: 92 SkAutoTUnref<SkColorFilter> fOuter; 93 SkAutoTUnref<SkColorFilter> fInner; 94 95 friend class SkColorFilter; 96 97 typedef SkColorFilter INHERITED; 98}; 99 100SkFlattenable* SkComposeColorFilter::CreateProc(SkReadBuffer& buffer) { 101 SkAutoTUnref<SkColorFilter> outer(buffer.readColorFilter()); 102 SkAutoTUnref<SkColorFilter> inner(buffer.readColorFilter()); 103 return CreateComposeFilter(outer, inner); 104} 105 106/////////////////////////////////////////////////////////////////////////////////////////////////// 107 108SkColorFilter* SkColorFilter::CreateComposeFilter(SkColorFilter* outer, SkColorFilter* inner) { 109 if (!outer) { 110 return SkSafeRef(inner); 111 } 112 if (!inner) { 113 return SkSafeRef(outer); 114 } 115 116 // Give the subclass a shot at a more optimal composition... 117 SkColorFilter* composition = outer->newComposed(inner); 118 if (NULL == composition) { 119 composition = SkNEW_ARGS(SkComposeColorFilter, (outer, inner)); 120 } 121 return composition; 122} 123 124SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) 125SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposeColorFilter) 126SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 127 128