Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
46 changes: 24 additions & 22 deletions bin/createsdf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ var zlib = require('zlib');
var argv = require('minimist')(process.argv.slice(2));
var opentype = require('opentype.js');
var Protobuf = require('pbf');

var glyphsPbfIO = require('../lib/glyphs_pbf')
var sdf = require('../lib/sdf').glyphToSDF;


Expand Down Expand Up @@ -62,8 +64,8 @@ if (cluster.isMaster) {
});

var basename = fonts.map(function(font) {
return (font.tables.name.preferredFamily || font.tables.name.fontFamily) + ' ' +
(font.tables.name.preferredSubfamily || font.tables.name.fontSubfamily);
return (font.tables.name.preferredFamily.en || font.tables.name.fontFamily.en) + ' ' +
(font.tables.name.preferredSubfamily.en || font.tables.name.fontSubfamily.en);
}).join(', ');

try {
Expand All @@ -88,41 +90,41 @@ if (cluster.isMaster) {
}



function createGlyphs(from, to, callback) {
var out = path.join(basename, from + '-' + to + '.pbf');
console.warn('Generating ' + out);

var fontstack_pbf = new Protobuf(new Buffer(16384));
fontstack_pbf.writeTaggedString(/* name */ 1, basename);
fontstack_pbf.writeTaggedString(/* range */ 2, from + '-' + to);
var fontstack = {
name: basename,
range: from + '-' + to,
glyphs: [],
}

for (var chr = from; chr <= to; chr++) {
for (var i = 0; i < fonts.length; i++) {
var font = fonts[i];
var glyph = font.charToGlyph(String.fromCharCode(chr));
if (glyph.index > 0) {
var info = sdf(glyph, fontSize, buffer, cutoff);
var glyph_pbf = new Protobuf(new Buffer(512));
glyph_pbf.writeTaggedVarint(/* id */ 1, chr);
if (info.data) {
glyph_pbf.writeTaggedBuffer(/* bitmap */ 2, new Buffer(info.data));
}
glyph_pbf.writeTaggedVarint(/* width */ 3, info.glyphWidth);
glyph_pbf.writeTaggedVarint(/* height */ 4, info.glyphHeight);
glyph_pbf.writeTaggedSVarint(/* left */ 5, info.glyphBearingX);
glyph_pbf.writeTaggedSVarint(/* top */ 6, info.glyphTop);
glyph_pbf.writeTaggedVarint(/* advance */ 7, info.glyphAdvance);

fontstack_pbf.writeMessage(/* glyphs */ 3, glyph_pbf);
var info = sdf(glyph, fontSize, buffer, cutoff, font);

fontstack.glyphs.push({
id: chr,
bitmap: info.data && new Buffer(info.data),
width: info.glyphWidth,
height: info.glyphHeight,
left: info.glyphBearingX,
top: info.glyphTop,
advance: info.glyphAdvance
})
break;
}
}
}
var glyphsBuffer = new Protobuf();
glyphsPbfIO.glyphs.write({ stacks: [fontstack] }, glyphsBuffer);

var glyphs_pbf = new Protobuf(new Buffer(fontstack_pbf.pos + 8));
glyphs_pbf.writeMessage(/* stacks */ 1, fontstack_pbf);

zlib.deflate(glyphs_pbf.finish(), function(err, data) {
zlib.deflate(glyphsBuffer.finish(), function(err, data) {
if (err) console.warn(err.stack);
fs.writeFile(out, data, function(err) {
if (err) console.warn(err.stack);
Expand Down
59 changes: 59 additions & 0 deletions lib/glyphs_pbf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
'use strict'; // code generated by pbf v3.1.0

// glyph ========================================

var glyph = exports.glyph = {};

glyph.read = function (pbf, end) {
return pbf.readFields(glyph._readField, {id: 0, bitmap: null, width: 0, height: 0, left: 0, top: 0, advance: 0}, end);
};
glyph._readField = function (tag, obj, pbf) {
if (tag === 1) obj.id = pbf.readVarint();
else if (tag === 2) obj.bitmap = pbf.readBytes();
else if (tag === 3) obj.width = pbf.readVarint();
else if (tag === 4) obj.height = pbf.readVarint();
else if (tag === 5) obj.left = pbf.readSVarint();
else if (tag === 6) obj.top = pbf.readSVarint();
else if (tag === 7) obj.advance = pbf.readVarint();
};
glyph.write = function (obj, pbf) {
if (obj.id) pbf.writeVarintField(1, obj.id);
if (obj.bitmap) pbf.writeBytesField(2, obj.bitmap);
if (obj.width) pbf.writeVarintField(3, obj.width);
if (obj.height) pbf.writeVarintField(4, obj.height);
if (obj.left) pbf.writeSVarintField(5, obj.left);
if (obj.top) pbf.writeSVarintField(6, obj.top);
if (obj.advance) pbf.writeVarintField(7, obj.advance);
};

// fontstack ========================================

var fontstack = exports.fontstack = {};

fontstack.read = function (pbf, end) {
return pbf.readFields(fontstack._readField, {name: "", range: "", glyphs: []}, end);
};
fontstack._readField = function (tag, obj, pbf) {
if (tag === 1) obj.name = pbf.readString();
else if (tag === 2) obj.range = pbf.readString();
else if (tag === 3) obj.glyphs.push(glyph.read(pbf, pbf.readVarint() + pbf.pos));
};
fontstack.write = function (obj, pbf) {
if (obj.name) pbf.writeStringField(1, obj.name);
if (obj.range) pbf.writeStringField(2, obj.range);
if (obj.glyphs) for (var i = 0; i < obj.glyphs.length; i++) pbf.writeMessage(3, glyph.write, obj.glyphs[i]);
};

// glyphs ========================================

var glyphs = exports.glyphs = {};

glyphs.read = function (pbf, end) {
return pbf.readFields(glyphs._readField, {stacks: []}, end);
};
glyphs._readField = function (tag, obj, pbf) {
if (tag === 1) obj.stacks.push(fontstack.read(pbf, pbf.readVarint() + pbf.pos));
};
glyphs.write = function (obj, pbf) {
if (obj.stacks) for (var i = 0; i < obj.stacks.length; i++) pbf.writeMessage(1, fontstack.write, obj.stacks[i]);
};
6 changes: 3 additions & 3 deletions lib/sdf.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,9 +228,9 @@ function ringsToSDF(rings, width, height, buffer, cutoff) {
return data;
}

exports.glyphToSDF = function(glyph, fontSize, buffer, cutoff) {
var fontScale = glyph.font.unitsPerEm / fontSize;
var ascender = Math.round(glyph.font.ascender / fontScale);
exports.glyphToSDF = function(glyph, fontSize, buffer, cutoff, font) {
var fontScale = font.unitsPerEm / fontSize;
var ascender = Math.round(font.ascender / fontScale);

var info = {
width: 0,
Expand Down
65 changes: 65 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@
"license": "BSD-2-Clause",
"main": "lib/sdf.js",
"dependencies": {
"opentype.js": "git+https://github.com/nodebox/opentype.js.git",
"pbf": "git+https://github.com/mapbox/pbf.git",
"opentype.js": "^0.10.0",
"pbf": "^3.1.0",
"rbush": "~1.3.2"
},
"devDependencies": {
"minimist": "~0.2.0"
},
"bin": {
"fontnik": "bin/createsdf"
}
}