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
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;
|
|
}
|
|
}
|
|
|