feat(render): Renderer with LOD selection, 3.3 and 4.3+ upload paths, headless smoke test

This commit is contained in:
Martino Ferrari committed 2026-09-27 23:03:08 +02:00
1 parent e0cdd95a3b
commit 3555ab63d7
20 files changed
+1544 -25

No files matched your search

+11
View File
@@ -32,6 +32,17 @@ struct Measurement {
bool valid = false;
};
/// The cursor pair a measure spans, as the plot stored it. `valid` is false for
/// an id that names no measure and for a measure whose cursors are not both
/// registered, so a caller can tell "no band to shade" from "a band between
/// cursors 0 and 0". The renderer uses it to place the band a measurement's
/// readout belongs to.
struct MeasureSpan {
u32 cursor_a = 0;
u32 cursor_b = 0;
bool valid = false;
};
/// Stateless interval measurement over a data::Series.
struct Measure {
/// Evaluates [begin, end). Every quantity comes from `Series::reduce`/`sum`/
+9
View File
@@ -58,6 +58,10 @@ class Plot {
/// creates one and never touches GL.
void set_text_backend(const render::TextBackend* text) noexcept { text_ = text; }
/// The backend layout() measures labels with, or null when none is set. The
/// renderer reads it to install its own font only when nobody else has.
const render::TextBackend* text_backend() const noexcept { return text_; }
// --- construction -----------------------------------------------------
u32 add_x_axis(const AxisDesc& desc);
@@ -135,6 +139,11 @@ class Plot {
/// because recomputing fills a cache: nothing a caller can observe changes.
const Measurement& measurement(u32 id) const;
/// The cursor pair `id` was created over. The renderer needs it to place the
/// shaded band the measurement readout belongs to; the statistics themselves
/// are in measurement().
MeasureSpan measure_span(u32 id) const noexcept;
/// Drops every cached measurement. Needed after a series is mutated in place
/// (data::ArraySeries::commit() with the same sample count), which a pointer
/// and size check cannot detect.