diff options
author | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-05-19 19:03:41 +0300 |
---|---|---|
committer | Bruno de Oliveira Abinader <bruno@mapbox.com> | 2016-05-20 16:18:07 +0300 |
commit | f751d2c46528ac4301ef3753c468950051937940 (patch) | |
tree | de8859aadb87cdcb02a1d828087e53bef19d75b6 /src/mbgl | |
parent | b962b56072255c818f441a2f0c8fbeb27e7f78bc (diff) | |
download | qtlocation-mapboxgl-f751d2c46528ac4301ef3753c468950051937940.tar.gz |
[core] Avoid NaNs in TransformState unit conversions
Fix cases where e.g. state has either zero width or height, causing the
unit convertion functions would return NaNs.
Diffstat (limited to 'src/mbgl')
-rw-r--r-- | src/mbgl/map/transform.cpp | 27 | ||||
-rw-r--r-- | src/mbgl/map/transform_state.cpp | 8 |
2 files changed, 21 insertions, 14 deletions
diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index d2f32acb67..bf95dd0714 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -45,24 +45,23 @@ Transform::Transform(std::function<void(MapChange)> callback_, #pragma mark - Map View bool Transform::resize(const std::array<uint16_t, 2> size) { - if (state.width != size[0] || state.height != size[1]) { - - if (callback) { - callback(MapChangeRegionWillChange); - } + if (state.width == size[0] && state.height == size[1]) { + return false; + } - state.width = size[0]; - state.height = size[1]; - state.constrain(state.scale, state.x, state.y); + if (callback) { + callback(MapChangeRegionWillChange); + } - if (callback) { - callback(MapChangeRegionDidChange); - } + state.width = size[0]; + state.height = size[1]; + state.constrain(state.scale, state.x, state.y); - return true; - } else { - return false; + if (callback) { + callback(MapChangeRegionDidChange); } + + return true; } #pragma mark - Camera diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index ad41c9eea2..ac8b6396c7 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -230,6 +230,10 @@ double TransformState::worldSize() const { } ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng) const { + if (width == 0 || height == 0) { + return {}; + } + mat4 mat = coordinatePointMatrix(getZoom()); vec4 p; Point<double> pt = project(latLng) / double(util::tileSize); @@ -239,6 +243,10 @@ ScreenCoordinate TransformState::latLngToScreenCoordinate(const LatLng& latLng) } LatLng TransformState::screenCoordinateToLatLng(const ScreenCoordinate& point, LatLng::WrapMode wrapMode) const { + if (width == 0 || height == 0) { + return {}; + } + float targetZ = 0; mat4 mat = coordinatePointMatrix(getZoom()); |