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 QPainterPath getCursorOutline () const
 
 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}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisSimplifiedActionPolicyStrategy(const KisCoordinatesConverter *_converter, KoSnapGuide *snapGuide=0)
const QScopedPointer< Private > m_d

References connect(), and 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: