Introduction
Introduction Statistics Contact Development Disclaimer Help
video-math.h - blind - suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
video-math.h (4992B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <math.h>
3
4 static inline double
5 nnpow_d(double a, double b)
6 {
7 int neg = a < 0;
8 a = pow(neg ? -a : a, b);
9 return neg ? -a : a;
10 }
11
12 static inline float
13 nnpow_f(float a, float b)
14 {
15 int neg = a < 0;
16 a = powf(neg ? -a : a, b);
17 return neg ? -a : a;
18 }
19
20 static inline double
21 posmod_d(double a, double b)
22 {
23 double x = fmod(a, b);
24 return x < 0 ? x + b : x;
25 }
26
27 static inline float
28 posmod_f(float a, float b)
29 {
30 float x = fmodf(a, b);
31 return x < 0 ? x + b : x;
32 }
33
34 static inline double
35 degsin_d(double u)
36 {
37 if (!fmod(u, 90)) {
38 int64_t v = (int64_t)u;
39 v = ((v / 90) % 4 + 4) % 4;
40 return ((double[]){0, 1, 0, -1})[v];
41 }
42 return sin(u * (M_PI / 180));
43 }
44
45 static inline float
46 degsin_f(float u)
47 {
48 if (!fmodf(u, 90)) {
49 int64_t v = (int64_t)u;
50 v = ((v / 90) % 4 + 4) % 4;
51 return ((float[]){0, 1, 0, -1})[v];
52 }
53 return sinf(u * (float)(M_PI / 180));
54 }
55
56 static inline double
57 degcos_d(double u)
58 {
59 if (!fmod(u, 90)) {
60 int64_t v = (int64_t)u;
61 v = ((v / 90) % 4 + 4) % 4;
62 return ((double[]){1, 0, -1, 0})[v];
63 }
64 return cos(u * (M_PI / 180));
65 }
66
67 static inline float
68 degcos_f(float u)
69 {
70 if (!fmodf(u, 90)) {
71 int64_t v = (int64_t)u;
72 v = ((v / 90) % 4 + 4) % 4;
73 return ((float[]){1, 0, -1, 0})[v];
74 }
75 return cosf(u * (float)(M_PI / 180));
76 }
77
78 #define GENERIC(TYPE, FUNC, ...)\
79 TYPE: FUNC(__VA_ARGS__),\
80 TYPE *: FUNC(__VA_ARGS__),\
81 TYPE **: FUNC(__VA_ARGS__),\
82 TYPE ***: FUNC(__VA_ARGS__),\
83 const TYPE: FUNC(__VA_ARGS__),\
84 const TYPE *: FUNC(__VA_ARGS__),\
85 const TYPE **: FUNC(__VA_ARGS__),\
86 const TYPE ***: FUNC(__VA_ARGS__)
87
88 #define MATH_GENERIC_1(FUNC, A) (_Generic((A),\
89 GENERIC(double, FUNC, …
90 GENERIC(float, FUNC##f,…
91
92 #define MATH_GENERIC_N(FUNC, A, ...) (_Generic((A),\
93 GENERIC(double, FUNC, …
94 GENERIC(float, FUNC##f,…
95
96 #define BLIND_GENERIC_1(FUNC, A) (_Generic((A),\
97 GENERIC(double, FUNC##_d…
98 GENERIC(float, FUNC##_f…
99
100 #define BLIND_GENERIC_N(FUNC, A, ...) (_Generic((A),\
101 GENERIC(double, FUNC##_d…
102 GENERIC(float, FUNC##_f…
103
104 #define pow(...) MATH_GENERIC_N(pow, __VA_ARGS__)
105 #define log2(...) MATH_GENERIC_1(log2, __VA_ARGS__)
106 #define log(...) MATH_GENERIC_1(log, __VA_ARGS__)
107 #define abs(...) MATH_GENERIC_1(fabs, __VA_ARGS__)
108 #define sqrt(...) MATH_GENERIC_1(sqrt, __VA_ARGS__)
109 #define exp(...) MATH_GENERIC_1(exp, __VA_ARGS__)
110 #define g_isnan(...) MATH_GENERIC_1(isnan, __VA_ARGS__)
111 #define g_isinf(...) MATH_GENERIC_1(isinf, __VA_ARGS__)
112 #define g_isfinite(...) MATH_GENERIC_1(isfinite, __VA_ARGS__)
113 #define mod(...) MATH_GENERIC_N(fmod, __VA_ARGS__)
114 #define cos(...) MATH_GENERIC_1(cos, __VA_ARGS__)
115 #define sin(...) MATH_GENERIC_1(sin, __VA_ARGS__)
116 #define tan(...) MATH_GENERIC_1(tan, __VA_ARGS__)
117 #define atan2(...) MATH_GENERIC_N(atan2, __VA_ARGS__)
118
119 #define nnpow(...) BLIND_GENERIC_N(nnpow, __VA_ARGS__)
120 #define posmod(...) BLIND_GENERIC_N(posmod, __VA_ARGS__)
121 #define degcos(...) BLIND_GENERIC_1(degcos, __VA_ARGS__)
122 #define degsin(...) BLIND_GENERIC_1(degsin, __VA_ARGS__)
123 #define srgb_encode(...) BLIND_GENERIC_1(srgb_encode, __VA_ARGS__)
124 #define srgb_decode(...) BLIND_GENERIC_1(srgb_decode, __VA_ARGS__)
125
126 #define yuv_to_srgb(a, b, c, d, e, f)\
127 BLIND_GENERIC_N(yuv_to_srgb, (a), (b), (c), (void *)(d), (void *…
128 #define srgb_to_yuv(a, b, c, d, e, f)\
129 BLIND_GENERIC_N(srgb_to_yuv, (a), (b), (c), (void *)(d), (void *…
130 #define ciexyz_to_srgb(a, b, c, d, e, f)\
131 BLIND_GENERIC_N(ciexyz_to_srgb, (a), (b), (c), (void *)(d), (voi…
132 #define srgb_to_ciexyz(a, b, c, d, e, f)\
133 BLIND_GENERIC_N(srgb_to_ciexyz, (a), (b), (c), (void *)(d), (voi…
134 #define scaled_yuv_to_ciexyz(a, b, c, d, e, f)\
135 BLIND_GENERIC_N(scaled_yuv_to_ciexyz, (a), (b), (c), (void *)(d)…
136 #define ciexyz_to_scaled_yuv(a, b, c, d, e, f)\
137 BLIND_GENERIC_N(ciexyz_to_scaled_yuv, (a), (b), (c), (void *)(d)…
138
139 #define htole(A) (_Generic((A),\
140 uint8_t: (A),\
141 int8_t: (uint8_t)(A),\
142 uint16_t: htole16((uint16_t)(A)),\
143 int16_t: (uint16_t)htole16((uint16_t)(A)),\
144 uint32_t: htole32((uint32_t)(A)),\
145 int32_t: (uint32_t)htole32((uint32_t)(A)),\
146 uint64_t: htole64((uint64_t)(A)),\
147 int64_t: (uint64_t)htole64((uint64_t)(A))))
148
149 #define letoh(A) (_Generic((A),\
150 uint8_t: (A),\
151 int8_t: (uint8_t)(A),\
152 uint16_t: le16toh((uint16_t)(A)),\
153 int16_t: (uint16_t)le16toh((uint16_t)(A)),\
154 uint32_t: le32toh((uint32_t)(A)),\
155 int32_t: (uint32_t)le32toh((uint32_t)(A)),\
156 uint64_t: le64toh((uint64_t)(A)),\
157 int64_t: (uint64_t)le64toh((uint64_t)(A))))
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.