Skip to content

Commit edf19c3

Browse files
committed
[opentype/tables] use sort.Search
1 parent f2aace7 commit edf19c3

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

font/opentype/tables/glyphs_color_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ func TestCOLR(t *testing.T) {
2929
tu.Assert(t, transform.Transform == Affine2x3{1, 0, 0, 1, 4.3119965, 0.375})
3030
tu.Assert(t, innerOK)
3131

32+
_, ok = colr.Search(1)
33+
tu.Assert(t, !ok)
34+
_, ok = colr.Search(0xFFFF)
35+
tu.Assert(t, !ok)
36+
3237
pt, ok := colr.Search(12)
3338
asColrLayers, ok2 := pt.(PaintColrLayers)
3439
tu.Assert(t, ok && ok2)
@@ -51,6 +56,11 @@ func TestCOLR(t *testing.T) {
5156
tu.Assert(t, g1 == baseGlyph{0, 0, 11} && g2 == baseGlyph{2, 11, 18})
5257
tu.Assert(t, colr.layerRecords[0].PaletteIndex == 4)
5358

59+
_, ok = colr.Search(1)
60+
tu.Assert(t, !ok)
61+
_, ok = colr.Search(0xFFFF)
62+
tu.Assert(t, !ok)
63+
5464
pt, ok = colr.Search(0)
5565
asLayers, ok2 := pt.(PaintColrLayersResolved)
5666
tu.Assert(t, ok && ok2)

font/opentype/tables/glyphs_colr_src.go

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package tables
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
"sort"
6+
)
47

58
func ParseCOLR(src []byte) (COLR1, error) {
69
header, _, err := parseColr0(src)
@@ -27,19 +30,17 @@ type colr0 struct {
2730
numLayerRecords uint16 // Number of Layer records.
2831
}
2932

30-
func (cl colr0) paintForGlyph(g GlyphID) (PaintColrLayersResolved, bool) {
31-
for i, j := 0, len(cl.baseGlyphRecords); i < j; {
32-
h := i + (j-i)/2
33-
entry := cl.baseGlyphRecords[h]
34-
if g < entry.GlyphID {
35-
j = h
36-
} else if entry.GlyphID < g {
37-
i = h + 1
38-
} else {
39-
return cl.layerRecords[entry.FirstLayerIndex : entry.FirstLayerIndex+entry.NumLayers], true
40-
}
33+
func (cl colr0) paintForGlyph(gi GlyphID) (PaintColrLayersResolved, bool) {
34+
num := len(cl.baseGlyphRecords)
35+
idx := sort.Search(num, func(i int) bool { return gi <= cl.baseGlyphRecords[i].GlyphID })
36+
if idx >= num {
37+
return nil, false
4138
}
42-
return nil, false
39+
entry := cl.baseGlyphRecords[idx]
40+
if gi != entry.GlyphID {
41+
return nil, false
42+
}
43+
return cl.layerRecords[entry.FirstLayerIndex : entry.FirstLayerIndex+entry.NumLayers], true
4344
}
4445

4546
type COLR1 struct {
@@ -79,20 +80,17 @@ type baseGlyphList struct {
7980
paintRecords []baseGlyphPaintRecord `arrayCount:"FirstUint32"` // numBaseGlyphPaintRecords
8081
}
8182

82-
func (bl baseGlyphList) paintForGlyph(g GlyphID) (PaintTable, bool) {
83-
// binary search
84-
for i, j := 0, len(bl.paintRecords); i < j; {
85-
h := i + (j-i)/2
86-
entry := bl.paintRecords[h]
87-
if g < entry.GlyphID {
88-
j = h
89-
} else if entry.GlyphID < g {
90-
i = h + 1
91-
} else {
92-
return entry.Paint, true
93-
}
83+
func (bl baseGlyphList) paintForGlyph(gi GlyphID) (PaintTable, bool) {
84+
num := len(bl.paintRecords)
85+
idx := sort.Search(num, func(i int) bool { return gi <= bl.paintRecords[i].GlyphID })
86+
if idx >= num {
87+
return nil, false
9488
}
95-
return nil, false
89+
entry := bl.paintRecords[idx]
90+
if gi != entry.GlyphID {
91+
return nil, false
92+
}
93+
return entry.Paint, true
9694
}
9795

9896
type baseGlyphPaintRecord struct {

0 commit comments

Comments
 (0)