pdfkit
Version:
A PDF generation library for Node.js
104 lines (90 loc) • 3.22 kB
JavaScript
(function() {
var DFont, Data, Directory, NameTable, fs;
fs = require('fs');
Data = require('../data');
Directory = require('./directory');
NameTable = require('./tables/name');
DFont = (function() {
DFont.open = function(filename) {
var contents;
contents = fs.readFileSync(filename);
return new DFont(contents);
};
function DFont(contents) {
this.contents = new Data(contents);
this.parse(this.contents);
}
DFont.prototype.parse = function(data) {
var attr, b2, b3, b4, dataLength, dataOffset, dataOfs, entry, font, handle, i, id, j, len, length, mapLength, mapOffset, maxIndex, maxTypeIndex, name, nameListOffset, nameOfs, p, pos, refListOffset, type, typeListOffset;
dataOffset = data.readInt();
mapOffset = data.readInt();
dataLength = data.readInt();
mapLength = data.readInt();
this.map = {};
data.pos = mapOffset + 24;
typeListOffset = data.readShort() + mapOffset;
nameListOffset = data.readShort() + mapOffset;
data.pos = typeListOffset;
maxIndex = data.readShort();
for (i = 0; i <= maxIndex; i += 1) {
type = data.readString(4);
maxTypeIndex = data.readShort();
refListOffset = data.readShort();
this.map[type] = {
list: [],
named: {}
};
pos = data.pos;
data.pos = typeListOffset + refListOffset;
for (j = 0; j <= maxTypeIndex; j += 1) {
id = data.readShort();
nameOfs = data.readShort();
attr = data.readByte();
b2 = data.readByte() << 16;
b3 = data.readByte() << 8;
b4 = data.readByte();
dataOfs = dataOffset + (0 | b2 | b3 | b4);
handle = data.readUInt32();
entry = {
id: id,
attributes: attr,
offset: dataOfs,
handle: handle
};
p = data.pos;
if (nameOfs !== -1 && (nameListOffset + nameOfs < mapOffset + mapLength)) {
data.pos = nameListOffset + nameOfs;
len = data.readByte();
entry.name = data.readString(len);
} else if (type === 'sfnt') {
data.pos = entry.offset;
length = data.readUInt32();
font = {};
font.contents = new Data(data.slice(data.pos, data.pos + length));
font.directory = new Directory(font.contents);
name = new NameTable(font);
entry.name = name.fontName[0].raw;
}
data.pos = p;
this.map[type].list.push(entry);
if (entry.name) this.map[type].named[entry.name] = entry;
}
data.pos = pos;
}
};
DFont.prototype.getNamedFont = function(name) {
var data, entry, length, pos, ret;
data = this.contents;
pos = data.pos;
entry = this.map.sfnt.named[name];
if (!entry) throw new Error("Font " + name + " not found in DFont file.");
data.pos = entry.offset;
length = data.readUInt32();
ret = data.slice(data.pos, data.pos + length);
data.pos = pos;
return ret;
};
return DFont;
})();
module.exports = DFont;
}).call(this);