| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- export default class DataSlice {
- constructor(arrayBuffer, sliceOffset, littleEndian, bigTiff) {
- this._dataView = new DataView(arrayBuffer);
- this._sliceOffset = sliceOffset;
- this._littleEndian = littleEndian;
- this._bigTiff = bigTiff;
- }
- get sliceOffset() {
- return this._sliceOffset;
- }
- get sliceTop() {
- return this._sliceOffset + this.buffer.byteLength;
- }
- get littleEndian() {
- return this._littleEndian;
- }
- get bigTiff() {
- return this._bigTiff;
- }
- get buffer() {
- return this._dataView.buffer;
- }
- covers(offset, length) {
- return this.sliceOffset <= offset && this.sliceTop >= offset + length;
- }
- readUint8(offset) {
- return this._dataView.getUint8(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readInt8(offset) {
- return this._dataView.getInt8(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readUint16(offset) {
- return this._dataView.getUint16(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readInt16(offset) {
- return this._dataView.getInt16(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readUint32(offset) {
- return this._dataView.getUint32(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readInt32(offset) {
- return this._dataView.getInt32(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readFloat32(offset) {
- return this._dataView.getFloat32(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readFloat64(offset) {
- return this._dataView.getFloat64(
- offset - this._sliceOffset, this._littleEndian,
- );
- }
- readUint64(offset) {
- const left = this.readUint32(offset);
- const right = this.readUint32(offset + 4);
- let combined;
- if (this._littleEndian) {
- combined = left + ((2 ** 32) * right);
- if (!Number.isSafeInteger(combined)) {
- throw new Error(
- `${combined} exceeds MAX_SAFE_INTEGER. `
- + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',
- );
- }
- return combined;
- }
- combined = ((2 ** 32) * left) + right;
- if (!Number.isSafeInteger(combined)) {
- throw new Error(
- `${combined} exceeds MAX_SAFE_INTEGER. `
- + 'Precision may be lost. Please report if you get this message to https://github.com/geotiffjs/geotiff.js/issues',
- );
- }
- return combined;
- }
- // adapted from https://stackoverflow.com/a/55338384/8060591
- readInt64(offset) {
- let value = 0;
- const isNegative = (this._dataView.getUint8(offset + (this._littleEndian ? 7 : 0)) & 0x80)
- > 0;
- let carrying = true;
- for (let i = 0; i < 8; i++) {
- let byte = this._dataView.getUint8(
- offset + (this._littleEndian ? i : 7 - i),
- );
- if (isNegative) {
- if (carrying) {
- if (byte !== 0x00) {
- byte = ~(byte - 1) & 0xff;
- carrying = false;
- }
- } else {
- byte = ~byte & 0xff;
- }
- }
- value += byte * (256 ** i);
- }
- if (isNegative) {
- value = -value;
- }
- return value;
- }
- readOffset(offset) {
- if (this._bigTiff) {
- return this.readUint64(offset);
- }
- return this.readUint32(offset);
- }
- }
|