avoid reallocatig too much stuff with each drawinng call

This commit is contained in:
Nicole Faerber 2021-05-25 21:55:27 +02:00
parent de540a36ed
commit 4af5ab049c

View file

@ -35,17 +35,22 @@
Demos/DrawMapCairo ../maps/nordrhein-westfalen ../stylesheets/standard.oss 800 480 51.51241 7.46525 70000 test.png
*/
osmscout::DatabaseParameter databaseParameter;
osmscout::DatabaseRef database;
osmscout::MapServiceRef mapService;
osmscout::StyleConfigRef styleConfig;
static osmscout::DatabaseParameter databaseParameter;
static osmscout::DatabaseRef database;
static osmscout::MapServiceRef mapService;
static osmscout::StyleConfigRef styleConfig;
osmscout::BasemapDatabaseRef basemapDatabase;
static osmscout::BasemapDatabaseRef basemapDatabase;
static osmscout::MercatorProjection projection;
static osmscout::MapParameter drawParameter;
static osmscout::AreaSearchParameter searchParameter;
static osmscout::MapData data;
static std::list<osmscout::TileRef> tiles;
static osmscout::MapPainterCairo *cairoMapPainter{nullptr};
osmscout::MercatorProjection projection;
osmscout::MapParameter drawParameter;
osmscout::AreaSearchParameter searchParameter;
osmscout::MapData data;
int DrawMapCairoInit(int argc, char* argv[])
{
@ -79,7 +84,16 @@ int DrawMapCairoInit(int argc, char* argv[])
drawParameter.SetLabelLineMinCharCount(15);
drawParameter.SetLabelLineMaxCharCount(30);
drawParameter.SetLabelLineFitToArea(true);
//LoadBaseMapTiles(data.baseMapTiles);
assert(database);
assert(database->IsOpen());
assert(mapService);
assert(styleConfig);
cairoMapPainter = new osmscout::MapPainterCairo(styleConfig);
return 0;
}
@ -87,8 +101,7 @@ int DrawMapCairo(cairo_surface_t *surface, double lat, double lon, unsigned int
{
osmscout::GeoCoord center(lat, lon);
osmscout::Magnification zoom{osmscout::Magnification::magClose};
std::list<osmscout::TileRef> tiles;
osmscout::MapPainterCairo painter(styleConfig);
osmscout::GeoBox boundingBox;
cairo_t *cairo=cairo_create(surface);
assert(database);
@ -98,18 +111,15 @@ int DrawMapCairo(cairo_surface_t *surface, double lat, double lon, unsigned int
zoom.SetMagnification(zoomlevel);
projection.Set(center, direction, zoom, 96, 800, 600);
projection.GetDimensions(boundingBox);
mapService->GetGroundTiles(projection, data.groundTiles);
mapService->LookupTiles(projection, tiles);
mapService->LoadMissingTileData(searchParameter,*styleConfig, tiles);
mapService->AddTileDataToMapData(tiles, data);
mapService->GetGroundTiles(projection, data.groundTiles);
//LoadBaseMapTiles(data.baseMapTiles);
osmscout::GeoBox boundingBox;
projection.GetDimensions(boundingBox);
if (!painter.DrawMap(projection, drawParameter, data, cairo))
if (!cairoMapPainter->DrawMap(projection, drawParameter, data, cairo))
std::cerr << "Cannot paint" << std::endl;;
cairo_destroy(cairo);
return 0;