diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index b18473414b..cacac3a474 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -171,7 +171,7 @@ void ApplyPointFeature::ProcessRule(Stylist::TRuleWrapper const & rule) TextViewParams params; ExtractCaptionParams(capRule, pRule->GetCaption(1), depth, params); if(!params.m_primaryText.empty() || !params.m_secondaryText.empty()) - m_context.InsertShape(dp::MovePointer(new TextShape(m_centerPoint, params))); + m_context.InsertShape(m_id, dp::MovePointer(new TextShape(m_centerPoint, params))); } SymbolRuleProto const * symRule = pRule->GetSymbol(); @@ -203,7 +203,7 @@ void ApplyPointFeature::Finish() params.m_radius = m_circleRule->radius(); CircleShape * shape = new CircleShape(m_centerPoint, params); - m_context.InsertShape(dp::MovePointer(shape)); + m_context.InsertShape(m_id, dp::MovePointer(shape)); } else if (m_symbolRule) { @@ -212,7 +212,7 @@ void ApplyPointFeature::Finish() params.m_symbolName = m_symbolRule->name(); PoiSymbolShape * shape = new PoiSymbolShape(m_centerPoint, params); - m_context.InsertShape(dp::MovePointer(shape)); + m_context.InsertShape(m_id, dp::MovePointer(shape)); } } @@ -252,7 +252,7 @@ void ApplyAreaFeature::ProcessRule(Stylist::TRuleWrapper const & rule) params.m_color = ToDrapeColor(areaRule->color()); AreaShape * shape = new AreaShape(move(m_triangles), params); - m_context.InsertShape(dp::MovePointer(shape)); + m_context.InsertShape(m_id, dp::MovePointer(shape)); } else TBase::ProcessRule(rule); @@ -306,7 +306,7 @@ void ApplyLineFeature::ProcessRule(Stylist::TRuleWrapper const & rule) params.m_textFont = fontDecl; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(dp::MovePointer(new PathTextShape(m_spline, params))); + m_context.InsertShape(m_id, dp::MovePointer(new PathTextShape(m_spline, params))); } if (pLineRule != NULL) @@ -322,7 +322,7 @@ void ApplyLineFeature::ProcessRule(Stylist::TRuleWrapper const & rule) params.m_step = symRule.step() * mainScale; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(dp::MovePointer(new PathSymbolShape(m_spline, params))); + m_context.InsertShape(m_id, dp::MovePointer(new PathSymbolShape(m_spline, params))); } else { @@ -330,7 +330,7 @@ void ApplyLineFeature::ProcessRule(Stylist::TRuleWrapper const & rule) Extract(pLineRule, params); params.m_depth = depth; params.m_baseGtoPScale = m_currentScaleGtoP; - m_context.InsertShape(dp::MovePointer(new LineShape(m_spline, params))); + m_context.InsertShape(m_id, dp::MovePointer(new LineShape(m_spline, params))); } } } @@ -362,7 +362,7 @@ void ApplyLineFeature::Finish() m2::Spline::iterator it = m_spline.CreateIterator(); while (!it.BeginAgain()) { - m_context.InsertShape(dp::MovePointer(new TextShape(it.m_pos, viewParams))); + m_context.InsertShape(m_id, dp::MovePointer(new TextShape(it.m_pos, viewParams))); it.Advance(splineStep); } } diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 7e4e98de1f..7dc7ea82f0 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -122,10 +122,8 @@ void BackendRenderer::AcceptMessage(dp::RefPointer message) { MapShapeReadedMessage * msg = df::CastMessage(message); dp::RefPointer batcher = m_batchersPool->GetTileBatcher(msg->GetKey()); - dp::MasterPointer shape(msg->GetShape()); - shape->Draw(batcher, m_texturesManager); - - shape.Destroy(); + for (dp::MasterPointer const & shape : msg->GetShapes()) + shape->Draw(batcher, m_texturesManager); break; } case Message::UpdateUserMarkLayer: diff --git a/drape_frontend/engine_context.cpp b/drape_frontend/engine_context.cpp index aa062f11a7..690a12bd76 100644 --- a/drape_frontend/engine_context.cpp +++ b/drape_frontend/engine_context.cpp @@ -11,6 +11,8 @@ #include "base/string_utils.hpp" #endif +#include "base/logging.hpp" + namespace df { @@ -25,9 +27,23 @@ void EngineContext::BeginReadTile() PostMessage(dp::MovePointer(new TileReadStartMessage(m_tileKey))); } -void EngineContext::InsertShape(dp::TransferPointer shape) +void EngineContext::BeginReadFeature(FeatureID const & featureId) { - PostMessage(dp::MovePointer(new MapShapeReadedMessage(m_tileKey, shape))); + ASSERT(m_mapShapeStorage.find(featureId) == m_mapShapeStorage.end(), ()); + m_mapShapeStorage.insert(make_pair(featureId, list>())); +} + +void EngineContext::InsertShape(FeatureID const & featureId, dp::TransferPointer shape) +{ + ASSERT(m_mapShapeStorage.find(featureId) != m_mapShapeStorage.end(), ()); + m_mapShapeStorage[featureId].push_back(dp::MasterPointer(shape)); +} + +void EngineContext::EndReadFeature(FeatureID const & featureId) +{ + MapShapeStorage::iterator it = m_mapShapeStorage.find(featureId); + ASSERT(it != m_mapShapeStorage.end(), ()); + PostMessage(dp::MovePointer(new MapShapeReadedMessage(m_tileKey, move(it->second)))); } void EngineContext::EndReadTile() diff --git a/drape_frontend/engine_context.hpp b/drape_frontend/engine_context.hpp index f6bb7ade92..664d4af979 100644 --- a/drape_frontend/engine_context.hpp +++ b/drape_frontend/engine_context.hpp @@ -5,6 +5,8 @@ #include "drape/pointers.hpp" +#include "indexer/feature_decl.hpp" + namespace df { @@ -19,9 +21,11 @@ public: TileKey const & GetTileKey() const { return m_tileKey; } void BeginReadTile(); + void BeginReadFeature(FeatureID const & featureId); /// If you call this method, you may forget about shape. /// It will be proccessed and delete later - void InsertShape(dp::TransferPointer shape); + void InsertShape(FeatureID const & featureId, dp::TransferPointer shape); + void EndReadFeature(FeatureID const & featureId); void EndReadTile(); private: @@ -30,6 +34,28 @@ private: private: TileKey m_tileKey; dp::RefPointer m_commutator; + + using MapShapeStorage = map>>; + MapShapeStorage m_mapShapeStorage; +}; + +class EngineContextReadFeatureGuard +{ +public: + EngineContextReadFeatureGuard(EngineContext & context, FeatureID const & featureId) + : m_context(context), m_id(featureId) + { + m_context.BeginReadFeature(m_id); + } + + ~EngineContextReadFeatureGuard() + { + m_context.EndReadFeature(m_id); + } + +private: + EngineContext & m_context; + FeatureID m_id; }; } // namespace df diff --git a/drape_frontend/map_shape.hpp b/drape_frontend/map_shape.hpp index a81f648278..80c3ec63ff 100644 --- a/drape_frontend/map_shape.hpp +++ b/drape_frontend/map_shape.hpp @@ -24,24 +24,29 @@ public: class MapShapeReadedMessage : public Message { public: - MapShapeReadedMessage(TileKey const & key, dp::TransferPointer shape) - : m_key(key), m_shape(shape) + using MapShapes = list>; + + MapShapeReadedMessage(TileKey const & key, MapShapes && shapes) + : m_key(key), m_shapes(move(shapes)) {} Type GetType() const override { return Message::MapShapeReaded; } ~MapShapeReadedMessage() { - m_shape.Destroy(); + for (dp::MasterPointer & shape : m_shapes) + shape.Destroy(); + + m_shapes.clear(); } TileKey const & GetKey() const { return m_key; } - /// return non const reference for correct construct MasterPointer - dp::TransferPointer & GetShape() { return m_shape; } + + MapShapes const & GetShapes() { return m_shapes; } private: TileKey m_key; - dp::TransferPointer m_shape; + MapShapes m_shapes; }; } // namespace df diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index 4dbb2970e6..a694b44da8 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -48,6 +48,7 @@ void RuleDrawer::operator()(FeatureType const & f) int zoomLevel = m_context.GetTileKey().m_zoomLevel; + EngineContextReadFeatureGuard guard(m_context, f.GetID()); if (s.AreaStyleExists()) { ApplyAreaFeature apply(m_context, f.GetID(), s.GetCaptionDescription()); diff --git a/iphone/Maps/Bookmarks/BookmarksVC.mm b/iphone/Maps/Bookmarks/BookmarksVC.mm index da7cc9b515..6381cbbf4b 100644 --- a/iphone/Maps/Bookmarks/BookmarksVC.mm +++ b/iphone/Maps/Bookmarks/BookmarksVC.mm @@ -169,7 +169,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %@", L(@"length"), [NSString stringWithUTF8String:dist.c_str()]]; else cell.detailTextLabel.text = nil; - const dp::Color c = tr->GetMainColor(); + const dp::Color c = tr->GetColor(0); cell.imageView.image = [CircleView createCircleImageWith:PINDIAMETER andColor:[UIColor colorWithRed:c.GetRed()/255.f green:c.GetGreen()/255.f blue:c.GetBlue()/255.f alpha:1.f]]; } @@ -195,7 +195,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi [m_locationManager getNorthRad:north]; string distance; - fr.GetDistanceAndAzimut(bm->GetOrg(), lat, lon, north, distance, azimut); + fr.GetDistanceAndAzimut(bm->GetPivot(), lat, lon, north, distance, azimut); bmCell.bmDistance.text = @(distance.c_str()); } @@ -366,7 +366,7 @@ extern NSString * const kBookmarksChangedNotification = @"BookmarksChangedNotifi Bookmark const * bm = static_cast(cat->GetUserMark(indexPath.row)); if (bm) { - m2::PointD const center = bm->GetOrg(); + m2::PointD const center = bm->GetPivot(); double const metres = ms::DistanceOnEarth(info.m_latitude, info.m_longitude, MercatorBounds::YToLat(center.y), MercatorBounds::XToLon(center.x)); cell.bmDistance.text = [LocationManager formattedDistance:metres];