Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_bspline_2d.cpp
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#include "kis_bspline_2d.h"
8
9#include <kis_debug.h>
10#include <limits>
11
14
15#include "kis_bspline_p.h"
16
17namespace KisBSplines {
18
26
27KisBSpline2D::KisBSpline2D(float xStart, float xEnd, int numSamplesX, BorderCondition bcX,
28 float yStart, float yEnd, int numSamplesY, BorderCondition bcY)
29 : m_d(new Private)
30{
31 m_xStart = xStart;
32 m_xEnd = xEnd;
33 m_numSamplesX = numSamplesX;
34
35 m_yStart = yStart;
36 m_yEnd = yEnd;
37 m_numSamplesY = numSamplesY;
38
39 m_d->bcX = bcX;
40 m_d->bcY = bcY;
41
42 m_d->spline = 0;
43}
44
46{
47 if (m_d->spline) {
48 destroy_Bspline(m_d->spline);
49 }
50}
51
53{
54 Ugrid xGrid;
55 xGrid.start = m_xStart;
56 xGrid.end = m_xEnd;
57 xGrid.num = m_numSamplesX;
58 xGrid.delta = 0.0;
59 xGrid.delta_inv = 0.0;
60
61 Ugrid yGrid;
62 yGrid.start = m_yStart;
63 yGrid.end = m_yEnd;
64 yGrid.num = m_numSamplesY;
65 yGrid.delta = 0.0;
66 yGrid.delta_inv = 0.0;
67
68 BCtype_s bctypeX;
69 bctypeX.lCode = bctypeX.rCode = convertBorderType(m_d->bcX);
70 bctypeX.lVal = 0.0;
71 bctypeX.rVal = 0.0;
72
73 BCtype_s bctypeY;
74 bctypeY.lCode = bctypeY.rCode = convertBorderType(m_d->bcY);
75 bctypeY.lVal = 0.0;
76 bctypeY.rVal = 0.0;
77
78 m_d->spline =
79 create_UBspline_2d_s(xGrid, yGrid,
80 bctypeX, bctypeY,
81 const_cast<float*>(values.constData()));
82}
83
84float KisBSpline2D::value(float x, float y) const
85{
91 if (x == m_xEnd) {
92 x -= x * std::numeric_limits<float>::epsilon();
93 }
94
95 if (y == m_yEnd) {
96 y -= y * std::numeric_limits<float>::epsilon();
97 }
98
101
102 float value;
103 eval_UBspline_2d_s (m_d->spline, x, y, &value);
104
105 return value;
106}
107
109{
110 return m_d->bcX;
111}
112
114{
115 return m_d->bcY;
116}
117
118}
void destroy_Bspline(void *spline)
UBspline_2d_s * create_UBspline_2d_s(Ugrid x_grid, Ugrid y_grid, BCtype_s xBC, BCtype_s yBC, float *data)
void eval_UBspline_2d_s(UBspline_2d_s *restrict spline, double x, double y, float *restrict val)
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
bc_code convertBorderType(BorderCondition v)
float lVal
float rVal
bc_code lCode
bc_code rCode
void initializeSplineImpl(const QVector< float > &values)
BorderCondition borderConditionY() const
KisBSpline2D(float xStart, float xEnd, int numSamplesX, BorderCondition bcX, float yStart, float yEnd, int numSamplesY, BorderCondition bcY)
BorderCondition borderConditionX() const
float value(float x, float y) const
const QScopedPointer< Private > m_d
double end
double delta
double start
double delta_inv
int num