summaryrefslogtreecommitdiff
path: root/core/variant_op.cpp
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2018-10-07 18:56:26 +0200
committerGitHub <noreply@github.com>2018-10-07 18:56:26 +0200
commitcebbb2a325cc028f8311e18ea050f91801385597 (patch)
tree39f41a73d31ca995413ba0964fbb7d22121c0d56 /core/variant_op.cpp
parent3b6c5f737926a0a4d2432b385a57856691e1cbc8 (diff)
parent50fae2b1a7a7a5f3029c50f9884ccdde0762c8a3 (diff)
Merge pull request #22827 from qonnop/optimize-interpolation
Optimize interpolation algorithms
Diffstat (limited to 'core/variant_op.cpp')
-rw-r--r--core/variant_op.cpp13
1 files changed, 6 insertions, 7 deletions
diff --git a/core/variant_op.cpp b/core/variant_op.cpp
index f230f12b5d..d193858966 100644
--- a/core/variant_op.cpp
+++ b/core/variant_op.cpp
@@ -3521,7 +3521,7 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
//not as efficient but..
real_t va = a;
real_t vb = b;
- r_dst = (1.0 - c) * va + vb * c;
+ r_dst = va + (vb - va) * c;
} else {
r_dst = a;
@@ -3542,16 +3542,13 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
case INT: {
int64_t va = a._data._int;
int64_t vb = b._data._int;
- if (va != vb)
- r_dst = int((1.0 - c) * va + vb * c);
- else //avoid int casting issues
- r_dst = a;
+ r_dst = int(va + (vb - va) * c);
}
return;
case REAL: {
real_t va = a._data._real;
real_t vb = b._data._real;
- r_dst = (1.0 - c) * va + vb * c;
+ r_dst = va + (vb - va) * c;
}
return;
case STRING: {
@@ -3559,7 +3556,9 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
String sa = *reinterpret_cast<const String *>(a._data._mem);
String sb = *reinterpret_cast<const String *>(b._data._mem);
String dst;
- int csize = sb.length() * c + sa.length() * (1.0 - c);
+ int sa_len = sa.length();
+ int sb_len = sb.length();
+ int csize = sa_len + (sb_len - sa_len) * c;
if (csize == 0) {
r_dst = "";
return;