javajs.img.CRCEncoder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jmol Show documentation
Show all versions of jmol Show documentation
Jmol: an open-source Java viewer for chemical structures in 3D
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;
}
}