BLI: add safe_divide, safe_modf and safe_logf
Those are defined exactly as their corresponding functions in Cycles.
This commit is contained in:
parent
7e0bf7a0f1
commit
f6f93b5b12
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user