You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.2 KiB
32 lines
1.2 KiB
import { inflate } from 'pako';
|
|
import Lerc from 'lerc';
|
|
import BaseDecoder from './basedecoder.js';
|
|
import { LercParameters, LercAddCompression } from '../globals.js';
|
|
|
|
export default class LercDecoder extends BaseDecoder {
|
|
constructor(fileDirectory) {
|
|
super();
|
|
|
|
this.planarConfiguration = typeof fileDirectory.PlanarConfiguration !== 'undefined' ? fileDirectory.PlanarConfiguration : 1;
|
|
this.samplesPerPixel = typeof fileDirectory.SamplesPerPixel !== 'undefined' ? fileDirectory.SamplesPerPixel : 1;
|
|
|
|
this.addCompression = fileDirectory.LercParameters[LercParameters.AddCompression];
|
|
}
|
|
|
|
decodeBlock(buffer) {
|
|
switch (this.addCompression) {
|
|
case LercAddCompression.None:
|
|
break;
|
|
case LercAddCompression.Deflate:
|
|
buffer = inflate(new Uint8Array(buffer)).buffer; // eslint-disable-line no-param-reassign, prefer-destructuring
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported LERC additional compression method identifier: ${this.addCompression}`);
|
|
}
|
|
|
|
const lercResult = Lerc.decode(buffer, { returnPixelInterleavedDims: this.planarConfiguration === 1 });
|
|
const lercData = lercResult.pixels[0];
|
|
return lercData.buffer;
|
|
}
|
|
}
|