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)))) |