[Bf-blender-cvs] [f6f93b5b126] master: BLI: add safe_divide, safe_modf and safe_logf

Jacques Lucke noreply at git.blender.org
Thu Jul 16 11:05:42 CEST 2020


Commit: f6f93b5b126d320a223977a07e3e0510ba684ceb
Author: Jacques Lucke
Date:   Thu Jul 16 11:05:13 2020 +0200
Branches: master
https://developer.blender.org/rBf6f93b5b126d320a223977a07e3e0510ba684ceb

BLI: add safe_divide, safe_modf and safe_logf

Those are defined exactly as their corresponding functions in Cycles.

===================================================================

M	source/blender/blenlib/BLI_math_base.h
M	source/blender/blenlib/intern/math_base_inline.c
M	tests/gtests/blenlib/BLI_math_base_test.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h
index 49aa9f3b465..93cd902c27f 100644
--- a/source/blender/blenlib/BLI_math_base.h
+++ b/source/blender/blenlib/BLI_math_base.h
@@ -218,6 +218,10 @@ MINLINE unsigned short round_db_to_ushort_clamp(double a);
 MINLINE int round_db_to_int_clamp(double a);
 MINLINE unsigned int round_db_to_uint_clamp(double a);
 
+MINLINE float safe_divide(float a, float b);
+MINLINE float safe_modf(float a, float b);
+MINLINE float safe_logf(float a, float base);
+
 int pow_i(int base, int exp);
 double double_round(double x, int ndigits);
 
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index 26dc4d35c80..bd4eb12a72c 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -348,6 +348,24 @@ MINLINE signed char round_db_to_char_clamp(double a){
 #undef _round_clamp_fl_impl
 #undef _round_clamp_db_impl
 
+MINLINE float safe_divide(float a, float b)
+{
+  return (b != 0.0f) ? a / b : 0.0f;
+}
+
+MINLINE float safe_modf(float a, float b)
+{
+  return (b != 0.0f) ? fmodf(a, b) : 0.0f;
+}
+
+MINLINE float safe_logf(float a, float base)
+{
+  if (UNLIKELY(a <= 0.0f || base <= 0.0f)) {
+    return 0.0f;
+  }
+  return safe_divide(logf(a), logf(base));
+}
+
 /* integer division that rounds 0.5 up, particularly useful for color blending
  * with integers, to avoid gradual darkening when rounding down */
 MINLINE int divide_round_i(int a, int b)
diff --git a/tests/gtests/blenlib/BLI_math_base_test.cc b/tests/gtests/blenlib/BLI_math_base_test.cc
index b7e7472eab2..66506d56f46 100644
--- a/tests/gtests/blenlib/BLI_math_base_test.cc
+++ b/tests/gtests/blenlib/BLI_math_base_test.cc
@@ -125,3 +125,23 @@ TEST(math_base, SafePowf)
   EXPECT_FLOAT_EQ(safe_powf(-2.5f, -4.0f), 0.0256f);
   EXPECT_FLOAT_EQ(safe_powf(-3.7f, -4.5f), 0.0f);
 }
+
+TEST(math_base, SafeModf)
+{
+  EXPECT_FLOAT_EQ(safe_modf(3.4, 2.2f), 1.2f);
+  EXPECT_FLOAT_EQ(safe_modf(3.4, -2.2f), 1.2f);
+  EXPECT_FLOAT_EQ(safe_modf(-3.4, -2.2f), -1.2f);
+  EXPECT_FLOAT_EQ(safe_modf(-3.4, 0.0f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_modf(0.0f, 3.0f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_modf(55.0f, 10.0f), 5.0f);
+}
+
+TEST(math_base, SafeLogf)
+{
+  EXPECT_FLOAT_EQ(safe_logf(3.3f, 2.5f), 1.302995247f);
+  EXPECT_FLOAT_EQ(safe_logf(0.0f, 3.0f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_logf(3.0f, 0.0f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_logf(-2.0f, 4.3f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_logf(2.0f, -4.3f), 0.0f);
+  EXPECT_FLOAT_EQ(safe_logf(-2.0f, -4.3f), 0.0f);
+}



More information about the Bf-blender-cvs mailing list