|
|
import r from 'restructure';
|
|
|
import {resolveLength} from 'restructure/src/utils';
|
|
|
import {ItemVariationStore} from './variations';
|
|
|
|
|
|
// TODO: add this to restructure
|
|
|
class VariableSizeNumber {
|
|
|
constructor(size) {
|
|
|
this._size = size;
|
|
|
}
|
|
|
|
|
|
decode(stream, parent) {
|
|
|
switch (this.size(0, parent)) {
|
|
|
case 1: return stream.readUInt8();
|
|
|
case 2: return stream.readUInt16BE();
|
|
|
case 3: return stream.readUInt24BE();
|
|
|
case 4: return stream.readUInt32BE();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
size(val, parent) {
|
|
|
return resolveLength(this._size, null, parent);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let MapDataEntry = new r.Struct({
|
|
|
entry: new VariableSizeNumber(t => ((t.parent.entryFormat & 0x0030) >> 4) + 1),
|
|
|
outerIndex: t => t.entry >> ((t.parent.entryFormat & 0x000F) + 1),
|
|
|
innerIndex: t => t.entry & ((1 << ((t.parent.entryFormat & 0x000F) + 1)) - 1)
|
|
|
});
|
|
|
|
|
|
let DeltaSetIndexMap = new r.Struct({
|
|
|
entryFormat: r.uint16,
|
|
|
mapCount: r.uint16,
|
|
|
mapData: new r.Array(MapDataEntry, 'mapCount')
|
|
|
});
|
|
|
|
|
|
export default new r.Struct({
|
|
|
majorVersion: r.uint16,
|
|
|
minorVersion: r.uint16,
|
|
|
itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore),
|
|
|
advanceWidthMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
|
|
|
LSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),
|
|
|
RSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap)
|
|
|
});
|
|
|
|