git clone https://git.lucas.co/go_mono.git
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>
font/sfnt/proprietary_test.go | 12 ++++++++++++
font/sfnt/sfnt.go | 26 +++++++++++++++++++-------
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/font/sfnt/proprietary_test.go b/font/sfnt/proprietary_test.go
index 8948d5d..e7f8fa4 100644
--- a/font/sfnt/proprietary_test.go
+++ b/font/sfnt/proprietary_test.go
@@ -103,6 +103,14 @@ func TestProprietaryAppleAppleSymbols(t *testing.T) {
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) {
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",
"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?1": "11.0d7e1",
@@ -340,6 +350,8 @@ var proprietaryFullNames = map[string]string{
"adobe/SourceSansPro-Regular.ttf": "Source Sans Pro",
"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?1": ".Hiragino Kaku Gothic Interface W0",
diff --git a/font/sfnt/sfnt.go b/font/sfnt/sfnt.go
index 32122bf..20ade4d 100644
--- a/font/sfnt/sfnt.go
+++ b/font/sfnt/sfnt.go
@@ -693,10 +693,20 @@ func (f *Font) parseKern(buf []byte) (buf1 []byte, kernNumPairs, kernOffset int3
}
return f.parseKernVersion0(buf, offset, length)
case 1:
- // TODO: find such a (proprietary?) font, and support it. Both of
- // https://www.microsoft.com/typography/otspec/kern.htm
+ if buf[2] != 0 || buf[3] != 0 {
+ 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
- // 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
}
@@ -729,7 +739,9 @@ func (f *Font) parseKernVersion0(buf []byte, offset, length int) (buf1 []byte, k
case 0:
return f.parseKernFormat0(buf, offset, subtableLength)
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
}
@@ -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 {
return 0, ErrNotFound
}
- // Not every font has a kern table. If it doesn't, there's no need to
- // allocate a Buffer.
- if f.kern.length == 0 {
+ // Not every font has a kern table. If it doesn't, or if that table is
+ // ignored, there's no need to allocate a Buffer.
+ if f.cached.kernNumPairs == 0 {
return 0, nil
}
if b == nil {