SkColorMatrixFilter.h revision 67e78c9e47c38a51816412a24a10f4fe2db142a3
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    explicit SkColorMatrixFilter(const SkColorMatrix&);
17    SkColorMatrixFilter(const SkScalar array[20]);
18
19    // overrides from SkColorFilter
20    virtual void filterSpan(const SkPMColor src[], int count, SkPMColor[]) SK_OVERRIDE;
21    virtual void filterSpan16(const uint16_t src[], int count, uint16_t[]) SK_OVERRIDE;
22    virtual uint32_t getFlags() SK_OVERRIDE;
23    virtual bool asColorMatrix(SkScalar matrix[20]) SK_OVERRIDE;
24#if SK_SUPPORT_GPU
25    virtual GrCustomStage* asNewCustomStage(GrContext*) const SK_OVERRIDE;
26#endif
27
28    struct State {
29        int32_t fArray[20];
30        int     fShift;
31        int32_t fResult[4];
32    };
33
34    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorMatrixFilter)
35
36protected:
37    SkColorMatrixFilter(SkFlattenableReadBuffer& buffer);
38    virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
39
40private:
41    SkColorMatrix fMatrix;
42
43    typedef void (*Proc)(State*, unsigned r, unsigned g, unsigned b,
44                         unsigned a);
45
46    Proc        fProc;
47    State       fState;
48    uint32_t    fFlags;
49
50    void initState(const SkScalar array[20]);
51
52    typedef SkColorFilter INHERITED;
53};
54
55#endif
56