diff --git a/common/reviews/api/core.api.md b/common/reviews/api/core.api.md index 1f318988ff..b14bfbbdf7 100644 --- a/common/reviews/api/core.api.md +++ b/common/reviews/api/core.api.md @@ -4292,6 +4292,8 @@ export class Viewport { // (undocumented) getRotation: () => number; // (undocumented) + getScale(): number; + // (undocumented) getSliceIndex(): number; // (undocumented) getSliceViewInfo(): { diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index ce7ae1e569..ca0af98cfb 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -1996,6 +1996,64 @@ class Viewport { public setDataIds(_imageIds: string[], _options?: DataSetOptions) { throw new Error('Unsupported operatoin setDataIds'); } + + /** + * Returns the scaling factor of the rendered image compared to its original dimensions. + * Scale of 1 means the image is rendered at its original size. + * + * @returns {number|undefined} The scale factor of the rendered image, or undefined if no image data is available. + * Assumes uniform scaling - will log a warning if x and y scales differ by more than 0.01. + * + * @example + * const scale = viewport.getScale(); + * // scale = 0.5 means a 1000x1000 image is rendered as 500x500 + */ + getScale() { + const imageData = this.getDefaultImageData(); + if (!imageData) { + return; + } + + const dimensions = imageData.getDimensions(); + const originalWidth = dimensions[0]; + const originalHeight = dimensions[1]; + + const worldZero = imageData.indexToWorld([0, 0, 0]); + const worldEdge = imageData.indexToWorld([ + dimensions[0] - 1, + dimensions[1] - 1, + dimensions[2], + ]); + + const canvasZero = this.worldToCanvas([ + worldZero[0], + worldZero[1], + worldZero[2], + ] as [number, number, number]); + + const canvasEdge = this.worldToCanvas([ + worldEdge[0], + worldEdge[1], + worldEdge[2], + ] as [number, number, number]); + + const renderedWidth = Math.abs(canvasEdge[0] - canvasZero[0]); + const renderedHeight = Math.abs(canvasEdge[1] - canvasZero[1]); + + const scaleX = renderedWidth / originalWidth; + const scaleY = renderedHeight / originalHeight; + + if (Math.abs(scaleX - scaleY) > 0.01) { + console.warn( + 'Non-uniform scaling detected in viewport. X scale:', + scaleX, + 'Y scale:', + scaleY + ); + } + + return scaleX; + } } export default Viewport;