src/share/classes/com/sun/imageio/plugins/gif/GIFImageReader.java
Print this page
*** 28,55 ****
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.WritableRaster;
- import java.io.BufferedInputStream;
- import java.io.DataInputStream;
import java.io.EOFException;
- import java.io.InputStream;
import java.io.IOException;
import java.nio.ByteOrder;
import java.util.ArrayList;
- import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.imageio.IIOException;
import javax.imageio.ImageReader;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
import com.sun.imageio.plugins.common.ReaderUtil;
public class GIFImageReader extends ImageReader {
// The current ImageInputStream source.
ImageInputStream stream = null;
--- 28,56 ----
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.WritableRaster;
import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.IIOException;
import javax.imageio.ImageReader;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
import com.sun.imageio.plugins.common.ReaderUtil;
+ import java.awt.image.ColorModel;
+ import java.awt.image.IndexColorModel;
+ import java.awt.image.MultiPixelPackedSampleModel;
+ import java.awt.image.PixelInterleavedSampleModel;
+ import java.awt.image.SampleModel;
public class GIFImageReader extends ImageReader {
// The current ImageInputStream source.
ImageInputStream stream = null;
*** 192,201 ****
--- 193,232 ----
}
readMetadata();
return imageMetadata.imageHeight;
}
+ // We don't check all parameters as ImageTypeSpecifier.createIndexed do
+ // since this method is private and we pass consistent data here
+ private ImageTypeSpecifier createIndexed(byte[] r, byte[] g, byte[] b,
+ int bits) {
+ ColorModel colorModel;
+ if (imageMetadata.transparentColorFlag) {
+ // Some files erroneously have a transparent color index
+ // of 255 even though there are fewer than 256 colors.
+ int idx = Math.min(imageMetadata.transparentColorIndex,
+ r.length - 1);
+ colorModel = new IndexColorModel(bits, r.length, r, g, b, idx);
+ } else {
+ colorModel = new IndexColorModel(bits, r.length, r, g, b);
+ }
+
+ SampleModel sampleModel;
+ if (bits == 8) {
+ int[] bandOffsets = {0};
+ sampleModel =
+ new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,
+ 1, 1, 1, 1,
+ bandOffsets);
+ } else {
+ sampleModel =
+ new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
+ 1, 1, bits);
+ }
+ return new ImageTypeSpecifier(colorModel, sampleModel);
+ }
+
public Iterator getImageTypes(int imageIndex) throws IIOException {
checkIndex(imageIndex);
int index = locateImage(imageIndex);
if (index != imageIndex) {
*** 237,262 ****
r[i] = colorTable[rgbIndex++];
g[i] = colorTable[rgbIndex++];
b[i] = colorTable[rgbIndex++];
}
! byte[] a = null;
! if (imageMetadata.transparentColorFlag) {
! a = new byte[lutLength];
! Arrays.fill(a, (byte)255);
!
! // Some files erroneously have a transparent color index
! // of 255 even though there are fewer than 256 colors.
! int idx = Math.min(imageMetadata.transparentColorIndex,
! lutLength - 1);
! a[idx] = (byte)0;
! }
!
! int[] bitsPerSample = new int[1];
! bitsPerSample[0] = bits;
! l.add(ImageTypeSpecifier.createIndexed(r, g, b, a, bits,
! DataBuffer.TYPE_BYTE));
return l.iterator();
}
public ImageReadParam getDefaultReadParam() {
return new ImageReadParam();
--- 268,278 ----
r[i] = colorTable[rgbIndex++];
g[i] = colorTable[rgbIndex++];
b[i] = colorTable[rgbIndex++];
}
! l.add(createIndexed(r, g, b, bits));
return l.iterator();
}
public ImageReadParam getDefaultReadParam() {
return new ImageReadParam();