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

Revise construction of SpimSources, SourceAndConverter, ConverterSetup

parent 9bc71179
Branches
Tags
No related merge requests found
...@@ -43,6 +43,16 @@ import javax.swing.JMenuBar; ...@@ -43,6 +43,16 @@ import javax.swing.JMenuBar;
import javax.swing.JMenuItem; import javax.swing.JMenuItem;
import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileFilter;
import net.imglib2.Volatile;
import net.imglib2.converter.Converter;
import net.imglib2.display.ColorConverter;
import net.imglib2.display.RealARGBColorConverter;
import net.imglib2.display.ScaledARGBConverter;
import net.imglib2.type.numeric.ARGBType;
import net.imglib2.type.numeric.NumericType;
import net.imglib2.type.numeric.RealType;
import net.imglib2.type.volatiles.VolatileARGBType;
import org.jdom2.Document; import org.jdom2.Document;
import org.jdom2.Element; import org.jdom2.Element;
import org.jdom2.JDOMException; import org.jdom2.JDOMException;
...@@ -85,12 +95,6 @@ import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription; ...@@ -85,12 +95,6 @@ import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription;
import mpicbg.spim.data.generic.sequence.BasicViewSetup; import mpicbg.spim.data.generic.sequence.BasicViewSetup;
import mpicbg.spim.data.sequence.Angle; import mpicbg.spim.data.sequence.Angle;
import mpicbg.spim.data.sequence.Channel; import mpicbg.spim.data.sequence.Channel;
import net.imglib2.Volatile;
import net.imglib2.display.RealARGBColorConverter;
import net.imglib2.display.ScaledARGBConverter;
import net.imglib2.type.numeric.ARGBType;
import net.imglib2.type.numeric.RealType;
import net.imglib2.type.volatiles.VolatileARGBType;
public class BigDataViewer public class BigDataViewer
{ {
...@@ -162,143 +166,104 @@ public class BigDataViewer ...@@ -162,143 +166,104 @@ public class BigDataViewer
return name; return name;
} }
private static < T extends RealType< T >, V extends Volatile< T > & RealType< V > > void initSetupRealType( @SuppressWarnings( "unchecked" )
final AbstractSpimData< ? > spimData, private static < T > Converter< T, ARGBType > createConverter( final T type )
final BasicViewSetup setup,
final T type,
final List< ConverterSetup > converterSetups,
final List< SourceAndConverter< ? > > sources )
{ {
if ( spimData.getSequenceDescription().getImgLoader() instanceof WrapBasicImgLoader ) if ( type instanceof RealType )
{ {
initSetupRealTypeNonVolatile( spimData, setup, type, converterSetups, sources ); final RealType< ? > t = ( RealType< ? > ) type;
return; final double typeMin = Math.max( 0, Math.min( t.getMinValue(), 65535 ) );
final double typeMax = Math.max( 0, Math.min( t.getMaxValue(), 65535 ) );
return ( Converter< T, ARGBType > ) RealARGBColorConverter.create( t, typeMin, typeMax );
}
else if ( type instanceof ARGBType )
return ( Converter< T, ARGBType > ) new ScaledARGBConverter.ARGB( 0, 255 );
else if ( type instanceof VolatileARGBType )
return ( Converter< T, ARGBType > ) new ScaledARGBConverter.VolatileARGB( 0, 255 );
else
throw new IllegalArgumentException( "ImgLoader of type " + type.getClass() + " not supported." );
} }
final int setupId = setup.getId(); private static ConverterSetup createConverterSetup( final SourceAndConverter< ? > soc, final int setupId )
final V volatileType = ( ( ViewerSetupImgLoader< T, V > ) spimData.getSequenceDescription().getImgLoader().getSetupImgLoader( setupId ) ).getVolatileImageType(); {
final List< ColorConverter > converters = new ArrayList<>();
final double typeMin = Math.max( 0, Math.min( type.getMinValue(), 65535 ) );
final double typeMax = Math.max( 0, Math.min( type.getMaxValue(), 65535 ) );
final RealARGBColorConverter< V > vconverter = RealARGBColorConverter.create( volatileType, typeMin, typeMax );
vconverter.setColor( new ARGBType( 0xffffffff ) );
final RealARGBColorConverter< T > converter = RealARGBColorConverter.create( type, typeMin, typeMax );
converter.setColor( new ARGBType( 0xffffffff ) );
final String setupName = createSetupName( setup );
final VolatileSpimSource< T, V > vs = new VolatileSpimSource<>( spimData, setupId, setupName );
final SpimSource< T > s = vs.nonVolatile();
// Decorate each source with an extra transformation, that can be final Converter< ?, ARGBType > c = soc.getConverter();
// edited manually in this viewer. if ( c instanceof ColorConverter )
final TransformedSource< V > tvs = new TransformedSource<>( vs ); converters.add( ( ColorConverter ) c );
final TransformedSource< T > ts = new TransformedSource<>( s, tvs );
final SourceAndConverter< V > vsoc = new SourceAndConverter<>( tvs, vconverter ); final SourceAndConverter< ? extends Volatile< ? > > vsoc = soc.asVolatile();
final SourceAndConverter< T > soc = new SourceAndConverter<>( ts, converter, vsoc ); if ( vsoc != null )
{
final Converter< ?, ARGBType > vc = vsoc.getConverter();
if ( vc instanceof ColorConverter )
converters.add( ( ColorConverter ) vc );
}
sources.add( soc ); if ( converters.isEmpty() )
converterSetups.add( new RealARGBColorConverterSetup( setupId, converter, vconverter ) ); return null;
else
return new RealARGBColorConverterSetup( setupId, converters );
} }
private static < T extends RealType< T > > void initSetupRealTypeNonVolatile( /**
final AbstractSpimData< ? > spimData, * Decorate source with an extra transformation, that can be edited manually
final BasicViewSetup setup, * in this viewer.
final T type, */
final List< ConverterSetup > converterSetups, private static < T, V extends Volatile< T > > SourceAndConverter< T > wrapWithTransformedSource( final SourceAndConverter< T > soc )
final List< SourceAndConverter< ? > > sources )
{ {
final double typeMin = Math.max( 0, Math.min( type.getMinValue(), 65535 ) ); if ( soc.asVolatile() == null )
final double typeMax = Math.max( 0, Math.min( type.getMaxValue(), 65535 ) ); return new SourceAndConverter<>( new TransformedSource<>( soc.getSpimSource() ), soc.getConverter() );
final RealARGBColorConverter< T > converter = RealARGBColorConverter.create( type, typeMin, typeMax );
converter.setColor( new ARGBType( 0xffffffff ) );
final int setupId = setup.getId();
final String setupName = createSetupName( setup );
final SpimSource< T > s = new SpimSource<>( spimData, setupId, setupName );
// Decorate each source with an extra transformation, that can be
// edited manually in this viewer.
final TransformedSource< T > ts = new TransformedSource<>( s );
final SourceAndConverter< T > soc = new SourceAndConverter<>( ts, converter );
sources.add( soc ); @SuppressWarnings( "unchecked" )
converterSetups.add( new RealARGBColorConverterSetup( setupId, converter ) ); final SourceAndConverter< V > vsoc = ( SourceAndConverter< V > ) soc.asVolatile();
final TransformedSource< T > ts = new TransformedSource<>( soc.getSpimSource() );
final TransformedSource< V > vts = new TransformedSource<>( vsoc.getSpimSource(), ts );
return new SourceAndConverter<>( ts, soc.getConverter(), new SourceAndConverter<>( vts, vsoc.getConverter() ) );
} }
private static void initSetupARGBType( private static < T extends NumericType< T >, V extends Volatile< T > & NumericType< V > > void initSetupNumericType(
final AbstractSpimData< ? > spimData, final AbstractSpimData< ? > spimData,
final BasicViewSetup setup, final BasicViewSetup setup,
final ARGBType type,
final List< ConverterSetup > converterSetups, final List< ConverterSetup > converterSetups,
final List< SourceAndConverter< ? > > sources ) final List< SourceAndConverter< ? > > sources )
{ {
if ( spimData.getSequenceDescription().getImgLoader() instanceof WrapBasicImgLoader )
{
initSetupARGBTypeNonVolatile( spimData, setup, type, converterSetups, sources );
return;
}
final ScaledARGBConverter.VolatileARGB vconverter = new ScaledARGBConverter.VolatileARGB( 0, 255 );
final ScaledARGBConverter.ARGB converter = new ScaledARGBConverter.ARGB( 0, 255 );
final int setupId = setup.getId(); final int setupId = setup.getId();
final String setupName = createSetupName( setup ); final ViewerImgLoader imgLoader = ( ViewerImgLoader ) spimData.getSequenceDescription().getImgLoader();
final VolatileSpimSource< ARGBType, VolatileARGBType > vs = new VolatileSpimSource<>( spimData, setupId, setupName ); @SuppressWarnings( "unchecked" )
final SpimSource< ARGBType > s = vs.nonVolatile(); final ViewerSetupImgLoader< T, V > setupImgLoader = ( ViewerSetupImgLoader< T, V > ) imgLoader.getSetupImgLoader( setupId );
final T type = setupImgLoader.getImageType();
final V volatileType = setupImgLoader.getVolatileImageType();
// Decorate each source with an extra transformation, that can be if ( ! ( type instanceof NumericType ) )
// edited manually in this viewer. throw new IllegalArgumentException( "ImgLoader of type " + type.getClass() + " not supported." );
final TransformedSource< VolatileARGBType > tvs = new TransformedSource<>( vs );
final TransformedSource< ARGBType > ts = new TransformedSource<>( s, tvs );
final SourceAndConverter< VolatileARGBType > vsoc = new SourceAndConverter<>( tvs, vconverter );
final SourceAndConverter< ARGBType > soc = new SourceAndConverter<>( ts, converter, vsoc );
sources.add( soc ); final String setupName = createSetupName( setup );
converterSetups.add( new RealARGBColorConverterSetup( setupId, converter, vconverter ) );
}
private static void initSetupARGBTypeNonVolatile( SourceAndConverter< V > vsoc = null;
final AbstractSpimData< ? > spimData, if ( volatileType != null )
final BasicViewSetup setup,
final ARGBType type,
final List< ConverterSetup > converterSetups,
final List< SourceAndConverter< ? > > sources )
{ {
final ScaledARGBConverter.ARGB converter = new ScaledARGBConverter.ARGB( 0, 255 ); final VolatileSpimSource< V > vs = new VolatileSpimSource<>( spimData, setupId, setupName );
vsoc = new SourceAndConverter<>( vs, createConverter( volatileType ) );
final int setupId = setup.getId(); }
final String setupName = createSetupName( setup );
final SpimSource< ARGBType > s = new SpimSource<>( spimData, setupId, setupName );
// Decorate each source with an extra transformation, that can be final SpimSource< T > s = new SpimSource<>( spimData, setupId, setupName );
// edited manually in this viewer. final SourceAndConverter< T > soc = new SourceAndConverter<>( s, createConverter( type ), vsoc );
final TransformedSource< ARGBType > ts = new TransformedSource<>( s ); final SourceAndConverter< T > tsoc = wrapWithTransformedSource( soc );
final SourceAndConverter< ARGBType > soc = new SourceAndConverter<>( ts, converter ); sources.add( tsoc );
sources.add( soc ); final ConverterSetup converterSetup = createConverterSetup( tsoc, setupId );
converterSetups.add( new RealARGBColorConverterSetup( setupId, converter ) ); if ( converterSetup != null )
converterSetups.add( converterSetup );
} }
@SuppressWarnings( { "unchecked", "rawtypes" } )
public static void initSetups( public static void initSetups(
final AbstractSpimData< ? > spimData, final AbstractSpimData< ? > spimData,
final List< ConverterSetup > converterSetups, final List< ConverterSetup > converterSetups,
final List< SourceAndConverter< ? > > sources ) final List< SourceAndConverter< ? > > sources )
{ {
final AbstractSequenceDescription< ?, ?, ? > seq = spimData.getSequenceDescription(); for ( final BasicViewSetup setup : spimData.getSequenceDescription().getViewSetupsOrdered() )
final ViewerImgLoader imgLoader = ( ViewerImgLoader ) seq.getImgLoader(); initSetupNumericType( spimData, setup, converterSetups, sources );
for ( final BasicViewSetup setup : seq.getViewSetupsOrdered() )
{
final int setupId = setup.getId();
final Object type = imgLoader.getSetupImgLoader( setupId ).getImageType();
if ( RealType.class.isInstance( type ) )
initSetupRealType( spimData, setup, ( RealType ) type, converterSetups, sources );
else if ( ARGBType.class.isInstance( type ) )
initSetupARGBType( spimData, setup, ( ARGBType ) type, converterSetups, sources );
else
throw new IllegalArgumentException( "ImgLoader of type " + type.getClass() + " not supported." );
}
} }
/** /**
......
...@@ -29,21 +29,20 @@ ...@@ -29,21 +29,20 @@
*/ */
package bdv; package bdv;
import bdv.viewer.render.DefaultMipmapOrdering;
import bdv.viewer.render.MipmapOrdering;
import mpicbg.spim.data.generic.AbstractSpimData;
import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription;
import net.imglib2.RandomAccessibleInterval; import net.imglib2.RandomAccessibleInterval;
import net.imglib2.Volatile; import net.imglib2.Volatile;
import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.realtransform.AffineTransform3D;
import net.imglib2.type.numeric.NumericType; import net.imglib2.type.numeric.NumericType;
public class VolatileSpimSource< T extends NumericType< T >, V extends Volatile< T > & NumericType< V > > import bdv.viewer.render.DefaultMipmapOrdering;
import bdv.viewer.render.MipmapOrdering;
import mpicbg.spim.data.generic.AbstractSpimData;
import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription;
public class VolatileSpimSource< V extends Volatile< ? > & NumericType< V > >
extends AbstractSpimSource< V > extends AbstractSpimSource< V >
implements MipmapOrdering implements MipmapOrdering
{ {
protected final SpimSource< T > nonVolatileSource;
protected final ViewerSetupImgLoader< ?, V > imgLoader; protected final ViewerSetupImgLoader< ?, V > imgLoader;
protected final MipmapOrdering mipmapOrdering; protected final MipmapOrdering mipmapOrdering;
...@@ -52,7 +51,6 @@ public class VolatileSpimSource< T extends NumericType< T >, V extends Volatile< ...@@ -52,7 +51,6 @@ public class VolatileSpimSource< T extends NumericType< T >, V extends Volatile<
public VolatileSpimSource( final AbstractSpimData< ? > spimData, final int setup, final String name ) public VolatileSpimSource( final AbstractSpimData< ? > spimData, final int setup, final String name )
{ {
super( spimData, setup, name ); super( spimData, setup, name );
nonVolatileSource = new SpimSource<>( spimData, setup, name );
final AbstractSequenceDescription< ?, ?, ? > seq = spimData.getSequenceDescription(); final AbstractSequenceDescription< ?, ?, ? > seq = spimData.getSequenceDescription();
imgLoader = ( ViewerSetupImgLoader< ?, V > ) ( ( ViewerImgLoader ) seq.getImgLoader() ).getSetupImgLoader( setup ); imgLoader = ( ViewerSetupImgLoader< ?, V > ) ( ( ViewerImgLoader ) seq.getImgLoader() ).getSetupImgLoader( setup );
if ( MipmapOrdering.class.isInstance( imgLoader ) ) if ( MipmapOrdering.class.isInstance( imgLoader ) )
...@@ -68,11 +66,6 @@ public class VolatileSpimSource< T extends NumericType< T >, V extends Volatile< ...@@ -68,11 +66,6 @@ public class VolatileSpimSource< T extends NumericType< T >, V extends Volatile<
return imgLoader.getVolatileImageType(); return imgLoader.getVolatileImageType();
} }
public SpimSource< T > nonVolatile()
{
return nonVolatileSource;
}
@Override @Override
protected RandomAccessibleInterval< V > getImage( final int timepointId, final int level ) protected RandomAccessibleInterval< V > getImage( final int timepointId, final int level )
{ {
......
...@@ -159,7 +159,7 @@ public class WrapBasicImgLoader implements ViewerImgLoader ...@@ -159,7 +159,7 @@ public class WrapBasicImgLoader implements ViewerImgLoader
@Override @Override
public V getVolatileImageType() public V getVolatileImageType()
{ {
throw new UnsupportedOperationException(); return null;
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment