video-math.h - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) 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, A),\
90 GENERIC(float, FUNC##f, A)))
91
92 #define MATH_GENERIC_N(FUNC, A, ...) (_Generic((A),\
93 GENERIC(double, FUNC, A, __VA_ARGS__),\
94 GENERIC(float, FUNC##f, A, __VA_ARGS__)))
95
96 #define BLIND_GENERIC_1(FUNC, A) (_Generic((A),\
97 GENERIC(double, FUNC##_d, A),\
98 GENERIC(float, FUNC##_f, A)))
99
100 #define BLIND_GENERIC_N(FUNC, A, ...) (_Generic((A),\
101 GENERIC(double, FUNC##_d, A, __VA_ARGS__), \
102 GENERIC(float, FUNC##_f, A, __VA_ARGS__)))
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 *)(e), (void *)(f))
128 #define srgb_to_yuv(a, b, c, d, e, f)\
129 BLIND_GENERIC_N(srgb_to_yuv, (a), (b), (c), (void *)(d), (void *)(e), (void *)(f))
130 #define ciexyz_to_srgb(a, b, c, d, e, f)\
131 BLIND_GENERIC_N(ciexyz_to_srgb, (a), (b), (c), (void *)(d), (void *)(e), (void *)(f))
132 #define srgb_to_ciexyz(a, b, c, d, e, f)\
133 BLIND_GENERIC_N(srgb_to_ciexyz, (a), (b), (c), (void *)(d), (void *)(e), (void *)(f))
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), (void *)(e), (void *)(f))
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), (void *)(e), (void *)(f))
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))))