2014-03-28 15:08:05 +01:00

76 lines
2.8 KiB
Java

/*
* Copyright (c) 2011 J. Lewis Muir <jlmuir@imca.aps.anl.gov>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package imcacat.jcbf;
import java.io.EOFException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Locale;
import javax.imageio.ImageReader;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
/**
* I am a reader SPI for CBF images.
*/
public class CbfImageReaderSpi extends ImageReaderSpi {
private static final String VENDOR_NAME = "IMCA-CAT";
private static final String VERSION = Version.ID;
private static final String[] FORMAT_NAMES = { "cbf", "CBF" };
private static final String[] FORMAT_SUFFIXES = { "cbf" };
private static final String[] MIME_TYPES = { "image/x-cbf" };
private static final String READER_CLASS_NAME = "imcacat.jcbf.CbfImageReader";
private static final String[] WRITER_SPI_CLASS_NAMES = { "imcacat.jcbf.CbfImageWriterSpi" };
private static final String METADATA_FORMAT_NAME = "imcacat.jcbf.CbfMetadataFormat_1.0";
private static final String METADATA_FORMAT_CLASS_NAME = "imcacat.jcbf.CbfMetadataFormat";
public CbfImageReaderSpi() {
super(VENDOR_NAME, VERSION, FORMAT_NAMES, FORMAT_SUFFIXES, MIME_TYPES, READER_CLASS_NAME,
STANDARD_INPUT_TYPE, WRITER_SPI_CLASS_NAMES, false, null, null, null, null, false,
METADATA_FORMAT_NAME, METADATA_FORMAT_CLASS_NAME, null, null);
}
@Override
public boolean canDecodeInput(Object source) throws IOException {
if (!(source instanceof ImageInputStream)) return false;
ImageInputStream stream = (ImageInputStream)source;
String magicNumber = "###CBF: VERSION";
byte[] expected = magicNumber.getBytes("US-ASCII");
byte[] actual = new byte[expected.length];
stream.mark();
try {
stream.readFully(actual);
return Arrays.equals(expected, actual);
} catch (EOFException e) {
return false;
} finally {
stream.reset();
}
}
@Override
public ImageReader createReaderInstance(Object extension) throws IOException {
return new CbfImageReader(this);
}
@Override
public String getDescription(Locale locale) {
return "CBF image reader";
}
}