@@ -14,7 +14,7 @@ const version_id = 'dev',
1414
1515/** @summary version date
1616 * @desc Release date in format day/month/year like '14/04/2022' */
17- version_date = '18 /02/2026',
17+ version_date = '19 /02/2026',
1818
1919/** @summary version id and date
2020 * @desc Produced by concatenation of {@link version_id} and {@link version_date}
@@ -122454,20 +122454,17 @@ function createMemberStreamer(element, file, no_string) {
122454122454 member.factor = 1 / element.fFactor;
122455122455 member.min = element.fXmin;
122456122456 member.read = function(buf) { return buf.ntou4() * this.factor + this.min; };
122457- } else
122458- if ((element.fXmin === 0) && member.double32)
122459- member.read = function(buf) { return buf.ntof(); };
122460- else {
122461- member.nbits = Math.round(element.fXmin);
122462- if (member.nbits === 0)
122463- member.nbits = 12;
122464- member.dv = new DataView(new ArrayBuffer(8), 0); // used to cast from uint32 to float32
122465- member.read = function(buf) {
122466- const theExp = buf.ntou1(), theMan = buf.ntou2();
122467- this.dv.setUint32(0, (theExp << 23) | ((theMan & ((1 << (this.nbits + 1)) - 1)) << (23 - this.nbits)));
122468- return ((1 << (this.nbits + 1) & theMan) ? -1 : 1) * this.dv.getFloat32(0);
122469- };
122470- }
122457+ } else if ((element.fXmin === 0) && member.double32)
122458+ member.read = function(buf) { return buf.ntof(); };
122459+ else {
122460+ member.nbits = Math.round(element.fXmin) || 12;
122461+ member.dv = new DataView(new ArrayBuffer(8), 0); // used to cast from uint32 to float32
122462+ member.read = function(buf) {
122463+ const theExp = buf.ntou1(), theMan = buf.ntou2();
122464+ this.dv.setUint32(0, (theExp << 23) | ((theMan & ((1 << (this.nbits + 1)) - 1)) << (23 - this.nbits)));
122465+ return ((1 << (this.nbits + 1) & theMan) ? -1 : 1) * this.dv.getFloat32(0);
122466+ };
122467+ }
122471122468
122472122469 member.readarr = function(buf, len) {
122473122470 const arr = this.double32 ? new Float64Array(len) : new Float32Array(len);
@@ -122478,23 +122475,21 @@ function createMemberStreamer(element, file, no_string) {
122478122475
122479122476 if (member.type < kOffsetL)
122480122477 member.func = function(buf, obj) { obj[this.name] = this.read(buf); };
122481- else
122482- if (member.type > kOffsetP) {
122483- member.cntname = element.fCountName;
122484- member.func = function(buf, obj) {
122485- obj[this.name] = (buf.ntou1() === 1) ? this.readarr(buf, obj[this.cntname]) : null;
122486- };
122487- } else
122488- if (element.fArrayDim < 2) {
122489- member.arrlength = element.fArrayLength;
122490- member.func = function(buf, obj) { obj[this.name] = this.readarr(buf, this.arrlength); };
122491- } else {
122492- member.arrlength = element.fMaxIndex[element.fArrayDim - 1];
122493- member.minus1 = true;
122494- member.func = function(buf, obj) {
122495- obj[this.name] = buf.readNdimArray(this, (buf2, handle) => handle.readarr(buf2, handle.arrlength));
122496- };
122497- }
122478+ else if (member.type > kOffsetP) {
122479+ member.cntname = element.fCountName;
122480+ member.func = function(buf, obj) {
122481+ obj[this.name] = (buf.ntou1() === 1) ? this.readarr(buf, obj[this.cntname]) : null;
122482+ };
122483+ } else if (element.fArrayDim < 2) {
122484+ member.arrlength = element.fArrayLength;
122485+ member.func = function(buf, obj) { obj[this.name] = this.readarr(buf, this.arrlength); };
122486+ } else {
122487+ member.arrlength = element.fMaxIndex[element.fArrayDim - 1];
122488+ member.minus1 = true;
122489+ member.func = function(buf, obj) {
122490+ obj[this.name] = buf.readNdimArray(this, (buf2, handle) => handle.readarr(buf2, handle.arrlength));
122491+ };
122492+ }
122498122493 break;
122499122494
122500122495 case kAnyP:
@@ -127961,7 +127956,7 @@ async function treeProcess(tree, selector, args) {
127961127956
127962127957 for (let k = 0; k < handle.arr.length; ++k) {
127963127958 const elem = handle.arr[k];
127964- if ((elem.type <= 0) || (elem.type >= kOffsetL) || (elem.type === kCharStar))
127959+ if ((elem.type <= 0) || (elem.type >= kOffsetL) || (elem.type === kCharStar) || (elem.type === kFloat16) || (elem.type === kDouble32) )
127965127960 handle.process_arrays = false;
127966127961 }
127967127962
@@ -177495,7 +177490,7 @@ const kBit = 0x00,
177495177490 kUInt32 = 0x08,
177496177491 kInt64 = 0x09,
177497177492 kUInt64 = 0x0A,
177498- // kReal16 = 0x0B, not used yet
177493+ kReal16 = 0x0B,
177499177494 kReal32 = 0x0C,
177500177495 kReal64 = 0x0D,
177501177496 kIndex32 = 0x0E,
@@ -177512,8 +177507,8 @@ const kBit = 0x00,
177512177507 kSplitReal64 = 0x19,
177513177508 kSplitIndex32 = 0x1A,
177514177509 kSplitIndex64 = 0x1B,
177515- // kReal32Trunc = 0x1C, not used yet
177516- // kReal32Quant = 0x1D, not used yet
177510+ kReal32Trunc = 0x1C,
177511+ kReal32Quant = 0x1D,
177517177512 LITTLE_ENDIAN = true;
177518177513
177519177514class RBufferReader {
@@ -178330,6 +178325,62 @@ class ReaderItem {
178330178325 };
178331178326 this.sz = 4;
178332178327 break;
178328+ case kReal16:
178329+ this.func = function(obj) {
178330+ const value = this.view.getUint16(this.o, LITTLE_ENDIAN);
178331+ this.shift_o(2);
178332+ // reimplementing of HalfToFloat
178333+ let fbits = (value & 0x8000) << 16,
178334+ abs = value & 0x7FFF;
178335+ if (abs) {
178336+ fbits |= 0x38000000 << (abs >= 0x7C00 ? 1 : 0);
178337+ for (; abs < 0x400; abs <<= 1, fbits -= 0x800000);
178338+ fbits += abs << 13;
178339+ }
178340+ this.buf.setUint32(0, fbits, true);
178341+ obj[this.name] = this.buf.getFloat32(0, true);
178342+ };
178343+ this.sz = 2;
178344+ this.buf = new DataView(new ArrayBuffer(4), 0);
178345+ break;
178346+ case kReal32Trunc:
178347+ case kReal32Quant:
178348+ this.nbits = this.column.bitsOnStorage;
178349+ if (this.coltype === kReal32Trunc)
178350+ this.buf = new DataView(new ArrayBuffer(4), 0);
178351+ else {
178352+ this.factor = (this.column.maxValue - this.column.minValue) / ((1 << this.nbits) - 1);
178353+ this.min = this.column.minValue;
178354+ }
178355+
178356+ this.func = function(obj) {
178357+ let res = 0, len = this.nbits;
178358+ // extract nbits from the
178359+ while (len > 0) {
178360+ if (this.o2 === 0) {
178361+ this.byte = this.view.getUint8(this.o);
178362+ this.o2 = 8; // number of bits in the value
178363+ }
178364+ const pos = this.nbits - len; // extracted bits
178365+ if (len >= this.o2) {
178366+ res |= (this.byte & ((1 << this.o2) - 1)) << pos; // get all remaining bits
178367+ len -= this.o2;
178368+ this.o2 = 0;
178369+ this.shift_o(1);
178370+ } else {
178371+ res |= (this.byte & ((1 << len) - 1)) << pos; // get only len bits from the value
178372+ this.o2 -= len;
178373+ this.byte >>= len;
178374+ len = 0;
178375+ }
178376+ }
178377+ if (this.buf) {
178378+ this.buf.setUint32(0, res << (32 - this.nbits), true);
178379+ obj[this.name] = this.buf.getFloat32(0, true);
178380+ } else
178381+ obj[this.name] = res * this.factor + this.min;
178382+ };
178383+ break;
178333178384 case kInt64:
178334178385 case kIndex64:
178335178386 this.func = function(obj) {
@@ -178458,12 +178509,8 @@ class ReaderItem {
178458178509 async unzipBlob(blob, cluster_locations, page_indx) {
178459178510 const colEntry = cluster_locations[this.id], // Access column entry
178460178511 numElements = Number(colEntry.pages[page_indx].numElements),
178461- elementSize = this.column.bitsOnStorage / 8;
178462-
178463- let expectedSize = numElements * elementSize;
178464- // Special handling for boolean fields
178465- if (this.coltype === kBit)
178466- expectedSize = Math.ceil(numElements / 8);
178512+ elementSize = this.column.bitsOnStorage / 8,
178513+ expectedSize = Math.ceil(numElements * elementSize);
178467178514
178468178515 // Check if data is compressed
178469178516 if ((colEntry.compression === 0) || (blob.byteLength === expectedSize))
0 commit comments