From ad8f205e419d439bd8e51eff1101b2ef4c314214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C8=98tefan=20Silviu-Alexandru?= Date: Thu, 14 Nov 2024 19:51:44 +0200 Subject: [PATCH] fix: avoid black images after hiding the viewports (#4502) --- .../ViewportService/CornerstoneViewportService.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts index 329610148..444f7a49b 100644 --- a/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts +++ b/extensions/cornerstone/src/services/ViewportService/CornerstoneViewportService.ts @@ -130,6 +130,21 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi * individual resize observers */ public resize(isGridResize = false) { + // https://stackoverflow.com/a/26279685 + // This resize() call, among other things, rerenders the viewports. But when the entire viewer is + // display: none'd, it makes the size of all hidden elements 0, including the viewport canvas and its containers. + // Even if the viewer is later displayed again, trying to render when the size is 0 permanently "breaks" the + // viewport, making it fully black even after the size is normal again. So just ignore resize events when hidden: + const areViewportsHidden = Array.from(this.viewportsById.values()).every(viewportInfo => { + const element = viewportInfo.getElement(); + + return element.clientWidth === 0 && element.clientHeight === 0; + }); + if (areViewportsHidden) { + console.warn('Ignoring resize when viewports have size 0'); + return; + } + // if there is a grid resize happening, it means the viewport grid // has been manipulated (e.g., panels closed, added, etc.) and we need // to resize all viewports, so we will add a timeout here to make sure