source files for faster directory fetches [#26]

This commit is contained in:
Brandon Liu
2022-01-30 20:03:08 +08:00
parent d6298b698d
commit dc4cde0d1d
5 changed files with 291 additions and 5 deletions

48
js/pmtiles.ts Normal file
View File

@@ -0,0 +1,48 @@
export const shift = (n:number, shift:number) => {
return n * Math.pow(2, shift);
}
export const unshift = (n:number, shift:number) => {
return Math.floor(n / Math.pow(2, shift));
}
export const getUint24 = (view:DataView, pos:number) => {
return shift(view.getUint16(pos+1,true),8) + view.getUint8(pos)
}
export const getUint48 = (view:DataView, pos:number) => {
return shift(view.getUint32(pos+2,true),16) + view.getUint16(pos,true)
}
const compare = (tz:number,tx:number,ty:number,view:DataView,i:number) => {
if (tz != view.getUint8(i)) return tz - view.getUint8(i);
var x = getUint24(view,i+1);
if (tx != x) return tx - x;
var y = getUint24(view,i+4);
if (ty != y) return ty - y;
return 0;
}
export const getLeafdir = (view:DataView, z:number, x:number, y:number) => {
return getTile(view,z | 0x80,x,y);
}
export const getTile = (view:DataView, z:number, x:number, y:number) => {
var m = 0;
var n = view.byteLength / 17 - 1;
while (m <= n) {
var k = (n + m) >> 1;
var cmp = compare(z,x,y,view,k*17);
if (cmp > 0) {
m = k + 1;
} else if (cmp < 0) {
n = k - 1;
} else {
return {
offset:getUint48(view,k*17+7),
length:view.getUint32(k*17+13,true)
}
}
}
return null;
}