|
|
import r from 'restructure';
|
|
|
import Tables from './';
|
|
|
|
|
|
let TableEntry = new r.Struct({
|
|
|
tag: new r.String(4),
|
|
|
checkSum: r.uint32,
|
|
|
offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),
|
|
|
length: r.uint32
|
|
|
});
|
|
|
|
|
|
let Directory = new r.Struct({
|
|
|
tag: new r.String(4),
|
|
|
numTables: r.uint16,
|
|
|
searchRange: r.uint16,
|
|
|
entrySelector: r.uint16,
|
|
|
rangeShift: r.uint16,
|
|
|
tables: new r.Array(TableEntry, 'numTables')
|
|
|
});
|
|
|
|
|
|
Directory.process = function() {
|
|
|
let tables = {};
|
|
|
for (let table of this.tables) {
|
|
|
tables[table.tag] = table;
|
|
|
}
|
|
|
|
|
|
this.tables = tables;
|
|
|
};
|
|
|
|
|
|
Directory.preEncode = function(stream) {
|
|
|
let tables = [];
|
|
|
for (let tag in this.tables) {
|
|
|
let table = this.tables[tag];
|
|
|
if (table) {
|
|
|
tables.push({
|
|
|
tag: tag,
|
|
|
checkSum: 0,
|
|
|
offset: new r.VoidPointer(Tables[tag], table),
|
|
|
length: Tables[tag].size(table)
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
this.tag = 'true';
|
|
|
this.numTables = tables.length;
|
|
|
this.tables = tables;
|
|
|
|
|
|
let maxExponentFor2 = Math.floor((Math.log(this.numTables) / Math.LN2));
|
|
|
let maxPowerOf2 = Math.pow(2, maxExponentFor2);
|
|
|
|
|
|
this.searchRange = maxPowerOf2 * 16;
|
|
|
this.entrySelector = Math.log(maxPowerOf2) / Math.LN2;
|
|
|
this.rangeShift = this.numTables * 16 - this.searchRange;
|
|
|
};
|
|
|
|
|
|
export default Directory;
|
|
|
|