Files
Projekt-Visualisierung/node_modules/@maplibre/mlt/dist/encoding/encodingUtils.js
2026-04-15 17:08:39 +02:00

107 lines
3.5 KiB
JavaScript

export function encodeFloatsLE(values) {
const buffer = new Uint8Array(values.length * 4);
const view = new DataView(buffer.buffer);
for (let i = 0; i < values.length; i++) {
view.setFloat32(i * 4, values[i], true);
}
return buffer;
}
export function encodeDoubleLE(values) {
const buffer = new Uint8Array(values.length * Float64Array.BYTES_PER_ELEMENT);
const view = new DataView(buffer.buffer);
for (let i = 0; i < values.length; i++) {
view.setFloat64(i * Float64Array.BYTES_PER_ELEMENT, values[i], true);
}
return buffer;
}
export function encodeBooleanRle(values) {
// Pack booleans into bytes (8 booleans per byte)
const numBytes = Math.ceil(values.length / 8);
const packed = new Uint8Array(numBytes);
for (let i = 0; i < values.length; i++) {
if (values[i]) {
const byteIndex = Math.floor(i / 8);
const bitIndex = i % 8;
packed[byteIndex] |= 1 << bitIndex;
}
}
const result = new Uint8Array(1 + numBytes);
result[0] = 256 - numBytes;
result.set(packed, 1);
return result;
}
export function encodeByteRle(values) {
const result = [];
let i = 0;
while (i < values.length) {
const currentByte = values[i];
let runLength = 1;
while (i + runLength < values.length && values[i + runLength] === currentByte && runLength < 131) {
runLength++;
}
if (runLength >= 3) {
const header = runLength - 3;
result.push(Math.min(header, 0x7f));
result.push(currentByte);
i += runLength;
}
else {
const literalStart = i;
while (i < values.length) {
let nextRunLength = 1;
if (i + 1 < values.length) {
while (i + nextRunLength < values.length &&
values[i + nextRunLength] === values[i] &&
nextRunLength < 3) {
nextRunLength++;
}
}
if (nextRunLength >= 3) {
break;
}
i++;
if (i - literalStart >= 128) {
break;
}
}
const numLiterals = i - literalStart;
const header = 256 - numLiterals;
result.push(header);
for (let j = literalStart; j < i; j++) {
result.push(values[j]);
}
}
}
return new Uint8Array(result);
}
export function encodeStrings(strings) {
const encoder = new TextEncoder();
const encoded = strings.map((s) => encoder.encode(s));
const totalLength = encoded.reduce((sum, arr) => sum + arr.length, 0);
const result = new Uint8Array(totalLength);
let offset = 0;
for (const arr of encoded) {
result.set(arr, offset);
offset += arr.length;
}
return result;
}
export function createStringLengths(strings) {
const lengths = new Uint32Array(strings.length);
const encoder = new TextEncoder();
for (let i = 0; i < strings.length; i++) {
lengths[i] = encoder.encode(strings[i]).length;
}
return lengths;
}
export function concatenateBuffers(...buffers) {
const totalLength = buffers.reduce((sum, buf) => sum + buf.length, 0);
const result = new Uint8Array(totalLength);
let offset = 0;
for (const buffer of buffers) {
result.set(buffer, offset);
offset += buffer.length;
}
return result;
}
//# sourceMappingURL=encodingUtils.js.map