Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | import fitToWindow from './fitToWindow';
import getImageSize from './getImageSize';
import { CPUFallbackEnabledElement } from '../../../../types';
/**
* This module is responsible for enabling an element to display images with cornerstone
*
* @param {HTMLDivElement} element The DOM element enabled for Cornerstone
* @param {HTMLDivElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone
* @returns {void}
*/
function setCanvasSize(enabledElement: CPUFallbackEnabledElement) {
const { canvas } = enabledElement;
const { clientWidth, clientHeight } = canvas;
// Set the canvas to be same resolution as the client.
if (canvas.width !== clientWidth || canvas.height !== clientHeight) {
canvas.width = clientWidth;
canvas.height = clientHeight;
}
}
/**
* Checks if the image of a given enabled element fitted the window
* before the resize
*
* @param {EnabledElement} enabledElement The Cornerstone Enabled Element
* @param {number} oldCanvasWidth The width of the canvas before the resize
* @param {number} oldCanvasHeight The height of the canvas before the resize
* @return {Boolean} true if it fitted the windows, false otherwise
*/
function wasFitToWindow(
enabledElement: CPUFallbackEnabledElement,
oldCanvasWidth: number,
oldCanvasHeight: number
): boolean {
const scale = enabledElement.viewport.scale;
const imageSize = getImageSize(
enabledElement.image,
enabledElement.viewport.rotation
);
const imageWidth = Math.round(imageSize.width * scale);
const imageHeight = Math.round(imageSize.height * scale);
const x = enabledElement.viewport.translation.x;
const y = enabledElement.viewport.translation.y;
return (
(imageWidth === oldCanvasWidth && imageHeight <= oldCanvasHeight) ||
(imageWidth <= oldCanvasWidth &&
imageHeight === oldCanvasHeight &&
x === 0 &&
y === 0)
);
}
/**
* Rescale the image relative to the changed size of the canvas
*
* @param {EnabledElement} enabledElement The Cornerstone Enabled Element
* @param {number} oldCanvasWidth The width of the canvas before the resize
* @param {number} oldCanvasHeight The height of the canvas before the resize
* @return {void}
*/
function relativeRescale(
enabledElement: CPUFallbackEnabledElement,
oldCanvasWidth: number,
oldCanvasHeight: number
): void {
const scale = enabledElement.viewport.scale;
const canvasWidth = enabledElement.canvas.width;
const canvasHeight = enabledElement.canvas.height;
const relWidthChange = canvasWidth / oldCanvasWidth;
const relHeightChange = canvasHeight / oldCanvasHeight;
const relChange = Math.sqrt(relWidthChange * relHeightChange);
enabledElement.viewport.scale = relChange * scale;
}
/**
* Resizes an enabled element and optionally fits the image to window
*
* @param {HTMLDivElement} element The DOM element enabled for Cornerstone
* @param {Boolean} forceFitToWindow true to to force a refit, false to rescale accordingly
* @returns {void}
*/
export default function (
enabledElement: CPUFallbackEnabledElement,
forceFitToWindow = false
): void {
const oldCanvasWidth = enabledElement.canvas.width;
const oldCanvasHeight = enabledElement.canvas.height;
setCanvasSize(enabledElement);
if (enabledElement.image === undefined) {
return;
}
if (
forceFitToWindow ||
wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight)
) {
// Fit the image to the window again if it fitted before the resize
fitToWindow(enabledElement);
} else {
// Adapt the scale of a zoomed or panned image relative to the size change
relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight);
}
}
|