From 50f78865392322e428ad502a75e93c1050886234 Mon Sep 17 00:00:00 2001 From: Benoit KUGLER Date: Sat, 14 Feb 2026 12:36:01 +0100 Subject: [PATCH 1/2] [font] Reorder extents lookup order --- font/font_test.go | 9 +++++++++ font/metrics.go | 8 ++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/font/font_test.go b/font/font_test.go index 678d5e88..18e90aa1 100644 --- a/font/font_test.go +++ b/font/font_test.go @@ -146,3 +146,12 @@ func TestLoadColor(t *testing.T) { tu.AssertNoErr(t, err) tu.Assert(t, ft.COLR != nil && ft.CPAL != nil) } + +func TestBitmapExtents(t *testing.T) { + ld := readFontFile(t, "bitmap/cherry-10-r.otb") + ft, err := NewFont(ld) + tu.AssertNoErr(t, err) + face := NewFace(ft) + extents, ok := face.GlyphExtents(41) + tu.Assert(t, ok && extents.Width == 819.2 && extents.Height == -1433.6) +} diff --git a/font/metrics.go b/font/metrics.go index dd86aaee..52d65fc5 100644 --- a/font/metrics.go +++ b/font/metrics.go @@ -425,18 +425,18 @@ func (f *Face) glyphExtentsRaw(glyph GID) (GlyphExtents, bool) { if ok { return out, ok } - out, ok = f.getExtentsFromGlyf(gID(glyph)) + out, ok = f.getExtentsFromBitmap(gID(glyph), f.xPpem, f.yPpem) if ok { return out, ok } - out, ok = f.getExtentsFromCff1(gID(glyph)) + out, ok = f.getExtentsFromGlyf(gID(glyph)) if ok { return out, ok } - out, ok = f.getExtentsFromCff2(gID(glyph)) + out, ok = f.getExtentsFromCff1(gID(glyph)) if ok { return out, ok } - out, ok = f.getExtentsFromBitmap(gID(glyph), f.xPpem, f.yPpem) + out, ok = f.getExtentsFromCff2(gID(glyph)) return out, ok } From 8117b47f5dc1d81022d166eb67c37260d5e19b6a Mon Sep 17 00:00:00 2001 From: Benoit KUGLER Date: Mon, 23 Feb 2026 16:26:57 +0100 Subject: [PATCH 2/2] [shaping] extends fix in #229 to WrapNextLine --- shaping/wrapping.go | 4 ++++ shaping/wrapping_test.go | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/shaping/wrapping.go b/shaping/wrapping.go index 1ebc5358..54e2213f 100644 --- a/shaping/wrapping.go +++ b/shaping/wrapping.go @@ -1030,6 +1030,10 @@ func (l *LineWrapper) postProcessLine(finalLine Line, done bool) (WrappedLine, b // // See also [WrapNextLineF] which supports a decimal [maxWidth]. func (l *LineWrapper) WrapNextLine(maxWidth int) (out WrappedLine, done bool) { + maxFixed := math.MaxInt32 >> 6 + if maxWidth > maxFixed { + maxWidth = maxFixed + } return l.WrapNextLineF(fixed.I(maxWidth)) } diff --git a/shaping/wrapping_test.go b/shaping/wrapping_test.go index 9f1bb94e..43f61b33 100644 --- a/shaping/wrapping_test.go +++ b/shaping/wrapping_test.go @@ -3590,7 +3590,6 @@ func TestMaxWidthRouding(t *testing.T) { } func TestWrapping_oneLine_overflow_bug(t *testing.T) { - maxWidth := math.MaxInt textInput := []rune("Lorem ipsum") // a simple input that fits on one line @@ -3619,4 +3618,8 @@ func TestWrapping_oneLine_overflow_bug(t *testing.T) { if len(outs) != 0 { t.Errorf("expected no line, got %d", len(outs)) } + + l.Prepare(WrapConfig{BreakPolicy: Never}, textInput, NewSliceIterator(out)) + _, done := l.WrapNextLine(maxWidth) + tu.Assert(t, done) }