From d7e8af9510a0d6b2f303255facc6b8aa3f89f8ed Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 9 Feb 2017 19:35:24 -0800 Subject: [PATCH] [varLib] Fix regression where GPOS values were stored as 0 Another fallover from merging of VariationMerger and InstancerMerger. New code is closer to the selfless merger we want to have. Fixes https://github.com/fonttools/fonttools/issues/834 --- Lib/fontTools/varLib/builder.py | 5 +++-- Lib/fontTools/varLib/merger.py | 15 ++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Lib/fontTools/varLib/builder.py b/Lib/fontTools/varLib/builder.py index 9c73048ce..b2efb378c 100644 --- a/Lib/fontTools/varLib/builder.py +++ b/Lib/fontTools/varLib/builder.py @@ -124,11 +124,12 @@ class OnlineVarStoreBuilder(object): return self._store def storeMasters(self, master_values): - deltas = [int(round(d)) for d in self._model.getDeltas(master_values)[1:]] + deltas = [int(round(d)) for d in self._model.getDeltas(master_values)] + base = deltas.pop(0) inner = len(self._data.Item) self._data.Item.append(deltas) # TODO Check for full data array? - return (self._outer << 16) + inner + return base, (self._outer << 16) + inner diff --git a/Lib/fontTools/varLib/merger.py b/Lib/fontTools/varLib/merger.py index 4ad449ee8..c43cc8f82 100644 --- a/Lib/fontTools/varLib/merger.py +++ b/Lib/fontTools/varLib/merger.py @@ -593,15 +593,15 @@ def _all_equal(lst): def buildVarDevTable(store_builder, master_values): if _all_equal(master_values): - return None - varIdx = store_builder.storeMasters(master_values) - return builder.buildVarDevTable(varIdx) + return master_values[0], None + base, varIdx = store_builder.storeMasters(master_values) + return base, builder.buildVarDevTable(varIdx) @VariationMerger.merger(ot.Anchor) def merge(merger, self, lst): assert self.Format == 1 - XDeviceTable = buildVarDevTable(merger.store_builder, [a.XCoordinate for a in lst]) - YDeviceTable = buildVarDevTable(merger.store_builder, [a.YCoordinate for a in lst]) + self.XCoordinate, XDeviceTable = buildVarDevTable(merger.store_builder, [a.XCoordinate for a in lst]) + self.YCoordinate, YDeviceTable = buildVarDevTable(merger.store_builder, [a.YCoordinate for a in lst]) if XDeviceTable or YDeviceTable: self.Format = 3 self.XDeviceTable = XDeviceTable @@ -615,7 +615,8 @@ def merge(merger, self, lst): ('YPlacement','YPlaDevice')]: if hasattr(self, name): - deviceTable = buildVarDevTable(merger.store_builder, - [getattr(a, name, 0) for a in lst]) + value, deviceTable = buildVarDevTable(merger.store_builder, + [getattr(a, name, 0) for a in lst]) + setattr(self, name, value) if deviceTable: setattr(self, tableName, deviceTable)