parse post table

This commit is contained in:
Ryan Oldenburg 2021-05-23 18:20:16 -05:00
parent 6fb1323101
commit 3c548dd7b9

View file

@ -303,6 +303,13 @@ type
# featureList: FeatureList # featureList: FeatureList
lookupList: LookupList lookupList: LookupList
PostTable = ref object
version: float32
italicAngle: float32
underlinePosition: int16
underlineThickness: int16
isFixedPitch: uint32
OpenType* = ref object OpenType* = ref object
buf*: string buf*: string
version*: uint32 version*: uint32
@ -322,6 +329,7 @@ type
glyf*: GlyfTable glyf*: GlyfTable
kern*: KernTable kern*: KernTable
gpos*: GposTable gpos*: GposTable
post*: PostTable
glyphPaths: Table[Rune, Path] glyphPaths: Table[Rune, Path]
when defined(release): when defined(release):
@ -1194,6 +1202,16 @@ proc parseGposTable(buf: string, offset: int): GPOSTable =
result.lookupList = result.lookupList =
parseLookupList(buf, offset + result.lookupListOffset.int, result) parseLookupList(buf, offset + result.lookupListOffset.int, result)
proc parsePostTable(buf: string, offset: int): PostTable =
buf.eofCheck(offset + 14)
result = PostTable()
result.version = buf.readFixed32(offset + 0)
result.italicAngle = buf.readFixed32(offset + 4)
result.underlinePosition = buf.readInt16(offset + 8).swap()
result.underlineThickness = buf.readInt16(offset + 10).swap()
result.isFixedPitch = buf.readUint32(offset + 12).swap()
proc getGlyphId(opentype: OpenType, rune: Rune): uint16 {.inline.} = proc getGlyphId(opentype: OpenType, rune: Rune): uint16 {.inline.} =
if rune in opentype.cmap.runeToGlyphId: if rune in opentype.cmap.runeToGlyphId:
result = opentype.cmap.runeToGlyphId[rune] result = opentype.cmap.runeToGlyphId[rune]
@ -1544,7 +1562,8 @@ proc parseOpenType*(buf: string): OpenType =
i += 16 i += 16
const requiredTables = [ const requiredTables = [
"cmap", "head", "hhea", "hmtx", "maxp", "name", "OS/2", "loca", "glyf" "cmap", "head", "hhea", "hmtx", "maxp", "name", "OS/2", "loca", "glyf",
"post"
] ]
for table in requiredTables: for table in requiredTables:
if table notin result.tableRecords: if table notin result.tableRecords:
@ -1571,5 +1590,7 @@ proc parseOpenType*(buf: string): OpenType =
if "GPOS" in result.tableRecords: if "GPOS" in result.tableRecords:
result.gpos = parseGposTable(buf, result.tableRecords["GPOS"].offset.int) result.gpos = parseGposTable(buf, result.tableRecords["GPOS"].offset.int)
result.post = parsePostTable(buf, result.tableRecords["post"].offset.int)
when defined(release): when defined(release):
{.pop.} {.pop.}