Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBSplines::KisBSpline2D Class Reference

#include <kis_bspline_2d.h>

+ Inheritance diagram for KisBSplines::KisBSpline2D:

Public Member Functions

BorderCondition borderConditionX () const
 
BorderCondition borderConditionY () const
 
QPointF bottomRight () const
 
template<class FunctionOp >
void initializeSpline (const FunctionOp &op)
 
 KisBSpline2D (float xStart, float xEnd, int numSamplesX, BorderCondition bcX, float yStart, float yEnd, int numSamplesY, BorderCondition bcY)
 
QPointF topLeft () const
 
float value (float x, float y) const
 
 ~KisBSpline2D ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Static Public Member Functions

template<class Spline >
static KisBSpline2DcreateResampledSpline (const Spline &other, int xSamples, int ySamples)
 

Public Attributes

BorderCondition bcX
 
BorderCondition bcY
 
UBspline_2d_sspline
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Member Functions

void initializeSplineImpl (const QVector< float > &values)
 

Private Attributes

const QScopedPointer< Privatem_d
 
int m_numSamplesX
 
int m_numSamplesY
 
float m_xEnd
 
float m_xStart
 
float m_yEnd
 
float m_yStart
 

Detailed Description

Definition at line 19 of file kis_bspline_2d.cpp.

Constructor & Destructor Documentation

◆ KisBSpline2D()

KisBSplines::KisBSpline2D::KisBSpline2D ( float xStart,
float xEnd,
int numSamplesX,
BorderCondition bcX,
float yStart,
float yEnd,
int numSamplesY,
BorderCondition bcY )

Definition at line 27 of file kis_bspline_2d.cpp.

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}
const QScopedPointer< Private > m_d

References bcX, bcY, m_d, m_numSamplesX, m_numSamplesY, m_xEnd, m_xStart, m_yEnd, and m_yStart.

◆ ~KisBSpline2D()

KisBSplines::KisBSpline2D::~KisBSpline2D ( )

Definition at line 45 of file kis_bspline_2d.cpp.

46{
47 if (m_d->spline) {
48 destroy_Bspline(m_d->spline);
49 }
50}
void destroy_Bspline(void *spline)

References destroy_Bspline(), and m_d.

Member Function Documentation

◆ borderConditionX()

BorderCondition KisBSplines::KisBSpline2D::borderConditionX ( ) const

Definition at line 108 of file kis_bspline_2d.cpp.

109{
110 return m_d->bcX;
111}

References m_d.

◆ borderConditionY()

BorderCondition KisBSplines::KisBSpline2D::borderConditionY ( ) const

Definition at line 113 of file kis_bspline_2d.cpp.

114{
115 return m_d->bcY;
116}

References m_d.

◆ bottomRight()

QPointF KisBSplines::KisBSpline2D::bottomRight ( ) const
inline

Definition at line 83 of file kis_bspline_2d.h.

83 {
84 return QPointF(m_xEnd, m_yEnd);
85 }

◆ createResampledSpline()

template<class Spline >
static KisBSpline2D * KisBSplines::KisBSpline2D::createResampledSpline ( const Spline & other,
int xSamples,
int ySamples )
inlinestatic

Definition at line 42 of file kis_bspline_2d.h.

42 {
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
50 ConvertSplineOp<Spline> op(other);
51 newSpline->initializeSpline(op);
52
53 return newSpline;
54 }
KisBSpline2D(float xStart, float xEnd, int numSamplesX, BorderCondition bcX, float yStart, float yEnd, int numSamplesY, BorderCondition bcY)

References initializeSpline(), and topLeft().

◆ initializeSpline()

template<class FunctionOp >
void KisBSplines::KisBSpline2D::initializeSpline ( const FunctionOp & op)
inline

Definition at line 57 of file kis_bspline_2d.h.

57 {
58
59 float xStep = (m_xEnd - m_xStart) / (m_numSamplesX - 1);
60 float yStep = (m_yEnd - m_yStart) / (m_numSamplesY - 1);
61
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
75 }
qreal v
void initializeSplineImpl(const QVector< float > &values)

References v.

◆ initializeSplineImpl()

void KisBSplines::KisBSpline2D::initializeSplineImpl ( const QVector< float > & values)
private

Definition at line 52 of file kis_bspline_2d.cpp.

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}
UBspline_2d_s * create_UBspline_2d_s(Ugrid x_grid, Ugrid y_grid, BCtype_s xBC, BCtype_s yBC, float *data)
bc_code convertBorderType(BorderCondition v)
float lVal
float rVal
bc_code lCode
bc_code rCode
double end
double delta
double start
double delta_inv
int num

References KisBSplines::convertBorderType(), create_UBspline_2d_s(), Ugrid::delta, Ugrid::delta_inv, Ugrid::end, BCtype_s::lCode, BCtype_s::lVal, m_d, m_numSamplesX, m_numSamplesY, m_xEnd, m_xStart, m_yEnd, m_yStart, Ugrid::num, BCtype_s::rCode, BCtype_s::rVal, and Ugrid::start.

◆ topLeft()

QPointF KisBSplines::KisBSpline2D::topLeft ( ) const
inline

Definition at line 79 of file kis_bspline_2d.h.

79 {
80 return QPointF(m_xStart, m_yStart);
81 }

◆ value()

float KisBSplines::KisBSpline2D::value ( float x,
float y ) const

The spline works for an open interval only, so include the last point explicitly

Definition at line 84 of file kis_bspline_2d.cpp.

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}
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
float value(float x, float y) const

References eval_UBspline_2d_s(), KIS_ASSERT_RECOVER_NOOP, m_d, m_xEnd, m_xStart, m_yEnd, m_yStart, and value().

Member Data Documentation

◆ bcX

BorderCondition KisBSplines::KisBSpline2D::bcX

Definition at line 21 of file kis_bspline_2d.cpp.

◆ bcY

BorderCondition KisBSplines::KisBSpline2D::bcY

Definition at line 22 of file kis_bspline_2d.cpp.

◆ m_d

const QScopedPointer<Private> KisBSplines::KisBSpline2D::m_d
private

Definition at line 95 of file kis_bspline_2d.h.

◆ m_numSamplesX

int KisBSplines::KisBSpline2D::m_numSamplesX
private

Definition at line 103 of file kis_bspline_2d.h.

◆ m_numSamplesY

int KisBSplines::KisBSpline2D::m_numSamplesY
private

Definition at line 107 of file kis_bspline_2d.h.

◆ m_xEnd

float KisBSplines::KisBSpline2D::m_xEnd
private

Definition at line 102 of file kis_bspline_2d.h.

◆ m_xStart

float KisBSplines::KisBSpline2D::m_xStart
private

We need to store them separately, because they should be accessible from the templated part

Definition at line 101 of file kis_bspline_2d.h.

◆ m_yEnd

float KisBSplines::KisBSpline2D::m_yEnd
private

Definition at line 106 of file kis_bspline_2d.h.

◆ m_yStart

float KisBSplines::KisBSpline2D::m_yStart
private

Definition at line 105 of file kis_bspline_2d.h.

◆ spline

UBspline_2d_s* KisBSplines::KisBSpline2D::spline

Definition at line 24 of file kis_bspline_2d.cpp.


The documentation for this class was generated from the following files: