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 13 class SK_API SkColorMatrix { 14 public: 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); preConcat(const SkColorMatrix & mat)53 void preConcat(const SkColorMatrix& mat) { this->setConcat(*this, mat); } postConcat(const SkColorMatrix & 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