Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
BigDataViewer_Core_Extension
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
BioinformaticDataCompression
BigDataViewer_Core_Extension
Commits
1ce9aea3
Commit
1ce9aea3
authored
5 years ago
by
Tobias Pietzsch
Browse files
Options
Downloads
Patches
Plain Diff
WIP Fix interplay between interval/normal mode and synchronization
parent
fbbe8b70
No related branches found
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
+68
-85
68 additions, 85 deletions
src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
with
68 additions
and
85 deletions
src/main/java/bdv/viewer/render/MultiResolutionRenderer.java
+
68
−
85
View file @
1ce9aea3
...
...
@@ -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
;
}
new
Frame
=
newFrameRequest
||
resized
;
new
Frame
Request
=
false
;
paintInterval
=
intervalMode
;
new
Interval
=
newIntervalRequest
;
new
Interval
Request
=
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
);
intervalP
rojector
=
createProjector
(
currentViewerState
,
requestedIntervalScaleIndex
,
intervalResult
.
getScreenImage
(),
offsetX
,
offsetY
);
p
rojector
=
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
=
intervalP
rojector
;
p
=
p
rojector
;
}
final
boolean
success
=
p
.
map
();
if
(
succes
s
)
synchronized
(
thi
s
)
{
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
();
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment