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:
commit
a72088b65e
@ -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]
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user