/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Icy is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.sequence;
import icy.image.IcyBufferedImage;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.TreeMap;
/**
* @author Fabrice de Chaumont
*/
public class VolumetricImage
{
protected final Sequence sequence;
protected final TreeMap<Integer, IcyBufferedImage> images;
public VolumetricImage(Sequence seq)
{
sequence = seq;
images = new TreeMap<Integer, IcyBufferedImage>();
}
public VolumetricImage()
{
this(null);
}
/**
* Return number of loaded image
*/
public int getNumImage()
{
int result = 0;
synchronized (images)
{
for (Entry<Integer, IcyBufferedImage> entry : images.entrySet())
if (entry.getValue() != null)
result++;
}
return result;
}
/**
* Return the size of list
*/
public int getSize()
{
synchronized (images)
{
if (images.isEmpty())
return 0;
return images.lastKey().intValue() + 1;
}
}
/**
* Return true if the volumetricImage doesn't contains any image
*/
public boolean isEmpty()
{
return (getSize() == 0);
}
/**
* Return the first image
*/
public IcyBufferedImage getFirstImage()
{
final Entry<Integer, IcyBufferedImage> entry;
synchronized (images)
{
entry = images.firstEntry();
}
if (entry != null)
return entry.getValue();
return null;
}
public IcyBufferedImage getFirstNonNullImage()
{
synchronized (images)
{
for (IcyBufferedImage img : images.values())
{
if (img != null)
return img;
}
}
return null;
}
/**
* Return the last image
*/
public IcyBufferedImage getLastImage()
{
final Entry<Integer, IcyBufferedImage> entry;
synchronized (images)
{
entry = images.lastEntry();
}
if (entry != null)
return entry.getValue();
return null;
}
/**
* Return image at position z
*/
public IcyBufferedImage getImage(int z)
{
synchronized (images)
{
return images.get(Integer.valueOf(z));
}
}
/**
* Remove all image
*/
public void clear()
{
if (sequence != null)
sequence.beginUpdate();
try
{
synchronized (images)
{
while (!images.isEmpty())
{
final IcyBufferedImage image = images.pollFirstEntry().getValue();
// raise event on sequence
if ((image != null) && (sequence != null))
sequence.onImageRemoved(image);
}
}
}
finally
{
if (sequence != null)
sequence.endUpdate();
}
}
/**
* Remove image at position z
*/
public boolean removeImage(int z)
{
final IcyBufferedImage image;
synchronized (images)
{
image = images.remove(Integer.valueOf(z));
}
// raise event on sequence
if ((image != null) && (sequence != null))
sequence.onImageRemoved(image);
return image != null;
}
/**
* Set an image at the specified position
*
* @param image
*/
public void setImage(int z, IcyBufferedImage image)
{
final IcyBufferedImage oldImg = getImage(z);
if (sequence != null)
sequence.beginUpdate();
try
{
// set the new image
synchronized (images)
{
images.put(Integer.valueOf(z), image);
}
// raise event on sequence
if (sequence != null)
{
// we are replacing a previous image ?
if (oldImg != null)
sequence.onImageReplaced(oldImg, image);
else
sequence.onImageAdded(image);
}
}
finally
{
if (sequence != null)
sequence.endUpdate();
}
}
/**
* Return all images of volume image as TreeMap (contains z position)
*/
public TreeMap<Integer, IcyBufferedImage> getImages()
{
synchronized (images)
{
return new TreeMap<Integer, IcyBufferedImage>(images);
}
}
/**
* Return all images of volume image
*/
public ArrayList<IcyBufferedImage> getAllImage()
{
synchronized (images)
{
return new ArrayList<IcyBufferedImage>(images.values());
}
}
/**
* Remove empty element of image list
*/
public void pack()
{
if (sequence != null)
sequence.beginUpdate();
try
{
synchronized (images)
{
for (Entry<Integer, IcyBufferedImage> entry : images.entrySet())
{
final IcyBufferedImage image = entry.getValue();
if (image == null)
removeImage(entry.getKey().intValue());
}
}
}
finally
{
if (sequence != null)
sequence.endUpdate();
}
}
}