v3 js: varint routines [#41]

This commit is contained in:
Brandon Liu
2022-09-19 21:13:58 -07:00
parent 07eaf102a9
commit fbb0f4614c
2 changed files with 89 additions and 5 deletions

View File

@@ -1,3 +1,60 @@
interface BufferPosition {
buf: Uint8Array;
pos: number;
}
function toNum(low: number, high: number): number {
return (high >>> 0) * 0x100000000 + (low >>> 0);
}
function readVarintRemainder(l: number, p: BufferPosition): number {
var buf = p.buf,
h,
b;
b = buf[p.pos++];
h = (b & 0x70) >> 4;
if (b < 0x80) return toNum(l, h);
b = buf[p.pos++];
h |= (b & 0x7f) << 3;
if (b < 0x80) return toNum(l, h);
b = buf[p.pos++];
h |= (b & 0x7f) << 10;
if (b < 0x80) return toNum(l, h);
b = buf[p.pos++];
h |= (b & 0x7f) << 17;
if (b < 0x80) return toNum(l, h);
b = buf[p.pos++];
h |= (b & 0x7f) << 24;
if (b < 0x80) return toNum(l, h);
b = buf[p.pos++];
h |= (b & 0x01) << 31;
if (b < 0x80) return toNum(l, h);
throw new Error("Expected varint not more than 10 bytes");
}
export function readVarint(p: BufferPosition): number {
var buf = p.buf,
val,
b;
b = buf[p.pos++];
val = b & 0x7f;
if (b < 0x80) return val;
b = buf[p.pos++];
val |= (b & 0x7f) << 7;
if (b < 0x80) return val;
b = buf[p.pos++];
val |= (b & 0x7f) << 14;
if (b < 0x80) return val;
b = buf[p.pos++];
val |= (b & 0x7f) << 21;
if (b < 0x80) return val;
b = buf[p.pos];
val |= (b & 0x0f) << 28;
return readVarintRemainder(val, p);
}
function rotate(n: number, xy: number[], rx: number, ry: number): void {
if (ry == 0) {
if (rx == 1) {
@@ -98,4 +155,3 @@ export function findTile(entries: Entry[], tileId: number): Entry | null {
}
return null;
}