package visad.test;
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.ConsoleHandler;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import visad.AnimationControl;
import visad.ColorControl;
import visad.DataReference;
import visad.DataReferenceImpl;
import visad.DateTime;
import visad.Display;
import visad.DisplayImpl;
import visad.FieldImpl;
import visad.FunctionType;
import visad.Integer1DSet;
import visad.Integer2DSet;
import visad.RealTupleType;
import visad.RealType;
import visad.ScalarMap;
import visad.bom.ImageRendererJ3D;
import visad.data.FlatFieldCache;
import visad.data.AreaImageAccessor;
import visad.data.AreaImageCacheAdapter;
import visad.java3d.DisplayImplJ3D;
import visad.meteorology.SatelliteImage;
/**
* Simple test for <code>AnimationControl</code> and
* <code>ImageRendererJ3D</code>.
*/
public class FlatFieldCacheTest extends JPanel {
private static Logger log = Logger.getLogger(FlatFieldCacheTest.class.getName());
// array used to load AREA data into
private static int[][][] readCache;
private static int parseInt(String s) {
try {
return Integer.parseInt(s);
} catch (Exception e) {}
return -1;
}
public static void main(String[] args) throws Exception {
try {
Logger logger = Logger.getLogger("visad");
logger.setLevel(Level.FINE);
logger.setUseParentHandlers(false);
Handler console = new ConsoleHandler();
console.setLevel(Level.FINE);
console.setFormatter(new Formatter() {
public String format(LogRecord r) {
if (r.getThrown() != null) {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
r.getThrown().printStackTrace(new PrintStream(buf));
return String.format("[%s] %s\n%s", r.getLevel().getName(), r.getMessage(), buf.toString());
}
return String.format("[%s] %s\n", r.getLevel().getName(), r.getMessage());
}
});
logger.addHandler(console);
RealType elementType = RealType.getRealType("ImageElement");
RealType lineType = RealType.getRealType("ImageLine");
RealType bandType = RealType.getRealType("Band1");
FunctionType imgType = new FunctionType(new RealTupleType(elementType, lineType), bandType);
FunctionType timePxlVal = new FunctionType(RealType.Time, imgType);
log.fine("Image type: " + imgType.toString());
log.fine("Animation type: " + timePxlVal.toString());
FlatFieldCache cache = new FlatFieldCache(Integer.parseInt(args[1]));
//
// load AREA files
//
File dir =
new File(args[0]);
log.info("File location:"+dir.getPath());
File[] files = dir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
if (pathname.getName().endsWith("area") && pathname.isFile()) {
return true;
}
return false;
}
});
//
// Create and sort accessors
//
List<AreaImageAccessor> accessors = new ArrayList<AreaImageAccessor>();
int dwell = parseInt(args[2]);
int band = parseInt(args[3]);
int startLine = parseInt(args[4]);
int numLines = parseInt(args[5]);
int startElement = parseInt(args[6]);
int numElements = parseInt(args[7]);
int mag = parseInt(args[8]);
readCache = new int[1][numLines][numElements];
for (File file : files) {
AreaImageAccessor accessor = new AreaImageAccessor(file.getPath(), band, readCache);
accessor.setAreaParams(startLine, numLines, mag, startElement, numElements, mag);
accessors.add(accessor);
}
Collections.sort(accessors);
// Domain
FieldImpl timeFld = new FieldImpl(timePxlVal, new Integer1DSet(RealType.Time, accessors.size()));
for (int i = 0; i < accessors.size(); i++) {
SatelliteImage template = new SatelliteImage(imgType, new Integer2DSet(numElements, numLines),
new DateTime(i), "MET9 Satellite Image" + i, "MET9");
AreaImageCacheAdapter acc = new AreaImageCacheAdapter(template, accessors.get(i), cache);
timeFld.setSample(i, acc, false);
}
DataReference ref = new DataReferenceImpl("image");
ref.setData(timeFld);
//
// Display related
//
DisplayImpl display = new DisplayImplJ3D("image display");
display.addMap(new ScalarMap(elementType, Display.XAxis));
display.addMap(new ScalarMap(lineType, Display.YAxis));
ScalarMap map = new ScalarMap(bandType, Display.RGB);
display.addMap(map);
// ColorControl ctrl = (ColorControl) map.getControl();
// ctrl.initGreyWedge();
ScalarMap aniMap = new ScalarMap(RealType.Time, Display.Animation);
display.addMap(aniMap);
AnimationControl aniCtrl = (AnimationControl) aniMap.getControl();
aniCtrl.setStep(dwell);
aniCtrl.setOn(true);
ImageRendererJ3D renderer = new ImageRendererJ3D();
renderer.suggestBufImageType(BufferedImage.TYPE_BYTE_GRAY);
display.addReferences(renderer, ref);
JFrame frame = new JFrame("Image Animation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(display.getComponent());
frame.setSize(600, 600);
frame.setVisible(true);
} catch (Exception e) {
System.out.println("FlatFieldCacheTest <dir with .area files> <cache size> <dwell (ms)> <band> <startline> <numLines> <startelem> <numElems> <mag>");
e.printStackTrace();
}
}
}