From 7aca5492c200f434de654d1f74ff105e012cac12 Mon Sep 17 00:00:00 2001 From: Julian Linares Date: Fri, 17 Jan 2025 14:48:24 -0300 Subject: [PATCH 1/4] feat: add getScale function for viewport --- packages/core/src/RenderingEngine/Viewport.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index ce7ae1e56..2a73289e4 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -1996,6 +1996,47 @@ 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 canvasZero = this.worldToCanvas(imageData.indexToWorld([0, 0, 0])); + const canvasEdge = this.worldToCanvas(imageData.indexToWorld([ + dimensions[0] - 1, + dimensions[1] - 1, + dimensions[2], + ])); + + 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; // Or scaleY - they should be the same + } } export default Viewport; From ea5b8f786669a770f69cbb14dc13ec6970a37470 Mon Sep 17 00:00:00 2001 From: Julian Linares Date: Fri, 17 Jan 2025 15:08:50 -0300 Subject: [PATCH 2/4] fix type compatibility --- packages/core/src/RenderingEngine/Viewport.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index 2a73289e4..6875bfa9b 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -2018,12 +2018,24 @@ class Viewport { const originalWidth = dimensions[0]; const originalHeight = dimensions[1]; - const canvasZero = this.worldToCanvas(imageData.indexToWorld([0, 0, 0])); - const canvasEdge = this.worldToCanvas(imageData.indexToWorld([ + 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]); @@ -2035,7 +2047,7 @@ class Viewport { console.warn('Non-uniform scaling detected in viewport. X scale:', scaleX, 'Y scale:', scaleY); } - return scaleX; // Or scaleY - they should be the same + return scaleX; } } From 5a9388059848e66bdb0122bd30889c90bb86ec16 Mon Sep 17 00:00:00 2001 From: Julian Linares Date: Fri, 17 Jan 2025 15:10:21 -0300 Subject: [PATCH 3/4] Api update --- common/reviews/api/core.api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/reviews/api/core.api.md b/common/reviews/api/core.api.md index 1f318988f..b14bfbbdf 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(): { From ec23fdd01bf43683733d01a0f99e48f06b59d984 Mon Sep 17 00:00:00 2001 From: Julian Linares Date: Fri, 17 Jan 2025 15:30:16 -0300 Subject: [PATCH 4/4] fix format --- packages/core/src/RenderingEngine/Viewport.ts | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index 6875bfa9b..ca0af98cf 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -2011,7 +2011,7 @@ class Viewport { getScale() { const imageData = this.getDefaultImageData(); if (!imageData) { - return; + return; } const dimensions = imageData.getDimensions(); @@ -2020,21 +2020,21 @@ class Viewport { const worldZero = imageData.indexToWorld([0, 0, 0]); const worldEdge = imageData.indexToWorld([ - dimensions[0] - 1, - dimensions[1] - 1, - dimensions[2], + dimensions[0] - 1, + dimensions[1] - 1, + dimensions[2], ]); const canvasZero = this.worldToCanvas([ - worldZero[0], - worldZero[1], - worldZero[2] + worldZero[0], + worldZero[1], + worldZero[2], ] as [number, number, number]); const canvasEdge = this.worldToCanvas([ - worldEdge[0], - worldEdge[1], - worldEdge[2] + worldEdge[0], + worldEdge[1], + worldEdge[2], ] as [number, number, number]); const renderedWidth = Math.abs(canvasEdge[0] - canvasZero[0]); @@ -2044,7 +2044,12 @@ class Viewport { 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); + console.warn( + 'Non-uniform scaling detected in viewport. X scale:', + scaleX, + 'Y scale:', + scaleY + ); } return scaleX;