mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
1b48ee9bf6
commit
385ba9487f
@ -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],
|
||||
|
Loading…
Reference in New Issue
Block a user