@cornerstonejs/core
Version:
Cornerstone3D Core
109 lines (108 loc) • 3.91 kB
JavaScript
import ResolvedViewportView from '../ResolvedViewportView.js';
import { getAnchorWorldForPan, getPanForVideoCanvasMapping, resolveVideoCanvasMapping, } from './videoViewportCamera.js';
class VideoResolvedView extends ResolvedViewportView {
get zoom() {
return Math.max(this.state.viewState.scale ?? 1, 0.001);
}
get pan() {
return this.getCanvasMapping()
? getPanForVideoCanvasMapping(this.getCanvasMapping())
: [0, 0];
}
get rotation() {
return this.state.viewState.rotation ?? 0;
}
canvasToWorld(canvasPos) {
const mapping = this.getCanvasMapping();
return [
(canvasPos[0] - mapping.left) / mapping.worldToCanvasRatio,
(canvasPos[1] - mapping.top) / mapping.worldToCanvasRatio,
0,
];
}
worldToCanvas(worldPos) {
const mapping = this.getCanvasMapping();
return [
mapping.left + worldPos[0] * mapping.worldToCanvasRatio,
mapping.top + worldPos[1] * mapping.worldToCanvasRatio,
];
}
getFrameOfReferenceUID() {
return this.state.frameOfReferenceUID;
}
withZoom(zoom, canvasPoint) {
const nextZoom = Math.max(zoom, 0.001);
if (!canvasPoint) {
return this.cloneWithViewState({
...this.state.viewState,
scale: nextZoom,
scaleMode: 'fit',
});
}
const worldPoint = this.canvasToWorld(canvasPoint);
return this.cloneWithViewState({
...this.state.viewState,
anchorCanvas: [
canvasPoint[0] / Math.max(this.state.containerWidth, 1),
canvasPoint[1] / Math.max(this.state.containerHeight, 1),
],
anchorWorld: [worldPoint[0], worldPoint[1]],
scale: nextZoom,
scaleMode: 'fit',
});
}
withPan(pan) {
return this.cloneWithViewState({
...this.state.viewState,
anchorWorld: getAnchorWorldForPan([pan[0], pan[1]], this.getCanvasMapping()),
});
}
buildICamera() {
const mapping = this.getCanvasMapping();
const focalPoint = this.canvasToWorld([
this.state.containerWidth / 2,
this.state.containerHeight / 2,
]);
return {
parallelProjection: true,
focalPoint,
position: [0, 0, 0],
viewUp: [0, -1, 0],
parallelScale: this.state.containerHeight /
2 /
Math.max(mapping.worldToCanvasRatio, 0.001),
viewPlaneNormal: [0, 0, 1],
rotation: this.rotation,
};
}
getCanvasMapping() {
this.cachedCanvasMapping ||= resolveVideoCanvasMapping({
camera: this.state.viewState,
containerHeight: this.state.containerHeight,
containerWidth: this.state.containerWidth,
intrinsicHeight: this.state.intrinsicHeight,
intrinsicWidth: this.state.intrinsicWidth,
objectFit: this.state.objectFit,
}) || {
left: 0,
top: 0,
width: Math.max(this.state.intrinsicWidth, 1),
height: Math.max(this.state.intrinsicHeight, 1),
containerWidth: Math.max(this.state.containerWidth, 1),
containerHeight: Math.max(this.state.containerHeight, 1),
intrinsicWidth: Math.max(this.state.intrinsicWidth, 1),
intrinsicHeight: Math.max(this.state.intrinsicHeight, 1),
anchorWorld: [0, 0],
anchorCanvas: [0.5, 0.5],
worldToCanvasRatio: 1,
};
return this.cachedCanvasMapping;
}
cloneWithViewState(viewState) {
return new VideoResolvedView({
...this.state,
viewState,
});
}
}
export default VideoResolvedView;