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

50 lines
2.1 KiB
JavaScript

import { bswap32 } from "./fastPforShared";
/**
* Decodes big-endian bytes into `out` without allocating the output buffer.
*
* This function does not copy `bytes`; it writes decoded words into the provided `out` array.
* For aligned inputs it may create a temporary typed-array view (`Uint32Array`) over `bytes.buffer`
* to speed up decoding.
*
* If `byteLength` is not a multiple of 4, the final word is padded with zeros.
*
* @returns Number of int32 words written.
* @throws RangeError If `(offset, byteLength)` is out of bounds, or if `out` is too small.
*/
export function decodeBigEndianInt32sInto(bytes, offset, byteLength, out) {
if (offset < 0 || byteLength < 0 || offset + byteLength > bytes.length) {
throw new RangeError(`decodeBigEndianInt32sInto: out of bounds (offset=${offset}, byteLength=${byteLength}, bytes.length=${bytes.length})`);
}
const numCompleteInts = Math.floor(byteLength / 4);
const hasTrailingBytes = byteLength % 4 !== 0;
const numInts = hasTrailingBytes ? numCompleteInts + 1 : numCompleteInts;
if (out.length < numInts) {
throw new RangeError(`decodeBigEndianInt32sInto: out.length=${out.length} < ${numInts}`);
}
if (numCompleteInts > 0) {
const absoluteOffset = bytes.byteOffset + offset;
if ((absoluteOffset & 3) === 0) {
const u32 = new Uint32Array(bytes.buffer, absoluteOffset, numCompleteInts);
for (let i = 0; i < numCompleteInts; i++) {
out[i] = bswap32(u32[i]) | 0;
}
}
else {
for (let i = 0; i < numCompleteInts; i++) {
const base = offset + i * 4;
out[i] = (bytes[base] << 24) | (bytes[base + 1] << 16) | (bytes[base + 2] << 8) | bytes[base + 3] | 0;
}
}
}
if (hasTrailingBytes) {
const base = offset + numCompleteInts * 4;
const remaining = byteLength - numCompleteInts * 4;
let v = 0;
for (let i = 0; i < remaining; i++) {
v |= bytes[base + i] << (24 - i * 8);
}
out[numCompleteInts] = v | 0;
}
return numInts;
}
//# sourceMappingURL=bigEndianDecode.js.map