diff options
author | 2016-07-20 18:10:07 -0700 | |
---|---|---|
committer | 2016-07-20 18:10:07 -0700 | |
commit | 0c902473d64ef935a64d078f70bdc9334ab51427 (patch) | |
tree | 09a423ffe65a60d3571372d455df64068ac754a7 /src/opts | |
parent | 456bf30d321292da7f15d1af35fd94fbb6a4bb59 (diff) |
Correct sRGB <-> linear everywhere.
This trims the SkPM4fPriv methods down to just foolproof methods.
(Anything trying to build these itself is probably wrong.)
Things like Sk4f srgb_to_linear(Sk4f) can't really exist anymore,
at least not efficiently, so this refactor is somewhat more invasive
than you might think. Generally this means things using to_4f() are
also making a misstep... that's gone too.
It also does not make sense to try to play games with linear floats
with 255 bias any more. That hack can't work with real sRGB coding.
Rather than update them, I've removed a couple of L32 xfermode fast
paths. I'd even rather drop it entirely...
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2163683002
CQ_INCLUDE_TRYBOTS=master.client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Review-Url: https://codereview.chromium.org/2163683002
Diffstat (limited to 'src/opts')
-rw-r--r-- | src/opts/SkBlend_opts.h | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/opts/SkBlend_opts.h b/src/opts/SkBlend_opts.h index 4f6d1e9195..1da4c4fb04 100644 --- a/src/opts/SkBlend_opts.h +++ b/src/opts/SkBlend_opts.h @@ -21,19 +21,21 @@ ninja -C out/Release dm nanobench ; and ./out/Release/dm --match Blend_opts ; an namespace SK_OPTS_NS { -static inline void srcover_srgb8888_srgb_1(uint32_t* dst, const uint32_t pixel) { - if ((~pixel & 0xFF000000) == 0) { - *dst = pixel; - } else if ((pixel & 0xFF000000) != 0) { - srcover_blend_srgb8888_srgb_1(dst, srgb_to_linear(to_4f(pixel))); +static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) { + if (src >= 0xFF000000) { + *dst = src; + return; } + auto d = Sk4f_fromS32(*dst), + s = Sk4f_fromS32( src); + *dst = Sk4f_toS32(s + d * (1.0f - s[3])); } static inline void srcover_srgb_srgb_4(uint32_t* dst, const uint32_t* src) { - srcover_srgb8888_srgb_1(dst++, *src++); - srcover_srgb8888_srgb_1(dst++, *src++); - srcover_srgb8888_srgb_1(dst++, *src++); - srcover_srgb8888_srgb_1(dst, *src); + srcover_srgb_srgb_1(dst++, *src++); + srcover_srgb_srgb_1(dst++, *src++); + srcover_srgb_srgb_1(dst++, *src++); + srcover_srgb_srgb_1(dst , *src ); } #if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 @@ -87,7 +89,7 @@ static inline void srcover_srgb_srgb_4(uint32_t* dst, const uint32_t* src) { count = count & 3; while (count-- > 0) { - srcover_srgb8888_srgb_1(dst++, *src++); + srcover_srgb_srgb_1(dst++, *src++); } } } @@ -159,7 +161,7 @@ static inline void srcover_srgb_srgb_4(uint32_t* dst, const uint32_t* src) { count = count & 3; while (count-- > 0) { - srcover_srgb8888_srgb_1(dst++, *src++); + srcover_srgb_srgb_1(dst++, *src++); } } } @@ -172,7 +174,7 @@ static inline void srcover_srgb_srgb_4(uint32_t* dst, const uint32_t* src) { int n = SkTMin(ndst, nsrc); for (int i = 0; i < n; i++) { - srcover_srgb8888_srgb_1(dst++, src[i]); + srcover_srgb_srgb_1(dst++, src[i]); } ndst -= n; } |