OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkColorMatrix.h" | 8 #include "SkColorMatrix.h" |
9 #include "SkReadBuffer.h" | 9 #include "SkReadBuffer.h" |
10 #include "SkWriteBuffer.h" | 10 #include "SkWriteBuffer.h" |
11 | 11 |
12 #define kRScale 0 | |
13 #define kGScale 6 | |
14 #define kBScale 12 | |
15 #define kAScale 18 | |
16 | |
17 void SkColorMatrix::setIdentity() { | 12 void SkColorMatrix::setIdentity() { |
18 memset(fMat, 0, sizeof(fMat)); | 13 memset(fMat, 0, sizeof(fMat)); |
19 fMat[kRScale] = fMat[kGScale] = fMat[kBScale] = fMat[kAScale] = SK_Scalar1; | 14 fMat[kR_Scale] = fMat[kG_Scale] = fMat[kB_Scale] = fMat[kA_Scale] = 1; |
20 } | 15 } |
21 | 16 |
22 void SkColorMatrix::setScale(SkScalar rScale, SkScalar gScale, SkScalar bScale, | 17 void SkColorMatrix::setScale(SkScalar rScale, SkScalar gScale, SkScalar bScale, |
23 SkScalar aScale) { | 18 SkScalar aScale) { |
24 memset(fMat, 0, sizeof(fMat)); | 19 memset(fMat, 0, sizeof(fMat)); |
25 fMat[kRScale] = rScale; | 20 fMat[kR_Scale] = rScale; |
26 fMat[kGScale] = gScale; | 21 fMat[kG_Scale] = gScale; |
27 fMat[kBScale] = bScale; | 22 fMat[kB_Scale] = bScale; |
28 fMat[kAScale] = aScale; | 23 fMat[kA_Scale] = aScale; |
| 24 } |
| 25 |
| 26 void SkColorMatrix::postTranslate(SkScalar dr, SkScalar dg, SkScalar db, |
| 27 SkScalar da) { |
| 28 fMat[kR_Trans] += dr; |
| 29 fMat[kG_Trans] += dg; |
| 30 fMat[kB_Trans] += db; |
| 31 fMat[kA_Trans] += da; |
29 } | 32 } |
30 | 33 |
31 /////////////////////////////////////////////////////////////////////////////// | 34 /////////////////////////////////////////////////////////////////////////////// |
32 | 35 |
33 void SkColorMatrix::setRotate(Axis axis, SkScalar degrees) { | 36 void SkColorMatrix::setRotate(Axis axis, SkScalar degrees) { |
34 SkScalar S, C; | 37 SkScalar S, C; |
35 | 38 |
36 S = SkScalarSinCos(SkDegreesToRadians(degrees), &C); | 39 S = SkScalarSinCos(SkDegreesToRadians(degrees), &C); |
37 | 40 |
38 this->setSinCos(axis, S, C); | 41 this->setSinCos(axis, S, C); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 row[2] = b; | 112 row[2] = b; |
110 } | 113 } |
111 | 114 |
112 static const SkScalar kHueR = 0.213f; | 115 static const SkScalar kHueR = 0.213f; |
113 static const SkScalar kHueG = 0.715f; | 116 static const SkScalar kHueG = 0.715f; |
114 static const SkScalar kHueB = 0.072f; | 117 static const SkScalar kHueB = 0.072f; |
115 | 118 |
116 void SkColorMatrix::setSaturation(SkScalar sat) { | 119 void SkColorMatrix::setSaturation(SkScalar sat) { |
117 memset(fMat, 0, sizeof(fMat)); | 120 memset(fMat, 0, sizeof(fMat)); |
118 | 121 |
119 const SkScalar R = SkScalarMul(kHueR, SK_Scalar1 - sat); | 122 const SkScalar R = kHueR * (1 - sat); |
120 const SkScalar G = SkScalarMul(kHueG, SK_Scalar1 - sat); | 123 const SkScalar G = kHueG * (1 - sat); |
121 const SkScalar B = SkScalarMul(kHueB, SK_Scalar1 - sat); | 124 const SkScalar B = kHueB * (1 - sat); |
122 | 125 |
123 setrow(fMat + 0, R + sat, G, B); | 126 setrow(fMat + 0, R + sat, G, B); |
124 setrow(fMat + 5, R, G + sat, B); | 127 setrow(fMat + 5, R, G + sat, B); |
125 setrow(fMat + 10, R, G, B + sat); | 128 setrow(fMat + 10, R, G, B + sat); |
126 fMat[18] = SK_Scalar1; | 129 fMat[kA_Scale] = 1; |
127 } | 130 } |
128 | 131 |
129 static const SkScalar kR2Y = 0.299f; | 132 static const SkScalar kR2Y = 0.299f; |
130 static const SkScalar kG2Y = 0.587f; | 133 static const SkScalar kG2Y = 0.587f; |
131 static const SkScalar kB2Y = 0.114f; | 134 static const SkScalar kB2Y = 0.114f; |
132 | 135 |
133 static const SkScalar kR2U = -0.16874f; | 136 static const SkScalar kR2U = -0.16874f; |
134 static const SkScalar kG2U = -0.33126f; | 137 static const SkScalar kG2U = -0.33126f; |
135 static const SkScalar kB2U = 0.5f; | 138 static const SkScalar kB2U = 0.5f; |
136 | 139 |
137 static const SkScalar kR2V = 0.5f; | 140 static const SkScalar kR2V = 0.5f; |
138 static const SkScalar kG2V = -0.41869f; | 141 static const SkScalar kG2V = -0.41869f; |
139 static const SkScalar kB2V = -0.08131f; | 142 static const SkScalar kB2V = -0.08131f; |
140 | 143 |
141 void SkColorMatrix::setRGB2YUV() { | 144 void SkColorMatrix::setRGB2YUV() { |
142 memset(fMat, 0, sizeof(fMat)); | 145 memset(fMat, 0, sizeof(fMat)); |
143 | 146 |
144 setrow(fMat + 0, kR2Y, kG2Y, kB2Y); | 147 setrow(fMat + 0, kR2Y, kG2Y, kB2Y); |
145 setrow(fMat + 5, kR2U, kG2U, kB2U); | 148 setrow(fMat + 5, kR2U, kG2U, kB2U); |
146 setrow(fMat + 10, kR2V, kG2V, kB2V); | 149 setrow(fMat + 10, kR2V, kG2V, kB2V); |
147 fMat[18] = SK_Scalar1; | 150 fMat[kA_Scale] = 1; |
148 } | 151 } |
149 | 152 |
150 static const SkScalar kV2R = 1.402f; | 153 static const SkScalar kV2R = 1.402f; |
151 static const SkScalar kU2G = -0.34414f; | 154 static const SkScalar kU2G = -0.34414f; |
152 static const SkScalar kV2G = -0.71414f; | 155 static const SkScalar kV2G = -0.71414f; |
153 static const SkScalar kU2B = 1.772f; | 156 static const SkScalar kU2B = 1.772f; |
154 | 157 |
155 void SkColorMatrix::setYUV2RGB() { | 158 void SkColorMatrix::setYUV2RGB() { |
156 memset(fMat, 0, sizeof(fMat)); | 159 memset(fMat, 0, sizeof(fMat)); |
157 | 160 |
158 setrow(fMat + 0, SK_Scalar1, 0, kV2R); | 161 setrow(fMat + 0, 1, 0, kV2R); |
159 setrow(fMat + 5, SK_Scalar1, kU2G, kV2G); | 162 setrow(fMat + 5, 1, kU2G, kV2G); |
160 setrow(fMat + 10, SK_Scalar1, kU2B, 0); | 163 setrow(fMat + 10, 1, kU2B, 0); |
161 fMat[18] = SK_Scalar1; | 164 fMat[kA_Scale] = 1; |
162 } | 165 } |
OLD | NEW |