alpha_processing_neon.c: fix Dispatch/ExtractAlpha_NEON

the trailing width % 8 bytes would clear the upper bytes of
alpha_mask as they're done one at a time

since:
49d0280d NEON: implement several alpha-processing functions

Change-Id: Iff76c0af3094597285a6aa6ed032b345f9856aae
(cherry picked from commit 924e7ca654)
This commit is contained in:
James Zern 2022-02-28 19:46:52 +00:00
parent 059d4a59c2
commit 7dfde712a4

View File

@ -83,7 +83,7 @@ static void ApplyAlphaMultiply_NEON(uint8_t* rgba, int alpha_first,
static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride, static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride,
int width, int height, int width, int height,
uint8_t* dst, int dst_stride) { uint8_t* dst, int dst_stride) {
uint32_t alpha_mask = 0xffffffffu; uint32_t alpha_mask = 0xffu;
uint8x8_t mask8 = vdup_n_u8(0xff); uint8x8_t mask8 = vdup_n_u8(0xff);
uint32_t tmp[2]; uint32_t tmp[2];
int i, j; int i, j;
@ -107,6 +107,7 @@ static int DispatchAlpha_NEON(const uint8_t* alpha, int alpha_stride,
dst += dst_stride; dst += dst_stride;
} }
vst1_u8((uint8_t*)tmp, mask8); vst1_u8((uint8_t*)tmp, mask8);
alpha_mask *= 0x01010101;
alpha_mask &= tmp[0]; alpha_mask &= tmp[0];
alpha_mask &= tmp[1]; alpha_mask &= tmp[1];
return (alpha_mask != 0xffffffffu); return (alpha_mask != 0xffffffffu);
@ -134,7 +135,7 @@ static void DispatchAlphaToGreen_NEON(const uint8_t* alpha, int alpha_stride,
static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride, static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride,
int width, int height, int width, int height,
uint8_t* alpha, int alpha_stride) { uint8_t* alpha, int alpha_stride) {
uint32_t alpha_mask = 0xffffffffu; uint32_t alpha_mask = 0xffu;
uint8x8_t mask8 = vdup_n_u8(0xff); uint8x8_t mask8 = vdup_n_u8(0xff);
uint32_t tmp[2]; uint32_t tmp[2];
int i, j; int i, j;
@ -156,6 +157,7 @@ static int ExtractAlpha_NEON(const uint8_t* argb, int argb_stride,
alpha += alpha_stride; alpha += alpha_stride;
} }
vst1_u8((uint8_t*)tmp, mask8); vst1_u8((uint8_t*)tmp, mask8);
alpha_mask *= 0x0101010101;
alpha_mask &= tmp[0]; alpha_mask &= tmp[0];
alpha_mask &= tmp[1]; alpha_mask &= tmp[1];
return (alpha_mask == 0xffffffffu); return (alpha_mask == 0xffffffffu);