From e1f0d1ae09c84c60d0492a075cff1dcc17fedf54 Mon Sep 17 00:00:00 2001
From: Miguel Sousa <2119742+miguelsousa@users.noreply.github.com>
Date: Mon, 24 Jun 2019 17:10:36 -0700
Subject: [PATCH] varLib CFF fixes (#1653)
* varLib.cff: Apply conv_to_int() to all the values
* varLib: Don't hardcode file extension to 'ttf'
Also remove unused imports
* varLib.cff: Fix merging of sparse PrivateDict items
Fixes #1651
---
Lib/fontTools/varLib/__init__.py | 13 ++++----
Lib/fontTools/varLib/cff.py | 31 ++++++++++++-------
.../MasterSet_Kanji-w0.00.ttx | 1 +
.../data/test_results/BuildTestCFF2.ttx | 4 +--
.../data/test_results/TestNonMarkingCFF2.ttx | 4 +--
.../data/test_results/TestSparseCFF2VF.ttx | 1 +
6 files changed, 33 insertions(+), 21 deletions(-)
mode change 100755 => 100644 Lib/fontTools/varLib/cff.py
diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py
index 66b193b2f..b428aeb15 100644
--- a/Lib/fontTools/varLib/__init__.py
+++ b/Lib/fontTools/varLib/__init__.py
@@ -23,8 +23,7 @@ from __future__ import unicode_literals
from fontTools.misc.py23 import *
from fontTools.misc.fixedTools import otRound
from fontTools.misc.arrayTools import Vector
-from fontTools.ttLib import TTFont, newTable, TTLibError
-from fontTools.ttLib.tables._n_a_m_e import NameRecord
+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
from fontTools.ttLib.tables.ttProgram import Program
@@ -36,7 +35,7 @@ from fontTools.varLib.merger import VariationMerger
from fontTools.varLib.mvar import MVAR_ENTRIES
from fontTools.varLib.iup import iup_delta_optimize
from fontTools.varLib.featureVars import addFeatureVariations
-from fontTools.designspaceLib import DesignSpaceDocument, AxisDescriptor
+from fontTools.designspaceLib import DesignSpaceDocument
from collections import OrderedDict, namedtuple
import os.path
import logging
@@ -1107,9 +1106,6 @@ def main(args=None):
designspace_filename = options.designspace
finder = MasterFinder(options.master_finder)
- outfile = options.outfile
- if outfile is None:
- outfile = os.path.splitext(designspace_filename)[0] + '-VF.ttf'
vf, _, _ = build(
designspace_filename,
@@ -1118,6 +1114,11 @@ def main(args=None):
optimize=options.optimize
)
+ outfile = options.outfile
+ if outfile is None:
+ ext = "otf" if vf.sfntVersion == "OTTO" else "ttf"
+ outfile = os.path.splitext(designspace_filename)[0] + '-VF.' + ext
+
log.info("Saving variation font %s", outfile)
vf.save(outfile)
diff --git a/Lib/fontTools/varLib/cff.py b/Lib/fontTools/varLib/cff.py
old mode 100755
new mode 100644
index bcafdeee7..aaabf8573
--- a/Lib/fontTools/varLib/cff.py
+++ b/Lib/fontTools/varLib/cff.py
@@ -131,7 +131,7 @@ class MergeDictError(TypeError):
def conv_to_int(num):
- if num % 1 == 0:
+ if isinstance(num, float) and num.is_integer():
return int(num)
return num
@@ -198,17 +198,17 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
pds.append(pd)
num_masters = len(pds)
for key, value in private_dict.rawDict.items():
+ dataList = []
if key not in pd_blend_fields:
continue
if isinstance(value, list):
try:
values = [pd.rawDict[key] for pd in pds]
except KeyError:
- del private_dict.rawDict[key]
print(
- b"Warning: {key} in default font Private dict is "
- b"missing from another font, and was "
- b"discarded.".format(key=key))
+ "Warning: {key} in default font Private dict is "
+ "missing from another font, and was "
+ "discarded.".format(key=key))
continue
try:
values = zip(*values)
@@ -227,7 +227,6 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
and is converted finally to:
OtherBlues = [[-217, 17.0, 46.0], [-205, 0.0, 0.0]]
"""
- dataList = []
prev_val_list = [0] * num_masters
any_points_differ = False
for val_list in values:
@@ -237,8 +236,6 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
any_points_differ = True
prev_val_list = val_list
deltas = sub_model.getDeltas(rel_list)
- # Convert numbers with no decimal part to an int.
- deltas = [conv_to_int(delta) for delta in deltas]
# For PrivateDict BlueValues, the default font
# values are absolute, not relative to the prior value.
deltas[0] = val_list[0]
@@ -253,6 +250,18 @@ def merge_PrivateDicts(top_dicts, vsindex_dict, var_model, fd_map):
dataList = sub_model.getDeltas(values)
else:
dataList = values[0]
+
+ # Convert numbers with no decimal part to an int
+ if isinstance(dataList, list):
+ for i, item in enumerate(dataList):
+ if isinstance(item, list):
+ for j, jtem in enumerate(item):
+ dataList[i][j] = conv_to_int(jtem)
+ else:
+ dataList[i] = conv_to_int(item)
+ else:
+ dataList = conv_to_int(dataList)
+
private_dict.rawDict[key] = dataList
@@ -270,7 +279,7 @@ def getfd_map(varFont, fonts_list):
num_regions = len(region_fonts)
topDict = default_font['CFF '].cff.topDictIndex[0]
if not hasattr(topDict, 'FDSelect'):
- # All glyphs reference only one FontDict.
+ # All glyphs reference only one FontDict.
# Map the FD index for regions to index 0.
fd_map[0] = {ri:0 for ri in range(num_regions)}
return fd_map
@@ -390,9 +399,9 @@ def merge_charstrings(glyphOrder, num_masters, top_dicts, masterModel):
# as we know it doesn't exist yet.
if vsindex != 0:
new_cs.program[:0] = [vsindex, 'vsindex']
-
+
# If there is no variation in any of the charstrings, then vsindex_dict
- # never gets built. This could still be needed if there is variation
+ # never gets built. This could still be needed if there is variation
# in the PrivatDict, so we will build the default data for vsindex = 0.
if not vsindex_dict:
key = (True,) * num_masters
diff --git a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
index 577315845..f6568fd83 100644
--- a/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
+++ b/Tests/varLib/data/master_sparse_cff2/MasterSet_Kanji-w0.00.ttx
@@ -374,6 +374,7 @@
+
diff --git a/Tests/varLib/data/test_results/BuildTestCFF2.ttx b/Tests/varLib/data/test_results/BuildTestCFF2.ttx
index 91b83fc01..290445250 100644
--- a/Tests/varLib/data/test_results/BuildTestCFF2.ttx
+++ b/Tests/varLib/data/test_results/BuildTestCFF2.ttx
@@ -86,10 +86,10 @@
-
+
-
+
diff --git a/Tests/varLib/data/test_results/TestNonMarkingCFF2.ttx b/Tests/varLib/data/test_results/TestNonMarkingCFF2.ttx
index 5ded5b915..26bd7ba74 100644
--- a/Tests/varLib/data/test_results/TestNonMarkingCFF2.ttx
+++ b/Tests/varLib/data/test_results/TestNonMarkingCFF2.ttx
@@ -31,10 +31,10 @@
-
+
-
+
diff --git a/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx b/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
index 442ae91e6..f05f62f74 100644
--- a/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
+++ b/Tests/varLib/data/test_results/TestSparseCFF2VF.ttx
@@ -132,6 +132,7 @@
+