aboutsummaryrefslogtreecommitdiff
path: root/Lib/fontTools/varLib/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/fontTools/varLib/__init__.py')
-rw-r--r--Lib/fontTools/varLib/__init__.py50
1 files changed, 25 insertions, 25 deletions
diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py
index 36ff0d97..15c2e700 100644
--- a/Lib/fontTools/varLib/__init__.py
+++ b/Lib/fontTools/varLib/__init__.py
@@ -18,9 +18,9 @@ Then you can make a variable-font this way:
API *will* change in near future.
"""
-from fontTools.misc.py23 import Tag, tostr
-from fontTools.misc.roundTools import noRound, otRound
from fontTools.misc.vector import Vector
+from fontTools.misc.roundTools import noRound, otRound
+from fontTools.misc.textTools import Tag, tostr
from fontTools.ttLib import TTFont, newTable
from fontTools.ttLib.tables._f_v_a_r import Axis, NamedInstance
from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
@@ -212,6 +212,7 @@ def _add_stat(font, axes):
axes = [dict(tag=a.axisTag, name=a.axisNameID) for a in fvarTable.axes]
buildStatTable(font, axes)
+_MasterData = namedtuple('_MasterData', ['glyf', 'hMetrics', 'vMetrics'])
def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
if tolerance < 0:
@@ -223,15 +224,18 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
glyf = font['glyf']
defaultMasterIndex = masterModel.reverseMapping[0]
- # use hhea.ascent of base master as default vertical origin when vmtx is missing
- baseAscent = font['hhea'].ascent
- for glyph in font.getGlyphOrder():
+ master_datas = [_MasterData(m['glyf'],
+ m['hmtx'].metrics,
+ getattr(m.get('vmtx'), 'metrics', None))
+ for m in master_ttfs]
+ for glyph in font.getGlyphOrder():
+ log.debug("building gvar for glyph '%s'", glyph)
isComposite = glyf[glyph].isComposite()
allData = [
- m["glyf"].getCoordinatesAndControls(glyph, m, defaultVerticalOrigin=baseAscent)
- for m in master_ttfs
+ m.glyf._getCoordinatesAndControls(glyph, m.hMetrics, m.vMetrics)
+ for m in master_datas
]
if allData[defaultMasterIndex][1].numberOfContours != 0:
@@ -284,9 +288,9 @@ def _add_gvar(font, masterModel, master_ttfs, tolerance=0.5, optimize=True):
var_opt = TupleVariation(support, delta_opt)
axis_tags = sorted(support.keys()) # Shouldn't matter that this is different from fvar...?
- tupleData, auxData, _ = var.compile(axis_tags, [], None)
+ tupleData, auxData = var.compile(axis_tags)
unoptimized_len = len(tupleData) + len(auxData)
- tupleData, auxData, _ = var_opt.compile(axis_tags, [], None)
+ tupleData, auxData = var_opt.compile(axis_tags)
optimized_len = len(tupleData) + len(auxData)
if optimized_len < unoptimized_len:
@@ -299,9 +303,10 @@ def _remove_TTHinting(font):
for tag in ("cvar", "cvt ", "fpgm", "prep"):
if tag in font:
del font[tag]
+ maxp = font['maxp']
for attr in ("maxTwilightPoints", "maxStorage", "maxFunctionDefs", "maxInstructionDefs", "maxStackElements", "maxSizeOfInstructions"):
- setattr(font["maxp"], attr, 0)
- font["maxp"].maxZones = 1
+ setattr(maxp, attr, 0)
+ maxp.maxZones = 1
font["glyf"].removeHinting()
# TODO: Modify gasp table to deactivate gridfitting for all ranges?
@@ -316,12 +321,9 @@ def _merge_TTHinting(font, masterModel, master_ttfs):
for tag in ("fpgm", "prep"):
all_pgms = [m[tag].program for m in master_ttfs if tag in m]
- if len(all_pgms) == 0:
+ if not all_pgms:
continue
- if tag in font:
- font_pgm = font[tag].program
- else:
- font_pgm = Program()
+ font_pgm = getattr(font.get(tag), 'program', None)
if any(pgm != font_pgm for pgm in all_pgms):
log.warning("Masters have incompatible %s tables, hinting is discarded." % tag)
_remove_TTHinting(font)
@@ -329,19 +331,17 @@ def _merge_TTHinting(font, masterModel, master_ttfs):
# glyf table
- for name, glyph in font["glyf"].glyphs.items():
+ font_glyf = font['glyf']
+ master_glyfs = [m['glyf'] for m in master_ttfs]
+ for name, glyph in font_glyf.glyphs.items():
all_pgms = [
- m["glyf"][name].program
- for m in master_ttfs
- if name in m['glyf'] and hasattr(m["glyf"][name], "program")
+ getattr(glyf.get(name), 'program', None)
+ for glyf in master_glyfs
]
if not any(all_pgms):
continue
- glyph.expand(font["glyf"])
- if hasattr(glyph, "program"):
- font_pgm = glyph.program
- else:
- font_pgm = Program()
+ glyph.expand(font_glyf)
+ font_pgm = getattr(glyph, 'program', None)
if any(pgm != font_pgm for pgm in all_pgms if pgm):
log.warning("Masters have incompatible glyph programs in glyph '%s', hinting is discarded." % name)
# TODO Only drop hinting from this glyph.