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

WIP merge interval and full rendering into one big paint method

parent 54d540ef
No related branches found
No related tags found
No related merge requests found
...@@ -263,59 +263,87 @@ public class MultiResolutionRenderer ...@@ -263,59 +263,87 @@ public class MultiResolutionRenderer
*/ */
public boolean paint( final ViewerState viewerState ) public boolean paint( final ViewerState viewerState )
{ {
int screenW = display.getWidth(); final int screenW = display.getWidth();
int screenH = display.getHeight(); final int screenH = display.getHeight();
if ( screenW <= 0 || screenH <= 0 ) if ( screenW <= 0 || screenH <= 0 )
return false; return false;
final boolean resized = screenScales.checkResize( screenW, screenH ); final boolean resized;
final boolean newFrame; final boolean newFrame;
final boolean newInterval; final boolean newInterval;
final boolean paintInterval; final boolean paintInterval;
final boolean prepareNextFrame;
boolean createProjector = false;
synchronized ( this ) synchronized ( this )
{ {
resized = screenScales.checkResize( screenW, screenH );
newFrame = newFrameRequest || resized; newFrame = newFrameRequest || resized;
if ( newFrame ) if ( newFrame )
{ {
newFrameRequest = false;
intervalMode = false; intervalMode = false;
// TODO: clear interval requests screenScales.clearRequestedIntervals();
} }
newInterval = newIntervalRequest; newInterval = newIntervalRequest && !newFrame;
if ( newInterval ) if ( newInterval )
{ {
newIntervalRequest = false;
intervalMode = true; intervalMode = true;
final double renderNanosPerPixel = renderNanosPerPixelAndSource.getAverage() * currentNumVisibleSources;
requestedIntervalScaleIndex = screenScales.suggestIntervalScreenScale( renderNanosPerPixel, currentScreenScaleIndex );
} }
prepareNextFrame = newFrame || newInterval;
paintInterval = intervalMode; paintInterval = intervalMode;
}
if ( paintInterval ) if ( paintInterval )
return paintInterval( newInterval ); {
createProjector = newInterval || ( requestedIntervalScaleIndex != currentIntervalScaleIndex );
if ( createProjector )
intervalRenderData = screenScales.pullIntervalRenderData( requestedIntervalScaleIndex, currentScreenScaleIndex );
}
newFrameRequest = false;
newIntervalRequest = false;
}
if ( prepareNextFrame )
cacheControl.prepareNextFrame();
if ( newFrame ) if ( newFrame )
{ {
cacheControl.prepareNextFrame();
currentViewerState = viewerState.snapshot(); currentViewerState = viewerState.snapshot();
currentNumVisibleSources = currentViewerState.getVisibleAndPresentSources().size(); currentNumVisibleSources = currentViewerState.getVisibleAndPresentSources().size();
final double renderNanosPerPixel = renderNanosPerPixelAndSource.getAverage() * currentNumVisibleSources; final double renderNanosPerPixel = renderNanosPerPixelAndSource.getAverage() * currentNumVisibleSources;
requestedScreenScaleIndex = screenScales.suggestScreenScale( renderNanosPerPixel ); requestedScreenScaleIndex = screenScales.suggestScreenScale( renderNanosPerPixel );
} }
final boolean createProjector = newFrame || ( requestedScreenScaleIndex != currentScreenScaleIndex );
// the projector that paints to the screenImage. // the projector that paints to the screenImage.
final VolatileProjector p; final VolatileProjector p;
// TODO make field (for notifying of updates) ??? // holds new RenderResult, in case that a new projector is created in full frame mode
RenderResult renderResult = null; RenderResult renderResult = null;
// if creating a projector // whether to request a newFrame, in case that a new projector is created in full frame mode
boolean requestNewFrameIfIncomplete = false; boolean requestNewFrameIfIncomplete = false;
if ( paintInterval )
{
intervalResult.init( intervalRenderData.width(), intervalRenderData.height() );
intervalResult.setScaleFactor( intervalRenderData.scale() );
synchronized ( this )
{
if ( createProjector )
{
projector = createProjector( currentViewerState, requestedIntervalScaleIndex, intervalResult.getScreenImage(), intervalRenderData.offsetX(), intervalRenderData.offsetY() );
renderingMayBeCancelled = !newInterval;
}
p = projector;
}
}
else
{
createProjector = newFrame || ( requestedScreenScaleIndex != currentScreenScaleIndex );
synchronized ( this ) synchronized ( this )
{ {
if ( createProjector ) if ( createProjector )
...@@ -325,6 +353,7 @@ public class MultiResolutionRenderer ...@@ -325,6 +353,7 @@ public class MultiResolutionRenderer
renderResult = display.getReusableRenderResult(); renderResult = display.getReusableRenderResult();
renderResult.init( screenScale.width(), screenScale.height() ); renderResult.init( screenScale.width(), screenScale.height() );
renderResult.setScaleFactor( screenScale.scale() ); renderResult.setScaleFactor( screenScale.scale() );
currentViewerState.getViewerTransform( renderResult.getViewerTransform() );
renderStorage.checkRenewData( screenScales.get( 0 ).width(), screenScales.get( 0 ).height(), currentNumVisibleSources ); renderStorage.checkRenewData( screenScales.get( 0 ).width(), screenScales.get( 0 ).height(), currentNumVisibleSources );
projector = createProjector( currentViewerState, requestedScreenScaleIndex, renderResult.getScreenImage(), 0, 0 ); projector = createProjector( currentViewerState, requestedScreenScaleIndex, renderResult.getScreenImage(), 0, 0 );
...@@ -333,21 +362,53 @@ public class MultiResolutionRenderer ...@@ -333,21 +362,53 @@ public class MultiResolutionRenderer
} }
p = projector; p = projector;
} }
}
// try rendering // try rendering
final boolean success = p.map( createProjector ); final boolean success = p.map( createProjector );
final long rendertime = p.getLastFrameRenderNanoTime(); final long rendertime = p.getLastFrameRenderNanoTime();
synchronized ( this ) synchronized ( this )
{ {
// if rendering was not cancelled... // if rendering was not cancelled...
if ( success ) if ( success )
{
if ( paintInterval )
{
if ( createProjector )
currentIntervalScaleIndex = requestedIntervalScaleIndex;
currentRenderResult.patch( intervalResult, intervalRenderData.targetInterval(), intervalRenderData.tx(), intervalRenderData.ty() );
if ( currentIntervalScaleIndex > currentScreenScaleIndex )
iterateRepaintInterval( currentIntervalScaleIndex - 1 );
else if ( p.isValid() )
{
if ( requestedScreenScaleIndex >= 0 )
{
// go back to "normal" rendering
intervalMode = false;
renderingMayBeCancelled = false;
if ( requestedScreenScaleIndex == currentScreenScaleIndex )
++currentScreenScaleIndex;
painterThread.requestRepaint();
}
}
else
{
usleep();
intervalRenderData.reRequest();
iterateRepaintInterval( currentIntervalScaleIndex );
}
}
else
{ {
if ( createProjector ) if ( createProjector )
{ {
currentScreenScaleIndex = requestedScreenScaleIndex; currentScreenScaleIndex = requestedScreenScaleIndex;
currentViewerState.getViewerTransform( renderResult.getViewerTransform() ); renderResult.setUpdated();
// TODO renderResult.setUpdated();
( ( RenderTarget ) display ).setRenderResult( renderResult ); ( ( RenderTarget ) display ).setRenderResult( renderResult );
currentRenderResult = renderResult; currentRenderResult = renderResult;
...@@ -357,9 +418,12 @@ public class MultiResolutionRenderer ...@@ -357,9 +418,12 @@ public class MultiResolutionRenderer
renderNanosPerPixelAndSource.add( rendertime / ( double ) numRenderPixels ); renderNanosPerPixelAndSource.add( rendertime / ( double ) numRenderPixels );
} }
} }
// TODO else renderResult.setUpdated(); else
currentRenderResult.setUpdated();
if ( currentScreenScaleIndex > 0 ) if ( !p.isValid() && requestNewFrameIfIncomplete )
requestRepaint();
else if ( currentScreenScaleIndex > 0 )
iterateRepaint( currentScreenScaleIndex - 1 ); iterateRepaint( currentScreenScaleIndex - 1 );
else if ( p.isValid() ) else if ( p.isValid() )
{ {
...@@ -368,20 +432,16 @@ public class MultiResolutionRenderer ...@@ -368,20 +432,16 @@ public class MultiResolutionRenderer
} }
else else
{ {
try usleep();
{ iterateRepaint( currentScreenScaleIndex );
Thread.sleep( 1 );
} }
catch ( final InterruptedException e )
{
// restore interrupted state
Thread.currentThread().interrupt();
} }
if( requestNewFrameIfIncomplete )
requestRepaint();
else
iterateRepaint( currentScreenScaleIndex );
} }
// if rendering was cancelled...
else
{
if ( paintInterval )
intervalRenderData.reRequest();
} }
} }
...@@ -411,8 +471,6 @@ public class MultiResolutionRenderer ...@@ -411,8 +471,6 @@ public class MultiResolutionRenderer
{ {
if ( renderingMayBeCancelled && projector != null ) if ( renderingMayBeCancelled && projector != null )
projector.cancel(); projector.cancel();
screenScales.clearRequestedIntervals();
intervalMode = false;
newFrameRequest = true; newFrameRequest = true;
painterThread.requestRepaint(); painterThread.requestRepaint();
} }
...@@ -424,12 +482,11 @@ public class MultiResolutionRenderer ...@@ -424,12 +482,11 @@ public class MultiResolutionRenderer
if ( projector != null ) if ( projector != null )
projector.cancel(); projector.cancel();
screenScales.requestInterval( screenInterval ); screenScales.requestInterval( screenInterval );
intervalMode = true;
newIntervalRequest = true; newIntervalRequest = true;
painterThread.requestRepaint();
} }
else else
requestRepaint(); newFrameRequest = true;
painterThread.requestRepaint();
} }
/** /**
...@@ -480,64 +537,13 @@ public class MultiResolutionRenderer ...@@ -480,64 +537,13 @@ public class MultiResolutionRenderer
private final RenderResult intervalResult; private final RenderResult intervalResult;
private IntervalRenderData intervalRenderData; private IntervalRenderData intervalRenderData;
private boolean paintInterval( final boolean newInterval ) private void iterateRepaintInterval( final int intervalScaleIndex )
{
final boolean createProjector;
final VolatileProjector p;
synchronized ( this )
{
if ( newInterval )
{
cacheControl.prepareNextFrame();
final double renderNanosPerPixel = renderNanosPerPixelAndSource.getAverage() * currentNumVisibleSources;
requestedIntervalScaleIndex = screenScales.suggestIntervalScreenScale( renderNanosPerPixel, currentScreenScaleIndex );
newIntervalRequest = false; // TODO: done again here because of remaining synchronization issues...
}
createProjector = newInterval || ( requestedIntervalScaleIndex != currentIntervalScaleIndex );
if ( createProjector )
{
intervalRenderData = screenScales.pullIntervalRenderData( requestedIntervalScaleIndex, currentScreenScaleIndex );
intervalResult.init( intervalRenderData.width(), intervalRenderData.height() );
intervalResult.setScaleFactor( intervalRenderData.scale() );
projector = createProjector( currentViewerState, requestedIntervalScaleIndex, intervalResult.getScreenImage(), intervalRenderData.offsetX(), intervalRenderData.offsetY() );
renderingMayBeCancelled = !newInterval;
}
p = projector;
}
final boolean success = p.map();
synchronized ( this )
{
// if rendering was not cancelled...
if ( success )
{
if ( createProjector )
currentIntervalScaleIndex = requestedIntervalScaleIndex;
currentRenderResult.patch( intervalResult, intervalRenderData.targetInterval(), intervalRenderData.tx(), intervalRenderData.ty() );
if ( currentIntervalScaleIndex > currentScreenScaleIndex )
iterateRepaintInterval( currentIntervalScaleIndex - 1 );
else if ( p.isValid() )
{
if ( requestedScreenScaleIndex >= 0 )
{ {
// go back to "normal" rendering requestedIntervalScaleIndex = intervalScaleIndex;
intervalMode = false;
renderingMayBeCancelled = false;
if ( requestedScreenScaleIndex == currentScreenScaleIndex )
++currentScreenScaleIndex;
painterThread.requestRepaint(); painterThread.requestRepaint();
} }
}
else private void usleep()
{ {
try try
{ {
...@@ -548,22 +554,5 @@ public class MultiResolutionRenderer ...@@ -548,22 +554,5 @@ public class MultiResolutionRenderer
// restore interrupted state // restore interrupted state
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
intervalRenderData.reRequest();
iterateRepaintInterval( currentIntervalScaleIndex );
}
}
else
{
intervalRenderData.reRequest();
}
}
return success;
}
private void iterateRepaintInterval( final int intervalScaleIndex )
{
requestedIntervalScaleIndex = intervalScaleIndex;
painterThread.requestRepaint();
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment