@cornerstonejs/core
Version:
Cornerstone3D Core
91 lines (90 loc) • 3.27 kB
JavaScript
import { WSI_PROJECTION_ID, } from './WSIProjectionTypes.js';
function clonePoint2(point) {
return [point[0], point[1]];
}
function normalizeWSIProjectionViewState(viewState) {
return {
...viewState,
centerIndex: viewState.centerIndex
? [viewState.centerIndex[0], viewState.centerIndex[1]]
: undefined,
resolution: typeof viewState.resolution === 'number'
? Math.max(viewState.resolution, 0.000001)
: undefined,
rotation: viewState.rotation ?? 0,
zoom: Math.max(viewState.zoom ?? 1, 0.001),
};
}
function getCenterCanvasPoint(canvasWidth, canvasHeight) {
return [canvasWidth / 2, canvasHeight / 2];
}
function getScale(args) {
const { canvasHeight, rendererCamera, zoom } = args;
if (typeof rendererCamera?.parallelScale === 'number') {
return {
kind: 'physical',
mmPerCanvasPixel: rendererCamera.parallelScale / Math.max(canvasHeight, 1),
};
}
return { kind: 'fit', value: zoom };
}
export function getWSIProjectionSnapshot(request) {
const { viewport } = request;
const currentViewState = request.viewState ?? viewport.getViewState?.();
if (!currentViewState) {
return;
}
const viewState = normalizeWSIProjectionViewState(currentViewState);
const resolvedView = request.resolvedView ?? viewport.getResolvedView?.();
const canvasWidth = request.canvasWidth ??
resolvedView?.state?.canvasWidth ??
viewport.element?.clientWidth ??
1;
const canvasHeight = request.canvasHeight ??
resolvedView?.state?.canvasHeight ??
viewport.element?.clientHeight ??
1;
const canvasPoint = getCenterCanvasPoint(canvasWidth, canvasHeight);
const worldPoint = resolvedView?.canvasToWorld(canvasPoint);
const rendererCamera = resolvedView?.toICamera();
const view = resolvedView?.state?.view;
const zoom = Math.max(view?.getZoom?.() ?? viewState.zoom ?? 1, 0.001);
const rotation = view?.getRotation?.() ?? viewState.rotation ?? 0;
const frameOfReferenceUID = request.frameOfReferenceUID ??
resolvedView?.getFrameOfReferenceUID() ??
viewport.getFrameOfReferenceUID?.();
return {
kind: WSI_PROJECTION_ID,
adapterId: WSI_PROJECTION_ID,
canvasHeight,
canvasWidth,
dataId: request.dataId,
frameOfReferenceUID,
presentation: {
position: {
kind: 'anchor',
worldPoint,
canvasPoint: clonePoint2(canvasPoint),
},
rotation,
scale: getScale({ canvasHeight, rendererCamera, zoom }),
zoom,
},
rendererCamera,
resolvedView,
spaces: {
canvas: Boolean(resolvedView),
image: true,
renderer: Boolean(rendererCamera),
world: Boolean(resolvedView),
},
transforms: resolvedView
? {
canvasToWorld: (point) => resolvedView.canvasToWorld(point),
worldToCanvas: (point) => resolvedView.worldToCanvas(point),
}
: undefined,
viewState,
viewportType: viewport.type,
};
}