/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program 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.
* This program 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 this program; if not, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.glevel.support;
import com.bc.ceres.glevel.MultiLevelSource;
import junit.framework.TestCase;
import javax.media.jai.PlanarImage;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
public class DefaultMultiLevelImageTest extends TestCase {
public void testSamplesAreProvidedFromSource() {
PlanarImage sourceImage = createSingleBandedByteImage(2, 2);
DefaultMultiLevelSource mls = new DefaultMultiLevelSource(sourceImage, 1);
DefaultMultiLevelImage mli = new DefaultMultiLevelImage(mls);
assertSame(mls, mli.getSource());
assertSame(sourceImage, mli.getImage(0));
assertSame(mls.getImage(0), mli.getImage(0));
assertEquals(11, mli.getData().getSample(0, 0, 0));
assertEquals(22, mli.getData().getSample(1, 0, 0));
assertEquals(33, mli.getData().getSample(0, 1, 0));
assertEquals(44, mli.getData().getSample(1, 1, 0));
}
public void testLevelInstances() {
DefaultMultiLevelImage mli = createSomeDefaultMultiLevelImage();
RenderedImage a0 = mli.getImage(0);
assertNotNull(a0);
assertSame(a0, mli.getImage(0));
RenderedImage a1 = mli.getImage(1);
assertNotNull(a1);
assertSame(a1, mli.getImage(1));
mli.reset();
RenderedImage b0 = mli.getImage(0);
assertNotNull(b0);
assertSame(b0, mli.getImage(0));
assertNotSame(a0, b0);
RenderedImage b1 = mli.getImage(1);
assertNotNull(b1);
assertSame(b1, mli.getImage(1));
assertNotSame(a1, b1);
}
public void testProperties() {
DefaultMultiLevelImage mli = createSomeDefaultMultiLevelImage();
PCL pcl = new PCL();
assertEquals(Image.UndefinedProperty, mli.getProperty("_x"));
mli.addPropertyChangeListener(pcl);
mli.setProperty("_x", 4384);
assertEquals(4384, mli.getProperty("_x"));
assertEquals(Integer.class, mli.getPropertyClass("_x"));
assertEquals("_x;", pcl.trace);
String[] propertyNames = mli.getPropertyNames();
assertEquals(1, propertyNames.length);
assertEquals("_x", propertyNames[0]);
propertyNames = mli.getPropertyNames("_");
assertEquals(1, propertyNames.length);
assertEquals("_x", propertyNames[0]);
mli.removeProperty("_x");
assertEquals(Image.UndefinedProperty, mli.getProperty("_x"));
}
private DefaultMultiLevelImage createSomeDefaultMultiLevelImage() {
DefaultMultiLevelModel model = new DefaultMultiLevelModel(2, new AffineTransform(), 256, 256);
MultiLevelSource mls = new TestMultiLevelSource(model);
return new DefaultMultiLevelImage(mls);
}
static PlanarImage createSingleBandedByteImage(int w, int h) {
final BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
bi.getRaster().setSample(0, 0, 0, 11);
bi.getRaster().setSample(1, 0, 0, 22);
bi.getRaster().setSample(0, 1, 0, 33);
bi.getRaster().setSample(1, 1, 0, 44);
return PlanarImage.wrapRenderedImage(bi);
}
private static class TestMultiLevelSource extends AbstractMultiLevelSource {
public TestMultiLevelSource(DefaultMultiLevelModel model) {
super(model);
}
@Override
protected RenderedImage createImage(int level) {
// todo - The knowledge how width and height are computed should go either into AbstractMultiLevelSource or into the MultiLevelModel (nf 20090113)
int width = (int) Math.floor(256 / getModel().getScale(level));
int height = (int) Math.floor(256 / getModel().getScale(level));
return createSingleBandedByteImage(width, height);
}
}
private static class PCL implements PropertyChangeListener {
String trace = "";
public void propertyChange(PropertyChangeEvent evt) {
trace += evt.getPropertyName() + ";";
}
}
}