TileMangler/src/tm/tilecodecs/_3BPPLinearTileCodec.java
2021-02-02 23:23:26 +01:00

70 lines
No EOL
1.9 KiB
Java

package tm.tilecodecs;
public class _3BPPLinearTileCodec extends TileCodec {
/**
* Constructor.
**/
public _3BPPLinearTileCodec() {
super("LN99", 3, "3bpp linear");
}
/**
*
* Decodes a tile.
*
**/
public int[] decode(byte[] bits, int ofs, int stride) {
int pos=0;
int b1, b2, b3;
stride *= bytesPerRow;
for (int i=0; i<8; i++) {
// do one row
b1 = bits[ofs++] & 0xFF; // byte 1: 0001 1122
b2 = bits[ofs++] & 0xFF; // byte 2: 2333 4445
b3 = bits[ofs++] & 0xFF; // byte 3: 5566 6777
pixels[pos++] = (b1 >> 5) & 7;
pixels[pos++] = (b1 >> 2) & 7;
pixels[pos++] = ((b1 & 3) << 1) | ((b2 >> 7) & 1);
pixels[pos++] = (b2 >> 4) & 7;
pixels[pos++] = (b2 >> 1) & 7;
pixels[pos++] = ((b2 & 1) << 2) | ((b3 >> 6) & 3);
pixels[pos++] = (b3 >> 3) & 7;
pixels[pos++] = b3 & 7;
ofs += stride;
}
return pixels;
}
/**
*
* Encodes a tile.
*
**/
public void encode(int[] pixels, byte[] bits, int ofs, int stride) {
int pos = 0;
int b1, b2, b3;
stride *= bytesPerRow;
for (int i=0; i<8; i++) {
// do one row
b1 = (pixels[pos++] & 7) << 5;
b1 |= (pixels[pos++] & 7) << 2;
b1 |= (pixels[pos] & 6) >> 1;
b2 = (pixels[pos++] & 1) << 7;
b2 |= (pixels[pos++] & 7) << 4;
b2 |= (pixels[pos++] & 7) << 1;
b2 |= (pixels[pos] & 4) >> 2;
b3 = (pixels[pos++] & 3) << 6;
b3 |= (pixels[pos++] & 7) << 3;
b3 |= (pixels[pos++] & 7);
bits[ofs++] = (byte)b1; // byte 1: 0001 1122
bits[ofs++] = (byte)b2; // byte 2: 2333 4445
bits[ofs++] = (byte)b3; // byte 3: 5566 6777
ofs += stride;
}
}
}