diff --git a/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java b/src/main/java/bdv/viewer/render/MultiResolutionRenderer.java index 4a527723e38deed94092c2a1fac69babdeb39685..792980a5f4e4239178906374284a8833fef67b49 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 177d5c843097ea5d94ae6089b9e25c3b70a158f0..eb19226070a885aea25b33fb79215da1e64ef27b 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 ) );