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