Krita Source Code Documentation
Loading...
Searching...
No Matches
deform_brush.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2008, 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef _DEFORM_BRUSH_H_
8#define _DEFORM_BRUSH_H_
9
10#include <kis_paint_device.h>
12
14#include "KisDeformOptionData.h"
15#include "kis_algebra_2d.h"
16
17#include <time.h>
18
19#if defined(_WIN32) || defined(_WIN64)
20#define srand48 srand
21inline double drand48()
22{
23 return double(rand()) / RAND_MAX;
24}
25#endif
26
27
29{
30public:
32 virtual ~DeformBase() {}
33 virtual void transform(qreal * x, qreal * y, qreal distance, KisRandomSourceSP randomSource) {
34 Q_UNUSED(x);
35 Q_UNUSED(y);
36 Q_UNUSED(distance);
37 Q_UNUSED(randomSource);
38 }
39};
40
42class DeformScale : public DeformBase
43{
44
45public:
46 void setFactor(qreal factor) {
48 }
49 qreal factor() {
50 return m_factor;
51 }
52 void transform(qreal* x, qreal* y, qreal distance, KisRandomSourceSP randomSource) override {
53 Q_UNUSED(randomSource);
54 qreal scaleFactor = KisAlgebra2D::signPZ(m_factor) * (qAbs((1.0 - distance) * m_factor) + distance);
55 *x = *x / scaleFactor;
56 *y = *y / scaleFactor;
57 }
58
59private:
60 qreal m_factor {0.0};
61};
62
65{
66
67public:
68 void setAlpha(qreal alpha) {
69 m_alpha = alpha;
70 }
71 void transform(qreal* maskX, qreal* maskY, qreal distance, KisRandomSourceSP randomSource) override {
72 Q_UNUSED(randomSource);
73 distance = 1.0 - distance;
74 qreal rotX = cos(-m_alpha * distance) * (*maskX) - sin(-m_alpha * distance) * (*maskY);
75 qreal rotY = sin(-m_alpha * distance) * (*maskX) + cos(-m_alpha * distance) * (*maskY);
76
77 *maskX = rotX;
78 *maskY = rotY;
79 }
80
81private:
82 qreal m_alpha {0.0};
83};
84
86class DeformMove : public DeformBase
87{
88public:
89 void setFactor(qreal factor) {
90 m_factor = factor;
91 }
92 void setDistance(qreal dx, qreal dy) {
93 m_dx = dx;
94 m_dy = dy;
95 }
96 void transform(qreal* maskX, qreal* maskY, qreal distance, KisRandomSourceSP randomSource) override {
97 Q_UNUSED(randomSource);
98 *maskX -= m_dx * m_factor * (1.0 - distance);
99 *maskY -= m_dy * m_factor * (1.0 - distance);
100 }
101
102private:
103 qreal m_dx {0.0};
104 qreal m_dy {0.0};
105 qreal m_factor {0.0};
106};
107
109class DeformLens : public DeformBase
110{
111public:
112 void setLensFactor(qreal k1, qreal k2) {
113 m_k1 = k1;
114 m_k2 = k2;
115 }
116 void setMaxDistance(qreal maxX, qreal maxY) {
117 m_maxX = maxX;
118 m_maxY = maxY;
119 }
120 void setMode(bool out) {
121 m_out = out;
122 }
123
124 void transform(qreal* maskX, qreal* maskY, qreal distance, KisRandomSourceSP randomSource) override {
125 Q_UNUSED(distance);
126 Q_UNUSED(randomSource);
127 //normalize
128 qreal normX = *maskX / m_maxX;
129 qreal normY = *maskY / m_maxY;
130
131 qreal radius_2 = normX * normX + normY * normY;
132 qreal radius_4 = radius_2 * radius_2;
133
134 if (m_out) {
135 *maskX = normX * (1.0 + m_k1 * radius_2 + m_k2 * radius_4);
136 *maskY = normY * (1.0 + m_k1 * radius_2 + m_k2 * radius_4);
137 }
138 else {
139 *maskX = normX / (1.0 + m_k1 * radius_2 + m_k2 * radius_4);
140 *maskY = normY / (1.0 + m_k1 * radius_2 + m_k2 * radius_4);
141 }
142
143 *maskX = m_maxX * (*maskX);
144 *maskY = m_maxY * (*maskY);
145 }
146
147private:
148 qreal m_k1 {0.0}, m_k2 {0.0};
149 qreal m_maxX {0.0}, m_maxY {0.0};
150 bool m_out {false};
151};
152
155{
156public:
158 }
159
160 void setFactor(qreal factor) {
161 m_factor = factor;
162 }
163 void transform(qreal* x, qreal* y, qreal distance, KisRandomSourceSP randomSource) override {
164 Q_UNUSED(distance);
165 qreal randomX = m_factor * ((randomSource->generateNormalized() * 2.0) - 1.0);
166 qreal randomY = m_factor * ((randomSource->generateNormalized() * 2.0) - 1.0);
167 *x += randomX;
168 *y += randomY;
169 }
170
171private:
172 qreal m_factor {0.0};
173};
174
175
176
177
178
180{
181
182public:
183 DeformBrush();
184 ~DeformBrush();
185
187 qreal scale, qreal rotation, QPointF pos,
188 qreal subPixelX, qreal subPixelY, int dabX, int dabY);
189
191 m_sizeProperties = properties;
192 }
194 m_properties = properties;
195 }
196 void initDeformAction();
197 QPointF hotSpot(qreal scale, qreal rotation);
198
199private:
200 // return true if can paint
201 bool setupAction(
202 DeformModes mode, const QPointF& pos, QTransform const& rotation);
203 void debugColor(const quint8* data, KoColorSpace * cs);
204
205 qreal maskWidth(qreal scale) {
206 return m_sizeProperties->brushDiameter * scale;
207 }
208
209 qreal maskHeight(qreal scale) {
211 }
212
213 inline qreal norme(qreal x, qreal y) {
214 return x * x + y * y;
215 }
216
217
218private:
220 bool m_firstPaint {false};
221 qreal m_prevX {0.0}, m_prevY {0.0};
222 int m_counter {1}; // taken from the constructor
223
225
227
230};
231
232
233#endif
qreal distance(const QPointF &p1, const QPointF &p2)
virtual ~DeformBase()
virtual void transform(qreal *x, qreal *y, qreal distance, KisRandomSourceSP randomSource)
QRectF m_maskRect
void debugColor(const quint8 *data, KoColorSpace *cs)
KisBrushSizeOptionData * m_sizeProperties
void initDeformAction()
KisFixedPaintDeviceSP paintMask(KisFixedPaintDeviceSP dab, KisPaintDeviceSP layer, KisRandomSourceSP randomSource, qreal scale, qreal rotation, QPointF pos, qreal subPixelX, qreal subPixelY, int dabX, int dabY)
void setSizeProperties(KisBrushSizeOptionData *properties)
bool setupAction(DeformModes mode, const QPointF &pos, QTransform const &rotation)
KisDeformOptionData * m_properties
KisRandomSubAccessorSP m_srcAcc
qreal maskHeight(qreal scale)
void setProperties(KisDeformOptionData *properties)
QPointF hotSpot(qreal scale, qreal rotation)
qreal maskWidth(qreal scale)
qreal norme(qreal x, qreal y)
DeformBase * m_deformAction
Randomly disturb the pixels.
void transform(qreal *x, qreal *y, qreal distance, KisRandomSourceSP randomSource) override
void setFactor(qreal factor)
Inverse lens distortion.
void setLensFactor(qreal k1, qreal k2)
void transform(qreal *maskX, qreal *maskY, qreal distance, KisRandomSourceSP randomSource) override
void setMode(bool out)
void setMaxDistance(qreal maxX, qreal maxY)
Inverse move.
void setFactor(qreal factor)
void transform(qreal *maskX, qreal *maskY, qreal distance, KisRandomSourceSP randomSource) override
void setDistance(qreal dx, qreal dy)
Inverse weighted rotation - swirlCW&&swirlCWW.
void transform(qreal *maskX, qreal *maskY, qreal distance, KisRandomSourceSP randomSource) override
void setAlpha(qreal alpha)
Inverse weighted inverse scaling - grow&shrink.
void transform(qreal *x, qreal *y, qreal distance, KisRandomSourceSP randomSource) override
void setFactor(qreal factor)
qreal factor()
qreal generateNormalized() const