git subrepo clone https://github.com/libretro/libretro-common.git deps/libretro-common
[pcsx_rearmed.git] / deps / libretro-common / include / filters.h
CommitLineData
3719602c
PC
1/* Copyright (C) 2010-2020 The RetroArch team
2 *
3 * ---------------------------------------------------------------------------------------
4 * The following license statement only applies to this file (filters.h).
5 * ---------------------------------------------------------------------------------------
6 *
7 * Permission is hereby granted, free of charge,
8 * to any person obtaining a copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
11 * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 */
22
23#ifndef _LIBRETRO_SDK_FILTERS_H
24#define _LIBRETRO_SDK_FILTERS_H
25
26/* for MSVC; should be benign under any circumstances */
27#define _USE_MATH_DEFINES
28
29#include <stdlib.h>
30#include <math.h>
31#include <retro_inline.h>
32#include <retro_math.h>
33
34/**
35 * sinc:
36 *
37 * Pure function.
38 **/
39static INLINE double sinc(double val)
40{
41 if (fabs(val) < 0.00001)
42 return 1.0;
43 return sin(val) / val;
44}
45
46/**
47 * paeth:
48 *
49 * Pure function.
50 * Paeth prediction filter.
51 **/
52static INLINE int paeth(int a, int b, int c)
53{
54 int p = a + b - c;
55 int pa = abs(p - a);
56 int pb = abs(p - b);
57 int pc = abs(p - c);
58
59 if (pa <= pb && pa <= pc)
60 return a;
61 else if (pb <= pc)
62 return b;
63 return c;
64}
65
66/**
67 * besseli0:
68 *
69 * Pure function.
70 *
71 * Modified Bessel function of first order.
72 * Check Wiki for mathematical definition ...
73 **/
74static INLINE double besseli0(double x)
75{
76 int i;
77 double sum = 0.0;
78 double factorial = 1.0;
79 double factorial_mult = 0.0;
80 double x_pow = 1.0;
81 double two_div_pow = 1.0;
82 double x_sqr = x * x;
83
84 /* Approximate. This is an infinite sum.
85 * Luckily, it converges rather fast. */
86 for (i = 0; i < 18; i++)
87 {
88 sum += x_pow * two_div_pow / (factorial * factorial);
89 factorial_mult += 1.0;
90 x_pow *= x_sqr;
91 two_div_pow *= 0.25;
92 factorial *= factorial_mult;
93 }
94
95 return sum;
96}
97
98static INLINE double kaiser_window_function(double index, double beta)
99{
100 return besseli0(beta * sqrtf(1 - index * index));
101}
102
103#endif