@cornerstonejs/core
Version:
Cornerstone3D Core
87 lines (86 loc) • 3.21 kB
JavaScript
import { VIDEO_PROJECTION_ID, } from './VideoProjectionTypes.js';
import { normalizeVideoViewState } from './videoViewportCamera.js';
function clonePoint2(point) {
return [point[0], point[1]];
}
function getMediaPixelsPerCanvasPixel(resolvedView) {
const origin = resolvedView.canvasToWorld([0, 0]);
const next = resolvedView.canvasToWorld([1, 0]);
return Math.abs(next[0] - origin[0]) || 1;
}
function getScale(resolvedView, zoom) {
if (!resolvedView) {
return { kind: 'fit', value: zoom };
}
return {
kind: 'nativePixel',
pixelsPerCanvasPixel: getMediaPixelsPerCanvasPixel(resolvedView),
};
}
function getCenterCanvasPoint(canvasWidth, canvasHeight) {
return [canvasWidth / 2, canvasHeight / 2];
}
function getCenterMediaPoint(resolvedView, canvasPoint, viewState) {
if (resolvedView) {
const worldPoint = resolvedView.canvasToWorld(canvasPoint);
return [worldPoint[0], worldPoint[1]];
}
return viewState.anchorWorld ? clonePoint2(viewState.anchorWorld) : [0, 0];
}
export function getVideoProjectionSnapshot(request) {
const { viewport } = request;
const viewState = normalizeVideoViewState(request.viewState ?? viewport.getViewState?.() ?? {});
const resolvedView = request.resolvedView ?? viewport.getResolvedView?.();
const canvasWidth = request.canvasWidth ??
resolvedView?.state?.containerWidth ??
viewport.element?.clientWidth ??
1;
const canvasHeight = request.canvasHeight ??
resolvedView?.state?.containerHeight ??
viewport.element?.clientHeight ??
1;
const canvasPoint = getCenterCanvasPoint(canvasWidth, canvasHeight);
const mediaPoint = getCenterMediaPoint(resolvedView, canvasPoint, viewState);
const zoom = resolvedView?.zoom ?? Math.max(viewState.scale ?? 1, 0.001);
const rawPan = resolvedView?.pan ?? [0, 0];
const rendererCamera = resolvedView?.toICamera();
const frameOfReferenceUID = request.frameOfReferenceUID ??
resolvedView?.getFrameOfReferenceUID() ??
viewport.getFrameOfReferenceUID?.();
return {
kind: VIDEO_PROJECTION_ID,
adapterId: VIDEO_PROJECTION_ID,
canvasHeight,
canvasWidth,
dataId: request.dataId,
frameOfReferenceUID,
presentation: {
pan: clonePoint2(rawPan),
position: {
kind: 'mediaPoint',
mediaPoint,
canvasPoint,
},
rawPan: clonePoint2(rawPan),
rotation: resolvedView?.rotation ?? viewState.rotation ?? 0,
scale: getScale(resolvedView, zoom),
zoom,
},
rendererCamera,
resolvedView,
spaces: {
canvas: true,
image: false,
renderer: Boolean(rendererCamera),
world: Boolean(resolvedView),
},
transforms: resolvedView
? {
canvasToWorld: (point) => resolvedView.canvasToWorld(point),
worldToCanvas: (point) => resolvedView.worldToCanvas(point),
}
: undefined,
viewState,
viewportType: viewport.type,
};
}