readFromBufferHeader()

in src/engine/loaders/LoaderHdr.js [106:291]


  readFromBufferHeader(volumeDst, arrBuf, callbackProgress, callbackComplete) {
    // check arguments
    console.assert(volumeDst != null, 'Null volume');
    console.assert(volumeDst instanceof Volume, 'Should be volume');
    console.assert(arrBuf != null, 'Null array');
    console.assert(arrBuf.constructor.name === 'ArrayBuffer', 'Should be ArrayBuf in arrBuf');

    const bufBytes = new Uint8Array(arrBuf);
    const bufLen = bufBytes.length;
    const HDR_HEADER_SIZE = 348;
    console.log(`Header buf size === ${bufLen}`);

    if (bufLen !== HDR_HEADER_SIZE) {
      if (callbackComplete) {
        callbackComplete(LoadResult.WRONG_HEADER_DATA_SIZE, null, 0, null);
      }
      return false;
    }

    const SIZE_DWORD = 4;
    const SIZE_SHORT = 2;
    const SIZE_BYTE = 1;

    let bufOff = 0;
    // read sizeof header
    const sizeofHdr = LoaderHdr.readIntFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;
    if (sizeofHdr !== HDR_HEADER_SIZE) {
      console.log(`Hdr first int wrong: ${sizeofHdr}, but should be ${HDR_HEADER_SIZE}`);
      if (callbackComplete) {
        callbackComplete(LoadResult.BAD_HEADER, null, 0, null);
      }
      return false;
    }
    const ONE = 1;
    const TWO = 2;

    // read dataType char[10]
    const DATA_TYPE_LEN = 10;
    const strDataType = LoaderHdr.getStringAt(bufBytes, bufOff, DATA_TYPE_LEN);
    bufOff += DATA_TYPE_LEN;
    volumeDst.m_dataType = HDR_DT_NONE;
    if (strDataType === 'CHAR') {
      volumeDst.m_dataType = HDR_DT_UNSIGNED_CHAR;
      volumeDst.m_bytesPerVoxel = ONE;
    }
    if (strDataType === 'SHORT') {
      volumeDst.m_dataType = HDR_DT_SIGNED_SHORT;
      volumeDst.m_bytesPerVoxel = TWO;
    }
    if (volumeDst.m_dataType === HDR_DT_NONE) {
      console.log(`Hdr wrong data type. Should be CHAR or SHORT, but found: ${strDataType}`);
      if (callbackComplete) {
        callbackComplete(LoadResult.BAD_HEADER, null, 0, null);
      }
      return false;
    }
    console.log(`Hdr read data type = ${strDataType}`);

    // read dbName char[18]
    const DB_NAME_LEN = 18;
    bufOff += DB_NAME_LEN;

    // reads extents int
    const iExtents = LoaderHdr.readIntFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;
    const MAGIC_EXTENTS = 16384;
    if (iExtents !== MAGIC_EXTENTS) {
      console.log(`Hdr wrong extents in header. Should be ${MAGIC_EXTENTS}, but found: ${iExtents}`);
      if (callbackComplete) {
        callbackComplete(LoadResult.BAD_HEADER, null, 0, null);
      }
      return false;
    }
    // read session error
    // const iSessionError = HdrVolume.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;

    // read regular
    const iRegular = LoaderHdr.readByteFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_BYTE;

    const MAGIC_REGULAR = 114;
    if (iRegular !== MAGIC_REGULAR) {
      console.log(`Hdr wrong regular in header. Should be ${MAGIC_REGULAR}, but found: ${iRegular}`);
      if (callbackComplete) {
        callbackComplete(LoadResult.BAD_HEADER, null, 0, null);
      }
      return false;
    }

    // read hKeyUn
    // const hKeyUn = HdrVolume.readByteFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_BYTE;

    // read ushort dim[8]
    // const dim0 = HdrVolume.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;
    const dim1 = LoaderHdr.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;
    const dim2 = LoaderHdr.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;
    const dim3 = LoaderHdr.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;

    volumeDst.m_xDim = dim1;
    volumeDst.m_yDim = dim2;
    volumeDst.m_zDim = dim3;
    console.log(`HDR: volume dim = ${volumeDst.m_xDim} * ${volumeDst.m_yDim} * ${volumeDst.m_zDim} `);

    // read unused dim [4,5,6,7]
    const NUM_DIM_UNUSED = 4;
    bufOff += SIZE_SHORT * NUM_DIM_UNUSED;

    // read voxUnits
    const VOX_UNITS_SIZE = 4;
    bufOff += VOX_UNITS_SIZE;

    // read calUnits char[8]
    const CAL_UNITS_SIZE = 8;
    bufOff += CAL_UNITS_SIZE;

    // read unused
    // const unusedH = HdrVolume.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;

    // read dataType
    const dataTypeH = LoaderHdr.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;
    if (volumeDst.m_dataType === HDR_DT_UNSIGNED_CHAR) {
      if (dataTypeH !== HDR_DT_UNSIGNED_CHAR) {
        console.log('Wrong data tye for char typed header');
        return false;
      }
    }
    if (volumeDst.m_dataType === HDR_DT_SIGNED_SHORT) {
      if (dataTypeH !== HDR_DT_SIGNED_SHORT) {
        console.log('Wrong data tye for signed short typed header');
        return false;
      }
    }

    // read bitPix
    const BITS_IN_CHAR = 8;
    const BITS_IN_WORD = 16;

    const bitPixH = LoaderHdr.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;
    if (volumeDst.m_dataType === HDR_DT_UNSIGNED_CHAR) {
      if (bitPixH !== BITS_IN_CHAR) {
        console.log('Wrong bits pix for char typed header');
        return false;
      }
    }
    if (volumeDst.m_dataType === HDR_DT_SIGNED_SHORT) {
      if (bitPixH !== BITS_IN_WORD) {
        console.log('Wrong bits pix for word typed header');
        return false;
      }
    }

    // read dimUn
    // const dimUn = HdrVolume.readShortFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_SHORT;

    // read pixDim : voxelDim
    // const pixDim0 = HdrVolume.readFloatFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;
    const pixDim1 = LoaderHdr.readFloatFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;
    const pixDim2 = LoaderHdr.readFloatFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;
    const pixDim3 = LoaderHdr.readFloatFromBuffer(bufBytes, bufOff);
    bufOff += SIZE_DWORD;

    // read rest of pixDim
    const NUM_REST_PIX_DIM = 4;
    bufOff += SIZE_DWORD * NUM_REST_PIX_DIM;

    volumeDst.m_boxSize.x = volumeDst.m_xDim * pixDim1;
    volumeDst.m_boxSize.y = volumeDst.m_yDim * pixDim2;
    volumeDst.m_boxSize.z = volumeDst.m_zDim * pixDim3;
    console.log(`HDR: physic size = ${volumeDst.m_boxSize.x} * ${volumeDst.m_boxSize.y} * ${volumeDst.m_boxSize.z} `);

    return true;
  }