Add test for a CID based font.

This commit is contained in:
treeform 2021-09-03 12:03:36 -07:00
parent 6539002e5e
commit 3fa9d34544
5 changed files with 10 additions and 14 deletions

View file

@ -935,7 +935,6 @@ proc shift[T](s: var seq[T]): T =
## Pops from the front. ## Pops from the front.
result = s[0] result = s[0]
s.delete(0) s.delete(0)
import print
proc calcCFFSubroutineBias(subrs: seq[string]): int = proc calcCFFSubroutineBias(subrs: seq[string]): int =
if subrs.len < 1240: if subrs.len < 1240:
@ -961,9 +960,7 @@ proc parseCFFCharstring(cff: CffTable, code: string, glyphIndex: int): Path =
nominalWidthX: int nominalWidthX: int
if cff.isCID: if cff.isCID:
print cff.isCID
let fdIndex = cff.topDict.fdSelectSeq[glyphIndex] let fdIndex = cff.topDict.fdSelectSeq[glyphIndex]
print fdIndex
let fdDict = cff.topDict.fdArraySeq[fdIndex] let fdDict = cff.topDict.fdArraySeq[fdIndex]
subrs = fdDict.subrIndex subrs = fdDict.subrIndex
subrsBias = calcCFFSubroutineBias(subrs) subrsBias = calcCFFSubroutineBias(subrs)
@ -980,7 +977,6 @@ proc parseCFFCharstring(cff: CffTable, code: string, glyphIndex: int): Path =
proc parseStems() = proc parseStems() =
# The number of stem operators on the stack is always even. # The number of stem operators on the stack is always even.
# If the value is uneven, that means a width is specified. # If the value is uneven, that means a width is specified.
print "parseStems", stack
if stack.len mod 2 != 0 and not haveWidth: if stack.len mod 2 != 0 and not haveWidth:
width = stack.shift() + nominalWidthX.float32 width = stack.shift() + nominalWidthX.float32
nStems += stack.len shr 1 nStems += stack.len shr 1
@ -1042,7 +1038,6 @@ proc parseCFFCharstring(cff: CffTable, code: string, glyphIndex: int): Path =
of 10: # callsubr of 10: # callsubr
let codeIndex = stack.pop().int + subrsBias let codeIndex = stack.pop().int + subrsBias
#print codeIndex, cff.subrIndex
let subrCode = subrs[codeIndex] let subrCode = subrs[codeIndex]
if subrCode.len > 0: if subrCode.len > 0:
parse(subrCode) parse(subrCode)
@ -1214,7 +1209,6 @@ proc parseCFFCharstring(cff: CffTable, code: string, glyphIndex: int): Path =
((b1 shl 24) or (b2 shl 16) or (b3 shl 8) or b4).float32 / 65536f) ((b1 shl 24) or (b2 shl 16) or (b3 shl 8) or b4).float32 / 65536f)
parse(code) parse(code)
print $p
return p return p
proc parseCFFTable(buf: string, offset: int, maxp: MaxpTable): CFFTable = proc parseCFFTable(buf: string, offset: int, maxp: MaxpTable): CFFTable =
@ -1505,12 +1499,10 @@ proc parseCFFTable(buf: string, offset: int, maxp: MaxpTable): CFFTable =
result.topDict.fdArraySeq = result.gatherCFFTopDicts(maxp, buf, offset, fdArrayIndex, result.stringIndex) result.topDict.fdArraySeq = result.gatherCFFTopDicts(maxp, buf, offset, fdArrayIndex, result.stringIndex)
proc parseCFFFDSelect(buf: string, start, nGlyphs, fdArrayCount: int): seq[int] = proc parseCFFFDSelect(buf: string, start, nGlyphs, fdArrayCount: int): seq[int] =
print "here", buf.len, start, nGlyphs, fdArrayCount
var at = start var at = start
var format = buf.readUint8(at) var format = buf.readUint8(at)
inc at inc at
print format
# if (format === 0) { # if (format === 0) {
# // Simple list of nGlyphs elements # // Simple list of nGlyphs elements
@ -1527,7 +1519,6 @@ proc parseCFFTable(buf: string, offset: int, maxp: MaxpTable): CFFTable =
at += 2 at += 2
var first = buf.readUint16(at).swap().int var first = buf.readUint16(at).swap().int
at += 2 at += 2
print nRanges, first
if first != 0: if first != 0:
failUnsupported("CFF Table CID Font FDSelect format 3 range has bad initial GID") failUnsupported("CFF Table CID Font FDSelect format 3 range has bad initial GID")
@ -1555,10 +1546,7 @@ proc parseCFFTable(buf: string, offset: int, maxp: MaxpTable): CFFTable =
failUnsupported("CFF Table CID Font FDSelect format") failUnsupported("CFF Table CID Font FDSelect format")
result.topDict.fdSelectSeq = parseCFFFDSelect(buf, fdSelectOffset, maxp.numGlyphs.int, result.topDict.fdArraySeq.len) result.topDict.fdSelectSeq = parseCFFFDSelect(buf, fdSelectOffset, maxp.numGlyphs.int, result.topDict.fdArraySeq.len)
print result.topDict.fdSelectSeq.len
print result.topDict.subrs
if result.topDict.subrs != 0: if result.topDict.subrs != 0:
var subrOffset = var subrOffset =
offset + result.topDict.private[1].int + result.topDict.subrs offset + result.topDict.private[1].int + result.topDict.subrs
@ -2382,11 +2370,9 @@ proc parseGlyfGlyph(opentype: OpenType, glyphId: uint16): Path =
else: else:
parseGlyphPath(opentype.buf, i, numberOfContours) parseGlyphPath(opentype.buf, i, numberOfContours)
import print
proc parseCffGlyph(opentype: OpenType, glyphId: uint16): Path = proc parseCffGlyph(opentype: OpenType, glyphId: uint16): Path =
let cff = opentype.cff let cff = opentype.cff
let charstring = cff.charIndex[glyphId] let charstring = cff.charIndex[glyphId]
print glyphId
return cff.parseCFFCharstring(charstring, glyphId.int) return cff.parseCFFCharstring(charstring, glyphId.int)
proc parseGlyph(opentype: OpenType, rune: Rune): Path {.inline.} = proc parseGlyph(opentype: OpenType, rune: Rune): Path {.inline.} =

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -1003,3 +1003,13 @@ block:
image.fillText(font, "Grumpy wizards make toxic brew for the evil Queen and Jack.") image.fillText(font, "Grumpy wizards make toxic brew for the evil Queen and Jack.")
doDiff(image, "cff") doDiff(image, "cff")
block:
var font = readFont("tests/fonts/NotoSansJP-Regular.ttf")
font.size = 26
let image = newImage(800, 100)
image.fill(rgba(255, 255, 255, 255))
image.fillText(font, "仰コソ会票カク帰了ノ終準港みせス議徳モチタ提請ルまつ力路お")
doDiff(image, "cff_jp")