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