refactor(render): the atlas is a declared fixed-cell grid, and staging checks it
The text pipeline stages a glyph's rect *origin* per instance and carries the rect's *size* once per draw, so a backend whose glyphs have differing rect sizes -- a TrueType packing trimmed to ink, which is Task 8's shape -- would have drawn every glyph at whichever size it happened to be told, with nothing downstream able to tell. Make that constraint structural rather than documented: - TextBackend::cell_uv() declares the one cell size, and the contract (an atlas is a fixed-cell grid; a proportional face draws its glyphs *into* a uniform cell instead of trimming each rect to its ink, and why the pipeline needs it) is stated on the atlas accessors. - glyph_is_cell() is the check; add_text()/set_cell() declare the cell from the backend, and the staging path asserts it for every glyph in a debug build. A release build draws on with the cell it was told, as before. - Renderer::flush_text() takes u_glyph_uv from the backend, not from the batch, so the draw's one rect size can never come from whichever glyph was staged first.
This commit is contained in:
1 parent
e074f57ddf
commit
ffc060d6ca
11 files changed
+364
-43
No files matched your search
@@ -197,6 +197,11 @@ class Renderer {
|
||||
/// wrapper until the next call, which is enough for a caller measuring or
|
||||
/// laying out one glyph at a time.
|
||||
const render::Glyph* glyph(u32 codepoint) const override;
|
||||
/// The font's cell: the atlas is the font's own, and a cell's size is a
|
||||
/// property of the atlas, not of the size text is drawn at, so this forwards
|
||||
/// unchanged -- which is what makes it the authoritative value the staging
|
||||
/// path declares and the draw is told.
|
||||
Vec2 cell_uv() const override;
|
||||
const u8* atlas_pixels() const override;
|
||||
u32 atlas_width() const override;
|
||||
u32 atlas_height() const override;
|
||||
|
||||
Reference in new issue
Block a user