Merge pull request #269 from guzba/master

fix opentype gpos parsing bug
This commit is contained in:
treeform 2021-08-28 18:03:21 -07:00 committed by GitHub
commit 5281ad71f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 12 deletions

View file

@ -1139,7 +1139,7 @@ proc parsePairPos(buf: string, offset: int): PairPos =
else:
failUnsupported()
proc parseLookup(buf: string, offset: int, gpos: GposTable): Lookup =
proc parseLookup(buf: string, offset: int, pairPosTables: var seq[PairPos]): Lookup =
var i = offset
buf.eofCheck(i + 6)
@ -1163,9 +1163,9 @@ proc parseLookup(buf: string, offset: int, gpos: GposTable): Lookup =
let pairPos = parsePairPos(buf, offset + subTableOffset.int)
if pairPos.glyphPairAdjustments.len > 0 or
pairPos.classPairAdjustments.len > 0:
gpos.lookupList.pairPosTables.add(pairPos)
pairPosTables.add(pairPos)
proc parseLookupList(buf: string, offset: int, gpos: GposTable): LookupList =
proc parseLookupList(buf: string, offset: int): LookupList =
var i = offset
buf.eofCheck(i + 2)
@ -1177,8 +1177,12 @@ proc parseLookupList(buf: string, offset: int, gpos: GposTable): LookupList =
result.lookupOffsets = buf.readUint16Seq(i, result.lookupCount.int)
var pairPosTables: seq[PairPos]
for lookupOffset in result.lookupoffsets:
result.lookups.add(parseLookup(buf, offset + lookupOffset.int, gpos))
result.lookups.add(parseLookup(buf, offset + lookupOffset.int, pairPosTables))
result.pairPosTables = pairPosTables
proc parseGposTable(buf: string, offset: int): GPOSTable =
var i = offset
@ -1208,8 +1212,9 @@ proc parseGposTable(buf: string, offset: int): GPOSTable =
# result.scriptList = parseScriptList(buf, offset + result.scriptListOffset.int)
# result.featureList =
# parseFeatureList(buf, offset + result.featureListOffset.int)
result.lookupList =
parseLookupList(buf, offset + result.lookupListOffset.int, result)
parseLookupList(buf, offset + result.lookupListOffset.int)
proc parsePostTable(buf: string, offset: int): PostTable =
buf.eofCheck(offset + 14)
@ -1456,9 +1461,7 @@ proc parseCompositeGlyph(opentype: OpenType, offset: int): Path =
moreComponents = (flags and 0b100000) != 0
proc parseGlyph(
opentype: OpenType, glyphId: uint16
): Path =
proc parseGlyph(opentype: OpenType, glyphId: uint16): Path =
if glyphId.int >= opentype.glyf.offsets.len:
raise newException(PixieError, "Invalid glyph ID " & $glyphId)
@ -1486,9 +1489,7 @@ proc parseGlyph(
else:
parseGlyphPath(opentype.buf, i, numberOfContours)
proc parseGlyph(
opentype: OpenType, rune: Rune
): Path {.inline.} =
proc parseGlyph(opentype: OpenType, rune: Rune): Path {.inline.} =
opentype.parseGlyph(opentype.getGlyphId(rune))
proc getGlyphPath*(

View file

@ -1,4 +1,4 @@
import pixie, pixie/fileformats/png, strformat
import pixie, pixie/fileformats/png, strformat, unicode
proc doDiff(rendered: Image, name: string) =
rendered.writeFile(&"tests/fonts/rendered/{name}.png")
@ -990,3 +990,7 @@ block:
)
doDiff(image, "paints1")
block:
var typeface = readTypeface("tests/fonts/Roboto-Regular_1.ttf")
doAssert typeface.getKerningAdjustment('T'.Rune, 'e'.Rune) == -99.0