- Added reference module with test cases for JDK-provided readers

- Fixed ThumbsDBImageReader to pass test cases (got rid of some errouneous caching)
- Added TODO to remove caching in ICOImageReader (will need a test case for that)
- Minor changes in test cases to allow the reference test cases to pass
This commit is contained in:
Harald Kuhr
2009-10-11 22:43:41 +02:00
parent 1221a8bebc
commit 359659dc36
11 changed files with 303 additions and 42 deletions

View File

@@ -80,6 +80,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
protected ThumbsDBImageReader(final ThumbsDBImageReaderSpi pProvider) {
super(pProvider);
mReader = createJPEGReader(pProvider);
initReaderListeners();
}
protected void resetMembers() {
@@ -128,11 +129,11 @@ public class ThumbsDBImageReader extends ImageReaderBase {
* @throws java.io.IOException if an error occurs during reading
*/
@Override
public BufferedImage read(int pIndex, ImageReadParam pParam) throws IOException {
public BufferedImage read(final int pIndex, final ImageReadParam pParam) throws IOException {
init();
checkBounds(pIndex);
// Quick lookup
// Quick look-up
BufferedImage image = null;
if (pIndex < mThumbnails.length) {
image = mThumbnails[pIndex];
@@ -145,7 +146,9 @@ public class ThumbsDBImageReader extends ImageReaderBase {
image = mReader.read(0, pParam);
mReader.reset();
mThumbnails[pIndex] = image;
if (pParam == null) {
mThumbnails[pIndex] = image; // TODO: Caching is not kosher, as images are mutable!!
}
}
else {
// Keep progress listeners happy
@@ -154,6 +157,23 @@ public class ThumbsDBImageReader extends ImageReaderBase {
processImageComplete();
}
// Fake destination support
if (pParam != null && (pParam.getDestination() != null && pParam.getDestination() != image ||
pParam.getDestinationType() != null && pParam.getDestinationType().getBufferedImageType() != image.getType())) {
BufferedImage destination = getDestination(pParam, getImageTypes(pIndex), getWidth(pIndex), getHeight(pIndex));
Graphics2D g = destination.createGraphics();
try {
g.setComposite(AlphaComposite.Src);
g.drawImage(image, 0, 0, null);
}
finally {
g.dispose();
}
image = destination;
}
return image;
}
@@ -195,7 +215,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
}
private void init(final int pIndex) throws IOException {
if (mCurrentImage == -1 || pIndex != mCurrentImage) {
if (mCurrentImage == -1 || pIndex != mCurrentImage || mReader.getInput() == null) {
init();
checkBounds(pIndex);
mCurrentImage = pIndex;
@@ -212,39 +232,32 @@ public class ThumbsDBImageReader extends ImageReaderBase {
ImageInputStream input = new MemoryCacheImageInputStream(entry.getInputStream());
input.skipBytes(THUMBNAIL_OFFSET);
mReader.setInput(input);
initReaderListeners();
}
private void initReaderListeners() {
if (progressListeners != null) {
mReader.addIIOReadProgressListener(new ProgressListenerBase() {
@Override
public void imageComplete(ImageReader pSource) {
processImageComplete();
}
mReader.addIIOReadProgressListener(new ProgressListenerBase() {
@Override
public void imageComplete(ImageReader pSource) {
processImageComplete();
}
@Override
public void imageStarted(ImageReader pSource, int pImageIndex) {
processImageStarted(mCurrentImage);
}
@Override
public void imageStarted(ImageReader pSource, int pImageIndex) {
processImageStarted(mCurrentImage);
}
@Override
public void imageProgress(ImageReader pSource, float pPercentageDone) {
processImageProgress(pPercentageDone);
}
@Override
public void imageProgress(ImageReader pSource, float pPercentageDone) {
processImageProgress(pPercentageDone);
}
@Override
public void readAborted(ImageReader pSource) {
processReadAborted();
}
});
}
if (updateListeners != null) {
// TODO: Update listeners
}
if (warningListeners != null) {
// TODO: Warning listeners
}
@Override
public void readAborted(ImageReader pSource) {
processReadAborted();
}
});
// TODO: Update listeners
// TODO: Warning listeners
}
private void init() throws IOException {
@@ -307,6 +320,7 @@ public class ThumbsDBImageReader extends ImageReaderBase {
public Iterator<ImageTypeSpecifier> getImageTypes(int pIndex) throws IOException {
init(pIndex);
initReader(pIndex);
return mReader.getImageTypes(0);
}

View File

@@ -32,6 +32,7 @@ import com.twelvemonkeys.imageio.stream.BufferedImageInputStream;
import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase;
import com.twelvemonkeys.io.ole2.CompoundDocument;
import com.twelvemonkeys.io.ole2.Entry;
import com.twelvemonkeys.lang.SystemUtil;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.stream.ImageInputStream;
@@ -50,6 +51,8 @@ import java.util.List;
* @version $Id: ICOImageReaderTestCase.java,v 1.0 Apr 1, 2008 10:39:17 PM haraldk Exp$
*/
public class ThumbsDBImageReaderTestCase extends ImageReaderAbstractTestCase<ThumbsDBImageReader> {
private static final boolean IS_JAVA_6 = SystemUtil.isClassAvailable("java.util.Deque");
private ThumbsDBImageReaderSpi mProvider = new ThumbsDBImageReaderSpi();
protected List<TestData> getTestData() {
@@ -111,4 +114,26 @@ public class ThumbsDBImageReaderTestCase extends ImageReaderAbstractTestCase<Thu
Entry child = root.getChildEntry("Catalog");
child.getInputStream();
}
@Override
public void testSetDestination() throws IOException {
// Known bug in Sun JPEGImageReader before Java 6
if (IS_JAVA_6) {
super.testSetDestination();
}
else {
System.err.println("WARNING: Test skipped due to known bug in Java 1.5, please test again with Java 6 or later");
}
}
@Override
public void testSetDestinationType() throws IOException {
// Known bug in Sun JPEGImageReader before Java 6
if (IS_JAVA_6) {
super.testSetDestinationType();
}
else {
System.err.println("WARNING: Test skipped due to known bug in Java 1.5, please test again with Java 6 or later");
}
}
}