480{
481 Q_UNUSED(shiftModifierActive);
482 Q_UNUSED(altModifierActive);
483
484 m_d->isTransforming =
true;
485
486 switch (
m_d->function) {
488 break;
490 QPointF diff = mousePos -
m_d->clickPos;
491 m_d->currentArgs.setTransformedCenter(
492 m_d->clickArgs.transformedCenter() + diff);
493 break;
494 }
495 case DRAG_HANDLE: {
498 if (
m_d->currentDraggingHandlePoint < HANDLE_MIDDLE_TOP) {
499
500 m_d->dstHandlePoints[
m_d->currentDraggingHandlePoint] = mousePos;
501 } else {
502
503 QPointF delta = mousePos -
m_d->dstHandlePoints[
m_d->currentDraggingHandlePoint];
504 switch(
m_d->currentDraggingHandlePoint) {
505 case HANDLE_MIDDLE_TOP:
506 m_d->dstHandlePoints[HANDLE_TOP_LEFT] += delta;
507 m_d->dstHandlePoints[HANDLE_TOP_RIGHT] += delta;
508 break;
509 case HANDLE_MIDDLE_BOTTOM:
510 m_d->dstHandlePoints[HANDLE_BOTTOM_LEFT] += delta;
511 m_d->dstHandlePoints[HANDLE_BOTTOM_RIGHT] += delta;
512 break;
513 case HANDLE_MIDDLE_LEFT:
514 m_d->dstHandlePoints[HANDLE_TOP_LEFT] += delta;
515 m_d->dstHandlePoints[HANDLE_BOTTOM_LEFT] += delta;
516 break;
517 case HANDLE_MIDDLE_RIGHT:
518 m_d->dstHandlePoints[HANDLE_TOP_RIGHT] += delta;
519 m_d->dstHandlePoints[HANDLE_BOTTOM_RIGHT] += delta;
520 break;
521 }
522 }
523
526 Eigen::Matrix3f result =
B *
A.inverse();
527
528 m_d->transformIntoArgs(result);
529
530 break;
531 }
532 case DRAG_X_VANISHING_POINT:
533 case DRAG_Y_VANISHING_POINT: {
534
535 QMatrix4x4 m(
m_d->transform);
536
537 QPointF tl =
m_d->transaction.originalTopLeft();
538 QPointF tr =
m_d->transaction.originalTopRight();
539 QPointF bl =
m_d->transaction.originalBottomLeft();
540 QPointF br =
m_d->transaction.originalBottomRight();
541
542 QVector4D
v(1,0,0,0);
543 QVector4D otherV(0,1,0,0);
544
545 if (
m_d->function == DRAG_X_VANISHING_POINT) {
546 v = QVector4D(1,0,0,0);
547 otherV = QVector4D(0,1,0,0);
548 } else {
549 v = QVector4D(0,1,0,0);
550 otherV = QVector4D(1,0,0,0);
551 }
552
558 QPointF otherV_dst =
toQPointF(m * otherV);
559
562
563 QPointF far1_src;
564 QPointF far2_src;
565 QPointF near1_src;
566 QPointF near2_src;
567
568 QPointF far1_dst;
569 QPointF far2_dst;
570 QPointF near1_dst;
571 QPointF near2_dst;
572
573 if (
m_d->function == DRAG_X_VANISHING_POINT) {
574
575
577 far1_src = tl;
578 far2_src = bl;
579 near1_src = tr;
580 near2_src = br;
581
582 far1_dst = tl_dst;
583 far2_dst = bl_dst;
584 near1_dst = tr_dst;
585 near2_dst = br_dst;
586
587
588 } else {
589 far1_src = tr;
590 far2_src = br;
591 near1_src = tl;
592 near2_src = bl;
593
594 far1_dst = tr_dst;
595 far2_dst = br_dst;
596 near1_dst = tl_dst;
597 near2_dst = bl_dst;
598 }
599
600 } else {
601
603 far1_src = tl;
604 far2_src = tr;
605 near1_src = bl;
606 near2_src = br;
607
608 far1_dst = tl_dst;
609 far2_dst = tr_dst;
610 near1_dst = bl_dst;
611 near2_dst = br_dst;
612
613
614 } else {
615 far1_src = bl;
616 far2_src = br;
617 near1_src = tl;
618 near2_src = tr;
619
620 far1_dst = bl_dst;
621 far2_dst = br_dst;
622 near1_dst = tl_dst;
623 near2_dst = tr_dst;
624 }
625 }
626
627 QLineF l0(far1_dst, mousePos);
628 QLineF l1(far2_dst, mousePos);
629 QLineF l2(otherV_dst, near1_dst);
630 l0.intersects(l2, &near1_dst);
631 l1.intersects(l2, &near2_dst);
632
633 srcPoints << far1_src;
634 srcPoints << far2_src;
635 srcPoints << near1_src;
636 srcPoints << near2_src;
637
638 dstPoints << far1_dst;
639 dstPoints << far2_dst;
640 dstPoints << near1_dst;
641 dstPoints << near2_dst;
642
645 Eigen::Matrix3f result =
B *
A.inverse();
646
647 m_d->transformIntoArgs(result);
648 break;
649 }
650 }
651
652 m_d->recalculateTransformations();
653}
#define KIS_ASSERT_RECOVER_RETURN(cond)
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
QPointF toQPointF(const ExpressionType &expr)