| OLD | NEW |
| (Empty) |
| 1 #include "SkColorMatrix.h" | |
| 2 | |
| 3 #define kRScale 0 | |
| 4 #define kGScale 6 | |
| 5 #define kBScale 12 | |
| 6 #define kAScale 18 | |
| 7 | |
| 8 void SkColorMatrix::setIdentity() | |
| 9 { | |
| 10 memset(fMat, 0, sizeof(fMat)); | |
| 11 fMat[kRScale] = fMat[kGScale] = fMat[kBScale] = fMat[kAScale] = SK_Scalar1; | |
| 12 } | |
| 13 | |
| 14 void SkColorMatrix::setScale(SkScalar rScale, SkScalar gScale, SkScalar bScale, | |
| 15 SkScalar aScale) | |
| 16 { | |
| 17 memset(fMat, 0, sizeof(fMat)); | |
| 18 fMat[kRScale] = rScale; | |
| 19 fMat[kGScale] = gScale; | |
| 20 fMat[kBScale] = bScale; | |
| 21 fMat[kAScale] = aScale; | |
| 22 } | |
| 23 | |
| 24 /////////////////////////////////////////////////////////////////////////////// | |
| 25 | |
| 26 void SkColorMatrix::setRotate(Axis axis, SkScalar degrees) | |
| 27 { | |
| 28 SkScalar S, C; | |
| 29 | |
| 30 S = SkScalarSinCos(SkDegreesToRadians(degrees), &C); | |
| 31 | |
| 32 this->setSinCos(axis, S, C); | |
| 33 } | |
| 34 | |
| 35 void SkColorMatrix::setSinCos(Axis axis, SkScalar sine, SkScalar cosine) | |
| 36 { | |
| 37 SkASSERT((unsigned)axis < 3); | |
| 38 | |
| 39 static const uint8_t gRotateIndex[] = { | |
| 40 6, 7, 11, 12, | |
| 41 0, 2, 15, 17, | |
| 42 0, 1, 5, 6, | |
| 43 }; | |
| 44 const uint8_t* index = gRotateIndex + axis * 4; | |
| 45 | |
| 46 this->setIdentity(); | |
| 47 fMat[index[0]] = cosine; | |
| 48 fMat[index[1]] = sine; | |
| 49 fMat[index[2]] = -sine; | |
| 50 fMat[index[3]] = cosine; | |
| 51 } | |
| 52 | |
| 53 void SkColorMatrix::preRotate(Axis axis, SkScalar degrees) | |
| 54 { | |
| 55 SkColorMatrix tmp; | |
| 56 tmp.setRotate(axis, degrees); | |
| 57 this->preConcat(tmp); | |
| 58 } | |
| 59 | |
| 60 void SkColorMatrix::postRotate(Axis axis, SkScalar degrees) | |
| 61 { | |
| 62 SkColorMatrix tmp; | |
| 63 tmp.setRotate(axis, degrees); | |
| 64 this->postConcat(tmp); | |
| 65 } | |
| 66 | |
| 67 /////////////////////////////////////////////////////////////////////////////// | |
| 68 | |
| 69 void SkColorMatrix::setConcat(const SkColorMatrix& matA, | |
| 70 const SkColorMatrix& matB) | |
| 71 { | |
| 72 SkScalar tmp[20]; | |
| 73 SkScalar* result = fMat; | |
| 74 | |
| 75 if (&matA == this || &matB == this) | |
| 76 result = tmp; | |
| 77 | |
| 78 const SkScalar* a = matA.fMat; | |
| 79 const SkScalar* b = matB.fMat; | |
| 80 | |
| 81 int index = 0; | |
| 82 for (int j = 0; j < 20; j += 5) | |
| 83 { | |
| 84 for (int i = 0; i < 4; i++) | |
| 85 { | |
| 86 result[index++] = SkScalarMul(a[j + 0], b[i + 0]) + | |
| 87 SkScalarMul(a[j + 1], b[i + 5]) + | |
| 88 SkScalarMul(a[j + 2], b[i + 10]) + | |
| 89 SkScalarMul(a[j + 3], b[i + 15]); | |
| 90 } | |
| 91 result[index++] = SkScalarMul(a[j + 0], b[4]) + | |
| 92 SkScalarMul(a[j + 1], b[9]) + | |
| 93 SkScalarMul(a[j + 2], b[14]) + | |
| 94 SkScalarMul(a[j + 3], b[19]) + | |
| 95 a[j + 4]; | |
| 96 } | |
| 97 | |
| 98 if (fMat != result) | |
| 99 memcpy(fMat, result, sizeof(fMat)); | |
| 100 } | |
| 101 | |
| 102 /////////////////////////////////////////////////////////////////////////////// | |
| 103 | |
| 104 static void setrow(SkScalar row[], SkScalar r, SkScalar g, SkScalar b) | |
| 105 { | |
| 106 row[0] = r; | |
| 107 row[1] = g; | |
| 108 row[2] = b; | |
| 109 } | |
| 110 | |
| 111 static const SkScalar kHueR = SkFloatToScalar(0.213f); | |
| 112 static const SkScalar kHueG = SkFloatToScalar(0.715f); | |
| 113 static const SkScalar kHueB = SkFloatToScalar(0.072f); | |
| 114 | |
| 115 void SkColorMatrix::setSaturation(SkScalar sat) | |
| 116 { | |
| 117 memset(fMat, 0, sizeof(fMat)); | |
| 118 | |
| 119 const SkScalar R = SkScalarMul(kHueR, SK_Scalar1 - sat); | |
| 120 const SkScalar G = SkScalarMul(kHueG, SK_Scalar1 - sat); | |
| 121 const SkScalar B = SkScalarMul(kHueB, SK_Scalar1 - sat); | |
| 122 | |
| 123 setrow(fMat + 0, R + sat, G, B); | |
| 124 setrow(fMat + 5, R, G + sat, B); | |
| 125 setrow(fMat + 10, R, G, B + sat); | |
| 126 fMat[18] = SK_Scalar1; | |
| 127 } | |
| 128 | |
| 129 static const SkScalar kR2Y = SkFloatToScalar(0.299f); | |
| 130 static const SkScalar kG2Y = SkFloatToScalar(0.587f); | |
| 131 static const SkScalar kB2Y = SkFloatToScalar(0.114f); | |
| 132 | |
| 133 static const SkScalar kR2U = SkFloatToScalar(-0.16874f); | |
| 134 static const SkScalar kG2U = SkFloatToScalar(-0.33126f); | |
| 135 static const SkScalar kB2U = SkFloatToScalar(0.5f); | |
| 136 | |
| 137 static const SkScalar kR2V = SkFloatToScalar(0.5f); | |
| 138 static const SkScalar kG2V = SkFloatToScalar(-0.41869f); | |
| 139 static const SkScalar kB2V = SkFloatToScalar(-0.08131f); | |
| 140 | |
| 141 void SkColorMatrix::setRGB2YUV() | |
| 142 { | |
| 143 memset(fMat, 0, sizeof(fMat)); | |
| 144 | |
| 145 setrow(fMat + 0, kR2Y, kG2Y, kB2Y); | |
| 146 setrow(fMat + 5, kR2U, kG2U, kB2U); | |
| 147 setrow(fMat + 10, kR2V, kG2V, kB2V); | |
| 148 fMat[18] = SK_Scalar1; | |
| 149 } | |
| 150 | |
| 151 static const SkScalar kV2R = SkFloatToScalar(1.402f); | |
| 152 static const SkScalar kU2G = SkFloatToScalar(-0.34414f); | |
| 153 static const SkScalar kV2G = SkFloatToScalar(-0.71414f); | |
| 154 static const SkScalar kU2B = SkFloatToScalar(1.772f); | |
| 155 | |
| 156 void SkColorMatrix::setYUV2RGB() | |
| 157 { | |
| 158 memset(fMat, 0, sizeof(fMat)); | |
| 159 | |
| 160 setrow(fMat + 0, SK_Scalar1, 0, kV2R); | |
| 161 setrow(fMat + 5, SK_Scalar1, kU2G, kV2G); | |
| 162 setrow(fMat + 10, SK_Scalar1, kU2B, 0); | |
| 163 fMat[18] = SK_Scalar1; | |
| 164 } | |
| 165 | |
| OLD | NEW |