Krita Source Code Documentation
Loading...
Searching...
No Matches
SprayBrush Class Reference

#include <spray_brush.h>

Public Member Functions

void paint (KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor)
 
void setFixedDab (KisFixedPaintDeviceSP dab)
 
void setProperties (KisSprayOpOptionData *properties, KisColorOptionData *colorProperties, KisSprayShapeOptionData *shapeProperties, KisSprayShapeDynamicsOptionData *shapeDynamicsProperties, KisBrushSP brush)
 
 SprayBrush ()
 
 ~SprayBrush ()
 

Private Member Functions

qreal deg2rad (quint16 deg) const
 convert degrees to radians
 
qreal linearInterpolation (qreal a, qreal b, qreal weight) const
 mix a with b.b mix with weight and a with 1.0 - weight
 
void paintCircle (KisPainter *painter, qreal x, qreal y, qreal radius)
 
void paintEllipse (KisPainter *painter, qreal x, qreal y, qreal a, qreal b, qreal angle)
 
template<typename AngularDistribution >
void paintImpl (KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor, const AngularDistribution &angularDistribution)
 
template<typename AngularDistribution , typename RadialDistribution >
void paintImpl (KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor, const AngularDistribution &angularDistribution, const RadialDistribution &radialDistribution)
 
void paintOutline (KisPaintDeviceSP dev, const KoColor &painterColor, qreal posX, qreal posY, qreal radius)
 
void paintParticle (KisRandomAccessorSP &writeAccessor, const KoColor &color, qreal rx, qreal ry)
 Paints Wu Particle.
 
void paintRectangle (KisPainter *painter, qreal x, qreal y, qreal width, qreal height, qreal angle)
 
qreal rad2deg (qreal rad) const
 convert radians to degrees
 
qreal rotationAngle (KisRandomSourceSP randomSource)
 rotation in radians according the settings (gauss distribution, uniform distribution or fixed angle)
 

Private Attributes

KisBrushSP m_brush
 
QImage m_brushQImage
 
const KisColorOptionDatam_colorProperties {nullptr}
 
quint8 m_dabPixelSize {1}
 
int m_dabSeqNo {0}
 
KisFixedPaintDeviceSP m_fixedDab
 
KisPaintDeviceSP m_imageDevice
 
KoColor m_inkColor
 
KisPainterm_painter {nullptr}
 
quint32 m_particlesCount {1}
 
qreal m_radius {1.0}
 
const KisSprayShapeDynamicsOptionDatam_shapeDynamicsProperties {nullptr}
 
const KisSprayShapeOptionDatam_shapeProperties {nullptr}
 
KisSprayOpOptionm_sprayOpOption {nullptr}
 
const KisSprayOpOptionDatam_sprayOpOptionData {nullptr}
 
KoColorTransformationm_transfo {nullptr}
 
QImage m_transformed
 

Detailed Description

Definition at line 31 of file spray_brush.h.

Constructor & Destructor Documentation

◆ SprayBrush()

SprayBrush::SprayBrush ( )

Definition at line 39 of file spray_brush.cpp.

40{
41 m_painter = nullptr;
42 m_transfo = nullptr;
43}
KisPainter * m_painter
Definition spray_brush.h:61
KoColorTransformation * m_transfo
Definition spray_brush.h:66

References m_painter, and m_transfo.

◆ ~SprayBrush()

SprayBrush::~SprayBrush ( )

Definition at line 45 of file spray_brush.cpp.

46{
47 delete m_painter;
48 delete m_transfo;
49}

References m_painter, and m_transfo.

Member Function Documentation

◆ deg2rad()

qreal SprayBrush::deg2rad ( quint16 deg) const
inlineprivate

convert degrees to radians

Definition at line 121 of file spray_brush.h.

121 {
122 return deg * (M_PI / 180.0);
123 }
#define M_PI
Definition kis_global.h:111

References M_PI.

◆ linearInterpolation()

qreal SprayBrush::linearInterpolation ( qreal a,
qreal b,
qreal weight ) const
inlineprivate

mix a with b.b mix with weight and a with 1.0 - weight

Definition at line 110 of file spray_brush.h.

110 {
111 return (1.0 - weight) * a + weight * b;
112 }

◆ paint()

void SprayBrush::paint ( KisPaintDeviceSP dab,
KisPaintDeviceSP source,
const KisPaintInformation & info,
qreal rotation,
qreal scale,
qreal additionalScale,
const KoColor & color,
const KoColor & bgColor )

Definition at line 92 of file spray_brush.cpp.

97{
99 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor, m_sprayOpOption->m_uniformDistribution);
100 } else {
101 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor, m_sprayOpOption->m_angularCurveBasedDistribution);
102 }
103}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
KisSprayCurveBasedDistribution m_angularCurveBasedDistribution
KisSprayUniformDistribution m_uniformDistribution
KisSprayOpOptionData data
void paintImpl(KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor, const AngularDistribution &angularDistribution)
KisSprayOpOption * m_sprayOpOption
Definition spray_brush.h:69
ParticleDistribution angularDistributionType

References KisSprayOpOptionData::angularDistributionType, KisSprayOpOption::data, KisSprayOpOption::m_angularCurveBasedDistribution, m_sprayOpOption, KisSprayOpOption::m_uniformDistribution, paintImpl(), KisSprayOpOptionData::ParticleDistribution_Uniform, and source().

◆ paintCircle()

void SprayBrush::paintCircle ( KisPainter * painter,
qreal x,
qreal y,
qreal radius )
private

Definition at line 456 of file spray_brush.cpp.

457{
458 QPainterPath path;
459 path.addEllipse(QPointF(x,y),radius,radius);
460 painter->fillPainterPath(path);
461}
void fillPainterPath(const QPainterPath &path)

References KisPainter::fillPainterPath().

◆ paintEllipse()

void SprayBrush::paintEllipse ( KisPainter * painter,
qreal x,
qreal y,
qreal a,
qreal b,
qreal angle )
private

Definition at line 464 of file spray_brush.cpp.

465{
466 QPainterPath path;
467 path.addEllipse(QPointF(), a, b);
468 QTransform t;
469 t.translate(x, y);
470 t.rotateRadians(angle);
471 path = t.map(path);
472 painter->fillPainterPath(path);
473}

References KisPainter::fillPainterPath().

◆ paintImpl() [1/2]

template<typename AngularDistribution >
void SprayBrush::paintImpl ( KisPaintDeviceSP dab,
KisPaintDeviceSP source,
const KisPaintInformation & info,
qreal rotation,
qreal scale,
qreal additionalScale,
const KoColor & color,
const KoColor & bgColor,
const AngularDistribution & angularDistribution )
private

Definition at line 106 of file spray_brush.cpp.

113{
116 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
117 angularDistribution, m_sprayOpOption->m_uniformDistribution);
118 } else {
119 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
121 }
124 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
125 angularDistribution, m_sprayOpOption->m_normalDistribution);
126 } else {
127 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
129 }
131 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
133 } else {
134 paintImpl(dab, source, info, rotation, scale, additionalScale, color, bgColor,
136 }
137}
KisSprayCurveBasedDistributionPolarDistance m_radialCurveBasedDistributionPolarDistance
KisSprayNormalDistributionPolarDistance m_normalDistributionPolarDistance
KisSprayClusterBasedDistributionPolarDistance m_clusterBasedDistributionPolarDistance
KisSprayUniformDistributionPolarDistance m_uniformDistributionPolarDistance
KisSprayNormalDistribution m_normalDistribution
ParticleDistribution radialDistributionType

References KisSprayOpOption::data, KisSprayOpOption::m_clusterBasedDistributionPolarDistance, KisSprayOpOption::m_normalDistribution, KisSprayOpOption::m_normalDistributionPolarDistance, KisSprayOpOption::m_radialCurveBasedDistributionPolarDistance, m_sprayOpOption, KisSprayOpOption::m_uniformDistribution, KisSprayOpOption::m_uniformDistributionPolarDistance, paintImpl(), KisSprayOpOptionData::ParticleDistribution_ClusterBased, KisSprayOpOptionData::ParticleDistribution_Gaussian, KisSprayOpOptionData::ParticleDistribution_Uniform, KisSprayOpOptionData::radialDistributionCenterBiased, KisSprayOpOptionData::radialDistributionType, and source().

◆ paintImpl() [2/2]

template<typename AngularDistribution , typename RadialDistribution >
void SprayBrush::paintImpl ( KisPaintDeviceSP dab,
KisPaintDeviceSP source,
const KisPaintInformation & info,
qreal rotation,
qreal scale,
qreal additionalScale,
const KoColor & color,
const KoColor & bgColor,
const AngularDistribution & angularDistribution,
const RadialDistribution & radialDistribution )
private

Definition at line 140 of file spray_brush.cpp.

148{
149 if (!angularDistribution.isValid() || !radialDistribution.isValid()) {
150 return;
151 }
152
153 KisRandomSourceSP randomSource = info.randomSource();
154
156
157 // initializing painter
158 if (!m_painter) {
159 m_painter = new KisPainter(dab);
161 m_painter->setMaskImageSize(effectiveSize.width(), effectiveSize.height());
164 m_transfo = dab->colorSpace()->createColorTransformation("hsv_adjustment", QHash<QString, QVariant>());
165 }
166
168 if (!m_brushQImage.isNull()) {
169 m_brushQImage = m_brushQImage.scaled(effectiveSize);
170 }
172 }
173
174
175 qreal x = info.pos().x();
176 qreal y = info.pos().y();
178
179 Q_ASSERT(color.colorSpace()->pixelSize() == dab->pixelSize());
180 m_inkColor = color;
182
183 // apply size sensor
184 m_radius = m_sprayOpOption->data.diameter/2 * scale * additionalScale;
185
186 // jitter movement
188 x = x + ((2 * m_radius * randomSource->generateNormalized()) - m_radius) * m_sprayOpOption->data.jitterAmount;
189 y = y + ((2 * m_radius * randomSource->generateNormalized()) - m_radius) * m_sprayOpOption->data.jitterAmount;
190 }
191
192 // this is wrong for every shape except pixel and anti-aliased pixel
193
194
196 m_particlesCount = (m_sprayOpOption->data.coverage * (M_PI * pow2(m_radius)) / pow2(additionalScale));
197 }
198 else {
200 }
201
202 QHash<QString, QVariant> params;
203 qreal nx, ny;
204 int ix, iy;
205
206 qreal angle;
207 qreal length;
208 qreal rotationZ = 0.0;
209 qreal particleScale = 1.0;
210
211 bool shouldColor = true;
213 m_painter->setPaintColor(bgColor);
215 }
216
217 QTransform m;
218 m.reset();
219 m.rotateRadians(-rotation + deg2rad(m_sprayOpOption->data.brushRotation));
221
222 for (quint32 i = 0; i < m_particlesCount; i++) {
223 // generate random angle
224 angle = angularDistribution(randomSource) * M_PI * 2;
225 // generate random length
226 length = radialDistribution(randomSource);
227
229 // rotation
230 rotationZ = rotationAngle(randomSource);
231
233
235 }
236
237
239
241 }
242
243 // random size - scale
245 particleScale = randomSource->generateNormalized();
246 }
247 }
248 // generate polar coordinate
249 nx = (m_radius * cos(angle) * length);
250 ny = (m_radius * sin(angle) * length);
251
252 // compute the height of the ellipse
254
255 // transform
256 m.map(nx, ny, &nx, &ny);
257
258 // color transformation
259
260 if (shouldColor) {
262 colorSampler.sampleOldColor(nx + x, ny + y, m_inkColor.data());
263 }
264
265 // mix the color with background color
267 KoMixColorsOp * mixOp = dab->colorSpace()->mixColorsOp();
268
269 const quint8 *colors[2];
270 colors[0] = m_inkColor.data();
271 colors[1] = bgColor.data();
272
273 qint16 colorWeights[2];
274 int MAX_16BIT = 255;
275 qreal blend = info.pressure();
276
277 colorWeights[0] = static_cast<quint16>(blend * MAX_16BIT);
278 colorWeights[1] = static_cast<quint16>((1.0 - blend) * MAX_16BIT);
279 mixOp->mixColors(colors, colorWeights, 2, m_inkColor.data());
280 }
281
283 params["h"] = (m_colorProperties->hue / 180.0) * randomSource->generateNormalized();
284 params["s"] = (m_colorProperties->saturation / 100.0) * randomSource->generateNormalized();
285 params["v"] = (m_colorProperties->value / 100.0) * randomSource->generateNormalized();
286 m_transfo->setParameters(params);
287 m_transfo->setParameter(3, 1);//sets the type to HSV. For some reason 0 is not an option.
288 m_transfo->setParameter(4, false);//sets the colorize to false.
290 }
291
293 const qreal alpha = randomSource->generateNormalized();
294 m_inkColor.setOpacity(alpha);
295 m_painter->setOpacityF(alpha);
296 }
297
299 shouldColor = false;
300 }
301
303 }
304
305 qreal jitteredWidth = qMax(1.0 * additionalScale, effectiveSize.width() * particleScale * additionalScale);
306 qreal jitteredHeight = qMax(1.0 * additionalScale, effectiveSize.height() * particleScale * additionalScale);
307
309 switch (m_shapeProperties->shape){
310 // ellipse
311 case 0:
312 {
313 if (effectiveSize.width() == effectiveSize.height()){
314 paintCircle(m_painter, nx + x, ny + y, jitteredWidth * 0.5);
315 }
316 else {
317 paintEllipse(m_painter, nx + x, ny + y, jitteredWidth * 0.5 , jitteredHeight * 0.5, rotationZ);
318 }
319 break;
320 }
321 // rectangle
322 case 1:
323 {
324 paintRectangle(m_painter, nx + x, ny + y, qRound(jitteredWidth) , qRound(jitteredHeight), rotationZ);
325 break;
326 }
327 // wu-particle
328 case 2: {
329 paintParticle(accessor, m_inkColor, nx + x, ny + y);
330 break;
331 }
332 // pixel
333 case 3: {
334 ix = qRound(nx + x);
335 iy = qRound(ny + y);
336 accessor->moveTo(ix, iy);
337 memcpy(accessor->rawData(), m_inkColor.data(), m_dabPixelSize);
338 break;
339 }
340 case 4: {
341 if (!m_brushQImage.isNull()) {
342
343 QTransform m;
344 m.rotate(rad2deg(rotationZ));
345 m.scale(additionalScale, additionalScale);
346
348 m.scale(particleScale, particleScale);
349 }
350 m_transformed = m_brushQImage.transformed(m, Qt::SmoothTransformation);
353 QRect rc = m_transformed.rect();
354
356
357 for (int y = rc.y(); y < rc.y() + rc.height(); y++) {
358 for (int x = rc.x(); x < rc.x() + rc.width(); x++) {
359 ac->moveTo(x, y);
360 m_transfo->transform(ac->rawData(), ac->rawData() , 1);
361 }
362 }
363 }
364
365 ix = qRound(nx + x - rc.width() * 0.5);
366 iy = qRound(ny + y - rc.height() * 0.5);
367 m_painter->bitBlt(QPoint(ix, iy), m_imageDevice, rc);
369 break;
370 }
371 }
372 }
373 // Auto-brush
374 }
375 else {
376 KisDabShape shape(particleScale * additionalScale, 1.0, -rotationZ);
377 QPointF hotSpot = m_brush->hotSpot(shape, info);
378 QPointF pos(nx + x, ny + y);
379 QPointF pt = pos - hotSpot;
380
381 qint32 ix;
382 qreal xFraction;
383 qint32 iy;
384 qreal yFraction;
385
386 KisPaintOp::splitCoordinate(pt.x(), &ix, &xFraction);
387 KisPaintOp::splitCoordinate(pt.y(), &iy, &yFraction);
388
389 m_brush->prepareForSeqNo(info, m_dabSeqNo);
390
391 //KisFixedPaintDeviceSP dab;
392 if (m_brush->brushApplication() == IMAGESTAMP) {
393 m_fixedDab = m_brush->paintDevice(m_fixedDab->colorSpace(),
394 shape, info, xFraction, yFraction);
395
397 quint8 * dabPointer = m_fixedDab->data();
398 int pixelCount = m_fixedDab->bounds().width() * m_fixedDab->bounds().height();
399 m_transfo->transform(dabPointer, dabPointer, pixelCount);
400 }
401
402 }
403 else {
404 m_brush->mask(m_fixedDab, m_inkColor, shape,
405 info, xFraction, yFraction);
406 }
407 m_painter->bltFixed(QPoint(ix, iy), m_fixedDab, m_fixedDab->bounds());
408 }
410 m_inkColor=color;//reset color//
411 }
412 }
413 // recover from jittering of color,
414 // m_inkColor.opacity is recovered with every paint
415}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
const qreal rad2deg
virtual quint8 * rawData()=0
const KoColorSpace * colorSpace() const
quint32 pixelSize() const
virtual void clear()
const KoColorSpace * colorSpace() const
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
KisRandomAccessorSP createRandomAccessorNG()
KisRandomSourceSP randomSource() const
const QPointF & pos() const
qreal pressure() const
The pressure of the value (from 0.0 to 1.0)
qreal drawingAngle(bool considerLockedAngle=false) const
@ FillStyleForegroundColor
void setMaskImageSize(qint32 width, qint32 height)
void setOpacityF(qreal opacity)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
void setFillStyle(FillStyle fillStyle)
Set the current style with which to fill.
void setPaintColor(const KoColor &color)
void bltFixed(qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
virtual void moveTo(qint32 x, qint32 y)=0
qreal generateNormalized() const
virtual quint32 pixelSize() const =0
KoColorTransformation * createColorTransformation(const QString &id, const QHash< QString, QVariant > &parameters) const
KoMixColorsOp * mixColorsOp
virtual void setParameter(int id, const QVariant &parameter)
virtual void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const =0
void setParameters(const QHash< QString, QVariant > &parameters)
void setOpacity(quint8 alpha)
Definition KoColor.cpp:333
quint8 * data()
Definition KoColor.h:144
const KoColorSpace * colorSpace() const
return the current colorSpace
Definition KoColor.h:82
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
qreal deg2rad(quint16 deg) const
convert degrees to radians
qreal m_radius
Definition spray_brush.h:57
KoColor m_inkColor
Definition spray_brush.h:56
const KisSprayShapeDynamicsOptionData * m_shapeDynamicsProperties
Definition spray_brush.h:72
const KisSprayOpOptionData * m_sprayOpOptionData
Definition spray_brush.h:68
KisBrushSP m_brush
Definition spray_brush.h:74
KisPaintDeviceSP m_imageDevice
Definition spray_brush.h:62
const KisSprayShapeOptionData * m_shapeProperties
Definition spray_brush.h:71
KisFixedPaintDeviceSP m_fixedDab
Definition spray_brush.h:75
void paintEllipse(KisPainter *painter, qreal x, qreal y, qreal a, qreal b, qreal angle)
qreal rotationAngle(KisRandomSourceSP randomSource)
rotation in radians according the settings (gauss distribution, uniform distribution or fixed angle)
QImage m_brushQImage
Definition spray_brush.h:63
void paintCircle(KisPainter *painter, qreal x, qreal y, qreal radius)
void paintRectangle(KisPainter *painter, qreal x, qreal y, qreal width, qreal height, qreal angle)
void paintParticle(KisRandomAccessorSP &writeAccessor, const KoColor &color, qreal rx, qreal ry)
Paints Wu Particle.
QImage m_transformed
Definition spray_brush.h:64
quint32 m_particlesCount
Definition spray_brush.h:58
quint8 m_dabPixelSize
Definition spray_brush.h:59
qreal linearInterpolation(qreal a, qreal b, qreal weight) const
mix a with b.b mix with weight and a with 1.0 - weight
const KisColorOptionData * m_colorProperties
Definition spray_brush.h:70
@ IMAGESTAMP
Definition kis_brush.h:40
T pow2(const T &x)
Definition kis_global.h:166
T blend(T src, T srcAlpha, T dst, T dstAlpha, T cfValue)
static void splitCoordinate(qreal coordinate, qint32 *whole, qreal *fraction)
QSize effectiveSize(int diameter, qreal scale) const

References KisSprayOpOptionData::aspect, KisPainter::bitBlt(), KisPainter::bltFixed(), KisFixedPaintDevice::bounds(), KisSprayOpOptionData::brushRotation, KisPaintDevice::clear(), KisColorOptionData::colorPerParticle, KisFixedPaintDevice::colorSpace(), KisPaintDevice::colorSpace(), KoColor::colorSpace(), KisPaintDevice::convertFromQImage(), KisSprayOpOptionData::coverage, KoColorSpace::createColorTransformation(), KisPaintDevice::createRandomAccessorNG(), KisFixedPaintDevice::data(), KoColor::data(), KisSprayOpOption::data, deg2rad(), KisSprayOpOptionData::diameter, KisPaintInformation::drawingAngle(), KisSprayShapeOptionData::effectiveSize(), KisSprayShapeDynamicsOptionData::enabled, KisSprayShapeOptionData::enabled, KisColorOptionData::fillBackground, KisPainter::FillStyleForegroundColor, KisSprayShapeDynamicsOptionData::followCursor, KisSprayShapeDynamicsOptionData::followCursorWeight, KisSprayShapeDynamicsOptionData::followDrawingAngle, KisSprayShapeDynamicsOptionData::followDrawingAngleWeight, KisRandomSource::generateNormalized(), KisColorOptionData::hue, KisSprayShapeOptionData::image, IMAGESTAMP, KisSprayOpOptionData::jitterAmount, KisSprayOpOptionData::jitterMovement, length(), linearInterpolation(), m_brush, m_brushQImage, m_colorProperties, m_dabPixelSize, m_dabSeqNo, m_fixedDab, m_imageDevice, m_inkColor, m_painter, m_particlesCount, M_PI, m_radius, m_shapeDynamicsProperties, m_shapeProperties, m_sprayOpOption, m_sprayOpOptionData, m_transfo, m_transformed, KisColorOptionData::mixBgColor, KoMixColorsOp::mixColors(), KoColorSpace::mixColorsOp, KisRandomConstAccessorNG::moveTo(), paintCircle(), paintEllipse(), paintParticle(), paintRectangle(), KisSprayOpOptionData::particleCount, KisPaintDevice::pixelSize(), KoColorSpace::pixelSize(), KisPaintInformation::pos(), pow2(), KisPaintInformation::pressure(), rad2deg, KisSprayShapeDynamicsOptionData::randomSize, KisPaintInformation::randomSource(), KisBaseAccessor::rawData(), rotationAngle(), KisColorOptionData::sampleInputColor, KisCrossDeviceColorSamplerImpl< Traits >::sampleOldColor(), KisColorOptionData::saturation, KisSprayOpOptionData::scale, KisPainter::setFillStyle(), KisPainter::setMaskImageSize(), KoColor::setOpacity(), KisPainter::setOpacityF(), KisPainter::setPaintColor(), KoColorTransformation::setParameter(), KoColorTransformation::setParameters(), KisSprayShapeOptionData::shape, source(), KisPaintOp::splitCoordinate(), KoColorTransformation::transform(), KisSprayOpOptionData::useDensity, KisColorOptionData::useRandomHSV, KisColorOptionData::useRandomOpacity, and KisColorOptionData::value.

◆ paintOutline()

void SprayBrush::paintOutline ( KisPaintDeviceSP dev,
const KoColor & painterColor,
qreal posX,
qreal posY,
qreal radius )
private

Definition at line 487 of file spray_brush.cpp.

488{
489 QList<QPointF> antiPixels;
491
492 for (int y = -radius + posY; y <= radius + posY; y++) {
493 for (int x = -radius + posX; x <= radius + posX; x++) {
494 accessor->moveTo(x, y);
495 qreal alpha = dev->colorSpace()->opacityU8(accessor->rawData());
496
497 if (alpha != 0) {
498 // top left
499 accessor->moveTo(x - 1, y - 1);
500 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
501 antiPixels.append(QPointF(x - 1, y - 1));
502 //continue;
503 }
504
505 // top
506 accessor->moveTo(x, y - 1);
507 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
508 antiPixels.append(QPointF(x, y - 1));
509 //continue;
510 }
511
512 // top right
513 accessor->moveTo(x + 1, y - 1);
514 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
515 antiPixels.append(QPointF(x + 1, y - 1));
516 //continue;
517 }
518
519 //left
520 accessor->moveTo(x - 1, y);
521 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
522 antiPixels.append(QPointF(x - 1, y));
523 //continue;
524 }
525
526 //right
527 accessor->moveTo(x + 1, y);
528 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
529 antiPixels.append(QPointF(x + 1, y));
530 //continue;
531 }
532
533 // bottom left
534 accessor->moveTo(x - 1, y + 1);
535 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
536 antiPixels.append(QPointF(x - 1, y + 1));
537 //continue;
538 }
539
540 // bottom
541 accessor->moveTo(x, y + 1);
542 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
543 antiPixels.append(QPointF(x, y + 1));
544 //continue;
545 }
546
547 // bottom right
548 accessor->moveTo(x + 1, y + 1);
549 if (dev->colorSpace()->opacityU8(accessor->rawData()) == 0) {
550 antiPixels.append(QPointF(x + 1, y + 1));
551 //continue;
552 }
553 }
554
555 }
556 }
557
558 // anti-alias it
559 int size = antiPixels.size();
560 for (int i = 0; i < size; i++) {
561 accessor->moveTo(antiPixels[i].x(), antiPixels[i].y());
562 memcpy(accessor->rawData(), outlineColor.data(), dev->colorSpace()->pixelSize());
563 }
564}
virtual quint8 opacityU8(const quint8 *pixel) const =0
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KisPaintDevice::colorSpace(), KisPaintDevice::createRandomAccessorNG(), KoColor::data(), KisRandomConstAccessorNG::moveTo(), KoColorSpace::opacityU8(), KoColorSpace::pixelSize(), and KisBaseAccessor::rawData().

◆ paintParticle()

void SprayBrush::paintParticle ( KisRandomAccessorSP & writeAccessor,
const KoColor & color,
qreal rx,
qreal ry )
private

Paints Wu Particle.

Definition at line 419 of file spray_brush.cpp.

420{
421 // opacity top left, right, bottom left, right
422 KoColor pcolor(color);
423 //int opacity = pcolor.opacityU8();
424
425 int ipx = int (rx);
426 int ipy = int (ry);
427 qreal fx = rx - ipx;
428 qreal fy = ry - ipy;
429
430 qreal btl = (1 - fx) * (1 - fy);
431 qreal btr = (fx) * (1 - fy);
432 qreal bbl = (1 - fx) * (fy);
433 qreal bbr = (fx) * (fy);
434
435 // this version overwrite pixels, e.g. when it sprays two particle next
436 // to each other, the pixel with lower opacity can override other pixel.
437 // Maybe some kind of compositing using here would be cool
438
439 pcolor.setOpacity(btl);
440 writeAccessor->moveTo(ipx , ipy);
441 memcpy(writeAccessor->rawData(), pcolor.data(), m_dabPixelSize);
442
443 pcolor.setOpacity(btr);
444 writeAccessor->moveTo(ipx + 1, ipy);
445 memcpy(writeAccessor->rawData(), pcolor.data(), m_dabPixelSize);
446
447 pcolor.setOpacity(bbl);
448 writeAccessor->moveTo(ipx, ipy + 1);
449 memcpy(writeAccessor->rawData(), pcolor.data(), m_dabPixelSize);
450
451 pcolor.setOpacity(bbr);
452 writeAccessor->moveTo(ipx + 1, ipy + 1);
453 memcpy(writeAccessor->rawData(), pcolor.data(), m_dabPixelSize);
454}

References KoColor::data(), m_dabPixelSize, KisRandomConstAccessorNG::moveTo(), KisBaseAccessor::rawData(), and KoColor::setOpacity().

◆ paintRectangle()

void SprayBrush::paintRectangle ( KisPainter * painter,
qreal x,
qreal y,
qreal width,
qreal height,
qreal angle )
private

Definition at line 475 of file spray_brush.cpp.

476{
477 QPainterPath path;
478 path.addRect(QRectF(-0.5 * width, -0.5 * height, width, height));
479 QTransform t;
480 t.translate(x, y);
481 t.rotateRadians(angle);
482 path = t.map(path);
483 painter->fillPainterPath(path);
484}

References KisPainter::fillPainterPath().

◆ rad2deg()

qreal SprayBrush::rad2deg ( qreal rad) const
inlineprivate

convert radians to degrees

Definition at line 116 of file spray_brush.h.

116 {
117 return rad * (180.0 / M_PI);
118 }

References M_PI.

◆ rotationAngle()

qreal SprayBrush::rotationAngle ( KisRandomSourceSP randomSource)
private

◆ setFixedDab()

void SprayBrush::setFixedDab ( KisFixedPaintDeviceSP dab)

Definition at line 566 of file spray_brush.cpp.

567{
568 m_fixedDab = dab;
569}

References m_fixedDab.

◆ setProperties()

void SprayBrush::setProperties ( KisSprayOpOptionData * properties,
KisColorOptionData * colorProperties,
KisSprayShapeOptionData * shapeProperties,
KisSprayShapeDynamicsOptionData * shapeDynamicsProperties,
KisBrushSP brush )

Definition at line 51 of file spray_brush.cpp.

56{
57 m_sprayOpOptionData = properties;
58 m_sprayOpOption = new KisSprayOpOption(*properties);
60 m_colorProperties = colorProperties;
61 m_shapeProperties = shapeProperties;
62 m_shapeDynamicsProperties = shapeDynamicsProperties;
63 m_brush = brush;
64 if (m_brush) {
65 m_brush->notifyStrokeStarted();
66 }
67}

References m_brush, m_colorProperties, m_shapeDynamicsProperties, m_shapeProperties, m_sprayOpOption, m_sprayOpOptionData, and KisSprayOpOption::updateDistributions().

Member Data Documentation

◆ m_brush

KisBrushSP SprayBrush::m_brush
private

Definition at line 74 of file spray_brush.h.

◆ m_brushQImage

QImage SprayBrush::m_brushQImage
private

Definition at line 63 of file spray_brush.h.

◆ m_colorProperties

const KisColorOptionData* SprayBrush::m_colorProperties {nullptr}
private

Definition at line 70 of file spray_brush.h.

70{nullptr};

◆ m_dabPixelSize

quint8 SprayBrush::m_dabPixelSize {1}
private

Definition at line 59 of file spray_brush.h.

59{1};

◆ m_dabSeqNo

int SprayBrush::m_dabSeqNo {0}
private

Definition at line 55 of file spray_brush.h.

55{0};

◆ m_fixedDab

KisFixedPaintDeviceSP SprayBrush::m_fixedDab
private

Definition at line 75 of file spray_brush.h.

◆ m_imageDevice

KisPaintDeviceSP SprayBrush::m_imageDevice
private

Definition at line 62 of file spray_brush.h.

◆ m_inkColor

KoColor SprayBrush::m_inkColor
private

Definition at line 56 of file spray_brush.h.

◆ m_painter

KisPainter* SprayBrush::m_painter {nullptr}
private

Definition at line 61 of file spray_brush.h.

61{nullptr};

◆ m_particlesCount

quint32 SprayBrush::m_particlesCount {1}
private

Definition at line 58 of file spray_brush.h.

58{1};

◆ m_radius

qreal SprayBrush::m_radius {1.0}
private

Definition at line 57 of file spray_brush.h.

57{1.0};

◆ m_shapeDynamicsProperties

const KisSprayShapeDynamicsOptionData* SprayBrush::m_shapeDynamicsProperties {nullptr}
private

Definition at line 72 of file spray_brush.h.

72{nullptr};

◆ m_shapeProperties

const KisSprayShapeOptionData* SprayBrush::m_shapeProperties {nullptr}
private

Definition at line 71 of file spray_brush.h.

71{nullptr};

◆ m_sprayOpOption

KisSprayOpOption* SprayBrush::m_sprayOpOption {nullptr}
private

Definition at line 69 of file spray_brush.h.

69{nullptr};

◆ m_sprayOpOptionData

const KisSprayOpOptionData* SprayBrush::m_sprayOpOptionData {nullptr}
private

Definition at line 68 of file spray_brush.h.

68{nullptr};

◆ m_transfo

KoColorTransformation* SprayBrush::m_transfo {nullptr}
private

Definition at line 66 of file spray_brush.h.

66{nullptr};

◆ m_transformed

QImage SprayBrush::m_transformed
private

Definition at line 64 of file spray_brush.h.


The documentation for this class was generated from the following files: