Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_tool_multihand_helper.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 <QTransform>
10
11#include "kis_painter.h"
13#include "kis_algebra_2d.h"
14
19
21 KoCanvasResourceProvider *resourceManager,
22 const KUndo2MagicString &transactionText)
23 : KisToolFreehandHelper(infoBuilder, resourceManager, transactionText)
24 , d(new Private)
25{
26}
27
32
34{
35 d->transformations = transformations;
36}
37
39 const KisDistanceInformation &startDist)
40{
41 for (int i = 0; i < d->transformations.size(); i++) {
42 const QTransform &transform = d->transformations[i];
43 KisDistanceInitInfo __startDistInfo(transform.map(startDist.lastPosition()),
44 startDist.lastDrawingAngle(),
45 startDist.getSpacingInterval(),
46 startDist.getTimingUpdateInterval(),
47 0);
48
49 KisDistanceInformation __startDist = __startDistInfo.makeDistInfo();
50 strokeInfos << new KisFreehandStrokeInfo(__startDist);
51 }
52}
53
55{
57
58 qreal rotation = d.angle;
59 const bool mirrorX = KisAlgebra2D::signPZ(d.scaleX) < 0;
60 const bool mirrorY = KisAlgebra2D::signPZ(d.scaleY) < 0;
61
62 pi.setCanvasMirroredH(pi.canvasMirroredH() ^ mirrorX);
63 pi.setCanvasMirroredV(pi.canvasMirroredV() ^ mirrorY);
64
65 if (pi.canvasMirroredH()!= pi.canvasMirroredV()) {
66 rotation = normalizeAngleDegrees(360.0 - rotation);
67 }
68
70}
71
72
74{
75 for (int i = 0; i < d->transformations.size(); i++) {
76 const QTransform &transform = d->transformations[i];
77 KisPaintInformation __pi = pi;
78 __pi.setPos(transform.map(__pi.pos()));
79 adjustPointInformationRotation(__pi, transform);
80 paintAt(i, __pi);
81 }
82}
83
85 const KisPaintInformation &pi2)
86{
87 for (int i = 0; i < d->transformations.size(); i++) {
88 const QTransform &transform = d->transformations[i];
89
90 KisPaintInformation __pi1 = pi1;
91 KisPaintInformation __pi2 = pi2;
92 __pi1.setPos(transform.map(__pi1.pos()));
93 __pi2.setPos(transform.map(__pi2.pos()));
94
95 adjustPointInformationRotation(__pi1, transform);
96 adjustPointInformationRotation(__pi2, transform);
97
98 paintLine(i, __pi1, __pi2);
99 }
100}
101
103 const QPointF &control1,
104 const QPointF &control2,
105 const KisPaintInformation &pi2)
106{
107 for (int i = 0; i < d->transformations.size(); i++) {
108 const QTransform &transform = d->transformations[i];
109
110 KisPaintInformation __pi1 = pi1;
111 KisPaintInformation __pi2 = pi2;
112 __pi1.setPos(transform.map(__pi1.pos()));
113 __pi2.setPos(transform.map(__pi2.pos()));
114
115 adjustPointInformationRotation(__pi1, transform);
116 adjustPointInformationRotation(__pi2, transform);
117
118 QPointF __control1 = transform.map(control1);
119 QPointF __control2 = transform.map(control2);
120
121 paintBezierCurve(i, __pi1, __control1, __control2, __pi2);
122 }
123}
void setPos(const QPointF &p)
const QPointF & pos() const
void setCanvasMirroredV(bool value)
void setCanvasMirroredH(bool value)
void setCanvasRotation(qreal rotation)
void createPainters(QVector< KisFreehandStrokeInfo * > &strokeInfos, const KisDistanceInformation &startDist) override
void setupTransformations(const QVector< QTransform > &transformations)
void paintLine(const KisPaintInformation &pi1, const KisPaintInformation &pi2) override
void paintAt(const KisPaintInformation &pi) override
KisToolMultihandHelper(KisPaintingInformationBuilder *infoBuilder, KoCanvasResourceProvider *resourceManager, const KUndo2MagicString &transactionText)
void paintBezierCurve(const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2) override
std::enable_if< std::is_floating_point< T >::value, T >::type normalizeAngleDegrees(T a)
Definition kis_global.h:132
void adjustPointInformationRotation(KisPaintInformation &pi, const QTransform &t)
KisDistanceInformation makeDistInfo()