mtklein | c5091b5 | 2016-05-02 11:48:42 -0700 | [diff] [blame] | 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 | |
reed | 4933d0b | 2016-05-17 03:07:01 -0700 | [diff] [blame] | 13 | #if 0 |
mtklein | c5091b5 | 2016-05-02 11:48:42 -0700 | [diff] [blame] | 14 | |
| 15 | #else |
| 16 | |
reed | 4933d0b | 2016-05-17 03:07:01 -0700 | [diff] [blame] | 17 | 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); |
mtklein | c5091b5 | 2016-05-02 11:48:42 -0700 | [diff] [blame] | 41 | } |
| 42 | |
reed | 4933d0b | 2016-05-17 03:07:01 -0700 | [diff] [blame] | 43 | 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 | |
mtklein | c5091b5 | 2016-05-02 11:48:42 -0700 | [diff] [blame] | 54 | #endif |
| 55 | |
| 56 | } // namespace SK_OPTS_NS |
| 57 | |
| 58 | #endif//SkBlend_opts_DEFINED |