FileDocCategorySizeDatePackage
WBMPImageReader.javaAPI DocJava SE 5 API10031Fri Aug 26 14:54:42 BST 2005com.sun.imageio.plugins.wbmp

WBMPImageReader

public class WBMPImageReader extends ImageReader
This class is the Java Image IO plugin reader for WBMP images. It may subsample the image, clip the image, and shift the decoded image origin if the proper decoding parameter are set in the provided WBMPImageReadParam.

Fields Summary
private ImageInputStream
iis
The input stream where reads from
private boolean
gotHeader
Indicates whether the header is read.
private int
width
The original image width.
private int
height
The original image height.
private int
wbmpType
private WBMPMetadata
metadata
Constructors Summary
public WBMPImageReader(ImageReaderSpi originator)
Constructs WBMPImageReader from the provided ImageReaderSpi.


                
       
        super(originator);
    
Methods Summary
public booleancanReadRaster()

        return true;
    
private voidcheckIndex(int imageIndex)

        if (imageIndex != 0) {
            throw new IndexOutOfBoundsException(I18N.getString("WBMPImageReader0"));
        }
    
public javax.imageio.ImageReadParamgetDefaultReadParam()

        return new ImageReadParam();
    
public intgetHeight(int imageIndex)

        checkIndex(imageIndex);
        readHeader();
        return height;
    
public javax.imageio.metadata.IIOMetadatagetImageMetadata(int imageIndex)

        checkIndex(imageIndex);
        if (metadata == null) {
            readHeader();
        }
        return metadata;
    
public java.util.IteratorgetImageTypes(int imageIndex)

        checkIndex(imageIndex);
        readHeader();

        BufferedImage bi =
            new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_BINARY);
        ArrayList list = new ArrayList(1);
        list.add(new ImageTypeSpecifier(bi));
        return list.iterator();
    
public intgetNumImages(boolean allowSearch)
Overrides the method defined in the superclass.

        if (iis == null) {
            throw new IllegalStateException(I18N.getString("GetNumImages0"));
        }
        if (seekForwardOnly && allowSearch) {
            throw new IllegalStateException(I18N.getString("GetNumImages1"));
        }
        return 1;
    
public javax.imageio.metadata.IIOMetadatagetStreamMetadata()

        return null;
    
public intgetWidth(int imageIndex)

        checkIndex(imageIndex);
        readHeader();
        return width;
    
public booleanisRandomAccessEasy(int imageIndex)

        checkIndex(imageIndex);
        return true;
    
booleanisValidWbmpType(int type)

        return type == 0;
    
public java.awt.image.BufferedImageread(int imageIndex, javax.imageio.ImageReadParam param)


        if (iis == null) {
            throw new IllegalStateException(I18N.getString("WBMPImageReader1"));
        }

        checkIndex(imageIndex);
        clearAbortRequest();
        processImageStarted(imageIndex);
        if (param == null)
            param = getDefaultReadParam();

        //read header
        readHeader();

        Rectangle sourceRegion = new Rectangle(0, 0, 0, 0);
        Rectangle destinationRegion = new Rectangle(0, 0, 0, 0);

        computeRegions(param, this.width, this.height,
                       param.getDestination(),
                       sourceRegion,
                       destinationRegion);

        int scaleX = param.getSourceXSubsampling();
        int scaleY = param.getSourceYSubsampling();
        int xOffset = param.getSubsamplingXOffset();
        int yOffset = param.getSubsamplingYOffset();

        // If the destination is provided, then use it.  Otherwise, create new one
        BufferedImage bi = param.getDestination();

        if (bi == null)
            bi = new BufferedImage(destinationRegion.x + destinationRegion.width,
                              destinationRegion.y + destinationRegion.height,
                              BufferedImage.TYPE_BYTE_BINARY);

        boolean noTransform = 
            destinationRegion.equals(new Rectangle(0, 0, width, height)) &&
            destinationRegion.equals(new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
        
        // Get the image data.
        WritableRaster tile = bi.getWritableTile(0, 0);

        // Get the SampleModel.
        MultiPixelPackedSampleModel sm =
            (MultiPixelPackedSampleModel)bi.getSampleModel();

        if (noTransform) {
            if (abortRequested()) {
                processReadAborted();
                return bi;
            }

            // If noTransform is necessary, read the data.
            iis.read(((DataBufferByte)tile.getDataBuffer()).getData(),
                     0, height*sm.getScanlineStride());
            processImageUpdate(bi,
                               0, 0,
                               width, height, 1, 1,
                               new int[]{0});
            processImageProgress(100.0F);
        } else {
            int len = (this.width + 7) / 8;
            byte[] buf = new byte[len];
            byte[] data = ((DataBufferByte)tile.getDataBuffer()).getData();
            int lineStride = sm.getScanlineStride();
            iis.skipBytes(len * sourceRegion.y);
            int skipLength = len * (scaleY - 1);

            // cache the values to avoid duplicated computation
            int[] srcOff = new int[destinationRegion.width];
            int[] destOff = new int[destinationRegion.width];
            int[] srcPos = new int[destinationRegion.width];
            int[] destPos = new int[destinationRegion.width];

            for (int i = destinationRegion.x, x = sourceRegion.x, j = 0;
                i < destinationRegion.x + destinationRegion.width;
                    i++, j++, x += scaleX) {
                srcPos[j] = x >> 3;
                srcOff[j] = 7 - (x & 7);
                destPos[j] = i >> 3;
                destOff[j] = 7 - (i & 7);
            }

            for (int j = 0, y = sourceRegion.y,
                k = destinationRegion.y * lineStride;
                j < destinationRegion.height; j++, y+=scaleY) {

                if (abortRequested())
                    break;
                iis.read(buf, 0, len);
                for (int i = 0; i < destinationRegion.width; i++) {
                    //get the bit and assign to the data buffer of the raster
                    int v = (buf[srcPos[i]] >> srcOff[i]) & 1;
                    data[k + destPos[i]] |= v << destOff[i];
                }

                k += lineStride;
                iis.skipBytes(skipLength);
                        processImageUpdate(bi,
                                           0, j,
                                           destinationRegion.width, 1, 1, 1,
                                           new int[]{0});
                        processImageProgress(100.0F*j/destinationRegion.height);
            }
        }

        if (abortRequested())
            processReadAborted();
        else
            processImageComplete();
        return bi;
    
public voidreadHeader()

        if (gotHeader)
            return;

        if (iis == null) {
            throw new IllegalStateException("Input source not set!");
        }

        metadata = new WBMPMetadata();
        
        wbmpType = iis.readByte();   // TypeField
        byte fixHeaderField = iis.readByte();

        // check for valid wbmp image
        if (fixHeaderField != 0
            || !isValidWbmpType(wbmpType)) 
        {
            throw new IIOException(I18N.getString("WBMPImageReader2"));
        }

        metadata.wbmpType = wbmpType;
        
        // Read image width
        width = readMultiByteInteger();
        metadata.width = width;
        
        // Read image height
        height = readMultiByteInteger();
        metadata.height = height;
        
        gotHeader = true;
    
private intreadMultiByteInteger()

        int value = iis.readByte();
        int result = value & 0x7f;
        while((value & 0x80) == 0x80) {
            result <<= 7;
            value = iis.readByte();
            result |= (value & 0x7f);
        }
        return result;
    
public java.awt.image.RasterreadRaster(int imageIndex, javax.imageio.ImageReadParam param)

        BufferedImage bi = read(imageIndex, param);
        return bi.getData();
    
public voidreset()

        super.reset();
        iis = null;
        gotHeader = false;
    
public voidsetInput(java.lang.Object input, boolean seekForwardOnly, boolean ignoreMetadata)
Overrides the method defined in the superclass.

        super.setInput(input, seekForwardOnly, ignoreMetadata);
        iis = (ImageInputStream) input; // Always works
        gotHeader = false;