Sketcher2 source code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
2.3 KiB

package com.jotuntech.sketcher.common;
import java.util.zip.Deflater;
public class DiffPacker {
private Deflater deflater;
private byte[] encodedDiff;
public DiffPacker() {
deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
}
public int pack(short[] diffAlpha, short[] diffRed, short[] diffGreen, short[] diffBlue, byte[] output) {
return pack(diffAlpha, diffRed, diffGreen, diffBlue, output, 0, output.length);
}
public int pack(short[] diffAlpha, short[] diffRed, short[] diffGreen, short[] diffBlue, byte[] output, int ofs, int len) {
/* Create buffers, or enlarge them if they are too small */
if(encodedDiff == null || encodedDiff.length < diffAlpha.length * 8) {
encodedDiff = new byte[diffAlpha.length * 8];
}
int lastAlpha = 0, lastRed = 0, lastGreen = 0, lastBlue = 0;
for(int diffOffset = 0, alphaOffset = 0, redOffset = diffAlpha.length * 2, greenOffset = diffAlpha.length * 4, blueOffset = diffAlpha.length * 6; diffOffset < diffAlpha.length; diffOffset++, alphaOffset++, redOffset++, greenOffset++, blueOffset++) {
short alpha = (short) (diffAlpha[diffOffset] - lastAlpha);
short red = (short) (diffRed[diffOffset] - lastRed);
short green = (short) (diffGreen[diffOffset] - lastGreen);
short blue = (short) (diffBlue[diffOffset] - lastBlue);
encodedDiff[alphaOffset++] = (byte) (0xFF & (alpha >> 8));
encodedDiff[alphaOffset] = (byte) (0xFF & alpha);
encodedDiff[redOffset++] = (byte) (0xFF & (red >> 8));
encodedDiff[redOffset] = (byte) (0xFF & red);
encodedDiff[greenOffset++] = (byte) (0xFF & (green >> 8));
encodedDiff[greenOffset] = (byte) (0xFF & green);
encodedDiff[blueOffset++] = (byte) (0xFF & (blue >> 8));
encodedDiff[blueOffset] = (byte) (0xFF & blue);
lastAlpha = diffAlpha[diffOffset];
lastRed = diffRed[diffOffset];
lastGreen = diffGreen[diffOffset];
lastBlue = diffBlue[diffOffset];
}
/* Deflate encoded diffs */
deflater.reset();
deflater.setInput(encodedDiff, 0, diffAlpha.length * 8);
deflater.finish();
int compressedLength = 0;
while(!deflater.finished() && compressedLength < len) {
compressedLength += deflater.deflate(output, ofs + compressedLength, len - compressedLength);
}
return compressedLength;
}
}