From a4350b41ae8922d7d4f09c84511ab2043b6a7d7c Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 10 Oct 2025 23:40:29 +0200 Subject: [PATCH] Add fontIndex parameter to fontstash that controls which font in a TTC to load --- vendor/fontstash/fontstash.odin | 12 ++++++++---- vendor/fontstash/fontstash_os.odin | 5 ++++- vendor/fontstash/fontstash_other.odin | 1 + 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/vendor/fontstash/fontstash.odin b/vendor/fontstash/fontstash.odin index b3000de70..30e42be86 100644 --- a/vendor/fontstash/fontstash.odin +++ b/vendor/fontstash/fontstash.odin @@ -323,11 +323,15 @@ __AtlasAddWhiteRect :: proc(ctx: ^FontContext, w, h: int) -> bool { // push a font to the font stack // optionally init with ascii characters at a wanted size +// +// 'fontIndex' controls which font you want to load within a multi-font format such +// as TTC. Leave it as zero if you are loading a single-font format such as TTF. AddFontMem :: proc( ctx: ^FontContext, name: string, data: []u8, freeLoadedData: bool, + fontIndex: int = 0, ) -> int { append(&ctx.fonts, Font{}) res := &ctx.fonts[len(ctx.fonts) - 1] @@ -335,10 +339,10 @@ AddFontMem :: proc( res.freeLoadedData = freeLoadedData res.name = strings.clone(name) - // Get offset of first font (if the font is a TTC then it can contain multiple fonts) - // Note: There is currently no support for specifying any other font than first one. - font_offset := stbtt.GetFontOffsetForIndex(raw_data(res.loadedData), 0) - stbtt.InitFont(&res.info, raw_data(res.loadedData), font_offset) + num_fonts := stbtt.GetNumberOfFonts(raw_data(data)) + font_index_clamped := num_fonts > 0 ? clamp(i32(fontIndex), 0, num_fonts-1) : 0 + font_offset := stbtt.GetFontOffsetForIndex(raw_data(data), font_index_clamped) + stbtt.InitFont(&res.info, raw_data(data), font_offset) ascent, descent, line_gap: i32 stbtt.GetFontVMetrics(&res.info, &ascent, &descent, &line_gap) diff --git a/vendor/fontstash/fontstash_os.odin b/vendor/fontstash/fontstash_os.odin index ed453926f..e510a4834 100644 --- a/vendor/fontstash/fontstash_os.odin +++ b/vendor/fontstash/fontstash_os.odin @@ -4,10 +4,13 @@ package fontstash import "core:log" import "core:os" +// 'fontIndex' controls which font you want to load within a multi-font format such +// as TTC. Leave it as zero if you are loading a single-font format such as TTF. AddFontPath :: proc( ctx: ^FontContext, name: string, path: string, + fontIndex: int = 0, ) -> int { data, ok := os.read_entire_file(path) @@ -15,6 +18,6 @@ AddFontPath :: proc( log.panicf("FONT: failed to read font at %s", path) } - return AddFontMem(ctx, name, data, true) + return AddFontMem(ctx, name, data, true, fontIndex) } diff --git a/vendor/fontstash/fontstash_other.odin b/vendor/fontstash/fontstash_other.odin index edb76d9db..b0a0e2ab9 100644 --- a/vendor/fontstash/fontstash_other.odin +++ b/vendor/fontstash/fontstash_other.odin @@ -5,6 +5,7 @@ AddFontPath :: proc( ctx: ^FontContext, name: string, path: string, + fontIndex: int = 0, ) -> int { panic("fontstash.AddFontPath is unsupported on the JS target") }