]> git.sesse.net Git - kdenlive/blob - src/beziercurve/bpoint.cpp
Bezier Spline: Allow to link the handles of a point. They will then always remain...
[kdenlive] / src / beziercurve / bpoint.cpp
1 /***************************************************************************
2  *   Copyright (C) 2011 by Till Theato (root@ttill.de)                     *
3  *   This file is part of Kdenlive (www.kdenlive.org).                     *
4  *                                                                         *
5  *   Kdenlive is free software: you can redistribute it and/or modify      *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation, either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   Kdenlive is distributed in the hope that it will be useful,           *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with Kdenlive.  If not, see <http://www.gnu.org/licenses/>.     *
17  ***************************************************************************/
18
19 #include "bpoint.h"
20
21
22 BPoint::BPoint() :
23         h1(QPointF(-1, -1)),
24         p(QPointF(-1, -1)),
25         h2(QPointF(-1, -1)),
26         handlesLinked(true)
27 {
28 }
29
30 BPoint::BPoint(QPointF handle1, QPointF point, QPointF handle2) :
31         h1(handle1),
32         p(point),
33         h2(handle2)
34 {
35     autoSetLinked();
36 }
37
38 bool BPoint::operator==(const BPoint& point) const
39 {
40     return      point.h1 == h1 &&
41                 point.p  == p  &&
42                 point.h2 == h2;
43 }
44
45 void BPoint::setP(QPointF point, bool updateHandles)
46 {
47     QPointF offset = point - p;
48     p = point;
49     if (updateHandles) {
50         h1 += offset;
51         h2 += offset;
52     }
53 }
54
55 void BPoint::setH1(QPointF handle1)
56 {
57     h1 = handle1;
58     if (handlesLinked) {
59         qreal angle = QLineF(h1, p).angle();
60         QLineF l = QLineF(p, h2);
61         l.setAngle(angle);
62         h2 = l.p2();
63     }    
64 }
65
66 void BPoint::setH2(QPointF handle2)
67 {
68     h2 = handle2;
69     if (handlesLinked) {
70         qreal angle = QLineF(h2, p).angle();
71         QLineF l = QLineF(p, h1);
72         l.setAngle(angle);
73         h1 = l.p2();
74     }
75 }
76
77 void BPoint::keepInRange(qreal xMin, qreal xMax)
78 {
79 }
80
81 void BPoint::autoSetLinked()
82 {
83     handlesLinked = !QLineF(h1, p).angleTo(QLineF(p, h2));
84 }