79 qreal randomValue = 0.0;
85 M_PI * 2.0 * randomValue,
94 qreal rotation, qreal scale,
95 qreal additionalScale,
105template <
typename AngularDistribution>
108 qreal rotation, qreal scale,
109 qreal additionalScale,
112 const AngularDistribution &angularDistribution)
116 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
119 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
124 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
127 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
131 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
134 paintImpl(dab,
source, info, rotation, scale, additionalScale, color, bgColor,
139template <
typename AngularDistribution,
typename RadialDistribution>
142 qreal rotation, qreal scale,
143 qreal additionalScale,
146 const AngularDistribution &angularDistribution,
147 const RadialDistribution &radialDistribution)
149 if (!angularDistribution.isValid() || !radialDistribution.isValid()) {
175 qreal x = info.
pos().x();
176 qreal y = info.
pos().y();
202 QHash<QString, QVariant> params;
208 qreal rotationZ = 0.0;
209 qreal particleScale = 1.0;
211 bool shouldColor =
true;
224 angle = angularDistribution(randomSource) *
M_PI * 2;
226 length = radialDistribution(randomSource);
256 m.map(nx, ny, &nx, &ny);
269 const quint8 *colors[2];
271 colors[1] = bgColor.
data();
273 qint16 colorWeights[2];
277 colorWeights[0] =
static_cast<quint16
>(blend * MAX_16BIT);
278 colorWeights[1] =
static_cast<quint16
>((1.0 - blend) * MAX_16BIT);
305 qreal jitteredWidth = qMax(1.0 * additionalScale, effectiveSize.width() * particleScale * additionalScale);
306 qreal jitteredHeight = qMax(1.0 * additionalScale, effectiveSize.height() * particleScale * additionalScale);
313 if (effectiveSize.width() == effectiveSize.height()){
345 m.scale(additionalScale, additionalScale);
348 m.scale(particleScale, particleScale);
357 for (
int y = rc.y(); y < rc.y() + rc.height(); y++) {
358 for (
int x = rc.x(); x < rc.x() + rc.width(); x++) {
365 ix = qRound(nx + x - rc.width() * 0.5);
366 iy = qRound(ny + y - rc.height() * 0.5);
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;
394 shape, info, xFraction, yFraction);
405 info, xFraction, yFraction);
430 qreal btl = (1 - fx) * (1 - fy);
431 qreal btr = (fx) * (1 - fy);
432 qreal bbl = (1 - fx) * (fy);
433 qreal bbr = (fx) * (fy);
440 writeAccessor->
moveTo(ipx , ipy);
444 writeAccessor->
moveTo(ipx + 1, ipy);
448 writeAccessor->
moveTo(ipx, ipy + 1);
452 writeAccessor->
moveTo(ipx + 1, ipy + 1);
459 path.addEllipse(QPointF(x,y),radius,radius);
467 path.addEllipse(QPointF(), a, b);
470 t.rotateRadians(angle);
478 path.addRect(QRectF(-0.5 * width, -0.5 * height, width, height));
481 t.rotateRadians(angle);
492 for (
int y = -radius + posY; y <= radius + posY; y++) {
493 for (
int x = -radius + posX; x <= radius + posX; x++) {
499 accessor->
moveTo(x - 1, y - 1);
501 antiPixels.append(QPointF(x - 1, y - 1));
506 accessor->
moveTo(x, y - 1);
508 antiPixels.append(QPointF(x, y - 1));
513 accessor->
moveTo(x + 1, y - 1);
515 antiPixels.append(QPointF(x + 1, y - 1));
520 accessor->
moveTo(x - 1, y);
522 antiPixels.append(QPointF(x - 1, y));
527 accessor->
moveTo(x + 1, y);
529 antiPixels.append(QPointF(x + 1, y));
534 accessor->
moveTo(x - 1, y + 1);
536 antiPixels.append(QPointF(x - 1, y + 1));
541 accessor->
moveTo(x, y + 1);
543 antiPixels.append(QPointF(x, y + 1));
548 accessor->
moveTo(x + 1, y + 1);
550 antiPixels.append(QPointF(x + 1, y + 1));
559 int size = antiPixels.size();
560 for (
int i = 0; i < size; i++) {
561 accessor->
moveTo(antiPixels[i].x(), antiPixels[i].y());
qreal length(const QPointF &vec)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
virtual quint8 * rawData()=0
void sampleOldColor(typename Traits::coord_type x, typename Traits::coord_type y, quint8 *dst)
const KoColorSpace * colorSpace() const
quint32 pixelSize() const
const KoColorSpace * colorSpace() const
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
KisRandomAccessorSP createRandomAccessorNG()
@ 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 fillPainterPath(const QPainterPath &path)
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
KisSprayCurveBasedDistributionPolarDistance m_radialCurveBasedDistributionPolarDistance
KisSprayCurveBasedDistribution m_angularCurveBasedDistribution
KisSprayNormalDistributionPolarDistance m_normalDistributionPolarDistance
void updateDistributions()
KisSprayClusterBasedDistributionPolarDistance m_clusterBasedDistributionPolarDistance
KisSprayUniformDistributionPolarDistance m_uniformDistributionPolarDistance
KisSprayNormalDistribution m_normalDistribution
KisSprayUniformDistribution m_uniformDistribution
KisSprayOpOptionData data
virtual quint32 pixelSize() const =0
virtual quint8 opacityU8(const quint8 *pixel) const =0
KoColorTransformation * createColorTransformation(const QString &id, const QHash< QString, QVariant > ¶meters) const
KoMixColorsOp * mixColorsOp
void setOpacity(quint8 alpha)
const KoColorSpace * colorSpace() const
return the current colorSpace
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
void setFixedDab(KisFixedPaintDeviceSP dab)
qreal deg2rad(quint16 deg) const
convert degrees to radians
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 KisSprayShapeDynamicsOptionData * m_shapeDynamicsProperties
const KisSprayOpOptionData * m_sprayOpOptionData
void setProperties(KisSprayOpOptionData *properties, KisColorOptionData *colorProperties, KisSprayShapeOptionData *shapeProperties, KisSprayShapeDynamicsOptionData *shapeDynamicsProperties, KisBrushSP brush)
KisPaintDeviceSP m_imageDevice
void paint(KisPaintDeviceSP dab, KisPaintDeviceSP source, const KisPaintInformation &info, qreal rotation, qreal scale, qreal additionalScale, const KoColor &color, const KoColor &bgColor)
const KisSprayShapeOptionData * m_shapeProperties
KisFixedPaintDeviceSP m_fixedDab
void paintEllipse(KisPainter *painter, qreal x, qreal y, qreal a, qreal b, qreal angle)
KoColorTransformation * m_transfo
KisSprayOpOption * m_sprayOpOption
qreal rotationAngle(KisRandomSourceSP randomSource)
rotation in radians according the settings (gauss distribution, uniform distribution or fixed angle)
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.
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
void paintOutline(KisPaintDeviceSP dev, const KoColor &painterColor, qreal posX, qreal posY, qreal radius)
static void splitCoordinate(qreal coordinate, qint32 *whole, qreal *fraction)
ParticleDistribution radialDistributionType
bool radialDistributionCenterBiased
@ ParticleDistribution_ClusterBased
@ ParticleDistribution_Uniform
@ ParticleDistribution_Gaussian
ParticleDistribution angularDistributionType
qreal followDrawingAngleWeight
qreal randomRotationWeight
QSize effectiveSize(int diameter, qreal scale) const