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: else:
failUnsupported() failUnsupported()
proc parseLookup(buf: string, offset: int, gpos: GposTable): Lookup = proc parseLookup(buf: string, offset: int, pairPosTables: var seq[PairPos]): Lookup =
var i = offset var i = offset
buf.eofCheck(i + 6) buf.eofCheck(i + 6)
@ -1163,9 +1163,9 @@ proc parseLookup(buf: string, offset: int, gpos: GposTable): Lookup =
let pairPos = parsePairPos(buf, offset + subTableOffset.int) let pairPos = parsePairPos(buf, offset + subTableOffset.int)
if pairPos.glyphPairAdjustments.len > 0 or if pairPos.glyphPairAdjustments.len > 0 or
pairPos.classPairAdjustments.len > 0: 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 var i = offset
buf.eofCheck(i + 2) 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) result.lookupOffsets = buf.readUint16Seq(i, result.lookupCount.int)
var pairPosTables: seq[PairPos]
for lookupOffset in result.lookupoffsets: 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 = proc parseGposTable(buf: string, offset: int): GPOSTable =
var i = offset var i = offset
@ -1208,8 +1212,9 @@ proc parseGposTable(buf: string, offset: int): GPOSTable =
# result.scriptList = parseScriptList(buf, offset + result.scriptListOffset.int) # result.scriptList = parseScriptList(buf, offset + result.scriptListOffset.int)
# result.featureList = # result.featureList =
# parseFeatureList(buf, offset + result.featureListOffset.int) # parseFeatureList(buf, offset + result.featureListOffset.int)
result.lookupList = result.lookupList =
parseLookupList(buf, offset + result.lookupListOffset.int, result) parseLookupList(buf, offset + result.lookupListOffset.int)
proc parsePostTable(buf: string, offset: int): PostTable = proc parsePostTable(buf: string, offset: int): PostTable =
buf.eofCheck(offset + 14) buf.eofCheck(offset + 14)
@ -1456,9 +1461,7 @@ proc parseCompositeGlyph(opentype: OpenType, offset: int): Path =
moreComponents = (flags and 0b100000) != 0 moreComponents = (flags and 0b100000) != 0
proc parseGlyph( proc parseGlyph(opentype: OpenType, glyphId: uint16): Path =
opentype: OpenType, glyphId: uint16
): Path =
if glyphId.int >= opentype.glyf.offsets.len: if glyphId.int >= opentype.glyf.offsets.len:
raise newException(PixieError, "Invalid glyph ID " & $glyphId) raise newException(PixieError, "Invalid glyph ID " & $glyphId)
@ -1486,9 +1489,7 @@ proc parseGlyph(
else: else:
parseGlyphPath(opentype.buf, i, numberOfContours) parseGlyphPath(opentype.buf, i, numberOfContours)
proc parseGlyph( proc parseGlyph(opentype: OpenType, rune: Rune): Path {.inline.} =
opentype: OpenType, rune: Rune
): Path {.inline.} =
opentype.parseGlyph(opentype.getGlyphId(rune)) opentype.parseGlyph(opentype.getGlyphId(rune))
proc getGlyphPath*( 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) = proc doDiff(rendered: Image, name: string) =
rendered.writeFile(&"tests/fonts/rendered/{name}.png") rendered.writeFile(&"tests/fonts/rendered/{name}.png")
@ -990,3 +990,7 @@ block:
) )
doDiff(image, "paints1") doDiff(image, "paints1")
block:
var typeface = readTypeface("tests/fonts/Roboto-Regular_1.ttf")
doAssert typeface.getKerningAdjustment('T'.Rune, 'e'.Rune) == -99.0