Merge pull request #269 from guzba/master
fix opentype gpos parsing bug
This commit is contained in:
commit
5281ad71f3
2 changed files with 17 additions and 12 deletions
|
@ -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*(
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue