You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.7 KiB
131 lines
3.7 KiB
/*
|
|
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
|
|
package com.sun.imageio.plugins.wbmp;
|
|
|
|
import java.util.Locale;
|
|
import javax.imageio.spi.ImageReaderSpi;
|
|
import javax.imageio.stream.ImageInputStream;
|
|
import javax.imageio.spi.IIORegistry;
|
|
import javax.imageio.spi.ServiceRegistry;
|
|
import java.io.IOException;
|
|
import javax.imageio.ImageReader;
|
|
import javax.imageio.IIOException;
|
|
import com.sun.imageio.plugins.common.ReaderUtil;
|
|
|
|
public class WBMPImageReaderSpi extends ImageReaderSpi {
|
|
|
|
private static final int MAX_WBMP_WIDTH = 1024;
|
|
private static final int MAX_WBMP_HEIGHT = 768;
|
|
|
|
private static String [] writerSpiNames =
|
|
{"com.sun.imageio.plugins.wbmp.WBMPImageWriterSpi"};
|
|
private static String[] formatNames = {"wbmp", "WBMP"};
|
|
private static String[] entensions = {"wbmp"};
|
|
private static String[] mimeType = {"image/vnd.wap.wbmp"};
|
|
|
|
private boolean registered = false;
|
|
|
|
public WBMPImageReaderSpi() {
|
|
super("Oracle Corporation",
|
|
"1.0",
|
|
formatNames,
|
|
entensions,
|
|
mimeType,
|
|
"com.sun.imageio.plugins.wbmp.WBMPImageReader",
|
|
new Class[] { ImageInputStream.class },
|
|
writerSpiNames,
|
|
true,
|
|
null, null, null, null,
|
|
true,
|
|
WBMPMetadata.nativeMetadataFormatName,
|
|
"com.sun.imageio.plugins.wbmp.WBMPMetadataFormat",
|
|
null, null);
|
|
}
|
|
|
|
public void onRegistration(ServiceRegistry registry,
|
|
Class<?> category) {
|
|
if (registered) {
|
|
return;
|
|
}
|
|
registered = true;
|
|
}
|
|
|
|
public String getDescription(Locale locale) {
|
|
return "Standard WBMP Image Reader";
|
|
}
|
|
|
|
public boolean canDecodeInput(Object source) throws IOException {
|
|
if (!(source instanceof ImageInputStream)) {
|
|
return false;
|
|
}
|
|
|
|
ImageInputStream stream = (ImageInputStream)source;
|
|
|
|
stream.mark();
|
|
try {
|
|
int type = stream.readByte(); // TypeField
|
|
int fixHeaderField = stream.readByte();
|
|
// check WBMP "header"
|
|
if (type != 0 || fixHeaderField != 0) {
|
|
// while WBMP reader does not support ext WBMP headers
|
|
return false;
|
|
}
|
|
|
|
int width = ReaderUtil.readMultiByteInteger(stream);
|
|
int height = ReaderUtil.readMultiByteInteger(stream);
|
|
// check image dimension
|
|
if (width <= 0 || height <= 0) {
|
|
return false;
|
|
}
|
|
|
|
long dataLength = stream.length();
|
|
if (dataLength == -1) {
|
|
// We can't verify that amount of data in the stream
|
|
// corresponds to image dimension because we do not know
|
|
// the length of the data stream.
|
|
// Assuming that wbmp image are used for mobile devices,
|
|
// let's introduce an upper limit for image dimension.
|
|
// In case if exact amount of raster data is unknown,
|
|
// let's reject images with dimension above the limit.
|
|
return (width < MAX_WBMP_WIDTH) && (height < MAX_WBMP_HEIGHT);
|
|
}
|
|
|
|
dataLength -= stream.getStreamPosition();
|
|
|
|
long scanSize = (width / 8) + ((width % 8) == 0 ? 0 : 1);
|
|
|
|
return (dataLength == scanSize * height);
|
|
} finally {
|
|
stream.reset();
|
|
}
|
|
}
|
|
|
|
public ImageReader createReaderInstance(Object extension)
|
|
throws IIOException {
|
|
return new WBMPImageReader(this);
|
|
}
|
|
}
|