doxygen: add newline after \file
[blender.git] / source / blender / blenlib / intern / math_base_inline.c
index 144198f..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__
@@ -333,7 +330,8 @@ MINLINE float clamp_f(float value, float min, float max)
 {
        if (value > max) {
                return max;
-       } else if (value < min) {
+       }
+       else if (value < min) {
                return min;
        }
        return value;
@@ -347,7 +345,7 @@ MINLINE size_t clamp_z(size_t value, size_t min, size_t 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)
 {
@@ -357,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/
  */
@@ -367,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;
@@ -474,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);
@@ -516,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__ */