42 const int nPixels)
const override {
44 const int block = nPixels /
static_cast<int>(float_v::size);
45 const int block2 = nPixels %
static_cast<int>(float_v::size);
46 const int vectorPixelStride = 4 *
static_cast<int>(float_v::size);
48 for (
int i = 0; i < block; i++) {
49 uint_v shapeData = uint_v::load_unaligned(
reinterpret_cast<const quint32 *
>(pixels));
50 const uint_v maskData = uint_v::load_unaligned(
reinterpret_cast<const quint32 *
>(maskPixels));
52 const float_v maskAlpha = xsimd::to_float(xsimd::bitwise_cast_compat<int>((maskData >> 24) & mask));
53 const float_v maskRed = xsimd::to_float(xsimd::bitwise_cast_compat<int>((maskData >> 16) & mask));
54 const float_v maskGreen = xsimd::to_float(xsimd::bitwise_cast_compat<int>((maskData >> 8) & mask));
55 const float_v maskBlue = xsimd::to_float(xsimd::bitwise_cast_compat<int>((maskData) & mask));
56 const float_v maskValue = maskAlpha * ((redLum * maskRed) + (greenLum * maskGreen) + (blueLum * maskBlue)) * normCoeff;
58 const float_v pixelAlpha = xsimd::to_float(xsimd::bitwise_cast_compat<int>(shapeData >> 24U)) * normCoeff * maskValue;
59 const uint_v pixelAlpha_i = xsimd::bitwise_cast_compat<unsigned int>(xsimd::nearbyint_as_int(pixelAlpha));
60 shapeData = (shapeData & colorChannelsMask) | (pixelAlpha_i << 24);
62 shapeData.store_unaligned(
reinterpret_cast<typename uint_v::value_type *
>(pixels));
64 pixels += vectorPixelStride;
65 maskPixels += vectorPixelStride;