OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2016 Google Inc. | |
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 SkBlend_opts_DEFINED | |
9 #define SkBlend_opts_DEFINED | |
10 | |
11 namespace SK_OPTS_NS { | |
12 | |
13 #if 0 | |
14 | |
15 #else | |
16 | |
17 static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) { | |
18 switch (src >> 24) { | |
f(malita)
2016/05/02 18:19:27
Should dst/src be SkPMColor to make the swizzle ex
| |
19 case 0x00: return; | |
20 case 0xff: *dst = src; return; | |
21 } | |
22 | |
23 Sk4f d = SkNx_cast<float>(Sk4b::Load( dst)), | |
24 s = SkNx_cast<float>(Sk4b::Load(&src)); | |
25 | |
26 // Approximate sRGB gamma as 2.0. | |
27 Sk4f d_sq = d*d, | |
28 s_sq = s*s; | |
29 d = Sk4f{d_sq[0], d_sq[1], d_sq[2], d[3]}; | |
30 s = Sk4f{s_sq[0], s_sq[1], s_sq[2], s[3]}; | |
31 | |
32 // SrcOver. | |
33 Sk4f invA = 1.0f - s[3]*(1/255.0f); | |
34 d = s + d * invA; | |
35 | |
36 // Re-apply approximate sRGB gamma. | |
37 Sk4f d_sqrt = d.sqrt(); | |
38 d = Sk4f{d_sqrt[0], d_sqrt[1], d_sqrt[2], d[3]}; | |
39 | |
40 SkNx_cast<uint8_t>(d).store(dst); | |
41 } | |
42 | |
43 static inline void srcover_srgb_srgb(uint32_t* dst, const uint32_t* const sr c, int ndst, const int nsrc) { | |
44 while (ndst > 0) { | |
45 int n = SkTMin(ndst, nsrc); | |
46 | |
47 for (int i = 0; i < n; i++) { | |
48 srcover_srgb_srgb_1(dst++, src[i]); | |
49 } | |
50 ndst -= n; | |
51 } | |
52 } | |
53 | |
54 #endif | |
55 | |
56 } // namespace SK_OPTS_NS | |
57 | |
58 #endif//SkBlend_opts_DEFINED | |
OLD | NEW |