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
|
# TODO make this user-configurable via designspace document
|
||||||
stat.ElidedFallbackNameID = 2
|
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
|
# 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
|
"""font, glyphName --> glyph coordinates as expected by "gvar" table
|
||||||
|
|
||||||
The result includes four "phantom points" for the glyph metrics,
|
The result includes four "phantom points" for the glyph metrics,
|
||||||
@ -228,19 +260,9 @@ def _GetCoordinates(font, glyphName):
|
|||||||
control = (glyph.numberOfContours,)+allData[1:]
|
control = (glyph.numberOfContours,)+allData[1:]
|
||||||
|
|
||||||
# Add phantom points for (left, right, top, bottom) positions.
|
# Add phantom points for (left, right, top, bottom) positions.
|
||||||
horizontalAdvanceWidth, leftSideBearing = font["hmtx"].metrics[glyphName]
|
phantomPoints = _get_phantom_points(font, glyphName, defaultVerticalOrigin)
|
||||||
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
|
|
||||||
coord = coord.copy()
|
coord = coord.copy()
|
||||||
coord.extend([(leftSideX, 0),
|
coord.extend(phantomPoints)
|
||||||
(rightSideX, 0),
|
|
||||||
(0, topSideY),
|
|
||||||
(0, bottomSideY)])
|
|
||||||
|
|
||||||
return coord, control
|
return coord, control
|
||||||
|
|
||||||
@ -297,11 +319,16 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
|
|||||||
|
|
||||||
glyf = font['glyf']
|
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():
|
for glyph in font.getGlyphOrder():
|
||||||
|
|
||||||
isComposite = glyf[glyph].isComposite()
|
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)
|
model, allData = masterModel.getSubModel(allData)
|
||||||
|
|
||||||
allCoords = [d[0] for d in allData]
|
allCoords = [d[0] for d in allData]
|
||||||
|
@ -281,7 +281,7 @@
|
|||||||
<delta pt="15" x="0" y="0"/>
|
<delta pt="15" x="0" y="0"/>
|
||||||
<delta pt="16" x="0" y="0"/>
|
<delta pt="16" x="0" y="0"/>
|
||||||
<delta pt="17" 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"/>
|
<delta pt="19" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -304,7 +304,7 @@
|
|||||||
<delta pt="15" x="0" y="0"/>
|
<delta pt="15" x="0" y="0"/>
|
||||||
<delta pt="16" x="0" y="0"/>
|
<delta pt="16" x="0" y="0"/>
|
||||||
<delta pt="17" 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"/>
|
<delta pt="19" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -424,7 +424,7 @@
|
|||||||
<delta pt="23" x="-2" y="0"/>
|
<delta pt="23" x="-2" y="0"/>
|
||||||
<delta pt="24" x="0" y="0"/>
|
<delta pt="24" x="0" y="0"/>
|
||||||
<delta pt="25" x="-10" 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"/>
|
<delta pt="27" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -455,7 +455,7 @@
|
|||||||
<delta pt="23" x="12" y="0"/>
|
<delta pt="23" x="12" y="0"/>
|
||||||
<delta pt="24" x="0" y="0"/>
|
<delta pt="24" x="0" y="0"/>
|
||||||
<delta pt="25" x="17" 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"/>
|
<delta pt="27" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -620,7 +620,7 @@
|
|||||||
<delta pt="60" x="33" y="-1"/>
|
<delta pt="60" x="33" y="-1"/>
|
||||||
<delta pt="61" x="0" y="0"/>
|
<delta pt="61" x="0" y="0"/>
|
||||||
<delta pt="62" x="-3" 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"/>
|
<delta pt="64" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -688,8 +688,8 @@
|
|||||||
<delta pt="60" x="-25" y="-13"/>
|
<delta pt="60" x="-25" y="-13"/>
|
||||||
<delta pt="61" x="0" y="0"/>
|
<delta pt="61" x="0" y="0"/>
|
||||||
<delta pt="62" x="32" y="0"/>
|
<delta pt="62" x="32" y="0"/>
|
||||||
<delta pt="63" x="0" y="16"/>
|
<delta pt="63" x="0" y="0"/>
|
||||||
<delta pt="64" x="0" y="3"/>
|
<delta pt="64" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
<coord axis="cntr" value="1.0"/>
|
<coord axis="cntr" value="1.0"/>
|
||||||
@ -965,7 +965,7 @@
|
|||||||
<delta pt="61" x="-15" y="0"/>
|
<delta pt="61" x="-15" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="-7" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1034,7 +1034,7 @@
|
|||||||
<delta pt="61" x="39" y="0"/>
|
<delta pt="61" x="39" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="63" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1314,7 +1314,7 @@
|
|||||||
<delta pt="61" x="-15" y="0"/>
|
<delta pt="61" x="-15" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="-7" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1383,7 +1383,7 @@
|
|||||||
<delta pt="61" x="49" y="0"/>
|
<delta pt="61" x="49" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="63" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
|
@ -927,7 +927,7 @@
|
|||||||
<delta pt="15" x="0" y="0"/>
|
<delta pt="15" x="0" y="0"/>
|
||||||
<delta pt="16" x="0" y="0"/>
|
<delta pt="16" x="0" y="0"/>
|
||||||
<delta pt="17" 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"/>
|
<delta pt="19" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -950,7 +950,7 @@
|
|||||||
<delta pt="15" x="0" y="0"/>
|
<delta pt="15" x="0" y="0"/>
|
||||||
<delta pt="16" x="0" y="0"/>
|
<delta pt="16" x="0" y="0"/>
|
||||||
<delta pt="17" 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"/>
|
<delta pt="19" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1070,7 +1070,7 @@
|
|||||||
<delta pt="23" x="-2" y="0"/>
|
<delta pt="23" x="-2" y="0"/>
|
||||||
<delta pt="24" x="0" y="0"/>
|
<delta pt="24" x="0" y="0"/>
|
||||||
<delta pt="25" x="-10" 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"/>
|
<delta pt="27" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1101,7 +1101,7 @@
|
|||||||
<delta pt="23" x="12" y="0"/>
|
<delta pt="23" x="12" y="0"/>
|
||||||
<delta pt="24" x="0" y="0"/>
|
<delta pt="24" x="0" y="0"/>
|
||||||
<delta pt="25" x="17" 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"/>
|
<delta pt="27" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1266,7 +1266,7 @@
|
|||||||
<delta pt="60" x="33" y="-1"/>
|
<delta pt="60" x="33" y="-1"/>
|
||||||
<delta pt="61" x="0" y="0"/>
|
<delta pt="61" x="0" y="0"/>
|
||||||
<delta pt="62" x="-3" 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"/>
|
<delta pt="64" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1334,8 +1334,8 @@
|
|||||||
<delta pt="60" x="-25" y="-13"/>
|
<delta pt="60" x="-25" y="-13"/>
|
||||||
<delta pt="61" x="0" y="0"/>
|
<delta pt="61" x="0" y="0"/>
|
||||||
<delta pt="62" x="32" y="0"/>
|
<delta pt="62" x="32" y="0"/>
|
||||||
<delta pt="63" x="0" y="16"/>
|
<delta pt="63" x="0" y="0"/>
|
||||||
<delta pt="64" x="0" y="3"/>
|
<delta pt="64" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
<coord axis="cntr" value="1.0"/>
|
<coord axis="cntr" value="1.0"/>
|
||||||
@ -1611,7 +1611,7 @@
|
|||||||
<delta pt="61" x="-15" y="0"/>
|
<delta pt="61" x="-15" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="-7" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1680,7 +1680,7 @@
|
|||||||
<delta pt="61" x="39" y="0"/>
|
<delta pt="61" x="39" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="63" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -1960,7 +1960,7 @@
|
|||||||
<delta pt="61" x="-15" y="0"/>
|
<delta pt="61" x="-15" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="-7" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
@ -2029,7 +2029,7 @@
|
|||||||
<delta pt="61" x="49" y="0"/>
|
<delta pt="61" x="49" y="0"/>
|
||||||
<delta pt="62" x="0" y="0"/>
|
<delta pt="62" x="0" y="0"/>
|
||||||
<delta pt="63" x="63" 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"/>
|
<delta pt="65" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
<tuple>
|
<tuple>
|
||||||
|
@ -610,7 +610,7 @@
|
|||||||
<delta pt="12" x="25" y="-1"/>
|
<delta pt="12" x="25" y="-1"/>
|
||||||
<delta pt="13" x="0" y="0"/>
|
<delta pt="13" x="0" y="0"/>
|
||||||
<delta pt="14" 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"/>
|
<delta pt="16" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
</glyphVariations>
|
</glyphVariations>
|
||||||
@ -632,7 +632,7 @@
|
|||||||
<delta pt="12" x="0" y="0"/>
|
<delta pt="12" x="0" y="0"/>
|
||||||
<delta pt="13" x="0" y="0"/>
|
<delta pt="13" x="0" y="0"/>
|
||||||
<delta pt="14" 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>
|
</tuple>
|
||||||
</glyphVariations>
|
</glyphVariations>
|
||||||
<glyphVariations glyph="dotabovecomb">
|
<glyphVariations glyph="dotabovecomb">
|
||||||
@ -644,15 +644,14 @@
|
|||||||
<delta pt="3" x="-27" y="-20"/>
|
<delta pt="3" x="-27" y="-20"/>
|
||||||
<delta pt="4" x="0" y="0"/>
|
<delta pt="4" x="0" y="0"/>
|
||||||
<delta pt="5" x="0" y="0"/>
|
<delta pt="5" x="0" y="0"/>
|
||||||
<delta pt="6" x="0" y="28"/>
|
<delta pt="6" x="0" y="0"/>
|
||||||
<delta pt="7" x="0" y="18"/>
|
<delta pt="7" x="0" y="0"/>
|
||||||
</tuple>
|
</tuple>
|
||||||
</glyphVariations>
|
</glyphVariations>
|
||||||
<glyphVariations glyph="edotabove">
|
<glyphVariations glyph="edotabove">
|
||||||
<tuple>
|
<tuple>
|
||||||
<coord axis="wght" value="1.0"/>
|
<coord axis="wght" value="1.0"/>
|
||||||
<delta pt="1" x="-6" y="91"/>
|
<delta pt="1" x="-6" y="91"/>
|
||||||
<delta pt="4" x="0" y="119"/>
|
|
||||||
</tuple>
|
</tuple>
|
||||||
</glyphVariations>
|
</glyphVariations>
|
||||||
</gvar>
|
</gvar>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user