Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_bspline_2d.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_BSPLINE_2D_H
8#define __KIS_BSPLINE_2D_H
9
10#include <kritaimage_export.h>
11
12#include <QScopedPointer>
13#include <QVector>
14#include <QPointF>
15#include <QSize>
16
17#include "kis_bspline.h"
18
19
20namespace KisBSplines {
21
22template <class Spline>
24 ConvertSplineOp(const Spline &spline) : m_spline(spline) {}
25
26 float operator() (float x, float y) const {
27 return m_spline.value(x, y);
28 }
29
30 const Spline &m_spline;
31};
32
33class KRITAIMAGE_EXPORT KisBSpline2D
34{
35public:
36 KisBSpline2D(float xStart, float xEnd, int numSamplesX, BorderCondition bcX,
37 float yStart, float yEnd, int numSamplesY, BorderCondition bcY);
38
40
41 template <class Spline>
42 static inline KisBSpline2D* createResampledSpline(const Spline &other, int xSamples, int ySamples) {
43 QPointF tl = other.topLeft();
44 QPointF br = other.bottomRight();
45
46 KisBSpline2D *newSpline =
47 new KisBSpline2D(tl.x(), br.x(), xSamples, other.borderConditionX(),
48 tl.y(), br.y(), ySamples, other.borderConditionY());
49
51 newSpline->initializeSpline(op);
52
53 return newSpline;
54 }
55
56 template <class FunctionOp>
57 inline void initializeSpline(const FunctionOp &op) {
58
59 float xStep = (m_xEnd - m_xStart) / (m_numSamplesX - 1);
60 float yStep = (m_yEnd - m_yStart) / (m_numSamplesY - 1);
61
62 QVector<float> values(m_numSamplesX * m_numSamplesY);
63
64 for (int x = 0; x < m_numSamplesX; x++) {
65 float fx = m_xStart + xStep * x;
66
67 for (int y = 0; y < m_numSamplesY; y++) {
68 float fy = m_yStart + yStep * y;
69 float v = op(fx, fy);
70 values[x * m_numSamplesY + y] = v;
71 }
72 }
73
74 initializeSplineImpl(values);
75 }
76
77 float value(float x, float y) const;
78
79 inline QPointF topLeft() const {
80 return QPointF(m_xStart, m_yStart);
81 }
82
83 inline QPointF bottomRight() const {
84 return QPointF(m_xEnd, m_yEnd);
85 }
86
87 BorderCondition borderConditionX() const;
88 BorderCondition borderConditionY() const;
89
90private:
91 void initializeSplineImpl(const QVector<float> &values);
92
93private:
94 struct Private;
95 const QScopedPointer<Private> m_d;
96
101 float m_xStart;
102 float m_xEnd;
104
105 float m_yStart;
106 float m_yEnd;
108};
109
110}
111
112#endif /* __KIS_BSPLINE_2D_H */
float value(const T *src, size_t ch)
qreal v
ConvertSplineOp(const Spline &spline)
float operator()(float x, float y) const
static KisBSpline2D * createResampledSpline(const Spline &other, int xSamples, int ySamples)
QPointF bottomRight() const
const QScopedPointer< Private > m_d
void initializeSpline(const FunctionOp &op)