@kitware/vtk.js
Version:
Visualization Toolkit for the Web
142 lines (120 loc) • 4.21 kB
JavaScript
import { m as macro } from '../../macros2.js';
import '../Core/DataAccessHelper/LiteHttpDataAccessHelper.js';
import DataAccessHelper from '../Core/DataAccessHelper.js';
import vtkImageData from '../../Common/DataModel/ImageData.js';
import vtkDataArray from '../../Common/Core/DataArray.js';
import UTIF from 'utif';
// ----------------------------------------------------------------------------
// vtkTIFFReader methods
// ----------------------------------------------------------------------------
function vtkTIFFReader(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkTIFFReader');
// Create default dataAccessHelper if not available
if (!model.dataAccessHelper) {
model.dataAccessHelper = DataAccessHelper.get('http');
}
// Internal method to fetch Array
function fetchData(url, option = {}) {
const {
compression,
progressCallback
} = model;
return model.dataAccessHelper.fetchBinary(url, {
compression,
progressCallback
});
}
// Set DataSet url
publicAPI.setUrl = (url, option = {
binary: true
}) => {
model.url = url;
// Remove the file in the URL
const path = url.split('/');
path.pop();
model.baseURL = path.join('/');
model.compression = option.compression;
// Fetch metadata
return publicAPI.loadData({
progressCallback: option.progressCallback
});
};
// Fetch the actual data arrays
publicAPI.loadData = (option = {}) => {
const promise = fetchData(model.url, option);
promise.then(publicAPI.parse);
return promise;
};
publicAPI.parse = content => {
publicAPI.parseAsArrayBuffer(content);
};
publicAPI.parseAsArrayBuffer = content => {
if (!content) {
return;
}
// Read Header
const ifds = UTIF.decode(content);
UTIF.decodeImage(content, ifds[0]);
const data = UTIF.toRGBA8(ifds[0]);
const width = ifds[0].width;
const height = ifds[0].height;
const output = new Uint8Array(data.length);
if (model.flipY) {
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
const srcIndex = (y * width + x) * 4;
const destIndex = ((height - y - 1) * width + x) * 4;
output[destIndex] = data[srcIndex]; // R
output[destIndex + 1] = data[srcIndex + 1]; // G
output[destIndex + 2] = data[srcIndex + 2]; // B
output[destIndex + 3] = data[srcIndex + 3]; // A
}
}
}
const dataExtent = [0, width - 1, 0, height - 1];
const dataSpacing = [1, 1, 1];
const imageData = vtkImageData.newInstance();
imageData.setDimensions(width, height, 1);
imageData.setExtent(dataExtent);
imageData.setSpacing(dataSpacing);
const dataArray = vtkDataArray.newInstance({
name: 'TIFFImage',
numberOfComponents: 4,
values: output
});
imageData.getPointData().setScalars(dataArray);
model.output[0] = imageData;
};
publicAPI.requestData = (inData, outData) => {
publicAPI.parse(model.parseData);
};
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
flipY: true,
compression: null,
progressCallback: null
};
// ----------------------------------------------------------------------------
function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Make this a VTK object
macro.obj(publicAPI, model);
// Also make it an algorithm with one input and one output
macro.algo(publicAPI, model, 0, 1);
macro.get(publicAPI, model, ['url', 'baseURL']);
macro.setGet(publicAPI, model, ['dataAccessHelper', 'flipY']);
// Object specific methods
vtkTIFFReader(publicAPI, model);
}
// ----------------------------------------------------------------------------
const newInstance = macro.newInstance(extend, 'vtkTIFFReader');
// ----------------------------------------------------------------------------
var vtkTIFFReader$1 = {
newInstance,
extend
};
export { vtkTIFFReader$1 as default, extend, newInstance };