Add mod to blind-arithm - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c91c5cb8e892f1c19c970cef033cc03c9f47f98a | |
parent b3042abffb9f4e4c7edd16934af99716bcdc2901 | |
Author: Mattias Andrée <[email protected]> | |
Date: Sun, 2 Jul 2017 17:30:22 +0200 | |
Add mod to blind-arithm | |
Signed-off-by: Mattias Andrée <[email protected]> | |
Diffstat: | |
M man/blind-arithm.1 | 4 ++++ | |
M src/blind-arithm.c | 1 + | |
M src/video-math.h | 16 ++++++++++++++++ | |
3 files changed, 21 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/man/blind-arithm.1 b/man/blind-arithm.1 | |
@@ -41,6 +41,10 @@ Calculate the product of the operands. | |
.B div | |
Divide the left-hand operand by the right-hand operand. | |
.TP | |
+.B mod | |
+Calculate the modulus of left-hand operand and the right-hand operand. | |
+The result is always non-negative. | |
+.TP | |
.B exp | |
Raise the left-hand operand to the | |
.IR n th | |
diff --git a/src/blind-arithm.c b/src/blind-arithm.c | |
@@ -16,6 +16,7 @@ typedef void (*process_func)(struct stream *left, struct stre… | |
X(sub, *lh -= rh, PIXFMT, TYPE)\ | |
X(mul, *lh *= rh, PIXFMT, TYPE)\ | |
X(div, *lh /= rh, PIXFMT, TYPE)\ | |
+ X(mod, *lh = posmod(*lh, rh), PIXFMT, TYPE)\ | |
X(exp, *lh = pow(*lh, rh), PIXFMT, TYPE)\ | |
X(log, *lh = log2(*lh) / log2(rh), PIXFMT, TYPE)\ | |
X(min, *lh = MIN(*lh, rh), PIXFMT, TYPE)\ | |
diff --git a/src/video-math.h b/src/video-math.h | |
@@ -17,6 +17,20 @@ nnpowf(float a, float b) | |
return neg ? -a : a; | |
} | |
+static inline double | |
+posmod(double a, double b) | |
+{ | |
+ double x = fmod(a, b); | |
+ return x < 0 ? x + b : x; | |
+} | |
+ | |
+static inline float | |
+posmodf(float a, float b) | |
+{ | |
+ float x = fmodf(a, b); | |
+ return x < 0 ? x + b : x; | |
+} | |
+ | |
#define GENERIC(TYPE, FUNC, ...)\ | |
TYPE: FUNC(__VA_ARGS__),\ | |
TYPE *: FUNC(__VA_ARGS__),\ | |
@@ -52,6 +66,8 @@ nnpowf(float a, float b) | |
#define g_isinf(...) MATH_GENERIC_1(isinf, __VA_ARGS__) | |
#define g_isfinite(...) MATH_GENERIC_1(isfinite, __VA_ARGS__) | |
#define nnpow(...) MATH_GENERIC_N(nnpow, __VA_ARGS__) | |
+#define mod(...) MATH_GENERIC_N(fmod, __VA_ARGS__) | |
+#define posmod(...) MATH_GENERIC_N(posmod, __VA_ARGS__) | |
#define srgb_encode(...) BLIND_GENERIC_1(srgb_encode, __VA_ARGS__) | |
#define srgb_decode(...) BLIND_GENERIC_1(srgb_decode, __VA_ARGS__) |