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

#include <kis_transform_utils.h>

Classes

struct  AnchorHolder
 
class  HandleChooser
 
struct  MatricesPack
 

Static Public Member Functions

static QRect changeRect (const ToolTransformArgs &config, const QRect &rc)
 
static bool checkImageTooBig (const QRectF &bounds, const MatricesPack &m, qreal cameraHeight)
 
static QPointF clipInRect (QPointF p, QRectF r)
 
static KisTransformWorker createTransformWorker (const ToolTransformArgs &config, KisPaintDeviceSP device, KoUpdaterPtr updater)
 
static qreal effectiveHandleGrabRadius (const KisCoordinatesConverter *converter)
 
static qreal effectiveRotationHandleGrabRadius (const KisCoordinatesConverter *converter)
 
static qreal effectiveSize (const QRectF &rc)
 
static bool fetchArgsFromCommand (const KUndo2Command *command, ToolTransformArgs *args, KisNodeList *rootNodes, KisNodeList *transformedNodes, int *oldTime)
 
static int fetchCurrentImageTime (KisNodeList rootNodes)
 
static QList< KisNodeSPfetchNodesList (ToolTransformArgs::TransformMode mode, KisNodeList rootNodes, bool isExternalSourcePresent, KisSelectionSP selection)
 
template<class T >
static T flakeToImage (const KisCoordinatesConverter *converter, T object)
 
static QRectF handleRect (qreal radius, const QTransform &t, const QRectF &limitingRect, const QPointF &basePoint)
 
static QRectF handleRect (qreal radius, const QTransform &t, const QRectF &limitingRect, qreal *dOutX, qreal *dOutY)
 
template<class T >
static T imageToFlake (const KisCoordinatesConverter *converter, T object)
 
static QTransform imageToFlakeTransform (const KisCoordinatesConverter *converter)
 
static QRect needRect (const ToolTransformArgs &config, const QRect &rc, const QRect &srcBounds)
 
static void postProcessToplevelCommand (KUndo2Command *command, const ToolTransformArgs &args, KisNodeList rootNodes, KisNodeList processedNodes, int currentTime, const KisSavedMacroCommand *overriddenCommand)
 
static ToolTransformArgs resetArgsForMode (ToolTransformArgs::TransformMode mode, const QString &filterId, const TransformTransactionProperties &transaction, KisPaintDeviceSP externalSource)
 
static qreal scaleFromAffineMatrix (const QTransform &t)
 
static qreal scaleFromPerspectiveMatrixX (const QTransform &t, const QPointF &basePt)
 
static qreal scaleFromPerspectiveMatrixY (const QTransform &t, const QPointF &basePt)
 
static void setDefaultWarpPoints (int pointsPerLine, const TransformTransactionProperties *transaction, ToolTransformArgs *config)
 
static bool shouldRestartStrokeOnModeChange (ToolTransformArgs::TransformMode oldMode, ToolTransformArgs::TransformMode newMode, KisNodeList processedNodes)
 
static bool thumbnailTooSmall (const QTransform &resultThumbTransform, const QRect &originalImageRect)
 
static void transformAndMergeDevice (const ToolTransformArgs &config, KisPaintDeviceSP src, KisPaintDeviceSP dst, KisProcessingVisitor::ProgressHelper *helper)
 
static void transformDevice (const ToolTransformArgs &config, KisPaintDeviceSP device, KisProcessingVisitor::ProgressHelper *helper)
 
static void transformDevice (const ToolTransformArgs &config, KisPaintDeviceSP srcDevice, KisPaintDeviceSP dstDevice, KisProcessingVisitor::ProgressHelper *helper)
 
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)
 
static bool tryInitArgsFromNode (KisNodeList rootNodes, ToolTransformArgs *args)
 
static KisNodeSP tryOverrideRootToTransformMask (KisNodeSP root)
 

Static Public Attributes

static const int handleRadius = 8
 
static const int handleVisualRadius = 12
 
static const int rotationHandleRadius = 8
 
static const int rotationHandleVisualRadius = 12
 

Detailed Description

Definition at line 31 of file kis_transform_utils.h.

Member Function Documentation

◆ changeRect()

QRect KisTransformUtils::changeRect ( const ToolTransformArgs & config,
const QRect & rc )
static

Definition at line 418 of file kis_transform_utils.cpp.

420{
421 QRect result = rc;
422
423 if (config.mode() == ToolTransformArgs::WARP) {
424 KisWarpTransformWorker worker(config.warpType(),
425 config.origPoints(),
426 config.transfPoints(),
427 config.alpha(),
428 0);
429
430 result = worker.approxChangeRect(rc);
431
432 } else if (config.mode() == ToolTransformArgs::CAGE) {
433 KisCageTransformWorker worker(rc,
434 config.origPoints(),
435 0,
436 config.pixelPrecision());
437
438 worker.setTransformedCage(config.transfPoints());
439 result = worker.approxChangeRect(rc);
440 } else if (config.mode() == ToolTransformArgs::LIQUIFY) {
441 result = config.liquifyWorker() ?
442 config.liquifyWorker()->approxChangeRect(rc) : rc;
443 } else if (config.mode() == ToolTransformArgs::MESH) {
444 result = config.meshTransform()->approxChangeRect(rc);
445
446 } else {
447 KIS_ASSERT_RECOVER_NOOP(0 && "this works for non-affine transformations only!");
448 }
449
450 return result;
451}
const QVector< QPointF > & origPoints() const
KisLiquifyTransformWorker * liquifyWorker() const
KisWarpTransformWorker::WarpType warpType() const
const QVector< QPointF > & transfPoints() const
const KisBezierTransformMesh * meshTransform() const
TransformMode mode() const
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97

References ToolTransformArgs::alpha(), KisCageTransformWorker::approxChangeRect(), KisLiquifyTransformWorker::approxChangeRect(), KisWarpTransformWorker::approxChangeRect(), KisBezierTransformMeshDetail::KisBezierTransformMesh::approxChangeRect(), ToolTransformArgs::CAGE, KIS_ASSERT_RECOVER_NOOP, ToolTransformArgs::LIQUIFY, ToolTransformArgs::liquifyWorker(), ToolTransformArgs::MESH, ToolTransformArgs::meshTransform(), ToolTransformArgs::mode(), ToolTransformArgs::origPoints(), ToolTransformArgs::pixelPrecision(), KisCageTransformWorker::setTransformedCage(), ToolTransformArgs::transfPoints(), ToolTransformArgs::WARP, and ToolTransformArgs::warpType().

◆ checkImageTooBig()

bool KisTransformUtils::checkImageTooBig ( const QRectF & bounds,
const MatricesPack & m,
qreal cameraHeight )
static

Definition at line 191 of file kis_transform_utils.cpp.

192{
193 bool imageTooBig = false;
194
195 QMatrix4x4 unprojectedMatrix = QMatrix4x4(m.T) * m.P * QMatrix4x4(m.TS * m.SC * m.S);
196 QVector<QPointF> points;
197 points << bounds.topLeft();
198 points << bounds.topRight();
199 points << bounds.bottomRight();
200 points << bounds.bottomLeft();
201
202 Q_FOREACH (const QPointF &pt, points) {
203 QVector4D v(pt.x(), pt.y(), 0, 1);
204
205 v = unprojectedMatrix * v;
206 qreal z = v.z() / v.w();
207
208 imageTooBig = z > 1.5 * cameraHeight;
209
210 if (imageTooBig) {
211 break;
212 }
213 }
214
215 return imageTooBig;
216}
qreal v
#define bounds(x, a, b)

References bounds, KisTransformUtils::MatricesPack::P, KisTransformUtils::MatricesPack::S, KisTransformUtils::MatricesPack::SC, KisTransformUtils::MatricesPack::T, KisTransformUtils::MatricesPack::TS, and v.

◆ clipInRect()

QPointF KisTransformUtils::clipInRect ( QPointF p,
QRectF r )
static

Definition at line 112 of file kis_transform_utils.cpp.

113{
114 QPointF center = r.center();
115 QPointF t = p - center;
116 r.translate(- center);
117
118 if (t.y() != 0) {
119 if (t.x() != 0) {
120 double slope = t.y() / t.x();
121
122 if (t.x() < r.left()) {
123 t.setY(r.left() * slope);
124 t.setX(r.left());
125 }
126 else if (t.x() > r.right()) {
127 t.setY(r.right() * slope);
128 t.setX(r.right());
129 }
130
131 if (t.y() < r.top()) {
132 t.setX(r.top() / slope);
133 t.setY(r.top());
134 }
135 else if (t.y() > r.bottom()) {
136 t.setX(r.bottom() / slope);
137 t.setY(r.bottom());
138 }
139 }
140 else {
141 if (t.y() < r.top())
142 t.setY(r.top());
143 else if (t.y() > r.bottom())
144 t.setY(r.bottom());
145 }
146 }
147 else {
148 if (t.x() < r.left())
149 t.setX(r.left());
150 else if (t.x() > r.right())
151 t.setX(r.right());
152 }
153
154 t += center;
155
156 return t;
157}
const Params2D p

References p.

◆ createTransformWorker()

KisTransformWorker KisTransformUtils::createTransformWorker ( const ToolTransformArgs & config,
KisPaintDeviceSP device,
KoUpdaterPtr updater )
static

Definition at line 218 of file kis_transform_utils.cpp.

221{
222 double scaleX = config.scaleX();
223 double scaleY = config.scaleY();
224 double shearX = config.shearX();
225 double shearY = config.shearY();
226 double aZ = config.aZ();
227
228 if (config.boundsRotation() != 0.0) {
229 const KisTransformUtils::MatricesPack m(config);
230 QTransform Z; Z.rotateRadians(aZ);
231 QTransform desired = m.BRI * m.SC * m.S * Z;
233 if (dm.isValid()) {
234 scaleX = dm.scaleX;
235 scaleY = dm.scaleY;
236 shearX = dm.shearXY;
237 shearY = 0;
238 aZ = kisDegreesToRadians(dm.angle);
239 }
240 }
241
242 QPointF transformedCenter;
243 {
245 scaleX, scaleY,
246 shearX, shearY,
247 aZ,
248 0, // set X and Y translation
249 0, // to null for calculation
250 0,
251 config.filter());
252
253 transformedCenter = t.transform().map(config.originalCenter());
254 }
255
256 QPointF translation = config.transformedCenter() - transformedCenter;
257
258 KisTransformWorker transformWorker(device,
259 scaleX, scaleY,
260 shearX, shearY,
261 normalizeAngle(aZ),
262 translation.x(),
263 translation.y(),
264 updater,
265 config.filter());
266
267 // MatricesPack m(config);
268 // ENTER_FUNCTION() << ppVar(m.finalTransform() - transformWorker.transform());
269
270 return transformWorker;
271}
QPointF transformedCenter() const
KisFilterStrategy * filter() const
QPointF originalCenter() const
double boundsRotation() const
T kisDegreesToRadians(T degrees)
Definition kis_global.h:176
std::enable_if< std::is_floating_point< T >::value, T >::type normalizeAngle(T a)
Definition kis_global.h:121

References KisAlgebra2D::DecomposedMatrix::angle, ToolTransformArgs::aZ(), ToolTransformArgs::boundsRotation(), KisTransformUtils::MatricesPack::BRI, ToolTransformArgs::filter(), KisAlgebra2D::DecomposedMatrix::isValid(), kisDegreesToRadians(), normalizeAngle(), ToolTransformArgs::originalCenter(), KisTransformUtils::MatricesPack::S, KisTransformUtils::MatricesPack::SC, KisAlgebra2D::DecomposedMatrix::scaleX, ToolTransformArgs::scaleX(), KisAlgebra2D::DecomposedMatrix::scaleY, ToolTransformArgs::scaleY(), ToolTransformArgs::shearX(), KisAlgebra2D::DecomposedMatrix::shearXY, ToolTransformArgs::shearY(), KisTransformWorker::transform(), and ToolTransformArgs::transformedCenter().

◆ effectiveHandleGrabRadius()

qreal KisTransformUtils::effectiveHandleGrabRadius ( const KisCoordinatesConverter * converter)
static

Definition at line 45 of file kis_transform_utils.cpp.

46{
47 QPointF handleRadiusPt = flakeToImage(converter, QPointF(handleRadius, handleRadius));
48 return (handleRadiusPt.x() > handleRadiusPt.y()) ? handleRadiusPt.x() : handleRadiusPt.y();
49}
static T flakeToImage(const KisCoordinatesConverter *converter, T object)
static const int handleRadius

References flakeToImage(), and handleRadius.

◆ effectiveRotationHandleGrabRadius()

qreal KisTransformUtils::effectiveRotationHandleGrabRadius ( const KisCoordinatesConverter * converter)
static

Definition at line 51 of file kis_transform_utils.cpp.

52{
53 QPointF handleRadiusPt = flakeToImage(converter, QPointF(rotationHandleRadius, rotationHandleRadius));
54 return (handleRadiusPt.x() > handleRadiusPt.y()) ? handleRadiusPt.x() : handleRadiusPt.y();
55}
static const int rotationHandleRadius

References flakeToImage(), and rotationHandleRadius.

◆ effectiveSize()

qreal KisTransformUtils::effectiveSize ( const QRectF & rc)
static

Definition at line 71 of file kis_transform_utils.cpp.

71 {
72 return 0.5 * (rc.width() + rc.height());
73}

◆ fetchArgsFromCommand()

bool KisTransformUtils::fetchArgsFromCommand ( const KUndo2Command * command,
ToolTransformArgs * args,
KisNodeList * rootNodes,
KisNodeList * transformedNodes,
int * oldTime )
static

Definition at line 625 of file kis_transform_utils.cpp.

626{
627 const TransformExtraData *data = dynamic_cast<const TransformExtraData*>(command->extraData());
628
629 if (data) {
630 *args = data->savedTransformArgs;
631 *rootNodes = data->rootNodes;
632 *transformedNodes = data->transformedNodes;
633 *oldTime = data->transformedTime;
634 }
635
636 return bool(data);
637}
KUndo2CommandExtraData * extraData() const
ToolTransformArgs savedTransformArgs

References KUndo2Command::extraData(), TransformExtraData::rootNodes, TransformExtraData::savedTransformArgs, TransformExtraData::transformedNodes, and TransformExtraData::transformedTime.

◆ fetchCurrentImageTime()

int KisTransformUtils::fetchCurrentImageTime ( KisNodeList rootNodes)
static

We cannot just use projection's default bounds, because masks don't have any projection

Definition at line 658 of file kis_transform_utils.cpp.

659{
660 Q_FOREACH(KisNodeSP node, rootNodes) {
665 if (node && node->image()) {
666 return node->image()->animationInterface()->currentTime();
667 }
668 }
669 return -1;
670}
KisImageAnimationInterface * animationInterface() const
KisImageWSP image

References KisImage::animationInterface(), KisImageAnimationInterface::currentTime(), and KisBaseNode::image.

◆ fetchNodesList()

QList< KisNodeSP > KisTransformUtils::fetchNodesList ( ToolTransformArgs::TransformMode mode,
KisNodeList rootNodes,
bool isExternalSourcePresent,
KisSelectionSP selection )
static

Cannot transform nodes with visible transform masks inside, this situation should have been caught either in tryOverrideRootToTransformMask or in the transform tool stroke initialization routine.

Definition at line 672 of file kis_transform_utils.cpp.

673{
674 QList<KisNodeSP> result;
675
676 Q_FOREACH (KisNodeSP root, rootNodes) {
677 bool hasTransformMaskDescendant =
678 KisLayerUtils::recursiveFindNode(root, [root] (KisNodeSP node) {
679 return node != root && node->visible() && node->inherits("KisTransformMask");
680 });
681
686 KIS_SAFE_ASSERT_RECOVER_NOOP(!hasTransformMaskDescendant);
687
688 KisNodeSP selectionNode = selection ? selection->parentNode() : 0;
689
690 auto fetchFunc =
691 [&result, mode, root, selectionNode] (KisNodeSP node) {
692 if (node->isEditable(node == root) &&
693 (!node->inherits("KisShapeLayer") || mode == ToolTransformArgs::FREE_TRANSFORM) &&
694 !node->inherits("KisFileLayer") &&
695 !node->inherits("KisColorizeMask") &&
696 (!node->inherits("KisTransformMask") || node == root) &&
697 (!selectionNode || node != selectionNode)) {
698
699 result << node;
700 }
701 };
702
703 if (isExternalSourcePresent) {
704 fetchFunc(root);
705 } else {
706 KisLayerUtils::recursiveApplyNodes(root, fetchFunc);
707 }
708 }
709
711 return result;
712}
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
KisNodeSP recursiveFindNode(KisNodeSP node, std::function< bool(KisNodeSP)> func)
void recursiveApplyNodes(NodePointer node, Functor func)
KisNodeList sortMergeableInternalNodes(KisNodeList nodes)
bool isEditable(bool checkVisibility=true) const
virtual bool visible(bool recursive=false) const
KisNodeWSP parentNode

References ToolTransformArgs::FREE_TRANSFORM, KisBaseNode::isEditable(), KIS_SAFE_ASSERT_RECOVER_NOOP, KisSelection::parentNode, KisLayerUtils::recursiveApplyNodes(), KisLayerUtils::recursiveFindNode(), KisLayerUtils::sortMergeableInternalNodes(), and KisBaseNode::visible().

◆ flakeToImage()

template<class T >
static T KisTransformUtils::flakeToImage ( const KisCoordinatesConverter * converter,
T object )
inlinestatic

Definition at line 41 of file kis_transform_utils.h.

41 {
42 return converter->documentToImage(converter->flakeToDocument(object));
43 }
_Private::Traits< T >::Result flakeToDocument(const T &obj) const
_Private::Traits< T >::Result documentToImage(const T &obj) const

References KisCoordinatesConverter::documentToImage(), and KisCoordinatesConverter::flakeToDocument().

◆ handleRect() [1/2]

QRectF KisTransformUtils::handleRect ( qreal radius,
const QTransform & t,
const QRectF & limitingRect,
const QPointF & basePoint )
static

Definition at line 108 of file kis_transform_utils.cpp.

108 {
109 return handleRectImpl(radius, t, limitingRect, basePoint, 0, 0);
110}
QRectF handleRectImpl(qreal radius, const QTransform &t, const QRectF &limitingRect, const QPointF &basePoint, qreal *dOutX, qreal *dOutY)

References handleRectImpl().

◆ handleRect() [2/2]

QRectF KisTransformUtils::handleRect ( qreal radius,
const QTransform & t,
const QRectF & limitingRect,
qreal * dOutX,
qreal * dOutY )
static

Definition at line 104 of file kis_transform_utils.cpp.

104 {
105 return handleRectImpl(radius, t, limitingRect, limitingRect.center(), dOutX, dOutY);
106}

References handleRectImpl().

◆ imageToFlake()

template<class T >
static T KisTransformUtils::imageToFlake ( const KisCoordinatesConverter * converter,
T object )
inlinestatic

Definition at line 46 of file kis_transform_utils.h.

46 {
47 return converter->documentToFlake(converter->imageToDocument(object));
48 }
_Private::Traits< T >::Result documentToFlake(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const

References KisCoordinatesConverter::documentToFlake(), and KisCoordinatesConverter::imageToDocument().

◆ imageToFlakeTransform()

QTransform KisTransformUtils::imageToFlakeTransform ( const KisCoordinatesConverter * converter)
static

◆ needRect()

QRect KisTransformUtils::needRect ( const ToolTransformArgs & config,
const QRect & rc,
const QRect & srcBounds )
static

Definition at line 384 of file kis_transform_utils.cpp.

387{
388 QRect result = rc;
389
390 if (config.mode() == ToolTransformArgs::WARP) {
391 KisWarpTransformWorker worker(config.warpType(),
392 config.origPoints(),
393 config.transfPoints(),
394 config.alpha(),
395 0);
396
397 result = worker.approxNeedRect(rc, srcBounds);
398
399 } else if (config.mode() == ToolTransformArgs::CAGE) {
400 KisCageTransformWorker worker(srcBounds,
401 config.origPoints(),
402 0,
403 config.pixelPrecision());
404 worker.setTransformedCage(config.transfPoints());
405 result = worker.approxNeedRect(rc, srcBounds);
406 } else if (config.mode() == ToolTransformArgs::LIQUIFY) {
407 result = config.liquifyWorker() ?
408 config.liquifyWorker()->approxNeedRect(rc, srcBounds) : rc;
409 } else if (config.mode() == ToolTransformArgs::MESH) {
410 result = config.meshTransform()->approxNeedRect(rc);
411 } else {
412 KIS_ASSERT_RECOVER_NOOP(0 && "this works for non-affine transformations only!");
413 }
414
415 return result;
416}
QRect approxNeedRect(const QRect &rc, const QRect &fullBounds)

References ToolTransformArgs::alpha(), KisBezierTransformMeshDetail::KisBezierTransformMesh::approxNeedRect(), KisCageTransformWorker::approxNeedRect(), KisLiquifyTransformWorker::approxNeedRect(), KisWarpTransformWorker::approxNeedRect(), ToolTransformArgs::CAGE, KIS_ASSERT_RECOVER_NOOP, ToolTransformArgs::LIQUIFY, ToolTransformArgs::liquifyWorker(), ToolTransformArgs::MESH, ToolTransformArgs::meshTransform(), ToolTransformArgs::mode(), ToolTransformArgs::origPoints(), ToolTransformArgs::pixelPrecision(), KisCageTransformWorker::setTransformedCage(), ToolTransformArgs::transfPoints(), ToolTransformArgs::WARP, and ToolTransformArgs::warpType().

◆ postProcessToplevelCommand()

void KisTransformUtils::postProcessToplevelCommand ( KUndo2Command * command,
const ToolTransformArgs & args,
KisNodeList rootNodes,
KisNodeList processedNodes,
int currentTime,
const KisSavedMacroCommand * overriddenCommand )
static

Definition at line 607 of file kis_transform_utils.cpp.

608{
610 data->savedTransformArgs = args;
611 data->rootNodes = rootNodes;
612 data->transformedNodes = processedNodes;
613 data->transformedTime = currentTime;
614
615 command->setExtraData(data);
616
617 KisSavedMacroCommand *macroCommand = dynamic_cast<KisSavedMacroCommand*>(command);
618 KIS_SAFE_ASSERT_RECOVER_NOOP(macroCommand);
619
620 if (overriddenCommand && macroCommand) {
621 macroCommand->setOverrideInfo(overriddenCommand, {});
622 }
623}
void setExtraData(KUndo2CommandExtraData *data)
void setOverrideInfo(const KisSavedMacroCommand *overriddenCommand, const QVector< const KUndo2Command * > &skipWhileOverride)

References KIS_SAFE_ASSERT_RECOVER_NOOP, TransformExtraData::rootNodes, TransformExtraData::savedTransformArgs, KUndo2Command::setExtraData(), KisSavedMacroCommand::setOverrideInfo(), TransformExtraData::transformedNodes, and TransformExtraData::transformedTime.

◆ resetArgsForMode()

ToolTransformArgs KisTransformUtils::resetArgsForMode ( ToolTransformArgs::TransformMode mode,
const QString & filterId,
const TransformTransactionProperties & transaction,
KisPaintDeviceSP externalSource )
static

Definition at line 515 of file kis_transform_utils.cpp.

519{
521
522 args.setOriginalCenter(transaction.originalCenterGeometric());
524 args.setFilterId(filterId);
525 args.setExternalSource(externalSource);
526
529 } else if (mode == ToolTransformArgs::WARP) {
531 KisTransformUtils::setDefaultWarpPoints(-1, &transaction, &args);
532 args.setEditingTransformPoints(false);
533 } else if (mode == ToolTransformArgs::CAGE) {
535 args.setEditingTransformPoints(true);
536 } else if (mode == ToolTransformArgs::LIQUIFY) {
538 const QRect srcRect = transaction.originalRect().toAlignedRect();
539 if (!srcRect.isEmpty()) {
540 args.initLiquifyTransformMode(srcRect);
541 }
542 } else if (mode == ToolTransformArgs::MESH) {
544 const QRect srcRect = transaction.originalRect().toAlignedRect();
545 if (!srcRect.isEmpty()) {
546 *args.meshTransform() = KisBezierTransformMesh(QRectF(srcRect));
547 }
548 } else if (mode == ToolTransformArgs::PERSPECTIVE_4POINT) {
550 }
551
552 return args;
553}
KisBezierTransformMeshDetail::KisBezierTransformMesh KisBezierTransformMesh
static void setDefaultWarpPoints(int pointsPerLine, const TransformTransactionProperties *transaction, ToolTransformArgs *config)
void setFilterId(const QString &id)
void initLiquifyTransformMode(const QRect &srcRect)
void setTransformedCenter(QPointF transformedCenter)
void setOriginalCenter(QPointF originalCenter)
void setEditingTransformPoints(bool value)
void setMode(TransformMode mode)
void setExternalSource(KisPaintDeviceSP externalSource)

References ToolTransformArgs::CAGE, ToolTransformArgs::FREE_TRANSFORM, ToolTransformArgs::initLiquifyTransformMode(), ToolTransformArgs::LIQUIFY, ToolTransformArgs::MESH, ToolTransformArgs::meshTransform(), TransformTransactionProperties::originalCenterGeometric(), TransformTransactionProperties::originalRect(), ToolTransformArgs::PERSPECTIVE_4POINT, setDefaultWarpPoints(), ToolTransformArgs::setEditingTransformPoints(), ToolTransformArgs::setExternalSource(), ToolTransformArgs::setFilterId(), ToolTransformArgs::setMode(), ToolTransformArgs::setOriginalCenter(), ToolTransformArgs::setTransformedCenter(), and ToolTransformArgs::WARP.

◆ scaleFromAffineMatrix()

qreal KisTransformUtils::scaleFromAffineMatrix ( const QTransform & t)
static

Definition at line 57 of file kis_transform_utils.cpp.

57 {
59}
static qreal approxTransformScale(const QTransform &t)
Definition KoUnit.cpp:387

References KoUnit::approxTransformScale().

◆ scaleFromPerspectiveMatrixX()

qreal KisTransformUtils::scaleFromPerspectiveMatrixX ( const QTransform & t,
const QPointF & basePt )
static

Definition at line 61 of file kis_transform_utils.cpp.

61 {
62 const QPointF pt = basePt + QPointF(1.0, 0);
63 return kisDistance(t.map(pt), t.map(basePt));
64}
qreal kisDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:190

References kisDistance().

◆ scaleFromPerspectiveMatrixY()

qreal KisTransformUtils::scaleFromPerspectiveMatrixY ( const QTransform & t,
const QPointF & basePt )
static

Definition at line 66 of file kis_transform_utils.cpp.

66 {
67 const QPointF pt = basePt + QPointF(0, 1.0);
68 return kisDistance(t.map(pt), t.map(basePt));
69}

References kisDistance().

◆ setDefaultWarpPoints()

void KisTransformUtils::setDefaultWarpPoints ( int pointsPerLine,
const TransformTransactionProperties * transaction,
ToolTransformArgs * config )
static

Definition at line 476 of file kis_transform_utils.cpp.

479{
480 static const int DEFAULT_POINTS_PER_LINE = 3;
481
482 if (pointsPerLine < 0) {
483 pointsPerLine = DEFAULT_POINTS_PER_LINE;
484 }
485
486 int nbPoints = pointsPerLine * pointsPerLine;
487 QVector<QPointF> origPoints(nbPoints);
488 QVector<QPointF> transfPoints(nbPoints);
489 qreal gridSpaceX, gridSpaceY;
490
491 if (nbPoints == 1) {
492 //there is actually no grid
493 origPoints[0] = transaction->originalCenterGeometric();
494 transfPoints[0] = transaction->originalCenterGeometric();
495 }
496 else if (nbPoints > 1) {
497 gridSpaceX = transaction->originalRect().width() / (pointsPerLine - 1);
498 gridSpaceY = transaction->originalRect().height() / (pointsPerLine - 1);
499 double y = transaction->originalRect().top();
500 for (int i = 0; i < pointsPerLine; ++i) {
501 double x = transaction->originalRect().left();
502 for (int j = 0 ; j < pointsPerLine; ++j) {
503 origPoints[i * pointsPerLine + j] = QPointF(x, y);
504 transfPoints[i * pointsPerLine + j] = QPointF(x, y);
505 x += gridSpaceX;
506 }
507 y += gridSpaceY;
508 }
509 }
510
511 config->setDefaultPoints(nbPoints > 0);
512 config->setPoints(origPoints, transfPoints);
513}
void setPoints(QVector< QPointF > origPoints, QVector< QPointF > transfPoints)
void setDefaultPoints(bool defaultPoints)

References TransformTransactionProperties::originalCenterGeometric(), TransformTransactionProperties::originalRect(), ToolTransformArgs::setDefaultPoints(), and ToolTransformArgs::setPoints().

◆ shouldRestartStrokeOnModeChange()

bool KisTransformUtils::shouldRestartStrokeOnModeChange ( ToolTransformArgs::TransformMode oldMode,
ToolTransformArgs::TransformMode newMode,
KisNodeList processedNodes )
static

Definition at line 555 of file kis_transform_utils.cpp.

556{
557 bool hasExternalLayers = false;
558 Q_FOREACH (KisNodeSP node, processedNodes) {
559 if (node->inherits("KisShapeLayer")) {
560 hasExternalLayers = true;
561 break;
562 }
563 }
564
565 bool result = false;
566
567 if (hasExternalLayers) {
568 result =
571 }
572
573 return result;
574}

References ToolTransformArgs::FREE_TRANSFORM.

◆ thumbnailTooSmall()

bool KisTransformUtils::thumbnailTooSmall ( const QTransform & resultThumbTransform,
const QRect & originalImageRect )
static

Definition at line 75 of file kis_transform_utils.cpp.

76{
77 return KisAlgebra2D::minDimension(resultThumbTransform.mapRect(originalImageRect)) < 32;
78}
auto minDimension(Size size) -> decltype(size.width())

References KisAlgebra2D::minDimension().

◆ transformAndMergeDevice()

void KisTransformUtils::transformAndMergeDevice ( const ToolTransformArgs & config,
KisPaintDeviceSP src,
KisPaintDeviceSP dst,
KisProcessingVisitor::ProgressHelper * helper )
static

Definition at line 576 of file kis_transform_utils.cpp.

580{
581 KoUpdaterPtr mergeUpdater = helper->updater();
582
583 KisPaintDeviceSP tmp = new KisPaintDevice(src->colorSpace());
584 tmp->prepareClone(src);
585
586 KisTransformUtils::transformDevice(config, src, tmp, helper);
587
588 QRect mergeRect = tmp->extent();
589 KisPainter painter(dst);
590 painter.setProgress(mergeUpdater);
591 painter.bitBlt(mergeRect.topLeft(), tmp, mergeRect);
592 painter.end();
593}
static void transformDevice(const ToolTransformArgs &config, KisPaintDeviceSP device, KisProcessingVisitor::ProgressHelper *helper)

References KisPainter::bitBlt(), KisPainter::end(), KisPainter::setProgress(), transformDevice(), and KisProcessingVisitor::ProgressHelper::updater().

◆ transformDevice() [1/2]

void KisTransformUtils::transformDevice ( const ToolTransformArgs & config,
KisPaintDeviceSP device,
KisProcessingVisitor::ProgressHelper * helper )
static

Definition at line 273 of file kis_transform_utils.cpp.

276{
277 KisPaintDeviceSP tmp = new KisPaintDevice(*device);
278 transformDevice(config, tmp, device, helper);
279}

References transformDevice().

◆ transformDevice() [2/2]

void KisTransformUtils::transformDevice ( const ToolTransformArgs & config,
KisPaintDeviceSP srcDevice,
KisPaintDeviceSP dstDevice,
KisProcessingVisitor::ProgressHelper * helper )
static

Definition at line 371 of file kis_transform_utils.cpp.

375{
376 transformDeviceImpl(config, srcDevice, dstDevice, helper, false, false);
377}

◆ transformDeviceWithCroppedDst()

void KisTransformUtils::transformDeviceWithCroppedDst ( const ToolTransformArgs & config,
KisPaintDeviceSP srcDevice,
KisPaintDeviceSP dstDevice,
KisProcessingVisitor::ProgressHelper * helper,
bool forceSubPixelTranslation )
static

Definition at line 379 of file kis_transform_utils.cpp.

380{
381 transformDeviceImpl(config, srcDevice, dstDevice, helper, true, forceSubPixelTranslation);
382}

◆ tryFetchArgsFromCommandAndUndo()

bool KisTransformUtils::tryFetchArgsFromCommandAndUndo ( ToolTransformArgs * outArgs,
ToolTransformArgs::TransformMode mode,
KisNodeList currentNodes,
KisNodeList selectedNodes,
KisStrokeUndoFacade * undoFacade,
int currentTime,
QVector< KisStrokeJobData * > * undoJobs,
const KisSavedMacroCommand ** overriddenCommand )
static

Definition at line 738 of file kis_transform_utils.cpp.

746{
747 bool result = false;
748
749 const KUndo2Command *lastCommand = undoFacade->lastExecutedCommand();
750 KisNodeList oldRootNodes;
751 KisNodeList oldTransformedNodes;
752 int oldTime = -1;
753
755
756 if (lastCommand &&
757 KisTransformUtils::fetchArgsFromCommand(lastCommand, &args, &oldRootNodes, &oldTransformedNodes, &oldTime) &&
758 args.mode() == mode &&
759 oldRootNodes == currentNodes &&
760 oldTime == currentTime) {
761
762 if (KritaUtils::compareListsUnordered(oldTransformedNodes, selectedNodes)) {
763 args.saveContinuedState();
764
765 *outArgs = args;
766
767 const KisSavedMacroCommand *command = dynamic_cast<const KisSavedMacroCommand*>(lastCommand);
769
770 // the jobs are fetched as !shouldGoToHistory,
771 // so there is no need to put them into
772 // m_s->skippedWhileMergeCommands
773 command->getCommandExecutionJobs(undoJobs, true, false);
774 *overriddenCommand = command;
775
776 result = true;
777 }
778 }
779
780 return result;
781}
void getCommandExecutionJobs(QVector< KisStrokeJobData * > *jobs, bool undo, bool shouldGoToHistory=true) const
virtual const KUndo2Command * lastExecutedCommand() const =0
static bool fetchArgsFromCommand(const KUndo2Command *command, ToolTransformArgs *args, KisNodeList *rootNodes, KisNodeList *transformedNodes, int *oldTime)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
bool compareListsUnordered(const QList< T > &a, const QList< T > &b)

References KritaUtils::compareListsUnordered(), fetchArgsFromCommand(), KisSavedMacroCommand::getCommandExecutionJobs(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, KisStrokeUndoFacade::lastExecutedCommand(), ToolTransformArgs::mode(), and ToolTransformArgs::saveContinuedState().

◆ tryInitArgsFromNode()

bool KisTransformUtils::tryInitArgsFromNode ( KisNodeList rootNodes,
ToolTransformArgs * args )
static

Definition at line 714 of file kis_transform_utils.cpp.

715{
716 bool result = false;
717
718 Q_FOREACH(KisNodeSP node, rootNodes) {
719 if (KisTransformMaskSP mask =
720 dynamic_cast<KisTransformMask*>(node.data())) {
721
723 mask->transformParams();
724
725 KisTransformMaskAdapter *adapter =
726 dynamic_cast<KisTransformMaskAdapter*>(savedParams.data());
727
728 if (adapter && adapter->isInitialized()) {
729 *args = *adapter->transformArgs();
730 result = true;
731 }
732 }
733 }
734
735 return result;
736}
virtual const QSharedPointer< ToolTransformArgs > transformArgs() const

References KisSharedPtr< T >::data(), KisTransformMaskAdapter::isInitialized(), and KisTransformMaskAdapter::transformArgs().

◆ tryOverrideRootToTransformMask()

KisNodeSP KisTransformUtils::tryOverrideRootToTransformMask ( KisNodeSP root)
static

Definition at line 639 of file kis_transform_utils.cpp.

640{
641 // we search for masks only at the first level of hierarchy,
642 // all other masks are just ignored.
643
644 KisNodeSP node = root->firstChild();
645
646 while (node) {
647 if (node->inherits("KisTransformMask") && node->isEditable()) {
648 root = node;
649 break;
650 }
651
652 node = node->nextSibling();
653 }
654
655 return root;
656}
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References KisNode::firstChild(), KisBaseNode::isEditable(), and KisNode::nextSibling().

Member Data Documentation

◆ handleRadius

const int KisTransformUtils::handleRadius = 8
static

Definition at line 37 of file kis_transform_utils.h.

◆ handleVisualRadius

const int KisTransformUtils::handleVisualRadius = 12
static

Definition at line 36 of file kis_transform_utils.h.

◆ rotationHandleRadius

const int KisTransformUtils::rotationHandleRadius = 8
static

Definition at line 38 of file kis_transform_utils.h.

◆ rotationHandleVisualRadius

const int KisTransformUtils::rotationHandleVisualRadius = 12
static

Definition at line 35 of file kis_transform_utils.h.


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