| 2216 | } |
| 2217 | |
| 2218 | TTilesCollection FrontendRenderer::ResolveTileKeys(ScreenBase const & screen) |
| 2219 | { |
| 2220 | m2::RectD rect = screen.ClipRect(); |
| 2221 | double const vs = VisualParams::Instance().GetVisualScale(); |
| 2222 | double const extension = vs * dp::kScreenPixelRectExtension * screen.GetScale(); |
| 2223 | rect.Inflate(extension, extension); |
| 2224 | int const dataZoomLevel = ClipTileZoomByMaxDataZoom(GetCurrentZoom()); |
| 2225 | |
| 2226 | m_notFinishedTiles.clear(); |
| 2227 | |
| 2228 | // Request new tiles. |
| 2229 | TTilesCollection tiles; |
| 2230 | /// @todo Introduce small_set class based on buffer_vector. |
| 2231 | buffer_vector<TileKey, 8> tilesToDelete; |
| 2232 | auto const result = CalcTilesCoverage(rect, dataZoomLevel, [this, &rect, &tiles, &tilesToDelete](int tileX, int tileY) |
| 2233 | { |
| 2234 | TileKey const key(tileX, tileY, GetCurrentZoom()); |
| 2235 | if (rect.IsIntersect(key.GetGlobalRect())) |
| 2236 | { |
| 2237 | tiles.insert(key); |
| 2238 | m_notFinishedTiles.insert(key); |
| 2239 | } |
| 2240 | else |
| 2241 | { |
| 2242 | tilesToDelete.push_back(key); |
| 2243 | } |
| 2244 | }); |
| 2245 | |
| 2246 | // Remove old tiles. |
| 2247 | auto removePredicate = [this, &result, &tilesToDelete](drape_ptr<RenderGroup> const & group) |
| 2248 | { |
| 2249 | TileKey const & key = group->GetTileKey(); |
| 2250 | return key.m_zoomLevel == GetCurrentZoom() && |
| 2251 | (key.m_x < result.m_minTileX || key.m_x >= result.m_maxTileX || key.m_y < result.m_minTileY || |
| 2252 | key.m_y >= result.m_maxTileY || base::IsExist(tilesToDelete, key)); |
| 2253 | }; |
| 2254 | for (RenderLayer & layer : m_layers) |
| 2255 | layer.m_isDirty |= RemoveGroups(removePredicate, layer.m_renderGroups, make_ref(m_overlayTree)); |
| 2256 | |
| 2257 | RemoveRenderGroupsLater([this](drape_ptr<RenderGroup> const & group) |
| 2258 | { return group->GetTileKey().m_zoomLevel != GetCurrentZoom(); }); |
| 2259 | |
| 2260 | m_trafficRenderer->OnUpdateViewport(result, GetCurrentZoom(), tilesToDelete); |
| 2261 | |
| 2262 | #if defined(DRAPE_MEASURER_BENCHMARK) && defined(GENERATING_STATISTIC) |
| 2263 | DrapeMeasurer::Instance().StartScenePreparing(); |
| 2264 | #endif |
| 2265 | |
| 2266 | return tiles; |
| 2267 | } |
| 2268 | |
| 2269 | void FrontendRenderer::OnContextDestroy() |
| 2270 | { |
nothing calls this directly
no test coverage detected