Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_nu_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_nu_bspline_2d.h"
8
9#include <kis_debug.h>
10#include <limits>
11
14
15#include "kis_bspline_p.h"
16
17namespace KisBSplines {
18
34
36 const QVector<double> &ySamples, BorderCondition bcY)
37 : m_d(new Private),
38 m_xSamples(xSamples),
39 m_ySamples(ySamples)
40{
41 m_d->xGrid = create_general_grid(const_cast<double*>(m_xSamples.constData()), m_xSamples.size());
42 m_d->yGrid = create_general_grid(const_cast<double*>(m_ySamples.constData()), m_ySamples.size());
43
44 m_d->bcX = bcX;
45 m_d->bcY = bcY;
46
47 m_d->minX = xSamples.first();
48 m_d->maxX = xSamples.last();
49
50 m_d->minY = ySamples.first();
51 m_d->maxY = ySamples.last();
52
53 m_d->spline = 0;
54}
55
57{
58 if (m_d->spline) {
59 destroy_Bspline(m_d->spline);
60 }
61
62 destroy_grid(m_d->xGrid);
63 destroy_grid(m_d->yGrid);
64}
65
67{
68 BCtype_s bctypeX;
69 bctypeX.lCode = bctypeX.rCode = convertBorderType(m_d->bcX);
70 bctypeX.lVal = bctypeX.rVal = 0.0;
71
72 BCtype_s bctypeY;
73 bctypeY.lCode = bctypeY.rCode = convertBorderType(m_d->bcY);
74 bctypeY.lVal = bctypeY.rVal = 0.0;
75
76 m_d->spline =
77 create_NUBspline_2d_s(m_d->xGrid, m_d->yGrid,
78 bctypeX, bctypeY,
79 const_cast<float*>(values.constData()));
80}
81
82float KisNUBSpline2D::value(float x, float y) const
83{
89 if (x == m_d->maxX) {
90 x -= x * std::numeric_limits<float>::epsilon();
91 }
92
93 if (y == m_d->maxY) {
94 y -= y * std::numeric_limits<float>::epsilon();
95 }
96
97 KIS_ASSERT_RECOVER_NOOP(x >= m_d->minX && x < m_d->maxX);
98 KIS_ASSERT_RECOVER_NOOP(y >= m_d->minY && y < m_d->maxY);
99
100 float value;
101 eval_NUBspline_2d_s(m_d->spline, x, y, &value);
102
103 return value;
104}
105
107{
108 return QPointF(m_d->minX, m_d->minY);
109}
110
112{
113 return QPointF(m_d->maxX, m_d->maxY);
114}
115
117{
118 return m_d->bcX;
119}
120
122{
123 return m_d->bcY;
124}
125
126}
void destroy_Bspline(void *spline)
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
bc_code convertBorderType(BorderCondition v)
NUBspline_2d_s * create_NUBspline_2d_s(NUgrid *x_grid, NUgrid *y_grid, BCtype_s xBC, BCtype_s yBC, float *data)
NUgrid * create_general_grid(double *points, int num_points)
Definition nugrid.cpp:155
void eval_NUBspline_2d_s(NUBspline_2d_s *restrict spline, double x, double y, float *restrict val)
void destroy_grid(NUgrid *grid)
Definition nugrid.cpp:173
float lVal
float rVal
bc_code lCode
bc_code rCode
const QVector< double > m_xSamples
KisNUBSpline2D(const QVector< double > &xSamples, BorderCondition bcX, const QVector< double > &ySamples, BorderCondition bcY)
const QVector< double > m_ySamples
BorderCondition borderConditionY() const
const QScopedPointer< Private > m_d
float value(float x, float y) const
BorderCondition borderConditionX() const
void initializeSplineImpl(const QVector< float > &values)