Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBezierPatchParamToSourceSampler.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KISBEZIERPATCHPARAMTOSOURCESAMPLER_H
7#define KISBEZIERPATCHPARAMTOSOURCESAMPLER_H
8
9#include "KisBezierPatch.h"
10#include "KisBezierUtils.h"
12
17{
19
21 : patch(_patch)
22 , topLength(KisBezierUtils::curveLength(patch.points[KisBezierPatch::TL], patch.points[KisBezierPatch::TL_HC], patch.points[KisBezierPatch::TR_HC], patch.points[KisBezierPatch::TR], 0.01))
23 , bottomLength(KisBezierUtils::curveLength(patch.points[KisBezierPatch::BL], patch.points[KisBezierPatch::BL_HC], patch.points[KisBezierPatch::BR_HC], patch.points[KisBezierPatch::BR], 0.01))
24 , leftLength(KisBezierUtils::curveLength(patch.points[KisBezierPatch::TL], patch.points[KisBezierPatch::TL_VC], patch.points[KisBezierPatch::BL_VC], patch.points[KisBezierPatch::BL], 0.01))
25 , rightLength(KisBezierUtils::curveLength(patch.points[KisBezierPatch::TR], patch.points[KisBezierPatch::TR_VC], patch.points[KisBezierPatch::BR_VC], patch.points[KisBezierPatch::BR], 0.01))
26 {}
27
29
30 qreal topLength;
32
35
36 Range xRange(qreal xParam) const
37 {
40
41 xCoord1 = patch.originalRect.left() + xCoord1 * patch.originalRect.width();
42 xCoord2 = patch.originalRect.left() + xCoord2 * patch.originalRect.width();
43
44 if (xCoord1 > xCoord2) {
45 std::swap(xCoord1, xCoord2);
46 }
47
48 return {xCoord1, xCoord2};
49 };
50
51 Range yRange(qreal yParam) const
52 {
55
56 yCoord1 = patch.originalRect.top() + yCoord1 * patch.originalRect.height();
57 yCoord2 = patch.originalRect.top() + yCoord2 * patch.originalRect.height();
58
59 if (yCoord1 > yCoord2) {
60 std::swap(yCoord1, yCoord2);
61 }
62
63 return {yCoord1, yCoord2};
64 };
65
66 QPointF point(qreal xParam, qreal yParam) const
67 {
69
70 const Range xRange = this->xRange(xParam);
71 const Range yRange = this->yRange(yParam);
72
73 return QPointF(lerp(xRange.start, xRange.end, yParam),
74 lerp(yRange.start, yRange.end, xParam));
75 }
76
77 QPointF point(const QPointF &pt) const {
78 return point(pt.x(), pt.y());
79 }
80};
81
82#endif // KISBEZIERPATCHPARAMTOSOURCESAMPLER_H
QPointF lerp(const QPointF &p1, const QPointF &p2, qreal t)
std::array< QPointF, 12 > points
Point lerp(const Point &pt1, const Point &pt2, qreal t)
qreal curveLengthAtPoint(const QPointF p0, const QPointF p1, const QPointF p2, const QPointF p3, qreal t, const qreal error)
QPointF point(qreal xParam, qreal yParam) const
KisBezierPatchParamToSourceSampler(const KisBezierPatch &_patch)