in src/main/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java [343:478]
public PNGImage(InputStream stream, PNGDecodeParam decodeParam)
throws IOException {
if (!stream.markSupported()) {
stream = new BufferedInputStream(stream);
}
DataInputStream distream = new DataInputStream(stream);
if (decodeParam == null) {
decodeParam = new PNGDecodeParam();
}
this.decodeParam = decodeParam;
// Get parameter values
this.suppressAlpha = decodeParam.getSuppressAlpha();
this.expandPalette = decodeParam.getExpandPalette();
this.output8BitGray = decodeParam.getOutput8BitGray();
this.expandGrayAlpha = decodeParam.getExpandGrayAlpha();
if (decodeParam.getPerformGammaCorrection()) {
this.userExponent = decodeParam.getUserExponent();
this.displayExponent = decodeParam.getDisplayExponent();
performGammaCorrection = true;
output8BitGray = true;
}
this.generateEncodeParam = decodeParam.getGenerateEncodeParam();
if (emitProperties) {
properties.put("file_type", "PNG v. 1.0");
}
try {
long magic = distream.readLong();
if (magic != PNG_SIGNATURE) {
String msg = PropertyUtil.getString("PNGImageDecoder0");
throw new RuntimeException(msg);
}
} catch (IOException ioe) {
ioe.printStackTrace();
String msg = PropertyUtil.getString("PNGImageDecoder1");
throw new RuntimeException(msg);
}
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);
try {
parse_IEND_chunk(chunk);
} catch (Exception e) {
e.printStackTrace();
String msg = PropertyUtil.getString("PNGImageDecoder2");
throw new RuntimeException(msg);
}
break; // fall through to the bottom
} else if (chunkType.equals(PNGChunk.ChunkType.bKGD.name())) {
chunk = PNGChunk.readChunk(distream);
parse_bKGD_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.cHRM.name())) {
chunk = PNGChunk.readChunk(distream);
parse_cHRM_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.gAMA.name())) {
chunk = PNGChunk.readChunk(distream);
parse_gAMA_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.hIST.name())) {
chunk = PNGChunk.readChunk(distream);
parse_hIST_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.iCCP.name())) {
chunk = PNGChunk.readChunk(distream);
parse_iCCP_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.pHYs.name())) {
chunk = PNGChunk.readChunk(distream);
parse_pHYs_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.sBIT.name())) {
chunk = PNGChunk.readChunk(distream);
parse_sBIT_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.sRGB.name())) {
chunk = PNGChunk.readChunk(distream);
parse_sRGB_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.tEXt.name())) {
chunk = PNGChunk.readChunk(distream);
parse_tEXt_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.tIME.name())) {
chunk = PNGChunk.readChunk(distream);
parse_tIME_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.tRNS.name())) {
chunk = PNGChunk.readChunk(distream);
parse_tRNS_chunk(chunk);
} else if (chunkType.equals(PNGChunk.ChunkType.zTXt.name())) {
chunk = PNGChunk.readChunk(distream);
parse_zTXt_chunk(chunk);
} else {
chunk = PNGChunk.readChunk(distream);
// Output the chunk data in raw form
String type = chunk.getTypeString();
byte[] data = chunk.getData();
if (encodeParam != null) {
encodeParam.addPrivateChunk(type, data);
}
if (emitProperties) {
String key = "chunk_" + chunkIndex++ + ':' + type;
properties.put(key.toLowerCase(Locale.getDefault()), data);
}
}
// } catch (Exception e) {
// e.printStackTrace();
// String msg = PropertyUtil.getString("PNGImageDecoder2");
// throw new RuntimeException(msg);
// }
} while (true);
// Final post-processing
if (significantBits == null) {
significantBits = new int[inputBands];
for (int i = 0; i < inputBands; i++) {
significantBits[i] = bitDepth;
}
if (emitProperties) {
properties.put("significant_bits", significantBits);
}
}
}