This commit is contained in:
Ryan Oldenburg 2022-07-31 01:10:12 -05:00
parent be142b55ad
commit 85c411e6cd

View file

@ -225,19 +225,19 @@ proc applyOpacityNeon*(image: Image, opacity: float32) {.simd.} =
i: int
p = cast[uint](image.data[0].addr)
proc apply(c, o: uint8x8): uint8x8 {.inline.} =
let co = vmull_u8(c, o)
vraddhn_u16(co, vrshrq_n_u16(co, 8))
template multiply(c, a: uint8x8): uint8x8 =
let ca = vmull_u8(c, a)
vraddhn_u16(ca, vrshrq_n_u16(ca, 8))
let
opacityVec = vmov_n_u8(opacity)
iterations = image.data.len div 8
for _ in 0 ..< iterations:
var channels = vld4_u8(cast[pointer](p))
channels.val[0] = apply(channels.val[0], opacityVec)
channels.val[1] = apply(channels.val[1], opacityVec)
channels.val[2] = apply(channels.val[2], opacityVec)
channels.val[3] = apply(channels.val[3], opacityVec)
channels.val[0] = multiply(channels.val[0], opacityVec)
channels.val[1] = multiply(channels.val[1], opacityVec)
channels.val[2] = multiply(channels.val[2], opacityVec)
channels.val[3] = multiply(channels.val[3], opacityVec)
vst4_u8(cast[pointer](p), channels)
p += 32
i += 8 * iterations