UNPKG

@cornerstonejs/core

Version:
87 lines (86 loc) 3.21 kB
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, }; }