pdfkit
Version:
A PDF generation library for Node.js
89 lines (79 loc) • 2.68 kB
JavaScript
(function() {
var Data, Directory;
var __slice = Array.prototype.slice;
Data = require('../data');
Directory = (function() {
var checksum;
function Directory(data) {
var entry, i, _ref;
this.scalarType = data.readInt();
this.tableCount = data.readShort();
this.searchRange = data.readShort();
this.entrySelector = data.readShort();
this.rangeShift = data.readShort();
this.tables = {};
for (i = 0, _ref = this.tableCount; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
entry = {
tag: data.readString(4),
checksum: data.readInt(),
offset: data.readInt(),
length: data.readInt()
};
this.tables[entry.tag] = entry;
}
}
Directory.prototype.encode = function(tables) {
var adjustment, directory, directoryLength, entrySelector, headOffset, log2, offset, rangeShift, searchRange, sum, table, tableCount, tableData, tag;
tableCount = Object.keys(tables).length;
log2 = Math.log(2);
searchRange = Math.floor(Math.log(tableCount) / log2) * 16;
entrySelector = Math.floor(searchRange / log2);
rangeShift = tableCount * 16 - searchRange;
directory = new Data;
directory.writeInt(this.scalarType);
directory.writeShort(tableCount);
directory.writeShort(searchRange);
directory.writeShort(entrySelector);
directory.writeShort(rangeShift);
directoryLength = tableCount * 16;
offset = directory.pos + directoryLength;
headOffset = null;
tableData = [];
for (tag in tables) {
table = tables[tag];
directory.writeString(tag);
directory.writeInt(checksum(table));
directory.writeInt(offset);
directory.writeInt(table.length);
tableData = tableData.concat(table);
if (tag === 'head') headOffset = offset;
offset += table.length;
while (offset % 4) {
tableData.push(0);
offset++;
}
}
directory.write(tableData);
sum = checksum(directory.data);
adjustment = 0xB1B0AFBA - sum;
directory.pos = headOffset + 8;
directory.writeUInt32(adjustment);
return new Buffer(directory.data);
};
checksum = function(data) {
var i, sum, tmp, _ref;
data = __slice.call(data);
while (data.length % 4) {
data.push(0);
}
tmp = new Data(data);
sum = 0;
for (i = 0, _ref = data.length; i < _ref; i += 4) {
sum += tmp.readUInt32();
}
return sum & 0xFFFFFFFF;
};
return Directory;
})();
module.exports = Directory;
}).call(this);