From 272f69b6a33e89fbd25b208b6ed55249f65ecc89 Mon Sep 17 00:00:00 2001 From: NianGao Dev Date: Sat, 15 Aug 2026 23:40:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(font):=20=E4=B8=BB=E4=BD=8D=E5=9B=BE?= =?UTF-8?q?=E7=A1=AE=E5=AE=9A=E6=80=A7=E9=80=89=E6=8B=A9=EF=BC=88=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=B9=B6=E8=A1=8C=E6=B5=8B=E8=AF=95=E4=B8=8B=20map=20?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=BA=8F=20flake=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/font/font.go | 15 ++++++++++----- internal/font/font_test.go | 2 +- internal/render/renderer.go | 2 +- internal/ui/ui.go | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/internal/font/font.go b/internal/font/font.go index e57c6a04..5445130a 100644 --- a/internal/font/font.go +++ b/internal/font/font.go @@ -34,6 +34,7 @@ func (a *Atlas) Missing() Glyph { return Glyph{X: 0, Y: 0, W: 8, H: 8, Width: 8, // Build 从资源管理器加载字体(name 如 "default"),reference provider 已由 assets 展开。 // 每个 bitmap provider 对应一张 8px 网格位图:列数 = 图宽 / 8。 +// 主位图(Atlas.Image)确定性选择:优先含 "ascii" 的位图,否则取首个(供 UI 直接采样)。 func Build(m *assets.Manager, name string) (*Atlas, error) { f, err := m.LoadFont(name) if err != nil { @@ -41,6 +42,7 @@ func Build(m *assets.Manager, name string) (*Atlas, error) { } at := &Atlas{Glyphs: make(map[rune]Glyph)} imgCache := make(map[string]image.Image) + var primaryName string for _, p := range f.Providers { if p.Type != "bitmap" || p.File == "" { continue @@ -59,6 +61,12 @@ func Build(m *assets.Manager, name string) (*Atlas, error) { return nil, fmt.Errorf("font.Build %s: %w", p.File, err) } imgCache[p.File] = img + if primaryName == "" { + primaryName = p.File // 首个位图作为回退主位图 + } + if strings.Contains(p.File, "ascii") { + primaryName = p.File // ascii 优先(UI 主字体) + } } cols := img.Bounds().Dx() / 8 if cols <= 0 { @@ -90,11 +98,8 @@ func Build(m *assets.Manager, name string) (*Atlas, error) { } } } - if at.Image == nil && len(imgCache) > 0 { - for _, img := range imgCache { // 取第一张作为主位图(测试/调试用) - at.Image = img - break - } + if primaryName != "" { + at.Image = imgCache[primaryName] // 确定性主位图 } return at, nil } diff --git a/internal/font/font_test.go b/internal/font/font_test.go index 76cafea9..4a7f1855 100644 --- a/internal/font/font_test.go +++ b/internal/font/font_test.go @@ -27,7 +27,7 @@ func TestBuild(t *testing.T) { t.Fatalf("字形 %q 宽度期望 8,实际 %d", ch, g.W) } } - // 主位图:宽 128(16 列 × 8px),高为 8 的整数倍(原版 ascii.png 为 128×536) + // 主位图:ascii 位图为 128 宽(16 列 × 8px),高为 8 的整数倍 if at.Image == nil { t.Fatal("主位图为空") } diff --git a/internal/render/renderer.go b/internal/render/renderer.go index e3154124..f3191f03 100644 --- a/internal/render/renderer.go +++ b/internal/render/renderer.go @@ -237,4 +237,4 @@ void main() { float b = max(sky, blk * 0.9 + 0.06); fragColor = vec4(c.rgb * b, c.a); } -` \ No newline at end of file +` diff --git a/internal/ui/ui.go b/internal/ui/ui.go index a922079d..16e75ab6 100644 --- a/internal/ui/ui.go +++ b/internal/ui/ui.go @@ -306,4 +306,4 @@ func compileShader(kind uint32, src string) (uint32, error) { return s, nil } -var _ = textr.New // 保持引用(长文本光栅化路径后置启用) \ No newline at end of file +var _ = textr.New // 保持引用(长文本光栅化路径后置启用)