Skip to content

Commit

Permalink
Fix Noto font bug
Browse files Browse the repository at this point in the history
A little bit of context.
While working with pdfkit we found this error.
foliojs/pdfkit#1106
We narrowed down the repro to fontkit with this little script
```
const fs = require('fs');
const notosans = require('fontkit').openSync('./NotoSansCJKsc-Bold.otf');
const subsetFor = (text, file) => {
  const run = notosans.layout(text);
  const subset = notosans.createSubset();
  run.glyphs.forEach((glyph) => subset.includeGlyph(glyph));
  subset.encodeStream().pipe(fs.createWriteStream(file));
};
subsetFor('间。楼', 'output.ttf');
```
With this script you can see that glyphs were missing on the subset font if you opened the font with something like fontforge

Regarding the logic behind this fix, when `!used_fds[fd]` was false, last items in `topDict.FDArray` and `used_subrs` weren't really the ones corresponding to the current `fd`. So we are saving a dictionary to find the real index were those values were stored.

What do you think about this fix?
  • Loading branch information
canda authored May 21, 2020
1 parent 417af0c commit a5e1c9e
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/subset/CFFSubset.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export default class CFFSubset extends Subset {

let used_fds = {};
let used_subrs = [];
let fd_select = {};
for (let gid of this.glyphs) {
let fd = this.cff.fdForGlyph(gid);
if (fd == null) {
Expand All @@ -64,15 +65,16 @@ export default class CFFSubset extends Subset {
if (!used_fds[fd]) {
topDict.FDArray.push(Object.assign({}, this.cff.topDict.FDArray[fd]));
used_subrs.push({});
fd_select[fd] = topDict.FDArray.length - 1;
}

used_fds[fd] = true;
topDict.FDSelect.fds.push(topDict.FDArray.length - 1);
topDict.FDSelect.fds.push(fd_select[fd]);

let glyph = this.font.getGlyph(gid);
let path = glyph.path; // this causes the glyph to be parsed
for (let subr in glyph._usedSubrs) {
used_subrs[used_subrs.length - 1][subr] = true;
used_subrs[fd_select[fd]][subr] = true;
}
}

Expand Down

0 comments on commit a5e1c9e

Please sign in to comment.