@kitware/vtk.js
Version:
Visualization Toolkit for the Web
174 lines (129 loc) • 5.51 kB
JavaScript
import macro from '../../macros.js';
var vtkErrorMacro = macro.vtkErrorMacro; // ----------------------------------------------------------------------------
// vtkCanvasView methods
// ----------------------------------------------------------------------------
function vtkCanvasView(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkCanvasView'); // Auto update style
function updateWindow() {
// Canvas size
if (model._renderable) {
model.canvas.setAttribute('width', model.size[0]);
model.canvas.setAttribute('height', model.size[1]);
} // ImageStream size
if (model.viewStream) {
// If same size that's a NoOp
model.viewStream.setSize(model.size[0], model.size[1]);
} // Offscreen ?
model.canvas.style.display = model.useOffScreen ? 'none' : 'block'; // Cursor type
if (model.el) {
model.el.style.cursor = model.cursorVisibility ? model.cursor : 'none';
}
}
publicAPI.onModified(updateWindow);
publicAPI.setContainer = function (el) {
if (model.el && model.el !== el) {
if (model.canvas.parentNode !== model.el) {
vtkErrorMacro('Error: canvas parent node does not match container');
} // Remove canvas from previous container
model.el.removeChild(model.canvas); // If the renderer has previously added
// a background image, remove it from the DOM.
if (model.el.contains(model.bgImage)) {
model.el.removeChild(model.bgImage);
}
}
if (model.el !== el) {
model.el = el;
if (model.el) {
model.el.appendChild(model.canvas);
} // If the renderer is set to use a background
// image, attach it to the DOM.
if (model.useBackgroundImage) {
model.el.appendChild(model.bgImage);
} // Trigger modified()
publicAPI.modified();
}
};
publicAPI.setBackgroundImage = function (img) {
model.bgImage.src = img.src;
};
publicAPI.setUseBackgroundImage = function (value) {
model.useBackgroundImage = value; // Add or remove the background image from the
// DOM as specified.
if (model.useBackgroundImage && model.el && !model.el.contains(model.bgImage)) {
model.el.appendChild(model.bgImage);
} else if (!model.useBackgroundImage && model.el && model.el.contains(model.bgImage)) {
model.el.removeChild(model.bgImage);
}
};
publicAPI.setViewStream = function (stream) {
if (model.viewStream === stream) {
return false;
}
if (model.subscription) {
model.subscription.unsubscribe();
model.subscription = null;
}
model.viewStream = stream;
if (model.viewStream) {
// Enable display of the background image
publicAPI.setUseBackgroundImage(true); // Bind to remote stream
model.subscription = model.viewStream.onImageReady(function (e) {
return publicAPI.setBackgroundImage(e.image);
});
model.viewStream.setSize(model.size[0], model.size[1]);
model.viewStream.invalidateCache();
model.viewStream.render();
publicAPI.modified();
}
return true;
};
publicAPI.delete = macro.chain(publicAPI.setViewStream, publicAPI.delete); // --------------------------------------------------------------------------
// Make us look like a View (i.e.: vtkOpenGLRenderWindow)
// --------------------------------------------------------------------------
model._renderable = publicAPI;
model._renderers = [publicAPI];
publicAPI.traverseAllPasses = function () {};
publicAPI.isInViewport = function () {
return true;
};
publicAPI.getInteractive = function () {
return true;
};
} // ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
var DEFAULT_VALUES = {
canvas: null,
size: [300, 300],
cursorVisibility: true,
cursor: 'pointer',
useOffScreen: false,
useBackgroundImage: false
}; // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues); // Create internal instances
model.canvas = document.createElement('canvas');
model.canvas.style.width = '100%'; // Create internal bgImage
model.bgImage = new Image();
model.bgImage.style.position = 'absolute';
model.bgImage.style.left = '0';
model.bgImage.style.top = '0';
model.bgImage.style.width = '100%';
model.bgImage.style.height = '100%';
model.bgImage.style.zIndex = '-1'; // Inheritance
macro.obj(publicAPI, model, initialValues); // Build VTK API
macro.get(publicAPI, model, ['useBackgroundImage', '_renderable']);
macro.setGet(publicAPI, model, ['canvas', 'cursor', 'useOffScreen', 'interactor']);
macro.setGetArray(publicAPI, model, ['size'], 2);
macro.getArray(publicAPI, model, ['_renderers']);
macro.moveToProtected(publicAPI, model, ['renderable', 'renderers']); // Object methods
vtkCanvasView(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkCanvasView'); // ----------------------------------------------------------------------------
var vtkCanvasView$1 = {
newInstance: newInstance,
extend: extend
};
export { vtkCanvasView$1 as default, extend, newInstance };