package javajs.img; import java.util.zip.CRC32; import javajs.util.AU; abstract class CRCEncoder extends ImageEncoder { protected int startPos, bytePos; private CRC32 crc; protected byte[] pngBytes; protected int dataLen; private byte[] int2 = new byte[2]; private byte[] int4 = new byte[4]; CRCEncoder() { pngBytes = new byte[250]; crc = new CRC32(); } protected void setData(byte[] b, int pt) { pngBytes = b; dataLen = b.length; startPos = bytePos = pt; } protected byte[] getBytes() { return (dataLen == pngBytes.length ? pngBytes : AU.arrayCopyByte( pngBytes, dataLen)); } protected void writeCRC() { crc.reset(); crc.update(pngBytes, startPos, bytePos - startPos); writeInt4((int) crc.getValue()); } /** * Write a two-byte integer into the pngBytes array at a given position. * * @param n The integer to be written into pngBytes. */ protected void writeInt2(int n) { int2[0] = (byte) ((n >> 8) & 0xff); int2[1] = (byte) (n & 0xff); writeBytes(int2); } /** * Write a four-byte integer into the pngBytes array at a given position. * * @param n The integer to be written into pngBytes. */ protected void writeInt4(int n) { getInt4(n, int4); writeBytes(int4); } protected static void getInt4(int n, byte[] int4) { int4[0] = (byte) ((n >> 24) & 0xff); int4[1] = (byte) ((n >> 16) & 0xff); int4[2] = (byte) ((n >> 8) & 0xff); int4[3] = (byte) (n & 0xff); } /** * Write a single byte into the pngBytes array at a given position. * * @param b The byte to be written into pngBytes. */ protected void writeByte(int b) { byte[] temp = { (byte) b }; writeBytes(temp); } /** * Write a string into the pngBytes array at a given position. * This uses the getBytes method, so the encoding used will * be its default. * * @param s The string to be written into pngBytes. * @see java.lang.String#getBytes() */ protected void writeString(String s) { writeBytes(s.getBytes()); } /** * Write an array of bytes into the pngBytes array. * Both dataLen and bytePos are updated. If we don't have * enough room, this is certainly in image data writing, * so we add just enough for CRC END CRC * * @param data * The data to be written into pngBytes. */ protected void writeBytes(byte[] data) { int newPos = bytePos + data.length; dataLen = Math.max(dataLen, newPos); if (newPos > pngBytes.length) pngBytes = AU.arrayCopyByte(pngBytes, newPos + 16); System.arraycopy(data, 0, pngBytes, bytePos, data.length); bytePos = newPos; } }