font/sfnt: ignore version 1 kern tables.

The format is relatively complicated but rarely seen. It doesn't seem
worth the effort. Ignoring it is what Microsoft Windows and FreeType do.

Change-Id: I4415bd591c832650066de1d4e035b20a7230a4da
Reviewed-on: https://go-review.googlesource.com/38273
Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
Nigel Tao 2017-03-18 19:13:02 +11:00
parent 6847effb9b
commit 88e2d806a0
2 changed files with 31 additions and 7 deletions

View File

@ -103,6 +103,14 @@ func TestProprietaryAppleAppleSymbols(t *testing.T) {
testProprietary(t, "apple", "Apple Symbols.ttf", 4600, -1) testProprietary(t, "apple", "Apple Symbols.ttf", 4600, -1)
} }
func TestProprietaryAppleGeezaPro0(t *testing.T) {
testProprietary(t, "apple", "GeezaPro.ttc?0", 1700, -1)
}
func TestProprietaryAppleGeezaPro1(t *testing.T) {
testProprietary(t, "apple", "GeezaPro.ttc?1", 1700, -1)
}
func TestProprietaryAppleHiragino0(t *testing.T) { func TestProprietaryAppleHiragino0(t *testing.T) {
testProprietary(t, "apple", "ヒラギノ角ゴシック W0.ttc?0", 9000, 6) testProprietary(t, "apple", "ヒラギノ角ゴシック W0.ttc?0", 9000, 6)
} }
@ -320,6 +328,8 @@ var proprietaryVersions = map[string]string{
"adobe/SourceSansPro-Regular.ttf": "Version 2.020;PS 2.000;hotconv 1.0.86;makeotf.lib2.5.63406", "adobe/SourceSansPro-Regular.ttf": "Version 2.020;PS 2.000;hotconv 1.0.86;makeotf.lib2.5.63406",
"apple/Apple Symbols.ttf": "12.0d3e10", "apple/Apple Symbols.ttf": "12.0d3e10",
"apple/GeezaPro.ttc?0": "12.0d1e3",
"apple/GeezaPro.ttc?1": "12.0d1e3",
"apple/ヒラギノ角ゴシック W0.ttc?0": "11.0d7e1", "apple/ヒラギノ角ゴシック W0.ttc?0": "11.0d7e1",
"apple/ヒラギノ角ゴシック W0.ttc?1": "11.0d7e1", "apple/ヒラギノ角ゴシック W0.ttc?1": "11.0d7e1",
@ -340,6 +350,8 @@ var proprietaryFullNames = map[string]string{
"adobe/SourceSansPro-Regular.ttf": "Source Sans Pro", "adobe/SourceSansPro-Regular.ttf": "Source Sans Pro",
"apple/Apple Symbols.ttf": "Apple Symbols", "apple/Apple Symbols.ttf": "Apple Symbols",
"apple/GeezaPro.ttc?0": "Geeza Pro Regular",
"apple/GeezaPro.ttc?1": "Geeza Pro Bold",
"apple/ヒラギノ角ゴシック W0.ttc?0": "Hiragino Sans W0", "apple/ヒラギノ角ゴシック W0.ttc?0": "Hiragino Sans W0",
"apple/ヒラギノ角ゴシック W0.ttc?1": ".Hiragino Kaku Gothic Interface W0", "apple/ヒラギノ角ゴシック W0.ttc?1": ".Hiragino Kaku Gothic Interface W0",

View File

@ -693,10 +693,20 @@ func (f *Font) parseKern(buf []byte) (buf1 []byte, kernNumPairs, kernOffset int3
} }
return f.parseKernVersion0(buf, offset, length) return f.parseKernVersion0(buf, offset, length)
case 1: case 1:
// TODO: find such a (proprietary?) font, and support it. Both of if buf[2] != 0 || buf[3] != 0 {
// https://www.microsoft.com/typography/otspec/kern.htm return nil, 0, 0, errUnsupportedKernTable
}
// Microsoft's https://www.microsoft.com/typography/otspec/kern.htm
// says that "Apple has extended the definition of the 'kern' table to
// provide additional functionality. The Apple extensions are not
// supported on Windows."
//
// The format is relatively complicated, including encoding a state
// machine, but rarely seen. We follow Microsoft's and FreeType's
// behavior and simply ignore it. Theoretically, we could follow
// https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kern.html // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6kern.html
// say that such fonts work on Mac OS but not on Windows. // but it doesn't seem worth the effort.
return buf, 0, 0, nil
} }
return nil, 0, 0, errUnsupportedKernTable return nil, 0, 0, errUnsupportedKernTable
} }
@ -729,7 +739,9 @@ func (f *Font) parseKernVersion0(buf []byte, offset, length int) (buf1 []byte, k
case 0: case 0:
return f.parseKernFormat0(buf, offset, subtableLength) return f.parseKernFormat0(buf, offset, subtableLength)
case 2: case 2:
// TODO: find such a (proprietary?) font, and support it. // If we could find such a font, we could write code to support it, but
// a comment in the equivalent FreeType code (sfnt/ttkern.c) says that
// they've never seen such a font.
} }
return nil, 0, 0, errUnsupportedKernTable return nil, 0, 0, errUnsupportedKernTable
} }
@ -982,9 +994,9 @@ func (f *Font) Kern(b *Buffer, x0, x1 GlyphIndex, ppem fixed.Int26_6, h font.Hin
if n := f.NumGlyphs(); int(x0) >= n || int(x1) >= n { if n := f.NumGlyphs(); int(x0) >= n || int(x1) >= n {
return 0, ErrNotFound return 0, ErrNotFound
} }
// Not every font has a kern table. If it doesn't, there's no need to // Not every font has a kern table. If it doesn't, or if that table is
// allocate a Buffer. // ignored, there's no need to allocate a Buffer.
if f.kern.length == 0 { if f.cached.kernNumPairs == 0 {
return 0, nil return 0, nil
} }
if b == nil { if b == nil {