#include #include #include #include #include #include #include #include namespace mbgl { DebugBucket::DebugBucket(const OverscaledTileID& id, const bool renderable_, const bool complete_, optional modified_, optional expires_, MapDebugOptions debugMode_, gl::Context& context) : renderable(renderable_), complete(complete_), modified(std::move(modified_)), expires(std::move(expires_)), debugMode(debugMode_) { gl::VertexVector vertices; gl::IndexVector indices; auto addText = [&] (const std::string& text, double left, double baseline, double scale) { for (uint8_t c : text) { if (c < 32 || c >= 127) continue; optional> prev; const glyph& glyph = simplex[c - 32]; vertices.reserve(vertices.vertexSize() + (glyph.length / 2) + 1); indices.reserve(indices.indexSize() + (glyph.length / 2) + 1); for (int32_t j = 0; j < glyph.length; j += 2) { if (glyph.data[j] == -1 && glyph.data[j + 1] == -1) { prev = {}; } else { Point p { int16_t(::round(left + glyph.data[j] * scale)), int16_t(::round(baseline - glyph.data[j + 1] * scale)) }; vertices.emplace_back(FillProgram::layoutVertex(p)); if (prev) { indices.emplace_back(vertices.vertexSize() - 2, vertices.vertexSize() - 1); } prev = p; } } left += glyph.width * scale; } }; double baseline = 200; if (debugMode & MapDebugOptions::ParseStatus) { const std::string text = util::toString(id) + " - " + (complete ? "complete" : renderable ? "renderable" : "pending"); addText(text, 50, baseline, 5); baseline += 200; } if (debugMode & MapDebugOptions::Timestamps && modified && expires) { const std::string modifiedText = "modified: " + util::iso8601(*modified); addText(modifiedText, 50, baseline, 5); const std::string expiresText = "expires: " + util::iso8601(*expires); addText(expiresText, 50, baseline + 200, 5); } segments.emplace_back(0, 0, vertices.vertexSize(), indices.indexSize()); vertexBuffer = context.createVertexBuffer(std::move(vertices)); indexBuffer = context.createIndexBuffer(std::move(indices)); } } // namespace mbgl