doxygen: add newline after \file
[blender.git] / source / blender / blenlib / intern / math_base_inline.c
index 2f5b0f4..1ad0dc6 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  *
  * The Original Code is: some of this file.
  *
- * ***** END GPL LICENSE BLOCK *****
  * */
 
-/** \file blender/blenlib/intern/math_base_inline.c
- *  \ingroup bli
+/** \file
+ * \ingroup bli
  */
 
 #ifndef __MATH_BASE_INLINE_C__
@@ -324,10 +321,31 @@ MINLINE size_t max_zz(size_t a, size_t b)
        return (b < a) ? a : b;
 }
 
+MINLINE int clamp_i(int value, int min, int max)
+{
+       return min_ii(max_ii(value, min), max);
+}
+
+MINLINE float clamp_f(float value, float min, float max)
+{
+       if (value > max) {
+               return max;
+       }
+       else if (value < min) {
+               return min;
+       }
+       return value;
+}
+
+MINLINE size_t clamp_z(size_t value, size_t min, size_t max)
+{
+       return min_zz(max_zz(value, min), max);
+}
+
 /**
  * Almost-equal for IEEE floats, using absolute difference method.
  *
- * \param max_diff the maximum absolute difference.
+ * \param max_diff: the maximum absolute difference.
  */
 MINLINE int compare_ff(float a, float b, const float max_diff)
 {
@@ -337,9 +355,9 @@ MINLINE int compare_ff(float a, float b, const float max_diff)
 /**
  * Almost-equal for IEEE floats, using their integer representation (mixing ULP and absolute difference methods).
  *
- * \param max_diff is the maximum absolute difference (allows to take care of the near-zero area,
+ * \param max_diff: is the maximum absolute difference (allows to take care of the near-zero area,
  *                 where relative difference methods cannot really work).
- * \param max_ulps is the 'maximum number of floats + 1' allowed between \a a and \a b to consider them equal.
+ * \param max_ulps: is the 'maximum number of floats + 1' allowed between \a a and \a b to consider them equal.
  *
  * \see https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
  */
@@ -347,10 +365,8 @@ MINLINE int compare_ff_relative(float a, float b, const float max_diff, const in
 {
        union {float f; int i;} ua, ub;
 
-#if 0  /* No BLI_assert in INLINE :/ */
        BLI_assert(sizeof(float) == sizeof(int));
        BLI_assert(max_ulps < (1 << 22));
-#endif
 
        if (fabsf(a - b) <= max_diff) {
                return 1;
@@ -454,7 +470,7 @@ MALWAYS_INLINE __m128 _bli_math_fastpow24(const __m128 arg)
         */
        /* 0x3F4CCCCD = 4/5 */
        /* 0x4F55A7FB = 2^(127/(4/5) - 127) * 0.994^(1/(4/5)) */
-       /* error max = 0.17     avg = 0.0018    |avg| = 0.05 */
+       /* error max = 0.17, avg = 0.0018, |avg| = 0.05 */
        __m128 x = _bli_math_fastpow(0x3F4CCCCD, 0x4F55A7FB, arg);
        __m128 arg2 = _mm_mul_ps(arg, arg);
        __m128 arg4 = _mm_mul_ps(arg2, arg2);
@@ -496,4 +512,35 @@ MALWAYS_INLINE __m128 _bli_math_blend_sse(const __m128 mask,
 
 #endif  /* __SSE2__ */
 
+/* Low level conversion functions */
+MINLINE unsigned char unit_float_to_uchar_clamp(float val)
+{
+       return (unsigned char)(((val <= 0.0f) ? 0 : ((val > (1.0f - 0.5f / 255.0f)) ? 255 : ((255.0f * val) + 0.5f))));
+}
+#define unit_float_to_uchar_clamp(val) ((CHECK_TYPE_INLINE(val, float)), unit_float_to_uchar_clamp(val))
+
+MINLINE unsigned short unit_float_to_ushort_clamp(float val)
+{
+       return (unsigned short)((val >= 1.0f - 0.5f / 65535) ? 65535 : (val <= 0.0f) ? 0 : (val * 65535.0f + 0.5f));
+}
+#define unit_float_to_ushort_clamp(val) ((CHECK_TYPE_INLINE(val, float)), unit_float_to_ushort_clamp(val))
+
+MINLINE unsigned char unit_ushort_to_uchar(unsigned short val)
+{
+       return (unsigned char)(((val) >= 65535 - 128) ? 255 : ((val) + 128) >> 8);
+}
+#define unit_ushort_to_uchar(val) ((CHECK_TYPE_INLINE(val, unsigned short)), unit_ushort_to_uchar(val))
+
+#define unit_float_to_uchar_clamp_v3(v1, v2) {                                              \
+       (v1)[0] = unit_float_to_uchar_clamp((v2[0]));                                           \
+       (v1)[1] = unit_float_to_uchar_clamp((v2[1]));                                           \
+       (v1)[2] = unit_float_to_uchar_clamp((v2[2]));                                           \
+} ((void)0)
+#define unit_float_to_uchar_clamp_v4(v1, v2) {                                              \
+       (v1)[0] = unit_float_to_uchar_clamp((v2[0]));                                           \
+       (v1)[1] = unit_float_to_uchar_clamp((v2[1]));                                           \
+       (v1)[2] = unit_float_to_uchar_clamp((v2[2]));                                           \
+       (v1)[3] = unit_float_to_uchar_clamp((v2[3]));                                           \
+} ((void)0)
+
 #endif /* __MATH_BASE_INLINE_C__ */