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

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

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