summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qbezier_p.h
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2019-08-15 10:59:23 +0200
committerMarc Mutz <marc.mutz@kdab.com>2019-08-22 11:41:31 +0200
commita4d19654edec88b5ca0a2516c1b2038ad309ca6d (patch)
tree221ef364643aafe4437efecb56886cef950979ab /src/gui/painting/qbezier_p.h
parenta52a3b2aa43870e9b9b76cf628e5e666d7ecc457 (diff)
Simplify QBezier::split()
Now that result objects can't alias source ones anymore, the order of writes no longer matters, and we can clean this function up. The pattern of the algorithm now becomes visible. Before, it was just drowing in noise. Change-Id: I36c55ce09d6e13a994c7eda17d96cfe960e7fb95 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io> Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/gui/painting/qbezier_p.h')
-rw-r--r--src/gui/painting/qbezier_p.h36
1 files changed, 13 insertions, 23 deletions
diff --git a/src/gui/painting/qbezier_p.h b/src/gui/painting/qbezier_p.h
index 02b29c5ba7..1c49f82416 100644
--- a/src/gui/painting/qbezier_p.h
+++ b/src/gui/painting/qbezier_p.h
@@ -225,29 +225,19 @@ inline QPointF QBezier::secondDerivedAt(qreal t) const
std::pair<QBezier, QBezier> QBezier::split() const
{
- std::pair<QBezier, QBezier> r;
- auto firstHalf = &r.first;
- auto secondHalf = &r.second;
-
- qreal c = (x2 + x3)*.5;
- firstHalf->x2 = (x1 + x2)*.5;
- secondHalf->x3 = (x3 + x4)*.5;
- firstHalf->x1 = x1;
- secondHalf->x4 = x4;
- firstHalf->x3 = (firstHalf->x2 + c)*.5;
- secondHalf->x2 = (secondHalf->x3 + c)*.5;
- firstHalf->x4 = secondHalf->x1 = (firstHalf->x3 + secondHalf->x2)*.5;
-
- c = (y2 + y3)/2;
- firstHalf->y2 = (y1 + y2)*.5;
- secondHalf->y3 = (y3 + y4)*.5;
- firstHalf->y1 = y1;
- secondHalf->y4 = y4;
- firstHalf->y3 = (firstHalf->y2 + c)*.5;
- secondHalf->y2 = (secondHalf->y3 + c)*.5;
- firstHalf->y4 = secondHalf->y1 = (firstHalf->y3 + secondHalf->y2)*.5;
-
- return r;
+ const auto mid = [](QPointF lhs, QPointF rhs) { return (lhs + rhs) * .5; };
+
+ const QPointF mid_12 = mid(pt1(), pt2());
+ const QPointF mid_23 = mid(pt2(), pt3());
+ const QPointF mid_34 = mid(pt3(), pt4());
+ const QPointF mid_12_23 = mid(mid_12, mid_23);
+ const QPointF mid_23_34 = mid(mid_23, mid_34);
+ const QPointF mid_12_23__23_34 = mid(mid_12_23, mid_23_34);
+
+ return {
+ fromPoints(pt1(), mid_12, mid_12_23, mid_12_23__23_34),
+ fromPoints(mid_12_23__23_34, mid_23_34, mid_34, pt4()),
+ };
}
inline void QBezier::parameterSplitLeft(qreal t, QBezier *left)