Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_painting_information_builder.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <KoPointerEvent.h>
10
11#include "kis_config.h"
12#include "kis_config_notifier.h"
13
14#include "kis_cubic_curve.h"
15#include "kis_speed_smoother.h"
16
19
20
21/***********************************************************************/
22/* KisPaintingInformationBuilder */
23/***********************************************************************/
24
25
27
28
30 : m_speedSmoother(new KisSpeedSmoother()),
31 m_pressureDisabled(false)
32{
33 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()),
34 SLOT(updateSettings()));
35
37}
38
43
45{
46 KisConfig cfg(true);
47 const KisCubicCurve curve(cfg.pressureTabletCurve());
49 m_maxAllowedSpeedValue = cfg.readEntry("maxAllowedSpeedValue", 30);
50
51 // The setting is stored in [-180, 180] degrees range to match the UI.
52 // We now need to convert it to [0, 360) range.
53 m_tiltDirectionOffset = cfg.readEntry("tiltDirectionOffset", 0);
54 if (m_tiltDirectionOffset < 0.0) {
55 m_tiltDirectionOffset += 360.0;
56 }
57
58 m_speedSmoother->updateSettings();
59}
60
62 int timeElapsed,
63 const KoCanvasResourceProvider *manager)
64{
65 if (manager) {
67 }
68
69 m_startPoint = event->point;
70 return createPaintingInformation(event, timeElapsed);
71
72}
73
75 int timeElapsed)
76{
77 return createPaintingInformation(event, timeElapsed);
78}
79
80QPointF KisPaintingInformationBuilder::adjustDocumentPoint(const QPointF &point, const QPointF &/*startPoint*/)
81{
82 return point;
83}
84
86{
87 return point;
88}
89
91{
92 return point;
93}
94
95QPointF KisPaintingInformationBuilder::imageToView(const QPointF &point)
96{
97 return point;
98}
99
101{
102 Q_UNUSED(documentPoint);
103 return 1.0;
104}
105
107{
108 return 0;
109}
110
112{
113 return false;
114}
115
117{
118 return false;
119}
120
122 int timeElapsed)
123{
124
125 QPointF adjusted = adjustDocumentPoint(event->point, m_startPoint);
126 QPointF imagePoint = documentToImage(adjusted);
127 qreal perspective = calculatePerspective(adjusted);
128 const qreal speed = m_speedSmoother->getNextSpeed(imageToView(imagePoint), event->time());
129
130 KisPaintInformation pi(imagePoint,
132 event->xTilt(), event->yTilt(),
133 event->rotation(),
134 event->tangentialPressure(),
135 perspective,
136 timeElapsed,
137 qMin(1.0, speed / qreal(m_maxAllowedSpeedValue)));
138
143
144 return pi;
145}
146
148 const KoPointerEvent *event,
149 bool isStrokeStarted)
150{
151 const qreal perspective = calculatePerspective(imageToDocument(imagePoint));
152
153 const qreal speed = !isStrokeStarted && event ?
154 m_speedSmoother->getNextSpeed(imageToView(imagePoint), event->time()) :
155 m_speedSmoother->lastSpeed();
156
157 if (event) {
160 event->xTilt(), event->yTilt(),
161 event->rotation(),
162 event->tangentialPressure(),
163 perspective,
164 qMin(1.0, speed / qreal(m_maxAllowedSpeedValue)),
169 } else {
175 return pi;
176 }
177}
178
183
188
189/***********************************************************************/
190/* KisConverterPaintingInformationBuilder */
191/***********************************************************************/
192
194
199
201{
202 return m_converter->documentToImage(point);
203}
204
206{
207 return m_converter->imageToDocument(point);
208}
209
211{
212 return m_converter->imageToWidget(point);
213}
214
219
224
229
230/***********************************************************************/
231/* KisToolFreehandPaintingInformationBuilder */
232/***********************************************************************/
233
234#include "kis_tool_freehand.h"
235#include "kis_canvas2.h"
236
241
243{
244 return m_tool->convertToPixelCoord(point);
245}
246
248{
249 KisCanvas2 *canvas = dynamic_cast<KisCanvas2*>(m_tool->canvas());
250 KIS_ASSERT_RECOVER_RETURN_VALUE(canvas, point);
251 return canvas->coordinatesConverter()->imageToDocument(point);
252}
253
255{
256 return m_tool->pixelToView(point);
257}
258
259QPointF KisToolFreehandPaintingInformationBuilder::adjustDocumentPoint(const QPointF &point, const QPointF &startPoint)
260{
261 return m_tool->adjustPosition(point, startPoint);
262}
263
265{
266 return m_tool->calculatePerspective(documentPoint);
267}
268
270{
271 KisCanvas2 *canvas = dynamic_cast<KisCanvas2*>(m_tool->canvas());
273 return canvas->coordinatesConverter()->rotationAngle();
274}
275
277{
278 KisCanvas2 *canvas = dynamic_cast<KisCanvas2*>(m_tool->canvas());
279 KIS_ASSERT_RECOVER_RETURN_VALUE(canvas, false);
280 return canvas->coordinatesConverter()->xAxisMirrored();
281}
282
284{
285 KisCanvas2 *canvas = dynamic_cast<KisCanvas2*>(m_tool->canvas());
286 KIS_ASSERT_RECOVER_RETURN_VALUE(canvas, false);
287 return canvas->coordinatesConverter()->yAxisMirrored();
288}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisCoordinatesConverter * coordinatesConverter
static KisConfigNotifier * instance()
QString pressureTabletCurve(bool defaultValue=false) const
T readEntry(const QString &name, const T &defaultValue=T())
Definition kis_config.h:789
QPointF imageToDocument(const QPointF &point) override
QPointF imageToView(const QPointF &point) override
QPointF documentToImage(const QPointF &point) override
KisConverterPaintingInformationBuilder(const KisCoordinatesConverter *converter)
_Private::Traits< T >::Result imageToWidget(const T &obj) const
_Private::Traits< T >::Result documentToImage(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const
void setTiltDirectionOffset(qreal angle)
void setCanvasMirroredV(bool value)
void setCanvasMirroredH(bool value)
static KisPaintInformation createHoveringModeInfo(const QPointF &pos, qreal pressure=PRESSURE_DEFAULT, qreal xTilt=0.0, qreal yTilt=0.0, qreal rotation=0.0, qreal tangentialPressure=0.0, qreal perspective=1.0, qreal speed=0.0, qreal canvasrotation=0.0, bool canvasMirroredH=false, bool canvasMirroredV=false, qreal tiltDirectionOffset=0.0)
void setCanvasRotation(qreal rotation)
KisPaintInformation continueStroke(KoPointerEvent *event, int timeElapsed)
virtual qreal calculatePerspective(const QPointF &documentPoint)
QScopedPointer< KisSpeedSmoother > m_speedSmoother
virtual QPointF imageToDocument(const QPointF &point)
KisPaintInformation createPaintingInformation(KoPointerEvent *event, int timeElapsed)
virtual QPointF imageToView(const QPointF &point)
virtual QPointF adjustDocumentPoint(const QPointF &point, const QPointF &startPoint)
virtual QPointF documentToImage(const QPointF &point)
KisPaintInformation startStroke(KoPointerEvent *event, int timeElapsed, const KoCanvasResourceProvider *manager)
KisPaintInformation hover(const QPointF &imagePoint, const KoPointerEvent *event, bool isStrokeStarted)
qreal calculatePerspective(const QPointF &documentPoint) override
QPointF adjustDocumentPoint(const QPointF &point, const QPointF &startPoint) override
qreal calculatePerspective(const QPointF &documentPoint)
QPointF adjustPosition(const QPointF &point, const QPointF &strokeBegin)
qreal pressure() const
qreal rotation() const
return the rotation (or a default value)
ulong time() const
qreal yTilt() const
qreal tangentialPressure() const
QPointF point
The point in document coordinates.
qreal xTilt() const
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
const double PRESSURE_DEFAULT
Definition kis_global.h:99
const QVector< qreal > floatTransfer(int size=256) const
static qreal interpolateLinear(qreal normalizedValue, const QVector< qreal > &transfer)
QPointF convertToPixelCoord(KoPointerEvent *e)
Definition kis_tool.cc:189
QPointF pixelToView(const QPoint &pixelCoord) const
Definition kis_tool.cc:269
KisCanvas2 * canvas