9#ifndef KIS_BRUSH_VECTOR_APPLICATOR_H
10#define KIS_BRUSH_VECTOR_APPLICATOR_H
14#if !defined(XSIMD_NO_SUPPORTED_ARCHITECTURE) && XSIMD_UNIVERSAL_BUILD_PASS
21 :
d(maskGenerator->
d.data())
25 template<
typename _impl>
26 void process(
float *buffer,
int width,
float y,
float cosa,
float sina,
float centerX,
float centerY);
28 typename V::Private *
d;
31template<
class MaskGenerator,
typename _impl>
33 KisBrushMaskVectorApplicator(MaskGenerator *maskGenerator)
40 startProcessing(
rect, TypeHelper<MaskGenerator, _impl>());
44 void processVector(
const QRect &
rect);
47 template<
class U,
typename V>
53 inline void startProcessing(
const QRect &
rect, TypeHelper<U, xsimd::generic>)
58 template<
class U,
typename V>
59 inline void startProcessing(
const QRect &
rect, TypeHelper<U, V>)
63 if (m_maskGenerator->shouldVectorize()) {
71template<
class MaskGenerator,
typename impl>
72void KisBrushMaskVectorApplicator<MaskGenerator, impl>::processVector(
const QRect &
rect)
74 using float_v = xsimd::batch<float, impl>;
85 int width =
rect.width();
88 size_t alignOffset = 0;
89 if (width % float_v::size != 0) {
90 alignOffset = float_v::size - (width % float_v::size);
92 size_t simdWidth = width + alignOffset;
94 auto *buffer =xsimd::vector_aligned_malloc<float>(simdWidth);
102 for (
int x = 0;
x < width;
x++) {
116 .generateNormalized())) {
129 }
else if (m_d->
color) {
136 dabPointer += offset;
const quint8 OPACITY_TRANSPARENT_U8
const quint8 OPACITY_OPAQUE_U8
const MaskProcessingData * m_d
virtual void applyAlphaU8Mask(quint8 *pixels, const quint8 *alpha, qint32 nPixels) const =0
virtual void fillInverseAlphaNormedFloatMaskWithColor(quint8 *pixels, const float *alpha, const quint8 *brushColor, qint32 nPixels) const =0
virtual void applyInverseNormedFloatMask(quint8 *pixels, const float *alpha, qint32 nPixels) const =0
void vector_aligned_free(const T *ptr) noexcept
void process(const QRect &rect) override
void processScalar(const QRect &rect)
KisFixedPaintDeviceSP device
const KoColorSpace * colorSpace