Index: src/main/java/javax/imageio/IIOParam.java =================================================================== --- src/main/java/javax/imageio/IIOParam.java (revision 475753) +++ src/main/java/javax/imageio/IIOParam.java (working copy) @@ -24,13 +24,13 @@ public abstract class IIOParam { protected Rectangle sourceRegion; - protected int sourceXSubsampling; - protected int sourceYSubsampling; + protected int sourceXSubsampling = 1; + protected int sourceYSubsampling = 1; protected int subsamplingXOffset; protected int subsamplingYOffset; protected int[] sourceBands; protected ImageTypeSpecifier destinationType; - protected Point destinationOffset; + protected Point destinationOffset = new Point(0, 0); protected IIOParamController defaultController; protected IIOParamController controller; @@ -66,6 +66,9 @@ } public Rectangle getSourceRegion() { + if (sourceRegion == null) { + return null; + } //-- clone it to avoid unexpected modifications return (Rectangle) sourceRegion.clone(); } @@ -141,13 +144,15 @@ } public void setDestinationOffset(Point destinationOffset) { - // TODO implement - throw new UnsupportedOperationException("not implemented yet"); + if (destinationOffset == null) { + throw new IllegalArgumentException("destinationOffset == null!"); + } + + this.destinationOffset = (Point) destinationOffset.clone(); } public Point getDestinationOffset() { - // TODO implement - throw new UnsupportedOperationException("not implemented yet"); + return (Point) destinationOffset.clone(); } public void setController(IIOParamController controller) { Index: src/main/java/javax/imageio/ImageIO.java =================================================================== --- src/main/java/javax/imageio/ImageIO.java (revision 475753) +++ src/main/java/javax/imageio/ImageIO.java (working copy) @@ -92,6 +92,7 @@ while (it.hasNext()) { ImageOutputStreamSpi spi = it.next(); if (spi.getOutputClass().isInstance(output)) { + // todo - use getUseCache and getCacheDir here return spi.createOutputStreamInstance(output); } } @@ -203,24 +204,58 @@ throw new UnsupportedOperationException("Not supported yet"); } - public static BufferedImage read(File input) - throws IOException { - throw new UnsupportedOperationException("Not supported yet"); + public static BufferedImage read(File input) throws IOException { + if (input == null) { + throw new IllegalArgumentException("input == null!"); + } + + ImageInputStream stream = createImageInputStream(input); + return read(stream); } - public static BufferedImage read(InputStream input) - throws IOException { - throw new UnsupportedOperationException("Not supported yet"); + public static BufferedImage read(InputStream input) throws IOException { + if (input == null) { + throw new IllegalArgumentException("input == null!"); + } + + ImageInputStream stream = createImageInputStream(input); + return read(stream); } - public static BufferedImage read(URL input) - throws IOException { - throw new UnsupportedOperationException("Not supported yet"); + public static BufferedImage read(URL input) throws IOException { + if (input == null) { + throw new IllegalArgumentException("input == null!"); + } + + InputStream stream = input.openStream(); + BufferedImage res = read(stream); + stream.close(); + + return res; } - public static BufferedImage read(ImageInputStream stream) - throws IOException { - throw new UnsupportedOperationException("Not supported yet"); + public static BufferedImage read(ImageInputStream stream) throws IOException { + if (stream == null) { + throw new IllegalArgumentException("stream == null!"); + } + + Iterator imageReaders = getImageReaders(stream); + if (!imageReaders.hasNext()) { + return null; + } + + ImageReader reader = imageReaders.next(); + reader.setInput(stream, false, true); + BufferedImage res = reader.read(0); + reader.dispose(); + + try { + stream.close(); + } catch (IOException e) { + // Stream could be already closed, proceed silently in this case + } + + return res; } public static boolean write(RenderedImage im, Index: src/main/java/javax/imageio/spi/IIORegistry.java =================================================================== --- src/main/java/javax/imageio/spi/IIORegistry.java (revision 475753) +++ src/main/java/javax/imageio/spi/IIORegistry.java (working copy) @@ -23,8 +23,11 @@ import java.util.Arrays; import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageReaderSpi; import org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageWriterSpi; +import org.apache.harmony.x.imageio.plugins.png.PNGImageReaderSpi; import org.apache.harmony.x.imageio.spi.FileIISSpi; import org.apache.harmony.x.imageio.spi.FileIOSSpi; +import org.apache.harmony.x.imageio.spi.InputStreamIISSpi; +import org.apache.harmony.x.imageio.spi.OutputStreamIOSSpi; import org.apache.harmony.x.imageio.spi.RAFIISSpi; import org.apache.harmony.x.imageio.spi.RAFIOSSpi; @@ -53,10 +56,13 @@ private void registerBuiltinSpis() { registerServiceProvider(new JPEGImageWriterSpi()); registerServiceProvider(new JPEGImageReaderSpi()); + registerServiceProvider(new PNGImageReaderSpi()); registerServiceProvider(new FileIOSSpi()); registerServiceProvider(new FileIISSpi()); registerServiceProvider(new RAFIOSSpi()); registerServiceProvider(new RAFIISSpi()); + registerServiceProvider(new OutputStreamIOSSpi()); + registerServiceProvider(new InputStreamIISSpi()); //-- TODO implement } Index: src/main/java/org/apache/harmony/x/imageio/plugins/jpeg/JPEGSpiConsts.java =================================================================== --- src/main/java/org/apache/harmony/x/imageio/plugins/jpeg/JPEGSpiConsts.java (revision 475753) +++ src/main/java/org/apache/harmony/x/imageio/plugins/jpeg/JPEGSpiConsts.java (working copy) @@ -27,8 +27,8 @@ public class JPEGSpiConsts { private JPEGSpiConsts() {} - static final String vendorName = "Intel Corporation"; - static final String version = "0.1 beta"; + public static final String vendorName = "Intel Corporation"; + public static final String version = "0.1 beta"; static final String readerClassName = "org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageReader"; static final String writerClassName = "org.apache.harmony.x.imageio.plugins.jpeg.JPEGImageWriter"; Index: src/main/java/org/apache/harmony/x/imageio/spi/FileIISSpi.java =================================================================== --- src/main/java/org/apache/harmony/x/imageio/spi/FileIISSpi.java (revision 475753) +++ src/main/java/org/apache/harmony/x/imageio/spi/FileIISSpi.java (working copy) @@ -23,6 +23,7 @@ import javax.imageio.spi.ImageInputStreamSpi; import javax.imageio.stream.ImageInputStream; import javax.imageio.stream.FileImageOutputStream; +import javax.imageio.stream.FileImageInputStream; import java.io.File; import java.io.IOException; import java.util.Locale; @@ -40,7 +41,7 @@ public ImageInputStream createInputStreamInstance(Object input, boolean useCache, File cacheDir) throws IOException { if (File.class.isInstance(input)) { - return new FileImageOutputStream((File) input); + return new FileImageInputStream((File) input); } throw new IllegalArgumentException("input is not an instance of java.io.File"); } Index: src/main/java/org/apache/harmony/x/imageio/spi/RAFIISSpi.java =================================================================== --- src/main/java/org/apache/harmony/x/imageio/spi/RAFIISSpi.java (revision 475753) +++ src/main/java/org/apache/harmony/x/imageio/spi/RAFIISSpi.java (working copy) @@ -22,7 +22,7 @@ import javax.imageio.spi.ImageInputStreamSpi; import javax.imageio.stream.ImageInputStream; -import javax.imageio.stream.FileImageOutputStream; +import javax.imageio.stream.FileImageInputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -41,7 +41,7 @@ public ImageInputStream createInputStreamInstance(Object input, boolean useCache, File cacheDir) throws IOException { if (RandomAccessFile.class.isInstance(input)) { - return new FileImageOutputStream((RandomAccessFile) input); + return new FileImageInputStream((RandomAccessFile) input); } throw new IllegalArgumentException( "input is not an instance of java.io.RandomAccessFile");