UNPKG

@cornerstonejs/core

Version:
91 lines (90 loc) 3.27 kB
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, }; }