blob: a1067407be84a89b74b0b396d9d7a94ab1412973 [file] [log] [blame]
mtkleinc5091b52016-05-02 11:48:42 -07001/*
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
11namespace SK_OPTS_NS {
12
reed4933d0b2016-05-17 03:07:01 -070013#if 0
mtkleinc5091b52016-05-02 11:48:42 -070014
15#else
16
reed4933d0b2016-05-17 03:07:01 -070017 static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) {
18 switch (src >> 24) {
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);
mtkleinc5091b52016-05-02 11:48:42 -070041 }
42
reed4933d0b2016-05-17 03:07:01 -070043 static inline void srcover_srgb_srgb(uint32_t* dst, const uint32_t* const src, 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
mtkleinc5091b52016-05-02 11:48:42 -070054#endif
55
56} // namespace SK_OPTS_NS
57
58#endif//SkBlend_opts_DEFINED