Files
RGC/SuiviREForamteur/node_modules/fast-png/lib/helpers/decodeInterlaceNull.js
2026-02-11 13:57:54 +01:00

60 lines
2.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeInterlaceNull = decodeInterlaceNull;
const unfilter_1 = require("./unfilter");
const uint16 = new Uint16Array([0x00ff]);
const uint8 = new Uint8Array(uint16.buffer);
const osIsLittleEndian = uint8[0] === 0xff;
const empty = new Uint8Array(0);
function decodeInterlaceNull(params) {
const { data, width, height, channels, depth } = params;
const bytesPerPixel = Math.ceil(depth / 8) * channels;
const bytesPerLine = Math.ceil((depth / 8) * channels * width);
const newData = new Uint8Array(height * bytesPerLine);
let prevLine = empty;
let offset = 0;
let currentLine;
let newLine;
for (let i = 0; i < height; i++) {
currentLine = data.subarray(offset + 1, offset + 1 + bytesPerLine);
newLine = newData.subarray(i * bytesPerLine, (i + 1) * bytesPerLine);
switch (data[offset]) {
case 0:
(0, unfilter_1.unfilterNone)(currentLine, newLine, bytesPerLine);
break;
case 1:
(0, unfilter_1.unfilterSub)(currentLine, newLine, bytesPerLine, bytesPerPixel);
break;
case 2:
(0, unfilter_1.unfilterUp)(currentLine, newLine, prevLine, bytesPerLine);
break;
case 3:
(0, unfilter_1.unfilterAverage)(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);
break;
case 4:
(0, unfilter_1.unfilterPaeth)(currentLine, newLine, prevLine, bytesPerLine, bytesPerPixel);
break;
default:
throw new Error(`Unsupported filter: ${data[offset]}`);
}
prevLine = newLine;
offset += bytesPerLine + 1;
}
if (depth === 16) {
const uint16Data = new Uint16Array(newData.buffer);
if (osIsLittleEndian) {
for (let k = 0; k < uint16Data.length; k++) {
// PNG is always big endian. Swap the bytes.
uint16Data[k] = swap16(uint16Data[k]);
}
}
return uint16Data;
}
else {
return newData;
}
}
function swap16(val) {
return ((val & 0xff) << 8) | ((val >> 8) & 0xff);
}
//# sourceMappingURL=decodeInterlaceNull.js.map