| 1104 | } |
| 1105 | |
| 1106 | void FrontendRenderer::InvalidateRect(m2::RectD const & gRect) |
| 1107 | { |
| 1108 | ScreenBase const screen = m_userEventStream.GetCurrentScreen(); |
| 1109 | m2::RectD rect = gRect; |
| 1110 | if (rect.Intersect(screen.ClipRect())) |
| 1111 | { |
| 1112 | // Find tiles to invalidate. |
| 1113 | TTilesCollection tiles; |
| 1114 | int const dataZoomLevel = ClipTileZoomByMaxDataZoom(GetCurrentZoom()); |
| 1115 | CalcTilesCoverage(rect, dataZoomLevel, [this, &rect, &tiles](int tileX, int tileY) |
| 1116 | { |
| 1117 | TileKey const key(tileX, tileY, GetCurrentZoom()); |
| 1118 | if (rect.IsIntersect(key.GetGlobalRect())) |
| 1119 | tiles.insert(key); |
| 1120 | }); |
| 1121 | |
| 1122 | // Remove tiles to invalidate from screen. |
| 1123 | auto eraseFunction = [&tiles](drape_ptr<RenderGroup> const & group) |
| 1124 | { return tiles.find(group->GetTileKey()) != tiles.end(); }; |
| 1125 | for (RenderLayer & layer : m_layers) |
| 1126 | { |
| 1127 | RemoveGroups(eraseFunction, layer.m_renderGroups, make_ref(m_overlayTree)); |
| 1128 | layer.m_isDirty = true; |
| 1129 | } |
| 1130 | |
| 1131 | // Remove tiles to invalidate from backend renderer. |
| 1132 | BaseBlockingMessage::Blocker blocker; |
| 1133 | m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, |
| 1134 | make_unique_dp<InvalidateReadManagerRectMessage>(blocker, tiles), MessagePriority::High); |
| 1135 | blocker.Wait(); |
| 1136 | |
| 1137 | // Request new tiles. |
| 1138 | m_lastReadedModelView = screen; |
| 1139 | m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_forceUpdateScene, m_forceUpdateUserMarks, |
| 1140 | ResolveTileKeys(screen)); |
| 1141 | m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp<UpdateReadManagerMessage>(), |
| 1142 | MessagePriority::UberHighSingleton); |
| 1143 | } |
| 1144 | } |
| 1145 | |
| 1146 | void FrontendRenderer::OnResize(ScreenBase const & screen) |
| 1147 | { |
nothing calls this directly
no test coverage detected