Chromium Code Reviews| Index: src/core/SkOpts.cpp |
| diff --git a/src/core/SkOpts.cpp b/src/core/SkOpts.cpp |
| index 781977ea68406e01b5db022eb53aa464f2e86f2f..ee88b231690b0e8d7f0cd895a9609f9bf680235b 100644 |
| --- a/src/core/SkOpts.cpp |
| +++ b/src/core/SkOpts.cpp |
| @@ -49,6 +49,58 @@ |
| #include <cpu-features.h> |
| #endif |
| +namespace sk_default { |
| + |
| +// These variable names in these functions just pretend the input is BGRA. |
| +// They work fine with both RGBA and BGRA. |
| + |
| +static void premul_xxxa(uint32_t dst[], const uint32_t src[], int count) { |
| + for (int i = 0; i < count; i++) { |
| + uint8_t a = src[i] >> 24, |
| + r = src[i] >> 16, |
| + g = src[i] >> 8, |
| + b = src[i] >> 0; |
| + r = (r*a+127)/255; |
|
msarett
2016/01/07 21:35:06
Currently, we use this:
static inline U8CPU SkMul
|
| + g = (g*a+127)/255; |
| + b = (b*a+127)/255; |
| + dst[i] = (uint32_t)a << 24 |
| + | (uint32_t)r << 16 |
| + | (uint32_t)g << 8 |
| + | (uint32_t)b << 0; |
| + } |
| +} |
| + |
| +static void swaprb_xxxa(uint32_t dst[], const uint32_t src[], int count) { |
| + for (int i = 0; i < count; i++) { |
| + uint8_t a = src[i] >> 24, |
| + r = src[i] >> 16, |
| + g = src[i] >> 8, |
| + b = src[i] >> 0; |
| + dst[i] = (uint32_t)a << 24 |
| + | (uint32_t)b << 16 |
| + | (uint32_t)g << 8 |
| + | (uint32_t)r << 0; |
| + } |
| +} |
| + |
| +static void premul_swaprb_xxxa(uint32_t dst[], const uint32_t src[], int count) { |
| + for (int i = 0; i < count; i++) { |
| + uint8_t a = src[i] >> 24, |
| + r = src[i] >> 16, |
| + g = src[i] >> 8, |
| + b = src[i] >> 0; |
| + r = (r*a+127)/255; |
| + g = (g*a+127)/255; |
| + b = (b*a+127)/255; |
| + dst[i] = (uint32_t)a << 24 |
| + | (uint32_t)b << 16 |
| + | (uint32_t)g << 8 |
| + | (uint32_t)r << 0; |
| + } |
| +} |
| + |
| +} // namespace sk_default |
| + |
| namespace SkOpts { |
| // Define default function pointer values here... |
| // If our global compile options are set high enough, these defaults might even be |
| @@ -80,6 +132,10 @@ namespace SkOpts { |
| decltype(matrix_scale_translate) matrix_scale_translate = sk_default::matrix_scale_translate; |
| decltype(matrix_affine) matrix_affine = sk_default::matrix_affine; |
| + decltype( premul_xxxa) premul_xxxa = sk_default:: premul_xxxa; |
| + decltype( swaprb_xxxa) swaprb_xxxa = sk_default:: swaprb_xxxa; |
| + decltype(premul_swaprb_xxxa) premul_swaprb_xxxa = sk_default::premul_swaprb_xxxa; |
| + |
| // Each Init_foo() is defined in src/opts/SkOpts_foo.cpp. |
| void Init_ssse3(); |
| void Init_sse41(); |