font/sfnt: use charmap EncodeRune API.

Change-Id: I91d850d1816b43748580f6f8a8f19151472750d0
Reviewed-on: https://go-review.googlesource.com/39070
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>
Run-TryBot: Nigel Tao <nigeltao@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Nigel Tao 2017-03-31 11:07:23 +11:00
parent 10ed294205
commit 84a6511894

View File

@ -5,8 +5,6 @@
package sfnt package sfnt
import ( import (
"unicode/utf8"
"golang.org/x/text/encoding/charmap" "golang.org/x/text/encoding/charmap"
) )
@ -112,20 +110,12 @@ func (f *Font) makeCachedGlyphIndexFormat0(buf []byte, offset, length uint32) ([
var table [256]byte var table [256]byte
copy(table[:], buf[6:]) copy(table[:], buf[6:])
return buf, func(f *Font, b *Buffer, r rune) (GlyphIndex, error) { return buf, func(f *Font, b *Buffer, r rune) (GlyphIndex, error) {
// TODO: for this closure to be goroutine-safe, the x, ok := charmap.Macintosh.EncodeRune(r)
// golang.org/x/text/encoding/charmap API needs to allocate a new if !ok {
// Encoder and new []byte buffers, for every call to this closure, even
// though all we want to do is to encode one rune as one byte. We could
// possibly add some fields in the Buffer struct to re-use these
// allocations, but a better solution is to improve the charmap API.
var dst, src [utf8.UTFMax]byte
n := utf8.EncodeRune(src[:], r)
_, _, err = charmap.Macintosh.NewEncoder().Transform(dst[:], src[:n], true)
if err != nil {
// The source rune r is not representable in the Macintosh-Roman encoding. // The source rune r is not representable in the Macintosh-Roman encoding.
return 0, nil return 0, nil
} }
return GlyphIndex(table[dst[0]]), nil return GlyphIndex(table[x]), nil
}, nil }, nil
} }