commit c91c5cb8e892f1c19c970cef033cc03c9f47f98a
parent b3042abffb9f4e4c7edd16934af99716bcdc2901
Author: Mattias Andrée <maandree@kth.se>
Date: Sun, 2 Jul 2017 17:30:22 +0200
Add mod to blind-arithm
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
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 stream *right, size_t n
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__)