@cornerstonejs/core
Version:
Cornerstone3D Core
53 lines (52 loc) • 1.82 kB
JavaScript
import { normalizeECGViewState } from './ecgViewportCamera.js';
const DEFAULT_SELECTOR = {
zoom: true,
pan: true,
};
function hasOwn(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
export function getECGProjectionPresentation(snapshot, selector) {
const target = {};
const ecgSelector = selector ?? DEFAULT_SELECTOR;
const zoom = snapshot.presentation.zoom ?? 1;
if (ecgSelector.zoom) {
target.zoom = zoom;
}
if (ecgSelector.pan) {
const pan = snapshot.presentation.rawPan;
target.pan = [pan[0] / zoom, pan[1] / zoom];
}
return target;
}
export function withECGProjectionPresentation(snapshot, presentation, options = {}) {
const viewState = snapshot.viewState;
const hasZoom = hasOwn(presentation, 'zoom');
const hasPan = hasOwn(presentation, 'pan');
const nextZoom = Math.max(presentation.zoom ?? snapshot.presentation.zoom ?? viewState.scale ?? 1, 0.001);
let resolvedView = snapshot.resolvedView;
let nextViewState = normalizeECGViewState(viewState);
if (hasZoom) {
if (resolvedView) {
resolvedView = resolvedView.withZoom(nextZoom, options.anchorCanvas);
nextViewState = normalizeECGViewState(resolvedView.state.viewState);
}
else {
nextViewState = normalizeECGViewState({
...nextViewState,
scale: nextZoom,
scaleMode: 'fit',
});
}
}
if (hasPan && presentation.pan) {
const targetPan = [
presentation.pan[0] * nextZoom,
presentation.pan[1] * nextZoom,
];
if (resolvedView) {
nextViewState = normalizeECGViewState(resolvedView.withPan(targetPan).state.viewState);
}
}
return nextViewState;
}