[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:
@@ -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.
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user