Skip to content
Snippets Groups Projects
Commit 1ce9aea3 authored by Tobias Pietzsch's avatar Tobias Pietzsch
Browse files

WIP Fix interplay between interval/normal mode and synchronization

parent fbbe8b70
No related branches found
Tags
No related merge requests found
......@@ -321,25 +321,27 @@ public class MultiResolutionRenderer
if ( display.getWidth() <= 0 || display.getHeight() <= 0 )
return false;
System.out.println( "intervalMode = " + intervalMode );
System.out.println( " newFrameRequest = " + newFrameRequest );
System.out.println( " newIntervalRequest = " + newIntervalRequest );
System.out.println( " current/requested/max ScreenScaleIndex = " + currentScreenScaleIndex + " / " + requestedScreenScaleIndex + " / " + maxScreenScaleIndex );
System.out.println( " current/requested/max IntervalScaleIndex = " + currentIntervalScaleIndex + " / " + requestedIntervalScaleIndex + " / " + maxIntervalScaleIndex );
final boolean resized = checkResize();
final boolean newFrame;
final boolean newInterval;
final boolean paintInterval;
synchronized ( this )
{
if ( intervalMode )
newFrame = newFrameRequest || resized;
if ( newFrame )
{
return paintInterval();
newFrameRequest = false;
intervalMode = false;
}
newFrame = newFrameRequest || resized;
newFrameRequest = false;
paintInterval = intervalMode;
newInterval = newIntervalRequest;
newIntervalRequest = false;
}
if ( paintInterval )
return paintInterval( newInterval );
if ( newFrame )
{
cacheControl.prepareNextFrame();
......@@ -371,7 +373,7 @@ public class MultiResolutionRenderer
renderResult.setScaleFactor( screenScaleFactors[ requestedScreenScaleIndex ] );
renderStorage.checkRenewData( screenScales[ 0 ].w, screenScales[ 0 ].h, currentNumVisibleSources );
projector = createProjector( currentViewerState, requestedScreenScaleIndex, renderResult.getScreenImage() );
projector = createProjector( currentViewerState, requestedScreenScaleIndex, renderResult.getScreenImage(), 0, 0 );
requestNewFrameIfIncomplete = projectorFactory.requestNewFrameIfIncomplete();
renderingMayBeCancelled = ( requestedScreenScaleIndex < maxScreenScaleIndex );
}
......@@ -405,7 +407,12 @@ public class MultiResolutionRenderer
if ( currentScreenScaleIndex > 0 )
requestRepaint( currentScreenScaleIndex - 1 );
else if ( !p.isValid() )
else if ( p.isValid() )
{
// indicate that rendering is complete
requestedScreenScaleIndex = -1;
}
else
{
try
{
......@@ -487,7 +494,9 @@ public class MultiResolutionRenderer
private VolatileProjector createProjector(
final ViewerState viewerState,
final int screenScaleIndex,
final RandomAccessibleInterval< ARGBType > screenImage )
final RandomAccessibleInterval< ARGBType > screenImage,
final double offsetX,
final double offsetY )
{
/*
* This shouldn't be necessary, with
......@@ -498,6 +507,7 @@ public class MultiResolutionRenderer
final AffineTransform3D screenScaleTransform = screenScales[ screenScaleIndex ].scale;
final AffineTransform3D screenTransform = viewerState.getViewerTransform();
screenTransform.preConcatenate( screenScaleTransform );
screenTransform.translate( -offsetX, -offsetY, 0 );
final VolatileProjector projector = projectorFactory.createProjector(
viewerState,
......@@ -512,6 +522,7 @@ public class MultiResolutionRenderer
// =========== intervals =============
private Interval requestedScreenInterval;
......@@ -521,7 +532,6 @@ public class MultiResolutionRenderer
private int requestedIntervalScaleIndex;
private int currentIntervalScaleIndex;
private int maxIntervalScaleIndex;
private VolatileProjector intervalProjector;
public static class IntervalRenderData
{
......@@ -545,16 +555,8 @@ public class MultiResolutionRenderer
private final RenderResult intervalResult;
private IntervalRenderData intervalRenderData;
private boolean paintInterval()
private boolean paintInterval( final boolean newInterval )
{
final boolean newInterval;
synchronized ( this )
{
newInterval = newIntervalRequest;
newIntervalRequest = false;
}
if ( newInterval )
{
cacheControl.prepareNextFrame();
......@@ -578,42 +580,56 @@ public class MultiResolutionRenderer
intervalResult.setScaleFactor( intervalScale );
final double offsetX = interval.min( 0 );
final double offsetY = interval.min( 1 );
intervalProjector = createProjector( currentViewerState, requestedIntervalScaleIndex, intervalResult.getScreenImage(), offsetX, offsetY );
projector = createProjector( currentViewerState, requestedIntervalScaleIndex, intervalResult.getScreenImage(), offsetX, offsetY );
final Interval targetInterval = scaleScreenInterval( requestedScreenInterval, currentScreenScaleIndex );
final double relativeScale = screenScaleFactors[ currentScreenScaleIndex ];
final double relativeScale = screenScaleFactors[ currentScreenScaleIndex ] / intervalScale;
final double tx = interval.min( 0 ) * relativeScale;
final double ty = interval.min( 1 ) * relativeScale;
intervalRenderData = new IntervalRenderData( targetInterval, tx, ty );
renderingMayBeCancelled = ( requestedIntervalScaleIndex < maxIntervalScaleIndex );
}
p = intervalProjector;
p = projector;
}
final boolean success = p.map();
if ( success )
synchronized ( this )
{
if ( createProjector )
currentIntervalScaleIndex = requestedIntervalScaleIndex;
if ( success )
{
if ( createProjector )
currentIntervalScaleIndex = requestedIntervalScaleIndex;
( ( BufferedImageRenderResult ) currentRenderResult ).patch( intervalResult, intervalRenderData.targetInterval, intervalRenderData.tx, intervalRenderData.ty );
currentRenderResult.patch( intervalResult, intervalRenderData.targetInterval, intervalRenderData.tx, intervalRenderData.ty );
if ( currentIntervalScaleIndex > currentScreenScaleIndex )
requestRepaintInterval( currentIntervalScaleIndex - 1 );
else if ( !p.isValid() )
{
try
if ( currentIntervalScaleIndex > currentScreenScaleIndex )
requestRepaintInterval( currentIntervalScaleIndex - 1 );
else if ( p.isValid() )
{
Thread.sleep( 1 );
if ( requestedScreenScaleIndex >= 0 )
{
// go back to "normal" rendering
intervalMode = false;
if ( requestedScreenScaleIndex == currentScreenScaleIndex )
++currentScreenScaleIndex;
painterThread.requestRepaint();
}
}
catch ( final InterruptedException e )
else
{
// restore interrupted state
Thread.currentThread().interrupt();
try
{
Thread.sleep( 1 );
}
catch ( final InterruptedException e )
{
// restore interrupted state
Thread.currentThread().interrupt();
}
requestRepaintInterval( currentIntervalScaleIndex );
}
requestRepaintInterval( currentIntervalScaleIndex );
}
}
......@@ -625,7 +641,8 @@ public class MultiResolutionRenderer
final int clipW = screenScales[ intervalScaleIndex ].w;
final int clipH = screenScales[ intervalScaleIndex ].h;
final double scale = screenScaleFactors[ intervalScaleIndex ];
// This is equivalent to Intervals.intersect( new FinalInterval( clipW, clipH ), Intervals.smallestContainingInterval( Intervals.scale( requestedScreenInterval, scale ) ) );
// This is equivalent to
// Intervals.intersect( new FinalInterval( clipW, clipH ), Intervals.smallestContainingInterval( Intervals.scale( requestedScreenInterval, scale ) ) );
return Intervals.createMinMax(
Math.max( 0, ( int ) Math.floor( requestedScreenInterval.min( 0 ) * scale ) ),
Math.max( 0, ( int ) Math.floor( requestedScreenInterval.min( 1 ) * scale ) ),
......@@ -634,35 +651,6 @@ public class MultiResolutionRenderer
);
}
private VolatileProjector createProjector(
final ViewerState viewerState,
final int screenScaleIndex,
final RandomAccessibleInterval< ARGBType > screenImage,
final double offsetX,
final double offsetY )
{
/*
* This shouldn't be necessary, with
* CacheHints.LoadingStrategy==VOLATILE
*/
// CacheIoTiming.getIoTimeBudget().clear(); // clear time budget such that prefetching doesn't wait for loading blocks.
final AffineTransform3D screenScaleTransform = screenScales[ screenScaleIndex ].scale;
final AffineTransform3D screenTransform = viewerState.getViewerTransform();
screenTransform.preConcatenate( screenScaleTransform );
screenTransform.translate( -offsetX, -offsetY, 0 );
final VolatileProjector projector = projectorFactory.createProjector(
viewerState,
screenImage,
screenTransform,
renderStorage );
CacheIoTiming.getIoTimeBudget().reset( iobudget );
return projector;
}
private void requestRepaintInterval( final int intervalScaleIndex )
{
requestedIntervalScaleIndex = intervalScaleIndex;
......@@ -675,19 +663,14 @@ public class MultiResolutionRenderer
{
if ( projector != null )
projector.cancel();
// requestedScreenInterval = screenInterval;
// intervalMode = true;
// painterThread.requestRepaint();
// }
// else
// {
// requestRepaint();
requestedScreenInterval = screenInterval;
intervalMode = true;
newIntervalRequest = true;
painterThread.requestRepaint();
}
else
{
requestRepaint();
}
newIntervalRequest = true;
requestedScreenInterval = screenInterval;
intervalMode = true;
painterThread.requestRepaint();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment