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 SkColorMatrix_DEFINED
9#define SkColorMatrix_DEFINED
10
11#include "SkScalar.h"
12
13class SK_API SkColorMatrix {
14public:
15    enum {
16        kCount = 20
17    };
18    SkScalar    fMat[kCount];
19
20    enum Elem {
21        kR_Scale    = 0,
22        kG_Scale    = 6,
23        kB_Scale    = 12,
24        kA_Scale    = 18,
25
26        kR_Trans    = 4,
27        kG_Trans    = 9,
28        kB_Trans    = 14,
29        kA_Trans    = 19,
30    };
31
32    void setIdentity();
33    void setScale(SkScalar rScale, SkScalar gScale, SkScalar bScale,
34                  SkScalar aScale = SK_Scalar1);
35    void preScale(SkScalar rScale, SkScalar gScale, SkScalar bScale,
36                  SkScalar aScale = SK_Scalar1);
37    void postScale(SkScalar rScale, SkScalar gScale, SkScalar bScale,
38                   SkScalar aScale = SK_Scalar1);
39    void postTranslate(SkScalar rTrans, SkScalar gTrans, SkScalar bTrans,
40                       SkScalar aTrans = 0);
41
42    enum Axis {
43        kR_Axis = 0,
44        kG_Axis = 1,
45        kB_Axis = 2
46    };
47    void setRotate(Axis, SkScalar degrees);
48    void setSinCos(Axis, SkScalar sine, SkScalar cosine);
49    void preRotate(Axis, SkScalar degrees);
50    void postRotate(Axis, SkScalar degrees);
51
52    void setConcat(const SkColorMatrix& a, const SkColorMatrix& b);
53    void preConcat(const SkColorMatrix& mat) { this->setConcat(*this, mat); }
54    void postConcat(const SkColorMatrix& mat) { this->setConcat(mat, *this); }
55
56    void setSaturation(SkScalar sat);
57    void setRGB2YUV();
58    void setYUV2RGB();
59
60    bool operator==(const SkColorMatrix& other) const {
61        return 0 == memcmp(fMat, other.fMat, sizeof(fMat));
62    }
63
64    bool operator!=(const SkColorMatrix& other) const { return !((*this) == other); }
65
66    static bool NeedsClamping(const SkScalar[20]);
67    static void SetConcat(SkScalar result[20], const SkScalar outer[20], const SkScalar inner[20]);
68};
69
70#endif
71