{"record":{"id":"08405dfa1e5406cb","repo":"d2lang/d2","slug":"unsupported-kern-table-coverage-0x-04x","errorCode":null,"errorMessage":"unsupported kern table coverage 0x%04x","messagePattern":"unsupported kern table coverage 0x%04x","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"lib/textmeasure/fontface.go","lineNumber":171,"sourceCode":"func parseLegacyKern(src []byte) ([]kernPair, error) {\n\ttable, err := sfntTable(src, \"kern\")\n\tif err != nil || table == nil {\n\t\treturn nil, err\n\t}\n\tif len(table) < 18 {\n\t\treturn nil, fmt.Errorf(\"invalid kern table: too short\")\n\t}\n\tif binary.BigEndian.Uint16(table[0:2]) != 0 {\n\t\treturn nil, fmt.Errorf(\"unsupported kern table version\")\n\t}\n\tif binary.BigEndian.Uint16(table[2:4]) == 0 {\n\t\treturn nil, fmt.Errorf(\"invalid kern table: no subtables\")\n\t}\n\n\tlength := int(binary.BigEndian.Uint16(table[6:8]))\n\tcoverage := binary.BigEndian.Uint16(table[8:10])\n\tif coverage != 0x0001 {\n\t\treturn nil, fmt.Errorf(\"unsupported kern table coverage 0x%04x\", coverage)\n\t}\n\tn := int(binary.BigEndian.Uint16(table[10:12]))\n\tif length < 14 || 6*n != length-14 || 4+length > len(table) {\n\t\treturn nil, fmt.Errorf(\"invalid kern table length\")\n\t}\n\n\tpairs := make([]kernPair, n)\n\tfor i := range pairs {\n\t\toffset := 18 + 6*i\n\t\tpairs[i] = kernPair{\n\t\t\tkey:   binary.BigEndian.Uint32(table[offset : offset+4]),\n\t\t\tvalue: int16(binary.BigEndian.Uint16(table[offset+4 : offset+6])),\n\t\t}\n\t}\n\treturn pairs, nil\n}\n\nfunc sfntTable(src []byte, tag string) ([]byte, error) {","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/d2lang/d2/blob/0d69dca6f532ceaeacd615d35d1eaa41a238ffdb/lib/textmeasure/fontface.go#L153-L189","documentation":"The parser only supports kern subtables with coverage/format 0x0001 (format 0, horizontal kerning values). Any other coverage bitfield (vertical kerning, cross-stream, format 1/2/3, Apple format variants) is rejected.","triggerScenarios":"parseFont encounters a font whose kern subtable coverage field (bytes 8–10) is not exactly 0x0001 — e.g. format 2 class-based kerning, vertical kerning, or Apple format 1 kerning lists.","commonSituations":"Apple system fonts using AAT format-1 kerning; fonts with vertical-writing kern tables (Japanese/CJK fonts); cross-stream kerning tables.","solutions":["Convert the font with fonttools/otf2ttf so kerning is stored as OpenType GPOS pairs or a format-0 kern subtable.","Choose a different variant of the font that uses standard format-0 horizontal kerning.","Accept the error as signaling reduced kerning: strip the kern table so the library proceeds without kerning."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// coverage := binary.BigEndian.Uint16(kern[8:10]); usable := coverage == 0x0001","typeGuard":null,"tryCatchPattern":"pairs, err := parseLegacyKern(fontData)\nif err != nil {\n    log.Printf(\"kerning unavailable (%v), continuing without\", err)\n    pairs = nil\n}","preventionTips":["Choose font variants whose kern tables use format 0 horizontal kerning (coverage 0x0001)","Convert vertical/AAT kerned fonts with fonttools into GPOS or format-0 kern","Accept degraded kerning for CJK/vertical fonts instead of treating it as fatal","Document which bundled fonts support legacy kerning"],"tags":["font","kern","unsupported-format"],"backgroundTag":"invalid-font-kern-table","analyzedSha":"0d69dca6f532ceaeacd615d35d1eaa41a238ffdb","analyzedAt":"2026-08-31T12:19:21.182Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}