Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBrushMaskScalarApplicator< MaskGenerator, impl > Struct Template Reference

#include <kis_brush_mask_scalar_applicator.h>

+ Inheritance diagram for KisBrushMaskScalarApplicator< MaskGenerator, impl >:

Public Member Functions

 KisBrushMaskScalarApplicator (MaskGenerator *maskGenerator)
 
void process (const QRect &rect) override
 
- Public Member Functions inherited from KisBrushMaskApplicatorBase
void initializeData (const MaskProcessingData *data)
 
virtual ~KisBrushMaskApplicatorBase ()=default
 

Protected Member Functions

void processScalar (const QRect &rect)
 

Protected Attributes

MaskGenerator * m_maskGenerator
 
KisRandomSource m_randomSource
 
- Protected Attributes inherited from KisBrushMaskApplicatorBase
const MaskProcessingDatam_d = nullptr
 

Detailed Description

template<class MaskGenerator, typename impl>
struct KisBrushMaskScalarApplicator< MaskGenerator, impl >

Definition at line 17 of file kis_brush_mask_scalar_applicator.h.

Constructor & Destructor Documentation

◆ KisBrushMaskScalarApplicator()

template<class MaskGenerator , typename impl >
KisBrushMaskScalarApplicator< MaskGenerator, impl >::KisBrushMaskScalarApplicator ( MaskGenerator * maskGenerator)
inline

Definition at line 18 of file kis_brush_mask_scalar_applicator.h.

19 : m_maskGenerator(maskGenerator)
20 {
21 }

Member Function Documentation

◆ process()

template<class MaskGenerator , typename impl >
void KisBrushMaskScalarApplicator< MaskGenerator, impl >::process ( const QRect & rect)
inlineoverridevirtual

◆ processScalar()

template<class MaskGenerator , typename impl >
void KisBrushMaskScalarApplicator< MaskGenerator, impl >::processScalar ( const QRect & rect)
inlineprotected

Definition at line 29 of file kis_brush_mask_scalar_applicator.h.

30 {
33
34 qreal random = 1.0;
35 quint8 *dabPointer = m_d->device->data() + rect.y() * rect.width() * m_d->pixelSize;
36 quint8 alphaValue = OPACITY_TRANSPARENT_U8;
37 // this offset is needed when brush size is smaller then fixed device size
38 int offset = (m_d->device->bounds().width() - rect.width()) * m_d->pixelSize;
39 int supersample = 1;
40 if (m_maskGenerator->shouldSupersample()) {
41 // strengthen supersampling from 3x3 for very small dabs, to smooth out dashed strokes
42 supersample = (m_maskGenerator->shouldSupersample6x6() ? 6 : 3);
43 }
44 double invss = 1.0 / supersample;
45 int samplearea = pow2(supersample);
46 for (int y = rect.y(); y < rect.y() + rect.height(); y++) {
47 for (int x = rect.x(); x < rect.x() + rect.width(); x++) {
48 int value = 0;
49 for (int sy = 0; sy < supersample; sy++) {
50 for (int sx = 0; sx < supersample; sx++) {
51 double x_ = x + sx * invss - m_d->centerX;
52 double y_ = y + sy * invss - m_d->centerY;
53 double maskX = m_d->cosa * x_ - m_d->sina * y_;
54 double maskY = m_d->sina * x_ + m_d->cosa * y_;
55 value += m_maskGenerator->valueAt(maskX, maskY);
56 }
57 }
58 if (supersample != 1)
59 value /= samplearea;
60
61 if (m_d->randomness != 0.0) {
63 }
64
65 alphaValue = quint8((OPACITY_OPAQUE_U8 - value) * random);
66
67 // avoid computation of random numbers if density is full
68 if (m_d->density != 1.0) {
69 // compute density only for visible pixels of the mask
70 if (alphaValue != OPACITY_TRANSPARENT_U8) {
72 alphaValue = OPACITY_TRANSPARENT_U8;
73 }
74 }
75 }
76
77 if (m_d->color) {
78 memcpy(dabPointer, m_d->color, static_cast<size_t>(m_d->pixelSize));
79 }
80
81 m_d->colorSpace->applyAlphaU8Mask(dabPointer, &alphaValue, 1);
82 dabPointer += m_d->pixelSize;
83 } // endfor x
84 dabPointer += offset;
85 } // endfor y
86 }
float value(const T *src, size_t ch)
const quint8 OPACITY_TRANSPARENT_U8
const quint8 OPACITY_OPAQUE_U8
qreal generateNormalized() const
virtual void applyAlphaU8Mask(quint8 *pixels, const quint8 *alpha, qint32 nPixels) const =0
T pow2(const T &x)
Definition kis_global.h:166

References KoColorSpace::applyAlphaU8Mask(), KisFixedPaintDevice::bounds(), MaskProcessingData::centerX, MaskProcessingData::centerY, MaskProcessingData::color, MaskProcessingData::colorSpace, MaskProcessingData::cosa, KisFixedPaintDevice::data(), MaskProcessingData::density, MaskProcessingData::device, KisRandomSource::generateNormalized(), KisBrushMaskApplicatorBase::m_d, KisBrushMaskScalarApplicator< MaskGenerator, impl >::m_maskGenerator, KisBrushMaskScalarApplicator< MaskGenerator, impl >::m_randomSource, OPACITY_OPAQUE_U8, OPACITY_TRANSPARENT_U8, MaskProcessingData::pixelSize, pow2(), MaskProcessingData::randomness, MaskProcessingData::sina, and value().

Member Data Documentation

◆ m_maskGenerator

template<class MaskGenerator , typename impl >
MaskGenerator* KisBrushMaskScalarApplicator< MaskGenerator, impl >::m_maskGenerator
protected

Definition at line 89 of file kis_brush_mask_scalar_applicator.h.

◆ m_randomSource

template<class MaskGenerator , typename impl >
KisRandomSource KisBrushMaskScalarApplicator< MaskGenerator, impl >::m_randomSource
protected

Definition at line 90 of file kis_brush_mask_scalar_applicator.h.


The documentation for this struct was generated from the following file: