Bug 1541350 - restore SkBlitRow::Color32 optimizations. r=rhunt

Differential Revision: https://phabricator.services.mozilla.com/D27157

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Lee Salzman 2019-04-15 18:46:10 +00:00
Родитель 1b48ee9bf6
Коммит 385ba9487f
4 изменённых файлов: 23 добавлений и 11 удалений

Просмотреть файл

@ -311,15 +311,5 @@ void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, SkPMC
case 0: memmove(dst, src, count * sizeof(SkPMColor)); return;
case 255: sk_memset32(dst, color, count); return;
}
unsigned invA = 255 - SkGetPackedA32(color);
invA += invA >> 7;
SkASSERT(invA < 256); // We've should have already handled alpha == 0 externally.
Sk16h colorHighAndRound = (Sk4px::DupPMColor(color).widen() << 8) + Sk16h(128);
Sk16b invA_16x(invA);
Sk4px::MapSrc(count, dst, src, [&](const Sk4px& src4) -> Sk4px {
return (src4 * invA_16x).addNarrowHi(colorHighAndRound);
});
return SkOpts::blit_row_color32(dst, src, count, color);
}

Просмотреть файл

@ -56,6 +56,7 @@ namespace SkOpts {
DEFINE_DEFAULT(blit_mask_d32_a8);
DEFINE_DEFAULT(blit_row_color32);
DEFINE_DEFAULT(blit_row_s32a_opaque);
DEFINE_DEFAULT(RGBA_to_BGRA);

Просмотреть файл

@ -27,6 +27,7 @@ namespace SkOpts {
extern SkXfermode* (*create_xfermode)(SkBlendMode);
extern void (*blit_mask_d32_a8)(SkPMColor*, size_t, const SkAlpha*, size_t, SkColor, int, int);
extern void (*blit_row_color32)(SkPMColor*, const SkPMColor*, int, SkPMColor);
extern void (*blit_row_s32a_opaque)(SkPMColor*, const SkPMColor*, int, U8CPU);
// Swizzle input into some sort of 8888 pixel, {premul,unpremul} x {rgba,bgra}.

Просмотреть файл

@ -8,6 +8,7 @@
#ifndef SkBlitRow_opts_DEFINED
#define SkBlitRow_opts_DEFINED
#include "Sk4px.h"
#include "SkColorData.h"
#include "SkMSAN.h"
@ -40,6 +41,25 @@
namespace SK_OPTS_NS {
// Color32 uses the blend_256_round_alt algorithm from tests/BlendTest.cpp.
// It's not quite perfect, but it's never wrong in the interesting edge cases,
// and it's quite a bit faster than blend_perfect.
//
// blend_256_round_alt is our currently blessed algorithm. Please use it or an analogous one.
static inline
void blit_row_color32(SkPMColor* dst, const SkPMColor* src, int count, SkPMColor color) {
unsigned invA = 255 - SkGetPackedA32(color);
invA += invA >> 7;
SkASSERT(invA < 256); // We've should have already handled alpha == 0 externally.
Sk16h colorHighAndRound = (Sk4px::DupPMColor(color).widen() << 8) + Sk16h(128);
Sk16b invA_16x(invA);
Sk4px::MapSrc(count, dst, src, [&](const Sk4px& src4) -> Sk4px {
return (src4 * invA_16x).addNarrowHi(colorHighAndRound);
});
}
#if defined(SK_ARM_HAS_NEON)
// Return a uint8x8_t value, r, computed as r[i] = SkMulDiv255Round(x[i], y[i]), where r[i], x[i],