From 752ba148046217f4d4b384c60f1b990a3303ca51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20Am=C3=A9rico?= Date: Mon, 4 Mar 2019 21:29:59 -0300 Subject: [PATCH] Fix saving loca index format/version when subsetting --- src/subset/TTFSubset.js | 4 ++-- src/tables/loca.js | 5 ----- test/subset.js | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/subset/TTFSubset.js b/src/subset/TTFSubset.js index d6b26f62..b0a4b2dd 100644 --- a/src/subset/TTFSubset.js +++ b/src/subset/TTFSubset.js @@ -57,7 +57,8 @@ export default class TTFSubset extends Subset { this.glyf = []; this.offset = 0; this.loca = { - offsets: [] + offsets: [], + version: this.font.loca.version }; this.hmtx = { @@ -77,7 +78,6 @@ export default class TTFSubset extends Subset { maxp.numGlyphs = this.glyf.length; this.loca.offsets.push(this.offset); - Tables.loca.preEncode.call(this.loca); let head = cloneDeep(this.font.head); head.indexToLocFormat = this.loca.version; diff --git a/src/tables/loca.js b/src/tables/loca.js index 80d2e1b7..c191983f 100644 --- a/src/tables/loca.js +++ b/src/tables/loca.js @@ -18,11 +18,6 @@ loca.process = function() { }; loca.preEncode = function() { - if (this.version != null) return; - - // assume this.offsets is a sorted array - this.version = this.offsets[this.offsets.length - 1] > 0xffff ? 1 : 0; - if (this.version === 0) { for (let i = 0; i < this.offsets.length; i++) { this.offsets[i] >>>= 1; diff --git a/test/subset.js b/test/subset.js index 3e1ddfe7..89681b77 100644 --- a/test/subset.js +++ b/test/subset.js @@ -56,6 +56,23 @@ describe('font subsetting', function() { done(); })); }); + + it('should handle fonts with long index to location format (indexToLocFormat = 1)', function(done) { + let font = fontkit.openSync(__dirname + '/data/FiraSans/FiraSans-Regular.ttf'); + let subset = font.createSubset(); + for (let glyph of font.glyphsForString('abcd')) { + subset.includeGlyph(glyph); + } + + subset.encodeStream().pipe(concat(function(buf) { + let f = fontkit.create(buf); + assert.equal(f.numGlyphs, 5); + assert.equal(f.getGlyph(1).path.toSVG(), font.glyphsForString('a')[0].path.toSVG()); + // must test also second glyph which has an odd loca index + assert.equal(f.getGlyph(2).path.toSVG(), font.glyphsForString('b')[0].path.toSVG()); + done(); + })); + }); }); describe('CFF subsetting', function() {