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

#include <kis_liquify_paintop.h>

Classes

struct  Private
 

Public Member Functions

 KisLiquifyPaintop (const KisLiquifyProperties &props, KisLiquifyTransformWorker *worker)
 
KisSpacingInformation paintAt (const KisPaintInformation &pi)
 
void updateSpacing (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
void updateTiming (const KisPaintInformation &info, KisDistanceInformation &currentDistance) const
 
KisTimingInformation updateTimingImpl (const KisPaintInformation &pi) const
 
 ~KisLiquifyPaintop ()
 

Static Public Member Functions

static QPainterPath brushOutline (const KisLiquifyProperties &props, const KisPaintInformation &info)
 

Protected Member Functions

KisSpacingInformation updateSpacingImpl (const KisPaintInformation &pi) const
 

Private Member Functions

qreal computeSize (const KisPaintInformation &pi) const
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 21 of file kis_liquify_paintop.h.

Constructor & Destructor Documentation

◆ KisLiquifyPaintop()

KisLiquifyPaintop::KisLiquifyPaintop ( const KisLiquifyProperties & props,
KisLiquifyTransformWorker * worker )

Definition at line 30 of file kis_liquify_paintop.cpp.

31 : m_d(new Private(props, worker))
32{
33}
const QScopedPointer< Private > m_d

◆ ~KisLiquifyPaintop()

KisLiquifyPaintop::~KisLiquifyPaintop ( )

Definition at line 35 of file kis_liquify_paintop.cpp.

36{
37}

Member Function Documentation

◆ brushOutline()

QPainterPath KisLiquifyPaintop::brushOutline ( const KisLiquifyProperties & props,
const KisPaintInformation & info )
static

Definition at line 39 of file kis_liquify_paintop.cpp.

41{
42 const qreal diameter = props.size();
43 const qreal reverseCoeff = props.reverseDirection() ? -1.0 : 1.0;
44
45 QPainterPath outline;
46 outline.addEllipse(-0.5 * diameter, -0.5 * diameter,
47 diameter, diameter);
48
49 switch (props.mode()) {
52 break;
54 QPainterPath p;
55 p.lineTo(-3.0, 4.0);
56 p.moveTo(0.0, 0.0);
57 p.lineTo(-3.0, -4.0);
58
59 QTransform S;
60 if (diameter < 15.0) {
61 const qreal scale = diameter / 15.0;
62 S = QTransform::fromScale(scale, scale);
63 }
64 QTransform R;
65 R.rotateRadians(-reverseCoeff * 0.5 * M_PI);
66 QTransform T = QTransform::fromTranslate(0.5 * diameter, 0.0);
67
68 p = (S * R * T).map(p);
69 outline.addPath(p);
70
71 break;
72 }
74 qreal normalAngle = info.drawingAngle() + reverseCoeff * 0.5 * M_PI;
75
76 QPainterPath p = KisAlgebra2D::smallArrow();
77
78 const qreal offset = qMax(0.8 * diameter, 15.0);
79
80 QTransform R;
81 R.rotateRadians(normalAngle);
82 QTransform T = QTransform::fromTranslate(offset, 0.0);
83 p = (T * R).map(p);
84
85 outline.addPath(p);
86
87 break;
88 }
90 break;
92 qFatal("Not supported mode");
93 }
94
95 return outline;
96}
Eigen::Matrix< double, 4, 2 > S
const Params2D p
Eigen::Matrix< double, 4, 2 > R
qreal drawingAngle(bool considerLockedAngle=false) const
#define M_PI
Definition kis_global.h:111
QPainterPath smallArrow()

References KisPaintInformation::drawingAngle(), M_PI, KisLiquifyProperties::mode(), KisLiquifyProperties::MOVE, KisLiquifyProperties::N_MODES, KisLiquifyProperties::OFFSET, p, R, KisLiquifyProperties::reverseDirection(), KisLiquifyProperties::ROTATE, S, KisLiquifyProperties::SCALE, KisLiquifyProperties::size(), KisAlgebra2D::smallArrow(), and KisLiquifyProperties::UNDO.

◆ computeSize()

qreal KisLiquifyPaintop::computeSize ( const KisPaintInformation & pi) const
private

Definition at line 196 of file kis_liquify_paintop.cpp.

197{
198 static const qreal sizeToSigmaCoeff = 1.0 / 3.0;
199 return sizeToSigmaCoeff *
200 (m_d->props.sizeHasPressure() ?
201 pi.pressure() * m_d->props.size():
202 m_d->props.size());
203}
qreal pressure() const
The pressure of the value (from 0.0 to 1.0)

References m_d, and KisPaintInformation::pressure().

◆ paintAt()

KisSpacingInformation KisLiquifyPaintop::paintAt ( const KisPaintInformation & pi)

Definition at line 128 of file kis_liquify_paintop.cpp.

129{
130 const qreal size = computeSize(pi);
131
132 const qreal spacing = m_d->props.spacing() * size;
133
134 const qreal reverseCoeff =
135 m_d->props.mode() !=
137 m_d->props.reverseDirection() ? -1.0 : 1.0;
138 const qreal amount = m_d->props.amountHasPressure() ?
139 pi.pressure() * reverseCoeff * m_d->props.amount():
140 reverseCoeff * m_d->props.amount();
141
142 const bool useWashMode = m_d->props.useWashMode();
143 const qreal flow = m_d->props.flow();
144
145 switch (m_d->props.mode()) {
147 const qreal offsetLength = size * amount;
148 m_d->worker->translatePoints(pi.pos(),
149 pi.drawingDirectionVector() * offsetLength,
150 size, useWashMode, flow);
151
152 break;
153 }
155 m_d->worker->scalePoints(pi.pos(),
156 amount,
157 size, useWashMode, flow);
158 break;
160 m_d->worker->rotatePoints(pi.pos(),
161 2.0 * M_PI * amount,
162 size, useWashMode, flow);
163 break;
165 const qreal offsetLength = size * amount;
166 m_d->worker->translatePoints(pi.pos(),
168 size, useWashMode, flow);
169 break;
170 }
172 m_d->worker->undoPoints(pi.pos(),
173 amount,
174 size);
175
176 break;
178 qFatal("Not supported mode");
179 }
180
181 return KisSpacingInformation(spacing);
182}
qreal computeSize(const KisPaintInformation &pi) const
const QPointF & pos() const
QPointF drawingDirectionVector() const
T rightUnitNormal(const T &a)
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References computeSize(), KisPaintInformation::drawingDirectionVector(), m_d, M_PI, KisLiquifyProperties::MOVE, KisLiquifyProperties::N_MODES, KisLiquifyProperties::OFFSET, KisPaintInformation::pos(), KisPaintInformation::pressure(), KisAlgebra2D::rightUnitNormal(), KisLiquifyProperties::ROTATE, KisLiquifyProperties::SCALE, and KisLiquifyProperties::UNDO.

◆ updateSpacing()

void KisLiquifyPaintop::updateSpacing ( const KisPaintInformation & info,
KisDistanceInformation & currentDistance ) const

Updates the spacing in currentDistance based on the provided information.

Definition at line 100 of file kis_liquify_paintop.cpp.

102{
103 KisPaintInformation pi(info);
104 KisSpacingInformation spacingInfo;
105 {
107 = pi.registerDistanceInformation(&currentDistance);
108 spacingInfo = updateSpacingImpl(pi);
109 }
110
111 currentDistance.updateSpacing(spacingInfo);
112}
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &pi) const
void updateSpacing(const KisSpacingInformation &spacing)

References KisPaintInformation::registerDistanceInformation(), KisDistanceInformation::updateSpacing(), and updateSpacingImpl().

◆ updateSpacingImpl()

KisSpacingInformation KisLiquifyPaintop::updateSpacingImpl ( const KisPaintInformation & pi) const
protected

Definition at line 184 of file kis_liquify_paintop.cpp.

185{
186 return KisSpacingInformation(m_d->props.spacing() * computeSize(pi));
187}

References computeSize(), and m_d.

◆ updateTiming()

void KisLiquifyPaintop::updateTiming ( const KisPaintInformation & info,
KisDistanceInformation & currentDistance ) const

Updates the timing in currentDistance based on the provided information.

Definition at line 114 of file kis_liquify_paintop.cpp.

116{
117 KisPaintInformation pi(info);
118 KisTimingInformation timingInfo;
119 {
121 = pi.registerDistanceInformation(&currentDistance);
122 timingInfo = updateTimingImpl(pi);
123 }
124
125 currentDistance.updateTiming(timingInfo);
126}
KisTimingInformation updateTimingImpl(const KisPaintInformation &pi) const
void updateTiming(const KisTimingInformation &timing)

References KisPaintInformation::registerDistanceInformation(), KisDistanceInformation::updateTiming(), and updateTimingImpl().

◆ updateTimingImpl()

KisTimingInformation KisLiquifyPaintop::updateTimingImpl ( const KisPaintInformation & pi) const

Definition at line 189 of file kis_liquify_paintop.cpp.

190{
191 Q_UNUSED(pi);
192 // Don't use airbrushing.
193 return KisTimingInformation();
194}

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisLiquifyPaintop::m_d
private

Definition at line 54 of file kis_liquify_paintop.h.


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