[varLib] Only use sparse points (ala IUP encoding) if cheaper

For now, this makes us encode one point per contour if feasible.
This commit is contained in:
Behdad Esfahbod 2017-05-18 15:49:57 -07:00
parent f8c970568c
commit e8571ee5e0

View File

@ -213,6 +213,8 @@ def _optimize_contour(delta, coords):
if all(d0 == d for d in delta):
return [d0] + [None] * (n-1)
# TODO
return delta
def _optimize_delta(delta, coords, ends):
@ -226,7 +228,7 @@ def _optimize_delta(delta, coords, ends):
out.extend(contour)
start = end+1
return out # TODO return whichever is cheaper to encode
return out
def _add_gvar(font, model, master_ttfs, tolerance=.5, optimize=True):
@ -259,13 +261,26 @@ def _add_gvar(font, model, master_ttfs, tolerance=.5, optimize=True):
endPts = control[1] if control[0] >= 1 else list(range(len(control[1])))
for i,(delta,support) in enumerate(zip(deltas[1:], supports[1:])):
if not delta:
if not delta: # XXX
continue
if tolerance and max(abs(delta).array) <= tolerance:
if tolerance and max(abs(delta).array) <= tolerance: # XXX
continue
if optimize:
delta = _optimize_delta(delta, origCoords, endPts)
var = TupleVariation(support, delta)
if optimize:
delta = delta[:] # XXX Remove?
delta_opt = _optimize_delta(delta, origCoords, endPts)
if delta_opt != delta:
# Use "optimized" version only if smaller...
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)
unoptimized_len = len(tupleData) + len(auxData)
tupleData, auxData = var_opt.compile(axis_tags, [], None)
optimized_len = len(tupleData) + len(auxData)
if optimized_len < unoptimized_len:
var = var_opt
gvar.variations[glyph].append(var)
def _add_HVAR(font, model, master_ttfs, axisTags):