From 5afe173418cf025e1a9c9c4e054a783b52d6a370 Mon Sep 17 00:00:00 2001 From: tpietzsch <tobias.pietzsch@gmail.com> Date: Thu, 17 Sep 2020 17:48:46 +0200 Subject: [PATCH] Bugfix: correctly handle interval requests that have no overlap with screen See https://github.com/maarzt/imglib2-labkit/pull/59#issuecomment-694227058 --- .../render/MultiResolutionRenderer.java | 4 ++++ .../java/bdv/viewer/render/ScreenScales.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java index 4a527723..792980a5 100644 --- a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java +++ b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java @@ -328,6 +328,10 @@ public class MultiResolutionRenderer */ public synchronized void requestRepaint( final Interval interval ) { + // if interval doesn't overlap the screen, do nothing + if ( Intervals.isEmpty( screenScales.clipToScreen( interval ) ) ) + return; + if ( !intervalMode && !renderingMayBeCancelled ) { /* diff --git a/src/main/java/bdv/viewer/render/ScreenScales.java b/src/main/java/bdv/viewer/render/ScreenScales.java index 177d5c84..eb192260 100644 --- a/src/main/java/bdv/viewer/render/ScreenScales.java +++ b/src/main/java/bdv/viewer/render/ScreenScales.java @@ -129,6 +129,25 @@ class ScreenScales return screenScales.size() - 1; } + /** + * Compute the intersection of {@code interval} and the screen area. + * + * @param interval + * a 2D interval in screen coordinates + * + * @return intersection of {@code interval} and the screen area + */ + public Interval clipToScreen( final Interval interval ) + { + // This is equivalent to + // Intervals.intersect( interval, new FinalInterval( screenW, screenH ) ); + return Intervals.createMinMax( + Math.max( 0, interval.min( 0 ) ), + Math.max( 0, interval.min( 1 ) ), + Math.min( screenW - 1, interval.max( 0 ) ), + Math.min( screenH - 1, interval.max( 1 ) ) ); + } + public void requestInterval( final Interval screenInterval ) { screenScales.forEach( s -> s.requestInterval( screenInterval ) ); -- GitLab