diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 17cbbab..4eaf9b6 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -215,23 +215,22 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector= (1 << zoom)) { - tilePointers.push_back(nullptr); // we need to keep 1:1 grid alignment with requiredTiles for composeMap + tilePointers.emplace_back(nullptr); // keep alignment continue; } const CachedTile *cachedTile = isTileCached(x, y, zoom); if (cachedTile) { - tilePointers.push_back(cachedTile->buffer); + tilePointers.emplace_back(const_cast(cachedTile)); continue; } - // Check if this tile is already in the job list const auto job = std::find_if(jobs.begin(), jobs.end(), [&](const TileJob &job) { return job.x == x && job.y == static_cast(y) && job.z == zoom; }); if (job != jobs.end()) { - tilePointers.push_back(job->tile->buffer); // reuse buffer from already queued job + tilePointers.emplace_back(const_cast(cachedTile)); continue; } @@ -239,12 +238,13 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vectorbuffer); // store buffer for rendering - jobs.push_back({x, static_cast(y), zoom, tileToReplace}); // queue job + // store buffer and current validity for rendering + tilePointers.emplace_back(tileToReplace); + jobs.push_back({x, static_cast(y), zoom, tileToReplace}); } } @@ -284,13 +284,18 @@ bool OpenStreetMap::composeMap(LGFX_Sprite &mapSprite, TileBufferList &tilePoint { const int drawX = startOffsetX + (tileIndex % numberOfColums) * currentProvider->tileSize; const int drawY = startOffsetY + (tileIndex / numberOfColums) * currentProvider->tileSize; - const uint16_t *tile = tilePointers[tileIndex]; - if (!tile) + const TileBuffer &tb = tilePointers[tileIndex]; + CachedTile *ct = tb.cached; + + // draw background if no tile or tile not valid yet + if (!ct || !ct->valid || !ct->buffer) { mapSprite.fillRect(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, OSM_BGCOLOR); continue; } - mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, tile); + + // draw from live cached buffer + mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, ct->buffer); } mapSprite.setTextColor(TFT_WHITE, OSM_BGCOLOR); @@ -530,10 +535,6 @@ void OpenStreetMap::invalidateTile(CachedTile *tile) { if (!tile) return; - - const size_t tileByteCount = currentProvider->tileSize * currentProvider->tileSize * 2; - memset(tile->buffer, 0, tileByteCount); - tile->valid = false; tile->busy = false; } diff --git a/src/OpenStreetMap-esp32.hpp b/src/OpenStreetMap-esp32.hpp index c5cd3fb..24c1ceb 100644 --- a/src/OpenStreetMap-esp32.hpp +++ b/src/OpenStreetMap-esp32.hpp @@ -49,7 +49,15 @@ constexpr int OSM_SINGLECORE_NUMBER = 1; static_assert(OSM_SINGLECORE_NUMBER < 2, "OSM_SINGLECORE_NUMBER must be 0 or 1 (ESP32 has only 2 cores)"); using tileList = std::vector>; -using TileBufferList = std::vector; + +struct TileBuffer +{ + CachedTile *cached; // nullptr = tile not present / out-of-range + TileBuffer() : cached(nullptr) {} + TileBuffer(CachedTile *c) : cached(c) {} +}; + +using TileBufferList = std::vector; namespace {