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

#include <kis_warp_transform_strategy.h>

+ Inheritance diagram for KisWarpTransformStrategy:

Classes

struct  Private
 

Signals

void requestCanvasUpdate ()
 
void requestImageRecalculation ()
 

Public Member Functions

bool acceptsClicks () const override
 
bool beginPrimaryAction (const QPointF &pt) override
 
virtual bool beginPrimaryAction (KoPointerEvent *event)=0
 
void continuePrimaryAction (const QPointF &pt, bool shiftModifierActive, bool altModifierActive) override
 
virtual void continuePrimaryAction (KoPointerEvent *event)=0
 
bool endPrimaryAction () override
 
virtual bool endPrimaryAction (KoPointerEvent *event)=0
 
void externalConfigChanged () override
 
QCursor getCurrentCursor () const override
 
 KisWarpTransformStrategy (const KisCoordinatesConverter *converter, KoSnapGuide *snapGuide, ToolTransformArgs &currentArgs, TransformTransactionProperties &transaction)
 
void paint (QPainter &gc) override
 
void setTransformFunction (const QPointF &mousePos, bool perspectiveModifierActive, bool shiftModifierActive, bool altModifierActive) override
 
void setTransformType (TransformType type)
 
 ~KisWarpTransformStrategy () override
 
- Public Member Functions inherited from KisSimplifiedActionPolicyStrategy
void activateAlternateAction (KisTool::AlternateAction action) override
 
void activatePrimaryAction () override
 
bool beginAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
void continueAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
void deactivateAlternateAction (KisTool::AlternateAction action) override
 
bool endAlternateAction (KoPointerEvent *event, KisTool::AlternateAction action) override
 
virtual QPointF handleSnapPoint (const QPointF &imagePos)
 
void hoverActionCommon (KoPointerEvent *event) override
 
 KisSimplifiedActionPolicyStrategy (const KisCoordinatesConverter *_converter, KoSnapGuide *snapGuide=0)
 
 ~KisSimplifiedActionPolicyStrategy () override
 
- Public Member Functions inherited from KisTransformStrategyBase
virtual void deactivatePrimaryAction ()
 
virtual int decorationThickness () const
 
virtual void decreaseBrushSize (KoCanvasBase *canvas)
 
virtual QPainterPath getCursorOutline () const
 
virtual void increaseBrushSize (KoCanvasBase *canvas)
 
 KisTransformStrategyBase ()
 
QImage originalImage () const
 
virtual void setDecorationThickness (int thickness)
 
void setThumbnailImage (const QImage &image, QTransform thumbToImageTransform)
 
QTransform thumbToImageTransform () const
 
 ~KisTransformStrategyBase () override
 

Protected Member Functions

virtual QImage calculateTransformedImage (ToolTransformArgs &currentArgs, const QImage &srcImage, const QVector< QPointF > &origPoints, const QVector< QPointF > &transfPoints, const QPointF &srcOffset, QPointF *dstOffset)
 
virtual void drawConnectionLines (QPainter &gc, const QVector< QPointF > &origPoints, const QVector< QPointF > &transfPoints, bool isEditingPoints)
 
void overrideDrawingItems (bool drawConnectionLines, bool drawOrigPoints, bool drawTransfPoints)
 
void setClipOriginalPointsPosition (bool value)
 
void setCloseOnStartPointClick (bool value)
 
- Protected Member Functions inherited from KisSimplifiedActionPolicyStrategy
virtual void hoverActionCommon (const QPointF &pt)
 
virtual bool shiftModifierIsUsed () const
 

Private Member Functions

 Q_PRIVATE_SLOT (m_d, void recalculateTransformations())
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 29 of file kis_warp_transform_strategy.h.

Constructor & Destructor Documentation

◆ KisWarpTransformStrategy()

KisWarpTransformStrategy::KisWarpTransformStrategy ( const KisCoordinatesConverter * converter,
KoSnapGuide * snapGuide,
ToolTransformArgs & currentArgs,
TransformTransactionProperties & transaction )

Definition at line 97 of file kis_warp_transform_strategy.cpp.

101 : KisSimplifiedActionPolicyStrategy(converter, snapGuide),
102 m_d(new Private(this, converter, currentArgs, transaction))
103{
104 connect(&m_d->recalculateSignalCompressor, SIGNAL(timeout()),
105 SLOT(recalculateTransformations()));
106}
KisSimplifiedActionPolicyStrategy(const KisCoordinatesConverter *_converter, KoSnapGuide *snapGuide=0)
const QScopedPointer< Private > m_d

References m_d.

◆ ~KisWarpTransformStrategy()

KisWarpTransformStrategy::~KisWarpTransformStrategy ( )
override

Definition at line 108 of file kis_warp_transform_strategy.cpp.

109{
110}

Member Function Documentation

◆ acceptsClicks()

bool KisWarpTransformStrategy::acceptsClicks ( ) const
overridevirtual

Reimplemented from KisTransformStrategyBase.

Definition at line 557 of file kis_warp_transform_strategy.cpp.

558{
559 return m_d->shouldCloseTheCage() ||
560 m_d->currentArgs.isEditingTransformPoints();
561}

References m_d.

◆ beginPrimaryAction() [1/2]

bool KisWarpTransformStrategy::beginPrimaryAction ( const QPointF & pt)
overridevirtual

Implements KisSimplifiedActionPolicyStrategy.

Definition at line 373 of file kis_warp_transform_strategy.cpp.

374{
375 const bool isEditingPoints = m_d->currentArgs.isEditingTransformPoints();
376 bool retval = false;
377
378 if (m_d->mode == Private::OVER_POINT ||
380 m_d->mode == Private::MOVE_MODE ||
381 m_d->mode == Private::ROTATE_MODE ||
382 m_d->mode == Private::SCALE_MODE) {
383
384 retval = true;
385
386 } else if (isEditingPoints) {
387 QPointF newPos = m_d->clipOriginalPointsPosition ?
388 KisTransformUtils::clipInRect(pt, m_d->transaction.originalRect()) :
389 pt;
390
391 m_d->currentArgs.refOriginalPoints().append(newPos);
392 m_d->currentArgs.refTransformedPoints().append(newPos);
393
394 m_d->mode = Private::OVER_POINT;
395 m_d->pointIndexUnderCursor = m_d->currentArgs.origPoints().size() - 1;
396
397 m_d->recalculateSignalCompressor.start();
398
399 retval = true;
400 }
401
402 if (m_d->mode == Private::OVER_POINT) {
403 m_d->pointPosOnClick =
404 m_d->currentArgs.transfPoints()[m_d->pointIndexUnderCursor];
405 m_d->pointWasDragged = false;
406
407 m_d->pointsInAction.clear();
408 m_d->pointsInAction << m_d->pointIndexUnderCursor;
409 m_d->lastNumPoints = m_d->currentArgs.transfPoints().size();
410 } else if (m_d->mode == Private::MULTIPLE_POINT_SELECTION) {
412 std::find(m_d->pointsInAction.begin(),
413 m_d->pointsInAction.end(),
414 m_d->pointIndexUnderCursor);
415
416 if (it != m_d->pointsInAction.end()) {
417 m_d->pointsInAction.erase(it);
418 } else {
419 m_d->pointsInAction << m_d->pointIndexUnderCursor;
420 }
421
422 m_d->lastNumPoints = m_d->currentArgs.transfPoints().size();
423 }
424
425 m_d->lastMousePos = pt;
426 return retval;
427}
static QPointF clipInRect(QPointF p, QRectF r)

References KisTransformUtils::clipInRect(), m_d, KisWarpTransformStrategy::Private::MOVE_MODE, KisWarpTransformStrategy::Private::MULTIPLE_POINT_SELECTION, KisWarpTransformStrategy::Private::OVER_POINT, KisWarpTransformStrategy::Private::ROTATE_MODE, and KisWarpTransformStrategy::Private::SCALE_MODE.

◆ beginPrimaryAction() [2/2]

virtual bool KisTransformStrategyBase::beginPrimaryAction ( KoPointerEvent * event)
virtual

Reimplemented from KisSimplifiedActionPolicyStrategy.

◆ calculateTransformedImage()

QImage KisWarpTransformStrategy::calculateTransformedImage ( ToolTransformArgs & currentArgs,
const QImage & srcImage,
const QVector< QPointF > & origPoints,
const QVector< QPointF > & transfPoints,
const QPointF & srcOffset,
QPointF * dstOffset )
protectedvirtual

Reimplemented in KisCageTransformStrategy.

Definition at line 625 of file kis_warp_transform_strategy.cpp.

631{
633 currentArgs.warpType(),
634 origPoints, transfPoints,
635 currentArgs.alpha(),
636 srcImage,
637 srcOffset, dstOffset);
638}
static QImage transformQImage(WarpType warpType, const QVector< QPointF > &origPoint, const QVector< QPointF > &transfPoint, qreal alpha, const QImage &srcImage, const QPointF &srcQImageOffset, QPointF *newOffset)
KisWarpTransformWorker::WarpType warpType() const

References ToolTransformArgs::alpha(), KisWarpTransformWorker::transformQImage(), and ToolTransformArgs::warpType().

◆ continuePrimaryAction() [1/2]

void KisWarpTransformStrategy::continuePrimaryAction ( const QPointF & pt,
bool shiftModifierActive,
bool altModifierActive )
overridevirtual

Implements KisSimplifiedActionPolicyStrategy.

Definition at line 453 of file kis_warp_transform_strategy.cpp.

454{
455 Q_UNUSED(shiftModifierActive);
456 Q_UNUSED(altModifierActive);
457
458 // toplevel code switches to HOVER mode if nothing is selected
460 m_d->mode == Private::ROTATE_MODE ||
461 m_d->mode == Private::SCALE_MODE ||
462 (m_d->mode == Private::OVER_POINT &&
463 m_d->pointIndexUnderCursor >= 0 &&
464 m_d->pointsInAction.size() == 1) ||
466 m_d->pointIndexUnderCursor >= 0));
467
468 if (m_d->mode == Private::OVER_POINT) {
469 if (m_d->currentArgs.isEditingTransformPoints()) {
470 QPointF newPos = m_d->clipOriginalPointsPosition ?
471 KisTransformUtils::clipInRect(pt, m_d->transaction.originalRect()) :
472 pt;
473 m_d->currentArgs.origPoint(m_d->pointIndexUnderCursor) = newPos;
474 m_d->currentArgs.transfPoint(m_d->pointIndexUnderCursor) = newPos;
475 } else {
476 m_d->currentArgs.transfPoint(m_d->pointIndexUnderCursor) = pt;
477 }
478
479
480 const qreal handleRadiusSq = pow2(KisTransformUtils::effectiveHandleGrabRadius(m_d->converter));
481 qreal dist =
483 m_d->currentArgs.transfPoint(m_d->pointIndexUnderCursor),
484 m_d->pointPosOnClick);
485
486 if (dist > handleRadiusSq) {
487 m_d->pointWasDragged = true;
488 }
489 } else if (m_d->mode == Private::MOVE_MODE) {
490 QPointF center;
491 QVector<QPointF*> selectedPoints = m_d->getSelectedPoints(&center);
492
493 QPointF diff = pt - m_d->lastMousePos;
494
495 QVector<QPointF*>::iterator it = selectedPoints.begin();
496 QVector<QPointF*>::iterator end = selectedPoints.end();
497 for (; it != end; ++it) {
498 **it += diff;
499 }
500 } else if (m_d->mode == Private::ROTATE_MODE) {
501 QPointF center;
502 QVector<QPointF*> selectedPoints = m_d->getSelectedPoints(&center);
503
504 QPointF oldDirection = m_d->lastMousePos - center;
505 QPointF newDirection = pt - center;
506
507 qreal rotateAngle = KisAlgebra2D::angleBetweenVectors(oldDirection, newDirection);
508 QTransform R;
509 R.rotateRadians(rotateAngle);
510
511 QTransform t =
512 QTransform::fromTranslate(-center.x(), -center.y()) *
513 R *
514 QTransform::fromTranslate(center.x(), center.y());
515
516 QVector<QPointF*>::iterator it = selectedPoints.begin();
517 QVector<QPointF*>::iterator end = selectedPoints.end();
518 for (; it != end; ++it) {
519 **it = t.map(**it);
520 }
521 } else if (m_d->mode == Private::SCALE_MODE) {
522 QPointF center;
523 QVector<QPointF*> selectedPoints = m_d->getSelectedPoints(&center);
524
525 QPolygonF polygon(m_d->currentArgs.origPoints());
526 QSizeF maxSize = polygon.boundingRect().size();
527 qreal maxDimension = qMax(maxSize.width(), maxSize.height());
528
529 qreal scale = 1.0 - (pt - m_d->lastMousePos).y() / maxDimension;
530
531 QTransform t =
532 QTransform::fromTranslate(-center.x(), -center.y()) *
533 QTransform::fromScale(scale, scale) *
534 QTransform::fromTranslate(center.x(), center.y());
535
536 QVector<QPointF*>::iterator it = selectedPoints.begin();
537 QVector<QPointF*>::iterator end = selectedPoints.end();
538 for (; it != end; ++it) {
539 **it = t.map(**it);
540 }
541 }
542
543 m_d->lastMousePos = pt;
544 m_d->recalculateSignalCompressor.start();
545
546}
Eigen::Matrix< double, 4, 2 > R
static qreal effectiveHandleGrabRadius(const KisCoordinatesConverter *converter)
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
T pow2(const T &x)
Definition kis_global.h:166
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Definition kis_global.h:194
auto maxDimension(Size size) -> decltype(size.width())
qreal angleBetweenVectors(const QPointF &v1, const QPointF &v2)

References KisAlgebra2D::angleBetweenVectors(), KisTransformUtils::clipInRect(), KisTransformUtils::effectiveHandleGrabRadius(), KIS_ASSERT_RECOVER_RETURN, kisSquareDistance(), m_d, KisWarpTransformStrategy::Private::MOVE_MODE, KisWarpTransformStrategy::Private::MULTIPLE_POINT_SELECTION, KisWarpTransformStrategy::Private::OVER_POINT, pow2(), R, KisWarpTransformStrategy::Private::ROTATE_MODE, and KisWarpTransformStrategy::Private::SCALE_MODE.

◆ continuePrimaryAction() [2/2]

virtual void KisTransformStrategyBase::continuePrimaryAction ( KoPointerEvent * event)
virtual

Reimplemented from KisSimplifiedActionPolicyStrategy.

◆ drawConnectionLines()

void KisWarpTransformStrategy::drawConnectionLines ( QPainter & gc,
const QVector< QPointF > & origPoints,
const QVector< QPointF > & transfPoints,
bool isEditingPoints )
protectedvirtual

Reimplemented in KisCageTransformStrategy.

Definition at line 202 of file kis_warp_transform_strategy.cpp.

206{
207 Q_UNUSED(isEditingPoints);
208
209 QPen antsPen;
210 QPen outlinePen;
211
212 KisPaintingTweaks::initAntsPen(&antsPen, &outlinePen);
213 antsPen.setWidth(decorationThickness());
214 outlinePen.setWidth(decorationThickness());
215
216 const int numPoints = origPoints.size();
217
218 for (int i = 0; i < numPoints; ++i) {
219 gc.setPen(outlinePen);
220 gc.drawLine(transfPoints[i], origPoints[i]);
221 gc.setPen(antsPen);
222 gc.drawLine(transfPoints[i], origPoints[i]);
223 }
224}
void initAntsPen(QPen *antsPen, QPen *outlinePen, int antLength, int antSpace)

References KisTransformStrategyBase::decorationThickness(), and KisPaintingTweaks::initAntsPen().

◆ endPrimaryAction() [1/2]

bool KisWarpTransformStrategy::endPrimaryAction ( )
overridevirtual

Implements KisSimplifiedActionPolicyStrategy.

Definition at line 563 of file kis_warp_transform_strategy.cpp.

564{
565 if (m_d->shouldCloseTheCage()) {
566 m_d->currentArgs.setEditingTransformPoints(false);
567 }
568
569 return true;
570}

References m_d.

◆ endPrimaryAction() [2/2]

virtual bool KisTransformStrategyBase::endPrimaryAction ( KoPointerEvent * event)
virtual

Reimplemented from KisSimplifiedActionPolicyStrategy.

◆ externalConfigChanged()

void KisWarpTransformStrategy::externalConfigChanged ( )
overridevirtual

Implements KisTransformStrategyBase.

Definition at line 364 of file kis_warp_transform_strategy.cpp.

365{
366 if (m_d->lastNumPoints != m_d->currentArgs.transfPoints().size()) {
367 m_d->pointsInAction.clear();
368 }
369
370 m_d->recalculateTransformations();
371}

References m_d.

◆ getCurrentCursor()

QCursor KisWarpTransformStrategy::getCurrentCursor ( ) const
overridevirtual

Implements KisTransformStrategyBase.

Definition at line 151 of file kis_warp_transform_strategy.cpp.

152{
153 QCursor cursor;
154
155 switch (m_d->mode) {
158 break;
160 cursor = KisCursor::crossCursor();
161 break;
163 cursor = KisCursor::moveCursor();
164 break;
166 cursor = KisCursor::rotateCursor();
167 break;
169 cursor = KisCursor::sizeVerCursor();
170 break;
171 case Private::NOTHING:
172 cursor = KisCursor::arrowCursor();
173 break;
174 }
175
176 return cursor;
177}
static QCursor crossCursor()
Definition kis_cursor.cc:34
static QCursor rotateCursor()
static QCursor moveCursor()
static QCursor arrowCursor()
Definition kis_cursor.cc:24
static QCursor pointingHandCursor()
static QCursor sizeVerCursor()
Definition kis_cursor.cc:64

References KisCursor::arrowCursor(), KisCursor::crossCursor(), m_d, KisWarpTransformStrategy::Private::MOVE_MODE, KisCursor::moveCursor(), KisWarpTransformStrategy::Private::MULTIPLE_POINT_SELECTION, KisWarpTransformStrategy::Private::NOTHING, KisWarpTransformStrategy::Private::OVER_POINT, KisCursor::pointingHandCursor(), KisWarpTransformStrategy::Private::ROTATE_MODE, KisCursor::rotateCursor(), KisWarpTransformStrategy::Private::SCALE_MODE, and KisCursor::sizeVerCursor().

◆ overrideDrawingItems()

void KisWarpTransformStrategy::overrideDrawingItems ( bool drawConnectionLines,
bool drawOrigPoints,
bool drawTransfPoints )
protected

Definition at line 179 of file kis_warp_transform_strategy.cpp.

182{
183 m_d->drawConnectionLines = drawConnectionLines;
184 m_d->drawOrigPoints = drawOrigPoints;
185 m_d->drawTransfPoints = drawTransfPoints;
186}
virtual void drawConnectionLines(QPainter &gc, const QVector< QPointF > &origPoints, const QVector< QPointF > &transfPoints, bool isEditingPoints)

References drawConnectionLines(), and m_d.

◆ paint()

void KisWarpTransformStrategy::paint ( QPainter & gc)
overridevirtual

Implements KisTransformStrategyBase.

Definition at line 226 of file kis_warp_transform_strategy.cpp.

227{
228 // Draw preview image
229
230 gc.save();
231
232 gc.setOpacity(m_d->transaction.basePreviewOpacity());
233 gc.setTransform(m_d->paintingTransform, true);
234 gc.drawImage(m_d->paintingOffset, m_d->transformedImage);
235
236 gc.restore();
237
238
239 gc.save();
240 gc.setTransform(m_d->handlesTransform, true);
241
242 if (m_d->drawConnectionLines) {
243 gc.setOpacity(0.5);
244
246 m_d->currentArgs.origPoints(),
247 m_d->currentArgs.transfPoints(),
248 m_d->currentArgs.isEditingTransformPoints());
249 }
250
251
252 QPen mainPen(Qt::black);
253 mainPen.setCosmetic(true);
254 mainPen.setWidth(decorationThickness());
255 QPen outlinePen(Qt::white);
256 outlinePen.setCosmetic(true);
257 outlinePen.setWidth(decorationThickness());
258
259 // draw handles
260 {
261 const int numPoints = m_d->currentArgs.origPoints().size();
262
263
264
265 qreal handlesExtraScale = KisTransformUtils::scaleFromAffineMatrix(m_d->handlesTransform);
266
267 qreal dstIn = 8 / handlesExtraScale;
268 qreal dstOut = 10 / handlesExtraScale;
269 qreal srcIn = 6 / handlesExtraScale;
270 qreal srcOut = 6 / handlesExtraScale;
271
272 QRectF handleRect1(-0.5 * dstIn, -0.5 * dstIn, dstIn, dstIn);
273 QRectF handleRect2(-0.5 * dstOut, -0.5 * dstOut, dstOut, dstOut);
274
275 if (m_d->drawTransfPoints) {
276 gc.setOpacity(1.0);
277
278 for (int i = 0; i < numPoints; ++i) {
279 gc.setPen(outlinePen);
280 gc.drawEllipse(handleRect2.translated(m_d->currentArgs.transfPoints()[i]));
281 gc.setPen(mainPen);
282 gc.drawEllipse(handleRect1.translated(m_d->currentArgs.transfPoints()[i]));
283 }
284
285 QPointF center;
286 QVector<QPointF*> selectedPoints = m_d->getSelectedPoints(&center, true);
287
288 QBrush selectionBrush = selectedPoints.size() > 1 ? Qt::red : Qt::black;
289
290 QBrush oldBrush = gc.brush();
291 gc.setBrush(selectionBrush);
292 Q_FOREACH (const QPointF *pt, selectedPoints) {
293 gc.drawEllipse(handleRect1.translated(*pt));
294 }
295 gc.setBrush(oldBrush);
296
297 }
298
299 if (m_d->drawOrigPoints) {
300 QPainterPath inLine;
301 inLine.moveTo(-0.5 * srcIn, 0);
302 inLine.lineTo( 0.5 * srcIn, 0);
303 inLine.moveTo( 0, -0.5 * srcIn);
304 inLine.lineTo( 0, 0.5 * srcIn);
305
306 QPainterPath outLine;
307 outLine.moveTo(-0.5 * srcOut, -0.5 * srcOut);
308 outLine.lineTo( 0.5 * srcOut, -0.5 * srcOut);
309 outLine.lineTo( 0.5 * srcOut, 0.5 * srcOut);
310 outLine.lineTo(-0.5 * srcOut, 0.5 * srcOut);
311 outLine.lineTo(-0.5 * srcOut, -0.5 * srcOut);
312
313 gc.setOpacity(0.5);
314
315 for (int i = 0; i < numPoints; ++i) {
316 gc.setPen(outlinePen);
317 gc.drawPath(outLine.translated(m_d->currentArgs.origPoints()[i]));
318 gc.setPen(mainPen);
319 gc.drawPath(inLine.translated(m_d->currentArgs.origPoints()[i]));
320 }
321 }
322
323 }
324
325 // draw grid lines only if we are using the GRID mode. Also only use this logic for warp, not cage transforms
326 if (m_d->currentArgs.warpCalculation() == KisWarpTransformWorker::WarpCalculation::GRID &&
327 m_d->transformType == TransformType::WARP_TRANSFORM ) {
328
329 // see how many rows we have. we are only going to do lines up to 6 divisions/
330 // it is almost impossible to use with 6 even.
331 const int numPoints = m_d->currentArgs.origPoints().size();
332
333 // grid is always square, so get the square root to find # of rows
334 int rowsInWarp = sqrt(m_d->currentArgs.origPoints().size());
335
336
337 KisHandlePainterHelper handlePainter(&gc, 0.0, decorationThickness());
338 handlePainter.setHandleStyle(KisHandleStyle::primarySelection());
339
340 // draw horizontal lines
341 for (int i = 0; i < numPoints; i++) {
342 if (i != 0 && i % rowsInWarp == rowsInWarp -1) {
343 // skip line if it is the last in the row
344 } else {
345 handlePainter.drawConnectionLine(m_d->currentArgs.transfPoints()[i], m_d->currentArgs.transfPoints()[i+1] );
346 }
347 }
348
349 // draw vertical lines
350 for (int i = 0; i < numPoints; i++) {
351
352 if ( (numPoints - i - 1) < rowsInWarp ) {
353 // last row doesn't need to draw vertical lines
354 } else {
355 handlePainter.drawConnectionLine(m_d->currentArgs.transfPoints()[i], m_d->currentArgs.transfPoints()[i+rowsInWarp] );
356 }
357 }
358
359 } // end if statement
360
361 gc.restore();
362}
The KisHandlePainterHelper class is a special helper for painting handles around objects....
static KisHandleStyle & primarySelection()
static qreal scaleFromAffineMatrix(const QTransform &t)

References KisTransformStrategyBase::decorationThickness(), KisHandlePainterHelper::drawConnectionLine(), drawConnectionLines(), m_d, KisHandleStyle::primarySelection(), KisTransformUtils::scaleFromAffineMatrix(), KisHandlePainterHelper::setHandleStyle(), and WARP_TRANSFORM.

◆ Q_PRIVATE_SLOT()

KisWarpTransformStrategy::Q_PRIVATE_SLOT ( m_d ,
void recalculateTransformations() )
private

◆ requestCanvasUpdate

void KisWarpTransformStrategy::requestCanvasUpdate ( )
signal

◆ requestImageRecalculation

void KisWarpTransformStrategy::requestImageRecalculation ( )
signal

◆ setClipOriginalPointsPosition()

void KisWarpTransformStrategy::setClipOriginalPointsPosition ( bool value)
protected

Definition at line 193 of file kis_warp_transform_strategy.cpp.

194{
195 m_d->clipOriginalPointsPosition = value;
196}
float value(const T *src, size_t ch)

References m_d, and value().

◆ setCloseOnStartPointClick()

void KisWarpTransformStrategy::setCloseOnStartPointClick ( bool value)
protected

Definition at line 188 of file kis_warp_transform_strategy.cpp.

189{
190 m_d->closeOnStartPointClick = value;
191}

References m_d, and value().

◆ setTransformFunction()

void KisWarpTransformStrategy::setTransformFunction ( const QPointF & mousePos,
bool perspectiveModifierActive,
bool shiftModifierActive,
bool altModifierActive )
overridevirtual

Implements KisSimplifiedActionPolicyStrategy.

Definition at line 112 of file kis_warp_transform_strategy.cpp.

113{
114 Q_UNUSED(shiftModifierActive);
115 Q_UNUSED(altModifierActive);
116
117 const double handleRadius = KisTransformUtils::effectiveHandleGrabRadius(m_d->converter);
118
119 bool cursorOverPoint = false;
120 m_d->pointIndexUnderCursor = -1;
121
123 handleChooser(mousePos, Private::NOTHING);
124
125 const QVector<QPointF> &points = m_d->currentArgs.transfPoints();
126 for (int i = 0; i < points.size(); ++i) {
127 if (handleChooser.addFunction(points[i],
128 handleRadius, Private::NOTHING)) {
129
130 cursorOverPoint = true;
131 m_d->pointIndexUnderCursor = i;
132 }
133 }
134
135 if (cursorOverPoint) {
136 m_d->mode = perspectiveModifierActive &&
137 !m_d->currentArgs.isEditingTransformPoints() ?
139
140 } else if (!m_d->currentArgs.isEditingTransformPoints()) {
141 QPolygonF polygon(m_d->currentArgs.transfPoints());
142 bool insidePolygon = polygon.boundingRect().contains(mousePos);
143 m_d->mode = insidePolygon ? Private::MOVE_MODE :
144 !perspectiveModifierActive ? Private::ROTATE_MODE :
146 } else {
147 m_d->mode = Private::NOTHING;
148 }
149}

References KisTransformUtils::HandleChooser< Function >::addFunction(), KisTransformUtils::effectiveHandleGrabRadius(), m_d, KisWarpTransformStrategy::Private::MOVE_MODE, KisWarpTransformStrategy::Private::MULTIPLE_POINT_SELECTION, KisWarpTransformStrategy::Private::NOTHING, KisWarpTransformStrategy::Private::OVER_POINT, KisWarpTransformStrategy::Private::ROTATE_MODE, and KisWarpTransformStrategy::Private::SCALE_MODE.

◆ setTransformType()

void KisWarpTransformStrategy::setTransformType ( TransformType type)

Definition at line 198 of file kis_warp_transform_strategy.cpp.

198 {
199 m_d->transformType = type;
200}

References m_d.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisWarpTransformStrategy::m_d
private

Definition at line 88 of file kis_warp_transform_strategy.h.


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