Merge pull request #1528 from anthrotype/gvar-vmtx-phantom-pts

varLib: use vmtx to compute vertical phantom points, else fall back to ascent - UPEM
This commit is contained in:
Cosimo Lupo 2019-03-05 22:27:29 -08:00 committed by GitHub
commit a72088b65e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 67 additions and 41 deletions

View File

@ -209,8 +209,40 @@ def _add_stat(font, axes):
# TODO make this user-configurable via designspace document
stat.ElidedFallbackNameID = 2
def _get_phantom_points(font, glyphName, defaultVerticalOrigin=None):
glyf = font["glyf"]
glyph = glyf[glyphName]
horizontalAdvanceWidth, leftSideBearing = font["hmtx"].metrics[glyphName]
if not hasattr(glyph, 'xMin'):
glyph.recalcBounds(glyf)
leftSideX = glyph.xMin - leftSideBearing
rightSideX = leftSideX + horizontalAdvanceWidth
if "vmtx" in font:
verticalAdvanceWidth, topSideBearing = font["vmtx"].metrics[glyphName]
topSideY = topSideBearing + glyph.yMax
else:
# without vmtx, use ascent as vertical origin and UPEM as vertical advance
# like HarfBuzz does
verticalAdvanceWidth = font["head"].unitsPerEm
try:
topSideY = font["hhea"].ascent
except KeyError:
# sparse masters may not contain an hhea table; use the ascent
# of the default master as the vertical origin
assert defaultVerticalOrigin is not None
topSideY = defaultVerticalOrigin
bottomSideY = topSideY - verticalAdvanceWidth
return [
(leftSideX, 0),
(rightSideX, 0),
(0, topSideY),
(0, bottomSideY),
]
# TODO Move to glyf or gvar table proper
def _GetCoordinates(font, glyphName):
def _GetCoordinates(font, glyphName, defaultVerticalOrigin=None):
"""font, glyphName --> glyph coordinates as expected by "gvar" table
The result includes four "phantom points" for the glyph metrics,
@ -228,19 +260,9 @@ def _GetCoordinates(font, glyphName):
control = (glyph.numberOfContours,)+allData[1:]
# Add phantom points for (left, right, top, bottom) positions.
horizontalAdvanceWidth, leftSideBearing = font["hmtx"].metrics[glyphName]
if not hasattr(glyph, 'xMin'):
glyph.recalcBounds(glyf)
leftSideX = glyph.xMin - leftSideBearing
rightSideX = leftSideX + horizontalAdvanceWidth
# XXX these are incorrect. Load vmtx and fix.
topSideY = glyph.yMax
bottomSideY = -glyph.yMin
phantomPoints = _get_phantom_points(font, glyphName, defaultVerticalOrigin)
coord = coord.copy()
coord.extend([(leftSideX, 0),
(rightSideX, 0),
(0, topSideY),
(0, bottomSideY)])
coord.extend(phantomPoints)
return coord, control
@ -297,11 +319,16 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
glyf = font['glyf']
# use hhea.ascent of base master as default vertical origin when vmtx is missing
defaultVerticalOrigin = font['hhea'].ascent
for glyph in font.getGlyphOrder():
isComposite = glyf[glyph].isComposite()
allData = [_GetCoordinates(m, glyph) for m in master_ttfs]
allData = [
_GetCoordinates(m, glyph, defaultVerticalOrigin=defaultVerticalOrigin)
for m in master_ttfs
]
model, allData = masterModel.getSubModel(allData)
allCoords = [d[0] for d in allData]

View File

@ -281,7 +281,7 @@
<delta pt="15" x="0" y="0"/>
<delta pt="16" x="0" y="0"/>
<delta pt="17" x="0" y="0"/>
<delta pt="18" x="0" y="7"/>
<delta pt="18" x="0" y="0"/>
<delta pt="19" x="0" y="0"/>
</tuple>
<tuple>
@ -304,7 +304,7 @@
<delta pt="15" x="0" y="0"/>
<delta pt="16" x="0" y="0"/>
<delta pt="17" x="0" y="0"/>
<delta pt="18" x="0" y="-18"/>
<delta pt="18" x="0" y="0"/>
<delta pt="19" x="0" y="0"/>
</tuple>
<tuple>
@ -424,7 +424,7 @@
<delta pt="23" x="-2" y="0"/>
<delta pt="24" x="0" y="0"/>
<delta pt="25" x="-10" y="0"/>
<delta pt="26" x="0" y="9"/>
<delta pt="26" x="0" y="0"/>
<delta pt="27" x="0" y="0"/>
</tuple>
<tuple>
@ -455,7 +455,7 @@
<delta pt="23" x="12" y="0"/>
<delta pt="24" x="0" y="0"/>
<delta pt="25" x="17" y="0"/>
<delta pt="26" x="0" y="-23"/>
<delta pt="26" x="0" y="0"/>
<delta pt="27" x="0" y="0"/>
</tuple>
<tuple>
@ -620,7 +620,7 @@
<delta pt="60" x="33" y="-1"/>
<delta pt="61" x="0" y="0"/>
<delta pt="62" x="-3" y="0"/>
<delta pt="63" x="0" y="-4"/>
<delta pt="63" x="0" y="0"/>
<delta pt="64" x="0" y="0"/>
</tuple>
<tuple>
@ -688,8 +688,8 @@
<delta pt="60" x="-25" y="-13"/>
<delta pt="61" x="0" y="0"/>
<delta pt="62" x="32" y="0"/>
<delta pt="63" x="0" y="16"/>
<delta pt="64" x="0" y="3"/>
<delta pt="63" x="0" y="0"/>
<delta pt="64" x="0" y="0"/>
</tuple>
<tuple>
<coord axis="cntr" value="1.0"/>
@ -965,7 +965,7 @@
<delta pt="61" x="-15" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="-7" y="0"/>
<delta pt="64" x="0" y="12"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -1034,7 +1034,7 @@
<delta pt="61" x="39" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="63" y="0"/>
<delta pt="64" x="0" y="-19"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -1314,7 +1314,7 @@
<delta pt="61" x="-15" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="-7" y="0"/>
<delta pt="64" x="0" y="12"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -1383,7 +1383,7 @@
<delta pt="61" x="49" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="63" y="0"/>
<delta pt="64" x="0" y="-19"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>

View File

@ -927,7 +927,7 @@
<delta pt="15" x="0" y="0"/>
<delta pt="16" x="0" y="0"/>
<delta pt="17" x="0" y="0"/>
<delta pt="18" x="0" y="7"/>
<delta pt="18" x="0" y="0"/>
<delta pt="19" x="0" y="0"/>
</tuple>
<tuple>
@ -950,7 +950,7 @@
<delta pt="15" x="0" y="0"/>
<delta pt="16" x="0" y="0"/>
<delta pt="17" x="0" y="0"/>
<delta pt="18" x="0" y="-18"/>
<delta pt="18" x="0" y="0"/>
<delta pt="19" x="0" y="0"/>
</tuple>
<tuple>
@ -1070,7 +1070,7 @@
<delta pt="23" x="-2" y="0"/>
<delta pt="24" x="0" y="0"/>
<delta pt="25" x="-10" y="0"/>
<delta pt="26" x="0" y="9"/>
<delta pt="26" x="0" y="0"/>
<delta pt="27" x="0" y="0"/>
</tuple>
<tuple>
@ -1101,7 +1101,7 @@
<delta pt="23" x="12" y="0"/>
<delta pt="24" x="0" y="0"/>
<delta pt="25" x="17" y="0"/>
<delta pt="26" x="0" y="-23"/>
<delta pt="26" x="0" y="0"/>
<delta pt="27" x="0" y="0"/>
</tuple>
<tuple>
@ -1266,7 +1266,7 @@
<delta pt="60" x="33" y="-1"/>
<delta pt="61" x="0" y="0"/>
<delta pt="62" x="-3" y="0"/>
<delta pt="63" x="0" y="-4"/>
<delta pt="63" x="0" y="0"/>
<delta pt="64" x="0" y="0"/>
</tuple>
<tuple>
@ -1334,8 +1334,8 @@
<delta pt="60" x="-25" y="-13"/>
<delta pt="61" x="0" y="0"/>
<delta pt="62" x="32" y="0"/>
<delta pt="63" x="0" y="16"/>
<delta pt="64" x="0" y="3"/>
<delta pt="63" x="0" y="0"/>
<delta pt="64" x="0" y="0"/>
</tuple>
<tuple>
<coord axis="cntr" value="1.0"/>
@ -1611,7 +1611,7 @@
<delta pt="61" x="-15" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="-7" y="0"/>
<delta pt="64" x="0" y="12"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -1680,7 +1680,7 @@
<delta pt="61" x="39" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="63" y="0"/>
<delta pt="64" x="0" y="-19"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -1960,7 +1960,7 @@
<delta pt="61" x="-15" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="-7" y="0"/>
<delta pt="64" x="0" y="12"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>
@ -2029,7 +2029,7 @@
<delta pt="61" x="49" y="0"/>
<delta pt="62" x="0" y="0"/>
<delta pt="63" x="63" y="0"/>
<delta pt="64" x="0" y="-19"/>
<delta pt="64" x="0" y="0"/>
<delta pt="65" x="0" y="0"/>
</tuple>
<tuple>

View File

@ -610,7 +610,7 @@
<delta pt="12" x="25" y="-1"/>
<delta pt="13" x="0" y="0"/>
<delta pt="14" x="0" y="0"/>
<delta pt="15" x="0" y="35"/>
<delta pt="15" x="0" y="0"/>
<delta pt="16" x="0" y="0"/>
</tuple>
</glyphVariations>
@ -632,7 +632,7 @@
<delta pt="12" x="0" y="0"/>
<delta pt="13" x="0" y="0"/>
<delta pt="14" x="0" y="0"/>
<delta pt="15" x="0" y="45"/>
<delta pt="15" x="0" y="0"/>
</tuple>
</glyphVariations>
<glyphVariations glyph="dotabovecomb">
@ -644,15 +644,14 @@
<delta pt="3" x="-27" y="-20"/>
<delta pt="4" x="0" y="0"/>
<delta pt="5" x="0" y="0"/>
<delta pt="6" x="0" y="28"/>
<delta pt="7" x="0" y="18"/>
<delta pt="6" x="0" y="0"/>
<delta pt="7" x="0" y="0"/>
</tuple>
</glyphVariations>
<glyphVariations glyph="edotabove">
<tuple>
<coord axis="wght" value="1.0"/>
<delta pt="1" x="-6" y="91"/>
<delta pt="4" x="0" y="119"/>
</tuple>
</glyphVariations>
</gvar>