in src/main/java/org/apache/xmlgraphics/image/loader/impl/PNGFile.java [72:120]
public PNGFile(InputStream stream, String uri) throws IOException, ImageException {
if (!stream.markSupported()) {
stream = new BufferedInputStream(stream);
}
DataInputStream distream = new DataInputStream(stream);
long magic = distream.readLong();
if (magic != PNG_SIGNATURE) {
String msg = PropertyUtil.getString("PNGImageDecoder0");
throw new ImageException(msg);
}
// only some chunks are worth parsing in the current implementation
do {
try {
PNGChunk chunk;
String chunkType = PNGChunk.getChunkType(distream);
if (chunkType.equals(PNGChunk.ChunkType.IHDR.name())) {
chunk = PNGChunk.readChunk(distream);
parse_IHDR_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.PLTE.name())) {
chunk = PNGChunk.readChunk(distream);
parse_PLTE_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.IDAT.name())) {
chunk = PNGChunk.readChunk(distream);
streamVec.add(new ByteArrayInputStream(chunk.getData()));
} else if (chunkType.equals(PNGChunk.ChunkType.IEND.name())) {
// chunk = PNGChunk.readChunk(distream);
PNGChunk.skipChunk(distream);
break; // fall through to the bottom
} else if (chunkType.equals(PNGChunk.ChunkType.tRNS.name())) {
chunk = PNGChunk.readChunk(distream);
parse_tRNS_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.iCCP.name())) {
chunk = PNGChunk.readChunk(distream);
parse_iCCP_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.sRGB.name())) {
chunk = PNGChunk.readChunk(distream);
parse_sRGB_chunk(chunk);
} else {
if (Character.isUpperCase(chunkType.charAt(0))) {
throw new ImageException("PNG unknown critical chunk: " + chunkType);
}
PNGChunk.skipChunk(distream);
}
} catch (Exception e) {
String msg = PropertyUtil.getString("PNGImageDecoder2");
throw new RuntimeException(msg + " " + uri, e);
}
} while (true);
}