From 19cc3b7ac40efde66807cf0cf86839ba43ae67f7 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Mon, 9 Jul 2018 18:31:51 +0300 Subject: [PATCH] Fixed calculation of scale and zoom level. --- drape_frontend/my_position_controller.cpp | 6 ++-- drape_frontend/user_event_stream.cpp | 4 +-- drape_frontend/user_mark_shapes.cpp | 2 +- drape_frontend/visual_params.cpp | 39 +++++++++++------------ drape_frontend/visual_params.hpp | 4 +-- map/bookmark_manager.cpp | 2 +- map/local_ads_manager.cpp | 2 +- map/traffic_manager.cpp | 2 +- 8 files changed, 28 insertions(+), 33 deletions(-) diff --git a/drape_frontend/my_position_controller.cpp b/drape_frontend/my_position_controller.cpp index 093e7aab73..d4f026bb49 100644 --- a/drape_frontend/my_position_controller.cpp +++ b/drape_frontend/my_position_controller.cpp @@ -58,7 +58,7 @@ std::string LocationModeStatisticsName(location::EMyPositionMode mode) int GetZoomLevel(ScreenBase const & screen) { - return static_cast(df::GetZoomLevel(screen.GetScale())); + return static_cast(df::GetTileBasedZoomLevel(screen.GetScale())); } int GetZoomLevel(ScreenBase const & screen, m2::PointD const & position, double errorRadius) @@ -139,7 +139,7 @@ MyPositionController::MyPositionController(Params && params) , m_oldDrawDirection(0.0) , m_enablePerspectiveInRouting(false) , m_enableAutoZoomInRouting(params.m_isAutozoomEnabled) - , m_autoScale2d(GetScale(kDefaultAutoZoom)) + , m_autoScale2d(GetTileBasedScale(kDefaultAutoZoom)) , m_autoScale3d(m_autoScale2d) , m_lastGPSBearing(false) , m_lastLocationTimestamp(0.0) @@ -360,7 +360,7 @@ void MyPositionController::NextMode(ScreenBase const & screen) if (m_mode == location::FollowAndRotate) { if (m_isInRouting && screen.isPerspective()) - preferredZoomLevel = static_cast(GetZoomLevel(ScreenBase::GetStartPerspectiveScale() * 1.1)); + preferredZoomLevel = static_cast(GetTileBasedZoomLevel(ScreenBase::GetStartPerspectiveScale() * 1.1)); ChangeMode(location::Follow); ChangeModelView(m_position, 0.0, m_visiblePixelRect.Center(), preferredZoomLevel); } diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index e84b61b2a2..3870727736 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -392,7 +392,7 @@ bool UserEventStream::OnSetCenter(ref_ptr centerEvent) } else { - screen.SetFromParams(center, screen.GetAngle(), GetScale(zoom)); + screen.SetFromParams(center, screen.GetAngle(), GetTileBasedScale(zoom)); screen.MatchGandP3d(center, m_visibleViewport.Center()); } @@ -554,7 +554,7 @@ bool UserEventStream::SetFollowAndRotate(m2::PointD const & userPos, m2::PointD } else { - screen.SetFromParams(userPos, -azimuth, isAutoScale ? autoScale : GetScale(preferredZoomLevel)); + screen.SetFromParams(userPos, -azimuth, isAutoScale ? autoScale : GetTileBasedScale(preferredZoomLevel)); } screen.MatchGandP3d(userPos, pixelPos); diff --git a/drape_frontend/user_mark_shapes.cpp b/drape_frontend/user_mark_shapes.cpp index 044ad63bb4..e545bf6398 100644 --- a/drape_frontend/user_mark_shapes.cpp +++ b/drape_frontend/user_mark_shapes.cpp @@ -461,7 +461,7 @@ void CacheUserLines(TileKey const & tileKey, ref_ptr texture double sqrScale = 1.0; if (simplify) { - double const currentScaleGtoP = 1.0 / GetScale(tileKey.m_zoomLevel); + double const currentScaleGtoP = 1.0 / GetTileBasedScale(tileKey.m_zoomLevel); sqrScale = currentScaleGtoP * currentScaleGtoP; } diff --git a/drape_frontend/visual_params.cpp b/drape_frontend/visual_params.cpp index 6e301e8d36..d3dd96b86a 100644 --- a/drape_frontend/visual_params.cpp +++ b/drape_frontend/visual_params.cpp @@ -170,8 +170,7 @@ int GetTileScaleBase(ScreenBase const & s, uint32_t tileSize) ScreenBase tmpS = s; tmpS.Rotate(-tmpS.GetAngle()); - // slightly smaller than original to produce "antialiasing" effect using bilinear filtration. - int const halfSize = static_cast(tileSize / 1.05 / 2.0); + auto const halfSize = tileSize / 2; m2::RectD glbRect; m2::PointD const pxCenter = tmpS.PixelRect().Center(); @@ -233,15 +232,6 @@ m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center) return GetRectForDrawScale(my::rounds(drawScale), center); } -double GetTileBasedScale(double zoomLevel) -{ - VisualParams const & p = VisualParams::Instance(); - auto const factor = pow(2.0, zoomLevel); - auto const len = (MercatorBounds::maxX - MercatorBounds::minX) / factor; - auto const pxLen = static_cast(p.GetTileSize()); - return len / pxLen; -} - uint32_t CalculateTileSize(uint32_t screenWidth, uint32_t screenHeight) { uint32_t const maxSz = max(screenWidth, screenHeight); @@ -306,15 +296,9 @@ int GetDrawTileScale(m2::RectD const & r) return GetDrawTileScale(r, p.GetTileSize(), p.GetVisualScale()); } -double GetZoomLevel(double scale) -{ - static double const kLog2 = log(2.0); - return my::clamp(fabs(log(scale) / kLog2), 1.0, scales::GetUpperStyleScale() + 1.0); -} - void ExtractZoomFactors(ScreenBase const & s, double & zoom, int & index, float & lerpCoef) { - double const zoomLevel = GetZoomLevel(s.GetScale()); + double const zoomLevel = GetTileBasedZoomLevel(s.GetScale()); zoom = trunc(zoomLevel); index = static_cast(zoom - 1.0); lerpCoef = static_cast(zoomLevel - zoom); @@ -341,12 +325,25 @@ m2::PointF InterpolateByZoomLevels(int index, float lerpCoef, std::vector(p.GetTileSize()); + return len / pxLen; } +double GetTileBasedZoomLevel(double scale) +{ + VisualParams const & p = VisualParams::Instance(); + auto const pxLen = static_cast(p.GetTileSize()); + auto const len = pxLen * scale; + auto const factor = (MercatorBounds::maxX - MercatorBounds::minX) / len; + static double const kLog2 = log(2.0); + return my::clamp(fabs(log(factor) / kLog2), 1.0, scales::GetUpperStyleScale() + 1.0); +} } // namespace df diff --git a/drape_frontend/visual_params.hpp b/drape_frontend/visual_params.hpp index bc18faac7f..4e4ecf078b 100644 --- a/drape_frontend/visual_params.hpp +++ b/drape_frontend/visual_params.hpp @@ -86,12 +86,10 @@ m2::RectD GetRectForDrawScale(double drawScale, m2::PointD const & center); uint32_t CalculateTileSize(uint32_t screenWidth, uint32_t screenHeight); -double GetZoomLevel(double scale); void ExtractZoomFactors(ScreenBase const & s, double & zoom, int & index, float & lerpCoef); float InterpolateByZoomLevels(int index, float lerpCoef, std::vector const & values); m2::PointF InterpolateByZoomLevels(int index, float lerpCoef, std::vector const & values); double GetNormalizedZoomLevel(double scale, int minZoom = 1); -double GetScale(double zoomLevel); double GetTileBasedScale(double zoomLevel); - +double GetTileBasedZoomLevel(double scale); } // namespace df diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index e3e14790b9..eaa3e370bd 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -574,7 +574,7 @@ Bookmark * BookmarkManager::CreateBookmark(kml::BookmarkData && bm, kml::MarkGro alohalytics::Stats::Instance().LogEvent("Bookmarks_Bookmark_action", details); bm.m_timestamp = std::chrono::system_clock::now(); - bm.m_viewportScale = static_cast(df::GetZoomLevel(m_viewport.GetScale())); + bm.m_viewportScale = static_cast(df::GetTileBasedZoomLevel(m_viewport.GetScale())); auto * bookmark = CreateBookmark(std::move(bm)); bookmark->Attach(groupId); diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index cf47fceba9..e9f76c58bb 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -316,7 +316,7 @@ void LocalAdsManager::UpdateViewport(ScreenBase const & screen) { auto const connectionStatus = GetPlatform().ConnectionStatus(); if (kServerUrl.empty() || connectionStatus == Platform::EConnectionType::CONNECTION_NONE || - df::GetZoomLevel(screen.GetScale()) < kRequestMinZoomLevel) + df::GetTileBasedZoomLevel(screen.GetScale()) < kRequestMinZoomLevel) { return; } diff --git a/map/traffic_manager.cpp b/map/traffic_manager.cpp index 2551f86d2e..1427790d4d 100644 --- a/map/traffic_manager.cpp +++ b/map/traffic_manager.cpp @@ -222,7 +222,7 @@ void TrafficManager::UpdateViewport(ScreenBase const & screen) if (!IsEnabled() || IsInvalidState() || m_isPaused) return; - if (df::GetZoomLevel(screen.GetScale()) < df::kRoadClass0ZoomLevel) + if (df::GetTileBasedZoomLevel(screen.GetScale()) < df::kRoadClass0ZoomLevel) return; // Request traffic.