From 4af5ab049c3a64d8c528001cdcd0f98aefa00b8b Mon Sep 17 00:00:00 2001 From: Nicole Faerber Date: Tue, 25 May 2021 21:55:27 +0200 Subject: [PATCH] avoid reallocatig too much stuff with each drawinng call --- DrawMapCairo.cpp | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/DrawMapCairo.cpp b/DrawMapCairo.cpp index cbee98c..5794317 100644 --- a/DrawMapCairo.cpp +++ b/DrawMapCairo.cpp @@ -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 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 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;