Home | History | Annotate | Download | only in effects
      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);
     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