Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/core/SkColorSpaceXform.cpp

Issue 2194303002: Refactor of SkColorSpaceXformOpts (Closed) Base URL: https://skia.googlesource.com/skia.git@pngapis
Patch Set: Fix Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkColorSpaceXformOpts.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkColorPriv.h" 8 #include "SkColorPriv.h"
9 #include "SkColorSpace_Base.h" 9 #include "SkColorSpace_Base.h"
10 #include "SkColorSpaceXform.h" 10 #include "SkColorSpaceXform.h"
11 #include "SkOpts.h" 11 #include "SkColorSpaceXformOpts.h"
12 #include "SkSRGB.h" 12 #include "SkSRGB.h"
13 13
14 static constexpr float sk_linear_from_2dot2[256] = { 14 static constexpr float sk_linear_from_2dot2[256] = {
15 0.000000000000000000f, 0.000005077051900662f, 0.000023328004666099f, 0.0 00056921765712193f, 15 0.000000000000000000f, 0.000005077051900662f, 0.000023328004666099f, 0.0 00056921765712193f,
16 0.000107187362341244f, 0.000175123977503027f, 0.000261543754548491f, 0.0 00367136269815943f, 16 0.000107187362341244f, 0.000175123977503027f, 0.000261543754548491f, 0.0 00367136269815943f,
17 0.000492503787191433f, 0.000638182842167022f, 0.000804658499513058f, 0.0 00992374304074325f, 17 0.000492503787191433f, 0.000638182842167022f, 0.000804658499513058f, 0.0 00992374304074325f,
18 0.001201739522438400f, 0.001433134589671860f, 0.001686915316789280f, 0.0 01963416213396470f, 18 0.001201739522438400f, 0.001433134589671860f, 0.001686915316789280f, 0.0 01963416213396470f,
19 0.002262953160706430f, 0.002585825596234170f, 0.002932318323938360f, 0.0 03302703032003640f, 19 0.002262953160706430f, 0.002585825596234170f, 0.002932318323938360f, 0.0 03302703032003640f,
20 0.003697239578900130f, 0.004116177093282750f, 0.004559754922526020f, 0.0 05028203456855540f, 20 0.003697239578900130f, 0.004116177093282750f, 0.004559754922526020f, 0.0 05028203456855540f,
21 0.005521744850239660f, 0.006040593654849810f, 0.006584957382581690f, 0.0 07155037004573030f, 21 0.005521744850239660f, 0.006040593654849810f, 0.006584957382581690f, 0.0 07155037004573030f,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 0.751895080583051000f, 0.759299550695091000f, 0.766743616862161000f, 0.7 74227314218442000f, 71 0.751895080583051000f, 0.759299550695091000f, 0.766743616862161000f, 0.7 74227314218442000f,
72 0.781750677773962000f, 0.789313742415586000f, 0.796916542907978000f, 0.8 04559113894567000f, 72 0.781750677773962000f, 0.789313742415586000f, 0.796916542907978000f, 0.8 04559113894567000f,
73 0.812241489898490000f, 0.819963705323528000f, 0.827725794455034000f, 0.8 35527791460841000f, 73 0.812241489898490000f, 0.819963705323528000f, 0.827725794455034000f, 0.8 35527791460841000f,
74 0.843369730392169000f, 0.851251645184515000f, 0.859173569658532000f, 0.8 67135537520905000f, 74 0.843369730392169000f, 0.851251645184515000f, 0.859173569658532000f, 0.8 67135537520905000f,
75 0.875137582365205000f, 0.883179737672745000f, 0.891262036813419000f, 0.8 99384513046529000f, 75 0.875137582365205000f, 0.883179737672745000f, 0.891262036813419000f, 0.8 99384513046529000f,
76 0.907547199521614000f, 0.915750129279253000f, 0.923993335251873000f, 0.9 32276850264543000f, 76 0.907547199521614000f, 0.915750129279253000f, 0.923993335251873000f, 0.9 32276850264543000f,
77 0.940600707035753000f, 0.948964938178195000f, 0.957369576199527000f, 0.9 65814653503130000f, 77 0.940600707035753000f, 0.948964938178195000f, 0.957369576199527000f, 0.9 65814653503130000f,
78 0.974300202388861000f, 0.982826255053791000f, 0.991392843592940000f, 1.0 00000000000000000f, 78 0.974300202388861000f, 0.982826255053791000f, 0.991392843592940000f, 1.0 00000000000000000f,
79 }; 79 };
80 80
81 static void build_table_linear_from_gamma(float* outTable, float exponent) {
82 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
83 *outTable++ = powf(x, exponent);
84 }
85 }
86
87 // Interpolating lookup in a variably sized table.
88 static float interp_lut(float input, const float* table, int tableSize) {
89 float index = input * (tableSize - 1);
90 float diff = index - sk_float_floor2int(index);
91 return table[(int) sk_float_floor2int(index)] * (1.0f - diff) +
92 table[(int) sk_float_ceil2int(index)] * diff;
93 }
94
95 // outTable is always 256 entries, inTable may be larger or smaller.
96 static void build_table_linear_from_gamma(float* outTable, const float* inTable,
97 int inTableSize) {
98 if (256 == inTableSize) {
99 memcpy(outTable, inTable, sizeof(float) * 256);
100 return;
101 }
102
103 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
104 *outTable++ = interp_lut(x, inTable, inTableSize);
105 }
106 }
107
108 static void build_table_linear_from_gamma(float* outTable, float g, float a, flo at b, float c,
109 float d, float e, float f) {
110 // Y = (aX + b)^g + c for X >= d
111 // Y = eX + f otherwise
112 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
113 if (x >= d) {
114 *outTable++ = powf(a * x + b, g) + c;
115 } else {
116 *outTable++ = e * x + f;
117 }
118 }
119 }
120
121 static inline bool compute_gamut_xform(SkMatrix44* srcToDst, const SkMatrix44& s rcToXYZ,
122 const SkMatrix44& dstToXYZ) {
123 if (!dstToXYZ.invert(srcToDst)) {
124 return false;
125 }
126
127 srcToDst->postConcat(srcToXYZ);
128 return true;
129 }
130
131 //////////////////////////////////////////////////////////////////////////////// /////////////////// 81 //////////////////////////////////////////////////////////////////////////////// ///////////////////
132 82
133 static constexpr uint8_t linear_to_srgb[1024] = { 83 static constexpr uint8_t linear_to_srgb[1024] = {
134 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 3 1, 32, 34, 35, 84 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 3 1, 32, 34, 35,
135 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4 9, 50, 51, 52, 85 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4 9, 50, 51, 52,
136 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 6 2, 63, 64, 64, 86 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 6 2, 63, 64, 64,
137 65, 66, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 72, 7 3, 73, 74, 74, 87 65, 66, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 72, 7 3, 73, 74, 74,
138 75, 76, 76, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 8 2, 82, 83, 83, 88 75, 76, 76, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 8 2, 82, 83, 83,
139 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 9 0, 90, 91, 91, 89 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 9 0, 90, 91, 91,
140 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 9 7, 97, 98, 98, 90 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 9 7, 97, 98, 98,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 240, 240, 240, 240, 24 1, 241, 241, 241, 133 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 240, 240, 240, 240, 24 1, 241, 241, 241,
184 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 242, 242, 243, 24 3, 243, 243, 243, 134 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 242, 242, 243, 24 3, 243, 243, 243,
185 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 24 5, 245, 245, 245, 135 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 24 5, 245, 245, 245,
186 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 24 7, 247, 247, 247, 136 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 24 7, 247, 247, 247,
187 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 24 9, 249, 249, 249, 137 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 24 9, 249, 249, 249,
188 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 25 1, 251, 251, 251, 138 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 25 1, 251, 251, 251,
189 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 25 3, 253, 253, 253, 139 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 25 3, 253, 253, 253,
190 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 25 5, 255 140 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 25 5, 255
191 }; 141 };
192 142
193 static constexpr uint8_t linear_to_2dot2[1024] = { 143 static constexpr uint8_t linear_to_2dot2_table[1024] = {
194 0, 11, 15, 18, 21, 23, 25, 26, 28, 30, 31, 32, 34, 35, 3 6, 37, 39, 40, 144 0, 11, 15, 18, 21, 23, 25, 26, 28, 30, 31, 32, 34, 35, 3 6, 37, 39, 40,
195 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 50, 51, 52, 5 3, 54, 54, 55, 145 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 50, 51, 52, 5 3, 54, 54, 55,
196 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 63, 64, 6 5, 65, 66, 66, 146 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 63, 64, 6 5, 65, 66, 66,
197 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 7 4, 75, 75, 76, 147 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 7 4, 75, 75, 76,
198 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 8 3, 83, 84, 84, 148 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 8 3, 83, 84, 84,
199 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 9 0, 91, 91, 91, 149 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 9 0, 91, 91, 91,
200 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 9 7, 97, 98, 98, 150 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 9 7, 97, 98, 98,
201 98, 99, 99, 99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 10 3, 104, 104, 104, 151 98, 99, 99, 99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 10 3, 104, 104, 104,
202 105, 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 108, 109, 10 9, 109, 110, 110, 152 105, 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 108, 109, 10 9, 109, 110, 110,
203 110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, 114, 114, 11 5, 115, 115, 115, 153 110, 111, 111, 111, 112, 112, 112, 112, 113, 113, 113, 114, 114, 114, 11 5, 115, 115, 115,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 24 0, 240, 240, 240, 193 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 24 0, 240, 240, 240,
244 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 24 2, 242, 243, 243, 194 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 24 2, 242, 243, 243,
245 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 24 4, 245, 245, 245, 195 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 24 4, 245, 245, 245,
246 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 24 7, 247, 247, 247, 196 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 24 7, 247, 247, 247,
247 247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 249, 24 9, 249, 249, 249, 197 247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 249, 24 9, 249, 249, 249,
248 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 25 1, 251, 251, 251, 198 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 25 1, 251, 251, 251,
249 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 25 3, 253, 253, 253, 199 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 25 3, 253, 253, 253,
250 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 25 5, 255, 200 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 25 5, 255,
251 }; 201 };
252 202
203 //////////////////////////////////////////////////////////////////////////////// ///////////////////
204
205 static void build_table_linear_from_gamma(float* outTable, float exponent) {
206 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
207 *outTable++ = powf(x, exponent);
208 }
209 }
210
211 // Interpolating lookup in a variably sized table.
212 static float interp_lut(float input, const float* table, int tableSize) {
213 float index = input * (tableSize - 1);
214 float diff = index - sk_float_floor2int(index);
215 return table[(int) sk_float_floor2int(index)] * (1.0f - diff) +
216 table[(int) sk_float_ceil2int(index)] * diff;
217 }
218
219 // outTable is always 256 entries, inTable may be larger or smaller.
220 static void build_table_linear_from_gamma(float* outTable, const float* inTable,
221 int inTableSize) {
222 if (256 == inTableSize) {
223 memcpy(outTable, inTable, sizeof(float) * 256);
224 return;
225 }
226
227 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
228 *outTable++ = interp_lut(x, inTable, inTableSize);
229 }
230 }
231
232 static void build_table_linear_from_gamma(float* outTable, float g, float a, flo at b, float c,
233 float d, float e, float f) {
234 // Y = (aX + b)^g + c for X >= d
235 // Y = eX + f otherwise
236 for (float x = 0.0f; x <= 1.0f; x += (1.0f/255.0f)) {
237 if (x >= d) {
238 *outTable++ = powf(a * x + b, g) + c;
239 } else {
240 *outTable++ = e * x + f;
241 }
242 }
243 }
244
245 //////////////////////////////////////////////////////////////////////////////// ///////////////////
246
253 // Expand range from 0-1 to 0-255, then convert. 247 // Expand range from 0-1 to 0-255, then convert.
254 static uint8_t clamp_normalized_float_to_byte(float v) { 248 static uint8_t clamp_normalized_float_to_byte(float v) {
255 // The ordering of the logic is a little strange here in order 249 // The ordering of the logic is a little strange here in order
256 // to make sure we convert NaNs to 0. 250 // to make sure we convert NaNs to 0.
257 v = v * 255.0f; 251 v = v * 255.0f;
258 if (v >= 254.5f) { 252 if (v >= 254.5f) {
259 return 255; 253 return 255;
260 } else if (v >= 0.5f) { 254 } else if (v >= 0.5f) {
261 return (uint8_t) (v + 0.5f); 255 return (uint8_t) (v + 0.5f);
262 } else { 256 } else {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 static const GammaFns<float> kToLinear { 360 static const GammaFns<float> kToLinear {
367 sk_linear_from_srgb, 361 sk_linear_from_srgb,
368 sk_linear_from_2dot2, 362 sk_linear_from_2dot2,
369 &build_table_linear_from_gamma, 363 &build_table_linear_from_gamma,
370 &build_table_linear_from_gamma, 364 &build_table_linear_from_gamma,
371 &build_table_linear_from_gamma, 365 &build_table_linear_from_gamma,
372 }; 366 };
373 367
374 static const GammaFns<uint8_t> kFromLinear { 368 static const GammaFns<uint8_t> kFromLinear {
375 linear_to_srgb, 369 linear_to_srgb,
376 linear_to_2dot2, 370 linear_to_2dot2_table,
377 &build_table_linear_to_gamma, 371 &build_table_linear_to_gamma,
378 &build_table_linear_to_gamma, 372 &build_table_linear_to_gamma,
379 &build_table_linear_to_gamma, 373 &build_table_linear_to_gamma,
380 }; 374 };
381 375
382 // Build tables to transform src gamma to linear. 376 // Build tables to transform src gamma to linear.
383 template <typename T> 377 template <typename T>
384 static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage, int gammaTableSize, 378 static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage, int gammaTableSize,
385 const sk_sp<SkColorSpace>& space, const GammaFns< T>& fns) { 379 const sk_sp<SkColorSpace>& space, const GammaFns< T>& fns) {
386 switch (space->gammaNamed()) { 380 switch (space->gammaNamed()) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 params.fF); 436 params.fF);
443 outGammaTables[i] = &gammaTableStorage[i * gammaTableSize]; 437 outGammaTables[i] = &gammaTableStorage[i * gammaTableSize];
444 } 438 }
445 } 439 }
446 } 440 }
447 } 441 }
448 } 442 }
449 443
450 //////////////////////////////////////////////////////////////////////////////// /////////////////// 444 //////////////////////////////////////////////////////////////////////////////// ///////////////////
451 445
446 static inline bool compute_gamut_xform(SkMatrix44* srcToDst, const SkMatrix44& s rcToXYZ,
447 const SkMatrix44& dstToXYZ) {
448 if (!dstToXYZ.invert(srcToDst)) {
449 return false;
450 }
451
452 srcToDst->postConcat(srcToXYZ);
453 return true;
454 }
455
456 //////////////////////////////////////////////////////////////////////////////// ///////////////////
457
452 std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa ce>& srcSpace, 458 std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa ce>& srcSpace,
453 const sk_sp<SkColorSpa ce>& dstSpace) { 459 const sk_sp<SkColorSpa ce>& dstSpace) {
454 if (!srcSpace || !dstSpace) { 460 if (!srcSpace || !dstSpace) {
455 // Invalid input 461 // Invalid input
456 return nullptr; 462 return nullptr;
457 } 463 }
458 464
459 if (as_CSB(dstSpace)->colorLUT()) { 465 if (as_CSB(dstSpace)->colorLUT()) {
460 // It would be really weird for a dst profile to have a color LUT. I do n't think 466 // It would be really weird for a dst profile to have a color LUT. I do n't think
461 // we need to support this. 467 // we need to support this.
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 b = sk_float_round2int(255.0f * clamp_normalized_float(out[2])); 614 b = sk_float_round2int(255.0f * clamp_normalized_float(out[2]));
609 *dst = SkPackARGB_as_RGBA(0xFF, r, g, b); 615 *dst = SkPackARGB_as_RGBA(0xFF, r, g, b);
610 616
611 src++; 617 src++;
612 dst++; 618 dst++;
613 } 619 }
614 } 620 }
615 621
616 //////////////////////////////////////////////////////////////////////////////// /////////////////// 622 //////////////////////////////////////////////////////////////////////////////// ///////////////////
617 623
618 template <SkColorSpace::GammaNamed Dst> 624 template <SkColorSpace::GammaNamed kDst>
619 SkColorSpaceXform_Base<Dst>::SkColorSpaceXform_Base(const sk_sp<SkColorSpace>& s rcSpace, 625 SkColorSpaceXform_Base<kDst>::SkColorSpaceXform_Base(const sk_sp<SkColorSpace>& srcSpace,
620 const SkMatrix44& srcToDst, 626 const SkMatrix44& srcToDst,
621 const sk_sp<SkColorSpace>& d stSpace) 627 const sk_sp<SkColorSpace>& d stSpace)
622 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) 628 : fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT()))
623 { 629 {
624 srcToDst.asRowMajorf(fSrcToDst); 630 srcToDst.asRowMajorf(fSrcToDst);
625 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT oLinear); 631 build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kT oLinear);
626 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz e, 632 build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSiz e,
627 dstSpace, kFromLinear); 633 dstSpace, kFromLinear);
628 } 634 }
629 635
630 template <> 636 template <>
631 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> 637 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed>
632 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const 638 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const
633 { 639 {
634 if (fColorLUT) { 640 if (fColorLUT) {
635 handle_color_lut(dst, src, len, fColorLUT.get()); 641 handle_color_lut(dst, src, len, fColorLUT.get());
636 src = dst; 642 src = dst;
637 } 643 }
638 644
639 SkOpts::color_xform_RGB1_to_srgb(dst, src, len, fSrcGammaTables, fSrcToDst); 645 color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, false>
646 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
640 } 647 }
641 648
642 template <> 649 template <>
643 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> 650 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed>
644 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const 651 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const
645 { 652 {
646 if (fColorLUT) { 653 if (fColorLUT) {
647 handle_color_lut(dst, src, len, fColorLUT.get()); 654 handle_color_lut(dst, src, len, fColorLUT.get());
648 src = dst; 655 src = dst;
649 } 656 }
650 657
651 SkOpts::color_xform_RGB1_to_2dot2(dst, src, len, fSrcGammaTables, fSrcToDst) ; 658 color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, false>
659 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
652 } 660 }
653 661
654 template <> 662 template <>
655 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> 663 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed>
656 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const 664 ::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const
657 { 665 {
658 if (fColorLUT) { 666 if (fColorLUT) {
659 handle_color_lut(dst, src, len, fColorLUT.get()); 667 handle_color_lut(dst, src, len, fColorLUT.get());
660 src = dst; 668 src = dst;
661 } 669 }
662 670
663 SkOpts::color_xform_RGB1_to_table(dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); 671 color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, false>
672 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
664 } 673 }
665 674
666 template <> 675 template <>
667 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> 676 void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed>
668 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const 677 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const
669 { 678 {
670 if (fColorLUT) { 679 if (fColorLUT) {
671 handle_color_lut(dst, src, len, fColorLUT.get()); 680 handle_color_lut(dst, src, len, fColorLUT.get());
672 src = dst; 681 src = dst;
673 } 682 }
674 683
675 SkOpts::color_xform_RGB1_to_srgb_swaprb(dst, src, len, fSrcGammaTables, fSrc ToDst); 684 color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, true>
685 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
676 } 686 }
677 687
678 template <> 688 template <>
679 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> 689 void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed>
680 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const 690 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const
681 { 691 {
682 if (fColorLUT) { 692 if (fColorLUT) {
683 handle_color_lut(dst, src, len, fColorLUT.get()); 693 handle_color_lut(dst, src, len, fColorLUT.get());
684 src = dst; 694 src = dst;
685 } 695 }
686 696
687 SkOpts::color_xform_RGB1_to_2dot2_swaprb(dst, src, len, fSrcGammaTables, fSr cToDst); 697 color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, true>
698 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
688 } 699 }
689 700
690 template <> 701 template <>
691 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> 702 void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed>
692 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const 703 ::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const
693 { 704 {
694 if (fColorLUT) { 705 if (fColorLUT) {
695 handle_color_lut(dst, src, len, fColorLUT.get()); 706 handle_color_lut(dst, src, len, fColorLUT.get());
696 src = dst; 707 src = dst;
697 } 708 }
698 709
699 SkOpts::color_xform_RGB1_to_table_swaprb(dst, src, len, fSrcGammaTables, fSr cToDst, 710 color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, true>
700 fDstGammaTables); 711 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
701 } 712 }
702 713
703 template <SkColorSpace::GammaNamed T> 714 template <SkColorSpace::GammaNamed T>
704 void SkColorSpaceXform_Base<T> 715 void SkColorSpaceXform_Base<T>
705 ::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const 716 ::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const
706 { 717 {
707 if (fColorLUT) { 718 if (fColorLUT) {
708 size_t storageBytes = len * sizeof(RGBA32); 719 size_t storageBytes = len * sizeof(RGBA32);
709 #if defined(GOOGLE3) 720 #if defined(GOOGLE3)
710 // Stack frame size is limited in GOOGLE3. 721 // Stack frame size is limited in GOOGLE3.
711 SkAutoSMalloc<256 * sizeof(RGBA32)> storage(storageBytes); 722 SkAutoSMalloc<256 * sizeof(RGBA32)> storage(storageBytes);
712 #else 723 #else
713 SkAutoSMalloc<1024 * sizeof(RGBA32)> storage(storageBytes); 724 SkAutoSMalloc<1024 * sizeof(RGBA32)> storage(storageBytes);
714 #endif 725 #endif
715 726
716 handle_color_lut((RGBA32*) storage.get(), src, len, fColorLUT.get()); 727 handle_color_lut((RGBA32*) storage.get(), src, len, fColorLUT.get());
717 src = (const RGBA32*) storage.get(); 728 src = (const RGBA32*) storage.get();
718 } 729 }
719 730
720 SkOpts::color_xform_RGB1_to_linear(dst, src, len, fSrcGammaTables, fSrcToDst ); 731 color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, false, false>
732 (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables);
721 } 733 }
OLDNEW
« no previous file with comments | « no previous file | src/core/SkColorSpaceXformOpts.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698