1/*
2 * Copyright 2007 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#ifndef SkColorMatrixFilter_DEFINED
9#define SkColorMatrixFilter_DEFINED
10
11#include "SkColorFilter.h"
12#include "SkColorMatrix.h"
13
14class SK_API SkColorMatrixFilter : public SkColorFilter {
15public:
16    static SkColorMatrixFilter* Create(const SkColorMatrix& cm) {
17        return SkNEW_ARGS(SkColorMatrixFilter, (cm));
18    }
19    static SkColorMatrixFilter* Create(const SkScalar array[20]) {
20        return SkNEW_ARGS(SkColorMatrixFilter, (array));
21    }
22
23    // overrides from SkColorFilter
24    virtual void filterSpan(const SkPMColor src[], int count, SkPMColor[]) const SK_OVERRIDE;
25    virtual void filterSpan16(const uint16_t src[], int count, uint16_t[]) const SK_OVERRIDE;
26    virtual uint32_t getFlags() const SK_OVERRIDE;
27    virtual bool asColorMatrix(SkScalar matrix[20]) const SK_OVERRIDE;
28#if SK_SUPPORT_GPU
29    virtual GrEffectRef* asNewEffect(GrContext*) const SK_OVERRIDE;
30#endif
31
32    struct State {
33        int32_t fArray[20];
34        int     fShift;
35    };
36
37    SK_TO_STRING_OVERRIDE()
38
39    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorMatrixFilter)
40
41protected:
42    explicit SkColorMatrixFilter(const SkColorMatrix&);
43    explicit SkColorMatrixFilter(const SkScalar array[20]);
44    explicit SkColorMatrixFilter(SkReadBuffer& buffer);
45    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
46
47private:
48    SkColorMatrix fMatrix;
49
50    typedef void (*Proc)(const State&, unsigned r, unsigned g, unsigned b,
51                         unsigned a, int32_t result[4]);
52
53    Proc        fProc;
54    State       fState;
55    uint32_t    fFlags;
56
57    void initState(const SkScalar array[20]);
58
59    typedef SkColorFilter INHERITED;
60};
61
62#endif
63