package org.xwt.translators;
-import org.xwt.*;
-import org.xwt.util.*;
+import org.ibex.*;
+import org.ibex.util.*;
import java.io.*;
-import java.util.Hashtable;
-import java.util.Vector;
import java.util.Enumeration;
import java.util.zip.*;
public PNG() { }
private static Queue instances = new Queue(10);
+ private Picture p;
public static void load(InputStream is, Picture p) {
PNG g = (PNG)instances.remove(false);
if (g == null) g = new PNG();
try {
g._load(is, p);
+ p.data = g.data;
} catch (Exception e) {
- if (Log.on) Log.log(PNG.class, e);
+ if (Log.on) Log.info(PNG.class, e);
return;
}
// FIXME: must reset fields
// Public Methods ///////////////////////////////////////////////////////////////////////////////
- private Picture p;
-
/** process a PNG as an inputstream; returns null if there is an error
@param name A string describing the image, to be used when logging errors
*/
- private void _load(InputStream is, Picture p) throws IOException {
- this.p = p;
+ private void _load(InputStream is, Picture pic) throws IOException {
+ p = pic;
if (is instanceof BufferedInputStream) underlyingStream = (BufferedInputStream)is;
else underlyingStream = new BufferedInputStream(is);
target_offset = 0;
// consume the header
if ((inputStream.read() != 137) || (inputStream.read() != 80) || (inputStream.read() != 78) || (inputStream.read() != 71) ||
(inputStream.read() != 13) || (inputStream.read() != 10) || (inputStream.read() != 26) || (inputStream.read() != 10)) {
- Log.log(this, "PNG: error: input file is not a PNG file");
- data = new int[] { };
+ Log.info(this, "PNG: error: input file is not a PNG file");
+ data = p.data = new int[] { };
p.width = p.height = 0;
return;
}
- DONE: while (!error) {
+
+ while (!error) {
if (needChunkInfo) {
chunkLength = inputStream.readInt();
chunkType = inputStream.readInt();
needChunkInfo = false;
}
- switch (chunkType) {
- case CHUNK_bKGD: inputStream.skip(chunkLength); break;
- case CHUNK_cHRM: inputStream.skip(chunkLength); break;
- case CHUNK_gAMA: inputStream.skip(chunkLength); break;
- case CHUNK_hIST: inputStream.skip(chunkLength); break;
- case CHUNK_pHYs: inputStream.skip(chunkLength); break;
- case CHUNK_sBIT: inputStream.skip(chunkLength); break;
- case CHUNK_tEXt: inputStream.skip(chunkLength); break;
- case CHUNK_zTXt: inputStream.skip(chunkLength); break;
- case CHUNK_tIME: inputStream.skip(chunkLength); break;
-
- case CHUNK_IHDR: handleIHDR(); break;
- case CHUNK_PLTE: handlePLTE(); break;
- case CHUNK_tRNS: handletRNS(); break;
-
- case CHUNK_IDAT: handleIDAT(); break;
-
- case CHUNK_IEND: break DONE;
- default:
- System.err.println("unrecognized chunk type " +
- Integer.toHexString(chunkType) + ". skipping");
+ // I rewrote this as an if/else to work around a JODE bug with switch() blocks
+ if (chunkType == CHUNK_bKGD) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_cHRM) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_gAMA) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_hIST) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_pHYs) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_sBIT) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_tEXt) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_zTXt) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_tIME) inputStream.skip(chunkLength);
+ else if (chunkType == CHUNK_IHDR) handleIHDR();
+ else if (chunkType == CHUNK_PLTE) handlePLTE();
+ else if (chunkType == CHUNK_tRNS) handletRNS();
+ else if (chunkType == CHUNK_IDAT) handleIDAT();
+ else if (chunkType == CHUNK_IEND) break;
+ else {
+ System.err.println("unrecognized chunk type " + Integer.toHexString(chunkType) + ". skipping");
inputStream.skip(chunkLength);
}
private void handletRNS() throws IOException {
int chunkLen = chunkLength;
if (palette == null) {
- if (Log.on) Log.log(this, "warning: tRNS chunk encountered before pLTE; ignoring alpha channel");
+ if (Log.on) Log.info(this, "warning: tRNS chunk encountered before pLTE; ignoring alpha channel");
inputStream.skip(chunkLength);
return;
}
private boolean complete = false;
private boolean error = false;
- private int[] data = null;
+ int[] data = null;
private InputStream underlyingStream = null;
private DataInputStream inputStream = null;