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

Side by Side Diff: src/opts/SkColorXform_opts.h

Issue 2177173003: Delete SkDefaultXform, handle edge cases in SkColorSpaceXform_Base (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Use less space on Google3 Created 4 years, 5 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 | « src/core/SkColorSpaceXform.cpp ('k') | no next file » | 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 #ifndef SkColorXform_opts_DEFINED 8 #ifndef SkColorXform_opts_DEFINED
9 #define SkColorXform_opts_DEFINED 9 #define SkColorXform_opts_DEFINED
10 10
(...skipping 22 matching lines...) Expand all
33 kTable_DstGamma, 33 kTable_DstGamma,
34 34
35 // F16 35 // F16
36 kLinear_DstGamma, 36 kLinear_DstGamma,
37 }; 37 };
38 38
39 template <DstGamma kDstGamma> 39 template <DstGamma kDstGamma>
40 static void color_xform_RGB1(void* dst, const uint32_t* src, int len, 40 static void color_xform_RGB1(void* dst, const uint32_t* src, int len,
41 const float* const srcTables[3], const float matrix [16], 41 const float* const srcTables[3], const float matrix [16],
42 const uint8_t* const dstTables[3]) { 42 const uint8_t* const dstTables[3]) {
43 Sk4f rXgXbX = Sk4f::Load(matrix + 0), 43 Sk4f rXgXbX = Sk4f::Load(matrix + 0),
44 rYgYbY = Sk4f::Load(matrix + 4), 44 rYgYbY = Sk4f::Load(matrix + 4),
45 rZgZbZ = Sk4f::Load(matrix + 8); 45 rZgZbZ = Sk4f::Load(matrix + 8),
46 rTgTbT = Sk4f::Load(matrix + 12);
46 47
47 if (len >= 4) { 48 if (len >= 4) {
48 Sk4f reds, greens, blues; 49 Sk4f reds, greens, blues;
49 auto load_next_4 = [&reds, &greens, &blues, &src, &len, &srcTables] { 50 auto load_next_4 = [&reds, &greens, &blues, &src, &len, &srcTables] {
50 reds = Sk4f{srcTables[0][(src[0] >> 0) & 0xFF], 51 reds = Sk4f{srcTables[0][(src[0] >> 0) & 0xFF],
51 srcTables[0][(src[1] >> 0) & 0xFF], 52 srcTables[0][(src[1] >> 0) & 0xFF],
52 srcTables[0][(src[2] >> 0) & 0xFF], 53 srcTables[0][(src[2] >> 0) & 0xFF],
53 srcTables[0][(src[3] >> 0) & 0xFF]}; 54 srcTables[0][(src[3] >> 0) & 0xFF]};
54 greens = Sk4f{srcTables[1][(src[0] >> 8) & 0xFF], 55 greens = Sk4f{srcTables[1][(src[0] >> 8) & 0xFF],
55 srcTables[1][(src[1] >> 8) & 0xFF], 56 srcTables[1][(src[1] >> 8) & 0xFF],
56 srcTables[1][(src[2] >> 8) & 0xFF], 57 srcTables[1][(src[2] >> 8) & 0xFF],
57 srcTables[1][(src[3] >> 8) & 0xFF]}; 58 srcTables[1][(src[3] >> 8) & 0xFF]};
58 blues = Sk4f{srcTables[2][(src[0] >> 16) & 0xFF], 59 blues = Sk4f{srcTables[2][(src[0] >> 16) & 0xFF],
59 srcTables[2][(src[1] >> 16) & 0xFF], 60 srcTables[2][(src[1] >> 16) & 0xFF],
60 srcTables[2][(src[2] >> 16) & 0xFF], 61 srcTables[2][(src[2] >> 16) & 0xFF],
61 srcTables[2][(src[3] >> 16) & 0xFF]}; 62 srcTables[2][(src[3] >> 16) & 0xFF]};
62 src += 4; 63 src += 4;
63 len -= 4; 64 len -= 4;
64 }; 65 };
65 66
66 Sk4f dstReds, dstGreens, dstBlues; 67 Sk4f dstReds, dstGreens, dstBlues;
67 auto transform_4 = [&reds, &greens, &blues, &dstReds, &dstGreens, &dstBl ues, &rXgXbX, 68 auto transform_4 = [&reds, &greens, &blues, &dstReds, &dstGreens, &dstBl ues, &rXgXbX,
68 &rYgYbY, &rZgZbZ] { 69 &rYgYbY, &rZgZbZ, &rTgTbT] {
69 dstReds = rXgXbX[0]*reds + rYgYbY[0]*greens + rZgZbZ[0]*blues; 70 dstReds = rXgXbX[0]*reds + rYgYbY[0]*greens + rZgZbZ[0]*blues + rT gTbT[0];
70 dstGreens = rXgXbX[1]*reds + rYgYbY[1]*greens + rZgZbZ[1]*blues; 71 dstGreens = rXgXbX[1]*reds + rYgYbY[1]*greens + rZgZbZ[1]*blues + rT gTbT[1];
71 dstBlues = rXgXbX[2]*reds + rYgYbY[2]*greens + rZgZbZ[2]*blues; 72 dstBlues = rXgXbX[2]*reds + rYgYbY[2]*greens + rZgZbZ[2]*blues + rT gTbT[2];
72 }; 73 };
73 74
74 auto store_4 = [&dstReds, &dstGreens, &dstBlues, &dst, &dstTables] { 75 auto store_4 = [&dstReds, &dstGreens, &dstBlues, &dst, &dstTables] {
75 if (kSRGB_DstGamma == kDstGamma || k2Dot2_DstGamma == kDstGamma) { 76 if (kSRGB_DstGamma == kDstGamma || k2Dot2_DstGamma == kDstGamma) {
76 Sk4i (*linear_to_curve)(const Sk4f&) = 77 Sk4i (*linear_to_curve)(const Sk4f&) =
77 (kSRGB_DstGamma == kDstGamma) ? sk_linear_to_srgb : line ar_to_2dot2; 78 (kSRGB_DstGamma == kDstGamma) ? sk_linear_to_srgb : line ar_to_2dot2;
78 79
79 auto reds = linear_to_curve(dstReds); 80 auto reds = linear_to_curve(dstReds);
80 auto greens = linear_to_curve(dstGreens); 81 auto greens = linear_to_curve(dstGreens);
81 auto blues = linear_to_curve(dstBlues); 82 auto blues = linear_to_curve(dstBlues);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 transform_4(); 136 transform_4();
136 store_4(); 137 store_4();
137 } 138 }
138 139
139 while (len > 0) { 140 while (len > 0) {
140 // Splat r,g,b across a register each. 141 // Splat r,g,b across a register each.
141 auto r = Sk4f{srcTables[0][(*src >> 0) & 0xFF]}, 142 auto r = Sk4f{srcTables[0][(*src >> 0) & 0xFF]},
142 g = Sk4f{srcTables[1][(*src >> 8) & 0xFF]}, 143 g = Sk4f{srcTables[1][(*src >> 8) & 0xFF]},
143 b = Sk4f{srcTables[2][(*src >> 16) & 0xFF]}; 144 b = Sk4f{srcTables[2][(*src >> 16) & 0xFF]};
144 145
145 auto dstPixel = rXgXbX*r + rYgYbY*g + rZgZbZ*b; 146 auto dstPixel = rXgXbX*r + rYgYbY*g + rZgZbZ*b + rTgTbT;
146 147
147 if (kSRGB_DstGamma == kDstGamma || k2Dot2_DstGamma == kDstGamma) { 148 if (kSRGB_DstGamma == kDstGamma || k2Dot2_DstGamma == kDstGamma) {
148 Sk4i (*linear_to_curve)(const Sk4f&) = 149 Sk4i (*linear_to_curve)(const Sk4f&) =
149 (kSRGB_DstGamma == kDstGamma) ? sk_linear_to_srgb : linear_t o_2dot2; 150 (kSRGB_DstGamma == kDstGamma) ? sk_linear_to_srgb : linear_t o_2dot2;
150 151
151 auto pixel = linear_to_curve(dstPixel); 152 auto pixel = linear_to_curve(dstPixel);
152 153
153 uint32_t rgba; 154 uint32_t rgba;
154 SkNx_cast<uint8_t>(pixel).store(&rgba); 155 SkNx_cast<uint8_t>(pixel).store(&rgba);
155 rgba |= 0xFF000000; 156 rgba |= 0xFF000000;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 } 197 }
197 198
198 static void color_xform_RGB1_to_linear(uint64_t* dst, const uint32_t* src, int l en, 199 static void color_xform_RGB1_to_linear(uint64_t* dst, const uint32_t* src, int l en,
199 const float* const srcTables[3], const fl oat matrix[16]) { 200 const float* const srcTables[3], const fl oat matrix[16]) {
200 color_xform_RGB1<kLinear_DstGamma>(dst, src, len, srcTables, matrix, nullptr ); 201 color_xform_RGB1<kLinear_DstGamma>(dst, src, len, srcTables, matrix, nullptr );
201 } 202 }
202 203
203 } // namespace SK_OPTS_NS 204 } // namespace SK_OPTS_NS
204 205
205 #endif // SkColorXform_opts_DEFINED 206 #endif // SkColorXform_opts_DEFINED
OLDNEW
« no previous file with comments | « src/core/SkColorSpaceXform.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698