TextureAtlas._createNewPage only merged exactly-4 same-size page sets; with a
heterogeneous size mix (e.g. 1024+512+512+512) it pushed past maxAtlasPages
instead. GlyphRenderer's GL texture array and fragment-shader sampler array
are sized to exactly maxAtlasPages, so the next render threw TypeError:
Cannot read properties of undefined (reading 'version') and rendering froze
(single-terminal breakage under long heavy-CLI sessions, vscode#322756).
- Generalize merge selection to the largest same-size group of 2-4 pages
(preferring 4, then larger sizes); AtlasPage already supported non-quad
merges. Net page count never exceeds the cap.
- Derive merging page indexes via _pages.indexOf instead of glyphs[0]
.texturePage, which is empty-page safe.
- Last resort when no same-size pair exists below max texture size (only
possible when almost all pages are at max size): evict all pages; glyphs
re-rasterize on demand and models rebuild via pagesVersion.
- Defensive clamp in GlyphRenderer.render so any future overflow renders
untextured glyphs and logs a warning instead of throwing mid-frame.
WebglAtlasOverflow now passes (was 4x TypeError); full webgl suite 75/75.