Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Init ViewFromSourceAndConverterCreator #608

Merged
merged 3 commits into from
Feb 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
package org.embl.mobie.viewer.source;
package org.embl.mobie.viewer.color;

import de.embl.cba.bdv.utils.lut.GlasbeyARGBLut;
import de.embl.cba.tables.color.LazyCategoryColoringModel;
Expand All @@ -36,12 +36,12 @@
import net.imglib2.type.numeric.ARGBType;
import net.imglib2.type.numeric.RealType;

public class LabelConverter implements Converter<RealType<?>, ARGBType>, ColorConverter {
public class LazyLabelConverter implements Converter<RealType<?>, ARGBType>, ColorConverter {
private final LazyCategoryColoringModel<Double> coloringModel;
private ARGBType singleColor;
private double max = 500;

public LabelConverter() {
public LazyLabelConverter() {
this.coloringModel = new LazyCategoryColoringModel<>(new GlasbeyARGBLut(255));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import sc.fiji.bdvpg.services.SourceAndConverterServices;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ImageSourceDisplay extends AbstractSourceDisplay
Expand Down Expand Up @@ -77,28 +78,38 @@ public ImageSourceDisplay( ImageSourceDisplay imageDisplay )
this.sources.addAll( imageDisplay.sourceNameToSourceAndConverter.keySet() );

final SourceAndConverter< ? > sourceAndConverter = imageDisplay.sourceNameToSourceAndConverter.values().iterator().next();

setDisplaySettings( sourceAndConverter );

// TODO - show images in 3d (currently not supported in viewer)
}

public ImageSourceDisplay( SourceAndConverter< ? > sourceAndConverter )
{
sources = Arrays.asList( sourceAndConverter.getSpimSource().getName() );
setDisplaySettings( sourceAndConverter );
}

private void setDisplaySettings( SourceAndConverter< ? > sourceAndConverter )
{
final ConverterSetup converterSetup = SourceAndConverterServices.getSourceAndConverterService().getConverterSetup( sourceAndConverter );

if( sourceAndConverter.getConverter() instanceof AdjustableOpacityColorConverter )
{
this.opacity = ( ( AdjustableOpacityColorConverter ) sourceAndConverter.getConverter() ).getOpacity();
opacity = ( ( AdjustableOpacityColorConverter ) sourceAndConverter.getConverter() ).getOpacity();
}

if ( sourceAndConverter.getConverter() instanceof ColorConverter)
{
// needs to be of form r=(\\d+),g=(\\d+),b=(\\d+),a=(\\d+)"
String colorString = ( ( ColorConverter ) sourceAndConverter.getConverter() ).getColor().toString();
colorString = colorString.replaceAll("[()]", "");
this.color = colorString;
color = ( ( ColorConverter ) sourceAndConverter.getConverter() ).getColor().toString();
color = color.replaceAll("[()]", "");
}

double[] contrastLimits = new double[2];
contrastLimits = new double[2];
contrastLimits[0] = converterSetup.getDisplayRangeMin();
contrastLimits[1] = converterSetup.getDisplayRangeMax();
this.contrastLimits = contrastLimits;

this.blendingMode = (BlendingMode) SourceAndConverterServices.getSourceAndConverterService().getMetadata( sourceAndConverter, BlendingMode.BLENDING_MODE );

// TODO - show images in 3d (currently not supported in viewer)
blendingMode = (BlendingMode) SourceAndConverterServices.getSourceAndConverterService().getMetadata( sourceAndConverter, BlendingMode.BLENDING_MODE );
}
}
3 changes: 2 additions & 1 deletion src/main/java/org/embl/mobie/viewer/source/Sources.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import net.imglib2.util.Cast;
import net.imglib2.view.IntervalView;
import net.imglib2.view.Views;
import org.embl.mobie.viewer.color.LazyLabelConverter;
import org.scijava.ui.behaviour.ClickBehaviour;
import org.scijava.ui.behaviour.io.InputTriggerConfig;
import org.scijava.ui.behaviour.util.Behaviours;
Expand All @@ -28,7 +29,7 @@ public static <R extends NumericType<R> & RealType<R>> SourceAndConverter<R> rep
}

public static <R extends NumericType<R> & RealType<R>> BdvStackSource<?> showAsLabelMask(BdvStackSource<?> bdvStackSource) {
LabelConverter converter = new LabelConverter();
LazyLabelConverter converter = new LazyLabelConverter();
SourceAndConverter<R> sac = replaceConverter(bdvStackSource.getSources().get(0), converter);
BdvHandle bdvHandle = bdvStackSource.getBdvHandle();
bdvStackSource.removeFromBdv();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package org.embl.mobie.viewer.transform;

import bdv.tools.transformation.TransformedSource;
import bdv.viewer.Source;
import bdv.viewer.SourceAndConverter;
import org.embl.mobie.viewer.playground.SourceAffineTransformer;
import net.imglib2.realtransform.AffineTransform3D;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

Expand All @@ -18,9 +21,25 @@ public class AffineSourceTransformer extends AbstractSourceTransformer
private transient AffineTransform3D affineTransform3D;

public AffineSourceTransformer( String name, double[] parameters, List< String > sources ) {
this( name, parameters, sources, null );
}

public AffineSourceTransformer( String name, double[] parameters, List< String > sources, List< String > sourceNamesAfterTransform )
{
this.name = name;
this.parameters = parameters;
this.sources = sources;
this.sourceNamesAfterTransform = sourceNamesAfterTransform;
}

public AffineSourceTransformer( TransformedSource< ? > transformedSource )
{
AffineTransform3D fixedTransform = new AffineTransform3D();
transformedSource.getFixedTransform( fixedTransform );
name = "manualTransform";
parameters = fixedTransform.getRowPackedCopy();
sources = Arrays.asList( transformedSource.getWrappedSource().getName() );
sourceNamesAfterTransform = Arrays.asList( transformedSource.getName() );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package org.embl.mobie.viewer.view;

import bdv.SpimSource;
import bdv.tools.brightness.ConverterSetup;
import bdv.tools.transformation.TransformedSource;
import bdv.util.ResampledSource;
import bdv.viewer.Source;
import bdv.viewer.SourceAndConverter;
import net.imglib2.converter.Converter;
import net.imglib2.display.ColorConverter;
import net.imglib2.realtransform.AffineTransform3D;
import net.imglib2.type.numeric.ARGBType;
import org.embl.mobie.viewer.bdv.render.BlendingMode;
import org.embl.mobie.viewer.color.LabelConverter;
import org.embl.mobie.viewer.color.OpacityAdjuster;
import org.embl.mobie.viewer.display.ImageSourceDisplay;
import org.embl.mobie.viewer.display.SourceDisplay;
import org.embl.mobie.viewer.source.LabelSource;
import org.embl.mobie.viewer.transform.AffineSourceTransformer;
import org.embl.mobie.viewer.transform.MergedGridSource;
import org.embl.mobie.viewer.transform.SourceTransformer;
import sc.fiji.bdvpg.services.SourceAndConverterServices;

import java.util.ArrayList;
import java.util.List;

public class ViewFromSourceAndConverterCreator
{
private final SourceAndConverter sourceAndConverter;

// display settings
private double opacity;
private BlendingMode blendingMode;
private double[] contrastLimits;
private String color;

public ViewFromSourceAndConverterCreator( SourceAndConverter sourceAndConverter )
{
this.sourceAndConverter = sourceAndConverter;
}

public View getView()
{
final ArrayList< SourceDisplay > sourceDisplays = new ArrayList<>();
final ArrayList< SourceTransformer > sourceTransformers = new ArrayList<>();
final View view = new View( "uiSelectionGroup", sourceDisplays, sourceTransformers, false );

// recursively add all transformations
// FIXME: in fact this will be the wrong order.
addSourceTransformers( sourceAndConverter.getSpimSource(), sourceTransformers );

if ( sourceAndConverter.getConverter() instanceof LabelConverter )
{
throwError( sourceAndConverter.getConverter() );
}
else
{
sourceDisplays.add( new ImageSourceDisplay( sourceAndConverter ) );
}

return view;
}

private void createSourceDisplay( SourceAndConverter< ? > sourceAndConverter )
{
final Converter< ?, ARGBType > converter = sourceAndConverter.getConverter();
final ConverterSetup converterSetup = SourceAndConverterServices.getSourceAndConverterService().getConverterSetup( sourceAndConverter );

if( converter instanceof OpacityAdjuster )
opacity = ( ( OpacityAdjuster ) converter ).getOpacity();

if ( converter instanceof ColorConverter )
{
// needs to be of form r=(\\d+),g=(\\d+),b=(\\d+),a=(\\d+)"
color = ( ( ColorConverter ) converter ).getColor().toString();
color = color.replaceAll("[()]", "");
}

contrastLimits = new double[2];
contrastLimits[0] = converterSetup.getDisplayRangeMin();
contrastLimits[1] = converterSetup.getDisplayRangeMax();

blendingMode = (BlendingMode) SourceAndConverterServices.getSourceAndConverterService().getMetadata( sourceAndConverter, BlendingMode.BLENDING_MODE );
}

private void addSourceTransformers( Source< ? > source, List< SourceTransformer > sourceTransformers )
{
if ( source instanceof SpimSource )
{
return;
}
else if ( source instanceof TransformedSource )
{
final TransformedSource transformedSource = ( TransformedSource ) source;

AffineTransform3D fixedTransform = new AffineTransform3D();
transformedSource.getFixedTransform( fixedTransform );
if ( ! fixedTransform.isIdentity() )
{
sourceTransformers.add( new AffineSourceTransformer( transformedSource ) );
}

final Source< ? > wrappedSource = transformedSource.getWrappedSource();

addSourceTransformers( wrappedSource, sourceTransformers );
}
else if ( source instanceof LabelSource )
{
final Source< ? > wrappedSource = (( LabelSource ) source).getWrappedSource();

addSourceTransformers( wrappedSource, sourceTransformers );
}
else if ( source instanceof MergedGridSource )
{
throwError( source );
}
else if ( source instanceof ResampledSource )
{
throwError( source );
}
else
{
throwError( source );
}
}

private void throwError( Object object )
{
throw new UnsupportedOperationException( "Cannot yet create a view from a " + object.getClass().getName() );
}

}
4 changes: 3 additions & 1 deletion src/test/java/run/RunImageJ.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package run;

import net.imagej.ImageJ;
import org.scijava.command.CommandService;

public class RunImageJ
{
public static void main( String[] args )
{
final ImageJ imageJ = new ImageJ();
final ImageJ imageJ = new net.imagej.ImageJ();
imageJ.ui().showUI();
final CommandService command = imageJ.command();
}
}