in src/main/java/org/apache/commons/imaging/formats/png/PngImageParser.java [649:720]
private List<PngChunk> readChunks(final InputStream is, final ChunkType[] chunkTypes,
final boolean returnAfterFirst) throws ImagingException, IOException {
final List<PngChunk> result = new ArrayList<>();
while (true) {
final int length = BinaryFunctions.read4Bytes("Length", is, "Not a Valid PNG File", getByteOrder());
if (length < 0) {
throw new ImagingException("Invalid PNG chunk length: " + length);
}
final int chunkType = BinaryFunctions.read4Bytes("ChunkType", is, "Not a Valid PNG File", getByteOrder());
if (LOGGER.isLoggable(Level.FINEST)) {
BinaryFunctions.logCharQuad("ChunkType", chunkType);
debugNumber("Length", length, 4);
}
final boolean keep = keepChunk(chunkType, chunkTypes);
byte[] bytes = null;
if (keep) {
bytes = BinaryFunctions.readBytes("Chunk Data", is, length,
"Not a Valid PNG File: Couldn't read Chunk Data.");
} else {
BinaryFunctions.skipBytes(is, length, "Not a Valid PNG File");
}
if (LOGGER.isLoggable(Level.FINEST)) {
if (bytes != null) {
debugNumber("bytes", bytes.length, 4);
}
}
final int crc = BinaryFunctions.read4Bytes("CRC", is, "Not a Valid PNG File", getByteOrder());
if (keep) {
if (chunkType == ChunkType.iCCP.value) {
result.add(new PngChunkIccp(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.tEXt.value) {
result.add(new PngChunkText(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.zTXt.value) {
result.add(new PngChunkZtxt(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.IHDR.value) {
result.add(new PngChunkIhdr(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.PLTE.value) {
result.add(new PngChunkPlte(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.pHYs.value) {
result.add(new PngChunkPhys(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.sCAL.value) {
result.add(new PngChunkScal(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.IDAT.value) {
result.add(new PngChunkIdat(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.gAMA.value) {
result.add(new PngChunkGama(length, chunkType, crc, bytes));
} else if (chunkType == ChunkType.iTXt.value) {
result.add(new PngChunkItxt(length, chunkType, crc, bytes));
} else {
result.add(new PngChunk(length, chunkType, crc, bytes));
}
if (returnAfterFirst) {
return result;
}
}
if (chunkType == ChunkType.IEND.value) {
break;
}
}
return result;
}