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>
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 @@
 	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 @@
 	"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 @@
 	"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 @@
 		}
 		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 @@
 	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 @@
 	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 {