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 48 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 667 of file kis_perspective_transform_strategy.cpp.

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

131{
132 srcHandlePoints.resize(HANDLE_COUNT);
133 srcHandlePoints[HANDLE_TOP_LEFT] = transaction.originalTopLeft();
134 srcHandlePoints[HANDLE_TOP_RIGHT] = transaction.originalTopRight();
135 srcHandlePoints[HANDLE_BOTTOM_LEFT] = transaction.originalBottomLeft();
136 srcHandlePoints[HANDLE_BOTTOM_RIGHT] = transaction.originalBottomRight();
137 srcHandlePoints[HANDLE_MIDDLE_TOP] = transaction.originalMiddleTop();
138 srcHandlePoints[HANDLE_MIDDLE_BOTTOM] = transaction.originalMiddleBottom();
139 srcHandlePoints[HANDLE_MIDDLE_LEFT] = transaction.originalMiddleLeft();
140 srcHandlePoints[HANDLE_MIDDLE_RIGHT] = transaction.originalMiddleRight();
141
142 dstHandlePoints.clear();
143 Q_FOREACH (const QPointF &pt, srcHandlePoints) {
144 dstHandlePoints << transform.map(pt);
145 }
146
147 QMatrix4x4 realMatrix(transform);
148 QVector4D v;
149
150 v = QVector4D(1, 0, 0, 0);
151 v = realMatrix * v;
153 transformedHandles.xVanishing = v.toVector2DAffine().toPointF();
154
155 v = QVector4D(0, 1, 0, 0);
156 v = realMatrix * v;
158 transformedHandles.yVanishing = v.toVector2DAffine().toPointF();
159}
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 411 of file kis_perspective_transform_strategy.cpp.

412{
413 Eigen::Matrix3f TS = fromTranslate(-currentArgs.originalCenter());
414
415 Eigen::Matrix3f m = t * TS.inverse();
416
417 qreal tX = m(0,2) / m(2,2);
418 qreal tY = m(1,2) / m(2,2);
419
420 Eigen::Matrix3f T = fromTranslate(QPointF(tX, tY));
421
422 m = T.inverse() * m;
423
437#if 0
438 // Decomposition according to:
439 // https://www.w3.org/TR/css-transforms-1/#decomposing-a-3d-matrix
441
442 currentArgs.setScaleX(dm.scaleX);
443 currentArgs.setScaleY(dm.scaleY);
444
445 currentArgs.setShearX(dm.shearXY);
447
449
450 QTransform pre = dm.scaleTransform() * dm.shearTransform() * dm.rotateTransform();
451 m = m * fromQTransform(pre.inverted());
452#else
457 currentArgs.setAZ(0.0);
458#endif
459
460 currentArgs.setTransformedCenter(QPointF(tX, tY));
462}
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 105 of file kis_perspective_transform_strategy.cpp.

◆ clickPos

QPointF KisPerspectiveTransformStrategy::Private::clickPos

Definition at line 104 of file kis_perspective_transform_strategy.cpp.

◆ converter

const KisCoordinatesConverter* KisPerspectiveTransformStrategy::Private::converter

standard members ///

Definition at line 67 of file kis_perspective_transform_strategy.cpp.

◆ currentArgs

ToolTransformArgs& KisPerspectiveTransformStrategy::Private::currentArgs

Definition at line 70 of file kis_perspective_transform_strategy.cpp.

◆ currentDraggingHandlePoint

int KisPerspectiveTransformStrategy::Private::currentDraggingHandlePoint {0}

Definition at line 100 of file kis_perspective_transform_strategy.cpp.

100{0};

◆ dstHandlePoints

QVector<QPointF> KisPerspectiveTransformStrategy::Private::dstHandlePoints

Definition at line 99 of file kis_perspective_transform_strategy.cpp.

◆ function

StrokeFunction KisPerspectiveTransformStrategy::Private::function {NONE}

custom members ///

Definition at line 85 of file kis_perspective_transform_strategy.cpp.

85{NONE};
@ NONE

◆ handlesTransform

QTransform KisPerspectiveTransformStrategy::Private::handlesTransform

Definition at line 81 of file kis_perspective_transform_strategy.cpp.

◆ imageTooBig

bool KisPerspectiveTransformStrategy::Private::imageTooBig {false}

Definition at line 102 of file kis_perspective_transform_strategy.cpp.

102{false};

◆ isTransforming

bool KisPerspectiveTransformStrategy::Private::isTransforming {false}

Definition at line 106 of file kis_perspective_transform_strategy.cpp.

106{false};

◆ originalImage

QImage KisPerspectiveTransformStrategy::Private::originalImage

Definition at line 76 of file kis_perspective_transform_strategy.cpp.

◆ paintingOffset

QPointF KisPerspectiveTransformStrategy::Private::paintingOffset

Definition at line 79 of file kis_perspective_transform_strategy.cpp.

◆ paintingTransform

QTransform KisPerspectiveTransformStrategy::Private::paintingTransform

Definition at line 78 of file kis_perspective_transform_strategy.cpp.

◆ q

KisPerspectiveTransformStrategy* KisPerspectiveTransformStrategy::Private::q

Definition at line 63 of file kis_perspective_transform_strategy.cpp.

◆ srcHandlePoints

QVector<QPointF> KisPerspectiveTransformStrategy::Private::srcHandlePoints

Definition at line 98 of file kis_perspective_transform_strategy.cpp.

◆ thumbToImageTransform

QTransform KisPerspectiveTransformStrategy::Private::thumbToImageTransform

Definition at line 75 of file kis_perspective_transform_strategy.cpp.

◆ transaction

TransformTransactionProperties& KisPerspectiveTransformStrategy::Private::transaction

Definition at line 72 of file kis_perspective_transform_strategy.cpp.

◆ transform

QTransform KisPerspectiveTransformStrategy::Private::transform

Definition at line 96 of file kis_perspective_transform_strategy.cpp.

◆ transformedHandles

HandlePoints KisPerspectiveTransformStrategy::Private::transformedHandles

Definition at line 94 of file kis_perspective_transform_strategy.cpp.


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