Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_transform_utils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_TRANSFORM_UTILS_H
8#define __KIS_TRANSFORM_UTILS_H
9
10#include <QtGlobal>
11
13
14#include <QTransform>
15#include <QMatrix4x4>
17#include <limits>
18
19// for kisSquareDistance only
20#include "kis_global.h"
21
22#include "tool_transform_args.h"
23
30
32{
33public:
34
36 static const int handleVisualRadius;
37 static const int handleRadius;
38 static const int rotationHandleRadius;
39
40 template <class T>
41 static T flakeToImage(const KisCoordinatesConverter *converter, T object) {
42 return converter->documentToImage(converter->flakeToDocument(object));
43 }
44
45 template <class T>
46 static T imageToFlake(const KisCoordinatesConverter *converter, T object) {
47 return converter->documentToFlake(converter->imageToDocument(object));
48 }
49
50 static QTransform imageToFlakeTransform(const KisCoordinatesConverter *converter);
51 static qreal effectiveHandleGrabRadius(const KisCoordinatesConverter *converter);
52
54
55 static qreal scaleFromAffineMatrix(const QTransform &t);
56 static qreal scaleFromPerspectiveMatrixX(const QTransform &t, const QPointF &basePt);
57 static qreal scaleFromPerspectiveMatrixY(const QTransform &t, const QPointF &basePt);
58 static qreal effectiveSize(const QRectF &rc);
59 static bool thumbnailTooSmall(const QTransform &resultThumbTransform, const QRect &originalImageRect);
60
61 static QRectF handleRect(qreal radius, const QTransform &t, const QRectF &limitingRect, qreal *dOutX, qreal *dOutY);
62 static QRectF handleRect(qreal radius, const QTransform &t, const QRectF &limitingRect, const QPointF &basePoint);
63
64 static QPointF clipInRect(QPointF p, QRectF r);
65
67 {
69
70 QTransform TS;
71 QTransform SC;
72 QTransform S;
73 QMatrix4x4 P;
74 QTransform projectedP;
75 QTransform T;
76
77 QTransform BRI;
78
79 // the final transformation looks like
80 // transform = TS * BRI * SC * S * projectedP * T
81 QTransform finalTransform() const;
82 };
83
84 static bool checkImageTooBig(const QRectF &bounds, const MatricesPack &m, qreal cameraHeight);
85
87 KisPaintDeviceSP device,
88 KoUpdaterPtr updater);
89
90 static void transformDevice(const ToolTransformArgs &config,
91 KisPaintDeviceSP device,
93
94 static void transformDevice(const ToolTransformArgs &config,
95 KisPaintDeviceSP srcDevice,
96 KisPaintDeviceSP dstDevice,
98
99 static void transformDeviceWithCroppedDst(const ToolTransformArgs &config,
100 KisPaintDeviceSP srcDevice,
101 KisPaintDeviceSP dstDevice,
103 bool forceSubPixelTranslation);
104
105 static QRect needRect(const ToolTransformArgs &config,
106 const QRect &rc,
107 const QRect &srcBounds);
108
109 static QRect changeRect(const ToolTransformArgs &config,
110 const QRect &rc);
111
112 template<typename Function>
114 public:
115 HandleChooser(const QPointF &cursorPos, Function defaultFunction)
116 : m_cursorPos(cursorPos),
117 m_minDistance(std::numeric_limits<qreal>::max()),
118 m_function(defaultFunction)
119 {
120 }
121
122 bool addFunction(const QPointF &pt, qreal radius, Function function) {
123 bool result = false;
125
126 if (distance < pow2(radius) && distance < m_minDistance) {
129 result = true;
130 }
131
132 return result;
133 }
134
135 Function function() const {
136 return m_function;
137 }
138
139 private:
140 QPointF m_cursorPos;
142 Function m_function;
143 };
144
151 AnchorHolder(bool enabled, ToolTransformArgs *config);
153
154 private:
159
160 };
161
162 static void setDefaultWarpPoints(int pointsPerLine,
163 const TransformTransactionProperties *transaction,
164 ToolTransformArgs *config);
165
167 const QString &filterId,
168 const TransformTransactionProperties &transaction, KisPaintDeviceSP externalSource);
169
172 KisNodeList processedNodes);
173
174 static void transformAndMergeDevice(const ToolTransformArgs &config,
178
179 static void postProcessToplevelCommand(KUndo2Command *command,
180 const ToolTransformArgs &args,
181 KisNodeList rootNodes,
182 KisNodeList processedNodes, int currentTime,
183 const KisSavedMacroCommand *overriddenCommand);
184
185 static bool fetchArgsFromCommand(const KUndo2Command *command,
186 ToolTransformArgs *args,
187 KisNodeList *rootNodes,
188 KisNodeList *transformedNodes, int *oldTime);
189
191
192 static int fetchCurrentImageTime(KisNodeList rootNodes);
193 static QList<KisNodeSP> fetchNodesList(ToolTransformArgs::TransformMode mode, KisNodeList rootNodes, bool isExternalSourcePresent, KisSelectionSP selection);
194 static bool tryInitArgsFromNode(KisNodeList rootNodes, ToolTransformArgs *args);
195 static bool tryFetchArgsFromCommandAndUndo(ToolTransformArgs *outArgs, ToolTransformArgs::TransformMode mode, KisNodeList currentNodes, KisNodeList selectedNodes, KisStrokeUndoFacade *undoFacade, int currentTime, QVector<KisStrokeJobData *> *undoJobs, const KisSavedMacroCommand **overriddenCommand);
196
197};
198
199#endif /* __KIS_TRANSFORM_UTILS_H */
const Params2D p
qreal distance(const QPointF &p1, const QPointF &p2)
_Private::Traits< T >::Result documentToFlake(const T &obj) const
_Private::Traits< T >::Result flakeToDocument(const T &obj) const
_Private::Traits< T >::Result documentToImage(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const
HandleChooser(const QPointF &cursorPos, Function defaultFunction)
bool addFunction(const QPointF &pt, qreal radius, Function function)
static qreal effectiveHandleGrabRadius(const KisCoordinatesConverter *converter)
static void transformDevice(const ToolTransformArgs &config, KisPaintDeviceSP device, KisProcessingVisitor::ProgressHelper *helper)
static T flakeToImage(const KisCoordinatesConverter *converter, T object)
static qreal scaleFromPerspectiveMatrixY(const QTransform &t, const QPointF &basePt)
static QRect needRect(const ToolTransformArgs &config, const QRect &rc, const QRect &srcBounds)
static KisTransformWorker createTransformWorker(const ToolTransformArgs &config, KisPaintDeviceSP device, KoUpdaterPtr updater)
static qreal scaleFromPerspectiveMatrixX(const QTransform &t, const QPointF &basePt)
static qreal effectiveSize(const QRectF &rc)
static ToolTransformArgs resetArgsForMode(ToolTransformArgs::TransformMode mode, const QString &filterId, const TransformTransactionProperties &transaction, KisPaintDeviceSP externalSource)
static qreal effectiveRotationHandleGrabRadius(const KisCoordinatesConverter *converter)
static T imageToFlake(const KisCoordinatesConverter *converter, T object)
static const int handleRadius
static const int rotationHandleRadius
static void setDefaultWarpPoints(int pointsPerLine, const TransformTransactionProperties *transaction, ToolTransformArgs *config)
static QRect changeRect(const ToolTransformArgs &config, const QRect &rc)
static qreal scaleFromAffineMatrix(const QTransform &t)
static QPointF clipInRect(QPointF p, QRectF r)
static int fetchCurrentImageTime(KisNodeList rootNodes)
static void postProcessToplevelCommand(KUndo2Command *command, const ToolTransformArgs &args, KisNodeList rootNodes, KisNodeList processedNodes, int currentTime, const KisSavedMacroCommand *overriddenCommand)
static QTransform imageToFlakeTransform(const KisCoordinatesConverter *converter)
static QList< KisNodeSP > fetchNodesList(ToolTransformArgs::TransformMode mode, KisNodeList rootNodes, bool isExternalSourcePresent, KisSelectionSP selection)
static KisNodeSP tryOverrideRootToTransformMask(KisNodeSP root)
static void transformAndMergeDevice(const ToolTransformArgs &config, KisPaintDeviceSP src, KisPaintDeviceSP dst, KisProcessingVisitor::ProgressHelper *helper)
static const int handleVisualRadius
static bool shouldRestartStrokeOnModeChange(ToolTransformArgs::TransformMode oldMode, ToolTransformArgs::TransformMode newMode, KisNodeList processedNodes)
static bool fetchArgsFromCommand(const KUndo2Command *command, ToolTransformArgs *args, KisNodeList *rootNodes, KisNodeList *transformedNodes, int *oldTime)
static QRectF handleRect(qreal radius, const QTransform &t, const QRectF &limitingRect, qreal *dOutX, qreal *dOutY)
static bool thumbnailTooSmall(const QTransform &resultThumbTransform, const QRect &originalImageRect)
static bool tryInitArgsFromNode(KisNodeList rootNodes, ToolTransformArgs *args)
static bool checkImageTooBig(const QRectF &bounds, const MatricesPack &m, qreal cameraHeight)
static const int rotationHandleVisualRadius
static void transformDeviceWithCroppedDst(const ToolTransformArgs &config, KisPaintDeviceSP srcDevice, KisPaintDeviceSP dstDevice, KisProcessingVisitor::ProgressHelper *helper, bool forceSubPixelTranslation)
static bool tryFetchArgsFromCommandAndUndo(ToolTransformArgs *outArgs, ToolTransformArgs::TransformMode mode, KisNodeList currentNodes, KisNodeList selectedNodes, KisStrokeUndoFacade *undoFacade, int currentTime, QVector< KisStrokeJobData * > *undoJobs, const KisSavedMacroCommand **overriddenCommand)
#define bounds(x, a, b)
T pow2(const T &x)
Definition kis_global.h:166
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:194
AnchorHolder(bool enabled, ToolTransformArgs *config)
MatricesPack(const ToolTransformArgs &args)