cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
154 lines (153 loc) • 3.74 kB
JavaScript
import Texture from "../Texture.mjs";
import Texture2D from "../Texture2D.mjs";
var toChar = String.fromCharCode;
var MINELEN = 8;
var MAXELEN = 32767;
function rgbe2float(rgbe, buffer, offset, exposure) {
if (rgbe[3] > 0) {
var f = Math.pow(2, rgbe[3] - 128 - 8 + exposure);
buffer[offset + 0] = rgbe[0] * f;
buffer[offset + 1] = rgbe[1] * f;
buffer[offset + 2] = rgbe[2] * f;
} else {
buffer[offset + 0] = 0;
buffer[offset + 1] = 0;
buffer[offset + 2] = 0;
}
buffer[offset + 3] = 1;
return buffer;
}
function uint82string(array, offset, size) {
var str = "";
for (var i = offset; i < size; i++) {
str += toChar(array[i]);
}
return str;
}
function copyrgbe(s, t) {
t[0] = s[0];
t[1] = s[1];
t[2] = s[2];
t[3] = s[3];
}
function oldReadColors(scan, buffer, offset, xmax) {
var rshift = 0, x = 0, len = xmax;
while (len > 0) {
scan[x][0] = buffer[offset++];
scan[x][1] = buffer[offset++];
scan[x][2] = buffer[offset++];
scan[x][3] = buffer[offset++];
if (scan[x][0] === 1 && scan[x][1] === 1 && scan[x][2] === 1) {
for (var i = scan[x][3] << rshift >>> 0; i > 0; i--) {
copyrgbe(scan[x - 1], scan[x]);
x++;
len--;
}
rshift += 8;
} else {
x++;
len--;
rshift = 0;
}
}
return offset;
}
function readColors(scan, buffer, offset, xmax) {
if (xmax < MINELEN | xmax > MAXELEN) {
return oldReadColors(scan, buffer, offset, xmax);
}
var i = buffer[offset++];
if (i != 2) {
return oldReadColors(scan, buffer, offset - 1, xmax);
}
scan[0][1] = buffer[offset++];
scan[0][2] = buffer[offset++];
i = buffer[offset++];
if ((scan[0][2] << 8 >>> 0 | i) >>> 0 !== xmax) {
return null;
}
for (var i = 0; i < 4; i++) {
for (var x = 0; x < xmax; ) {
var code = buffer[offset++];
if (code > 128) {
code = (code & 127) >>> 0;
var val = buffer[offset++];
while (code--) {
scan[x++][i] = val;
}
} else {
while (code--) {
scan[x++][i] = buffer[offset++];
}
}
}
}
return offset;
}
var ret = {
parseRGBE: function(arrayBuffer, texture, exposure) {
if (exposure == null) {
exposure = 0;
}
var data = new Uint8Array(arrayBuffer);
var size = data.length;
if (uint82string(data, 0, 2) !== "#?") {
return;
}
for (var i = 2; i < size; i++) {
if (toChar(data[i]) === "\n" && toChar(data[i + 1]) === "\n") {
break;
}
}
if (i >= size) {
return;
}
i += 2;
var str = "";
for (; i < size; i++) {
var _char = toChar(data[i]);
if (_char === "\n") {
break;
}
str += _char;
}
var tmp = str.split(" ");
var height = parseInt(tmp[1]);
var width = parseInt(tmp[3]);
if (!width || !height) {
return;
}
var offset = i + 1;
var scanline = [];
for (var x = 0; x < width; x++) {
scanline[x] = [];
for (var j = 0; j < 4; j++) {
scanline[x][j] = 0;
}
}
var pixels = new Float32Array(width * height * 4);
var offset2 = 0;
for (var y = 0; y < height; y++) {
var offset = readColors(scanline, data, offset, width);
if (!offset) {
return null;
}
for (var x = 0; x < width; x++) {
rgbe2float(scanline[x], pixels, offset2, exposure);
offset2 += 4;
}
}
if (!texture) {
texture = new Texture2D();
}
texture.width = width;
texture.height = height;
texture.pixels = pixels;
texture.type = Texture.FLOAT;
return texture;
},
parseRGBEFromPNG: function(png) {
}
};
var hdr = ret;
export { hdr as default };