Krita Source Code Documentation
Loading...
Searching...
No Matches
KisPerspectiveTransformStrategy::Private Struct Reference

Classes

struct  HandlePoints
 

Public Member Functions

QCursor getScaleCursor (const QPointF &handlePt)
 
QCursor getShearCursor (const QPointF &start, const QPointF &end)
 
 Private (KisPerspectiveTransformStrategy *_q, const KisCoordinatesConverter *_converter, ToolTransformArgs &_currentArgs, TransformTransactionProperties &_transaction)
 
void recalculateTransformations ()
 
void recalculateTransformedHandles ()
 
QTransform transformFromArgs ()
 
void transformIntoArgs (const Eigen::Matrix3f &t)
 

Public Attributes

ToolTransformArgs clickArgs
 
QPointF clickPos
 
const KisCoordinatesConverterconverter
 standard members ///
 
ToolTransformArgscurrentArgs
 
int currentDraggingHandlePoint {0}
 
QVector< QPointF > dstHandlePoints
 
StrokeFunction function {NONE}
 custom members ///
 
QTransform handlesTransform
 
bool imageTooBig {false}
 
bool isTransforming {false}
 
QImage originalImage
 
QPointF paintingOffset
 
QTransform paintingTransform
 
KisPerspectiveTransformStrategyq
 
QVector< QPointF > srcHandlePoints
 
QTransform thumbToImageTransform
 
TransformTransactionPropertiestransaction
 
QTransform transform
 
HandlePoints transformedHandles
 

Detailed Description

Definition at line 49 of file kis_perspective_transform_strategy.cpp.

Constructor & Destructor Documentation

◆ Private()

KisPerspectiveTransformStrategy::Private::Private ( KisPerspectiveTransformStrategy * _q,
const KisCoordinatesConverter * _converter,
ToolTransformArgs & _currentArgs,
TransformTransactionProperties & _transaction )
inline

Member Function Documentation

◆ getScaleCursor()

QCursor KisPerspectiveTransformStrategy::Private::getScaleCursor ( const QPointF & handlePt)

◆ getShearCursor()

QCursor KisPerspectiveTransformStrategy::Private::getShearCursor ( const QPointF & start,
const QPointF & end )

◆ recalculateTransformations()

void KisPerspectiveTransformStrategy::Private::recalculateTransformations ( )

Definition at line 668 of file kis_perspective_transform_strategy.cpp.

669{
671
672 QTransform viewScaleTransform = converter->imageToDocumentTransform() * converter->documentToFlakeTransform();
673 handlesTransform = transform * viewScaleTransform;
674
675 QTransform tl = QTransform::fromTranslate(transaction.originalTopLeft().x(), transaction.originalTopLeft().y());
676 paintingTransform = tl.inverted() * q->thumbToImageTransform() * tl * transform * viewScaleTransform;
678
679 // check whether image is too big to be displayed or not
680 const qreal maxScale = 20.0;
681
682 imageTooBig = false;
683
684 if (qAbs(currentArgs.scaleX()) > maxScale ||
685 qAbs(currentArgs.scaleY()) > maxScale) {
686
687 imageTooBig = true;
688
689 } else {
690 QVector<QPointF> points;
691 points << transaction.originalRect().topLeft();
692 points << transaction.originalRect().topRight();
693 points << transaction.originalRect().bottomRight();
694 points << transaction.originalRect().bottomLeft();
695
696 for (int i = 0; i < points.size(); i++) {
697 points[i] = transform.map(points[i]);
698 }
699
700 for (int i = 0; i < points.size(); i++) {
701 const QPointF &pt = points[i];
702 const QPointF &prev = points[(i - 1 + 4) % 4];
703 const QPointF &next = points[(i + 1) % 4];
704 const QPointF &other = points[(i + 2) % 4];
705
706 QLineF l1(pt, other);
707 QLineF l2(prev, next);
708
709 QPointF intersection;
710 l1.intersects(l2, &intersection);
711
712 qreal maxDistance = kisSquareDistance(pt, other);
713
714 if (kisSquareDistance(pt, intersection) > maxDistance ||
715 kisSquareDistance(other, intersection) > maxDistance) {
716
717 imageTooBig = true;
718 break;
719 }
720
721 const qreal thresholdDistance = 0.02 * l2.length();
722
723 if (kisDistanceToLine(pt, l2) < thresholdDistance) {
724 imageTooBig = true;
725 break;
726 }
727 }
728 }
729
730 // recalculate cached handles position
732
735}
void requestShowImageTooBig(bool value)
qreal kisDistanceToLine(const QPointF &m, const QLineF &line)
Definition kis_global.h:234
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:194
QAction * next(const QObject *recvr, const char *slot, QObject *parent)

References kisDistanceToLine(), and kisSquareDistance().

◆ recalculateTransformedHandles()

void KisPerspectiveTransformStrategy::Private::recalculateTransformedHandles ( )

Definition at line 131 of file kis_perspective_transform_strategy.cpp.

132{
133 srcHandlePoints.resize(HANDLE_COUNT);
134 srcHandlePoints[HANDLE_TOP_LEFT] = transaction.originalTopLeft();
135 srcHandlePoints[HANDLE_TOP_RIGHT] = transaction.originalTopRight();
136 srcHandlePoints[HANDLE_BOTTOM_LEFT] = transaction.originalBottomLeft();
137 srcHandlePoints[HANDLE_BOTTOM_RIGHT] = transaction.originalBottomRight();
138 srcHandlePoints[HANDLE_MIDDLE_TOP] = transaction.originalMiddleTop();
139 srcHandlePoints[HANDLE_MIDDLE_BOTTOM] = transaction.originalMiddleBottom();
140 srcHandlePoints[HANDLE_MIDDLE_LEFT] = transaction.originalMiddleLeft();
141 srcHandlePoints[HANDLE_MIDDLE_RIGHT] = transaction.originalMiddleRight();
142
143 dstHandlePoints.clear();
144 Q_FOREACH (const QPointF &pt, srcHandlePoints) {
145 dstHandlePoints << transform.map(pt);
146 }
147
148 QMatrix4x4 realMatrix(transform);
149 QVector4D v;
150
151 v = QVector4D(1, 0, 0, 0);
152 v = realMatrix * v;
154 transformedHandles.xVanishing = v.toVector2DAffine().toPointF();
155
156 v = QVector4D(0, 1, 0, 0);
157 v = realMatrix * v;
159 transformedHandles.yVanishing = v.toVector2DAffine().toPointF();
160}
qreal v
static bool qFuzzyCompare(half p1, half p2)

References dstHandlePoints, TransformTransactionProperties::originalBottomLeft(), TransformTransactionProperties::originalBottomRight(), TransformTransactionProperties::originalMiddleBottom(), TransformTransactionProperties::originalMiddleLeft(), TransformTransactionProperties::originalMiddleRight(), TransformTransactionProperties::originalMiddleTop(), TransformTransactionProperties::originalTopLeft(), TransformTransactionProperties::originalTopRight(), qFuzzyCompare(), srcHandlePoints, transaction, transform, transformedHandles, v, KisPerspectiveTransformStrategy::Private::HandlePoints::xVanishing, KisPerspectiveTransformStrategy::Private::HandlePoints::xVanishingExists, KisPerspectiveTransformStrategy::Private::HandlePoints::yVanishing, and KisPerspectiveTransformStrategy::Private::HandlePoints::yVanishingExists.

◆ transformFromArgs()

QTransform KisPerspectiveTransformStrategy::Private::transformFromArgs ( )

◆ transformIntoArgs()

void KisPerspectiveTransformStrategy::Private::transformIntoArgs ( const Eigen::Matrix3f & t)

We disabled decomposed transformation due to bug https://bugs.kde.org/show_bug.cgi?id=447255

In some cases decomposed preliminary transformation shrinks the image into a very small size, which is later inflated by the perspective transform. It creates a really bad and blurry result.

Even though the usage of preliminary rotation makes the bug much less obvious, but the image is still really blurred.

Definition at line 412 of file kis_perspective_transform_strategy.cpp.

413{
414 Eigen::Matrix3f TS = fromTranslate(-currentArgs.originalCenter());
415
416 Eigen::Matrix3f m = t * TS.inverse();
417
418 qreal tX = m(0,2) / m(2,2);
419 qreal tY = m(1,2) / m(2,2);
420
421 Eigen::Matrix3f T = fromTranslate(QPointF(tX, tY));
422
423 m = T.inverse() * m;
424
438#if 0
439 // Decomposition according to:
440 // https://www.w3.org/TR/css-transforms-1/#decomposing-a-3d-matrix
442
443 currentArgs.setScaleX(dm.scaleX);
444 currentArgs.setScaleY(dm.scaleY);
445
446 currentArgs.setShearX(dm.shearXY);
448
450
451 QTransform pre = dm.scaleTransform() * dm.shearTransform() * dm.rotateTransform();
452 m = m * fromQTransform(pre.inverted());
453#else
458 currentArgs.setAZ(0.0);
459#endif
460
461 currentArgs.setTransformedCenter(QPointF(tX, tY));
463}
void setShearX(double shearX)
void setScaleX(double scaleX)
void setTransformedCenter(QPointF transformedCenter)
void setScaleY(double scaleY)
QPointF originalCenter() const
void setShearY(double shearY)
void setFlattenedPerspectiveTransform(const QTransform &value)
T kisDegreesToRadians(T degrees)
Definition kis_global.h:176
Eigen::Matrix3f fromTranslate(const QPointF &pt)
Eigen::Matrix3f fromQTransform(const QTransform &t)
QTransform toQTransform(const Eigen::Matrix3f &m)

References KisAlgebra2D::DecomposedMatrix::angle, fromQTransform(), fromTranslate(), kisDegreesToRadians(), KisAlgebra2D::DecomposedMatrix::rotateTransform(), KisAlgebra2D::DecomposedMatrix::scaleTransform(), KisAlgebra2D::DecomposedMatrix::scaleX, KisAlgebra2D::DecomposedMatrix::scaleY, KisAlgebra2D::DecomposedMatrix::shearTransform(), KisAlgebra2D::DecomposedMatrix::shearXY, and toQTransform().

Member Data Documentation

◆ clickArgs

ToolTransformArgs KisPerspectiveTransformStrategy::Private::clickArgs

Definition at line 106 of file kis_perspective_transform_strategy.cpp.

◆ clickPos

QPointF KisPerspectiveTransformStrategy::Private::clickPos

Definition at line 105 of file kis_perspective_transform_strategy.cpp.

◆ converter

const KisCoordinatesConverter* KisPerspectiveTransformStrategy::Private::converter

standard members ///

Definition at line 68 of file kis_perspective_transform_strategy.cpp.

◆ currentArgs

ToolTransformArgs& KisPerspectiveTransformStrategy::Private::currentArgs

Definition at line 71 of file kis_perspective_transform_strategy.cpp.

◆ currentDraggingHandlePoint

int KisPerspectiveTransformStrategy::Private::currentDraggingHandlePoint {0}

Definition at line 101 of file kis_perspective_transform_strategy.cpp.

101{0};

◆ dstHandlePoints

QVector<QPointF> KisPerspectiveTransformStrategy::Private::dstHandlePoints

Definition at line 100 of file kis_perspective_transform_strategy.cpp.

◆ function

StrokeFunction KisPerspectiveTransformStrategy::Private::function {NONE}

custom members ///

Definition at line 86 of file kis_perspective_transform_strategy.cpp.

86{NONE};
@ NONE

◆ handlesTransform

QTransform KisPerspectiveTransformStrategy::Private::handlesTransform

Definition at line 82 of file kis_perspective_transform_strategy.cpp.

◆ imageTooBig

bool KisPerspectiveTransformStrategy::Private::imageTooBig {false}

Definition at line 103 of file kis_perspective_transform_strategy.cpp.

103{false};

◆ isTransforming

bool KisPerspectiveTransformStrategy::Private::isTransforming {false}

Definition at line 107 of file kis_perspective_transform_strategy.cpp.

107{false};

◆ originalImage

QImage KisPerspectiveTransformStrategy::Private::originalImage

Definition at line 77 of file kis_perspective_transform_strategy.cpp.

◆ paintingOffset

QPointF KisPerspectiveTransformStrategy::Private::paintingOffset

Definition at line 80 of file kis_perspective_transform_strategy.cpp.

◆ paintingTransform

QTransform KisPerspectiveTransformStrategy::Private::paintingTransform

Definition at line 79 of file kis_perspective_transform_strategy.cpp.

◆ q

KisPerspectiveTransformStrategy* KisPerspectiveTransformStrategy::Private::q

Definition at line 64 of file kis_perspective_transform_strategy.cpp.

◆ srcHandlePoints

QVector<QPointF> KisPerspectiveTransformStrategy::Private::srcHandlePoints

Definition at line 99 of file kis_perspective_transform_strategy.cpp.

◆ thumbToImageTransform

QTransform KisPerspectiveTransformStrategy::Private::thumbToImageTransform

Definition at line 76 of file kis_perspective_transform_strategy.cpp.

◆ transaction

TransformTransactionProperties& KisPerspectiveTransformStrategy::Private::transaction

Definition at line 73 of file kis_perspective_transform_strategy.cpp.

◆ transform

QTransform KisPerspectiveTransformStrategy::Private::transform

Definition at line 97 of file kis_perspective_transform_strategy.cpp.

◆ transformedHandles

HandlePoints KisPerspectiveTransformStrategy::Private::transformedHandles

Definition at line 95 of file kis_perspective_transform_strategy.cpp.


The documentation for this struct was generated from the following file: