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