Blender
V5.0
source
blender
freestyle
intern
image
GaussianFilter.cpp
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2008-2022 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10
#include <cstdlib>
11
12
#include "
GaussianFilter.h
"
13
14
#include "
BLI_math_base.h
"
15
16
namespace
Freestyle
{
17
18
GaussianFilter::GaussianFilter
(
float
iSigma)
19
{
20
_sigma
= iSigma;
21
_mask
=
nullptr
;
22
computeMask
();
23
}
24
25
GaussianFilter::GaussianFilter
(
const
GaussianFilter
&iBrother)
26
{
27
_sigma
= iBrother.
_sigma
;
28
_maskSize
= iBrother.
_maskSize
;
29
_bound
= iBrother.
_bound
;
30
_storedMaskSize
= iBrother.
_storedMaskSize
;
31
_mask
=
new
float
[
_maskSize
*
_maskSize
];
32
memcpy(
_mask
, iBrother.
_mask
,
_maskSize
*
_maskSize
*
sizeof
(
float
));
33
}
34
35
GaussianFilter
&
GaussianFilter::operator=
(
const
GaussianFilter
&iBrother)
36
{
37
_sigma
= iBrother.
_sigma
;
38
_maskSize
= iBrother.
_maskSize
;
39
_bound
= iBrother.
_bound
;
40
_storedMaskSize
= iBrother.
_storedMaskSize
;
41
_mask
=
new
float
[
_storedMaskSize
*
_storedMaskSize
];
42
memcpy(
_mask
, iBrother.
_mask
,
_storedMaskSize
*
_storedMaskSize
*
sizeof
(
float
));
43
return
*
this
;
44
}
45
46
GaussianFilter::~GaussianFilter
()
47
{
48
delete
[]
_mask
;
49
}
50
51
int
GaussianFilter::computeMaskSize
(
float
sigma
)
52
{
53
int
maskSize
= int(
floor
(4 *
sigma
)) + 1;
54
if
(0 == (
maskSize
% 2)) {
55
++
maskSize
;
56
}
57
58
return
maskSize
;
59
}
60
61
void
GaussianFilter::setSigma
(
float
sigma
)
62
{
63
_sigma
=
sigma
;
64
computeMask
();
65
}
66
67
void
GaussianFilter::computeMask
()
68
{
69
delete
[]
_mask
;
70
71
_maskSize
=
computeMaskSize
(
_sigma
);
72
_storedMaskSize
= (
_maskSize
+ 1) >> 1;
73
_bound
=
_storedMaskSize
- 1;
74
75
float
norm
=
_sigma
*
_sigma
* 2.0f *
M_PI
;
76
float
invNorm = 1.0f /
norm
;
77
_mask
=
new
float
[
_storedMaskSize
*
_storedMaskSize
*
sizeof
(
float
)];
78
for
(
int
i
= 0;
i
<
_storedMaskSize
; ++
i
) {
79
for
(
int
j = 0; j <
_storedMaskSize
; ++j) {
80
#if 0
81
_mask
[
i
*
_storedMaskSize
+ j] =
exp
(-(
i
*
i
+ j * j) / (2.0 *
_sigma
*
_sigma
));
82
#else
83
_mask
[
i
*
_storedMaskSize
+ j] = invNorm *
exp
(-(
i
*
i
+ j * j) / (2.0 *
_sigma
*
_sigma
));
84
#endif
85
}
86
}
87
}
88
89
}
/* namespace Freestyle */
BLI_math_base.h
M_PI
#define M_PI
Definition
BLI_math_constants.h:21
GaussianFilter.h
Class to perform gaussian filtering operations on an image.
norm
SIMD_FORCE_INLINE btScalar norm() const
Return the norm (length) of the vector.
Definition
btVector3.h:263
Freestyle::GaussianFilter::_mask
float * _mask
Definition
GaussianFilter.h:30
Freestyle::GaussianFilter::~GaussianFilter
virtual ~GaussianFilter()
Definition
GaussianFilter.cpp:46
Freestyle::GaussianFilter::GaussianFilter
GaussianFilter(float iSigma=1.0f)
Definition
GaussianFilter.cpp:18
Freestyle::GaussianFilter::maskSize
int maskSize() const
Definition
GaussianFilter.h:66
Freestyle::GaussianFilter::computeMaskSize
static int computeMaskSize(float sigma)
Definition
GaussianFilter.cpp:51
Freestyle::GaussianFilter::computeMask
void computeMask()
Definition
GaussianFilter.cpp:67
Freestyle::GaussianFilter::operator=
GaussianFilter & operator=(const GaussianFilter &)
Definition
GaussianFilter.cpp:35
Freestyle::GaussianFilter::_bound
int _bound
Definition
GaussianFilter.h:31
Freestyle::GaussianFilter::_maskSize
int _maskSize
Definition
GaussianFilter.h:34
Freestyle::GaussianFilter::sigma
float sigma() const
Definition
GaussianFilter.h:61
Freestyle::GaussianFilter::_storedMaskSize
int _storedMaskSize
Definition
GaussianFilter.h:35
Freestyle::GaussianFilter::_sigma
float _sigma
Definition
GaussianFilter.h:29
Freestyle::GaussianFilter::setSigma
void setSigma(float sigma)
Definition
GaussianFilter.cpp:61
float
nullptr float
Definition
closures_template.h:123
exp
#define exp
Definition
gpu_shader_cxx_builtin.hh:107
floor
#define floor
Definition
gpu_shader_cxx_builtin.hh:109
Freestyle
inherits from class Rep
Definition
AppCanvas.cpp:20
i
i
Definition
text_draw.cc:230
Generated on
for Blender by
doxygen
1.16.1