[core] log2 polyfill for ARMv5

ARMv5 doesn't have a FPU and apparently the soft code for log2()
is wrong and giving weird results. log() works, so we use a log()
based log2() implementation for ARMv5.
This commit is contained in:
Thiago Marcos P. Santos
2016-06-06 16:11:22 +03:00
parent 7b8698b47a
commit 313d9ce09c
4 changed files with 15 additions and 3 deletions

View File

@@ -510,7 +510,7 @@ CameraOptions Map::cameraForLatLngs(const std::vector<LatLng>& latLngs, optional
scaleY -= (padding->top + padding->bottom) / height;
}
double minScale = ::fmin(scaleX, scaleY);
double zoom = ::log2(getScale() * minScale);
double zoom = util::log2(getScale() * minScale);
zoom = util::clamp(zoom, getMinZoom(), getMaxZoom());
// Calculate the center point of a virtual bounds that is extended in all directions by padding.

View File

@@ -222,7 +222,7 @@ double TransformState::zoomScale(double zoom) const {
}
double TransformState::scaleZoom(double s) const {
return ::log2(s);
return util::log2(s);
}
double TransformState::worldSize() const {

View File

@@ -21,5 +21,15 @@ uint32_t ceil_log2(uint64_t x) {
return y;
}
double log2(double x) {
// log2() is producing wrong results on ARMv5 binaries
// running on ARMv7+ CPUs.
#if defined(__ANDROID__) && defined(__ARM_ARCH_5TE__)
return std::log(x) / 0.6931471805599453; // log(x) / log(2)
#else
return ::log2(x);
#endif
}
} // namespace util
} // namespace mbgl
} // namespace mbgl

View File

@@ -110,5 +110,7 @@ T smoothstep(T edge0, T edge1, T x) {
// (== number of bits required to store x)
uint32_t ceil_log2(uint64_t x);
double log2(double x);
} // namespace util
} // namespace mbgl