mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-10-04 19:34:48 -04:00
- 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:
76
twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java
Executable file → Normal file
76
twelvemonkeys-imageio/thumbsdb/src/main/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReader.java
Executable file → Normal 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);
|
||||
}
|
||||
|
||||
|
25
twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java
Executable file → Normal file
25
twelvemonkeys-imageio/thumbsdb/src/test/java/com/twelvemonkeys/imageio/plugins/thumbsdb/ThumbsDBImageReaderTestCase.java
Executable file → Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user